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

// @dart = 2.9

import "package:expect/expect.dart";

typedef Fun(Null a, Null b);

typedef int IntFun(Null a, Null b);

typedef bool BoolFun(Null a, Null 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<T>(int compare(T a, T b), T a, T 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(minus is IntFun);
    Expect.isTrue(minus 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 = (num arg) {};
    Function boundsFalse = (String arg) {};
    Expect.isTrue(boundsTrue is BoundsCheck<int>);
    Expect.isFalse(boundsFalse is BoundsCheck<num>);
  }
}

main() {
  FunctionTypeAliasTest.testMain();
}
