// Copyright (c) 2013, 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 test program for constructors and initializers.

// @dart = 2.9

// Check function subtyping for classes with call functions.

import 'package:expect/expect.dart';

typedef void Foo(bool a, [String b]);
typedef void Bar(bool a, [String b]);
typedef void Baz(bool a, {String b});
typedef void Boz(bool a);

class C1<T> {
  void call(T a, [String b]) {}
}

class C2<T> {
  void call(T a, {String b}) {}
}

main() {
  Function c1_bool = new C1<bool>(); // implicit tearoff of `call`
  Expect.isTrue(c1_bool is Foo, 'c1_bool is Foo');
  Expect.isTrue(c1_bool is Bar, 'c1_bool is Bar');
  Expect.isFalse(c1_bool is Baz, 'c1_bool is Baz');
  Expect.isTrue(c1_bool is Boz, 'c1_bool is Boz');

  Function c1_int = new C1<int>(); // implicit tearoff of `call`
  Expect.isTrue(c1_int is Foo, 'c1_int is Foo');
  Expect.isTrue(c1_int is Bar, 'c1_int is Bar');
  Expect.isFalse(c1_int is Baz, 'c1_int is Baz');
  Expect.isTrue(c1_int is Boz, 'c1_int is Boz');

  Function c1 = new C1(); // implicit tearoff of `call`
  Expect.isTrue(c1 is Foo, 'c1 is Foo');
  Expect.isTrue(c1 is Bar, 'c1 is Bar');
  Expect.isFalse(c1 is Baz, 'c1 is Baz');
  Expect.isTrue(c1 is Boz, 'c1 is Boz');

  Function c2_bool = new C2<bool>(); // implicit tearoff of `call`
  Expect.isFalse(c2_bool is Foo, 'c2_bool is Foo');
  Expect.isFalse(c2_bool is Bar, 'c2_bool is Bar');
  Expect.isTrue(c2_bool is Baz, 'c2_bool is Baz');
  Expect.isTrue(c2_bool is Boz, 'c2_bool is Boz');

  Function c2_int = new C2<int>(); // implicit tearoff of `call`
  Expect.isFalse(c2_int is Foo, 'c2_int is Foo');
  Expect.isFalse(c2_int is Bar, 'c2_int is Bar');
  Expect.isTrue(c2_int is Baz, 'c2_int is Baz');
  Expect.isTrue(c2_int is Boz, 'c2_int is Boz');

  Function c2 = new C2(); // implicit tearoff of `call`
  Expect.isFalse(c2 is Foo, 'c2 is Foo');
  Expect.isFalse(c2 is Bar, 'c2 is Bar');
  Expect.isTrue(c2 is Baz, 'c2 is Baz');
  Expect.isTrue(c2 is Boz, 'c2 is Boz');
}
