OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |