Skip to content

Commit

Permalink
tests for keyword/identifier replacementOffset - asserts fixes #23906
Browse files Browse the repository at this point in the history
  • Loading branch information
danrubel committed Aug 15, 2015
1 parent 65652fd commit e2f6739
Show file tree
Hide file tree
Showing 2 changed files with 192 additions and 47 deletions.
132 changes: 86 additions & 46 deletions pkg/analysis_server/test/domain_completion_test.dart
Expand Up @@ -55,14 +55,9 @@ class CompletionManagerTest extends AbstractAnalysisTest {
ExtensionManager manager = new ExtensionManager();
ServerPlugin serverPlugin = new ServerPlugin();
manager.processPlugins([serverPlugin]);
return new Test_AnalysisServer(
super.serverChannel,
super.resourceProvider,
super.packageMapProvider,
index,
serverPlugin,
new AnalysisServerOptions(),
new MockSdk(),
return new Test_AnalysisServer(super.serverChannel, super.resourceProvider,
super.packageMapProvider, index, serverPlugin,
new AnalysisServerOptions(), new MockSdk(),
InstrumentationService.NULL_SERVICE);
}

Expand Down Expand Up @@ -268,7 +263,7 @@ class CompletionTest extends AbstractAnalysisTest {
List<CompletionSuggestion> suggestions = [];
bool suggestionsDone = false;

String addTestFile(String content, {offset}) {
String addTestFile(String content, {int offset}) {
completionOffset = content.indexOf('^');
if (offset != null) {
expect(completionOffset, -1, reason: 'cannot supply offset and ^');
Expand All @@ -283,9 +278,10 @@ class CompletionTest extends AbstractAnalysisTest {
}

void assertHasResult(CompletionSuggestionKind kind, String completion,
[int relevance = DART_RELEVANCE_DEFAULT,
bool isDeprecated = false,
bool isPotential = false]) {
{int relevance: DART_RELEVANCE_DEFAULT,
bool isDeprecated: false,
bool isPotential: false,
int selectionOffset}) {
var cs;
suggestions.forEach((s) {
if (s.completion == completion) {
Expand All @@ -302,7 +298,7 @@ class CompletionTest extends AbstractAnalysisTest {
}
expect(cs.kind, equals(kind));
expect(cs.relevance, equals(relevance));
expect(cs.selectionOffset, equals(completion.length));
expect(cs.selectionOffset, selectionOffset ?? completion.length);
expect(cs.selectionLength, equals(0));
expect(cs.isDeprecated, equals(isDeprecated));
expect(cs.isPotential, equals(isPotential));
Expand Down Expand Up @@ -386,6 +382,64 @@ class CompletionTest extends AbstractAnalysisTest {
});
}

test_imports_incremental() async {
addTestFile('''library foo;
e^
import "dart:async";
import "package:foo/foo.dart";
class foo { }''');
await waitForTasksFinished();
server.updateContent('uc1', {testFile: new AddContentOverlay(testCode)});
server.updateContent('uc2', {
testFile:
new ChangeContentOverlay([new SourceEdit(completionOffset, 0, 'xp')])
});
completionOffset += 2;
await getSuggestions();
expect(replacementOffset, completionOffset - 3);
expect(replacementLength, 3);
assertHasResult(CompletionSuggestionKind.KEYWORD, 'export',
relevance: DART_RELEVANCE_HIGH);
assertHasResult(CompletionSuggestionKind.KEYWORD, 'import',
relevance: DART_RELEVANCE_HIGH);
assertNoResult('extends');
assertNoResult('library');
}

test_imports_partial() async {
addTestFile('''^
import "package:foo/foo.dart";
import "package:bar/bar.dart";
class Baz { }''');

// Wait for analysis then edit the content
await waitForTasksFinished();
String revisedContent = testCode.substring(0, completionOffset) +
'i' +
testCode.substring(completionOffset);
++completionOffset;
server.handleRequest(new AnalysisUpdateContentParams(
{testFile: new AddContentOverlay(revisedContent)}).toRequest('add1'));

// Request code completion immediately after edit
Response response = handleSuccessfulRequest(new CompletionGetSuggestionsParams(
testFile, completionOffset).toRequest('0'));
completionId = response.id;
assertValidId(completionId);
await waitForTasksFinished();
expect(replacementOffset, completionOffset - 1);
expect(replacementLength, 1);
assertHasResult(CompletionSuggestionKind.KEYWORD, 'library',
relevance: DART_RELEVANCE_HIGH);
assertHasResult(CompletionSuggestionKind.KEYWORD, 'import',
relevance: DART_RELEVANCE_HIGH);
assertHasResult(CompletionSuggestionKind.KEYWORD, 'export',
relevance: DART_RELEVANCE_HIGH);
assertHasResult(CompletionSuggestionKind.KEYWORD, 'part',
relevance: DART_RELEVANCE_HIGH);
assertNoResult('extends');
}

test_imports_prefixed() {
addTestFile('''
import 'dart:html' as foo;
Expand Down Expand Up @@ -424,10 +478,10 @@ class CompletionTest extends AbstractAnalysisTest {
return getSuggestions().then((_) {
expect(replacementOffset, equals(completionOffset - 2));
expect(replacementLength, equals(2));
assertHasResult(
CompletionSuggestionKind.KEYWORD, 'export', DART_RELEVANCE_HIGH);
assertHasResult(
CompletionSuggestionKind.KEYWORD, 'class', DART_RELEVANCE_HIGH);
assertHasResult(CompletionSuggestionKind.KEYWORD, 'export',
relevance: DART_RELEVANCE_HIGH);
assertHasResult(CompletionSuggestionKind.KEYWORD, 'class',
relevance: DART_RELEVANCE_HIGH);
});
}

Expand All @@ -447,12 +501,12 @@ class CompletionTest extends AbstractAnalysisTest {
expect(replacementOffset, equals(completionOffset));
expect(replacementLength, equals(0));
assertHasResult(CompletionSuggestionKind.INVOCATION, 'A');
assertHasResult(
CompletionSuggestionKind.INVOCATION, 'a', DART_RELEVANCE_LOCAL_FIELD);
assertHasResult(CompletionSuggestionKind.INVOCATION, 'a',
relevance: DART_RELEVANCE_LOCAL_FIELD);
assertHasResult(CompletionSuggestionKind.INVOCATION, 'b',
DART_RELEVANCE_LOCAL_VARIABLE);
relevance: DART_RELEVANCE_LOCAL_VARIABLE);
assertHasResult(CompletionSuggestionKind.INVOCATION, 'x',
DART_RELEVANCE_LOCAL_METHOD);
relevance: DART_RELEVANCE_LOCAL_METHOD);
assertHasResult(CompletionSuggestionKind.INVOCATION, 'DateTime');
});
}
Expand All @@ -477,14 +531,12 @@ class B extends A {m() {^}}
expect(replacementOffset, equals(completionOffset));
expect(replacementLength, equals(0));
assertHasResult(CompletionSuggestionKind.INVOCATION, 'm',
DART_RELEVANCE_LOCAL_METHOD);
relevance: DART_RELEVANCE_LOCAL_METHOD);
});
}

test_partFile() {
addFile(
'/project/bin/testA.dart',
'''
addFile('/project/bin/testA.dart', '''
library libA;
part "$testFile";
import 'dart:html';
Expand All @@ -504,9 +556,7 @@ class B extends A {m() {^}}
}

test_partFile2() {
addFile(
'/testA.dart',
'''
addFile('/testA.dart', '''
part of libA;
class A { }''');
addTestFile('''
Expand Down Expand Up @@ -552,7 +602,7 @@ class B extends A {m() {^}}
// Suggestions based upon imported elements are partially filtered
//assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object');
assertHasResult(CompletionSuggestionKind.INVOCATION, 'test',
DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
assertNoResult('HtmlElement');
});
}
Expand Down Expand Up @@ -666,24 +716,14 @@ class MockSubscription<E> implements StreamSubscription<E> {
class Test_AnalysisServer extends AnalysisServer {
final MockContext mockContext = new MockContext();

Test_AnalysisServer(
ServerCommunicationChannel channel,
Test_AnalysisServer(ServerCommunicationChannel channel,
ResourceProvider resourceProvider,
PubPackageMapProvider packageMapProvider,
Index index,
ServerPlugin serverPlugin,
AnalysisServerOptions analysisServerOptions,
DartSdk defaultSdk,
InstrumentationService instrumentationService)
: super(
channel,
resourceProvider,
packageMapProvider,
index,
serverPlugin,
analysisServerOptions,
defaultSdk,
instrumentationService);
PubPackageMapProvider packageMapProvider, Index index,
ServerPlugin serverPlugin, AnalysisServerOptions analysisServerOptions,
DartSdk defaultSdk, InstrumentationService instrumentationService)
: super(channel, resourceProvider, packageMapProvider, index,
serverPlugin, analysisServerOptions, defaultSdk,
instrumentationService);

@override
AnalysisContext getAnalysisContext(String path) {
Expand Down
Expand Up @@ -229,6 +229,35 @@ class KeywordContributorTest extends AbstractCompletionTest {
}
}

fail_import_partial() {
addTestSource('imp^ import "package:foo/foo.dart"; import "bar.dart";');
expect(computeFast(), isTrue);
// TODO(danrubel) should not suggest declaration keywords
assertNotSuggested('class');
}

fail_import_partial4() {
addTestSource('^ imp import "package:foo/foo.dart";');
expect(computeFast(), isTrue);
// TODO(danrubel) should not suggest declaration keywords
assertNotSuggested('class');
}

fail_import_partial5() {
addTestSource('library libA; imp^ import "package:foo/foo.dart";');
expect(computeFast(), isTrue);
// TODO(danrubel) should not suggest declaration keywords
assertNotSuggested('class');
}

fail_import_partial6() {
addTestSource(
'library bar; import "zoo.dart"; imp^ import "package:foo/foo.dart";');
expect(computeFast(), isTrue);
// TODO(danrubel) should not suggest declaration keywords
assertNotSuggested('class');
}

@override
void setUpContributor() {
contributor = new KeywordContributor();
Expand Down Expand Up @@ -841,18 +870,94 @@ class A {
relevance: DART_RELEVANCE_HIGH);
}

test_import_deferred_as5() {
addTestSource('import "foo" sh^ import "bar"; import "baz";');
expect(computeFast(), isTrue);
assertSuggestKeywords([Keyword.AS],
pseudoKeywords: ['deferred as', 'show', 'hide'],
relevance: DART_RELEVANCE_HIGH);
}

test_import_deferred_not() {
addTestSource('import "foo" as foo ^;');
expect(computeFast(), isTrue);
assertSuggestKeywords([],
pseudoKeywords: ['show', 'hide'], relevance: DART_RELEVANCE_HIGH);
}

test_import_deferred_partial() {
addTestSource('import "package:foo/foo.dart" def^ as foo;');
expect(computeFast(), isTrue);
assertSuggestKeywords([Keyword.DEFERRED], relevance: DART_RELEVANCE_HIGH);
expect(request.replacementOffset, 30);
expect(request.replacementLength, 3);
}

test_import_incomplete() {
addTestSource('import "^"');
expect(computeFast(), isTrue);
assertNoSuggestions();
assertSuggestKeywords([]);
}

test_import_partial() {
addTestSource('imp^ import "package:foo/foo.dart"; import "bar.dart";');
expect(computeFast(), isTrue);
// TODO(danrubel) should not suggest declaration keywords
assertSuggestKeywords(DIRECTIVE_DECLARATION_AND_LIBRARY_KEYWORDS,
relevance: DART_RELEVANCE_HIGH);
expect(request.replacementOffset, 0);
expect(request.replacementLength, 3);
}

test_import_partial2() {
addTestSource('^imp import "package:foo/foo.dart";');
expect(computeFast(), isTrue);
// TODO(danrubel) should not suggest declaration keywords
assertSuggestKeywords(DIRECTIVE_DECLARATION_AND_LIBRARY_KEYWORDS,
relevance: DART_RELEVANCE_HIGH);
expect(request.replacementOffset, 0);
expect(request.replacementLength, 3);
}

test_import_partial3() {
addTestSource(' ^imp import "package:foo/foo.dart"; import "bar.dart";');
expect(computeFast(), isTrue);
// TODO(danrubel) should not suggest declaration keywords
assertSuggestKeywords(DIRECTIVE_DECLARATION_AND_LIBRARY_KEYWORDS,
relevance: DART_RELEVANCE_HIGH);
expect(request.replacementOffset, 1);
expect(request.replacementLength, 3);
}

test_import_partial4() {
addTestSource('^ imp import "package:foo/foo.dart";');
expect(computeFast(), isTrue);
// TODO(danrubel) should not suggest declaration keywords
assertSuggestKeywords(DIRECTIVE_DECLARATION_AND_LIBRARY_KEYWORDS,
relevance: DART_RELEVANCE_HIGH);
expect(request.replacementOffset, 0);
expect(request.replacementLength, 0);
}

test_import_partial5() {
addTestSource('library libA; imp^ import "package:foo/foo.dart";');
expect(computeFast(), isTrue);
// TODO(danrubel) should not suggest declaration keywords
assertSuggestKeywords(DIRECTIVE_AND_DECLARATION_KEYWORDS,
relevance: DART_RELEVANCE_HIGH);
expect(request.replacementOffset, 14);
expect(request.replacementLength, 3);
}

test_import_partial6() {
addTestSource(
'library bar; import "zoo.dart"; imp^ import "package:foo/foo.dart";');
expect(computeFast(), isTrue);
// TODO(danrubel) should not suggest declaration keywords
assertSuggestKeywords(DIRECTIVE_AND_DECLARATION_KEYWORDS,
relevance: DART_RELEVANCE_HIGH);
expect(request.replacementOffset, 32);
expect(request.replacementLength, 3);
}

test_library() {
Expand Down

0 comments on commit e2f6739

Please sign in to comment.