// RUN: %{swiftc} %s -o %T/Asynchronous
// RUN: %T/Asynchronous > %t || true
// RUN: %{xctest_checker} %t %s

#if os(macOS)
    import SwiftXCTest
#else
    import XCTest
#endif

import CoreFoundation

// CHECK: Test Suite 'All tests' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Suite '.*\.xctest' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+

// CHECK: Test Suite 'ExpectationsTestCase' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
class ExpectationsTestCase: XCTestCase {
// CHECK: Test Case 'ExpectationsTestCase.test_waitingForAnUnfulfilledExpectation_fails' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+4]]: error: ExpectationsTestCase.test_waitingForAnUnfulfilledExpectation_fails : Asynchronous wait failed - Exceeded timeout of 0.2 seconds, with unfulfilled expectations: foo
// CHECK: Test Case 'ExpectationsTestCase.test_waitingForAnUnfulfilledExpectation_fails' failed \(\d+\.\d+ seconds\)
    func test_waitingForAnUnfulfilledExpectation_fails() {
        expectation(description: "foo")
        waitForExpectations(timeout: 0.2)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_waitingForUnfulfilledExpectations_outputsAllExpectations_andFails' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+5]]: error: ExpectationsTestCase.test_waitingForUnfulfilledExpectations_outputsAllExpectations_andFails : Asynchronous wait failed - Exceeded timeout of 0.2 seconds, with unfulfilled expectations: bar, baz
// CHECK: Test Case 'ExpectationsTestCase.test_waitingForUnfulfilledExpectations_outputsAllExpectations_andFails' failed \(\d+\.\d+ seconds\)
    func test_waitingForUnfulfilledExpectations_outputsAllExpectations_andFails() {
        expectation(description: "bar")
        expectation(description: "baz")
        waitForExpectations(timeout: 0.2)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_waitingForAnImmediatelyFulfilledExpectation_passes' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_waitingForAnImmediatelyFulfilledExpectation_passes' passed \(\d+\.\d+ seconds\)
    func test_waitingForAnImmediatelyFulfilledExpectation_passes() {
        let expectation = self.expectation(description: "flim")
        expectation.fulfill()
        waitForExpectations(timeout: 0.2)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_waitingForAnEventuallyFulfilledExpectation_passes' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_waitingForAnEventuallyFulfilledExpectation_passes' passed \(\d+\.\d+ seconds\)
    func test_waitingForAnEventuallyFulfilledExpectation_passes() {
        let expectation = self.expectation(description: "flam")
        let timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: false) { _ in
            expectation.fulfill()
        }
        RunLoop.current.add(timer, forMode: .default)
        waitForExpectations(timeout: 1.0)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_waitingForAnExpectationFulfilledAfterTheTimeout_fails' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+8]]: error: ExpectationsTestCase.test_waitingForAnExpectationFulfilledAfterTheTimeout_fails : Asynchronous wait failed - Exceeded timeout of 0.1 seconds, with unfulfilled expectations: hog
// CHECK: Test Case 'ExpectationsTestCase.test_waitingForAnExpectationFulfilledAfterTheTimeout_fails' failed \(\d+\.\d+ seconds\)
    func test_waitingForAnExpectationFulfilledAfterTheTimeout_fails() {
        let expectation = self.expectation(description: "hog")
        let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { _ in
            expectation.fulfill()
        }
        RunLoop.current.add(timer, forMode: .default)
        waitForExpectations(timeout: 0.1)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_whenTimeoutIsImmediate_andAllExpectationsAreFulfilled_passes' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_whenTimeoutIsImmediate_andAllExpectationsAreFulfilled_passes' passed \(\d+\.\d+ seconds\)
    func test_whenTimeoutIsImmediate_andAllExpectationsAreFulfilled_passes() {
        let expectation = self.expectation(description: "smog")
        expectation.fulfill()
        waitForExpectations(timeout: 0.0)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_whenTimeoutIsImmediate_butNotAllExpectationsAreFulfilled_fails' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+4]]: error: ExpectationsTestCase.test_whenTimeoutIsImmediate_butNotAllExpectationsAreFulfilled_fails : Asynchronous wait failed - Exceeded timeout of -1.0 seconds, with unfulfilled expectations: dog
// CHECK: Test Case 'ExpectationsTestCase.test_whenTimeoutIsImmediate_butNotAllExpectationsAreFulfilled_fails' failed \(\d+\.\d+ seconds\)
    func test_whenTimeoutIsImmediate_butNotAllExpectationsAreFulfilled_fails() {
        expectation(description: "dog")
        waitForExpectations(timeout: -1.0)
    }

    // PRAGMA MARK: - Multiple Expectations

// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectations' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectations' passed \(\d+\.\d+ seconds\)
    func test_multipleExpectations() {
        let foo = expectation(description: "foo")
        let bar = XCTestExpectation(description: "bar")
        DispatchQueue.global(qos: .default).asyncAfter(wallDeadline: .now() + 0.01) {
            bar.fulfill()
        }
        DispatchQueue.global(qos: .default).asyncAfter(wallDeadline: .now() + 0.01) {
            foo.fulfill()
        }

        XCTWaiter(delegate: self).wait(for: [foo, bar], timeout: 1)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectationsEnforceOrderingCorrect' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectationsEnforceOrderingCorrect' passed \(\d+\.\d+ seconds\)
    func test_multipleExpectationsEnforceOrderingCorrect() {
        let foo = expectation(description: "foo")
        let bar = XCTestExpectation(description: "bar")
        DispatchQueue.global(qos: .default).asyncAfter(wallDeadline: .now() + 0.01) {
            foo.fulfill()
            bar.fulfill()
        }

        XCTWaiter(delegate: self).wait(for: [foo, bar], timeout: 1, enforceOrder: true)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectationsEnforceOrderingCorrectBeforeWait' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectationsEnforceOrderingCorrectBeforeWait' passed \(\d+\.\d+ seconds\)
    func test_multipleExpectationsEnforceOrderingCorrectBeforeWait() {
        let foo = expectation(description: "foo")
        let bar = XCTestExpectation(description: "bar")
        foo.fulfill()
        bar.fulfill()
        XCTWaiter(delegate: self).wait(for: [foo, bar], timeout: 1, enforceOrder: true)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectationsEnforceOrderingIncorrect' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+6]]: error: ExpectationsTestCase.test_multipleExpectationsEnforceOrderingIncorrect : Failed due to expectation fulfilled in incorrect order: requires 'foo', actually fulfilled 'bar'
// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectationsEnforceOrderingIncorrect' failed \(\d+\.\d+ seconds\)
    func test_multipleExpectationsEnforceOrderingIncorrect() {
        let foo = expectation(description: "foo")
        let bar = XCTestExpectation(description: "bar")
        DispatchQueue.global(qos: .default).asyncAfter(wallDeadline: .now() + 0.01) {
            bar.fulfill()
            foo.fulfill()
        }
        XCTWaiter(delegate: self).wait(for: [foo, bar], timeout: 1, enforceOrder: true)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectationsIncludingInvertedEnforceOrderingIncorrect' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+8]]: error: ExpectationsTestCase.test_multipleExpectationsIncludingInvertedEnforceOrderingIncorrect : Failed due to expectation fulfilled in incorrect order: requires 'foo', actually fulfilled 'bar'
// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectationsIncludingInvertedEnforceOrderingIncorrect' failed \(\d+\.\d+ seconds\)
    func test_multipleExpectationsIncludingInvertedEnforceOrderingIncorrect() {
        let inverted = expectation(description: "inverted")
        inverted.isInverted = true
        let foo = expectation(description: "foo")
        let bar = XCTestExpectation(description: "bar")
        DispatchQueue.global(qos: .default).asyncAfter(wallDeadline: .now() + 0.01) {
            bar.fulfill()
            foo.fulfill()
        }
        XCTWaiter(delegate: self).wait(for: [inverted, foo, bar], timeout: 1, enforceOrder: true)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectationsEnforceOrderingIncorrectBeforeWait' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+5]]: error: ExpectationsTestCase.test_multipleExpectationsEnforceOrderingIncorrectBeforeWait : Failed due to expectation fulfilled in incorrect order: requires 'foo', actually fulfilled 'bar'
// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectationsEnforceOrderingIncorrectBeforeWait' failed \(\d+\.\d+ seconds\)
    func test_multipleExpectationsEnforceOrderingIncorrectBeforeWait() {
        let foo = expectation(description: "foo")
        let bar = XCTestExpectation(description: "bar")
        bar.fulfill()
        foo.fulfill()
        XCTWaiter(delegate: self).wait(for: [foo, bar], timeout: 1, enforceOrder: true)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectationsEnforceOrderingStressTest' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_multipleExpectationsEnforceOrderingStressTest' passed \(\d+\.\d+ seconds\)
    func test_multipleExpectationsEnforceOrderingStressTest() {
        for _ in 0..<2000 {
            let expectation1 = XCTestExpectation(description: "expectation1")
            let expectation2 = XCTestExpectation(description: "expectation2")

            DispatchQueue.global(qos: .default).async {
                expectation1.fulfill()
                expectation2.fulfill()
            }

            wait(for: [expectation1, expectation2], timeout: 5, enforceOrder: true)
        }
    }

    // PRAGMA MARK: - Inverse Expectations

// CHECK: Test Case 'ExpectationsTestCase.test_inverseExpectationPass' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_inverseExpectationPass' passed \(\d+\.\d+ seconds\)
    func test_inverseExpectationPass() {
        let foo = expectation(description: "foo")
        foo.isInverted = true
        waitForExpectations(timeout: 0.1)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_inverseExpectationFail' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+6]]: error: ExpectationsTestCase.test_inverseExpectationFail : Asynchronous wait failed - Fulfilled inverted expectation 'foo'
// CHECK: Test Case 'ExpectationsTestCase.test_inverseExpectationFail' failed \(\d+\.\d+ seconds\)
    func test_inverseExpectationFail() {
        let foo = expectation(description: "foo")
        foo.isInverted = true
        DispatchQueue.global(qos: .default).asyncAfter(wallDeadline: .now() + 0.01) {
            foo.fulfill()
        }
        waitForExpectations(timeout: 0.5)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_inverseExpectationFulfilledBeforeWait' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+5]]: error: ExpectationsTestCase.test_inverseExpectationFulfilledBeforeWait : Asynchronous wait failed - Fulfilled inverted expectation 'foo'
// CHECK: Test Case 'ExpectationsTestCase.test_inverseExpectationFulfilledBeforeWait' failed \(\d+\.\d+ seconds\)
    func test_inverseExpectationFulfilledBeforeWait() {
        let foo = expectation(description: "foo")
        foo.isInverted = true
        foo.fulfill()
        wait(for: [foo], timeout: 1)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_combiningInverseAndStandardExpectationsPass' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_combiningInverseAndStandardExpectationsPass' passed \(\d+\.\d+ seconds\)
    func test_combiningInverseAndStandardExpectationsPass() {
        let foo = expectation(description: "foo")
        foo.isInverted = true
        let bar = XCTestExpectation(description: "bar")
        DispatchQueue.global(qos: .default).asyncAfter(wallDeadline: .now() + 0.1) {
            bar.fulfill()
        }

        let start = Date.timeIntervalSinceReferenceDate
        waitForExpectations(timeout: 0.5)

        // Make sure we actually waited long enough.
        XCTAssertGreaterThanOrEqual(Date.timeIntervalSinceReferenceDate - start, 0.5)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_combiningInverseAndStandardExpectationsFailWithTimeout' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+8]]: error: ExpectationsTestCase.test_combiningInverseAndStandardExpectationsFailWithTimeout : Asynchronous wait failed - Exceeded timeout of 0.5 seconds, with unfulfilled expectations: bar
// CHECK: Test Case 'ExpectationsTestCase.test_combiningInverseAndStandardExpectationsFailWithTimeout' failed \(\d+\.\d+ seconds\)
    func test_combiningInverseAndStandardExpectationsFailWithTimeout() {
        let foo = expectation(description: "foo")
        foo.isInverted = true
        expectation(description: "bar")

        let start = Date.timeIntervalSinceReferenceDate
        waitForExpectations(timeout: 0.5)

        // Make sure we actually waited long enough.
        XCTAssertGreaterThanOrEqual(Date.timeIntervalSinceReferenceDate - start, 0.5)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_combiningInverseAndStandardExpectationsFailWithInverseFulfillment' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+8]]: error: ExpectationsTestCase.test_combiningInverseAndStandardExpectationsFailWithInverseFulfillment : Asynchronous wait failed - Fulfilled inverted expectation 'foo'
// CHECK: Test Case 'ExpectationsTestCase.test_combiningInverseAndStandardExpectationsFailWithInverseFulfillment' failed \(\d+\.\d+ seconds\)
    func test_combiningInverseAndStandardExpectationsFailWithInverseFulfillment() {
        let foo = expectation(description: "foo")
        foo.isInverted = true
        let bar = expectation(description: "bar")

        DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.1) {
            foo.fulfill()
            bar.fulfill()
        }

        waitForExpectations(timeout: 0.5)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_combiningInverseAndStandardExpectationsWithOrderingEnforcement' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_combiningInverseAndStandardExpectationsWithOrderingEnforcement' passed \(\d+\.\d+ seconds\)
    func test_combiningInverseAndStandardExpectationsWithOrderingEnforcement() {
        var a, b, c: XCTestExpectation
        var start: CFAbsoluteTime

        a = XCTestExpectation(description: "a")
        a.isInverted = true
        b = XCTestExpectation(description: "b")
        c = XCTestExpectation(description: "c")
        DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.01) {
            b.fulfill()
            c.fulfill()
        }

        start = Date.timeIntervalSinceReferenceDate
        wait(for: [a, b, c], timeout: 0.2, enforceOrder: true)
        XCTAssertGreaterThanOrEqual(Date.timeIntervalSinceReferenceDate - start, 0.2)

        a = XCTestExpectation(description: "a")
        a.isInverted = true
        b = XCTestExpectation(description: "b")
        c = XCTestExpectation(description: "c")
        DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.01) {
            b.fulfill()
            c.fulfill()
        }

        start = Date.timeIntervalSinceReferenceDate
        wait(for: [b, a, c], timeout: 0.2, enforceOrder: true)
        XCTAssertGreaterThanOrEqual(Date.timeIntervalSinceReferenceDate - start, 0.2)

        a = XCTestExpectation(description: "a")
        a.isInverted = true
        b = XCTestExpectation(description: "b")
        c = XCTestExpectation(description: "c")
        DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.01) {
            b.fulfill()
            c.fulfill()
        }

        start = Date.timeIntervalSinceReferenceDate
        wait(for: [b, c, a], timeout: 0.2, enforceOrder: true)
        XCTAssertGreaterThanOrEqual(Date.timeIntervalSinceReferenceDate - start, 0.2)
    }

    // PRAGMA MARK: - Counted Expectations

// CHECK: Test Case 'ExpectationsTestCase.test_countedConditionPass' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_countedConditionPass' passed \(\d+\.\d+ seconds\)
    func test_countedConditionPass() {
        let foo = expectation(description: "foo")
        foo.expectedFulfillmentCount = 2
        DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.05) {
            foo.fulfill()
            DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.05) {
                foo.fulfill()
            }
        }
        waitForExpectations(timeout: 1)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_countedConditionPassBeforeWaiting' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_countedConditionPassBeforeWaiting' passed \(\d+\.\d+ seconds\)
    func test_countedConditionPassBeforeWaiting() {
        let foo = expectation(description: "foo")
        foo.expectedFulfillmentCount = 2
        foo.fulfill()
        foo.fulfill()
        waitForExpectations(timeout: 1)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_countedConditionFail' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+8]]: error: ExpectationsTestCase.test_countedConditionFail : Asynchronous wait failed - Exceeded timeout of 0.2 seconds, with unfulfilled expectations: foo
// CHECK: Test Case 'ExpectationsTestCase.test_countedConditionFail' failed \(\d+\.\d+ seconds\)
    func test_countedConditionFail() {
        let foo = expectation(description: "foo")
        foo.expectedFulfillmentCount = 2
        DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.01) {
            foo.fulfill()
        }
        waitForExpectations(timeout: 0.2)
    }

    // PRAGMA MARK: - Interrupted Waiters

    // Disabled due to non-deterministic ordering of XCTWaiterDelegate callbacks, see [SR-10034] and <rdar://problem/49123061>
/*
    CHECK: Test Case 'ExpectationsTestCase.test_outerWaiterTimesOut_InnerWaitersAreInterrupted' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
    CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+22]]: error: ExpectationsTestCase.test_outerWaiterTimesOut_InnerWaitersAreInterrupted : Asynchronous wait failed - Exceeded timeout of 0.1 seconds, with unfulfilled expectations: outer
    CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+11]]: error: ExpectationsTestCase.test_outerWaiterTimesOut_InnerWaitersAreInterrupted : Asynchronous waiter <XCTWaiter expectations: 'inner-1'> failed - Interrupted by timeout of containing waiter <XCTWaiter expectations: 'outer'>
    CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+15]]: error: ExpectationsTestCase.test_outerWaiterTimesOut_InnerWaitersAreInterrupted : Asynchronous waiter <XCTWaiter expectations: 'inner-2'> failed - Interrupted by timeout of containing waiter <XCTWaiter expectations: 'outer'>
    CHECK: Test Case 'ExpectationsTestCase.test_outerWaiterTimesOut_InnerWaitersAreInterrupted' failed \(\d+\.\d+ seconds\)
 */
    func test_outerWaiterTimesOut_InnerWaitersAreInterrupted() {
        let outerWaiter = XCTWaiter(delegate: self)
        let outerExpectation = XCTestExpectation(description: "outer")

        RunLoop.main.perform {
            do {
                let innerWaiter = XCTWaiter(delegate: self)
                let innerExpectation = XCTestExpectation(description: "inner-1")
                XCTAssertEqual(innerWaiter.wait(for: [innerExpectation], timeout: 1), .interrupted, "waiting for \(innerExpectation.expectationDescription)")
            }
            do {
                let innerWaiter = XCTWaiter(delegate: self)
                let innerExpectation = XCTestExpectation(description: "inner-2")
                XCTAssertEqual(innerWaiter.wait(for: [innerExpectation], timeout: 1), .interrupted, "waiting for \(innerExpectation.expectationDescription)")
            }
        }

        let start = Date.timeIntervalSinceReferenceDate
        let result = outerWaiter.wait(for: [outerExpectation], timeout: 0.1)
        let durationOfOuterWait = Date.timeIntervalSinceReferenceDate - start
        XCTAssertEqual(result, .timedOut)

        // The theoretical best-case duration in the current implementation is:
        //     `timeout` (.1) + `kOuterTimeoutSlop` (.25) = .35
        // Adding some leeway for other system activity brings us to this value for the assertion.
        XCTAssertLessThanOrEqual(durationOfOuterWait, 0.65)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_outerWaiterCompletes_InnerWaiterTimesOut' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+14]]: error: ExpectationsTestCase.test_outerWaiterCompletes_InnerWaiterTimesOut : Asynchronous wait failed - Exceeded timeout of 1.0 seconds, with unfulfilled expectations: inner
// CHECK: Test Case 'ExpectationsTestCase.test_outerWaiterCompletes_InnerWaiterTimesOut' failed \(\d+\.\d+ seconds\)
    func test_outerWaiterCompletes_InnerWaiterTimesOut() {
        let outerWaiter = XCTWaiter(delegate: self)
        let outerExpectation = XCTestExpectation(description: "outer")

        var outerExpectationFulfillTime = CFAbsoluteTime(0)
        RunLoop.main.perform {
            RunLoop.main.perform {
                outerExpectationFulfillTime = Date.timeIntervalSinceReferenceDate
                outerExpectation.fulfill()
            }
            let innerWaiter = XCTWaiter(delegate: self)
            let innerExpectation = XCTestExpectation(description: "inner")
            XCTAssertEqual(innerWaiter.wait(for: [innerExpectation], timeout: 1), .timedOut)
        }

        let start = Date.timeIntervalSinceReferenceDate
        XCTAssertEqual(outerWaiter.wait(for: [outerExpectation], timeout: 1), .completed)
        XCTAssertLessThanOrEqual(outerExpectationFulfillTime - start, 0.1)
        XCTAssertGreaterThanOrEqual(Date.timeIntervalSinceReferenceDate - start, 1)
    }

    // PRAGMA MARK: - Waiter Conveniences

// CHECK: Test Case 'ExpectationsTestCase.test_classWait' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_classWait' passed \(\d+\.\d+ seconds\)
    func test_classWait() {
        var a, b: XCTestExpectation

        a = XCTestExpectation(description: "a")
        b = XCTestExpectation(description: "b")
        XCTAssertEqual(XCTWaiter.wait(for: [a, b], timeout: 0.01), .timedOut)

        a = XCTestExpectation(description: "a")
        b = XCTestExpectation(description: "b")
        a.fulfill()
        b.fulfill()
        XCTAssertEqual(XCTWaiter.wait(for: [a, b], timeout: 1), .completed)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_classWaitEnforcingOrder' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_classWaitEnforcingOrder' passed \(\d+\.\d+ seconds\)
    func test_classWaitEnforcingOrder() {
        let a = XCTestExpectation(description: "a")
        let b = XCTestExpectation(description: "b")
        b.fulfill()
        a.fulfill()
        XCTAssertEqual(XCTWaiter.wait(for: [a, b], timeout: 1, enforceOrder: true), .incorrectOrder)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_classWaitInverseExpectationFail' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_classWaitInverseExpectationFail' passed \(\d+\.\d+ seconds\)
    func test_classWaitInverseExpectationFail() {
        let a = XCTestExpectation(description: "a")
        a.isInverted = true
        a.fulfill()
        XCTAssertEqual(XCTWaiter.wait(for: [a], timeout: 0.001), .invertedFulfillment)
    }

    // PRAGMA MARK: - Regressions

// CHECK: Test Case 'ExpectationsTestCase.test_fulfillmentOnSecondaryThread' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: Test Case 'ExpectationsTestCase.test_fulfillmentOnSecondaryThread' passed \(\d+\.\d+ seconds\)
    func test_fulfillmentOnSecondaryThread() {
        let foo = expectation(description: "foo")
        DispatchQueue.global(qos: .default).async {
            foo.fulfill()
        }
        waitForExpectations(timeout: 1)
    }

// CHECK: Test Case 'ExpectationsTestCase.test_runLoopInsideDispatch' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: .*[/\\]Tests[/\\]Functional[/\\]Asynchronous[/\\]Expectations[/\\]main.swift:[[@LINE+8]]: error: ExpectationsTestCase.test_runLoopInsideDispatch : Asynchronous wait failed - Exceeded timeout of 0.5 seconds, with unfulfilled expectations: foo
// CHECK: Test Case 'ExpectationsTestCase.test_runLoopInsideDispatch' failed \(\d+\.\d+ seconds\)
    func test_runLoopInsideDispatch() {
        DispatchQueue.main.async {
            var foo: XCTestExpectation? = self.expectation(description: "foo")
            DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.1) {
                foo?.fulfill()
            }
            self.waitForExpectations(timeout: 0.5)
            foo = nil
        }
        RunLoop.main.run(until: Date() + 1)
    }

    static var allTests = {
        return [
            ("test_waitingForAnUnfulfilledExpectation_fails", test_waitingForAnUnfulfilledExpectation_fails),
            ("test_waitingForUnfulfilledExpectations_outputsAllExpectations_andFails", test_waitingForUnfulfilledExpectations_outputsAllExpectations_andFails),
            ("test_waitingForAnImmediatelyFulfilledExpectation_passes", test_waitingForAnImmediatelyFulfilledExpectation_passes),
            ("test_waitingForAnEventuallyFulfilledExpectation_passes", test_waitingForAnEventuallyFulfilledExpectation_passes),
            ("test_waitingForAnExpectationFulfilledAfterTheTimeout_fails", test_waitingForAnExpectationFulfilledAfterTheTimeout_fails),
            ("test_whenTimeoutIsImmediate_andAllExpectationsAreFulfilled_passes", test_whenTimeoutIsImmediate_andAllExpectationsAreFulfilled_passes),
            ("test_whenTimeoutIsImmediate_butNotAllExpectationsAreFulfilled_fails", test_whenTimeoutIsImmediate_butNotAllExpectationsAreFulfilled_fails),

            // Multiple Expectations
            ("test_multipleExpectations", test_multipleExpectations),
            ("test_multipleExpectationsEnforceOrderingCorrect", test_multipleExpectationsEnforceOrderingCorrect),
            ("test_multipleExpectationsEnforceOrderingCorrectBeforeWait", test_multipleExpectationsEnforceOrderingCorrectBeforeWait),
            ("test_multipleExpectationsEnforceOrderingIncorrect", test_multipleExpectationsEnforceOrderingIncorrect),
            ("test_multipleExpectationsIncludingInvertedEnforceOrderingIncorrect", test_multipleExpectationsIncludingInvertedEnforceOrderingIncorrect),
            ("test_multipleExpectationsEnforceOrderingIncorrectBeforeWait", test_multipleExpectationsEnforceOrderingIncorrectBeforeWait),
            ("test_multipleExpectationsEnforceOrderingStressTest", test_multipleExpectationsEnforceOrderingStressTest),

            // Inverse Expectations
            ("test_inverseExpectationPass", test_inverseExpectationPass),
            ("test_inverseExpectationFail", test_inverseExpectationFail),
            ("test_inverseExpectationFulfilledBeforeWait", test_inverseExpectationFulfilledBeforeWait),
            ("test_combiningInverseAndStandardExpectationsPass", test_combiningInverseAndStandardExpectationsPass),
            ("test_combiningInverseAndStandardExpectationsFailWithTimeout", test_combiningInverseAndStandardExpectationsFailWithTimeout),
            ("test_combiningInverseAndStandardExpectationsFailWithInverseFulfillment", test_combiningInverseAndStandardExpectationsFailWithInverseFulfillment),
            ("test_combiningInverseAndStandardExpectationsWithOrderingEnforcement", test_combiningInverseAndStandardExpectationsWithOrderingEnforcement),

            // Counted Expectations
            ("test_countedConditionPass", test_countedConditionPass),
            ("test_countedConditionPassBeforeWaiting", test_countedConditionPassBeforeWaiting),
            ("test_countedConditionFail", test_countedConditionFail),

            // Interrupted Waiters
//            ("test_outerWaiterTimesOut_InnerWaitersAreInterrupted", test_outerWaiterTimesOut_InnerWaitersAreInterrupted),
            ("test_outerWaiterCompletes_InnerWaiterTimesOut", test_outerWaiterCompletes_InnerWaiterTimesOut),

            // Waiter Conveniences
            ("test_classWait", test_classWait),
            ("test_classWaitEnforcingOrder", test_classWaitEnforcingOrder),
            ("test_classWaitInverseExpectationFail", test_classWaitInverseExpectationFail),

            // Regressions
            ("test_fulfillmentOnSecondaryThread", test_fulfillmentOnSecondaryThread),
            ("test_runLoopInsideDispatch", test_runLoopInsideDispatch),
        ]
    }()
}
// CHECK: Test Suite 'ExpectationsTestCase' failed at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: \t Executed 30 tests, with 14 failures \(0 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds

XCTMain([testCase(ExpectationsTestCase.allTests)])

// CHECK: Test Suite '.*\.xctest' failed at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: \t Executed 30 tests, with 14 failures \(0 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds
// CHECK: Test Suite 'All tests' failed at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
// CHECK: \t Executed 30 tests, with 14 failures \(0 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds
