Merge pull request #156 from briancroom/fix-flaky-test

Fix race condition in an async test which was triggering failures (SR-2332)
diff --git a/Tests/Functional/Asynchronous/Predicates/Expectations/main.swift b/Tests/Functional/Asynchronous/Predicates/Expectations/main.swift
index f8459fa..6210acc 100644
--- a/Tests/Functional/Asynchronous/Predicates/Expectations/main.swift
+++ b/Tests/Functional/Asynchronous/Predicates/Expectations/main.swift
@@ -1,7 +1,6 @@
 // RUN: %{swiftc} %s -o %T/Asynchronous-Predicates
 // RUN: %T/Asynchronous-Predicates > %t || true
-// Disabled due to: https://bugs.swift.org/browse/SR-2332
-// xxx: %{xctest_checker} %t %s
+// RUN: %{xctest_checker} %t %s
 
 #if os(Linux) || os(FreeBSD)
     import XCTest
@@ -38,29 +37,26 @@
     // CHECK: Test Case 'PredicateExpectationsTestCase.test_delayedTruePredicateAndObject_passes' started at \d+:\d+:\d+\.\d+
     // CHECK: Test Case 'PredicateExpectationsTestCase.test_delayedTruePredicateAndObject_passes' passed \(\d+\.\d+ seconds\).
     func test_delayedTruePredicateAndObject_passes() {
-        let halfSecLaterDate = NSDate(timeIntervalSinceNow: 0.01)
-        let predicate = Predicate(block: {
-            evaluatedObject, bindings in
-            if let evaluatedDate = evaluatedObject as? NSDate {
-                return evaluatedDate.compare(Date()) == ComparisonResult.orderedAscending
-            }
-            return false
+        var didEvaluate = false
+        let predicate = Predicate(block: { evaluatedObject, bindings in
+            defer { didEvaluate = true }
+            return didEvaluate
         })
-        expectation(for: predicate, evaluatedWith: halfSecLaterDate)
+        expectation(for: predicate, evaluatedWith: NSObject())
         waitForExpectations(timeout: 0.1)
     }
     
     // CHECK: Test Case 'PredicateExpectationsTestCase.test_immediatelyTrueDelayedFalsePredicateAndObject_passes' started at \d+:\d+:\d+\.\d+
     // CHECK: Test Case 'PredicateExpectationsTestCase.test_immediatelyTrueDelayedFalsePredicateAndObject_passes' passed \(\d+\.\d+ seconds\).
     func test_immediatelyTrueDelayedFalsePredicateAndObject_passes() {
-        let halfSecLaterDate = NSDate(timeIntervalSinceNow: 0.01)
+        var didEvaluate = false
         let predicate = Predicate(block: { evaluatedObject, bindings in
-            if let evaluatedDate = evaluatedObject as? NSDate {
-                return evaluatedDate.compare(Date()) == ComparisonResult.orderedDescending
-            }
-            return false
+            defer { didEvaluate = true }
+            return !didEvaluate
         })
-        expectation(for: predicate, evaluatedWith: halfSecLaterDate)
+        expectation(for: predicate, evaluatedWith: NSObject())
+        XCTAssertTrue(didEvaluate)
+        
         waitForExpectations(timeout: 0.1)
     }