// Copyright (c) 2014, 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 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'compiler_helper.dart';
import 'package:compiler/src/resolution/class_members.dart'
    show MembersCreator;

main() {
  asyncTest(() => Future.wait([
    testRequiredParameters(),
    testPositionalParameters(),
    testNamedParameters(),
    testNotSubtype(),
    testGetterNotSubtype(),
    testSetterNotSubtype(),
    testGenericNotSubtype(),
    testFieldNotSubtype(),
    testMixedOverride(),
    testAbstractMethods(),
    testNoSuchMethod(),
  ]));
}

Future check(String source, {errors, warnings, hints, infos}) {
  return MockCompiler.create((MockCompiler compiler) {
    compiler.diagnosticHandler = createHandler(compiler, source);
    compiler.parseScript(source);
    var cls = compiler.mainApp.find('Class');
    cls.ensureResolved(compiler);
    MembersCreator.computeAllClassMembers(compiler, cls);

    toList(o) => o == null ? [] : o is List ? o : [o];

    compareMessageKinds(source, toList(errors), compiler.errors, 'error');

    compareMessageKinds(source, toList(warnings), compiler.warnings, 'warning');

    if (infos != null) {
      compareMessageKinds(source, toList(infos), compiler.infos, 'info');
    }

    if (hints != null) {
      compareMessageKinds(source, toList(hints), compiler.hints, 'hint');
    }
  });
}

