Merge pull request #1 from parkera/master

Add a new public function to invoke a list of tests.
diff --git a/README.md b/README.md
index e486e7d..b6e6e35 100644
--- a/README.md
+++ b/README.md
@@ -63,13 +63,12 @@
 }
 ```
 
-Also, this version of XCTest does not use the external test runner binary. Instead, create your own executable which links `libXCTest.so`. In your `main.swift`, list the test cases that you wish to run. For example:
+Also, this version of XCTest does not use the external test runner binary. Instead, create your own executable which links `libXCTest.so`. In your `main.swift`, invoke the `XCTMain` function with an array of instances of the test cases that you wish to run. For example:
 
 ```
-TestNSString().invokeTest()
-TestNSArray().invokeTest()
-TestNSDictionary().invokeTest()
-// ...
+XCTMain([TestNSString(), TestNSArray(), TestNSDictionary()])
 ```
 
+The `XCTMain` function does not return, and will cause your test app to exit with either `0` for success or `1` for failure.
+
 We are currently investigating ideas on how to make these additional steps for test discovery automatic when running on the Swift runtime.
diff --git a/XCTest/XCTest.swift b/XCTest/XCTest.swift
index 310a268..7255487 100644
--- a/XCTest/XCTest.swift
+++ b/XCTest/XCTest.swift
@@ -38,7 +38,6 @@
     }
     
     public func invokeTest() {
-        XCTRun.registerExitHandler()
         let tests = self.allTests
         var totalDuration = 0.0
         var totalFailures = 0
@@ -105,7 +104,21 @@
     }
 }
 
-internal func _XCTestPrintSummary() {
+internal struct XCTRun {
+    var duration: Double
+    var method: String
+    var passed: Bool
+    var failures: [XCTFailure]
+}
+
+/// Starts a test run for the specified test cases.
+///
+/// This function will not return. If the test cases pass, then it will call `exit(0)`. If there is a failure, then it will call `exit(1)`.
+/// - Parameter testCases: An array of test cases to run.
+@noreturn public func XCTMain(testCases: [XCTestCase]) {
+    for testCase in testCases {
+        testCase.invokeTest()
+    }
     let (totalDuration, totalFailures) = XCTAllRuns.reduce((0.0, 0)) { ($0.0 + $1.duration, $0.1 + $1.failures.count) }
     
     var testCountSuffix = "s"
@@ -118,23 +131,7 @@
     }
     let averageDuration = totalDuration / Double(XCTAllRuns.count)
     print("Total executed \(XCTAllRuns.count) test\(testCountSuffix), with \(totalFailures) failure\(failureSuffix) (0 unexpected) in \(round(averageDuration * 1000.0) / 1000.0) (\(round(totalDuration * 1000.0) / 1000.0)) seconds")
-    
-}
-
-struct XCTRun {
-    var duration: Double
-    var method: String
-    var passed: Bool
-    var failures: [XCTFailure]
-    
-    static var registeredHandler = false
-    static func registerExitHandler() {
-        if registeredHandler {
-            return
-        }
-        atexit(_XCTestPrintSummary)
-        registeredHandler = true
-    }
+    exit(totalFailures > 0 ? 1 : 0)
 }
 
 struct XCTFailure {