// 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 '../../generated/test_support.dart';
import '../dart/resolution/context_collection_resolution.dart';

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

@reflectiveTest
class InvalidUseOfVisibleForTestingMemberTest extends PubPackageResolutionTest {
  @override
  String get testPackageRootPath => '/home/my';

  @override
  void setUp() {
    super.setUp();
    writeTestPackageConfigWithMeta();
  }

  test_export_hide() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
import 'package:meta/meta.dart';

@visibleForTesting
class A {}

class B {}
''');

    newFile('$testPackageLibPath/b.dart', content: r'''
export 'a.dart' hide A;
''');

    await _resolveFile('$testPackageLibPath/a.dart');
    await _resolveFile('$testPackageLibPath/b.dart');
  }

  test_export_show() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
import 'package:meta/meta.dart';

@visibleForTesting
class A {}

class B {}
''');

    newFile('$testPackageLibPath/b.dart', content: r'''
export 'a.dart' show A;
''');

    await _resolveFile('$testPackageLibPath/a.dart');
    await _resolveFile('$testPackageLibPath/b.dart');
  }

  test_fromIntegrationTestDirectory() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
class A {
  @visibleForTesting
  void a(){ }
}
''');
    newFile('$testPackageRootPath/integration_test/test.dart', content: r'''
import '../lib1.dart';
class B {
  void b() => new A().a();
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/integration_test/test.dart');
  }

  test_fromTestDirectory() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
class A {
  @visibleForTesting
  void a(){ }
}
''');
    newFile('$testPackageRootPath/test/test.dart', content: r'''
import '../lib1.dart';
class B {
  void b() => new A().a();
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/test/test.dart');
  }

  test_fromTestDriverDirectory() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
class A {
  @visibleForTesting
  void a(){ }
}
''');
    newFile('$testPackageRootPath/test_driver/test.dart', content: r'''
import '../lib1.dart';
class B {
  void b() => new A().a();
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/test_driver/test.dart');
  }

  test_fromTestingDirectory() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
class A {
  @visibleForTesting
  void a(){ }
}
''');
    newFile('$testPackageRootPath/testing/lib1.dart', content: r'''
import '../lib1.dart';
class C {
  void b() => new A().a();
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/testing/lib1.dart');
  }

  test_functionInExtension() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
extension E on List {
  @visibleForTesting
  int m() => 1;
}
''');
    newFile('$testPackageRootPath/lib2.dart', content: r'''
import 'lib1.dart';
void main() {
  E([]).m();
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/lib2.dart', [
      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER, 42, 1),
    ]);
  }

  test_functionInExtension_fromTestDirectory() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
extension E on List {
  @visibleForTesting
  int m() => 1;
}
''');
    newFile('$testPackageRootPath/test/test.dart', content: r'''
import '../lib1.dart';
void main() {
  E([]).m();
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/test/test.dart');
  }

  test_getter() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
class A {
  @visibleForTesting
  int get a => 7;
}
''');
    newFile('$testPackageRootPath/lib2.dart', content: r'''
import 'lib1.dart';
void main() {
  new A().a;
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/lib2.dart', [
      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER, 44, 1),
    ]);
  }

  test_import_hide() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
import 'package:meta/meta.dart';

@visibleForTesting
class A {}

class B {}
''');

    newFile('$testPackageLibPath/b.dart', content: r'''
import 'a.dart' hide A;

void f(B _) {}
''');

    await _resolveFile('$testPackageLibPath/a.dart');
    await _resolveFile('$testPackageLibPath/b.dart');
  }

  test_import_show() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
import 'package:meta/meta.dart';

@visibleForTesting
class A {}

class B {}
''');

    newFile('$testPackageLibPath/b.dart', content: r'''
import 'a.dart' show A;

void f(A _) {}
''');

    await _resolveFile('$testPackageLibPath/a.dart');
    await _resolveFile('$testPackageLibPath/b.dart', [
      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER, 21, 1),
      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER, 32, 1),
    ]);
  }

  test_method() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
class A {
  @visibleForTesting
  void a(){ }
}
''');
    newFile('$testPackageRootPath/lib2.dart', content: r'''
import 'lib1.dart';
class B {
  void b() => new A().a();
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/lib2.dart', [
      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER, 52, 1),
    ]);
  }

  test_mixin() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
mixin M {
  @visibleForTesting
  int m() => 1;
}
class C with M {}
''');
    newFile('$testPackageRootPath/lib2.dart', content: r'''
import 'lib1.dart';
void main() {
  C().m();
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/lib2.dart', [
      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER, 40, 1),
    ]);
  }

  test_namedConstructor() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
class A {
  int _x;

  @visibleForTesting
  A.forTesting(this._x);
}
''');
    newFile('$testPackageRootPath/lib2.dart', content: r'''
import 'lib1.dart';
void main() {
  new A.forTesting(0);
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart', [
      error(HintCode.UNUSED_FIELD, 49, 2),
    ]);
    await _resolveFile('$testPackageRootPath/lib2.dart', [
      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER, 40, 12,
          messageContains: 'A.forTesting'),
    ]);
  }

  test_protectedAndForTesting_usedAsProtected() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
class A {
  @protected
  @visibleForTesting
  void a(){ }
}
''');
    newFile('$testPackageRootPath/lib2.dart', content: r'''
import 'lib1.dart';
class B extends A {
  void b() => new A().a();
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/lib2.dart');
  }

  test_protectedAndForTesting_usedAsTesting() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
class A {
  @protected
  @visibleForTesting
  void a(){ }
}
''');
    newFile('$testPackageRootPath/test/test1.dart', content: r'''
import '../lib1.dart';
void main() {
  new A().a();
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/test/test1.dart');
  }

  test_setter() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
class A {
  @visibleForTesting
  set b(_) => 7;
}
''');
    newFile('$testPackageRootPath/lib2.dart', content: r'''
import 'lib1.dart';
void main() {
  new A().b = 6;
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/lib2.dart', [
      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER, 44, 1),
    ]);
  }

  test_topLevelFunction() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
@visibleForTesting
int fn0() => 1;
''');
    newFile('$testPackageRootPath/lib2.dart', content: r'''
import 'lib1.dart';
void main() {
  fn0();
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/lib2.dart', [
      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER, 36, 3),
    ]);
  }

  test_topLevelVariable() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
@visibleForTesting
int a = 7;
''');
    newFile('$testPackageRootPath/lib2.dart', content: r'''
import 'lib1.dart';
void main() {
  a;
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart');
    await _resolveFile('$testPackageRootPath/lib2.dart', [
      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER, 36, 1),
    ]);
  }

  test_unnamedConstructor() async {
    newFile('$testPackageRootPath/lib1.dart', content: r'''
import 'package:meta/meta.dart';
class A {
  int _x;

  @visibleForTesting
  A(this._x);
}
''');
    newFile('$testPackageRootPath/lib2.dart', content: r'''
import 'lib1.dart';
void main() {
  new A(0);
}
''');

    await _resolveFile('$testPackageRootPath/lib1.dart', [
      error(HintCode.UNUSED_FIELD, 49, 2),
    ]);
    await _resolveFile('$testPackageRootPath/lib2.dart', [
      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER, 40, 1),
    ]);
  }

  /// Resolve the file with the given [path].
  ///
  /// Similar to ResolutionTest.resolveTestFile, but a custom path is supported.
  Future<void> _resolveFile(
    String path, [
    List<ExpectedError> expectedErrors = const [],
  ]) async {
    result = await resolveFile(convertPath(path));
    assertErrorsInResolvedUnit(result, expectedErrors);
  }
}
