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)); |
| 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)); |
| 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 |