Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Side by Side Diff: tests/lib/mirrors/relation_assignable_test.dart

Issue 126823004: Add TypeMirror.isSubtypeOf, TypeMirror.isAssignableTo, ClassMirror.isSubclassOf (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698