// Copyright (c) 2019, 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 'package:analyzer/src/error/codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../dart/resolution/context_collection_resolution.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(ConcreteClassWithAbstractMemberTest);
  });
}

@reflectiveTest
class ConcreteClassWithAbstractMemberTest extends PubPackageResolutionTest {
  test_abstract_field() async {
    await assertErrorsInCode(
      '''
class A {
  abstract int? x;
}
''',
      [
        error(
          CompileTimeErrorCode.concreteClassWithAbstractMember,
          12,
          16,
          text: "'x' must have a method body because 'A' isn't abstract.",
        ),
      ],
    );
  }

  test_abstract_field_final() async {
    await assertErrorsInCode(
      '''
class A {
  abstract final int? x;
}
''',
      [
        error(
          CompileTimeErrorCode.concreteClassWithAbstractMember,
          12,
          22,
          text: "'x' must have a method body because 'A' isn't abstract.",
        ),
      ],
    );
  }

  test_direct() async {
    await assertErrorsInCode(
      '''
class A {
  m();
}''',
      [error(CompileTimeErrorCode.concreteClassWithAbstractMember, 12, 4)],
    );
  }

  test_external_field() async {
    await assertNoErrorsInCode('''
class A {
  external int? x;
}
''');
  }

  test_external_field_final() async {
    await assertNoErrorsInCode('''
class A {
  external final int? x;
}
''');
  }

  test_noSuchMethod_interface() async {
    await assertErrorsInCode(
      '''
class I {
  noSuchMethod(v) => '';
}
class A implements I {
  m();
}''',
      [error(CompileTimeErrorCode.concreteClassWithAbstractMember, 62, 4)],
    );
  }

  test_setter() async {
    await assertErrorsInCode(
      '''
class A {
  set s(int i);
}
''',
      [
        error(
          CompileTimeErrorCode.concreteClassWithAbstractMember,
          12,
          13,
          text: "'s' must have a method body because 'A' isn't abstract.",
        ),
      ],
    );
  }
}
