// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//

#if DEPLOYMENT_RUNTIME_OBJC || os(Linux)
    import Foundation
    import XCTest
#else
    import SwiftFoundation
    import SwiftXCTest
#endif


class TestNSRunLoop : XCTestCase {
    static var allTests : [(String, (TestNSRunLoop) -> () throws -> Void)] {
        return [
            ("test_constants", test_constants),
            ("test_runLoopInit", test_runLoopInit),
            // these tests do not work the same as Darwin https://bugs.swift.org/browse/SR-399
//            ("test_runLoopRunMode", test_runLoopRunMode),
//            ("test_runLoopLimitDate", test_runLoopLimitDate),
        ]
    }
    
    func test_constants() {
        XCTAssertEqual(NSRunLoopCommonModes, "kCFRunLoopCommonModes",
                       "\(NSRunLoopCommonModes) is not equal to kCFRunLoopCommonModes")
        
        XCTAssertEqual(NSDefaultRunLoopMode, "kCFRunLoopDefaultMode",
                       "\(NSDefaultRunLoopMode) is not equal to kCFRunLoopDefaultMode")
    }
    
    func test_runLoopInit() {
        let mainRunLoop = NSRunLoop.mainRunLoop()
        XCTAssertNotNil(mainRunLoop)
        let currentRunLoop = NSRunLoop.currentRunLoop()
        XCTAssertNotNil(currentRunLoop)

        let secondAccessOfMainLoop = NSRunLoop.mainRunLoop()
        XCTAssertEqual(mainRunLoop, secondAccessOfMainLoop, "fetching the main loop a second time should be equal")
        XCTAssertTrue(mainRunLoop === secondAccessOfMainLoop, "fetching the main loop a second time should be identical")
        
        let secondAccessOfCurrentLoop = NSRunLoop.currentRunLoop()
        XCTAssertEqual(currentRunLoop, secondAccessOfCurrentLoop, "fetching the current loop a second time should be equal")
        XCTAssertTrue(currentRunLoop === secondAccessOfCurrentLoop, "fetching the current loop a second time should be identical")
        
        // We can assume that the tests will be run on the main run loop
        // so the current loop should be the main loop
        XCTAssertEqual(mainRunLoop, currentRunLoop, "the current run loop should be the main loop")
    }
    
    func test_runLoopRunMode() {
        let runLoop = NSRunLoop.currentRunLoop()
        let timeInterval = NSTimeInterval(0.05)
        let endDate = NSDate(timeInterval: timeInterval, sinceDate: NSDate())
        var flag = false

        let dummyTimer = NSTimer.scheduledTimer(0.01, repeats: false) { _ in
            flag = true
            guard let runLoopMode = runLoop.currentMode else {
                XCTFail("Run loop mode is not defined")
                return
            }
            
            XCTAssertEqual(runLoopMode, NSDefaultRunLoopMode)
        }
        runLoop.addTimer(dummyTimer, forMode: NSDefaultRunLoopMode)
        let result = runLoop.runMode(NSDefaultRunLoopMode, beforeDate: endDate)
        
        XCTAssertFalse(result) // should be .Finished
        XCTAssertTrue(flag)
    }
    
    func test_runLoopLimitDate() {
        let runLoop = NSRunLoop.currentRunLoop()
        let timeInterval = NSTimeInterval(1)
        let expectedTimeInterval = NSDate(timeInterval: timeInterval, sinceDate: NSDate()).timeIntervalSince1970

        let dummyTimer = NSTimer.scheduledTimer(timeInterval, repeats: false) { _ in }
        runLoop.addTimer(dummyTimer, forMode: NSDefaultRunLoopMode)
        
        guard let timerTickInterval = runLoop.limitDateForMode(NSDefaultRunLoopMode)?.timeIntervalSince1970 else {
            return
        }
        
        XCTAssertLessThan(abs(timerTickInterval - expectedTimeInterval), 0.01)
    }
}
