// RUN: rm -rf %t ; mkdir -p %t
// RUN: %target-build-swift %s -o %t/a.out3 -swift-version 3 && %target-run %t/a.out3
// RUN: %target-build-swift %s -o %t/a.out4 -swift-version 4 && %target-run %t/a.out4

// REQUIRES: executable_test
// REQUIRES: objc_interop

// FIXME: Add a feature for "platforms that support XCTest".
// REQUIRES: OS=macosx

import StdlibUnittest


import XCTest

var XCTestTestSuite = TestSuite("XCTest")

// NOTE: When instantiating test cases for a particular test method using the
//       XCTestCase(selector:) initializer, those test methods must be marked
//       as dynamic. Objective-C XCTest uses runtime introspection to
//       instantiate an NSInvocation with the given selector.


func execute(observers: [XCTestObservation] = [], _ run: () -> Void) {
  for observer in observers {
#if swift(>=4.0)
    XCTestObservationCenter.shared.addTestObserver(observer)
#else
    XCTestObservationCenter.shared().addTestObserver(observer)
#endif

  }

  run()

  for observer in observers {
#if swift(>=4.0)
    XCTestObservationCenter.shared.removeTestObserver(observer)
#else
    XCTestObservationCenter.shared().removeTestObserver(observer)
#endif
  }
}

class FailureDescriptionObserver: NSObject, XCTestObservation {
  var failureDescription: String?

#if swift(>=4.0)
  typealias LineNumber=Int
#else
  typealias LineNumber=UInt
#endif

  func testCase(_ testCase: XCTestCase, didFailWithDescription description: String, inFile filePath: String?, atLine lineNumber: LineNumber) {
    failureDescription = description
  }
}

