// RUN: %target-run-simple-swift // REQUIRES: executable_test import StdlibUnittest var FailableInitTestSuite = TestSuite("FailableInit") var deinitCalled = 0 func mustFail(f: () -> T?) { if f() != nil { preconditionFailure("Didn't fail") } } func mustSucceed(f: () -> T?) { if f() == nil { preconditionFailure("Didn't succeed") } } class FirstClass { var x: LifetimeTracked init?(n: Int) { if n == 0 { return nil } x = LifetimeTracked(0) if n == 1 { return nil } } deinit { deinitCalled += 1 } } FailableInitTestSuite.test("FirstClass") { deinitCalled = 0 mustFail { FirstClass(n: 0) } expectEqual(0, deinitCalled) mustFail { FirstClass(n: 1) } expectEqual(1, deinitCalled) mustSucceed { FirstClass(n: 2) } expectEqual(2, deinitCalled) } class FirstClassTrivial { var x: Int init?(n: Int) { if n == 0 { return nil } x = 0 if n == 1 { return nil } } deinit { deinitCalled += 1 } } FailableInitTestSuite.test("FirstClassTrivial") { deinitCalled = 0 mustFail { FirstClassTrivial(n: 0) } expectEqual(0, deinitCalled) mustFail { FirstClassTrivial(n: 1) } expectEqual(1, deinitCalled) mustSucceed { FirstClassTrivial(n: 2) } expectEqual(2, deinitCalled) } class SecondClass { var x: LifetimeTracked var y: LifetimeTracked init?(n: Int) { if n == 0 { return nil } x = LifetimeTracked(0) if n == 1 { return nil } y = LifetimeTracked(0) if n == 2 { return nil } } deinit { deinitCalled += 1 } } FailableInitTestSuite.test("SecondClass") { deinitCalled = 0 mustFail { SecondClass(n: 0) } expectEqual(0, deinitCalled) mustFail { SecondClass(n: 1) } expectEqual(0, deinitCalled) mustFail { SecondClass(n: 2) } expectEqual(1, deinitCalled) mustSucceed { SecondClass(n: 3) } expectEqual(2, deinitCalled) } class SecondClassTrivial { var x: Int var y: Int init?(n: Int) { if n == 0 { return nil } x = 0 if n == 1 { return nil } y = 0 if n == 2 { return nil } } deinit { deinitCalled += 1 } } FailableInitTestSuite.test("SecondClassTrivial") { deinitCalled = 0 mustFail { SecondClassTrivial(n: 0) } expectEqual(0, deinitCalled) mustFail { SecondClassTrivial(n: 1) } expectEqual(0, deinitCalled) mustFail { SecondClassTrivial(n: 2) } expectEqual(1, deinitCalled) mustSucceed { SecondClassTrivial(n: 3) } expectEqual(2, deinitCalled) } runAllTests()