@@ -23,4 +23,85 @@ ObjCProtocolsTest.test("InitRequirement") {
23
23
_ = t. init ( )
24
24
}
25
25
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
+
26
107
runAllTests ( )
0 commit comments