//
//  ResourceTests.swift
//  MotorControlTests
//
//  Copyright © 2018 Sage Bionetworks. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// 1.  Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// 2.  Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation and/or
// other materials provided with the distribution.
//
// 3.  Neither the name of the copyright holder(s) nor the names of any contributors
// may be used to endorse or promote products derived from this software without
// specific prior written permission. No license is granted to the trademarks of
// the copyright holders even if such marks are included in this software.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//

import XCTest
@testable import MotorControl
import Research
import ResearchUI

class ResourceTests: XCTestCase {
    
    override func setUp() {
        super.setUp()
        resourceLoader = ResourceLoader()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }
    
    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }
    
    func testDecodeTasks() {
        // Check that the JSON is decoding properly.
        MCTTaskIdentifier.allCases.forEach { taskIdentifier in
            let factory = MCTFactory()
            do {
                let taskTransformer = taskIdentifier.resourceTransformer()
                let task = try factory.decodeTask(with: taskTransformer)
                
                guard let steps = (task.stepNavigator as? RSDConditionalStepNavigatorObject)?.steps else {
                    XCTFail("Failed to decode expected step navigator for \(task.identifier)")
                    return
                }
                
                steps.forEach {
                    switch $0.stepType {
                    case .countdown:
                        XCTAssertTrue($0 is MCTCountdownStepObject, task.identifier)
                    case .active:
                        XCTAssertTrue($0 is MCTActiveStepObject, task.identifier)
                    case .handInstruction:
                        XCTAssertTrue($0 is MCTHandInstructionStepObject, task.identifier)
                    case .handSelection:
                        XCTAssertTrue($0 is MCTHandSelectionStepObject, task.identifier)
                    case .tapping:
                        XCTAssertTrue($0 is MCTTappingStepObject, task.identifier)
                    case .instruction:
                        XCTAssertTrue($0 is RSDInstructionStepObject, task.identifier)
                    case .overview:
                        XCTAssertTrue($0 is RSDOverviewStepObject, task.identifier)
                    case .completion:
                        XCTAssertTrue($0 is RSDCompletionStepObject, task.identifier)
                    default:
                        break
                    }
                }
                
            } catch let err {
                XCTFail("Failed to decode \(taskIdentifier): \(err)")
            }
        }
    }
    
    func testDecodeDefaultTaskInfo() {
        // Check that the JSON is decoding properly.
        for taskIdentifier in MCTTaskIdentifier.allCases {
            let taskInfo = MCTTaskInfo(taskIdentifier)
            let task = taskInfo.task
            XCTAssertEqual(task.identifier, taskIdentifier.rawValue)
        }
    }
}