Future testRequiredParameters() {
  return Future.wait([
    check("""
          class A {
            method() => null; // testRequiredParameters:0
          }
          class Class extends A {
            method() => null; // testRequiredParameters:1
          }
          """),

    check("""
          class A {
            method(a) => null; // testRequiredParameters:2
          }
          class Class extends A {
            method(b) => null; // testRequiredParameters:3
          }
          """),

    check("""
          class A {
            method(a, b, c, d) => null; // testRequiredParameters:3
          }
          class Class extends A {
            method(b, a, d, c) => null; // testRequiredParameters:4
          }
          """),

    check("""
          class A {
            method() => null; // testRequiredParameters:5
          }
          class Class extends A {
            method(a) => null; // testRequiredParameters:6
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A {
            method() => null; // testRequiredParameters:7
          }
          class Class implements A {
            method(a) => null; // testRequiredParameters:8
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A {
            method(a, b, c) => null; // testRequiredParameters:9
          }
          class Class extends A {
            method(a, b, c, d) => null; // testRequiredParameters:10
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
  ]);
}

Future testPositionalParameters() {
  return Future.wait([
    check("""
          class A {
            method([a]) => null; // testPositionalParameters:1
          }
          class Class extends A {
            method([a]) => null; // testPositionalParameters:2
          }
          """),

    check("""
          class A {
            method([a, b]) => null; // testPositionalParameters:3
          }
          class Class extends A {
            method([b, a]) => null; // testPositionalParameters:4
          }
          """),

    check("""
          class A {
            method([a, b, c]) => null; // testPositionalParameters:5
          }
          class Class extends A {
            method([b, d, a, c]) => null; // testPositionalParameters:6
          }
          """),

    check("""
          class A {
            method([a]) => null; // testPositionalParameters:7
          }
          class Class extends A {
            method([a]) => null; // testPositionalParameters:8
          }
          """),

    check("""
          class A {
            method(a) => null; // testPositionalParameters:9
          }
          class Class extends A {
            method() => null; // testPositionalParameters:10
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A {
            method(a, [b]) => null; // testPositionalParameters:11
          }
          class Class extends A {
            method(a) => null; // testPositionalParameters:12
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A {
            method(a, [b]) => null; // testPositionalParameters:13
          }
          class Class extends A {
            method([a]) => null; // testPositionalParameters:14
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A {
            method(a, b, [c, d, e]) => null; // testPositionalParameters:15
          }
          class Class extends A {
            method([a, b, c, d]) => null; // testPositionalParameters:16
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
  ]);
}

Future testNamedParameters() {
  return Future.wait([
    check("""
          class A {
            method({a}) => null; // testNamedParameters:1
          }
          class Class extends A {
            method({a}) => null; // testNamedParameters:2
          }
          """),

    check("""
          class A {
            method({a, b}) => null; // testNamedParameters:3
          }
          class Class extends A {
            method({b, a}) => null; // testNamedParameters:4
          }
          """),

    check("""
          class A {
            method({a, b, c}) => null; // testNamedParameters:5
          }
          class Class extends A {
            method({b, c, a, d}) => null; // testNamedParameters:6
          }
          """),

    check("""
          class A {
            method(d, {a, b, c}) => null; // testNamedParameters:7
          }
          class Class extends A {
            method(e, {b, c, a, d}) => null; // testNamedParameters:8
          }
          """),

    check("""
          class A {
            method({a}) => null; // testNamedParameters:9
          }
          class Class extends A {
            method() => null; // testNamedParameters:10
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A {
            method({a, b}) => null; // testNamedParameters:11
          }
          class Class extends A {
            method({b}) => null; // testNamedParameters:12
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A {
            method({a, b, c, d}) => null; // testNamedParameters:13
          }
          class Class extends A {
            method({a, e, d, c}) => null; // testNamedParameters:14
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
  ]);
}

Future testNotSubtype() {
  return Future.wait([
    check("""
          class A {
            method(int a) => null; // testNotSubtype:1
          }
          class Class extends A {
            method(int a) => null; // testNotSubtype:2
          }
          """),

    check("""
          class A {
            method(int a) => null; // testNotSubtype:3
          }
          class Class extends A {
            method(num a) => null; // testNotSubtype:4
          }
          """),

    check("""
          class A {
            void method() {} // testNotSubtype:5
          }
          class Class extends A {
            method() => null; // testNotSubtype:6
          }
          """),

    check("""
          class A {
            method() => null; // testNotSubtype:7
          }
          class Class extends A {
            void method() {} // testNotSubtype:8
          }
          """),

    check("""
          class A {
            void method() {} // testNotSubtype:9
          }
          class Class extends A {
            int method() => null; // testNotSubtype:10
          }
          """),

    check("""
          class A {
            int method() => null; // testNotSubtype:11
          }
          class Class extends A {
            void method() {} // testNotSubtype:12
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A {
            method(int a) => null; // testNotSubtype:13
          }
          class B extends A {
            method(num a) => null; // testNotSubtype:14
          }
          class Class extends B {
            method(double a) => null; // testNotSubtype:15
          }
          """),

    check("""
          class A {
            method(int a) => null; // testNotSubtype:16
          }
          class B extends A {
            method(a) => null; // testNotSubtype:17
          }
          class Class extends B {
            method(String a) => null; // testNotSubtype:18
          }
          """),

    check("""
          class A {
            method(int a) => null; // testNotSubtype:19
          }
          class Class extends A {
            method(String a) => null; // testNotSubtype:20
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
    check("""
          class A {
            method(int a) => null; // testNotSubtype:23
          }
          class B {
            method(num a) => null; // testNotSubtype:24
          }
          abstract class C implements A, B {
          }
          class Class implements C {
            method(double a) => null; // testNotSubtype:25
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A {
            method(num a) => null; // testNotSubtype:29
          }
          class B {
            method(int a) => null; // testNotSubtype:30
          }
          abstract class C implements A, B {
          }
          class Class implements C {
            method(double a) => null; // testNotSubtype:31
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A {
            method(int a) => null; // testNotSubtype:26
          }
          class B {
            method(num a) => null; // testNotSubtype:27
          }
          abstract class C implements A, B {
          }
          class Class implements C {
            method(String a) => null; // testNotSubtype:28
          }
          """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
                          MessageKind.INVALID_OVERRIDE_METHOD],
               infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
                       MessageKind.INVALID_OVERRIDDEN_METHOD]),
  ]);
}

Future testGetterNotSubtype() {
  return Future.wait([
    check("""
          class A {
            get getter => null; // testGetterNotSubtype:1
          }
          class Class extends A {
            get getter => null; // testGetterNotSubtype:2
          }
          """),

    check("""
          class A {
            num get getter => null; // testGetterNotSubtype:3
          }
          class Class extends A {
            num get getter => null; // testGetterNotSubtype:4
          }
          """),

    check("""
          class A {
            num get getter => null; // testGetterNotSubtype:5
          }
          class Class extends A {
            int get getter => null; // testGetterNotSubtype:6
          }
          """),

    check("""
          class A {
            int get getter => null; // testGetterNotSubtype:7
          }
          class Class extends A {
            num get getter => null; // testGetterNotSubtype:8
          }
          """),

    check("""
          class A {
            int get getter => null; // testGetterNotSubtype:9
          }
          class Class extends A {
            double get getter => null; // testGetterNotSubtype:10
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
               infos: MessageKind.INVALID_OVERRIDDEN_GETTER),

    check("""
          class A {
            int get getter => null; // testGetterNotSubtype:11
          }
          class B extends A {
            num get getter => null; // testGetterNotSubtype:12
          }
          class Class extends B {
            double get getter => null; // testGetterNotSubtype:13
          }
          """),

    check("""
          class A {
            int get getter => null; // testGetterNotSubtype:14
          }
          class B {
            num get getter => null; // testGetterNotSubtype:15
          }
          class Class extends A implements B {
            double get getter => null; // testGetterNotSubtype:16
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
               infos: MessageKind.INVALID_OVERRIDDEN_GETTER),

    check("""
          class A {
            int get getter => null; // testGetterNotSubtype:17
          }
          class B {
            String get getter => null; // testGetterNotSubtype:18
          }
          class Class extends A implements B {
            double get getter => null; // testGetterNotSubtype:19
          }
          """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
                          MessageKind.INVALID_OVERRIDE_GETTER],
               infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
                       MessageKind.INVALID_OVERRIDDEN_GETTER]),

    check("""
          class A {
            int get getter => null; // testGetterNotSubtype:20
          }
          class B {
            String get getter => null; // testGetterNotSubtype:21
          }
          class Class implements A, B {
            double get getter => null; // testGetterNotSubtype:22
          }
          """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
                          MessageKind.INVALID_OVERRIDE_GETTER],
               infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
                       MessageKind.INVALID_OVERRIDDEN_GETTER]),

    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
    check("""
          class A {
            int get getter => null; // testGetterNotSubtype:23
          }
          class B {
            num get getter => null; // testGetterNotSubtype:24
          }
          abstract class C implements A, B {
          }
          class Class implements C {
            double get getter => null; // testGetterNotSubtype:25
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
               infos: MessageKind.INVALID_OVERRIDDEN_GETTER),

    check("""
          class A {
            int get getter => null; // testGetterNotSubtype:26
          }
          class B {
            num get getter => null; // testGetterNotSubtype:27
          }
          abstract class C implements A, B {
          }
          class Class implements C {
            String get getter => null; // testGetterNotSubtype:28
          }
          """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
                          MessageKind.INVALID_OVERRIDE_GETTER],
               infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
                       MessageKind.INVALID_OVERRIDDEN_GETTER]),
  ]);
}

Future testGenericNotSubtype() {
  return Future.wait([
    check("""
          class A<T> {
            method(T t) => null; // testGenericNotSubtype:1
          }
          class Class<S> extends A<S> {
            method(S s) => null; // testGenericNotSubtype:2
          }
          """),

    check("""
          class A<T> {
            method(T t) => null; // testGenericNotSubtype:3
          }
          class Class extends A<num> {
            method(int i) => null; // testGenericNotSubtype:4
          }
          """),

    check("""
          class A<T> {
            method(T t) => null; // testGenericNotSubtype:5
          }
          class B<S> {
            method(S s) => null; // testGenericNotSubtype:6
          }
          class Class extends A<double> implements B<int> {
            method(num i) => null; // testGenericNotSubtype:7
          }
          """),

    check("""
          class A<T> {
            method(T t) => null; // testGenericNotSubtype:8
          }
          class Class<S> extends A<S> {
            method(int i) => null; // testGenericNotSubtype:9
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A<T> {
            method(T t) => null; // testGenericNotSubtype:10
          }
          class B<S> extends A<S> {

          }
          class Class<U> extends B<U> {
            method(U u) => null; // testGenericNotSubtype:11
          }
          """),

    check("""
          class A<T> {
            method(T t) => null; // testGenericNotSubtype:12
          }
          class B<S> {
            method(S s) => null; // testGenericNotSubtype:13
          }
          class Class<U> extends A<U> implements B<num> {
            method(int i) => null; // testGenericNotSubtype:14
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A<T> {
            method(T t) => null; // testGenericNotSubtype:15
          }
          class B<S> {
            method(S s) => null; // testGenericNotSubtype:16
          }
          class Class extends A<int> implements B<String> {
            method(double d) => null; // testGenericNotSubtype:17
          }
          """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
                          MessageKind.INVALID_OVERRIDE_METHOD],
               infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
                       MessageKind.INVALID_OVERRIDDEN_METHOD]),

    check("""
          class A<T> {
            method(T t) => null; // testGenericNotSubtype:18
          }
          class B<S> {
            method(S s) => null; // testGenericNotSubtype:19
          }
          class Class implements A<int>, B<String> {
            method(double d) => null; // testGenericNotSubtype:20
          }
          """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
                          MessageKind.INVALID_OVERRIDE_METHOD],
               infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
                       MessageKind.INVALID_OVERRIDDEN_METHOD]),

    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
    check("""
          class A<T> {
            method(T t) => null; // testGenericNotSubtype:21
          }
          class B<S> {
            method(S s) => null; // testGenericNotSubtype:22
          }
          abstract class C implements A<int>, B<num> {
          }
          class Class implements C {
            method(double d) => null; // testGenericNotSubtype:23
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),

    check("""
          class A<T> {
            method(T t) => null; // testGenericNotSubtype:24
          }
          class B<S> {
            method(S s) => null; // testGenericNotSubtype:25
          }
          abstract class C implements A<int>, B<num> {
          }
          class Class implements C {
            method(String s) => null; // testGenericNotSubtype:26
          }
          """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
                          MessageKind.INVALID_OVERRIDE_METHOD],
               infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
                       MessageKind.INVALID_OVERRIDDEN_METHOD]),
  ]);
}

Future testSetterNotSubtype() {
  return Future.wait([
  check("""
        class A {
          set setter(_) => null; // testSetterNotSubtype:1
        }
        class Class extends A {
          set setter(_) => null; // testSetterNotSubtype:2
        }
        """),

  check("""
        class A {
          void set setter(_) {} // testSetterNotSubtype:3
        }
        class Class extends A {
          set setter(_) => null; // testSetterNotSubtype:4
        }
        """),

  check("""
        class A {
          set setter(_) => null; // testSetterNotSubtype:5
        }
        class Class extends A {
          void set setter(_) {} // testSetterNotSubtype:6
        }
        """),

  check("""
        class A {
          set setter(_) => null; // testSetterNotSubtype:7
        }
        class Class extends A {
          void set setter(_) {} // testSetterNotSubtype:8
        }
        """),

  check("""
        class A {
          set setter(num _) => null; // testSetterNotSubtype:9
        }
        class Class extends A {
          set setter(num _) => null; // testSetterNotSubtype:10
        }
        """),

  check("""
        class A {
          set setter(num _) => null; // testSetterNotSubtype:11
        }
        class Class extends A {
          set setter(int _) => null; // testSetterNotSubtype:12
        }
        """),

  check("""
        class A {
          set setter(int _) => null; // testSetterNotSubtype:13
        }
        class Class extends A {
          set setter(num _) => null; // testSetterNotSubtype:14
        }
        """),

  check("""
        class A {
          set setter(int _) => null; // testSetterNotSubtype:15
        }
        class Class extends A {
          set setter(double _) => null; // testSetterNotSubtype:16
        }
        """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
             infos: MessageKind.INVALID_OVERRIDDEN_SETTER),

  check("""
        class A {
          set setter(int _) => null; // testSetterNotSubtype:17
        }
        class B extends A {
          set setter(num _) => null; // testSetterNotSubtype:18
        }
        class Class extends B {
          set setter(double _) => null; // testSetterNotSubtype:19
        }
        """),

  check("""
        class A {
          set setter(int _) => null; // testSetterNotSubtype:20
        }
        class B {
          set setter(num _) => null; // testSetterNotSubtype:21
        }
        class Class extends A implements B {
          set setter(double _) => null; // testSetterNotSubtype:22
        }
        """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
             infos: MessageKind.INVALID_OVERRIDDEN_SETTER),

  check("""
        class A {
          set setter(int _) => null; // testSetterNotSubtype:23
        }
        class B {
          set setter(String _) => null; // testSetterNotSubtype:24
        }
        class Class extends A implements B {
          set setter(double _) => null; // testSetterNotSubtype:25
        }
        """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
                        MessageKind.INVALID_OVERRIDE_SETTER],
             infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
                     MessageKind.INVALID_OVERRIDDEN_SETTER]),

  check("""
        class A {
          set setter(int _) => null; // testSetterNotSubtype:26
        }
        class B {
          set setter(String _) => null; // testSetterNotSubtype:27
        }
        class Class implements A, B {
          set setter(double _) => null; // testSetterNotSubtype:28
        }
        """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
                        MessageKind.INVALID_OVERRIDE_SETTER],
             infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
                     MessageKind.INVALID_OVERRIDDEN_SETTER]),

  // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
  check("""
        class A {
          set setter(int _) => null; // testSetterNotSubtype:29
        }
        class B {
          set setter(num _) => null; // testSetterNotSubtype:30
        }
        abstract class C implements A, B {
        }
        class Class implements C {
          set setter(double _) => null; // testSetterNotSubtype:31
        }
        """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
             infos: MessageKind.INVALID_OVERRIDDEN_SETTER),

  check("""
        class A {
          set setter(int _) => null; // testSetterNotSubtype:32
        }
        class B {
          set setter(num _) => null; // testSetterNotSubtype:33
        }
        abstract class C implements A, B {
        }
        class Class implements C {
          set setter(String _) => null; // testSetterNotSubtype:34
        }
        """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
                        MessageKind.INVALID_OVERRIDE_SETTER],
             infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
                     MessageKind.INVALID_OVERRIDDEN_SETTER]),
  ]);
}

