// 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.
// VMOptions=--optimization_counter_threshold=10 --no-background_compilation

import "package:expect/expect.dart";

main() {
  bar(a) {
    return a is String;
  }

  for (var i = 0; i < 20; i++) {
    Expect.isFalse(bar(1));
    Expect.isTrue(bar.call('foo'));
  }

  opt_arg([a = "a"]) => a is String;

  for (var i = 0; i < 20; i++) {
    Expect.isFalse(opt_arg(1));
    Expect.isFalse(opt_arg.call(1));
    Expect.isTrue(opt_arg());
    Expect.isTrue(opt_arg.call());
    Expect.isTrue(opt_arg("b"));
    Expect.isTrue(opt_arg.call("b"));
  }

  named_arg({x: 11, y: 22}) => "$x$y";

  for (var i = 0; i < 20; i++) {
    Expect.equals("1122", named_arg());
    Expect.equals("1122", named_arg.call());
    Expect.equals("4455", named_arg(y: 55, x: 44));
    Expect.equals("4455", named_arg.call(y: 55, x: 44));
    Expect.equals("4455", named_arg(x: 44, y: 55));
    Expect.equals("4455", named_arg.call(x: 44, y: 55));
  }

  Expect.throwsNoSuchMethodError(() => (bar as dynamic).call());
  Expect.throwsNoSuchMethodError(() => (opt_arg as dynamic).call(x: "p"));
  Expect.throwsNoSuchMethodError(() => (named_arg as dynamic).call("p", "q"));
}
