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

// @dart = 2.9

import "package:expect/expect.dart";

/**
 * Test various forms of function literals.
 */
typedef int IntFunc(int);

class FunctionLiteralsTest {
  static void checkIntFunction<T>(expected, int f(T x), arg) {
    Expect.equals(expected, f(arg));
  }

  static void checkIntFuncFunction<T>(expected, IntFunc f(T x), arg) {
    Expect.equals(expected, f(arg)(arg));
  }

  int func1(int x) => x;

  int func2(x) => x;

  int func3(int x) {
    return x;
  }

  int func4(x) {
    return x;
  }

  FunctionLiteralsTest() {}

  static void testMain() {
    var test = new FunctionLiteralsTest();
    test.testArrow();
    test.testArrowArrow();
    test.testArrowBlock();
    test.testBlock();
    test.testBlockArrow();
    test.testBlockBlock();
    test.testFunctionRef();
  }

  void testArrow() {
    checkIntFunction(42, (x) => x, 42);
    checkIntFunction(42, (dynamic x) => x, 42);
  }

  void testArrowArrow() {
    checkIntFuncFunction(84, (x) => (y) => x + y, 42);
    checkIntFuncFunction(84, (dynamic x) => (y) => x + y, 42);
  }

  void testArrowBlock() {
    checkIntFuncFunction(
        84,
        (x) => (y) {
              return x + y;
            },
        42);
    checkIntFuncFunction(
        84,
        (int x) => (y) {
              return x + y;
            },
        42);
  }

  void testBlock() {
    checkIntFunction(42, (x) {
      return x;
    }, 42);
    checkIntFunction(42, (int x) {
      return x;
    }, 42);
  }

  void testBlockArrow() {
    checkIntFuncFunction(84, (x) {
      return (y) => x + y;
    }, 42);
    checkIntFuncFunction(84, (int x) {
      return (y) => (x + y) as int;
    }, 42);
  }

  void testBlockBlock() {
    checkIntFuncFunction(84, (x) {
      return (y) {
        return x + y;
      };
    }, 42);
    checkIntFuncFunction(84, (int x) {
      return (y) {
        return x + y;
      };
    }, 42);
  }

  void testFunctionRef() {
    checkIntFunction(42, func1, 42);
    checkIntFunction(42, func2, 42);
    checkIntFunction(42, func3, 42);
    checkIntFunction(42, func4, 42);
  }
}

main() {
  FunctionLiteralsTest.testMain();
}
