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

var foo;
bar() => foo(3, 99);
gee(f) => foo(fun: f);

get foo2 => foo;
bar2() => foo2(3, 99);
gee2(f) => foo2(fun: f);

globalTest() {
  foo = () => 499;
  Expect.equals(499, foo());
  foo = (x, y) => x + y;
  Expect.equals(102, bar());
  foo = ({fun = null}) => fun(41);
  Expect.equals(42, gee((x) => x + 1));

  foo = () => 499;
  Expect.equals(499, foo2());
  foo = (x, y) => x + y;
  Expect.equals(102, bar2());
  foo = ({fun = null}) => fun(41);
  Expect.equals(42, gee2((x) => x + 1));
}

class A {
  static var foo;
  static bar() => foo(3, 99);
  static gee(f) => foo(fun: f);

  static get foo2 => foo;
  static bar2() => foo2(3, 99);
  static gee2(f) => foo2(fun: f);
}

staticTest() {
  A.foo = () => 499;
  Expect.equals(499, A.foo());
  A.foo = (x, y) => x + y;
  Expect.equals(102, A.bar());
  A.foo = ({fun = null}) => fun(41);
  Expect.equals(42, A.gee((x) => x + 1));

  A.foo = () => 499;
  Expect.equals(499, A.foo2());
  A.foo = (x, y) => x + y;
  Expect.equals(102, A.bar2());
  A.foo = ({fun = null}) => fun(41);
  Expect.equals(42, A.gee2((x) => x + 1));
}

main() {
  globalTest();
  staticTest();
}
