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

Side by Side Diff: test/checker/checker_test.dart

Issue 1165303002: remove covariant generics option (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 5 years, 6 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
« no previous file with comments | « lib/src/testing.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /// General type checking tests 5 /// General type checking tests
6 library dev_compiler.test.checker_test; 6 library dev_compiler.test.checker_test;
7 7
8 import 'package:test/test.dart'; 8 import 'package:test/test.dart';
9 9
10 import 'package:dev_compiler/src/testing.dart'; 10 import 'package:dev_compiler/src/testing.dart';
(...skipping 1053 matching lines...) Expand 10 before | Expand all | Expand 10 after
1064 '/main.dart': ''' 1064 '/main.dart': '''
1065 1065
1066 class A { 1066 class A {
1067 void bar() => null; 1067 void bar() => null;
1068 void foo() => bar; // allowed 1068 void foo() => bar; // allowed
1069 } 1069 }
1070 ''' 1070 '''
1071 }); 1071 });
1072 }); 1072 });
1073 1073
1074 test('Generic subtyping: invariance', () {
1075 testChecker({
1076 '/main.dart': '''
1077
1078 class A {}
1079 class B extends A {}
1080 class C implements A {}
1081
1082 class L<T> {}
1083 class M<T> extends L<T> {}
1084 class N extends M<A> {}
1085
1086 void main() {
1087 L<A> lOfAs;
1088 L<B> lOfBs;
1089 L<C> lOfCs;
1090
1091 M<A> mOfAs;
1092 M<B> mOfBs;
1093 M<C> mOfCs;
1094
1095 N ns;
1096
1097 // L<T> <: L<S> iff S = dynamic or S=T
1098 lOfAs = lOfAs;
1099 lOfAs = /*severe:StaticTypeError*/lOfBs;
1100 lOfAs = /*severe:StaticTypeError*/lOfCs;
1101
1102 // M<S> <: L<S>
1103 lOfAs = mOfAs;
1104 lOfAs = /*severe:StaticTypeError*/mOfBs;
1105 lOfAs = /*severe:StaticTypeError*/mOfCs;
1106
1107 // N <: L<A>
1108 lOfAs = ns;
1109
1110 // L<T> <: L<S> iff S = dynamic or S=T
1111 lOfBs = /*severe:StaticTypeError*/lOfAs;
1112 lOfBs = lOfBs;
1113 lOfBs = /*severe:StaticTypeError*/lOfCs;
1114
1115 // M<S> <: L<S>
1116 lOfBs = /*severe:StaticTypeError*/mOfAs;
1117 lOfBs = mOfBs;
1118 lOfBs = /*severe:StaticTypeError*/mOfCs;
1119
1120 // N </: L<B>
1121 lOfBs = /*severe:StaticTypeError*/ns;
1122
1123 // L<T> <: L<S> iff S = dynamic or S=T
1124 lOfCs = /*severe:StaticTypeError*/lOfAs;
1125 lOfCs = /*severe:StaticTypeError*/lOfBs;
1126 lOfCs = lOfCs;
1127
1128 // M<S> <: L<S>
1129 lOfCs = /*severe:StaticTypeError*/mOfAs;
1130 lOfCs = /*severe:StaticTypeError*/mOfBs;
1131 lOfCs = mOfCs;
1132
1133 // N </: L<C>
1134 lOfCs = /*severe:StaticTypeError*/ns;
1135
1136 // M<T> <: L<S> iff S = dynamic or S=T
1137 mOfAs = /*warning:DownCastComposite*/lOfAs;
1138 mOfAs = /*severe:StaticTypeError*/lOfBs;
1139 mOfAs = /*severe:StaticTypeError*/lOfCs;
1140
1141 // M<S> <: M<S> iff S = dynamic or S=T
1142 mOfAs = mOfAs;
1143 mOfAs = /*severe:StaticTypeError*/mOfBs;
1144 mOfAs = /*severe:StaticTypeError*/mOfCs;
1145
1146 // N <: M<A>
1147 mOfAs = ns;
1148
1149 // M<T> <: L<S> iff S = dynamic or S=T
1150 mOfBs = /*severe:StaticTypeError*/lOfAs;
1151 mOfBs = /*warning:DownCastComposite*/lOfBs;
1152 mOfBs = /*severe:StaticTypeError*/lOfCs;
1153
1154 // M<S> <: M<S> iff S = dynamic or S=T
1155 mOfBs = /*severe:StaticTypeError*/mOfAs;
1156 mOfBs = mOfBs;
1157 mOfBs = /*severe:StaticTypeError*/mOfCs;
1158
1159 // N </: M<B>
1160 mOfBs = /*severe:StaticTypeError*/ns;
1161
1162 // M<T> <: L<S> iff S = dynamic or S=T
1163 mOfCs = /*severe:StaticTypeError*/lOfAs;
1164 mOfCs = /*severe:StaticTypeError*/lOfBs;
1165 mOfCs = /*warning:DownCastComposite*/lOfCs;
1166
1167 // M<S> <: M<S> iff S = dynamic or S=T
1168 mOfCs = /*severe:StaticTypeError*/mOfAs;
1169 mOfCs = /*severe:StaticTypeError*/mOfBs;
1170 mOfCs = mOfCs;
1171
1172 // N </: L<C>
1173 mOfCs = /*severe:StaticTypeError*/ns;
1174
1175 // Concrete subclass subtyping
1176 ns = /*warning:DownCastImplicit*/lOfAs;
1177 ns = /*severe:StaticTypeError*/lOfBs;
1178 ns = /*severe:StaticTypeError*/lOfCs;
1179 ns = /*warning:DownCastImplicit*/mOfAs;
1180 ns = /*severe:StaticTypeError*/mOfBs;
1181 ns = /*severe:StaticTypeError*/mOfCs;
1182 ns = ns;
1183 }
1184 '''
1185 }, covariantGenerics: false, relaxedCasts: false);
1186 });
1187
1188 test('Generic subtyping: covariant raw types', () {
1189 testChecker({
1190 '/main.dart': '''
1191
1192 class A {}
1193 class B extends A {}
1194 class C implements A {}
1195
1196 class L<T> {}
1197 class M<T> extends L<T> {}
1198 class N extends M<A> {}
1199
1200 void main() {
1201 L lRaw;
1202 L<dynamic> lOfDynamics;
1203 L<A> lOfAs;
1204 L<B> lOfBs;
1205 L<C> lOfCs;
1206
1207 M mRaw;
1208 M<dynamic> mOfDynamics;
1209 M<A> mOfAs;
1210 M<B> mOfBs;
1211 M<C> mOfCs;
1212
1213 N ns;
1214
1215 // Raw type subtyping
1216 lRaw = lRaw;
1217 lRaw = lOfDynamics;
1218 lRaw = lOfAs;
1219 lRaw = lOfBs;
1220 lRaw = lOfCs;
1221 lRaw = mRaw;
1222 lRaw = mOfDynamics;
1223 lRaw = mOfAs;
1224 lRaw = mOfBs;
1225 lRaw = mOfCs;
1226 lRaw = ns;
1227
1228 // L<dynamic> == L
1229 lOfDynamics = lRaw;
1230 lOfDynamics = lOfDynamics;
1231 lOfDynamics = lOfAs;
1232 lOfDynamics = lOfBs;
1233 lOfDynamics = lOfCs;
1234 lOfDynamics = mRaw;
1235 lOfDynamics = mOfDynamics;
1236 lOfDynamics = mOfAs;
1237 lOfDynamics = mOfBs;
1238 lOfDynamics = mOfCs;
1239 lOfDynamics = ns;
1240
1241 // L<T> <: L<S> iff S = dynamic or S=T
1242 lOfAs = /*warning:DownCastComposite*/lRaw;
1243 lOfAs = /*warning:DownCastComposite*/lOfDynamics;
1244
1245 // M<dynamic> </:/> L<A>
1246 lOfAs = /*severe:StaticTypeError*/mRaw;
1247 lOfAs = /*severe:StaticTypeError*/mOfDynamics;
1248
1249 // L<T> <: L<S> iff S = dynamic or S=T
1250 lOfBs = /*warning:DownCastComposite*/lRaw;
1251 lOfBs = /*warning:DownCastComposite*/lOfDynamics;
1252
1253 // M<dynamic> </:/> L<B>
1254 lOfBs = /*severe:StaticTypeError*/mRaw;
1255 lOfBs = /*severe:StaticTypeError*/mOfDynamics;
1256
1257 // L<T> <: L<S> iff S = dynamic or S=T
1258 lOfCs = /*warning:DownCastComposite*/lRaw;
1259 lOfCs = /*warning:DownCastComposite*/lOfDynamics;
1260
1261 // M<dynamic> </:/> L<C>
1262 lOfCs = /*severe:StaticTypeError*/mRaw;
1263 lOfCs = /*severe:StaticTypeError*/mOfDynamics;
1264
1265 // Raw type subtyping
1266 mRaw = /*warning:DownCastImplicit*/lRaw;
1267 mRaw = /*warning:DownCastImplicit*/lOfDynamics;
1268 mRaw = /*severe:StaticTypeError*/lOfAs;
1269 mRaw = /*severe:StaticTypeError*/lOfBs;
1270 mRaw = /*severe:StaticTypeError*/lOfCs;
1271 mRaw = mRaw;
1272 mRaw = mOfDynamics;
1273 mRaw = mOfAs;
1274 mRaw = mOfBs;
1275 mRaw = mOfCs;
1276 mRaw = ns;
1277
1278 // M<dynamic> == M
1279 mOfDynamics = /*warning:DownCastImplicit*/lRaw;
1280 mOfDynamics = /*warning:DownCastImplicit*/lOfDynamics;
1281 mOfDynamics = /*severe:StaticTypeError*/lOfAs;
1282 mOfDynamics = /*severe:StaticTypeError*/lOfBs;
1283 mOfDynamics = /*severe:StaticTypeError*/lOfCs;
1284 mOfDynamics = mRaw;
1285 mOfDynamics = mOfDynamics;
1286 mOfDynamics = mOfAs;
1287 mOfDynamics = mOfBs;
1288 mOfDynamics = mOfCs;
1289 mOfDynamics = ns;
1290
1291 // M<T> <: L<S> iff S = dynamic or S=T
1292 mOfAs = /*warning:DownCastComposite*/lRaw;
1293 mOfAs = /*warning:DownCastComposite*/lOfDynamics;
1294
1295 // M<dynamic> </:/> M<A>
1296 mOfAs = /*warning:DownCastComposite*/mRaw;
1297 mOfAs = /*warning:DownCastComposite*/mOfDynamics;
1298
1299 // M<T> <: L<S> iff S = dynamic or S=T
1300 mOfBs = /*warning:DownCastComposite*/lRaw;
1301 mOfBs = /*warning:DownCastComposite*/lOfDynamics;
1302
1303 // M<dynamic> </:/> M<B>
1304 mOfBs = /*warning:DownCastComposite*/mRaw;
1305 mOfBs = /*warning:DownCastComposite*/mOfDynamics;
1306
1307 // M<T> <: L<S> iff S = dynamic or S=T
1308 mOfCs = /*warning:DownCastComposite*/lRaw;
1309 mOfCs = /*warning:DownCastComposite*/lOfDynamics;
1310
1311 // M<dynamic> </:/> M<C>
1312 mOfCs = /*warning:DownCastComposite*/mRaw;
1313 mOfCs = /*warning:DownCastComposite*/mOfDynamics;
1314
1315 // Concrete subclass subtyping
1316 ns = /*warning:DownCastImplicit*/lRaw;
1317 ns = /*warning:DownCastImplicit*/lOfDynamics;
1318 ns = /*warning:DownCastImplicit*/mRaw;
1319 ns = /*warning:DownCastImplicit*/mOfDynamics;
1320 }
1321 '''
1322 }, covariantGenerics: false, relaxedCasts: false);
1323 });
1324
1325 test('Generic subtyping: covariant raw types with multiple parameters', () {
1326 testChecker({
1327 '/main.dart': '''
1328
1329 class A {}
1330
1331 class L<S, T> {}
1332 class M<S, T> extends L<S, T> {}
1333
1334 void main() {
1335 L lRaw;
1336 /*pass should be severe:StaticTypeError*/L<dynamic> lOfD_;
1337 /*pass should be severe:StaticTypeError*/L<A> lOfA_;
1338 L<dynamic, A> lOfDA;
1339 L<A, dynamic> lOfAD;
1340 L<dynamic, dynamic> lOfDD;
1341 L<A, A> lOfAA;
1342
1343 // This is the currently implemented lattice.
1344 // We may wish to change this to a flat lattice with
1345 // L<dynamic, dynamic> as the top element
1346 //
1347 // L<dynamic, dynamic>
1348 // / \
1349 // L<dynamic, A> L<A, dynamic>
1350 // \ /
1351 // L<A, A>
1352
1353 // L == L<dynamic, dynamic>
1354 lRaw = lRaw;
1355 lRaw = lOfD_;
1356 lRaw = lOfA_;
1357 lRaw = lOfDA;
1358 lRaw = lOfAD;
1359 lRaw = lOfDD;
1360 lRaw = lOfAA;
1361
1362 // L<dynamic> == L<dynamic, dynamic>
1363 lOfD_ = lRaw;
1364 lOfD_ = lOfD_;
1365 lOfD_ = lOfA_;
1366 lOfD_ = lOfDA;
1367 lOfD_ = lOfAD;
1368 lOfD_ = lOfDD;
1369 lOfD_ = lOfAA;
1370
1371 // L<dynamic, dynamic>
1372 lOfDD = lRaw;
1373 lOfDD = lOfD_;
1374 lOfDD = lOfA_;
1375 lOfDD = lOfDA;
1376 lOfDD = lOfAD;
1377 lOfDD = lOfDD;
1378 lOfDD = lOfAA;
1379
1380 // L<dynamic, A>
1381 lOfDA = /*warning:DownCastComposite*/lRaw;
1382 lOfDA = /*warning:DownCastComposite*/lOfD_;
1383 lOfDA = /*warning:DownCastComposite*/lOfA_;
1384 lOfDA = lOfDA;
1385 lOfDA = /*severe:StaticTypeError*/lOfAD;
1386 lOfDA = /*warning:DownCastComposite*/lOfDD;
1387 lOfDA = lOfAA;
1388
1389 // L<A, dynamic>
1390 lOfAD = /*warning:DownCastComposite*/lRaw;
1391 lOfAD = /*warning:DownCastComposite*/lOfD_;
1392 lOfAD = /*warning:DownCastComposite*/lOfA_;
1393 lOfAD = /*severe:StaticTypeError*/lOfDA;
1394 lOfAD = lOfAD;
1395 lOfAD = /*warning:DownCastComposite*/lOfDD;
1396 lOfAD = lOfAA;
1397
1398 // L<A> == L<dynamic, dynamic>
1399 lOfA_ = lRaw;
1400 lOfA_ = lOfD_;
1401 lOfA_ = lOfA_;
1402 lOfA_ = lOfDA;
1403 lOfA_ = lOfAD;
1404 lOfA_ = lOfDD;
1405 lOfA_ = lOfAA;
1406
1407 // L<A, A>
1408 lOfAA = /*warning:DownCastComposite*/lRaw;
1409 lOfAA = /*warning:DownCastComposite*/lOfD_;
1410 lOfAA = /*warning:DownCastComposite*/lOfA_;
1411 lOfAA = /*warning:DownCastComposite*/lOfDA;
1412 lOfAA = /*warning:DownCastComposite*/lOfAD;
1413 lOfAA = /*warning:DownCastComposite*/lOfDD;
1414 lOfAA = lOfAA;
1415 }
1416 '''
1417 }, covariantGenerics: false, relaxedCasts: false);
1418 });
1419
1420 test('Covariant generic subtyping: invariance', () { 1074 test('Covariant generic subtyping: invariance', () {
1421 testChecker({ 1075 testChecker({
1422 '/main.dart': ''' 1076 '/main.dart': '''
1423 1077
1424 class A {} 1078 class A {}
1425 class B extends A {} 1079 class B extends A {}
1426 class C implements A {} 1080 class C implements A {}
1427 1081
1428 class L<T> {} 1082 class L<T> {}
1429 class M<T> extends L<T> {} 1083 class M<T> extends L<T> {}
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1521 // Concrete subclass subtyping 1175 // Concrete subclass subtyping
1522 ns = /*warning:DownCastImplicit*/lOfAs; 1176 ns = /*warning:DownCastImplicit*/lOfAs;
1523 ns = /*severe:StaticTypeError*/lOfBs; 1177 ns = /*severe:StaticTypeError*/lOfBs;
1524 ns = /*severe:StaticTypeError*/lOfCs; 1178 ns = /*severe:StaticTypeError*/lOfCs;
1525 ns = /*warning:DownCastImplicit*/mOfAs; 1179 ns = /*warning:DownCastImplicit*/mOfAs;
1526 ns = /*severe:StaticTypeError*/mOfBs; 1180 ns = /*severe:StaticTypeError*/mOfBs;
1527 ns = /*severe:StaticTypeError*/mOfCs; 1181 ns = /*severe:StaticTypeError*/mOfCs;
1528 ns = ns; 1182 ns = ns;
1529 } 1183 }
1530 ''' 1184 '''
1531 }, covariantGenerics: true, relaxedCasts: false); 1185 }, relaxedCasts: false);
1532 }); 1186 });
1533 1187
1534 test('Relaxed casts', () { 1188 test('Relaxed casts', () {
1535 testChecker({ 1189 testChecker({
1536 '/main.dart': ''' 1190 '/main.dart': '''
1537 1191
1538 class A {} 1192 class A {}
1539 1193
1540 class L<T> {} 1194 class L<T> {}
1541 class M<T> extends L<T> {} 1195 class M<T> extends L<T> {}
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1601 mOfAs = /*warning:DownCastComposite*/mOfDs; 1255 mOfAs = /*warning:DownCastComposite*/mOfDs;
1602 mOfAs = /*warning:DownCastComposite*/mOfOs; 1256 mOfAs = /*warning:DownCastComposite*/mOfOs;
1603 mOfAs = mOfAs; 1257 mOfAs = mOfAs;
1604 mOfAs = /*warning:DownCastComposite*/lOfDs; 1258 mOfAs = /*warning:DownCastComposite*/lOfDs;
1605 mOfAs = /*warning:DownCastComposite*/lOfOs; 1259 mOfAs = /*warning:DownCastComposite*/lOfOs;
1606 mOfAs = /*warning:DownCastComposite*/lOfAs; 1260 mOfAs = /*warning:DownCastComposite*/lOfAs;
1607 } 1261 }
1608 1262
1609 } 1263 }
1610 ''' 1264 '''
1611 }, covariantGenerics: true, relaxedCasts: true); 1265 }, relaxedCasts: true);
1612 }); 1266 });
1613 1267
1614 test('Subtyping literals', () { 1268 test('Subtyping literals', () {
1615 testChecker({ 1269 testChecker({
1616 '/main.dart': ''' 1270 '/main.dart': '''
1617 test() { 1271 test() {
1618 Iterable i1 = [1, 2, 3]; 1272 Iterable i1 = [1, 2, 3];
1619 i1 = <int>[1, 2, 3]; 1273 i1 = <int>[1, 2, 3];
1620 1274
1621 List l1 = [1, 2, 3]; 1275 List l1 = [1, 2, 3];
(...skipping 1387 matching lines...) Expand 10 before | Expand all | Expand 10 after
3009 '/main.dart': ''' 2663 '/main.dart': '''
3010 import 'dart:foobar' show Baz; 2664 import 'dart:foobar' show Baz;
3011 main() { 2665 main() {
3012 print(Baz.quux); 2666 print(Baz.quux);
3013 }''' 2667 }'''
3014 }, 2668 },
3015 customUrlMappings: { 2669 customUrlMappings: {
3016 'dart:foobar': '$testDirectory/checker/dart_foobar.dart' 2670 'dart:foobar': '$testDirectory/checker/dart_foobar.dart'
3017 })); 2671 }));
3018 } 2672 }
OLDNEW
« no previous file with comments | « lib/src/testing.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698