//
//  SegmentedPluginTests.swift
//  Astro
//
//  Created by Crystal To on 2016-09-12.
//  Copyright © 2016 Mobify Research & Development Inc. All rights reserved.
//

import XCTest
@testable import Astro

class SegmentedPluginTests: AstroTestCase {

    var messageBus: MessageBus!
    var pluginResolver: StubPluginResolver!

    var segmentedPlugin: SegmentedPlugin!
    var segments: UISegmentedControl!
    var respond: CapturedRpcMethodResult!

    override func setUp() {
        messageBus = MessageBus()
        pluginResolver = StubPluginResolver()

        segmentedPlugin = SegmentedPlugin(address: "SegmentedPlugin:0", messageBus: messageBus, pluginResolver: pluginResolver, options: nil)
        segments = segmentedPlugin.viewController.view.subviews.first as! UISegmentedControl
        respond = CapturedRpcMethodResult()
    }

    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    func testSetItems() {
        let items = setTestItems()
        XCTAssertEqual(items[0]["text"] as? String, segments.titleForSegment(at: 0))
        XCTAssertEqual(segments.numberOfSegments, items.count)
    }

    func testSetItemsAgain() {
        let items = setTestItems()
        // This should replace the previous items
        setTestItems()
        XCTAssertEqual(segments.numberOfSegments, items.count)
    }

    func testSetColor() {
        segmentedPlugin.setColor("#0000FF") { _ in }
        XCTAssertEqual(segments.tintColor, UIColor.blue)
    }

    func testSetBackgroundColor() {
        segmentedPlugin.setBackgroundColor("#0000FF") { _ in }
        XCTAssertEqual(segmentedPlugin.viewController.view.backgroundColor, UIColor.blue)
    }

    func testSelectItem() {
        setTestItems()
        segmentedPlugin.selectItem("three") { _ in }
        XCTAssertEqual(segments.selectedSegmentIndex, 2)
    }

    func testGetSelectedItem() {
        setTestItems()
        segmentedPlugin.selectItem("two") { _ in }
        segmentedPlugin.getSelectedItem { respond in
            switch respond {
            case .error(let error):
                XCTFail(error)
                break
            case .result(let key):
                XCTAssertEqual(key as? String, "two")
                break
            }
        }
    }

    @discardableResult
    func setTestItems() -> [JSONObject] {
        let items: [JSONObject] = [
            [ "key": "one", "text": "Tab 1" ],
            [ "key": "two", "text": "Tab 2" ],
            [ "key": "three", "text": "Tab 3" ]
        ]
        segmentedPlugin.setItems(items) { _ in }
        return items
    }

}
