blob: 03a2a5316bdaa43d6b602c59e6f67cec0817b8a9 [file] [log] [blame]
// Copyright (c) 2016, 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 'dart:async';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/analysis/search.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'base.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(SearchTest);
});
}
class ExpectedResult {
final List<String> enclosingComponents;
final SearchResultKind kind;
final int offset;
final int length;
final bool isResolved;
final bool isQualified;
ExpectedResult(this.enclosingComponents, this.kind, this.offset, this.length,
{this.isResolved: true, this.isQualified: false});
bool operator ==(Object result) {
return result is SearchResult &&
result.kind == this.kind &&
result.isResolved == this.isResolved &&
result.isQualified == this.isQualified &&
result.offset == this.offset &&
hasExpectedComponents(result.enclosingElement);
}
bool hasExpectedComponents(Element element) {
for (int i = enclosingComponents.length - 1; i >= 0; i--) {
if (element == null) {
return false;
}
if (element is CompilationUnitElement) {
if (element.source.uri.toString() != enclosingComponents[0]) {
return false;
}
} else if (element.name != enclosingComponents[i]) {
return false;
}
element = element.enclosingElement;
}
return true;
}
@override
String toString() {
StringBuffer buffer = new StringBuffer();
buffer.write("ExpectedResult(kind=");
buffer.write(kind);
buffer.write(", enclosingComponents=");
buffer.write(enclosingComponents);
buffer.write(", offset=");
buffer.write(offset);
buffer.write(", length=");
buffer.write(length);
buffer.write(", isResolved=");
buffer.write(isResolved);
buffer.write(", isQualified=");
buffer.write(isQualified);
buffer.write(")");
return buffer.toString();
}
}
@reflectiveTest
class SearchTest extends BaseAnalysisDriverTest {
static const testUri = 'package:test/test.dart';
test_searchReferences_Label() async {
addTestFile('''
main() {
label:
while (true) {
if (true) {
break label; // 1
}
break label; // 2
}
}
''');
int offset = findOffset('label:');
List<String> main = [testUri, 'main'];
var expected = [
_expectId(main, SearchResultKind.REFERENCE, 'label; // 1'),
_expectId(main, SearchResultKind.REFERENCE, 'label; // 2')
];
await _verifyReferences(offset, expected);
}
test_searchReferences_localVariable() async {
addTestFile(r'''
main() {
var v;
v = 1;
v += 2;
print(v);
v();
}
''');
int offset = findOffset('v;');
List<String> main = [testUri, 'main'];
var expected = [
_expectId(main, SearchResultKind.WRITE, 'v = 1;'),
_expectId(main, SearchResultKind.READ_WRITE, 'v += 2;'),
_expectId(main, SearchResultKind.READ, 'v);'),
_expectId(main, SearchResultKind.INVOCATION, 'v();')
];
await _verifyReferences(offset, expected);
}
test_searchReferences_localVariable_inForEachLoop() async {
addTestFile('''
main() {
for (var v in []) {
v = 1;
v += 2;
print(v);
v();
}
}
''');
int offset = findOffset('v in []');
List<String> main = [testUri, 'main'];
var expected = [
_expectId(main, SearchResultKind.WRITE, 'v = 1;'),
_expectId(main, SearchResultKind.READ_WRITE, 'v += 2;'),
_expectId(main, SearchResultKind.READ, 'v);'),
_expectId(main, SearchResultKind.INVOCATION, 'v();')
];
await _verifyReferences(offset, expected);
}
ExpectedResult _expectId(
List<String> enclosingComponents, SearchResultKind kind, String search,
{int length, bool isResolved: true, bool isQualified: false}) {
int offset = findOffset(search);
if (length == null) {
length = getLeadingIdentifierLength(search);
}
return new ExpectedResult(enclosingComponents, kind, offset, length,
isResolved: isResolved, isQualified: isQualified);
}
Future _verifyReferences(
int offset, List<ExpectedResult> expectedMatches) async {
List<SearchResult> results =
await driver.search.references(testFile, offset);
_assertResults(results, expectedMatches);
expect(results, hasLength(expectedMatches.length));
}
static void _assertResults(
List<SearchResult> matches, List<ExpectedResult> expectedMatches) {
expect(matches, unorderedEquals(expectedMatches));
}
}