| 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");
|
| +}
|
|
|