blob: 8ab0aa35ea55f0f33a0ee0ac887d38695d0a4cb5 [file] [log] [blame]
// 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:analysis_server/lsp_protocol/protocol_generated.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'server_abstract.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(OutlineTest);
});
}
@reflectiveTest
class OutlineTest extends AbstractLspAnalysisServerTest {
Future<void> test_afterChange() async {
final initialContent = 'class A {}';
final updatedContent = 'class B {}';
await initialize(initializationOptions: {'outline': true});
final outlineUpdateBeforeChange = waitForOutline(mainFileUri);
openFile(mainFileUri, initialContent);
final outlineBeforeChange = await outlineUpdateBeforeChange;
final outlineUpdateAfterChange = waitForOutline(mainFileUri);
replaceFile(1, mainFileUri, updatedContent);
final outlineAfterChange = await outlineUpdateAfterChange;
expect(outlineBeforeChange, isNotNull);
expect(outlineBeforeChange.children, hasLength(1));
expect(outlineBeforeChange.children[0].element.name, equals('A'));
expect(outlineAfterChange, isNotNull);
expect(outlineAfterChange.children, hasLength(1));
expect(outlineAfterChange.children[0].element.name, equals('B'));
}
Future<void> test_extensions() async {
final initialContent = '''
extension StringExtensions on String {}
extension on String {}
''';
await initialize(initializationOptions: {'outline': true});
final outlineUpdate = waitForOutline(mainFileUri);
openFile(mainFileUri, initialContent);
final outline = await outlineUpdate;
expect(outline, isNotNull);
expect(outline.children, hasLength(2));
expect(outline.children[0].element.name, equals('StringExtensions'));
expect(outline.children[1].element.name, equals('<unnamed extension>'));
}
Future<void> test_initial() async {
final content = '''
/// a
class A {
/// b
b() {
/// c
c() {}
}
/// d
num get d => 1;
}
''';
await initialize(initializationOptions: {'outline': true});
final outlineNotification = waitForOutline(mainFileUri);
openFile(mainFileUri, content);
final outline = await outlineNotification;
expect(outline, isNotNull);
// Root node is entire document
expect(
outline.range,
equals(Range(
start: Position(line: 0, character: 0),
end: Position(line: 11, character: 0))));
expect(outline.children, hasLength(1));
// class A
final classA = outline.children[0];
expect(classA.element.name, equals('A'));
expect(classA.element.kind, equals('CLASS'));
expect(
classA.element.range,
equals(Range(
start: Position(line: 1, character: 6),
end: Position(line: 1, character: 7))));
expect(
classA.range,
equals(Range(
start: Position(line: 0, character: 0),
end: Position(line: 10, character: 1))));
expect(
classA.codeRange,
equals(Range(
start: Position(line: 1, character: 0),
end: Position(line: 10, character: 1))));
expect(classA.children, hasLength(2));
// b()
final methodB = classA.children[0];
expect(methodB.element.name, equals('b'));
expect(methodB.element.kind, equals('METHOD'));
expect(
methodB.element.range,
equals(Range(
start: Position(line: 3, character: 2),
end: Position(line: 3, character: 3))));
expect(
methodB.range,
equals(Range(
start: Position(line: 2, character: 2),
end: Position(line: 6, character: 3))));
expect(
methodB.codeRange,
equals(Range(
start: Position(line: 3, character: 2),
end: Position(line: 6, character: 3))));
expect(methodB.children, hasLength(1));
// c()
final methodC = methodB.children[0];
expect(methodC.element.name, equals('c'));
expect(methodC.element.kind, equals('FUNCTION'));
expect(
methodC.element.range,
equals(Range(
start: Position(line: 5, character: 4),
end: Position(line: 5, character: 5))));
// TODO(dantup): This one seems to be excluding its dartdoc?
// should be line 4 for the starting range.
// https://github.com/dart-lang/sdk/issues/39746
expect(
methodC.range,
equals(Range(
start: Position(line: 5, character: 4),
end: Position(line: 5, character: 10))));
expect(
methodC.codeRange,
equals(Range(
start: Position(line: 5, character: 4),
end: Position(line: 5, character: 10))));
expect(methodC.children, isNull);
// num get d
final fieldD = classA.children[1];
expect(fieldD.element.name, equals('d'));
expect(fieldD.element.kind, equals('GETTER'));
expect(
fieldD.element.range,
equals(Range(
start: Position(line: 9, character: 10),
end: Position(line: 9, character: 11))));
expect(
fieldD.range,
equals(Range(
start: Position(line: 8, character: 2),
end: Position(line: 9, character: 17))));
expect(
fieldD.codeRange,
equals(Range(
start: Position(line: 9, character: 2),
end: Position(line: 9, character: 17))));
expect(fieldD.children, isNull);
}
}