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

import 'package:expect/expect.dart';

void foo(F f<F>(F f)) {}

B bar<B>(B g<F>(F f)) => throw "uncalled";

Function baz<B>() {
  B foo<F>(B b, F f) => throw "uncalled";
  return foo;
}

class C<T> {
  void foo(F f<F>(T t, F f)) => null;
  B bar<B>(B g<F>(T t, F f)) => throw "uncalled";
  Function baz<B>() {
    B foo<F>(T t, F f) => throw "uncalled";
    return foo;
  }
}

main() {
  // Check the run-time type of the functions with generic parameters.

  Expect.type<void Function(X Function<X>(X))>(foo);

  Expect.isTrue(bar is X1 Function<X1>(X1 Function<X2>(X2)));

  Expect.isTrue(baz<int>() is int Function<X1>(int, X1));
  Expect.isTrue(baz<Object>() is Object Function<X1>(Object, X1));
  Expect.isTrue(baz<Null>() is Null Function<X1>(Null, X1));

  void testC<T>() {
    var c = new C<T>();

    Expect.type<void Function(F Function<F>(T, F))>(c.foo);

    Expect.isTrue(c.bar is X1 Function<X1>(X1 Function<X2>(T, X2)));

    Expect.isTrue(c.baz<int>() is int Function<X1>(T, X1));
  }

  testC<bool>();
  testC<Object>();
  testC<Null>();
}