XCTestTestSuite.test("exceptions") {
  class ExceptionTestCase: XCTestCase {
    dynamic func test_raises() {
      NSException(name: NSExceptionName(rawValue: "XCTestTestSuiteException"), reason: nil, userInfo: nil).raise()
    }

    func test_raisesDuringAssertion() {
      let exception = NSException(name: NSExceptionName(rawValue: "XCTestTestSuiteException"), reason: nil, userInfo: nil)
      XCTAssertNoThrow(exception.raise())
    }

    func test_continueAfterFailureWithAssertions() {
      self.continueAfterFailure = false
      func triggerFailure() { XCTFail("I'm outta here!") }

      XCTAssertNoThrow(triggerFailure())

      // Should not be reached:
      NSException(name: NSExceptionName(rawValue: "XCTestTestSuiteException"), reason: nil, userInfo: nil).raise()
    }
  }

  let testCase = ExceptionTestCase(selector: #selector(ExceptionTestCase.test_raises))
  execute(testCase.run)
  let testRun = testCase.testRun!

  expectEqual(1, testRun.testCaseCount)
  expectEqual(1, testRun.executionCount)
  expectEqual(0, testRun.failureCount)
  expectEqual(1, testRun.unexpectedExceptionCount)
  expectEqual(1, testRun.totalFailureCount)
  expectFalse(testRun.hasSucceeded)

  let assertionTestCase = ExceptionTestCase(selector: #selector(ExceptionTestCase.test_raisesDuringAssertion))
  execute(assertionTestCase.run)
  let assertionTestRun = assertionTestCase.testRun!
  expectEqual(1, assertionTestRun.executionCount)
  expectEqual(0, assertionTestRun.failureCount)
  expectEqual(1, assertionTestRun.unexpectedExceptionCount)

  let continueAfterFailureTestCase = ExceptionTestCase(selector: #selector(ExceptionTestCase.test_continueAfterFailureWithAssertions))
  execute(continueAfterFailureTestCase.run)
  let continueAfterFailureTestRun = continueAfterFailureTestCase.testRun!
  expectEqual(1, continueAfterFailureTestRun.executionCount)
  expectEqual(1, continueAfterFailureTestRun.failureCount)
  expectEqual(0, continueAfterFailureTestRun.unexpectedExceptionCount)
}

XCTestTestSuite.test("XCTAssertEqual/T") {
  class AssertEqualTestCase: XCTestCase {
    dynamic func test_whenEqual_passes() {
      XCTAssertEqual(1, 1)
    }

    dynamic func test_whenNotEqual_fails() {
      XCTAssertEqual(1, 2)
    }
  }

  let passingTestCase = AssertEqualTestCase(selector: #selector(AssertEqualTestCase.test_whenEqual_passes))
  execute(passingTestCase.run)
  let passingTestRun = passingTestCase.testRun!
  expectTrue(passingTestRun.hasSucceeded)

  let failingTestCase = AssertEqualTestCase(selector: #selector(AssertEqualTestCase.test_whenNotEqual_fails))
  let observer = FailureDescriptionObserver()
  execute(observers: [observer], failingTestCase.run)
  let failingTestRun = failingTestCase.testRun!
  expectEqual(1, failingTestRun.failureCount)
  expectEqual(0, failingTestRun.unexpectedExceptionCount)
  expectEqual(observer.failureDescription, "XCTAssertEqual failed: (\"1\") is not equal to (\"2\") - ")
}

XCTestTestSuite.test("XCTAssertEqual/Optional<T>") {
  class AssertEqualOptionalTestCase: XCTestCase {
    dynamic func test_whenOptionalsAreEqual_passes() {
      XCTAssertEqual(Optional(1),Optional(1))
    }

    dynamic func test_whenOptionalsAreNotEqual_fails() {
      XCTAssertEqual(Optional(1),Optional(2))
    }
  }

  let passingTestCase = AssertEqualOptionalTestCase(selector: #selector(AssertEqualOptionalTestCase.test_whenOptionalsAreEqual_passes))
  execute(passingTestCase.run)
  let passingTestRun = passingTestCase.testRun!
  expectEqual(1, passingTestRun.testCaseCount)
  expectEqual(1, passingTestRun.executionCount)
  expectEqual(0, passingTestRun.failureCount)
  expectEqual(0, passingTestRun.unexpectedExceptionCount)
  expectEqual(0, passingTestRun.totalFailureCount)
  expectTrue(passingTestRun.hasSucceeded)

  let failingTestCase = AssertEqualOptionalTestCase(selector: #selector(AssertEqualOptionalTestCase.test_whenOptionalsAreNotEqual_fails))
  let observer = FailureDescriptionObserver()
  execute(observers: [observer], failingTestCase.run)
  let failingTestRun = failingTestCase.testRun!
  expectEqual(1, failingTestRun.testCaseCount)
  expectEqual(1, failingTestRun.executionCount)
  expectEqual(1, failingTestRun.failureCount)
  expectEqual(0, failingTestRun.unexpectedExceptionCount)
  expectEqual(1, failingTestRun.totalFailureCount)
  expectFalse(failingTestRun.hasSucceeded)
  expectEqual(observer.failureDescription, "XCTAssertEqual failed: (\"Optional(1)\") is not equal to (\"Optional(2)\") - ")
}

XCTestTestSuite.test("XCTAssertEqual/Array<T>") {
  class AssertEqualArrayTestCase: XCTestCase {
    dynamic func test_whenArraysAreEqual_passes() {
      XCTAssertEqual(["foo", "bar", "baz"],
                     ["foo", "bar", "baz"])
    }

    dynamic func test_whenArraysAreNotEqual_fails() {
      XCTAssertEqual(["foo", "baz", "bar"],
                     ["foo", "bar", "baz"])
    }
  }

  let passingTestCase = AssertEqualArrayTestCase(selector: #selector(AssertEqualArrayTestCase.test_whenArraysAreEqual_passes))
  execute(passingTestCase.run)
  let passingTestRun = passingTestCase.testRun!
  expectEqual(1, passingTestRun.testCaseCount)
  expectEqual(1, passingTestRun.executionCount)
  expectEqual(0, passingTestRun.failureCount)
  expectEqual(0, passingTestRun.unexpectedExceptionCount)
  expectEqual(0, passingTestRun.totalFailureCount)
  expectTrue(passingTestRun.hasSucceeded)

  let failingTestCase = AssertEqualArrayTestCase(selector: #selector(AssertEqualArrayTestCase.test_whenArraysAreNotEqual_fails))
  execute(failingTestCase.run)
  let failingTestRun = failingTestCase.testRun!
  expectEqual(1, failingTestRun.testCaseCount)
  expectEqual(1, failingTestRun.executionCount)
  expectEqual(1, failingTestRun.failureCount)
  expectEqual(0, failingTestRun.unexpectedExceptionCount)
  expectEqual(1, failingTestRun.totalFailureCount)
  expectFalse(failingTestRun.hasSucceeded)
}

XCTestTestSuite.test("XCTAssertEqual/Dictionary<T, U>") {
  class AssertEqualDictionaryTestCase: XCTestCase {
    dynamic func test_whenDictionariesAreEqual_passes() {
      XCTAssertEqual(["foo": "bar", "baz": "flim"],
                     ["baz": "flim", "foo": "bar"])
    }

    dynamic func test_whenDictionariesAreNotEqual_fails() {
      XCTAssertEqual(["foo": ["bar": "baz"] as NSDictionary],
                     ["foo": ["bar": "flim"] as NSDictionary])
    }
  }

  let passingTestCase = AssertEqualDictionaryTestCase(selector: #selector(AssertEqualDictionaryTestCase.test_whenDictionariesAreEqual_passes))
  execute(passingTestCase.run)
  let passingTestRun = passingTestCase.testRun!
  expectEqual(1, passingTestRun.testCaseCount)
  expectEqual(1, passingTestRun.executionCount)
  expectEqual(0, passingTestRun.failureCount)
  expectEqual(0, passingTestRun.unexpectedExceptionCount)
  expectEqual(0, passingTestRun.totalFailureCount)
  expectTrue(passingTestRun.hasSucceeded)

  let failingTestCase = AssertEqualDictionaryTestCase(selector: #selector(AssertEqualDictionaryTestCase.test_whenDictionariesAreNotEqual_fails))
  execute(failingTestCase.run)
  let failingTestRun = failingTestCase.testRun!
  expectEqual(1, failingTestRun.testCaseCount)
  expectEqual(1, failingTestRun.executionCount)
  expectEqual(1, failingTestRun.failureCount)
  expectEqual(0, failingTestRun.unexpectedExceptionCount)
  expectEqual(1, failingTestRun.totalFailureCount)
  expectFalse(failingTestRun.hasSucceeded)
}

XCTestTestSuite.test("XCTAssertEqual/XCTAssertNotEqual + accuracy") {
    class AssertEqualTestCase: XCTestCase {
        dynamic func test_whenEqual_passes() {
            XCTAssertEqual(1, 1.09, accuracy: 0.1)
            XCTAssertNotEqual(1, 1.11, accuracy: 0.1)
        }

        dynamic func test_whenNotEqual_fails() {
            XCTAssertEqual(1, 1.11, accuracy: 0.1)
            XCTAssertNotEqual(1, 1.09, accuracy: 0.1)
        }
    }

    let passingTestCase = AssertEqualTestCase(selector: #selector(AssertEqualTestCase.test_whenEqual_passes))
    execute(passingTestCase.run)
    expectTrue(passingTestCase.testRun!.hasSucceeded)

    let failingTestCase = AssertEqualTestCase(selector: #selector(AssertEqualTestCase.test_whenNotEqual_fails))
    execute(failingTestCase.run)
    let failingTestRun = failingTestCase.testRun!
    expectEqual(2, failingTestRun.failureCount)
    expectEqual(0, failingTestRun.unexpectedExceptionCount)
}

XCTestTestSuite.test("XCTAssertThrowsError") {
    class ErrorTestCase: XCTestCase {
        var doThrow = true
        var errorCode = 42
        
        dynamic func throwSomething() throws {
            if doThrow {
                throw NSError(domain: "MyDomain", code: errorCode, userInfo: nil)
            }
        }

        dynamic func test_throws() {
            XCTAssertThrowsError(try throwSomething()) {
                error in
                let nserror = error as NSError
                XCTAssertEqual(nserror.domain, "MyDomain")
                XCTAssertEqual(nserror.code, 42)
            }
        }
    }
    
    // Try success case
    do {
        let testCase = ErrorTestCase(selector: #selector(ErrorTestCase.test_throws))
        execute(testCase.run)
        let testRun = testCase.testRun!
        
        expectEqual(1, testRun.testCaseCount)
        expectEqual(1, testRun.executionCount)
        expectEqual(0, testRun.failureCount)
        expectEqual(0, testRun.unexpectedExceptionCount)
        expectEqual(0, testRun.totalFailureCount)
        expectTrue(testRun.hasSucceeded)
    }

    // Now try when it does not throw
    do {
        let testCase = ErrorTestCase(selector: #selector(ErrorTestCase.test_throws))
        testCase.doThrow = false
        execute(testCase.run)
        let testRun = testCase.testRun!
        
        expectEqual(1, testRun.testCaseCount)
        expectEqual(1, testRun.executionCount)
        expectEqual(1, testRun.failureCount)
        expectEqual(0, testRun.unexpectedExceptionCount)
        expectEqual(1, testRun.totalFailureCount)
        expectFalse(testRun.hasSucceeded)
    }

    
    // Now try when it throws the wrong thing
    do {
        let testCase = ErrorTestCase(selector: #selector(ErrorTestCase.test_throws))
        testCase.errorCode = 23
        execute(testCase.run)
        let testRun = testCase.testRun!
        
        expectEqual(1, testRun.testCaseCount)
        expectEqual(1, testRun.executionCount)
        expectEqual(1, testRun.failureCount)
        expectEqual(0, testRun.unexpectedExceptionCount)
        expectEqual(1, testRun.totalFailureCount)
        expectFalse(testRun.hasSucceeded)
    }

}

XCTestTestSuite.test("XCTAssertNoThrow") {
  class ErrorTestCase: XCTestCase {
    var doThrow = true
    var errorCode = 42

    dynamic func throwSomething() throws {
      if doThrow {
        throw NSError(domain: "MyDomain", code: errorCode, userInfo: nil)
      }
    }

    dynamic func test_throws() {
      XCTAssertNoThrow(try throwSomething())
    }
  }

  // Success
  do {
    let testCase = ErrorTestCase(selector: #selector(ErrorTestCase.test_throws))
    testCase.doThrow = false
    execute(testCase.run)
    let testRun = testCase.testRun!

    expectEqual(1, testRun.testCaseCount)
    expectEqual(1, testRun.executionCount)
    expectEqual(0, testRun.failureCount)
    expectEqual(0, testRun.unexpectedExceptionCount)
    expectEqual(0, testRun.totalFailureCount)
    expectTrue(testRun.hasSucceeded)
  }

  // Failure
  do {
    let testCase = ErrorTestCase(selector: #selector(ErrorTestCase.test_throws))
    execute(testCase.run)
    let testRun = testCase.testRun!

    expectEqual(1, testRun.testCaseCount)
    expectEqual(1, testRun.executionCount)
    expectEqual(1, testRun.failureCount)
    expectEqual(0, testRun.unexpectedExceptionCount)
    expectEqual(1, testRun.totalFailureCount)
    expectFalse(testRun.hasSucceeded)
  }

  // Throws wrong thing
  do {
    let testCase = ErrorTestCase(selector: #selector(ErrorTestCase.test_throws))
    testCase.errorCode = 23
    execute(testCase.run)
    let testRun = testCase.testRun!

    expectEqual(1, testRun.testCaseCount)
    expectEqual(1, testRun.executionCount)
    expectEqual(1, testRun.failureCount)
    expectEqual(0, testRun.unexpectedExceptionCount)
    expectEqual(1, testRun.totalFailureCount)
    expectFalse(testRun.hasSucceeded)
  }
}

XCTestTestSuite.test("XCTAsserts with throwing expressions") {
  class ErrorTestCase: XCTestCase {
    var doThrow = true
    var errorCode = 42

    dynamic func throwSomething() throws -> String {
      if doThrow {
        throw NSError(domain: "MyDomain", code: errorCode, userInfo: nil)
      }
      return "Hello"
    }

    dynamic func test_withThrowing() {
      XCTAssertEqual(try throwSomething(), "Hello")
    }
  }

  // Try success case
  do {
    let testCase = ErrorTestCase(selector: #selector(ErrorTestCase.test_withThrowing))
    testCase.doThrow = false
    execute(testCase.run)
    let testRun = testCase.testRun!

    expectEqual(1, testRun.testCaseCount)
    expectEqual(1, testRun.executionCount)
    expectEqual(0, testRun.failureCount)
    expectEqual(0, testRun.unexpectedExceptionCount)
    expectEqual(0, testRun.totalFailureCount)
    expectTrue(testRun.hasSucceeded)
  }

  // Now try when the expression throws
  do {
    let testCase = ErrorTestCase(selector: #selector(ErrorTestCase.test_withThrowing))
    execute(testCase.run)
    let testRun = testCase.testRun!

    expectEqual(1, testRun.testCaseCount)
    expectEqual(1, testRun.executionCount)
    expectEqual(0, testRun.failureCount)
    expectEqual(1, testRun.unexpectedExceptionCount)
    expectEqual(1, testRun.totalFailureCount)
    expectFalse(testRun.hasSucceeded)
  }
}

XCTestTestSuite.test("Test methods that wind up throwing") {
    class ErrorTestCase: XCTestCase {
        var doThrow = true
        var errorCode = 42
        
        dynamic func throwSomething() throws {
            if doThrow {
                throw NSError(domain: "MyDomain", code: errorCode, userInfo: nil)
            }
        }
        
        dynamic func test_withThrowing() throws {
            try throwSomething()
        }
    }
    
    // Try success case
    do {
        let testCase = ErrorTestCase(selector: #selector(ErrorTestCase.test_withThrowing))
        testCase.doThrow = false
        execute(testCase.run)
        let testRun = testCase.testRun!
        
        expectEqual(1, testRun.testCaseCount)
        expectEqual(1, testRun.executionCount)
        expectEqual(0, testRun.failureCount)
        expectEqual(0, testRun.unexpectedExceptionCount)
        expectEqual(0, testRun.totalFailureCount)
        expectTrue(testRun.hasSucceeded)
    }
    
    // Now try when the expression throws
    do {
        let testCase = ErrorTestCase(selector: #selector(ErrorTestCase.test_withThrowing))
        execute(testCase.run)
        let testRun = testCase.testRun!
        
        expectEqual(1, testRun.testCaseCount)
        expectEqual(1, testRun.executionCount)
        expectEqual(0, testRun.failureCount)
        expectEqual(1, testRun.unexpectedExceptionCount)
        expectEqual(1, testRun.totalFailureCount)
        expectFalse(testRun.hasSucceeded)
    }
    
}

XCTestTestSuite.test("XCTContext/runActivity(named:block:)") {
  class RunActivityTestCase: XCTestCase {

    dynamic func test_noThrow_void() {
      var blockCalled = false
      XCTContext.runActivity(named: "noThrow") { activity in
        blockCalled = true
      }
      expectTrue(blockCalled)
    }

    dynamic func test_noThrow_returns_string() {
      var blockCalled = false
      let value = XCTContext.runActivity(named: "noThrow") { activity -> String in
        blockCalled = true
        return "Activities can return values now!"
      }
      expectEqual(value, "Activities can return values now!")
      expectTrue(blockCalled)
    }

    dynamic func test_throwing() {
      var blockCalled = false
      var catchCalled = false
      do {
        try XCTContext.runActivity(named: "throwing") { activity in
          blockCalled = true
          throw NSError(domain: "MyDomain", code: -1, userInfo: nil)
        }
      } catch {
        catchCalled = true
      }
      expectTrue(blockCalled)
      expectTrue(catchCalled)
    }
  }
}

#if os(macOS)
if #available(macOS 10.11, *) {
    XCTestTestSuite.test("XCUIElement/typeKey(_:modifierFlags:)") {
        class TypeKeyTestCase: XCTestCase {
            func testTypeKey() {
                #if swift(>=4.0)
                    XCUIApplication().typeKey("a", modifierFlags: [])
                    XCUIApplication().typeKey(.delete, modifierFlags: [])
                #else
                    XCUIApplication().typeKey("a", modifierFlags: [])
                    XCUIApplication().typeKey(XCUIKeyboardKeyDelete, modifierFlags: [])
                #endif
            }
        }
    }
}
#endif


runAllTests()


