// 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.
// VMOptions=--enable_type_checks
//
// Dart test for function type alias.

import "package:expect/expect.dart";

typedef Fun(a, b);

typedef int IntFun(a, b);

typedef bool BoolFun(a, b);

typedef int CompareObj(Object a, Object b);

typedef int CompareInt(int a, int b);

typedef int CompareString(String a, String b, [bool swap]);

typedef void Test();

typedef ParameterizedFun1<T, U extends bool, V>(T t, U u);

typedef List<T> ParameterizedFun2<T, U, V extends Map<T, int>>(
    Map<T, int> t, U u);

typedef void BoundsCheck<T extends num>(T arg);

class FunctionTypeAliasTest {
  FunctionTypeAliasTest() {}
  static int test(CompareObj compare, Object a, Object b) {
    return compare(a, b);
  }

  foo(Test arg) {}
  static bar() {
    FunctionTypeAliasTest a = new FunctionTypeAliasTest();
    a.foo(() {});
    return 0;
  }

  static void testMain() {
    int compareStrLen(String a, String b) {
      return a.length - b.length;
    }

    Expect.isTrue(compareStrLen is Fun);
    Expect.isTrue(compareStrLen is IntFun);
    Expect.isTrue(compareStrLen is! BoolFun);
    Expect.isTrue(compareStrLen is CompareObj);
    Expect.isTrue(compareStrLen is! CompareInt);
    Expect.isTrue(compareStrLen is! CompareString);
    Expect.equals(3, test(compareStrLen, "abcdef", "xyz"));

    int compareStrLenSwap(String a, String b, [bool swap = false]) {
      return swap ? (a.length - b.length) : (b.length - a.length);
    }

    Expect.isTrue(compareStrLenSwap is Fun);
    Expect.isTrue(compareStrLenSwap is IntFun);
    Expect.isTrue(compareStrLenSwap is! BoolFun);
    Expect.isTrue(compareStrLenSwap is CompareObj);
    Expect.isTrue(compareStrLenSwap is! CompareInt);
    Expect.isTrue(compareStrLenSwap is CompareString);

    int compareStrLenReverse(String a, String b, [bool reverse = false]) {
      return reverse ? (a.length - b.length) : (b.length - a.length);
    }

    Expect.isTrue(compareStrLenReverse is Fun);
    Expect.isTrue(compareStrLenReverse is IntFun);
    Expect.isTrue(compareStrLenReverse is! BoolFun);
    Expect.isTrue(compareStrLenReverse is CompareObj);
    Expect.isTrue(compareStrLenReverse is! CompareInt);
    Expect.isTrue(compareStrLenReverse is CompareString);

    int compareObj(Object a, Object b) {
      return identical(a, b) ? 0 : -1;
    }

    Expect.isTrue(compareObj is Fun);
    Expect.isTrue(compareObj is IntFun);
    Expect.isTrue(compareObj is! BoolFun);
    Expect.isTrue(compareObj is CompareObj);
    Expect.isTrue(compareObj is CompareInt);
    Expect.isTrue(compareObj is! CompareString);
    Expect.equals(-1, test(compareObj, "abcdef", "xyz"));

    CompareInt minus = (int a, int b) {
      return a - b;
    };
    Expect.isTrue(minus is Fun);
    Expect.isTrue(compareStrLen is IntFun);
    Expect.isTrue(compareStrLen is! BoolFun);
    Expect.isTrue(minus is CompareObj);
    Expect.isTrue(minus is CompareInt);
    Expect.isTrue(minus is! CompareString);
    Expect.equals(99, test(minus, 100, 1));

    int plus(int a, [int b = 1]) {
      return a + b;
    }

    ;
    Expect.isTrue(plus is Fun);
    Expect.isTrue(plus is IntFun);
    Expect.isTrue(plus is! BoolFun);
    Expect.isTrue(plus is CompareObj);
    Expect.isTrue(plus is CompareInt);
    Expect.isTrue(plus is! CompareString);

    Expect.equals(0, bar());

    Function boundsTrue = (int arg) {};
    Function boundsFalse = (String arg) {};
    Expect.isTrue(boundsTrue is BoundsCheck<num>);
    Expect.isFalse(boundsFalse is BoundsCheck<num>);
  }
}

main() {
  FunctionTypeAliasTest.testMain();
}
