// Copyright (c) 2019, 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.

// dart2jsOptions=--experiment-new-rti

import "package:expect/expect.dart";

int fnInt2Int(int x) => x;
int fnIntOptInt2Int(int x, [int y = 0]) => x + y;

make1<A, B>(A a) {
  return (B b) => a;
}

make2<A, B>(A a) {
  A foo(B b) => a;
  return foo;
}

class C<A> {
  final A a;
  C(this.a);
  make<B>() => (B b) => a;
  make2<B>() => (B b) => 'x';
}

main() {
  Expect.isTrue(make1<int, int>(1) is int Function(int));
  Expect.isTrue(make1<int, int>(1) is Object Function(int));
  Expect.isTrue(make1<int, int>(1) is! String Function(int));
  Expect.isTrue(make1<int, int>(1) is! int Function(String));

  Expect.isTrue(make2<int, int>(1) is int Function(int));
  Expect.isTrue(make2<int, int>(1) is Object Function(int));
  Expect.isTrue(make2<int, int>(1) is! String Function(int));
  Expect.isTrue(make2<int, int>(1) is! int Function(String));

  Expect.isTrue(C<int>(1).make<String>() is int Function(String));
  Expect.isTrue(C<int>(1).make<String>() is Object Function(String));
  Expect.isTrue(C<int>(1).make<String>() is! String Function(int));

  Expect.isTrue(C<int>(1).make2<int>() is String Function(int));
  Expect.isTrue(C<int>(1).make2<int>() is Object Function(int));
  Expect.isTrue(C<int>(1).make2<int>() is! int Function(String));
  Expect.isTrue(C<int>(1).make2<int>() is! int Function(int));
  Expect.isTrue(C<int>(1).make2<String>() is String Function(String));
  Expect.isTrue(C<int>(1).make2<String>() is Object Function(String));
  Expect.isTrue(C<int>(1).make2<String>() is! int Function(String));
  Expect.isTrue(C<int>(1).make2<String>() is! String Function(int));
}
