Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Side by Side Diff: pkg/analysis_server/test/domain_completion_test.dart

Issue 1278033006: tests for keyword/identifier replacementOffset - asserts fixes #23906 and fixes #23947 (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: address comments Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/analysis_server/test/services/completion/keyword_contributor_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library test.domain.completion; 5 library test.domain.completion;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 8
9 import 'package:analysis_server/completion/completion_core.dart' 9 import 'package:analysis_server/completion/completion_core.dart'
10 show CompletionRequest, CompletionResult; 10 show CompletionRequest, CompletionResult;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 AnalysisDomainHandler analysisDomain; 48 AnalysisDomainHandler analysisDomain;
49 Test_CompletionDomainHandler completionDomain; 49 Test_CompletionDomainHandler completionDomain;
50 Request request; 50 Request request;
51 int requestCount = 0; 51 int requestCount = 0;
52 String testFile2 = '/project/bin/test2.dart'; 52 String testFile2 = '/project/bin/test2.dart';
53 53
54 AnalysisServer createAnalysisServer(Index index) { 54 AnalysisServer createAnalysisServer(Index index) {
55 ExtensionManager manager = new ExtensionManager(); 55 ExtensionManager manager = new ExtensionManager();
56 ServerPlugin serverPlugin = new ServerPlugin(); 56 ServerPlugin serverPlugin = new ServerPlugin();
57 manager.processPlugins([serverPlugin]); 57 manager.processPlugins([serverPlugin]);
58 return new Test_AnalysisServer( 58 return new Test_AnalysisServer(super.serverChannel, super.resourceProvider,
59 super.serverChannel, 59 super.packageMapProvider, index, serverPlugin,
60 super.resourceProvider, 60 new AnalysisServerOptions(), new MockSdk(),
61 super.packageMapProvider,
62 index,
63 serverPlugin,
64 new AnalysisServerOptions(),
65 new MockSdk(),
66 InstrumentationService.NULL_SERVICE); 61 InstrumentationService.NULL_SERVICE);
67 } 62 }
68 63
69 @override 64 @override
70 Index createIndex() { 65 Index createIndex() {
71 return createLocalMemoryIndex(); 66 return createLocalMemoryIndex();
72 } 67 }
73 68
74 void sendRequest(String path) { 69 void sendRequest(String path) {
75 String id = (++requestCount).toString(); 70 String id = (++requestCount).toString();
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 256
262 @reflectiveTest 257 @reflectiveTest
263 class CompletionTest extends AbstractAnalysisTest { 258 class CompletionTest extends AbstractAnalysisTest {
264 String completionId; 259 String completionId;
265 int completionOffset; 260 int completionOffset;
266 int replacementOffset; 261 int replacementOffset;
267 int replacementLength; 262 int replacementLength;
268 List<CompletionSuggestion> suggestions = []; 263 List<CompletionSuggestion> suggestions = [];
269 bool suggestionsDone = false; 264 bool suggestionsDone = false;
270 265
271 String addTestFile(String content, {offset}) { 266 String addTestFile(String content, {int offset}) {
272 completionOffset = content.indexOf('^'); 267 completionOffset = content.indexOf('^');
273 if (offset != null) { 268 if (offset != null) {
274 expect(completionOffset, -1, reason: 'cannot supply offset and ^'); 269 expect(completionOffset, -1, reason: 'cannot supply offset and ^');
275 completionOffset = offset; 270 completionOffset = offset;
276 return super.addTestFile(content); 271 return super.addTestFile(content);
277 } 272 }
278 expect(completionOffset, isNot(equals(-1)), reason: 'missing ^'); 273 expect(completionOffset, isNot(equals(-1)), reason: 'missing ^');
279 int nextOffset = content.indexOf('^', completionOffset + 1); 274 int nextOffset = content.indexOf('^', completionOffset + 1);
280 expect(nextOffset, equals(-1), reason: 'too many ^'); 275 expect(nextOffset, equals(-1), reason: 'too many ^');
281 return super.addTestFile(content.substring(0, completionOffset) + 276 return super.addTestFile(content.substring(0, completionOffset) +
282 content.substring(completionOffset + 1)); 277 content.substring(completionOffset + 1));
283 } 278 }
284 279
285 void assertHasResult(CompletionSuggestionKind kind, String completion, 280 void assertHasResult(CompletionSuggestionKind kind, String completion,
286 [int relevance = DART_RELEVANCE_DEFAULT, 281 {int relevance: DART_RELEVANCE_DEFAULT,
287 bool isDeprecated = false, 282 bool isDeprecated: false,
288 bool isPotential = false]) { 283 bool isPotential: false,
284 int selectionOffset}) {
289 var cs; 285 var cs;
290 suggestions.forEach((s) { 286 suggestions.forEach((s) {
291 if (s.completion == completion) { 287 if (s.completion == completion) {
292 if (cs == null) { 288 if (cs == null) {
293 cs = s; 289 cs = s;
294 } else { 290 } else {
295 fail('expected exactly one $completion but found > 1'); 291 fail('expected exactly one $completion but found > 1');
296 } 292 }
297 } 293 }
298 }); 294 });
299 if (cs == null) { 295 if (cs == null) {
300 var completions = suggestions.map((s) => s.completion).toList(); 296 var completions = suggestions.map((s) => s.completion).toList();
301 fail('expected "$completion" but found\n $completions'); 297 fail('expected "$completion" but found\n $completions');
302 } 298 }
303 expect(cs.kind, equals(kind)); 299 expect(cs.kind, equals(kind));
304 expect(cs.relevance, equals(relevance)); 300 expect(cs.relevance, equals(relevance));
305 expect(cs.selectionOffset, equals(completion.length)); 301 expect(cs.selectionOffset, selectionOffset ?? completion.length);
306 expect(cs.selectionLength, equals(0)); 302 expect(cs.selectionLength, equals(0));
307 expect(cs.isDeprecated, equals(isDeprecated)); 303 expect(cs.isDeprecated, equals(isDeprecated));
308 expect(cs.isPotential, equals(isPotential)); 304 expect(cs.isPotential, equals(isPotential));
309 } 305 }
310 306
311 void assertNoResult(String completion) { 307 void assertNoResult(String completion) {
312 if (suggestions.any((cs) => cs.completion == completion)) { 308 if (suggestions.any((cs) => cs.completion == completion)) {
313 fail('did not expect completion: $completion'); 309 fail('did not expect completion: $completion');
314 } 310 }
315 } 311 }
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 '''); 375 ''');
380 return getSuggestions().then((_) { 376 return getSuggestions().then((_) {
381 expect(replacementOffset, equals(completionOffset)); 377 expect(replacementOffset, equals(completionOffset));
382 expect(replacementLength, equals(0)); 378 expect(replacementLength, equals(0));
383 assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object'); 379 assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object');
384 assertHasResult(CompletionSuggestionKind.INVOCATION, 'HtmlElement'); 380 assertHasResult(CompletionSuggestionKind.INVOCATION, 'HtmlElement');
385 assertNoResult('test'); 381 assertNoResult('test');
386 }); 382 });
387 } 383 }
388 384
385 test_imports_incremental() async {
386 addTestFile('''library foo;
387 e^
388 import "dart:async";
389 import "package:foo/foo.dart";
390 class foo { }''');
391 await waitForTasksFinished();
392 server.updateContent('uc1', {testFile: new AddContentOverlay(testCode)});
393 server.updateContent('uc2', {
394 testFile:
395 new ChangeContentOverlay([new SourceEdit(completionOffset, 0, 'xp')])
396 });
397 completionOffset += 2;
398 await getSuggestions();
399 expect(replacementOffset, completionOffset - 3);
400 expect(replacementLength, 3);
401 assertHasResult(CompletionSuggestionKind.KEYWORD, 'export',
402 relevance: DART_RELEVANCE_HIGH);
403 assertHasResult(CompletionSuggestionKind.KEYWORD, 'import',
404 relevance: DART_RELEVANCE_HIGH);
405 assertNoResult('extends');
406 assertNoResult('library');
407 }
408
409 test_imports_partial() async {
410 addTestFile('''^
411 import "package:foo/foo.dart";
412 import "package:bar/bar.dart";
413 class Baz { }''');
414
415 // Wait for analysis then edit the content
416 await waitForTasksFinished();
417 String revisedContent = testCode.substring(0, completionOffset) +
418 'i' +
419 testCode.substring(completionOffset);
420 ++completionOffset;
421 server.handleRequest(new AnalysisUpdateContentParams(
422 {testFile: new AddContentOverlay(revisedContent)}).toRequest('add1'));
423
424 // Request code completion immediately after edit
425 Response response = handleSuccessfulRequest(new CompletionGetSuggestionsPara ms(
426 testFile, completionOffset).toRequest('0'));
427 completionId = response.id;
428 assertValidId(completionId);
429 await waitForTasksFinished();
430 expect(replacementOffset, completionOffset - 1);
431 expect(replacementLength, 1);
432 assertHasResult(CompletionSuggestionKind.KEYWORD, 'library',
433 relevance: DART_RELEVANCE_HIGH);
434 assertHasResult(CompletionSuggestionKind.KEYWORD, 'import',
435 relevance: DART_RELEVANCE_HIGH);
436 assertHasResult(CompletionSuggestionKind.KEYWORD, 'export',
437 relevance: DART_RELEVANCE_HIGH);
438 assertHasResult(CompletionSuggestionKind.KEYWORD, 'part',
439 relevance: DART_RELEVANCE_HIGH);
440 assertNoResult('extends');
441 }
442
389 test_imports_prefixed() { 443 test_imports_prefixed() {
390 addTestFile(''' 444 addTestFile('''
391 import 'dart:html' as foo; 445 import 'dart:html' as foo;
392 main() {^} 446 main() {^}
393 '''); 447 ''');
394 return getSuggestions().then((_) { 448 return getSuggestions().then((_) {
395 expect(replacementOffset, equals(completionOffset)); 449 expect(replacementOffset, equals(completionOffset));
396 expect(replacementLength, equals(0)); 450 expect(replacementLength, equals(0));
397 assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object'); 451 assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object');
398 assertHasResult(CompletionSuggestionKind.INVOCATION, 'foo'); 452 assertHasResult(CompletionSuggestionKind.INVOCATION, 'foo');
(...skipping 18 matching lines...) Expand all
417 expect(replacementLength, equals(0)); 471 expect(replacementLength, equals(0));
418 assertHasResult(CompletionSuggestionKind.INVOCATION, 'b'); 472 assertHasResult(CompletionSuggestionKind.INVOCATION, 'b');
419 }); 473 });
420 } 474 }
421 475
422 test_keyword() { 476 test_keyword() {
423 addTestFile('library A; cl^'); 477 addTestFile('library A; cl^');
424 return getSuggestions().then((_) { 478 return getSuggestions().then((_) {
425 expect(replacementOffset, equals(completionOffset - 2)); 479 expect(replacementOffset, equals(completionOffset - 2));
426 expect(replacementLength, equals(2)); 480 expect(replacementLength, equals(2));
427 assertHasResult( 481 assertHasResult(CompletionSuggestionKind.KEYWORD, 'export',
428 CompletionSuggestionKind.KEYWORD, 'export', DART_RELEVANCE_HIGH); 482 relevance: DART_RELEVANCE_HIGH);
429 assertHasResult( 483 assertHasResult(CompletionSuggestionKind.KEYWORD, 'class',
430 CompletionSuggestionKind.KEYWORD, 'class', DART_RELEVANCE_HIGH); 484 relevance: DART_RELEVANCE_HIGH);
431 }); 485 });
432 } 486 }
433 487
434 test_local_named_constructor() { 488 test_local_named_constructor() {
435 addTestFile('class A {A.c(); x() {new A.^}}'); 489 addTestFile('class A {A.c(); x() {new A.^}}');
436 return getSuggestions().then((_) { 490 return getSuggestions().then((_) {
437 expect(replacementOffset, equals(completionOffset)); 491 expect(replacementOffset, equals(completionOffset));
438 expect(replacementLength, equals(0)); 492 expect(replacementLength, equals(0));
439 assertHasResult(CompletionSuggestionKind.INVOCATION, 'c'); 493 assertHasResult(CompletionSuggestionKind.INVOCATION, 'c');
440 assertNoResult('A'); 494 assertNoResult('A');
441 }); 495 });
442 } 496 }
443 497
444 test_locals() { 498 test_locals() {
445 addTestFile('class A {var a; x() {var b;^}} class DateTime { }'); 499 addTestFile('class A {var a; x() {var b;^}} class DateTime { }');
446 return getSuggestions().then((_) { 500 return getSuggestions().then((_) {
447 expect(replacementOffset, equals(completionOffset)); 501 expect(replacementOffset, equals(completionOffset));
448 expect(replacementLength, equals(0)); 502 expect(replacementLength, equals(0));
449 assertHasResult(CompletionSuggestionKind.INVOCATION, 'A'); 503 assertHasResult(CompletionSuggestionKind.INVOCATION, 'A');
450 assertHasResult( 504 assertHasResult(CompletionSuggestionKind.INVOCATION, 'a',
451 CompletionSuggestionKind.INVOCATION, 'a', DART_RELEVANCE_LOCAL_FIELD); 505 relevance: DART_RELEVANCE_LOCAL_FIELD);
452 assertHasResult(CompletionSuggestionKind.INVOCATION, 'b', 506 assertHasResult(CompletionSuggestionKind.INVOCATION, 'b',
453 DART_RELEVANCE_LOCAL_VARIABLE); 507 relevance: DART_RELEVANCE_LOCAL_VARIABLE);
454 assertHasResult(CompletionSuggestionKind.INVOCATION, 'x', 508 assertHasResult(CompletionSuggestionKind.INVOCATION, 'x',
455 DART_RELEVANCE_LOCAL_METHOD); 509 relevance: DART_RELEVANCE_LOCAL_METHOD);
456 assertHasResult(CompletionSuggestionKind.INVOCATION, 'DateTime'); 510 assertHasResult(CompletionSuggestionKind.INVOCATION, 'DateTime');
457 }); 511 });
458 } 512 }
459 513
460 test_offset_past_eof() { 514 test_offset_past_eof() {
461 addTestFile('main() { }', offset: 300); 515 addTestFile('main() { }', offset: 300);
462 return getSuggestions().then((_) { 516 return getSuggestions().then((_) {
463 expect(replacementOffset, equals(300)); 517 expect(replacementOffset, equals(300));
464 expect(replacementLength, equals(0)); 518 expect(replacementLength, equals(0));
465 expect(suggestionsDone, true); 519 expect(suggestionsDone, true);
466 expect(suggestions.length, 0); 520 expect(suggestions.length, 0);
467 }); 521 });
468 } 522 }
469 523
470 test_overrides() { 524 test_overrides() {
471 addFile('/libA.dart', 'class A {m() {}}'); 525 addFile('/libA.dart', 'class A {m() {}}');
472 addTestFile(''' 526 addTestFile('''
473 import '/libA.dart'; 527 import '/libA.dart';
474 class B extends A {m() {^}} 528 class B extends A {m() {^}}
475 '''); 529 ''');
476 return getSuggestions().then((_) { 530 return getSuggestions().then((_) {
477 expect(replacementOffset, equals(completionOffset)); 531 expect(replacementOffset, equals(completionOffset));
478 expect(replacementLength, equals(0)); 532 expect(replacementLength, equals(0));
479 assertHasResult(CompletionSuggestionKind.INVOCATION, 'm', 533 assertHasResult(CompletionSuggestionKind.INVOCATION, 'm',
480 DART_RELEVANCE_LOCAL_METHOD); 534 relevance: DART_RELEVANCE_LOCAL_METHOD);
481 }); 535 });
482 } 536 }
483 537
484 test_partFile() { 538 test_partFile() {
485 addFile( 539 addFile('/project/bin/testA.dart', '''
486 '/project/bin/testA.dart',
487 '''
488 library libA; 540 library libA;
489 part "$testFile"; 541 part "$testFile";
490 import 'dart:html'; 542 import 'dart:html';
491 class A { } 543 class A { }
492 '''); 544 ''');
493 addTestFile(''' 545 addTestFile('''
494 part of libA; 546 part of libA;
495 main() {^}'''); 547 main() {^}''');
496 return getSuggestions().then((_) { 548 return getSuggestions().then((_) {
497 expect(replacementOffset, equals(completionOffset)); 549 expect(replacementOffset, equals(completionOffset));
498 expect(replacementLength, equals(0)); 550 expect(replacementLength, equals(0));
499 assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object'); 551 assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object');
500 assertHasResult(CompletionSuggestionKind.INVOCATION, 'HtmlElement'); 552 assertHasResult(CompletionSuggestionKind.INVOCATION, 'HtmlElement');
501 assertHasResult(CompletionSuggestionKind.INVOCATION, 'A'); 553 assertHasResult(CompletionSuggestionKind.INVOCATION, 'A');
502 assertNoResult('test'); 554 assertNoResult('test');
503 }); 555 });
504 } 556 }
505 557
506 test_partFile2() { 558 test_partFile2() {
507 addFile( 559 addFile('/testA.dart', '''
508 '/testA.dart',
509 '''
510 part of libA; 560 part of libA;
511 class A { }'''); 561 class A { }''');
512 addTestFile(''' 562 addTestFile('''
513 library libA; 563 library libA;
514 part "/testA.dart"; 564 part "/testA.dart";
515 import 'dart:html'; 565 import 'dart:html';
516 main() {^} 566 main() {^}
517 '''); 567 ''');
518 return getSuggestions().then((_) { 568 return getSuggestions().then((_) {
519 expect(replacementOffset, equals(completionOffset)); 569 expect(replacementOffset, equals(completionOffset));
(...skipping 25 matching lines...) Expand all
545 typedef foo(); 595 typedef foo();
546 var test = ''; 596 var test = '';
547 main() {tes^t} 597 main() {tes^t}
548 '''); 598 ''');
549 return getSuggestions().then((_) { 599 return getSuggestions().then((_) {
550 expect(replacementOffset, equals(completionOffset - 3)); 600 expect(replacementOffset, equals(completionOffset - 3));
551 expect(replacementLength, equals(4)); 601 expect(replacementLength, equals(4));
552 // Suggestions based upon imported elements are partially filtered 602 // Suggestions based upon imported elements are partially filtered
553 //assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object'); 603 //assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object');
554 assertHasResult(CompletionSuggestionKind.INVOCATION, 'test', 604 assertHasResult(CompletionSuggestionKind.INVOCATION, 'test',
555 DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE); 605 relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
556 assertNoResult('HtmlElement'); 606 assertNoResult('HtmlElement');
557 }); 607 });
558 } 608 }
559 } 609 }
560 610
561 class MockCache extends CompletionCache { 611 class MockCache extends CompletionCache {
562 MockCache(AnalysisContext context, Source source) : super(context, source); 612 MockCache(AnalysisContext context, Source source) : super(context, source);
563 } 613 }
564 614
565 class MockCompletionManager implements CompletionManager { 615 class MockCompletionManager implements CompletionManager {
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 ++cancelCount; 709 ++cancelCount;
660 return new Future.value(true); 710 return new Future.value(true);
661 } 711 }
662 712
663 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); 713 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
664 } 714 }
665 715
666 class Test_AnalysisServer extends AnalysisServer { 716 class Test_AnalysisServer extends AnalysisServer {
667 final MockContext mockContext = new MockContext(); 717 final MockContext mockContext = new MockContext();
668 718
669 Test_AnalysisServer( 719 Test_AnalysisServer(ServerCommunicationChannel channel,
670 ServerCommunicationChannel channel,
671 ResourceProvider resourceProvider, 720 ResourceProvider resourceProvider,
672 PubPackageMapProvider packageMapProvider, 721 PubPackageMapProvider packageMapProvider, Index index,
673 Index index, 722 ServerPlugin serverPlugin, AnalysisServerOptions analysisServerOptions,
674 ServerPlugin serverPlugin, 723 DartSdk defaultSdk, InstrumentationService instrumentationService)
675 AnalysisServerOptions analysisServerOptions, 724 : super(channel, resourceProvider, packageMapProvider, index,
676 DartSdk defaultSdk, 725 serverPlugin, analysisServerOptions, defaultSdk,
677 InstrumentationService instrumentationService) 726 instrumentationService);
678 : super(
679 channel,
680 resourceProvider,
681 packageMapProvider,
682 index,
683 serverPlugin,
684 analysisServerOptions,
685 defaultSdk,
686 instrumentationService);
687 727
688 @override 728 @override
689 AnalysisContext getAnalysisContext(String path) { 729 AnalysisContext getAnalysisContext(String path) {
690 return mockContext; 730 return mockContext;
691 } 731 }
692 732
693 @override 733 @override
694 ContextSourcePair getContextSourcePair(String path) { 734 ContextSourcePair getContextSourcePair(String path) {
695 ContextSourcePair pair = super.getContextSourcePair(path); 735 ContextSourcePair pair = super.getContextSourcePair(path);
696 return new ContextSourcePair(mockContext, pair.source); 736 return new ContextSourcePair(mockContext, pair.source);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 } 781 }
742 '''); 782 ''');
743 await waitForTasksFinished(); 783 await waitForTasksFinished();
744 Request request = 784 Request request =
745 new CompletionGetSuggestionsParams(testFile, 0).toRequest('0'); 785 new CompletionGetSuggestionsParams(testFile, 0).toRequest('0');
746 Response response = handler.handleRequest(request); 786 Response response = handler.handleRequest(request);
747 expect(response.error, isNotNull); 787 expect(response.error, isNotNull);
748 expect(response.error.code, RequestErrorCode.NO_INDEX_GENERATED); 788 expect(response.error.code, RequestErrorCode.NO_INDEX_GENERATED);
749 } 789 }
750 } 790 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analysis_server/test/services/completion/keyword_contributor_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698