blob: 3e848882cb835a2d30bba2bd20d11b9f31d0edaf [file] [log] [blame]
// RUN: %target-run-simple-swift
// REQUIRES: executable_test
import StdlibUnittest
var ProtocolInitTestSuite = TestSuite("ProtocolInit")
func mustFail<T>(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()