Future testFieldNotSubtype() {
  return Future.wait([
    check("""
          class A {
            int field; // testFieldNotSubtype:1
          }
          class Class extends A {
            int field; // testFieldNotSubtype:2
          }
          """),

    check("""
          class A {
            num field; // testFieldNotSubtype:3
          }
          class Class extends A {
            int field; // testFieldNotSubtype:4
          }
          """),

    check("""
          class A {
            int field; // testFieldNotSubtype:5
          }
          class Class extends A {
            num field; // testFieldNotSubtype:6
          }
          """),

    check("""
          class A {
            int field; // testFieldNotSubtype:7
          }
          class Class extends A {
            double field; // testFieldNotSubtype:8
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_FIELD,
               infos: MessageKind.INVALID_OVERRIDDEN_FIELD),

    check("""
          class A {
            int field; // testFieldNotSubtype:9
          }
          class B extends A {
            num field; // testFieldNotSubtype:10
          }
          class Class extends B {
            double field; // testFieldNotSubtype:11
          }
          """),

    check("""
          class A {
            num field; // testFieldNotSubtype:12
          }
          class Class extends A {
            int get field => null; // testFieldNotSubtype:13
          }
          """),

    check("""
          class A {
            num field; // testFieldNotSubtype:14
          }
          class Class extends A {
            String get field => null; // testFieldNotSubtype:15
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
               infos: MessageKind.INVALID_OVERRIDDEN_FIELD),

    check("""
          class A {
            num get field => null; // testFieldNotSubtype:16
          }
          class Class extends A {
            String field; // testFieldNotSubtype:17
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
               infos: MessageKind.INVALID_OVERRIDDEN_GETTER),

    check("""
          class A {
            num field; // testFieldNotSubtype:18
          }
          class Class extends A {
            set field(int _) {} // testFieldNotSubtype:19
          }
          """),

    check("""
          class A {
            num field; // testFieldNotSubtype:19
          }
          class Class extends A {
            void set field(int _) {} // testFieldNotSubtype:20
          }
          """),

    check("""
          class A {
            set field(int _) {} // testFieldNotSubtype:21
          }
          class Class extends A {
            num field; // testFieldNotSubtype:22
          }
          """),

    check("""
          class A {
            void set field(int _) {} // testFieldNotSubtype:23
          }
          class Class extends A {
            num field; // testFieldNotSubtype:24
          }
          """),

    check("""
          class A {
            num field; // testFieldNotSubtype:25
          }
          class Class extends A {
            set field(String _) {} // testFieldNotSubtype:26
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,
               infos: MessageKind.INVALID_OVERRIDDEN_FIELD),

    check("""
          class A {
            set field(num _) {} // testFieldNotSubtype:27
          }
          class Class extends A {
            String field; // testFieldNotSubtype:28
          }
          """, warnings: MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,
               infos: MessageKind.INVALID_OVERRIDDEN_SETTER),

    check("""
          class A {
            int field; // testFieldNotSubtype:29
          }
          class Class implements A {
            String get field => null; // testFieldNotSubtype:30
            void set field(String s) {} // testFieldNotSubtype:31
          }
          """, warnings: [MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
                          MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER],
               infos: [MessageKind.INVALID_OVERRIDDEN_FIELD,
                       MessageKind.INVALID_OVERRIDDEN_FIELD]),


    check("""
          class A {
            String get field => null; // testFieldNotSubtype:32
            void set field(String s) {} // testFieldNotSubtype:33
          }
          class Class implements A {
            int field; // testFieldNotSubtype:34
          }
          """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
                          MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD],
               infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
                       MessageKind.INVALID_OVERRIDDEN_SETTER]),
  ]);
}

