@@ -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+
26107runAllTests ( )
0 commit comments