Index: tests/language/covariant_test.dart |
diff --git a/tests/language/covariant_test.dart b/tests/language/covariant_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b93c9017e78266c5bd6236b41dca5ca89d701670 |
--- /dev/null |
+++ b/tests/language/covariant_test.dart |
@@ -0,0 +1,378 @@ |
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+// Test that `covariant` can be parsed (and ignored) by |
+// dart2js and the VM. |
+// This test only checks for non-strong mode behavior. |
+// |
+// Generally, `covariant` should be ignored, when it is used in the right |
+// places. |
+ |
+import 'package:expect/expect.dart'; |
+ |
+// Top level field may not have a covariant. |
+// Would be considered a minor (acceptable) bug, if it was accepted here too. |
+covariant /// 00: compile-time error |
+int x0; |
+ |
+// Getters may never have `covariant`. (Neither on the top-level nor as members) |
+covariant /// 01: compile-time error |
+int get x1 => 499; |
+ |
+// Top level setters may not have a covariant. |
+// Would be considered a minor (acceptable) bug, if it was accepted here too. |
+void set x2( |
+ covariant /// 02: compile-time error |
+ int val) {} |
+ |
+// Same as above, but with `covariant` in different positions. |
+// The `covariant` is just wrong there. |
+ |
+int |
+covariant /// 03: compile-time error |
+x3; |
+ |
+int |
+covariant /// 04: compile-time error |
+get x4 => 499; |
+ |
+void set x5( |
+ int |
+ covariant /// 05: compile-time error |
+ val) {} |
+ |
+ |
+// Same without types. |
+ |
+// Since `covariant` is a built-in identifier, it is not allowed here. |
+covariant x6; /// 06: compile-time error |
+ |
+// Getters may never have `covariant`. |
+covariant /// 07: compile-time error |
+get x7 => 499; |
+ |
+// Top level setters may not have a covariant. |
+// Would be considered a minor (acceptable) bug, if it was accepted here too. |
+void set x8( |
+ covariant /// 08: compile-time error |
+ val) {} |
+ |
+// If there is no type, then `covariant` is simply the parameter name: |
+void set x9(covariant) {} |
+ |
+// Covariant won't work on return types. |
+covariant /// 10: compile-time error |
+int f10() => 499; |
+ |
+// Covariant won't work as a return type. |
+covariant /// 11: compile-time error |
+f11() => 499; |
+ |
+// Covariant should not work on top-level methods. |
+// It's a minor (acceptable) bug to not error out here. |
+int f12( |
+ covariant /// 12: compile-time error |
+ int x) => 499; |
+ |
+// `Covariant` must be in front of the types. |
+int f13( |
+ int |
+ covariant /// 13: compile-time error |
+ x) => 499; |
+ |
+// Covariant should not work on top-level methods. |
+// It's a minor (acceptable) bug to not error out here. |
+int f14( |
+ covariant /// 14: compile-time error |
+ final |
+ x) => 499; |
+ |
+// `Covariant` must be in front of modifiers. |
+int f15( |
+ final |
+ covariant /// 15: compile-time error |
+ x) => 499; |
+ |
+// Covariant should not work on top-level methods. |
+// It's a minor (acceptable) bug to not error out here. |
+int f16( |
+ covariant /// 16: compile-time error |
+ final |
+ int |
+ x) => 499; |
+ |
+// `Covariant` must be in front of modifiers. |
+int f17( |
+ final |
+ covariant /// 17: compile-time error |
+ int |
+ x) => 499; |
+ |
+// On its own, `covariant` is just a parameter name. |
+int f18(covariant) => covariant; |
+ |
+// All of the above as statics in a class. |
+class A { |
+ // Static fields may not have a covariant. |
+ // Would be considered a minor (acceptable) bug, if it was accepted here too. |
+ static |
+ covariant /// 20: compile-time error |
+ int x20; |
+ |
+ // Getters may never have `covariant`. |
+ static |
+ covariant /// 21: compile-time error |
+ int get x21 => 499; |
+ |
+ // Getters may never have `covariant`. |
+ covariant /// 21b: compile-time error |
+ static |
+ int get x21b => 499; |
+ |
+ // Static setters may not have a covariant. |
+ // Would be considered a minor (acceptable) bug, if it was accepted here too. |
+ static void set x22( |
+ covariant /// 22: compile-time error |
+ int val) {} |
+ |
+ // Same as above, but with `covariant` in different positions. |
+ // The `covariant` is just wrong there. |
+ |
+ static int |
+ covariant /// 23: compile-time error |
+ x23; |
+ |
+ static int |
+ covariant /// 24: compile-time error |
+ get x24 => 499; |
+ |
+ static void set x25( |
+ int |
+ covariant /// 25: compile-time error |
+ val) {} |
+ |
+ // Since `covariant` is a built-in identifier, it is not allowed here. |
+ static covariant x26; /// 26: compile-time error |
+ |
+ // Getters may never have `covariant`. |
+ static |
+ covariant /// 27: compile-time error |
+ get x27 => 499; |
+ |
+ covariant /// 27b: compile-time error |
+ static |
+ get x27b => 499; |
+ |
+ // Static setters may not have a covariant. |
+ // Would be considered a minor (acceptable) bug, if it was accepted here too. |
+ static void set x28( |
+ covariant /// 28: compile-time error |
+ val) {} |
+ |
+ // If there is no type, then `covariant` is simply the parameter name: |
+ static void set x29(covariant) {} |
+ |
+ // Covariant won't work on return types. |
+ static |
+ covariant /// 30: compile-time error |
+ int f30() => 499; |
+ |
+ covariant /// 30b: compile-time error |
+ static |
+ int f30b() => 499; |
+ |
+ // Covariant won't work as a return type. |
+ static |
+ covariant /// 31: compile-time error |
+ f31() => 499; |
+ |
+ covariant /// 31b: compile-time error |
+ static |
+ f31b() => 499; |
+ |
+ // Covariant should not work on static methods. |
+ // It's a minor (acceptable) bug to not error out here. |
+ static int f32( |
+ covariant /// 32: compile-time error |
+ int x) => 499; |
+ |
+ // `Covariant` must be in front of the types. |
+ static int f33( |
+ int |
+ covariant /// 33: compile-time error |
+ x) => 499; |
+ |
+ // Covariant should not work on top-level methods. |
+ // It's a minor (acceptable) bug to not error out here. |
+ static int f34( |
+ covariant /// 34: compile-time error |
+ final |
+ x) => 499; |
+ |
+ // `Covariant` must be in front of modifiers. |
+ static int f35( |
+ final |
+ covariant /// 35: compile-time error |
+ x) => 499; |
+ |
+ // Covariant should not work on top-level methods. |
+ // It's a minor (acceptable) bug to not error out here. |
+ static int f36( |
+ covariant /// 36: compile-time error |
+ final |
+ int |
+ x) => 499; |
+ |
+ // `Covariant` must be in front of modifiers. |
+ static int f37( |
+ final |
+ covariant /// 37: compile-time error |
+ int |
+ x) => 499; |
+ |
+ // `Covariant` on its own is just a parameter name. |
+ static int f38(covariant) => covariant; |
+} |
+ |
+// All of the above as instance members in a class. |
+class B { |
+ covariant int x40; |
+ |
+ // Getters may never have `covariant`. |
+ covariant /// 41: compile-time error |
+ int get x41 => 499; |
+ |
+ void set x42(covariant int val) {} |
+ |
+ // `covariant` in the wrong position. |
+ int |
+ covariant /// 43: compile-time error |
+ x43; |
+ |
+ // `covariant` in the wrong position. |
+ int |
+ covariant /// 44: compile-time error |
+ get x44 => 499; |
+ |
+ void set x45( |
+ int |
+ covariant /// 45: compile-time error |
+ val) {} |
+ |
+ // Since `covariant` is a built-in identifier, it is not allowed here. |
+ covariant x46; /// 46: compile-time error |
+ |
+ // Getters may never have `covariant`. |
+ covariant /// 47: compile-time error |
+ get x47 => 499; |
+ |
+ void set x48(covariant val) {} |
+ |
+ // If there is no type, then `covariant` is simply the parameter name: |
+ void set x49(covariant) {} |
+ |
+ // Covariant won't work on return types. |
+ covariant /// 50: compile-time error |
+ int f50() => 499; |
+ |
+ // Covariant won't work as a return type. |
+ covariant /// 51: compile-time error |
+ f51() => 499; |
+ |
+ int f52(covariant int x) => 499; |
+ |
+ // `Covariant` must be in front of the types. |
+ int f53( |
+ int |
+ covariant /// 53: compile-time error |
+ x) => 499; |
+ |
+ int f54(covariant final x) => 499; |
+ |
+ // `Covariant` must be in front of modifiers. |
+ int f55( |
+ final |
+ covariant /// 55: compile-time error |
+ x) => 499; |
+ |
+ int f56(covariant final int x) => 499; |
+ |
+ // `Covariant` must be in front of modifiers. |
+ int f57( |
+ final |
+ covariant /// 57: compile-time error |
+ int |
+ x) => 499; |
+ |
+ // `Covariant` on its own is just a parameter name. |
+ int f58(covariant) => covariant; |
+} |
+ |
+void use(x) {} |
+ |
+main() { |
+ x0 = 0; |
+ use(x1); |
+ x2 = 499; |
+ use(x3); |
+ use(x4); |
+ x5 = 42; |
+ x6 = 0; /// 06: continued |
+ use(x7); |
+ x8 = 11; |
+ x9 = 12; |
+ use(f10()); |
+ use(f11()); |
+ use(f12(2)); |
+ use(f13(3)); |
+ use(f14(3)); |
+ use(f15(3)); |
+ use(f16(3)); |
+ use(f17(3)); |
+ Expect.equals(123, f18(123)); |
+ |
+ A.x20 = 0; |
+ use(A.x21); |
+ use(A.x21b); |
+ A.x22 = 499; |
+ use(A.x23); |
+ use(A.x24); |
+ A.x25 = 42; |
+ A.x26 = 0; /// 26: continued |
+ use(A.x27); |
+ use(A.x27b); |
+ A.x28 = 11; |
+ A.x29 = 12; |
+ use(A.f30()); |
+ use(A.f31()); |
+ use(A.f31b()); |
+ use(A.f32(2)); |
+ use(A.f33(3)); |
+ use(A.f34(3)); |
+ use(A.f35(3)); |
+ use(A.f36(3)); |
+ use(A.f37(3)); |
+ Expect.equals(1234, A.f38(1234)); |
+ |
+ var b = new B(); |
+ b.x40 = 0; |
+ use(b.x41); |
+ b.x42 = 499; |
+ use(b.x43); |
+ use(b.x44); |
+ b.x45 = 42; |
+ b.x46 = 0; /// 46: continued |
+ use(b.x47); |
+ b.x48 = 11; |
+ b.x49 = 12; |
+ use(b.f50()); |
+ use(b.f51()); |
+ use(b.f52(2)); |
+ use(b.f53(2)); |
+ use(b.f54(3)); |
+ use(b.f55(3)); |
+ use(b.f56(3)); |
+ use(b.f57(3)); |
+ Expect.equals(12345, b.f58(12345)); |
+} |