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

// Derived from language_2/covariant_override/tear_off_type_test

// If a parameter is directly or indirectly a covariant override, its type in
// the method tear-off should become Object?.

typedef void TakeInts(int? a, int? b, int? c, int? d, int? e);
typedef void TakeObjectsAndInts(Object? a, int? b, Object? c, int? d, int? e);
typedef void TakeObjects(Object? a, Object? b, Object? c, Object? d, Object? e);

typedef void TakeOptionalInts([int? a, int? b, int? c, int? d]);
typedef void TakeOptionalObjectsAndInts([Object? a, int? b, Object? c, int? d]);

typedef void TakeNamedInts({int? a, int? b, int? c, int? d});
typedef void TakeNamedObjectsAndInts({Object? a, int? b, Object? c, int? d});

class M1 {
  method(covariant int? a, int? b) {}
}

class M2 {
  method(int? a, covariant int? b) {}
}

class C extends Object with M1, M2 {}

class Direct {
  void positional(covariant int? a, int? b, covariant int? c, int? d, int? e) {}
  void optional([covariant int? a, int? b, covariant int? c, int? d]) {}
  void named({covariant int? a, int? b, covariant int? c, int? d}) {}
}

class Inherited extends Direct {}

// ---

class Override1 {
  void method(covariant int? a, int? b, int? c, int? d, int? e) {}
}

class Override2 extends Override1 {
  void method(int? a, int? b, covariant int? c, int? d, int? e) {}
}

class Override3 extends Override2 {
  void method(int? a, int? b, int? c, int? d, int? e) {}
}

// ---

abstract class Implement1 {
  void method(covariant int? a, int? b, int? c, int? d, int? e) {}
}

class Implement2 {
  void method(int? a, covariant int? b, int? c, int? d, int? e) {}
}

class Implement3 {
  void method(int? a, int? b, covariant int? c, int? d, int? e) {}
}

class Implement4 implements Implement3 {
  void method(int? a, int? b, int? c, covariant int? d, int? e) {}
}

class Implement5 implements Implement1, Implement2, Implement4 {
  void method(int? a, int? b, int? c, int? d, covariant int? e) {}
}

// ---

class Interface1 {
  void method(covariant int? a, int? b, int? c, int? d, int? e) {}
}

class Interface2 {
  void method(int? a, covariant int? b, int? c, int? d, int? e) {}
}

class Mixin1 {
  void method(int? a, int? b, covariant int? c, int? d, int? e) {}
}

class Mixin2 {
  void method(int? a, int? b, int? c, covariant int? d, int? e) {}
}

class Superclass {
  void method(int? a, int? b, int? c, int? d, covariant int? e) {}
}

class Mixed extends Superclass
    with Mixin1, Mixin2
    implements Interface1, Interface2 {}

void main() {
  testDirect();
  testInherited();
  testOverridden();
  testImplemented();
  testMixed();
}

void testDirect() {
  var positional = new Direct().positional;
  isTrue(positional is TakeInts);
  isTrue(positional is TakeObjectsAndInts);

  var optional = new Direct().optional;
  isTrue(optional is TakeOptionalInts);
  isTrue(optional is TakeOptionalObjectsAndInts);

  var named = new Direct().named;
  isTrue(named is TakeNamedInts);
  isTrue(named is TakeNamedObjectsAndInts);
}

void testInherited() {
  var positional = new Inherited().positional;
  isTrue(positional is TakeInts);
  isTrue(positional is TakeObjectsAndInts);

  var optional = new Inherited().optional;
  isTrue(optional is TakeOptionalInts);
  isTrue(optional is TakeOptionalObjectsAndInts);

  var named = new Inherited().named;
  isTrue(named is TakeNamedInts);
  isTrue(named is TakeNamedObjectsAndInts);
}

void testOverridden() {
  var method2 = new Override2().method;
  isTrue(method2 is TakeInts);
  isTrue(method2 is TakeObjectsAndInts);

  var method3 = new Override3().method;
  isTrue(method3 is TakeInts);
  isTrue(method3 is TakeObjectsAndInts);
}

void testImplemented() {
  var method = new Implement5().method;
  isTrue(method is TakeInts);
  isTrue(method is TakeObjects);
}

void testMixed() {
  // TODO(rnystrom): https://github.com/dart-lang/sdk/issues/28395
  var method = new Mixed().method;
  isTrue(method is TakeInts);
  isTrue(method is TakeObjects);
}

void isTrue(bool value) {
  if (!value) throw 'Expected true';
}
