// 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.

import "package:expect/expect.dart";

// simple test with no types in signature
class A1 {
  call() => 42;
}

// same test, include return type
class A2 {
  int call() => 35;
}

class B {
  call() => 28;
}

// A call() operator can have any arity
class C {
  call(arg) => 7 * arg;
}

// Test named arguments
class D {
  call([arg = 6]) => 7 * arg;
}

// Non-trivial method body combination of positional and named.
class E {
  String call(String str, {int count = 1}) {
    StringBuffer buffer = new StringBuffer();
    for (var i = 0; i < count; i++) {
      buffer.write(str);
      if (i < count - 1) {
        buffer.write(":");
      }
    }
    return buffer.toString();
  }
}

main() {
  var a1 = new A1();
  Expect.equals(42, a1());
  Expect.equals(42, a1.call());

  var a2 = new A2();
  Expect.equals(35, a2());
  Expect.equals(35, a2.call());

  var b = new B();
  Expect.equals(28, b());
  Expect.equals(28, b.call());

  var c = new C();
  Expect.equals(42, c(6));
  Expect.equals(42, c.call(6));

  var d = new D();
  Expect.equals(42, d());
  Expect.equals(7, d(1));
  Expect.equals(14, d(2));
  Expect.equals(42, d.call());
  Expect.equals(7, d.call(1));
  Expect.equals(14, d.call(2));

  var e = new E();
  Expect.equals("foo", e("foo"));
  Expect.equals("foo:foo", e("foo", count: 2));
  Expect.equals("foo:foo:foo", e("foo", count: 3));
  Expect.equals("foo", e.call("foo"));
  Expect.equals("foo:foo", e.call("foo", count: 2));
  Expect.equals("foo:foo:foo", e.call("foo", count: 3));

  Expect.isFalse(a1 is Function); //# 01: ok
  Expect.isFalse(e is Function); //# 02: ok
}
