Index: pkg/analyzer/test/src/dart/analysis/search_test.dart |
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..03a2a5316bdaa43d6b602c59e6f67cec0817b8a9 |
--- /dev/null |
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart |
@@ -0,0 +1,168 @@ |
+// 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)); |
+ } |
+} |