// 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:analysis_server/src/services/search/element_visitors.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../../abstract_single_unit.dart';

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

@reflectiveTest
class FindElementByNameOffsetTest extends AbstractSingleUnitTest {
  test_class() async {
    await resolveTestUnit(r'''
class AAA {}
class BBB {}
''');
    _assertElement(6, ElementKind.CLASS, 'AAA');
    _assertElement(19, ElementKind.CLASS, 'BBB');
  }

  test_function() async {
    await resolveTestUnit(r'''
void aaa() {}
void bbb() {}
''');
    _assertElement(5, ElementKind.FUNCTION, 'aaa');
    _assertElement(19, ElementKind.FUNCTION, 'bbb');
  }

  test_null() async {
    await resolveTestUnit(r'''
class AAA {}
class BBB {}
''');
    expect(findElementByNameOffset(null, 0), isNull);

    expect(findElementByNameOffset(testUnitElement, 0), isNull);
    expect(findElementByNameOffset(testUnitElement, 1), isNull);

    expect(findElementByNameOffset(testUnitElement, 5), isNull);
    expect(findElementByNameOffset(testUnitElement, 7), isNull);
  }

  test_topLevelVariable() async {
    await resolveTestUnit(r'''
int aaa, bbb;
int ccc;
''');
    _assertElement(4, ElementKind.TOP_LEVEL_VARIABLE, 'aaa');
    _assertElement(9, ElementKind.TOP_LEVEL_VARIABLE, 'bbb');
    _assertElement(18, ElementKind.TOP_LEVEL_VARIABLE, 'ccc');
  }

  void _assertElement(int nameOffset, ElementKind kind, String name) {
    var element = findElementByNameOffset(testUnitElement, nameOffset);
    expect(element, isNotNull);
    expect(element.kind, kind);
    expect(element.name, name);
  }
}
