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 library test.relation_assignable; | |
6 | |
7 import "dart:mirrors"; | |
8 | |
9 import "package:expect/expect.dart"; | |
10 | |
11 class Superclass {} | |
12 class Subclass1 extends Superclass {} | |
13 class Subclass2 extends Superclass {} | |
14 | |
15 typedef bool NumberPredicate(num x); | |
16 typedef bool IntegerPredicate(int x); | |
17 typedef bool DoublePredicate(double x); | |
18 | |
19 typedef num NumberGenerator(); | |
20 typedef int IntegerGenerator(); | |
21 typedef double DoubleGenerator(); | |
22 | |
23 class A<T> {} | |
24 class B<T> extends A<T> {} | |
25 class C<T extends num> {} | |
26 | |
27 test(MirrorSystem mirrors) { | |
28 LibraryMirror coreLibrary = mirrors.findLibrary(#dart.core); | |
29 LibraryMirror thisLibrary = mirrors.findLibrary(#test.relation_assignable); | |
30 | |
31 // Classes. | |
32 TypeMirror Super = thisLibrary.declarations[#Superclass]; | |
33 TypeMirror Sub1 = thisLibrary.declarations[#Subclass1]; | |
34 TypeMirror Sub2 = thisLibrary.declarations[#Subclass2]; | |
35 TypeMirror Obj = coreLibrary.declarations[#Object]; | |
36 | |
37 Expect.isTrue(Obj.isAssignableTo(Obj)); | |
38 Expect.isTrue(Super.isAssignableTo(Super)); | |
39 Expect.isTrue(Sub1.isAssignableTo(Sub1)); | |
40 Expect.isTrue(Sub2.isAssignableTo(Sub2)); | |
41 | |
42 Expect.isTrue(Sub1.isAssignableTo(Super)); | |
43 Expect.isTrue(Super.isAssignableTo(Sub1)); | |
44 | |
45 Expect.isTrue(Sub2.isAssignableTo(Super)); | |
46 Expect.isTrue(Super.isAssignableTo(Sub2)); | |
47 | |
48 Expect.isFalse(Sub2.isAssignableTo(Sub1)); | |
49 Expect.isFalse(Sub1.isAssignableTo(Sub2)); | |
50 | |
51 Expect.isTrue(Sub1.isAssignableTo(Obj)); | |
52 Expect.isTrue(Obj.isAssignableTo(Sub1)); | |
53 | |
54 Expect.isTrue(Sub2.isAssignableTo(Obj)); | |
55 Expect.isTrue(Obj.isAssignableTo(Sub2)); | |
56 | |
57 Expect.isTrue(Super.isAssignableTo(Obj)); | |
58 Expect.isTrue(Obj.isAssignableTo(Super)); | |
59 | |
60 | |
61 // Function typedef - argument type. | |
62 TypeMirror Func = coreLibrary.declarations[#Function]; | |
63 TypedefMirror NumPred = thisLibrary.declarations[#NumberPredicate]; | |
64 TypedefMirror IntPred = thisLibrary.declarations[#IntegerPredicate]; | |
65 TypedefMirror DubPred = thisLibrary.declarations[#DoublePredicate]; | |
66 | |
67 Expect.isTrue(Func.isAssignableTo(Func)); | |
68 Expect.isTrue(NumPred.isAssignableTo(NumPred)); | |
69 Expect.isTrue(IntPred.isAssignableTo(IntPred)); | |
70 Expect.isTrue(DubPred.isAssignableTo(DubPred)); | |
71 | |
72 Expect.isTrue(NumPred.isAssignableTo(Func)); | |
73 Expect.isTrue(NumPred.isAssignableTo(IntPred)); | |
74 Expect.isTrue(NumPred.isAssignableTo(DubPred)); | |
75 | |
76 Expect.isTrue(IntPred.isAssignableTo(Func)); | |
77 Expect.isTrue(IntPred.isAssignableTo(NumPred)); | |
78 Expect.isFalse(IntPred.isAssignableTo(DubPred)); | |
79 | |
80 Expect.isTrue(DubPred.isAssignableTo(Func)); | |
81 Expect.isTrue(DubPred.isAssignableTo(NumPred)); | |
82 Expect.isFalse(DubPred.isAssignableTo(IntPred)); | |
83 | |
84 Expect.isTrue(Func.isAssignableTo(Obj)); | |
85 Expect.isTrue(NumPred.isAssignableTo(Obj)); | |
86 Expect.isTrue(IntPred.isAssignableTo(Obj)); | |
87 Expect.isTrue(DubPred.isAssignableTo(Obj)); | |
88 Expect.isTrue(Obj.isAssignableTo(Func)); | |
89 Expect.isTrue(Obj.isAssignableTo(NumPred)); | |
90 Expect.isTrue(Obj.isAssignableTo(IntPred)); | |
91 Expect.isTrue(Obj.isAssignableTo(DubPred)); | |
92 | |
93 | |
94 // Function typedef - return type. | |
95 TypedefMirror NumGen = thisLibrary.declarations[#NumberGenerator]; | |
96 TypedefMirror IntGen = thisLibrary.declarations[#IntegerGenerator]; | |
97 TypedefMirror DubGen = thisLibrary.declarations[#DoubleGenerator]; | |
98 | |
99 Expect.isTrue(NumGen.isAssignableTo(NumGen)); | |
100 Expect.isTrue(IntGen.isAssignableTo(IntGen)); | |
101 Expect.isTrue(DubGen.isAssignableTo(DubGen)); | |
102 | |
103 Expect.isTrue(NumGen.isAssignableTo(Func)); | |
104 Expect.isTrue(NumGen.isAssignableTo(IntGen)); | |
105 Expect.isTrue(NumGen.isAssignableTo(DubGen)); | |
106 | |
107 Expect.isTrue(IntGen.isAssignableTo(Func)); | |
108 Expect.isTrue(IntGen.isAssignableTo(NumGen)); | |
109 Expect.isFalse(IntGen.isAssignableTo(DubGen)); | |
110 | |
111 Expect.isTrue(DubGen.isAssignableTo(Func)); | |
112 Expect.isTrue(DubGen.isAssignableTo(NumGen)); | |
113 Expect.isFalse(DubGen.isAssignableTo(IntGen)); | |
114 | |
115 Expect.isTrue(Func.isAssignableTo(Obj)); | |
116 Expect.isTrue(NumGen.isAssignableTo(Obj)); | |
117 Expect.isTrue(IntGen.isAssignableTo(Obj)); | |
118 Expect.isTrue(DubGen.isAssignableTo(Obj)); | |
119 Expect.isTrue(Obj.isAssignableTo(Func)); | |
120 Expect.isTrue(Obj.isAssignableTo(NumGen)); | |
121 Expect.isTrue(Obj.isAssignableTo(IntGen)); | |
122 Expect.isTrue(Obj.isAssignableTo(DubGen)); | |
123 | |
124 | |
125 // Function - argument type. | |
126 TypeMirror NumPredRef = NumPred.referent; | |
127 TypeMirror IntPredRef = IntPred.referent; | |
128 TypeMirror DubPredRef = DubPred.referent; | |
129 | |
130 Expect.isTrue(Func.isAssignableTo(Func)); | |
131 Expect.isTrue(NumPredRef.isAssignableTo(NumPredRef)); | |
132 Expect.isTrue(IntPredRef.isAssignableTo(IntPredRef)); | |
133 Expect.isTrue(DubPredRef.isAssignableTo(DubPredRef)); | |
134 | |
135 Expect.isTrue(NumPredRef.isAssignableTo(Func)); | |
136 Expect.isTrue(NumPredRef.isAssignableTo(IntPredRef)); | |
137 Expect.isTrue(NumPredRef.isAssignableTo(DubPredRef)); | |
138 | |
139 Expect.isTrue(IntPredRef.isAssignableTo(Func)); | |
140 Expect.isTrue(IntPredRef.isAssignableTo(NumPredRef)); | |
141 Expect.isFalse(IntPredRef.isAssignableTo(DubPredRef)); | |
142 | |
143 Expect.isTrue(DubPredRef.isAssignableTo(Func)); | |
144 Expect.isTrue(DubPredRef.isAssignableTo(NumPredRef)); | |
145 Expect.isFalse(DubPredRef.isAssignableTo(IntPredRef)); | |
146 | |
147 Expect.isTrue(Func.isAssignableTo(Obj)); | |
148 Expect.isTrue(NumPredRef.isAssignableTo(Obj)); | |
149 Expect.isTrue(IntPredRef.isAssignableTo(Obj)); | |
150 Expect.isTrue(DubPredRef.isAssignableTo(Obj)); | |
151 Expect.isTrue(Obj.isAssignableTo(Func)); | |
152 Expect.isTrue(Obj.isAssignableTo(NumPredRef)); | |
153 Expect.isTrue(Obj.isAssignableTo(IntPredRef)); | |
154 Expect.isTrue(Obj.isAssignableTo(DubPredRef)); | |
155 | |
156 | |
157 // Function - return type. | |
158 TypeMirror NumGenRef = NumGen.referent; | |
159 TypeMirror IntGenRef = IntGen.referent; | |
160 TypeMirror DubGenRef = DubGen.referent; | |
161 | |
162 Expect.isTrue(NumGenRef.isAssignableTo(NumGenRef)); | |
163 Expect.isTrue(IntGenRef.isAssignableTo(IntGenRef)); | |
164 Expect.isTrue(DubGenRef.isAssignableTo(DubGenRef)); | |
165 | |
166 Expect.isTrue(NumGenRef.isAssignableTo(Func)); | |
167 Expect.isTrue(NumGenRef.isAssignableTo(IntGenRef)); | |
168 Expect.isTrue(NumGenRef.isAssignableTo(DubGenRef)); | |
169 | |
170 Expect.isTrue(IntGenRef.isAssignableTo(Func)); | |
171 Expect.isTrue(IntGenRef.isAssignableTo(NumGenRef)); | |
172 Expect.isFalse(IntGenRef.isAssignableTo(DubGenRef)); | |
173 | |
174 Expect.isTrue(DubGenRef.isAssignableTo(Func)); | |
175 Expect.isTrue(DubGenRef.isAssignableTo(NumGenRef)); | |
176 Expect.isFalse(DubGenRef.isAssignableTo(IntGenRef)); | |
177 | |
178 Expect.isTrue(Func.isAssignableTo(Obj)); | |
179 Expect.isTrue(NumGenRef.isAssignableTo(Obj)); | |
180 Expect.isTrue(IntGenRef.isAssignableTo(Obj)); | |
181 Expect.isTrue(DubGenRef.isAssignableTo(Obj)); | |
182 Expect.isTrue(Obj.isAssignableTo(Func)); | |
183 Expect.isTrue(Obj.isAssignableTo(NumGenRef)); | |
184 Expect.isTrue(Obj.isAssignableTo(IntGenRef)); | |
185 Expect.isTrue(Obj.isAssignableTo(DubGenRef)); | |
186 | |
187 | |
188 // Function typedef / function. | |
189 Expect.isTrue(NumPred.isAssignableTo(NumPredRef)); | |
190 Expect.isTrue(IntPred.isAssignableTo(IntPredRef)); | |
191 Expect.isTrue(DubPred.isAssignableTo(DubPredRef)); | |
192 Expect.isTrue(NumPredRef.isAssignableTo(NumPred)); | |
193 Expect.isTrue(IntPredRef.isAssignableTo(IntPred)); | |
194 Expect.isTrue(DubPredRef.isAssignableTo(DubPred)); | |
195 | |
196 | |
197 // Function typedef / function. | |
198 Expect.isTrue(NumGen.isAssignableTo(NumGenRef)); | |
199 Expect.isTrue(IntGen.isAssignableTo(IntGenRef)); | |
200 Expect.isTrue(DubGen.isAssignableTo(DubGenRef)); | |
201 Expect.isTrue(NumGenRef.isAssignableTo(NumGen)); | |
202 Expect.isTrue(IntGenRef.isAssignableTo(IntGen)); | |
203 Expect.isTrue(DubGenRef.isAssignableTo(DubGen)); | |
204 | |
205 | |
206 // Type variable. | |
207 TypeMirror TFromA = | |
208 (thisLibrary.declarations[#A] as ClassMirror).typeVariables.single; | |
209 TypeMirror TFromB = | |
210 (thisLibrary.declarations[#B] as ClassMirror).typeVariables.single; | |
211 TypeMirror TFromC = | |
212 (thisLibrary.declarations[#C] as ClassMirror).typeVariables.single; | |
213 | |
214 Expect.isTrue(TFromA.isAssignableTo(TFromA)); | |
215 Expect.isTrue(TFromB.isAssignableTo(TFromB)); | |
216 Expect.isTrue(TFromC.isAssignableTo(TFromC)); | |
217 | |
218 Expect.isFalse(TFromA.isAssignableTo(TFromB)); | |
219 Expect.isFalse(TFromA.isAssignableTo(TFromC)); | |
220 Expect.isFalse(TFromB.isAssignableTo(TFromA)); | |
221 Expect.isFalse(TFromB.isAssignableTo(TFromC)); | |
222 Expect.isFalse(TFromC.isAssignableTo(TFromA)); | |
223 Expect.isFalse(TFromC.isAssignableTo(TFromB)); | |
224 | |
225 TypeMirror Num = coreLibrary.declarations[#num]; | |
226 Expect.isTrue(TFromC.isAssignableTo(Num)); | |
227 Expect.isTrue(Num.isAssignableTo(TFromC)); | |
228 | |
229 | |
230 // dynamic & void. | |
231 TypeMirror Dynamic = mirrors.dynamicType; | |
232 Expect.isTrue(Dynamic.isAssignableTo(Dynamic)); | |
233 Expect.isTrue(Obj.isAssignableTo(Dynamic)); | |
234 Expect.isTrue(Super.isAssignableTo(Dynamic)); | |
235 Expect.isTrue(Sub1.isAssignableTo(Dynamic)); | |
236 Expect.isTrue(Sub2.isAssignableTo(Dynamic)); | |
237 Expect.isTrue(NumPred.isAssignableTo(Dynamic)); | |
238 Expect.isTrue(IntPred.isAssignableTo(Dynamic)); | |
239 Expect.isTrue(DubPred.isAssignableTo(Dynamic)); | |
240 Expect.isTrue(NumPredRef.isAssignableTo(Dynamic)); | |
241 Expect.isTrue(IntPredRef.isAssignableTo(Dynamic)); | |
242 Expect.isTrue(DubPredRef.isAssignableTo(Dynamic)); | |
243 Expect.isTrue(NumGen.isAssignableTo(Dynamic)); | |
244 Expect.isTrue(IntGen.isAssignableTo(Dynamic)); | |
245 Expect.isTrue(DubGen.isAssignableTo(Dynamic)); | |
246 Expect.isTrue(NumGenRef.isAssignableTo(Dynamic)); | |
247 Expect.isTrue(IntGenRef.isAssignableTo(Dynamic)); | |
248 Expect.isTrue(DubGenRef.isAssignableTo(Dynamic)); | |
249 Expect.isTrue(TFromA.isAssignableTo(Dynamic)); | |
250 Expect.isTrue(TFromB.isAssignableTo(Dynamic)); | |
251 Expect.isTrue(TFromC.isAssignableTo(Dynamic)); | |
252 Expect.isTrue(Dynamic.isAssignableTo(Obj)); | |
253 Expect.isTrue(Dynamic.isAssignableTo(Super)); | |
254 Expect.isTrue(Dynamic.isAssignableTo(Sub1)); | |
255 Expect.isTrue(Dynamic.isAssignableTo(Sub2)); | |
256 Expect.isTrue(Dynamic.isAssignableTo(NumPred)); | |
257 Expect.isTrue(Dynamic.isAssignableTo(IntPred)); | |
258 Expect.isTrue(Dynamic.isAssignableTo(DubPred)); | |
259 Expect.isTrue(Dynamic.isAssignableTo(NumPredRef)); | |
260 Expect.isTrue(Dynamic.isAssignableTo(IntPredRef)); | |
261 Expect.isTrue(Dynamic.isAssignableTo(DubPredRef)); | |
262 Expect.isTrue(Dynamic.isAssignableTo(NumGen)); | |
263 Expect.isTrue(Dynamic.isAssignableTo(IntGen)); | |
264 Expect.isTrue(Dynamic.isAssignableTo(DubGen)); | |
265 Expect.isTrue(Dynamic.isAssignableTo(NumGenRef)); | |
266 Expect.isTrue(Dynamic.isAssignableTo(IntGenRef)); | |
267 Expect.isTrue(Dynamic.isAssignableTo(DubGenRef)); | |
268 Expect.isTrue(Dynamic.isAssignableTo(TFromA)); | |
269 Expect.isTrue(Dynamic.isAssignableTo(TFromB)); | |
270 Expect.isTrue(Dynamic.isAssignableTo(TFromC)); | |
271 | |
272 TypeMirror Void = mirrors.voidType; | |
273 Expect.isTrue(Void.isAssignableTo(Void)); | |
274 // Expect.isFalse(Obj.isAssignableTo(Void)); // dart2js disagrees | |
rmacnak
2014/02/06 23:15:23
Disagreement.
| |
275 Expect.isFalse(Super.isAssignableTo(Void)); | |
276 Expect.isFalse(Sub1.isAssignableTo(Void)); | |
277 Expect.isFalse(Sub2.isAssignableTo(Void)); | |
278 Expect.isFalse(NumPred.isAssignableTo(Void)); | |
279 Expect.isFalse(IntPred.isAssignableTo(Void)); | |
280 Expect.isFalse(DubPred.isAssignableTo(Void)); | |
281 Expect.isFalse(NumPredRef.isAssignableTo(Void)); | |
282 Expect.isFalse(IntPredRef.isAssignableTo(Void)); | |
283 Expect.isFalse(DubPredRef.isAssignableTo(Void)); | |
284 Expect.isFalse(NumGen.isAssignableTo(Void)); | |
285 Expect.isFalse(IntGen.isAssignableTo(Void)); | |
286 Expect.isFalse(DubGen.isAssignableTo(Void)); | |
287 Expect.isFalse(NumGenRef.isAssignableTo(Void)); | |
288 Expect.isFalse(IntGenRef.isAssignableTo(Void)); | |
289 Expect.isFalse(DubGenRef.isAssignableTo(Void)); | |
290 Expect.isFalse(TFromA.isAssignableTo(Void)); | |
291 Expect.isFalse(TFromB.isAssignableTo(Void)); | |
292 Expect.isFalse(TFromC.isAssignableTo(Void)); | |
293 // Expect.isFalse(Void.isAssignableTo(Obj)); // dart2js disagrees | |
rmacnak
2014/02/06 23:15:23
Disagreement.
| |
294 Expect.isFalse(Void.isAssignableTo(Super)); | |
295 Expect.isFalse(Void.isAssignableTo(Sub1)); | |
296 Expect.isFalse(Void.isAssignableTo(Sub2)); | |
297 Expect.isFalse(Void.isAssignableTo(NumPred)); | |
298 Expect.isFalse(Void.isAssignableTo(IntPred)); | |
299 Expect.isFalse(Void.isAssignableTo(DubPred)); | |
300 Expect.isFalse(Void.isAssignableTo(NumPredRef)); | |
301 Expect.isFalse(Void.isAssignableTo(IntPredRef)); | |
302 Expect.isFalse(Void.isAssignableTo(DubPredRef)); | |
303 Expect.isFalse(Void.isAssignableTo(NumGen)); | |
304 Expect.isFalse(Void.isAssignableTo(IntGen)); | |
305 Expect.isFalse(Void.isAssignableTo(DubGen)); | |
306 Expect.isFalse(Void.isAssignableTo(NumGenRef)); | |
307 Expect.isFalse(Void.isAssignableTo(IntGenRef)); | |
308 Expect.isFalse(Void.isAssignableTo(DubGenRef)); | |
309 Expect.isFalse(Void.isAssignableTo(TFromA)); | |
310 Expect.isFalse(Void.isAssignableTo(TFromB)); | |
311 Expect.isFalse(Void.isAssignableTo(TFromC)); | |
312 | |
313 Expect.isTrue(Dynamic.isAssignableTo(Void)); | |
314 Expect.isTrue(Void.isAssignableTo(Dynamic)); | |
315 } | |
316 | |
317 main() { | |
318 test(currentMirrorSystem()); | |
319 } | |
OLD | NEW |