// Copyright (c) 2018, 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
class Interface1 {
  void interfaceMethod1() {}
}

class Interface2 {
  void interfaceMethod2() {}

  var interfaceMethod1;
}

class Interface3 {
  void interfaceMethod3() {}
}

abstract class A implements Interface1, Interface2, Interface3 {
  aMethod() {}
  abstractMethod();
  void set property1(_);
  void set property2(_);
  void set property3(_);
}

abstract class B extends A {
  final property1 = null;
  aMethod() {}
  bMethod() {}
}

class MyClass extends B {
  var property2;
  aaMethod() {}
  aMethod() {}
  bMethod() {}
  cMethod() {}
}

// This class should have no errors, as it has a non-trivial noSuchMethod.
class MyMock1 extends B {
  noSuchMethod(_) => null;
}

// This class should have no errors, as the abstract method doesn't override
// the non-trivial noSuchMethod inherited from MyMock1.
class MyMock2 extends MyMock1 {
  noSuchMethod(_);
}

// This class should have an error, the abstract method isn't considered
// non-trivial.
class MyMock3 extends B {
  noSuchMethod(_);
}

class C {
  void interfaceMethod1(_) {}
}

// This class should have an error, the method C.interfaceMethod1 conflicts
// with the field Interface2.interfaceMethod1.
abstract class D extends C implements Interface2 {}

class E {
  void set interfaceMethod1(_) {}
}

// This class should have an error, the setter E.interfaceMethod1 conflicts
// with the method Interface1.interfaceMethod1.
abstract class F extends E implements Interface1 {}

class Foo {
  void foo() {}
}

class G {
  Object get foo => null;
}

// This class should have an error, the getter G.foo conflicts with the method
// Foo.foo.
abstract class H extends G implements Foo {}

class Bar {
  Object get foo => null;
}

class I {
  Object foo() {}
}

// This class should have an error, the getter Bar.foo conflicts with the
// method I.foo.
abstract class J extends I implements Bar {}

main() {}
