| // Copyright (c) 2011, 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. |
| // VMOptions=--enable_type_checks --enable_asserts --no_show_internal_names |
| // Dart test program testing type checks. |
| |
| // @dart = 2.9 |
| |
| import "package:expect/expect.dart"; |
| |
| class C { |
| factory C() { |
| return 1; //# 01: compile-time error |
| } |
| } |
| |
| class TypeTest { |
| static test() { |
| int i = "hello"; //# 02: compile-time error |
| return 1; |
| } |
| |
| static testSideEffect() { |
| int result = 0; |
| int index() { |
| result++; |
| return 0; |
| } |
| |
| try { |
| List<int> a = new List<int>(1); |
| a[0] = 0; |
| a[index()]++; // Type check succeeds, but does not create side effects. |
| Expect.equals(1, a[0]); |
| } on TypeError catch (error) { |
| result = 100; |
| } |
| return result; |
| } |
| |
| static testArgument() { |
| int f(int i) { |
| return i; |
| } |
| int i = f("hello"); //# 03: compile-time error |
| return 1; |
| } |
| |
| static testReturn() { |
| int f(String s) { //# 04: continued |
| return s; //# 04: compile-time error |
| } //# 04: continued |
| |
| int i = f("hello"); //# 04: continued |
| return 1; |
| } |
| |
| static int field; |
| static testField() { |
| field = "hello"; //# 05: compile-time error |
| return 1; |
| } |
| |
| static testAnyFunction() { |
| Function anyFunction; |
| f() {} |
| anyFunction = f; // No error. |
| int i = f; //# 06: compile-time error |
| return 1; |
| } |
| |
| static testVoidFunction() { |
| Function anyFunction; |
| void acceptVoidFunObj(void voidFunObj(Object obj)) {} |
| void acceptObjFunObj(Object objFunObj(Object obj)) {} |
| void voidFunObj(Object obj) {} |
| Object objFunObj(Object obj) { |
| return obj; |
| } |
| |
| ; |
| anyFunction = voidFunObj; // No error. |
| anyFunction = objFunObj; // No error. |
| acceptVoidFunObj(voidFunObj); |
| acceptVoidFunObj(objFunObj); |
| acceptObjFunObj(objFunObj); |
| acceptObjFunObj(voidFunObj); |
| return 1; |
| } |
| |
| static testFunctionNum() { |
| Function anyFunction; |
| void acceptFunNum(void funNum(num n)) {} |
| void funObj(Object obj) {} |
| void funNum(num n) {} |
| void funInt(int i) {} |
| void funString(String s) {} |
| anyFunction = funObj; // No error. |
| anyFunction = funNum; // No error. |
| anyFunction = funInt; // No error. |
| anyFunction = funString; // No error. |
| acceptFunNum(funObj); // No error. |
| acceptFunNum(funNum); // No error. |
| acceptFunNum(funInt); //# 27: compile-time error |
| acceptFunNum(funString); //# 08: compile-time error |
| return 1; |
| } |
| |
| static testBoolCheck() { |
| bool i = !"hello"; //# 09: compile-time error |
| while ("hello") {} //# 10: compile-time error |
| do {} while ("hello"); //# 11: compile-time error |
| for (; "hello";) {} //# 12: compile-time error |
| int i = "hello" ? 1 : 0; //# 13: compile-time error |
| if ("hello") {} //# 14: compile-time error |
| if ("hello" || false) {} //# 15: compile-time error |
| if (false || "hello") {} //# 16: compile-time error |
| if (null) {} //# 28: runtime error |
| return 9; |
| } |
| |
| static int testFactory() { |
| var x = new C(); //# 01: continued |
| return 1; |
| } |
| |
| static int testListAssigment() { |
| int result = 0; |
| { |
| var a = new List(5); |
| List a0 = a; |
| List<Object> ao = a; // No error. |
| List<int> ai = a; //# 30: runtime error |
| List<num> an = a; //# 31: runtime error |
| List<String> as = a; //# 32: runtime error |
| } |
| { |
| var a = new List<Object>(5); |
| List a0 = a; |
| List<Object> ao = a; |
| List<int> ai = a; //# 33: runtime error |
| List<num> an = a; //# 34: runtime error |
| List<String> as = a; //# 35: runtime error |
| } |
| { |
| var a = new List<int>(5); |
| List a0 = a; |
| List<Object> ao = a; |
| List<int> ai = a; |
| List<num> an = a; |
| List<String> as = a; //# 22: compile-time error |
| } |
| { |
| var a = new List<num>(5); |
| List a0 = a; |
| List<Object> ao = a; |
| List<int> ai = a; //# 36: runtime error |
| List<num> an = a; |
| List<String> as = a; //# 24: compile-time error |
| } |
| { |
| var a = new List<String>(5); |
| List a0 = a; |
| List<Object> ao = a; |
| List<int> ai = a; //# 25: compile-time error |
| List<num> an = a; //# 26: compile-time error |
| List<String> as = a; |
| } |
| return 8; |
| } |
| |
| static testMain() { |
| Expect.equals(1, test()); |
| Expect.equals(1, testSideEffect()); |
| Expect.equals(1, testArgument()); |
| Expect.equals(1, testReturn()); |
| Expect.equals(1, testField()); |
| Expect.equals(1, testAnyFunction()); |
| Expect.equals(1, testVoidFunction()); |
| Expect.equals(1, testFunctionNum()); |
| Expect.equals(9, testBoolCheck()); |
| Expect.equals(1, testFactory()); |
| Expect.equals(8, testListAssigment()); |
| } |
| } |
| |
| main() { |
| TypeTest.testMain(); |
| } |