// Copyright (c) 2011, 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.
//
// Dart test for new function type alias.

// @dart = 2.9

import "package:expect/expect.dart";

class FunctionLiteralsTest {
  static void testMain() {
    f(x) {
      return x * 2;
    }

    f(42); // make sure it is parsed as a function call
    Expect.equals(20, f(10));

    int g(x) {
      return x * 2;
    }

    g(42); // make sure it is parsed as a function call
    Expect.equals(20, g(10));

    h(x) {
      return x * 2;
    }

    h(42); // make sure it is parsed as a function call
    Expect.equals(20, h(10));

    dynamic a = (x) {
      return x + 2;
    };
    Expect.equals(7, a(5));

    Expect.equals(
        10,
        apply((k) {
          return k << 1;
        }, 5));
    Expect.equals(20, apply((k) => k << 1, 10));

    a = new A(3);
    Expect.equals(-1, a.f);
    Expect.equals(-3, a.f2);

    a = new A.n(5);
    Expect.equals(-2, a.f);
    Expect.equals(2, a.f2);

    Expect.equals(true, isOdd(5));
    Expect.equals(false, isOdd(8));

    var b = new B(10);
    Expect.equals(10, b.n);
    Expect.equals(100, (b.f)(10));

    b = new B.withZ(10);
    Expect.equals(10, b.n);
    Expect.equals(101, (b.f)(10));

    var c = new C(5);
    Expect.equals("2*x is 10", c.s);

    int x = 0;
    int y = 1;
    // make sure this isn't parsed as a generic type
    Expect.isTrue(x < y, "foo");
  }
}

apply(f, n) {
  return f(n);
}

bool isOdd(b) => b % 2 == 1;

class A {
  int f;
  int f2;
  A(p) : f = apply((j) => 2 - j, p) {
    /* constr. body */
    f2 = -p;
  }
  A.n(p) : f = 1 + apply((j) => 2 - j, p) {
    /* constr. body */
    f2 = -f;
  }
}

class B {
  var f;
  int n;
  B(z) : f = ((x) => x * x) {
    n = z;
  }
  B.withZ(z)
      : f = ((x) {
          return x * x + 1;
        }) {
    n = z;
  }
}

class C {
  String s;
  C(x) : s = "2*x is ${() { return 2*x; }()}";
}

main() {
  FunctionLiteralsTest.testMain();
}
