blob: 45797a217d6bc8c22b01fc9e89b1bd954196a91d [file] [log] [blame]
// RUN: %target-run-simple-swift
// REQUIRES: executable_test
import StdlibUnittest
var WithoutEscapingSuite = TestSuite("WithoutActuallyEscaping")
var sink: Any = ()
func dontEscape(f: () -> ()) {
withoutActuallyEscaping(f) {
$0()
}
}
func letEscape(f: () -> ()) -> () -> () {
return withoutActuallyEscaping(f) { return $0 }
}
var testShouldThrow = false
struct MyError : Error {}
func letEscapeThrowing(f: () -> ()) throws -> () -> () {
return try withoutActuallyEscaping(f) {
if testShouldThrow {
throw MyError()
}
return $0
}
}
WithoutEscapingSuite.test("ExpectNoCrash") {
dontEscape(f: { print("foo") })
}
WithoutEscapingSuite.test("ExpectDebugCrash") {
// Optimize versions pass a nil closure context.
if _isDebugAssertConfiguration() {
expectCrashLater()
}
sink = letEscape(f: { print("foo") })
}
struct Context {
var a = 0
var b = 1
}
WithoutEscapingSuite.test("ExpectCrash") {
expectCrashLater()
let context = Context()
sink = letEscape(f: { print("Context: \(context.a) \(context.b)") })
}
WithoutEscapingSuite.test("ExpectThrowingCrash") {
expectCrashLater()
let context = Context()
var testDidThrow = false
testShouldThrow = false
do {
sink = try letEscapeThrowing(f: { print("Context: \(context.a) \(context.b)") })
} catch {
testDidThrow = true
}
expectFalse(testDidThrow)
}
WithoutEscapingSuite.test("ExpectThrowingNoCrash") {
let context = Context()
var testDidThrow = false
testShouldThrow = true
do {
sink = try letEscapeThrowing(f: { print("Context: \(context.a) \(context.b)") })
} catch {
testDidThrow = true
}
expectTrue(testDidThrow)
}
runAllTests()