blob: 42e371aa79c271514f454e0d7324c8c521762f98 [file] [log] [blame]
// Copyright (c) 2017, 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.
// Test that generic methods with unused parameters aren't treated as
// non-generic methods, but can be specialized as such.
library generic_methods_unused_parameter_test;
import "package:expect/expect.dart";
typedef Fun = int Function();
typedef FunReq = int Function(int);
typedef FunOpt = int Function([int?]);
typedef FunReqOpt = int Function(int, [int?]);
typedef FunNam = int Function({int? p});
typedef FunReqNam = int Function(int, {int? p});
typedef FunTyp = int Function<T>();
typedef FunTypReq = int Function<T>(int);
typedef FunTypOpt = int Function<T>([int?]);
typedef FunTypReqOpt = int Function<T>(int, [int?]);
typedef FunTypNam = int Function<T>({int? p});
typedef FunTypReqNam = int Function<T>(int, {int? p});
int fun() { return -1; }
int funReq(int x) => x;
int funOpt([int? y]) => y ?? 42;
int funReqOpt(int x, [int? y]) => x;
int funNam({int? p}) => p ?? 42;
int funReqNam(int x, {int? p}) => x;
int funTyp<T>() { return -1; }
int funTypReq<T>(int x) => x;
int funTypOpt<T>([int? y]) => y ?? 42;
int funTypReqOpt<T>(int x, [int? y]) => x;
int funTypNam<T>({int? p}) => p ?? 42;
int funTypReqNam<T>(int x, {int? p}) => x;
main() {
// Use generic function instantiation to obtain non-generic functions,
// and test below that they have the expected run-time types.
Fun varFun = funTyp;
FunReq varFunReq = funTypReq;
FunOpt varFunOpt = funTypOpt;
FunReqOpt varFunReqOpt = funTypReqOpt;
FunNam varFunNam = funTypNam;
FunReqNam varFunReqNam = funTypReqNam;
Expect.isTrue(fun is Fun);
Expect.isTrue(fun is! FunTyp);
Expect.isTrue(funTyp is! Fun);
Expect.isTrue(funTyp is FunTyp);
Expect.isTrue(varFun is Fun);
Expect.isTrue(varFun is! FunTyp);
Expect.isTrue(funReq is FunReq);
Expect.isTrue(funReq is! FunTypReq);
Expect.isTrue(funTypReq is! FunReq);
Expect.isTrue(funTypReq is FunTypReq);
Expect.isTrue(varFunReq is FunReq);
Expect.isTrue(varFunReq is! FunTypReq);
Expect.isTrue(funOpt is FunOpt);
Expect.isTrue(funOpt is! FunTypOpt);
Expect.isTrue(funTypOpt is! FunOpt);
Expect.isTrue(funTypOpt is FunTypOpt);
Expect.isTrue(varFunOpt is FunOpt);
Expect.isTrue(varFunOpt is! FunTypOpt);
Expect.isTrue(funReqOpt is FunReqOpt);
Expect.isTrue(funReqOpt is! FunTypReqOpt);
Expect.isTrue(funTypReqOpt is! FunReqOpt);
Expect.isTrue(funTypReqOpt is FunTypReqOpt);
Expect.isTrue(varFunReqOpt is FunReqOpt);
Expect.isTrue(varFunReqOpt is! FunTypReqOpt);
Expect.isTrue(funNam is FunNam);
Expect.isTrue(funNam is! FunTypNam);
Expect.isTrue(funTypNam is! FunNam);
Expect.isTrue(funTypNam is FunTypNam);
Expect.isTrue(varFunNam is FunNam);
Expect.isTrue(varFunNam is! FunTypNam);
Expect.isTrue(funReqNam is FunReqNam);
Expect.isTrue(funReqNam is! FunTypReqNam);
Expect.isTrue(funTypReqNam is! FunReqNam);
Expect.isTrue(funTypReqNam is FunTypReqNam);
Expect.isTrue(varFunReqNam is FunReqNam);
Expect.isTrue(varFunReqNam is! FunTypReqNam);
}