| // Copyright (c) 2012, 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. |
| |
| import "package:expect/expect.dart"; |
| |
| // Test that various type errors doesn't invoke user-defined code |
| // during error reporting. |
| |
| class MyClass {} |
| |
| class IntTypeError { |
| toString() { |
| int value = wrap(this); |
| return super.toString(); |
| } |
| } |
| |
| class StringTypeError { |
| toString() { |
| String value = wrap(this); |
| return super.toString(); |
| } |
| } |
| |
| class DoubleTypeError { |
| toString() { |
| double value = wrap(this); |
| return super.toString(); |
| } |
| } |
| |
| class NumTypeError { |
| toString() { |
| num value = wrap(this); |
| return super.toString(); |
| } |
| } |
| |
| class BoolTypeError { |
| toString() { |
| bool value = wrap(this); |
| return super.toString(); |
| } |
| } |
| |
| class FunctionTypeError { |
| toString() { |
| Function value = wrap(this); |
| return super.toString(); |
| } |
| } |
| |
| class MyClassTypeError { |
| toString() { |
| MyClass value = wrap(this); |
| return super.toString(); |
| } |
| } |
| |
| class ListTypeError { |
| toString() { |
| List value = wrap(this); |
| return super.toString(); |
| } |
| } |
| |
| class IntCastError { |
| toString() { |
| wrap(this) as int; |
| return super.toString(); |
| } |
| } |
| |
| class StringCastError { |
| toString() { |
| wrap(this) as String; |
| return super.toString(); |
| } |
| } |
| |
| class DoubleCastError { |
| toString() { |
| wrap(this) as double; |
| return super.toString(); |
| } |
| } |
| |
| class NumCastError { |
| toString() { |
| wrap(this) as num; |
| return super.toString(); |
| } |
| } |
| |
| class BoolCastError { |
| toString() { |
| wrap(this) as bool; |
| return super.toString(); |
| } |
| } |
| |
| class FunctionCastError { |
| toString() { |
| wrap(this) as Function; |
| return super.toString(); |
| } |
| } |
| |
| class MyClassCastError { |
| toString() { |
| wrap(this) as MyClass; |
| return super.toString(); |
| } |
| } |
| |
| class ListCastError { |
| toString() { |
| wrap(this) as List; |
| return super.toString(); |
| } |
| } |
| |
| /// Defeat optimizations of type checks. |
| wrap(e) { |
| if (new DateTime.now().year == 1980) return null; |
| return e; |
| } |
| |
| checkTypeError(o) { |
| try { |
| print(o); |
| } on TypeError catch (e) { |
| print(e); // This might provoke an error. |
| if (assertionsEnabled) return; // Expected type error. |
| throw; // Rethrow unexpected type error. |
| } |
| if (assertionsEnabled) { |
| throw 'expected TypeError'; |
| } |
| } |
| |
| checkAssert(o) { |
| try { |
| assert(o); |
| } on TypeError catch (e) { |
| print(e); // This might provoke an error. |
| if (!assertionsEnabled) throw; // Unexpected error. |
| } |
| } |
| |
| checkCastError(o) { |
| try { |
| print(o); |
| } on TypeError catch (e) { |
| print('unexpected type error: ${Error.safeToString(e)}'); |
| throw; // Unexpected type error. |
| } on CastError catch (e) { |
| print(e); // This might provoke an error. |
| return; // Expected a cast error. |
| } |
| throw 'expected CastError'; |
| } |
| |
| bool assertionsEnabled = false; |
| |
| main() { |
| assert(assertionsEnabled = true); |
| |
| checkTypeError(new IntTypeError()); |
| checkTypeError(new StringTypeError()); |
| checkTypeError(new DoubleTypeError()); |
| checkTypeError(new NumTypeError()); |
| checkTypeError(new BoolTypeError()); |
| checkTypeError(new FunctionTypeError()); |
| checkTypeError(new MyClassTypeError()); |
| checkTypeError(new ListTypeError()); |
| |
| checkAssert(new IntTypeError()); |
| checkAssert(new StringTypeError()); |
| checkAssert(new DoubleTypeError()); |
| checkAssert(new NumTypeError()); |
| checkAssert(new BoolTypeError()); |
| checkAssert(new FunctionTypeError()); |
| checkAssert(new MyClassTypeError()); |
| checkAssert(new ListTypeError()); |
| |
| checkCastError(new IntCastError()); |
| checkCastError(new StringCastError()); |
| checkCastError(new DoubleCastError()); |
| checkCastError(new NumCastError()); |
| checkCastError(new BoolCastError()); |
| checkCastError(new FunctionCastError()); |
| checkCastError(new MyClassCastError()); |
| checkCastError(new ListCastError()); |
| } |