// Copyright (c) 2018, 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/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/analysis/session_helper.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

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

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

@reflectiveTest
class AnalysisSessionHelperTest extends PubPackageResolutionTest {
  late final AnalysisSessionHelper helper;

  @override
  void setUp() {
    super.setUp();
    var session = contextFor(testFile).currentSession;
    helper = AnalysisSessionHelper(session);
  }

  test_getClass_defined() async {
    var file = newFile('$testPackageLibPath/c.dart', r'''
class C {}
int v = 0;
''');
    String uri = file.toUri().toString();

    var element = (await helper.getClass(uri, 'C'))!;
    expect(element.displayName, 'C');
  }

  test_getClass_defined_notClass() async {
    var file = newFile('$testPackageLibPath/c.dart', r'''
int v = 0;
''');
    String uri = file.toUri().toString();

    var element = await helper.getClass(uri, 'v');
    expect(element, isNull);
  }

  test_getClass_exported() async {
    newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
    var bFile = newFile('$testPackageLibPath/b.dart', r'''
export 'a.dart';
''');
    String bUri = bFile.toUri().toString();

    var element = (await helper.getClass(bUri, 'A'))!;
    expect(element.displayName, 'A');
  }

  test_getClass_imported() async {
    newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
    var bFile = newFile('$testPackageLibPath/b.dart', r'''
import 'a.dart';
''');
    String bUri = bFile.toUri().toString();

    var element = await helper.getClass(bUri, 'A');
    expect(element, isNull);
  }

  test_getElementDeclaration_class() async {
    await resolveTestCode(r'''
class A {}
''');
    var element = findElement.class_('A');
    var result = (await helper.getElementDeclaration(element))!;
    var node = result.node as ClassDeclaration;
    expect(node.name2.lexeme, 'A');
  }

  test_getResolvedUnitByElement() async {
    await resolveTestCode(r'''
class A {}
class B {}
''');
    var element = findNode.classDeclaration('A').declaredElement2!;
    var resolvedUnit = (await helper.getResolvedUnitByElement(element))!;
    expect(resolvedUnit.unit.declarations, hasLength(2));
  }

  test_getTopLevelPropertyAccessor_defined_getter() async {
    var file = newFile('$testPackageLibPath/test.dart', r'''
int get a => 0;
''');
    String uri = file.toUri().toString();

    var element = (await helper.getTopLevelPropertyAccessor(uri, 'a'))!;
    expect(element.kind, ElementKind.GETTER);
    expect(element.displayName, 'a');
  }

  test_getTopLevelPropertyAccessor_defined_setter() async {
    var file = newFile('$testPackageLibPath/test.dart', r'''
set a(_) {}
''');
    String uri = file.toUri().toString();

    var element = (await helper.getTopLevelPropertyAccessor(uri, 'a='))!;
    expect(element.kind, ElementKind.SETTER);
    expect(element.displayName, 'a');
  }

  test_getTopLevelPropertyAccessor_defined_variable() async {
    var file = newFile('$testPackageLibPath/test.dart', r'''
int a;
''');
    String uri = file.toUri().toString();

    var element = (await helper.getTopLevelPropertyAccessor(uri, 'a'))!;
    expect(element.kind, ElementKind.GETTER);
    expect(element.displayName, 'a');
  }

  test_getTopLevelPropertyAccessor_exported() async {
    newFile('$testPackageLibPath/a.dart', r'''
int a;
''');
    var bFile = newFile('$testPackageLibPath/b.dart', r'''
export 'a.dart';
''');
    String bUri = bFile.toUri().toString();

    var element = (await helper.getTopLevelPropertyAccessor(bUri, 'a'))!;
    expect(element.kind, ElementKind.GETTER);
    expect(element.displayName, 'a');
  }

  test_getTopLevelPropertyAccessor_imported() async {
    newFile('$testPackageLibPath/a.dart', r'''
int a;
''');
    var bFile = newFile('$testPackageLibPath/b.dart', r'''
import 'a.dart';
''');
    String bUri = bFile.toUri().toString();

    var element = await helper.getTopLevelPropertyAccessor(bUri, 'a');
    expect(element, isNull);
  }

  test_getTopLevelPropertyAccessor_notDefined() async {
    var file = newFile('$testPackageLibPath/test.dart', r'''
int a;
''');
    String uri = file.toUri().toString();

    var element = await helper.getTopLevelPropertyAccessor(uri, 'b');
    expect(element, isNull);
  }

  test_getTopLevelPropertyAccessor_notPropertyAccessor() async {
    var file = newFile('$testPackageLibPath/test.dart', r'''
int a() {}
''');
    String uri = file.toUri().toString();

    var element = await helper.getTopLevelPropertyAccessor(uri, 'a');
    expect(element, isNull);
  }
}
