// 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);
}
