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