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

Unified Diff: dart/tests/language/type_error_test.dart

Issue 10947029: Avoid calling user-defined code when reporting checked mode errors and cast errors. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address review comments Created 8 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « dart/tests/language/language.status ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dart/tests/language/type_error_test.dart
diff --git a/dart/tests/language/type_error_test.dart b/dart/tests/language/type_error_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..54a566d67aec0cfc2ff299d9c92c3e21d2ee6b03
--- /dev/null
+++ b/dart/tests/language/type_error_test.dart
@@ -0,0 +1,194 @@
+// 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.
+
+// 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 Date.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: ${NoSuchMethodError.safeToString(e)}');
+ throw; // Unexpected type error.
+ } on CastException catch (e) {
+ print(e); // This might provoke an error.
+ return; // Expected a cast error.
+ }
+ throw 'expected CastException';
+}
+
+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());
+}
« no previous file with comments | « dart/tests/language/language.status ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698