Future testMixedOverride() {
  return Future.wait([
    check("""
          class A {
            var member; // testMixedOverride:1
          }
          class Class extends A {
            member() {} // testMixedOverride:2
          }
          """, errors: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,
               infos: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT),

    check("""
          class A {
            member() {} // testMixedOverride:3
          }
          class Class extends A {
            var member; // testMixedOverride:4
          }
          """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD,
               infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT),

    check("""
          class A {
            get member => null; // testMixedOverride:5
          }
          class Class extends A {
            member() {} // testMixedOverride:6
          }
          """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
               infos: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT),

    check("""
          class A {
            member() {} // testMixedOverride:7
          }
          class Class extends A {
            get member => null; // testMixedOverride:8
          }
          """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
               infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT),

    check("""
          abstract class A {
            var member; // testMixedOverride:9
          }
          abstract class B {
            get member; // testMixedOverride:10
          }
          abstract class Class implements A, B {
          }
          """),

    check("""
          abstract class A {
            var member; // testMixedOverride:11
          }
          abstract class B {
            member() {} // testMixedOverride:12
          }
          abstract class Class implements A, B {
          }
          """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
               infos: [MessageKind.INHERITED_METHOD,
                       MessageKind.INHERITED_IMPLICIT_GETTER]),

    check("""
          abstract class A {
            get member; // testMixedOverride:13
          }
          abstract class B {
            member() {} // testMixedOverride:14
          }
          abstract class Class implements A, B {
          }
          """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
               infos: [MessageKind.INHERITED_METHOD,
                       MessageKind.INHERITED_EXPLICIT_GETTER]),

    check("""
          abstract class A {
            get member; // testMixedOverride:15
          }
          abstract class B {
            member() {} // testMixedOverride:16
          }
          abstract class C {
            var member; // testMixedOverride:17
          }
          abstract class D {
            member() {} // testMixedOverride:18
          }
          abstract class E {
            get member; // testMixedOverride:19
          }
          abstract class Class implements A, B, C, D, E {
          }
          """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
               infos: [MessageKind.INHERITED_EXPLICIT_GETTER,
                       MessageKind.INHERITED_METHOD,
                       MessageKind.INHERITED_IMPLICIT_GETTER,
                       MessageKind.INHERITED_METHOD,
                       MessageKind.INHERITED_EXPLICIT_GETTER]),

    check("""
          abstract class A {
            get member; // testMixedOverride:20
          }
          abstract class B {
            member() {} // testMixedOverride:21
          }
          abstract class C implements A, B {
          }
          class Class extends C {
            member() {} // testMixedOverride:22
          }
          """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
               warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
               infos: [MessageKind.INHERITED_METHOD,
                       MessageKind.INHERITED_EXPLICIT_GETTER,
                       MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT]),

    check("""
          abstract class A {
            get member; // testMixedOverride:23
          }
          abstract class B {
            member() {} // testMixedOverride:24
          }
          abstract class C implements A, B {
          }
          class Class extends C {
            get member => null; // testMixedOverride:25
          }
          """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
               warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
               infos: [MessageKind.INHERITED_METHOD,
                       MessageKind.INHERITED_EXPLICIT_GETTER,
                       MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT]),
  ]);
}

