blob: 4ecdbf7d81f4b7f95cc426810790de8f0e23a966 [file] [log] [blame]
// 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();
}