// 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:analyzer/src/test_utilities/package_mixin.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../dart/resolution/driver_resolution.dart';

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

@reflectiveTest
class InvalidOverrideOfNonVirtualMemberTest extends DriverResolutionTest
    with PackageMixin {
  @override
  setUp() {
    super.setUp();
    addMetaPackage();
  }

  test_class_field() async {
    await assertErrorsInCode(r'''
import 'package:meta/meta.dart';

class C {
  @nonVirtual
  int g = 0;
}

class B extends C  {
  @override
  int g = 0;
}
''', [
      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 113, 1),
    ]);
  }

  test_class_field_2() async {
    await assertErrorsInCode(r'''
import 'package:meta/meta.dart';

class C {
  @nonVirtual
  int g = 0;
}

class B extends C  {
  int g = 0, h = 1;
}
''', [
      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 101, 1),
    ]);
  }

  test_class_field_overriddenByGetter() async {
    await assertErrorsInCode(r'''
import 'package:meta/meta.dart';

class C {
  @nonVirtual
  int g = 0;
}

class B extends C  {
  @override
  int get g => 0;
}
''', [
      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 117, 1),
    ]);
  }

  test_class_field_overriddenBySetter() async {
    await assertErrorsInCode(r'''
import 'package:meta/meta.dart';

class C {
  @nonVirtual
  int g = 0;
}

class B extends C  {
  @override
  set g(int v) {}
}
''', [
      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 113, 1),
    ]);
  }

  test_class_getter() async {
    await assertErrorsInCode(r'''
import 'package:meta/meta.dart';

class C {
  @nonVirtual
  int get g => 0;
}

class B extends C  {
  @override
  int get g => 0;
}
''', [
      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 122, 1),
    ]);
  }

  test_class_getter_overriddenByField() async {
    await assertErrorsInCode(r'''
import 'package:meta/meta.dart';

class C {
  @nonVirtual
  int get g => 0;
}

class B extends C  {
  @override
  int g = 0;
}
''', [
      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 118, 1),
    ]);
  }

  test_class_implements_getter() async {
    await assertNoErrorsInCode(r'''
import 'package:meta/meta.dart';

class C {
  @nonVirtual
  int get g => 0;
}

class B implements C  {
  @override
  int get g => 0; //OK
}
''');
  }

  test_class_implements_method() async {
    await assertNoErrorsInCode(r'''
import 'package:meta/meta.dart';

class C {
  @nonVirtual
  void f() {}
}

class B implements C  {
  @override
  void f() {} //OK
}
''');
  }

  test_class_method() async {
    await assertErrorsInCode(r'''
import 'package:meta/meta.dart';

class C {
  @nonVirtual
  void f() {}
}

class B extends C  {
  @override
  void f() {}
}
''', [
      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 115, 1),
    ]);
  }

  test_class_setter() async {
    await assertErrorsInCode(r'''
import 'package:meta/meta.dart';

class C {
  @nonVirtual
  set g(int v) {}
}

class B extends C  {
  @override
  set g(int v) {}
}
''', [
      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 118, 1),
    ]);
  }

  test_class_setter_overriddenByField() async {
    await assertErrorsInCode(r'''
import 'package:meta/meta.dart';

class C {
  @nonVirtual
  set g(int v) {}
}

class B extends C  {
  @override
  int g = 0;
}
''', [
      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 118, 1),
    ]);
  }

  test_mixin_method() async {
    await assertErrorsInCode(r'''
import 'package:meta/meta.dart';

mixin M {
  @nonVirtual
  void f() {}
}

class B with M {
  @override
  void f() {}
}
''', [
      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 111, 1),
    ]);
  }

  test_mixin_setter() async {
    await assertErrorsInCode(r'''
import 'package:meta/meta.dart';

mixin M {
  @nonVirtual
  set g(int v) {}
}

class B with M {
  @override
  set g(int v) {}
}
''', [
      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 114, 1),
    ]);
  }
}
