// 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);
    dynamic mainApp = compiler.mainApp;
    var cls = mainApp.find('Class');
    cls.ensureResolved(compiler.resolution);
    MembersCreator.computeAllClassMembers(compiler.resolution, cls);

    toList(o) => o == null ? [] : o is List ? o : [o];

    compareMessageKinds(
        source, toList(errors), compiler.diagnosticCollector.errors, 'error');

    compareMessageKinds(source, toList(warnings),
        compiler.diagnosticCollector.warnings, 'warning');

    if (infos != null) {
      compareMessageKinds(
          source, toList(infos), compiler.diagnosticCollector.infos, 'info');
    }

    if (hints != null) {
      compareMessageKinds(
          source, toList(hints), compiler.diagnosticCollector.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 {
          }
          """),
  ]);
}
