Chromium Code Reviews| 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 |