// RUN: %target-run-simple-swift // REQUIRES: executable_test import StdlibUnittest var ProtocolInitTestSuite = TestSuite("ProtocolInit") func mustFail(f: () -> T?) { if f() != nil { preconditionFailure("Didn't fail") } } protocol TriviallyConstructible { init(inner: LifetimeTracked) } enum E : Error { case X } extension TriviallyConstructible { init(middle x: LifetimeTracked) { self.init(inner: x) } init?(failingMiddle x: LifetimeTracked, shouldFail: Bool) { if (shouldFail) { return nil } self.init(inner: x) } init(throwingMiddle x: LifetimeTracked, shouldThrow: Bool) throws { if (shouldThrow) { throw E.X } self.init(inner: x) } } class TrivialClass : TriviallyConstructible { convenience init(outer x: LifetimeTracked) { self.init(middle: x) } convenience init?(failingOuter x: LifetimeTracked, shouldFail: Bool) { self.init(failingMiddle: x, shouldFail: shouldFail) } convenience init(throwingOuter x: LifetimeTracked, shouldThrow: Bool) throws { try self.init(throwingMiddle: x, shouldThrow: shouldThrow) } required init(inner tracker: LifetimeTracked) { self.tracker = tracker } let tracker: LifetimeTracked } ProtocolInitTestSuite.test("ProtocolInit_Trivial") { _ = TrivialClass(outer: LifetimeTracked(0)) } ProtocolInitTestSuite.test("ProtocolInit_Failable") { do { let result = TrivialClass(failingOuter: LifetimeTracked(1), shouldFail: false) assert(result != nil) } do { let result = TrivialClass(failingOuter: LifetimeTracked(2), shouldFail: true) assert(result == nil) } } ProtocolInitTestSuite.test("ProtocolInit_Throwing") { do { let result = try TrivialClass(throwingOuter: LifetimeTracked(4), shouldThrow: false) } catch { preconditionFailure("Expected no error") } do { let result = try TrivialClass(throwingOuter: LifetimeTracked(5), shouldThrow: true) preconditionFailure("Expected error") } catch {} } runAllTests()