Index: tests/compiler/dart2js_extra/useful_error_message_1_test.dart |
diff --git a/tests/compiler/dart2js_extra/useful_error_message_1_test.dart b/tests/compiler/dart2js_extra/useful_error_message_1_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..59a3bc913a8f1203efa69c8cd5f140de90170325 |
--- /dev/null |
+++ b/tests/compiler/dart2js_extra/useful_error_message_1_test.dart |
@@ -0,0 +1,83 @@ |
+// Copyright (c) 2015, 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 closures have a useful string that identifies the function by name |
+// in error messages. |
+ |
+import "package:expect/expect.dart"; |
+ |
+@NoInline |
+@AssumeDynamic |
+confuse(x) => x; |
+ |
+class CCCC { |
+ instanceMethod([a, b]) => '[$a, $b]'; |
+ static staticMethod() => 'hi'; |
+ // Default `toString` method returns "Instance of 'CCCC'" or similar with a |
+ // shorter name if minified. |
+} |
+ |
+main() { |
+ var c = confuse(new CCCC()); |
+ |
+ var instanceString = confuse(c).toString(); |
+ bool isMinified = instanceString.contains(new RegExp("Instance of '..?.?'")); |
+ if (!isMinified) { |
+ Expect.equals("Instance of 'CCCC'", instanceString); |
+ } |
+ |
+ checkContains(String message, String tag) { |
+ if (!message.contains(tag)) { |
+ if (!isMinified) { |
+ Expect.fail('"$message" should contain "$tag"'); |
+ } |
+ // When minified we will accept quoted names up to 3 characters. |
+ Expect.isTrue( |
+ message.contains(new RegExp("'..?.?'")), |
+ '"$message" should contain minified name'); |
+ } |
+ } |
+ |
+ // We use ArgumentError.value since it prints the value using |
+ // Error.safeToString. |
+ var e1 = new ArgumentError.value(c); |
+ var s1 = '$e1'; |
+ Expect.isTrue(s1.contains(instanceString), |
+ 'Error message "$s1" should contain "$instanceString"'); |
+ |
+ // Instance method tear-off. |
+ var e2 = new ArgumentError.value(confuse(c).instanceMethod); |
+ var s2 = '$e2'; |
+ // Instance method tear-off should contain instance string. |
+ Expect.isTrue(s2.contains(instanceString), |
+ 'Error message "$s2" should contain "$instanceString"'); |
+ // Instance method tear-off should also name the method. |
+ checkContains(s2.replaceAll(instanceString, '*'), "instanceMethod"); |
+ |
+ // Top level tear-off. |
+ var e3 = new ArgumentError.value(confuse); |
+ var s3 = '$e3'; |
+ checkContains(s3, "confuse"); |
+ checkContains('$confuse', "confuse"); |
+ |
+ // Static method tear-off. |
+ var e4 = new ArgumentError.value(CCCC.staticMethod); |
+ var s4 = '$e4'; |
+ checkContains(s4, "staticMethod"); |
+ checkContains('${CCCC.staticMethod}', "staticMethod"); |
+ |
+ // Local anonymous closure. |
+ var anon = () => c; |
+ var e5 = new ArgumentError.value(anon); |
+ var s5 = '$e5'; |
+ checkContains(s5, "main_closure"); |
+ checkContains('$anon', "main_closure"); |
+ |
+ // Local named closure. |
+ localFunction() => c; |
+ var e6 = new ArgumentError.value(localFunction); |
+ var s6 = '$e6'; |
+ checkContains(s6, "localFunction"); |
+ checkContains('$localFunction', "localFunction"); |
+} |