Skip to content

Commit 77b3f24

Browse files
committed
Test: Add executable tests for references to @objc optional methods
1 parent 3249130 commit 77b3f24

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed

test/Interpreter/objc_protocols.swift

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,85 @@ ObjCProtocolsTest.test("InitRequirement") {
2323
_ = t.init()
2424
}
2525

26+
@objc protocol OptionalRequirements {
27+
@objc optional func returnNumber(n: Int) -> Int
28+
@objc optional static func returnNumberStatic(n: Int) -> Int
29+
30+
@objc optional func returnSelf() -> Self
31+
}
32+
33+
ObjCProtocolsTest.test("OptionalMethodReferenceTypes") {
34+
class Base {}
35+
class Derived: Base, OptionalRequirements {}
36+
37+
let exist: OptionalRequirements = Derived()
38+
let existComposition: Base & OptionalRequirements = Derived()
39+
let existMeta: OptionalRequirements.Type = Derived.self
40+
41+
expectEqual(type(of: exist.returnNumber),
42+
((Int) -> Int)?.self)
43+
expectEqual(type(of: existMeta.returnNumberStatic),
44+
((Int) -> Int)?.self)
45+
expectEqual(type(of: OptionalRequirements.returnNumber),
46+
((OptionalRequirements) -> ((Int) -> Int)?).self)
47+
expectEqual(type(of: (Base & OptionalRequirements).returnNumber),
48+
((Base & OptionalRequirements) -> ((Int) -> Int)?).self)
49+
50+
expectEqual(type(of: exist.returnSelf),
51+
(() -> OptionalRequirements)?.self)
52+
expectEqual(type(of: existComposition.returnSelf),
53+
(() -> Base & OptionalRequirements)?.self)
54+
expectEqual(type(of: OptionalRequirements.returnSelf),
55+
((OptionalRequirements) -> (() -> OptionalRequirements)?).self)
56+
expectEqual(type(of: (Base & OptionalRequirements).returnSelf),
57+
((Base & OptionalRequirements) -> (() -> Base & OptionalRequirements)?).self)
58+
59+
}
60+
61+
ObjCProtocolsTest.test("OptionalMethodReferencesNoImplementation") {
62+
class Class: OptionalRequirements {}
63+
64+
let exist: OptionalRequirements = Class()
65+
let existMeta: OptionalRequirements.Type = Class.self
66+
67+
expectNil(exist.returnNumber)
68+
expectNil(existMeta.returnNumberStatic)
69+
expectNil(OptionalRequirements.returnNumber(exist))
70+
71+
expectNil(exist.returnSelf)
72+
expectNil(OptionalRequirements.returnSelf(exist))
73+
}
74+
75+
ObjCProtocolsTest.test("OptionalMethodReferencesWithImplementation") {
76+
class Class: OptionalRequirements {
77+
func returnSelf() -> Self {
78+
return self
79+
}
80+
81+
func returnNumber(n: Int) -> Int {
82+
return n
83+
}
84+
static func returnNumberStatic(n: Int) -> Int {
85+
return n
86+
}
87+
}
88+
89+
let exist: OptionalRequirements = Class()
90+
let existMeta: OptionalRequirements.Type = Class.self
91+
92+
let returnNumberRef = exist.returnNumber
93+
let returnNumberStaticRef = existMeta.returnNumberStatic
94+
let returnNumberUnboundRef = OptionalRequirements.returnNumber
95+
96+
expectEqual(returnNumberRef!(123), 123)
97+
expectEqual(returnNumberStaticRef!(456), 456)
98+
expectEqual(returnNumberUnboundRef(exist)!(789), 789)
99+
100+
let returnSelfRef = exist.returnSelf
101+
let returnSelfUnboundRef = OptionalRequirements.returnSelf
102+
103+
expectEqual(returnSelfRef!().returnNumber!(n: 321), 321)
104+
expectEqual(returnSelfUnboundRef(exist)!().returnNumber!(n: 456), 456)
105+
}
106+
26107
runAllTests()

0 commit comments

Comments
 (0)