mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
From the Swift documentation: "If you define an optional variable without providing a default value, the variable is automatically set to nil for you."
148 lines
4.0 KiB
Swift
148 lines
4.0 KiB
Swift
// RUN: %target-run-simple-swift
|
|
// REQUIRES: executable_test
|
|
|
|
import StdlibUnittest
|
|
|
|
|
|
var ErrorTests = TestSuite("Error")
|
|
|
|
var NoisyErrorLifeCount = 0
|
|
var NoisyErrorDeathCount = 0
|
|
|
|
protocol OtherProtocol {
|
|
var otherProperty: String { get }
|
|
}
|
|
|
|
protocol OtherClassProtocol : class {
|
|
var otherClassProperty: String { get }
|
|
}
|
|
|
|
class NoisyError : Error, OtherProtocol, OtherClassProtocol {
|
|
init() { NoisyErrorLifeCount += 1 }
|
|
deinit { NoisyErrorDeathCount += 1 }
|
|
|
|
let _domain = "NoisyError"
|
|
let _code = 123
|
|
|
|
let otherProperty = "otherProperty"
|
|
let otherClassProperty = "otherClassProperty"
|
|
}
|
|
|
|
ErrorTests.test("erasure") {
|
|
NoisyErrorLifeCount = 0
|
|
NoisyErrorDeathCount = 0
|
|
do {
|
|
let e: Error = NoisyError()
|
|
|
|
expectEqual(e._domain, "NoisyError")
|
|
expectEqual(e._code, 123)
|
|
}
|
|
expectEqual(NoisyErrorDeathCount, NoisyErrorLifeCount)
|
|
}
|
|
|
|
ErrorTests.test("reflection") {
|
|
NoisyErrorLifeCount = 0
|
|
NoisyErrorDeathCount = 0
|
|
do {
|
|
let ne = NoisyError()
|
|
let e: Error = ne
|
|
|
|
var neDump = "", eDump = ""
|
|
dump(ne, to: &neDump)
|
|
dump(e, to: &eDump)
|
|
|
|
expectEqual(eDump, neDump)
|
|
}
|
|
expectEqual(NoisyErrorDeathCount, NoisyErrorLifeCount)
|
|
}
|
|
|
|
ErrorTests.test("dynamic casts") {
|
|
NoisyErrorLifeCount = 0
|
|
NoisyErrorDeathCount = 0
|
|
do {
|
|
let ne = NoisyError()
|
|
let e: Error = ne
|
|
|
|
expectTrue(e as! NoisyError === ne)
|
|
expectEqual((e as! OtherClassProtocol).otherClassProperty, "otherClassProperty")
|
|
expectEqual((e as! OtherProtocol).otherProperty, "otherProperty")
|
|
|
|
let op: OtherProtocol = ne
|
|
expectEqual((op as! Error)._domain, "NoisyError")
|
|
expectEqual((op as! Error)._code, 123)
|
|
|
|
let ocp: OtherClassProtocol = ne
|
|
expectEqual((ocp as! Error)._domain, "NoisyError")
|
|
expectEqual((ocp as! Error)._code, 123)
|
|
|
|
// Do the same with rvalues, so we exercise the
|
|
// take-on-success/destroy-on-failure paths.
|
|
|
|
expectEqual(((NoisyError() as Error) as! NoisyError)._domain, "NoisyError")
|
|
expectEqual(((NoisyError() as Error) as! OtherClassProtocol).otherClassProperty, "otherClassProperty")
|
|
expectEqual(((NoisyError() as Error) as! OtherProtocol).otherProperty, "otherProperty")
|
|
|
|
expectEqual(((NoisyError() as OtherProtocol) as! Error)._domain, "NoisyError")
|
|
expectEqual(((NoisyError() as OtherProtocol) as! Error)._code, 123)
|
|
|
|
expectEqual(((NoisyError() as OtherClassProtocol) as! Error)._domain, "NoisyError")
|
|
expectEqual(((NoisyError() as OtherClassProtocol) as! Error)._code, 123)
|
|
}
|
|
expectEqual(NoisyErrorDeathCount, NoisyErrorLifeCount)
|
|
}
|
|
|
|
struct DefaultStruct : Error { }
|
|
class DefaultClass : Error { }
|
|
|
|
ErrorTests.test("default domain and code") {
|
|
expectEqual(DefaultStruct()._domain, "main.DefaultStruct")
|
|
expectEqual(DefaultStruct()._code, 1)
|
|
expectEqual(DefaultClass()._domain, "main.DefaultClass")
|
|
expectEqual(DefaultClass()._code, 1)
|
|
}
|
|
|
|
enum SillyError: Error { case JazzHands }
|
|
|
|
ErrorTests.test("try!")
|
|
.skip(.custom({ _isFastAssertConfiguration() },
|
|
reason: "trap is not guaranteed to happen in -Ounchecked"))
|
|
.crashOutputMatches(_isDebugAssertConfiguration()
|
|
? "'try!' expression unexpectedly raised an error: "
|
|
+ "main.SillyError.JazzHands"
|
|
: "")
|
|
.code {
|
|
expectCrashLater()
|
|
let _: () = try! { throw SillyError.JazzHands }()
|
|
}
|
|
|
|
ErrorTests.test("try?") {
|
|
var value = try? { () throws -> Int in return 1 }()
|
|
expectType(Optional<Int>.self, &value)
|
|
expectEqual(Optional(1), value)
|
|
|
|
expectNil(try? { () throws -> Int in throw SillyError.JazzHands }())
|
|
}
|
|
|
|
enum LifetimeError : Error {
|
|
case MistakeOfALifetime(LifetimeTracked, yearsIncarcerated: Int)
|
|
}
|
|
|
|
ErrorTests.test("existential in lvalue") {
|
|
expectEqual(0, LifetimeTracked.instances)
|
|
do {
|
|
var e: Error?
|
|
do {
|
|
throw LifetimeError.MistakeOfALifetime(LifetimeTracked(0),
|
|
yearsIncarcerated: 25)
|
|
} catch {
|
|
e = error
|
|
}
|
|
expectEqual(1, LifetimeTracked.instances)
|
|
expectEqual(0, e?._code)
|
|
}
|
|
expectEqual(0, LifetimeTracked.instances)
|
|
}
|
|
|
|
runAllTests()
|
|
|