1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
// REQUIRES: rdar107343134
// RUN: %target-run-simple-swift
// REQUIRES: executable_test
// REQUIRES: objc_interop
import StdlibUnittest
import Foundation
@objc protocol Horse {
init()
}
class Pony : Horse {
let x = LifetimeTracked(0)
required init() {}
}
var ObjCProtocolsTest = TestSuite("ObjCProtocols")
ObjCProtocolsTest.test("InitRequirement") {
let t: Horse.Type = Pony.self
_ = t.init()
}
@objc protocol OptionalRequirements {
@objc optional func returnNumber(n: Int) -> Int
@objc optional static func returnNumberStatic(n: Int) -> Int
@objc optional func returnSelf() -> Self
}
ObjCProtocolsTest.test("OptionalMethodReferenceTypes") {
class Base {}
class Derived: Base, OptionalRequirements {}
let exist: OptionalRequirements = Derived()
let existComposition: Base & OptionalRequirements = Derived()
let existMeta: OptionalRequirements.Type = Derived.self
expectEqual(type(of: exist.returnNumber),
((Int) -> Int)?.self)
expectEqual(type(of: existMeta.returnNumberStatic),
((Int) -> Int)?.self)
expectEqual(type(of: OptionalRequirements.returnNumber),
((OptionalRequirements) -> ((Int) -> Int)?).self)
expectEqual(type(of: (Base & OptionalRequirements).returnNumber),
((Base & OptionalRequirements) -> ((Int) -> Int)?).self)
expectEqual(type(of: exist.returnSelf),
(() -> OptionalRequirements)?.self)
expectEqual(type(of: existComposition.returnSelf),
(() -> Base & OptionalRequirements)?.self)
expectEqual(type(of: OptionalRequirements.returnSelf),
((OptionalRequirements) -> (() -> OptionalRequirements)?).self)
expectEqual(type(of: (Base & OptionalRequirements).returnSelf),
((Base & OptionalRequirements) -> (() -> Base & OptionalRequirements)?).self)
}
ObjCProtocolsTest.test("OptionalMethodReferencesNoImplementation") {
class Class: OptionalRequirements {}
let exist: OptionalRequirements = Class()
let existMeta: OptionalRequirements.Type = Class.self
expectNil(exist.returnNumber)
expectNil(existMeta.returnNumberStatic)
expectNil(OptionalRequirements.returnNumber(exist))
expectNil(exist.returnSelf)
expectNil(OptionalRequirements.returnSelf(exist))
}
ObjCProtocolsTest.test("OptionalMethodReferencesWithImplementation") {
class Class: OptionalRequirements {
func returnSelf() -> Self {
return self
}
func returnNumber(n: Int) -> Int {
return n
}
static func returnNumberStatic(n: Int) -> Int {
return n
}
}
let exist: OptionalRequirements = Class()
let existMeta: OptionalRequirements.Type = Class.self
let returnNumberRef = exist.returnNumber
let returnNumberStaticRef = existMeta.returnNumberStatic
let returnNumberUnboundRef = OptionalRequirements.returnNumber
expectEqual(returnNumberRef!(123), 123)
expectEqual(returnNumberStaticRef!(456), 456)
expectEqual(returnNumberUnboundRef(exist)!(789), 789)
let returnSelfRef = exist.returnSelf
let returnSelfUnboundRef = OptionalRequirements.returnSelf
expectEqual(returnSelfRef!().returnNumber!(n: 321), 321)
expectEqual(returnSelfUnboundRef(exist)!().returnNumber!(n: 456), 456)
}
runAllTests()
|