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

// @dart = 2.9

// Dart test for function type alias with a type parameter as result type.
import "package:expect/expect.dart";

typedef bool F<bool>(bool a); // 'bool' is not the boolean type.

bool bar(bool a) {}

int baz(int a) {}

class A<T> {
  T foo(T a) {}
}

main() {
  Expect.isTrue(bar is! F);
  Expect.isTrue(baz is! F);
  Expect.isTrue(bar is! F<Object>);
  Expect.isTrue(baz is! F<Object>);
  Expect.isTrue(bar is F<bool>);
  Expect.isTrue(baz is F<int>);
  Expect.isTrue(bar is! F<int>);
  Expect.isTrue(baz is! F<bool>);

  var b = new A<bool>();
  var i = new A<int>();
  Expect.isTrue(b.foo is F, 'runtime type of covaraint parameters is Object');
  Expect.isTrue(i.foo is F, 'runtime type of covaraint parameters is Object');
  Expect.isTrue(
      b.foo is F<Object>, 'runtime type of covaraint parameters is Object');
  Expect.isTrue(
      i.foo is F<Object>, 'runtime type of covaraint parameters is Object');
  Expect.isTrue(b.foo is F<bool>);
  Expect.isTrue(i.foo is F<int>);
  Expect.isTrue(b.foo is! F<int>);
  Expect.isTrue(i.foo is! F<bool>);
}