Future testAbstractMethods() {
  return Future.wait([
    check("""
          abstract class Class {
            method(); // testAbstractMethod:1
          }
          """),

    check("""
          class Class {
            method(); // testAbstractMethod:2
          }
          """, warnings: MessageKind.ABSTRACT_METHOD,
               infos: []),

    check("""
          class Class {
            get getter; // testAbstractMethod:3
          }
          """, warnings: MessageKind.ABSTRACT_GETTER,
               infos: []),

    check("""
          class Class {
            set setter(_); // testAbstractMethod:4
          }
          """, warnings: MessageKind.ABSTRACT_SETTER,
               infos: []),

    check("""
          abstract class A {
            method(); // testAbstractMethod:5
          }
          class Class extends A {
            method() {} // testAbstractMethod:6
          }
          """),

    check("""
          abstract class A {
            method(); // testAbstractMethod:7
          }
          class Class extends A {
            method([a]) {} // testAbstractMethod:8
          }
          """),

    check("""
          abstract class A {
            method(); // testAbstractMethod:9
          }
          class Class extends A {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

    check("""
          abstract class A {
            get getter; // testAbstractMethod:10
          }
          class Class extends A {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
               infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER),

    check("""
          abstract class A {
            set setter(_); // testAbstractMethod:11
          }
          class Class extends A {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
               infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER),

    check("""
          abstract class A {
            method(); // testAbstractMethod:12
          }
          class B {
            method() {} // testAbstractMethod:13
          }
          class Class extends A implements B {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_METHOD,
               infos: [MessageKind.UNIMPLEMENTED_METHOD_CONT,
                       MessageKind.UNIMPLEMENTED_METHOD_CONT]),

    check("""
          class Class implements Function {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
               infos: []),

    check("""
          abstract class A {
            get getter; // testAbstractMethod:14
          }
          class B {
            get getter => 0; // testAbstractMethod:15
          }
          class Class extends A implements B {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_GETTER,
               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
                       MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER]),

    check("""
          abstract class A {
            set setter(_); // testAbstractMethod:16
          }
          class B {
            set setter(_) {} // testAbstractMethod:17
          }
          class Class extends A implements B {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_SETTER,
               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
                       MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER]),

    check("""
          abstract class A {
            get field; // testAbstractMethod:18
          }
          class B {
            var field; // testAbstractMethod:19
          }
          class Class extends A implements B {
            set field(_) {} // testAbstractMethod:20
          }
          """, warnings: MessageKind.UNIMPLEMENTED_GETTER,
               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
                       MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER]),

    check("""
          abstract class A {
            set field(_); // testAbstractMethod:21
          }
          class B {
            var field; // testAbstractMethod:22
          }
          class Class extends A implements B {
            get field => 0; // testAbstractMethod:23
          }
          """, warnings: MessageKind.UNIMPLEMENTED_SETTER,
               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),

    check("""
          class A {
            method() {} // testAbstractMethod:24
          }
          class Class implements A {
            method() {} // testAbstractMethod:25
          }
          """),

    check("""
          class A {
            method() {} // testAbstractMethod:26
          }
          class Class implements A {
            method([a]) {} // testAbstractMethod:27
          }
          """),

    check("""
          class A {
            method() {} // testAbstractMethod:28
          }
          class Class implements A {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

    check("""
          class A {
            method() {} // testAbstractMethod:29
          }
          class B {
            method() {} // testAbstractMethod:30
          }
          class Class extends A implements B {
          }
          """),

    check("""
          class A {
            var member; // testAbstractMethod:31
          }
          class Class implements A {
          }
          """, warnings: [MessageKind.UNIMPLEMENTED_GETTER_ONE,
                          MessageKind.UNIMPLEMENTED_SETTER_ONE],
               infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),

    check("""
          class A {
            var member; // testAbstractMethod:32
          }
          class B {
            get member => null; // testAbstractMethod:33
            set member(_) {} // testAbstractMethod:34
          }
          class Class implements A, B {
          }
          """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,
                          MessageKind.UNIMPLEMENTED_SETTER],
               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
                       MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
                       MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),

    check("""
          class A {
            var member; // testAbstractMethod:35
          }
          class B {
            var member; // testAbstractMethod:36
          }
          class Class implements A, B {
          }
          """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,
                          MessageKind.UNIMPLEMENTED_SETTER],
               infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
                       MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER,
                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),

    check("""
          class A {
            get member => 0; // testAbstractMethod:37
          }
          class Class implements A {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
               infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER),

    check("""
          class A {
            set member(_) {} // testAbstractMethod:38
          }
          class Class implements A {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
               infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER),

    check("""
          class A {
            var member; // testAbstractMethod:39
          }
          class Class implements A {
            get member => 0;
          }
          """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
               infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER),

    check("""
          class A {
            var field; // testAbstractMethod:40
          }
          class Class implements A {
            final field = 0; // testAbstractMethod:41
          }
          """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
               infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER),

    check("""
          class A {
            var member; // testAbstractMethod:42
          }
          class Class implements A {
            set member(_) {}
          }
          """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
               infos: MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER),

    check("""
          abstract class A {
            method() {} // testAbstractMethod:43
          }
          class Class extends A {
            method();
          }
          """),
  ]);
}

Future testNoSuchMethod() {
  return Future.wait([
    check("""
          class Class {
            method(); // testNoSuchMethod:1
          }
          """, warnings: MessageKind.ABSTRACT_METHOD,
               infos: []),

    check("""
          @proxy
          class Class {
            method(); // testNoSuchMethod:2
          }
          """, warnings: MessageKind.ABSTRACT_METHOD,
               infos: []),

    check("""
          class Class {
            noSuchMethod(_) => null;
            method(); // testNoSuchMethod:3
          }
          """),

    check("""
          class Class {
            noSuchMethod(_, [__]) => null;
            method(); // testNoSuchMethod:4
          }
          """),

    check("""
          class Class {
            noSuchMethod(_);
            method(); // testNoSuchMethod:5
          }
          """),

    check("""
          abstract class A {
            method(); // testNoSuchMethod:6
          }
          class Class extends A {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

    check("""
          abstract class A {
            method(); // testNoSuchMethod:7
          }
          @proxy
          class Class extends A {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

    check("""
          abstract class A {
            method(); // testNoSuchMethod:8
          }
          class Class extends A {
            noSuchMethod(_) => null;
          }
          """),

    check("""
          class A {
            method() {} // testNoSuchMethod:9
          }
          class Class implements A {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

    check("""
          class A {
            method() {} // testNoSuchMethod:10
          }
          class Class implements A {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

    check("""
          class A {
            method() {} // testNoSuchMethod:11
          }
          @proxy
          class Class implements A {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),

    check("""
          class A {
            method() {} // testNoSuchMethod:12
          }
          class Class implements A {
            noSuchMethod(_) => null;
          }
          """),

    check("""
          class A {
            noSuchMethod(_) => null;
            method(); // testNoSuchMethod:13
          }
          class Class extends A {
          }
          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
  ]);
}
