OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 import "dart:mirrors"; | |
6 | |
7 import "package:expect/expect.dart"; | |
8 | |
9 class Superclass {} | |
10 class Subclass1 extends Superclass {} | |
11 class Subclass2 extends Superclass {} | |
12 | |
13 typedef bool NumberPredicate(num x); | |
14 typedef bool IntegerPredicate(int x); | |
15 typedef bool DoublePredicate(double x); | |
16 | |
17 typedef num NumberGenerator(); | |
18 typedef int IntegerGenerator(); | |
19 typedef double DoubleGenerator(); | |
20 | |
21 class A<T> {} | |
22 class B<T> extends A<T> {} | |
23 class C<T extends num> {} | |
24 | |
25 main() { | |
26 // Classes. | |
27 TypeMirror Super = reflectType(Superclass); | |
28 TypeMirror Sub1 = reflectType(Subclass1); | |
29 TypeMirror Sub2 = reflectType(Subclass2); | |
30 TypeMirror Obj = reflectType(Object); | |
31 | |
32 Expect.isTrue(Obj.isAssignableTo(Obj)); | |
33 Expect.isTrue(Super.isAssignableTo(Super)); | |
34 Expect.isTrue(Sub1.isAssignableTo(Sub1)); | |
35 Expect.isTrue(Sub2.isAssignableTo(Sub2)); | |
36 | |
37 Expect.isTrue(Sub1.isAssignableTo(Super)); | |
38 Expect.isTrue(Super.isAssignableTo(Sub1)); | |
39 | |
40 Expect.isTrue(Sub2.isAssignableTo(Super)); | |
41 Expect.isTrue(Super.isAssignableTo(Sub2)); | |
42 | |
43 Expect.isFalse(Sub2.isAssignableTo(Sub1)); | |
44 Expect.isFalse(Sub1.isAssignableTo(Sub2)); | |
45 | |
46 Expect.isTrue(Sub1.isAssignableTo(Obj)); | |
47 Expect.isTrue(Obj.isAssignableTo(Sub1)); | |
48 | |
49 Expect.isTrue(Sub2.isAssignableTo(Obj)); | |
50 Expect.isTrue(Obj.isAssignableTo(Sub2)); | |
51 | |
52 Expect.isTrue(Super.isAssignableTo(Obj)); | |
53 Expect.isTrue(Obj.isAssignableTo(Super)); | |
54 | |
55 | |
56 // Function typedef - argument type. | |
57 TypeMirror Func = reflectType(Function); | |
58 TypeMirror NumPred = reflectType(NumberPredicate); | |
59 TypeMirror IntPred = reflectType(IntegerPredicate); | |
60 TypeMirror DubPred = reflectType(DoublePredicate); | |
61 | |
62 Expect.isTrue(Func.isAssignableTo(Func)); | |
63 Expect.isTrue(NumPred.isAssignableTo(NumPred)); | |
64 Expect.isTrue(IntPred.isAssignableTo(IntPred)); | |
65 Expect.isTrue(DubPred.isAssignableTo(DubPred)); | |
66 | |
67 Expect.isTrue(NumPred.isAssignableTo(Func)); | |
68 Expect.isTrue(NumPred.isAssignableTo(IntPred)); | |
69 Expect.isTrue(NumPred.isAssignableTo(DubPred)); | |
70 | |
71 Expect.isTrue(IntPred.isAssignableTo(Func)); | |
72 Expect.isTrue(IntPred.isAssignableTo(NumPred)); | |
73 Expect.isFalse(IntPred.isAssignableTo(DubPred)); | |
74 | |
75 Expect.isTrue(DubPred.isAssignableTo(Func)); | |
76 Expect.isTrue(DubPred.isAssignableTo(NumPred)); | |
77 Expect.isFalse(DubPred.isAssignableTo(IntPred)); | |
78 | |
79 Expect.isTrue(Func.isAssignableTo(Obj)); | |
80 Expect.isTrue(NumPred.isAssignableTo(Obj)); | |
81 Expect.isTrue(IntPred.isAssignableTo(Obj)); | |
82 Expect.isTrue(DubPred.isAssignableTo(Obj)); | |
gbracha
2014/01/11 01:53:30
I hesitate to suggest more cases, but the reverse
| |
83 | |
84 | |
85 // Function typedef - return type. | |
86 TypeMirror NumGen = reflectType(NumberGenerator); | |
87 TypeMirror IntGen = reflectType(IntegerGenerator); | |
88 TypeMirror DubGen = reflectType(DoubleGenerator); | |
89 | |
90 Expect.isTrue(NumGen.isAssignableTo(NumGen)); | |
91 Expect.isTrue(IntGen.isAssignableTo(IntGen)); | |
92 Expect.isTrue(DubGen.isAssignableTo(DubGen)); | |
93 | |
94 Expect.isTrue(NumGen.isAssignableTo(Func)); | |
95 Expect.isTrue(NumGen.isAssignableTo(IntGen)); | |
96 Expect.isTrue(NumGen.isAssignableTo(DubGen)); | |
97 | |
98 Expect.isTrue(IntGen.isAssignableTo(Func)); | |
99 Expect.isTrue(IntGen.isAssignableTo(NumGen)); | |
100 Expect.isFalse(IntGen.isAssignableTo(DubGen)); | |
101 | |
102 Expect.isTrue(DubGen.isAssignableTo(Func)); | |
103 Expect.isTrue(DubGen.isAssignableTo(NumGen)); | |
104 Expect.isFalse(DubGen.isAssignableTo(IntGen)); | |
105 | |
106 Expect.isTrue(Func.isAssignableTo(Obj)); | |
107 Expect.isTrue(NumGen.isAssignableTo(Obj)); | |
108 Expect.isTrue(IntGen.isAssignableTo(Obj)); | |
109 Expect.isTrue(DubGen.isAssignableTo(Obj)); | |
gbracha
2014/01/11 01:53:30
Again, the inverse holds as well.
| |
110 | |
111 | |
112 // Function - argument type. | |
113 TypeMirror NumPredRef = reflectType(NumberPredicate).referent; | |
114 TypeMirror IntPredRef = reflectType(IntegerPredicate).referent; | |
115 TypeMirror DubPredRef = reflectType(DoublePredicate).referent; | |
116 | |
117 Expect.isTrue(Func.isAssignableTo(Func)); | |
118 Expect.isTrue(NumPredRef.isAssignableTo(NumPredRef)); | |
119 Expect.isTrue(IntPredRef.isAssignableTo(IntPredRef)); | |
120 Expect.isTrue(DubPredRef.isAssignableTo(DubPredRef)); | |
121 | |
122 Expect.isTrue(NumPredRef.isAssignableTo(Func)); | |
123 Expect.isTrue(NumPredRef.isAssignableTo(IntPredRef)); | |
124 Expect.isTrue(NumPredRef.isAssignableTo(DubPredRef)); | |
125 | |
126 Expect.isTrue(IntPredRef.isAssignableTo(Func)); | |
127 Expect.isTrue(IntPredRef.isAssignableTo(NumPredRef)); | |
128 Expect.isFalse(IntPredRef.isAssignableTo(DubPredRef)); | |
129 | |
130 Expect.isTrue(DubPredRef.isAssignableTo(Func)); | |
131 Expect.isTrue(DubPredRef.isAssignableTo(NumPredRef)); | |
132 Expect.isFalse(DubPredRef.isAssignableTo(IntPredRef)); | |
133 | |
134 Expect.isTrue(Func.isAssignableTo(Obj)); | |
135 Expect.isTrue(NumPredRef.isAssignableTo(Obj)); | |
136 Expect.isTrue(IntPredRef.isAssignableTo(Obj)); | |
137 Expect.isTrue(DubPredRef.isAssignableTo(Obj)); | |
138 | |
139 | |
140 // Function - return type. | |
141 TypeMirror NumGenRef = reflectType(NumberGenerator).referent; | |
142 TypeMirror IntGenRef = reflectType(IntegerGenerator).referent; | |
143 TypeMirror DubGenRef = reflectType(DoubleGenerator).referent; | |
144 | |
145 Expect.isTrue(NumGenRef.isAssignableTo(NumGenRef)); | |
146 Expect.isTrue(IntGenRef.isAssignableTo(IntGenRef)); | |
147 Expect.isTrue(DubGenRef.isAssignableTo(DubGenRef)); | |
148 | |
149 Expect.isTrue(NumGenRef.isAssignableTo(Func)); | |
150 Expect.isTrue(NumGenRef.isAssignableTo(IntGenRef)); | |
151 Expect.isTrue(NumGenRef.isAssignableTo(DubGenRef)); | |
152 | |
153 Expect.isTrue(IntGenRef.isAssignableTo(Func)); | |
154 Expect.isTrue(IntGenRef.isAssignableTo(NumGenRef)); | |
155 Expect.isFalse(IntGenRef.isAssignableTo(DubGenRef)); | |
156 | |
157 Expect.isTrue(DubGenRef.isAssignableTo(Func)); | |
158 Expect.isTrue(DubGenRef.isAssignableTo(NumGenRef)); | |
159 Expect.isFalse(DubGenRef.isAssignableTo(IntGenRef)); | |
160 | |
161 Expect.isTrue(Func.isAssignableTo(Obj)); | |
162 Expect.isTrue(NumGenRef.isAssignableTo(Obj)); | |
163 Expect.isTrue(IntGenRef.isAssignableTo(Obj)); | |
164 Expect.isTrue(DubGenRef.isAssignableTo(Obj)); | |
165 | |
166 | |
167 // Function typedef / function. | |
168 Expect.isTrue(NumPred.isAssignableTo(NumPredRef)); | |
169 Expect.isTrue(IntPred.isAssignableTo(IntPredRef)); | |
170 Expect.isTrue(DubPred.isAssignableTo(DubPredRef)); | |
171 Expect.isTrue(NumPredRef.isAssignableTo(NumPred)); | |
172 Expect.isTrue(IntPredRef.isAssignableTo(IntPred)); | |
173 Expect.isTrue(DubPredRef.isAssignableTo(DubPred)); | |
174 | |
175 | |
176 // Function typedef / function. | |
177 Expect.isTrue(NumGen.isAssignableTo(NumGenRef)); | |
178 Expect.isTrue(IntGen.isAssignableTo(IntGenRef)); | |
179 Expect.isTrue(DubGen.isAssignableTo(DubGenRef)); | |
180 Expect.isTrue(NumGenRef.isAssignableTo(NumGen)); | |
181 Expect.isTrue(IntGenRef.isAssignableTo(IntGen)); | |
182 Expect.isTrue(DubGenRef.isAssignableTo(DubGen)); | |
183 | |
184 | |
185 // Type variable. | |
186 TypeMirror TFromA = reflectClass(A).typeVariables.single; | |
187 TypeMirror TFromB = reflectClass(B).typeVariables.single; | |
188 TypeMirror TFromC = reflectClass(C).typeVariables.single; | |
189 | |
190 Expect.isTrue(TFromA.isAssignableTo(TFromA)); | |
191 Expect.isTrue(TFromB.isAssignableTo(TFromB)); | |
192 Expect.isTrue(TFromC.isAssignableTo(TFromC)); | |
193 | |
194 Expect.isFalse(TFromA.isAssignableTo(TFromB)); | |
195 Expect.isFalse(TFromA.isAssignableTo(TFromC)); | |
196 Expect.isFalse(TFromB.isAssignableTo(TFromA)); | |
197 Expect.isFalse(TFromB.isAssignableTo(TFromC)); | |
198 Expect.isFalse(TFromC.isAssignableTo(TFromA)); | |
199 Expect.isFalse(TFromC.isAssignableTo(TFromB)); | |
200 | |
201 Expect.isTrue(TFromC.isAssignableTo(reflectType(num))); | |
202 Expect.isTrue(reflectType(num).isAssignableTo(TFromC)); | |
203 | |
204 | |
205 // dynamic & void. | |
206 TypeMirror Dynamic = currentMirrorSystem().dynamicType; | |
207 Expect.isTrue(Obj.isAssignableTo(Dynamic)); | |
208 Expect.isTrue(Super.isAssignableTo(Dynamic)); | |
209 Expect.isTrue(Sub1.isAssignableTo(Dynamic)); | |
210 Expect.isTrue(Sub2.isAssignableTo(Dynamic)); | |
211 Expect.isTrue(NumPred.isAssignableTo(Dynamic)); | |
212 Expect.isTrue(IntPred.isAssignableTo(Dynamic)); | |
213 Expect.isTrue(DubPred.isAssignableTo(Dynamic)); | |
214 Expect.isTrue(NumPredRef.isAssignableTo(Dynamic)); | |
215 Expect.isTrue(IntPredRef.isAssignableTo(Dynamic)); | |
216 Expect.isTrue(DubPredRef.isAssignableTo(Dynamic)); | |
217 Expect.isTrue(NumGen.isAssignableTo(Dynamic)); | |
218 Expect.isTrue(IntGen.isAssignableTo(Dynamic)); | |
219 Expect.isTrue(DubGen.isAssignableTo(Dynamic)); | |
220 Expect.isTrue(NumGenRef.isAssignableTo(Dynamic)); | |
221 Expect.isTrue(IntGenRef.isAssignableTo(Dynamic)); | |
222 Expect.isTrue(DubGenRef.isAssignableTo(Dynamic)); | |
223 Expect.isTrue(TFromA.isAssignableTo(Dynamic)); | |
224 Expect.isTrue(TFromB.isAssignableTo(Dynamic)); | |
225 Expect.isTrue(TFromC.isAssignableTo(Dynamic)); | |
226 Expect.isTrue(Dynamic.isAssignableTo(Obj)); | |
227 Expect.isTrue(Dynamic.isAssignableTo(Super)); | |
228 Expect.isTrue(Dynamic.isAssignableTo(Sub1)); | |
229 Expect.isTrue(Dynamic.isAssignableTo(Sub2)); | |
230 Expect.isTrue(Dynamic.isAssignableTo(NumPred)); | |
231 Expect.isTrue(Dynamic.isAssignableTo(IntPred)); | |
232 Expect.isTrue(Dynamic.isAssignableTo(DubPred)); | |
233 Expect.isTrue(Dynamic.isAssignableTo(NumPredRef)); | |
234 Expect.isTrue(Dynamic.isAssignableTo(IntPredRef)); | |
235 Expect.isTrue(Dynamic.isAssignableTo(DubPredRef)); | |
236 Expect.isTrue(Dynamic.isAssignableTo(NumGen)); | |
237 Expect.isTrue(Dynamic.isAssignableTo(IntGen)); | |
238 Expect.isTrue(Dynamic.isAssignableTo(DubGen)); | |
239 Expect.isTrue(Dynamic.isAssignableTo(NumGenRef)); | |
240 Expect.isTrue(Dynamic.isAssignableTo(IntGenRef)); | |
241 Expect.isTrue(Dynamic.isAssignableTo(DubGenRef)); | |
242 Expect.isTrue(Dynamic.isAssignableTo(TFromA)); | |
243 Expect.isTrue(Dynamic.isAssignableTo(TFromB)); | |
244 Expect.isTrue(Dynamic.isAssignableTo(TFromC)); | |
245 | |
246 TypeMirror Void = currentMirrorSystem().voidType; | |
gbracha
2014/01/11 01:53:30
Void vs. Void?
Also there are some special cases
| |
247 Expect.isFalse(Obj.isAssignableTo(Void)); | |
248 Expect.isFalse(Super.isAssignableTo(Void)); | |
249 Expect.isFalse(Sub1.isAssignableTo(Void)); | |
250 Expect.isFalse(Sub2.isAssignableTo(Void)); | |
251 Expect.isFalse(NumPred.isAssignableTo(Void)); | |
252 Expect.isFalse(IntPred.isAssignableTo(Void)); | |
253 Expect.isFalse(DubPred.isAssignableTo(Void)); | |
254 Expect.isFalse(NumPredRef.isAssignableTo(Void)); | |
255 Expect.isFalse(IntPredRef.isAssignableTo(Void)); | |
256 Expect.isFalse(DubPredRef.isAssignableTo(Void)); | |
257 Expect.isFalse(NumGen.isAssignableTo(Void)); | |
258 Expect.isFalse(IntGen.isAssignableTo(Void)); | |
259 Expect.isFalse(DubGen.isAssignableTo(Void)); | |
260 Expect.isFalse(NumGenRef.isAssignableTo(Void)); | |
261 Expect.isFalse(IntGenRef.isAssignableTo(Void)); | |
262 Expect.isFalse(DubGenRef.isAssignableTo(Void)); | |
263 Expect.isFalse(TFromA.isAssignableTo(Void)); | |
264 Expect.isFalse(TFromB.isAssignableTo(Void)); | |
265 Expect.isFalse(TFromC.isAssignableTo(Void)); | |
266 Expect.isFalse(Void.isAssignableTo(Obj)); | |
267 Expect.isFalse(Void.isAssignableTo(Super)); | |
268 Expect.isFalse(Void.isAssignableTo(Sub1)); | |
269 Expect.isFalse(Void.isAssignableTo(Sub2)); | |
270 Expect.isFalse(Void.isAssignableTo(NumPred)); | |
271 Expect.isFalse(Void.isAssignableTo(IntPred)); | |
272 Expect.isFalse(Void.isAssignableTo(DubPred)); | |
273 Expect.isFalse(Void.isAssignableTo(NumPredRef)); | |
274 Expect.isFalse(Void.isAssignableTo(IntPredRef)); | |
275 Expect.isFalse(Void.isAssignableTo(DubPredRef)); | |
276 Expect.isFalse(Void.isAssignableTo(NumGen)); | |
277 Expect.isFalse(Void.isAssignableTo(IntGen)); | |
278 Expect.isFalse(Void.isAssignableTo(DubGen)); | |
279 Expect.isFalse(Void.isAssignableTo(NumGenRef)); | |
280 Expect.isFalse(Void.isAssignableTo(IntGenRef)); | |
281 Expect.isFalse(Void.isAssignableTo(DubGenRef)); | |
282 Expect.isFalse(Void.isAssignableTo(TFromA)); | |
283 Expect.isFalse(Void.isAssignableTo(TFromB)); | |
284 Expect.isFalse(Void.isAssignableTo(TFromC)); | |
285 | |
286 Expect.isTrue(Dynamic.isAssignableTo(Void)); | |
287 Expect.isTrue(Void.isAssignableTo(Dynamic)); | |
288 } | |
OLD | NEW |