blob: b99aa74d368314ec4849a3721ebe96c9e105d26a [file] [log] [blame]
// Copyright (c) 2014, 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/protocol/protocol.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/domain_analysis.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../mocks.dart';
import 'notification_navigation_test.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(GetNavigationTest);
});
}
@reflectiveTest
class GetNavigationTest extends AbstractNavigationTest {
static const String requestId = 'test-getNavigation';
@override
void setUp() {
generateSummaryFiles = true;
super.setUp();
server.handlers = [
new AnalysisDomainHandler(server),
];
createProject();
}
test_beforeAnalysisComplete() async {
addTestFile('''
main() {
var test = 0;
print(test);
}
''');
await _getNavigation(testFile, testCode.indexOf('test);'), 0);
assertHasRegion('test);');
assertHasTarget('test = 0');
}
test_fieldType() async {
// This test mirrors test_navigation() from
// test/integration/analysis/get_navigation_test.dart
String text = r'''
class Foo {}
class Bar {
Foo foo;
}
''';
addTestFile(text);
await _getNavigation(testFile, text.indexOf('Foo foo'), 0);
expect(targets, hasLength(1));
NavigationTarget target = targets.first;
expect(target.kind, ElementKind.CLASS);
expect(target.offset, text.indexOf('Foo {'));
expect(target.length, 3);
expect(target.startLine, 1);
expect(target.startColumn, 7);
}
test_fileDoesNotExist() async {
String file = convertPath('$projectPath/doesNotExist.dart');
Request request = _createGetNavigationRequest(file, 0, 100);
Response response = await serverChannel.sendRequest(request);
expect(response.error, isNull);
expect(response.result['files'], isEmpty);
expect(response.result['targets'], isEmpty);
expect(response.result['regions'], isEmpty);
}
test_fileOutsideOfRoot() async {
testFile = convertPath('/outside.dart');
addTestFile('''
main() {
var test = 0;
print(test);
}
''');
await _getNavigation(testFile, testCode.indexOf('test);'), 0);
assertHasRegion('test);');
assertHasTarget('test = 0');
}
test_importDirective() async {
addTestFile('''
import 'dart:math';
main() {
}''');
await waitForTasksFinished();
await _getNavigation(testFile, 0, 17);
expect(regions, hasLength(1));
assertHasRegionString("'dart:math'");
expect(testTargets, hasLength(1));
expect(testTargets[0].kind, ElementKind.LIBRARY);
}
test_importKeyword() async {
addTestFile('''
import 'dart:math';
main() {
}''');
await waitForTasksFinished();
await _getNavigation(testFile, 0, 1);
expect(regions, hasLength(1));
assertHasRegionString("'dart:math'");
expect(testTargets, hasLength(1));
expect(testTargets[0].kind, ElementKind.LIBRARY);
}
test_importUri() async {
addTestFile('''
import 'dart:math';
main() {
}''');
await waitForTasksFinished();
await _getNavigation(testFile, 7, 11);
expect(regions, hasLength(1));
assertHasRegionString("'dart:math'");
expect(testTargets, hasLength(1));
expect(testTargets[0].kind, ElementKind.LIBRARY);
}
test_invalidFilePathFormat_notAbsolute() async {
var request = _createGetNavigationRequest('test.dart', 0, 0);
var response = await waitResponse(request);
expect(
response,
isResponseFailure(requestId, RequestErrorCode.INVALID_FILE_PATH_FORMAT),
);
}
test_invalidFilePathFormat_notNormalized() async {
var request =
_createGetNavigationRequest(convertPath('/foo/../bar/test.dart'), 0, 0);
var response = await waitResponse(request);
expect(
response,
isResponseFailure(requestId, RequestErrorCode.INVALID_FILE_PATH_FORMAT),
);
}
test_multipleRegions() async {
addTestFile('''
main() {
var aaa = 1;
var bbb = 2;
var ccc = 3;
var ddd = 4;
print(aaa + bbb + ccc + ddd);
}
''');
await waitForTasksFinished();
// request navigation
String navCode = ' + bbb + ';
await _getNavigation(testFile, testCode.indexOf(navCode), navCode.length);
// verify
{
assertHasRegion('aaa +');
assertHasTarget('aaa = 1');
}
{
assertHasRegion('bbb +');
assertHasTarget('bbb = 2');
}
{
assertHasRegion('ccc +');
assertHasTarget('ccc = 3');
}
assertNoRegionAt('ddd)');
}
test_operator_index() async {
addTestFile('''
class A {
A operator [](index) => null;
operator []=(index, A value) {}
}
main() {
var a = new A();
a[0] // [];
a[1] = 1; // []=;
a[2] += 2;
}
''');
await waitForTasksFinished();
{
String search = '[0';
await _getNavigation(testFile, testCode.indexOf(search), 1);
assertHasOperatorRegion(search, 1, '[](index)', 2);
}
{
String search = '] // []';
await _getNavigation(testFile, testCode.indexOf(search), 1);
assertHasOperatorRegion(search, 1, '[](index)', 2);
}
{
String search = '[1';
await _getNavigation(testFile, testCode.indexOf(search), 1);
assertHasOperatorRegion(search, 1, '[]=(index', 3);
}
{
String search = '] = 1';
await _getNavigation(testFile, testCode.indexOf(search), 1);
assertHasOperatorRegion(search, 1, '[]=(index', 3);
}
{
String search = '[2';
await _getNavigation(testFile, testCode.indexOf(search), 1);
assertHasOperatorRegion(search, 1, '[]=(index', 3);
}
{
String search = '] += 2';
await _getNavigation(testFile, testCode.indexOf(search), 1);
assertHasOperatorRegion(search, 1, '[]=(index', 3);
}
}
test_zeroLength_end() async {
addTestFile('''
main() {
var test = 0;
print(test);
}
''');
await waitForTasksFinished();
await _getNavigation(testFile, testCode.indexOf(');'), 0);
assertHasRegion('test);');
assertHasTarget('test = 0');
}
test_zeroLength_start() async {
addTestFile('''
main() {
var test = 0;
print(test);
}
''');
await waitForTasksFinished();
await _getNavigation(testFile, testCode.indexOf('test);'), 0);
assertHasRegion('test);');
assertHasTarget('test = 0');
}
Request _createGetNavigationRequest(String file, int offset, int length) {
return new AnalysisGetNavigationParams(file, offset, length)
.toRequest(requestId);
}
_getNavigation(String file, int offset, int length) async {
Request request = _createGetNavigationRequest(file, offset, length);
Response response = await serverChannel.sendRequest(request);
AnalysisGetNavigationResult result =
new AnalysisGetNavigationResult.fromResponse(response);
targetFiles = result.files;
targets = result.targets;
regions = result.regions;
}
}