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

Side by Side Diff: pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart

Issue 2867123003: Follow a consistent user model (Closed)
Patch Set: Created 3 years, 7 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
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, 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.services.completion.statement; 5 library test.services.completion.statement;
6 6
7 import 'package:analysis_server/src/protocol_server.dart'; 7 import 'package:analysis_server/src/protocol_server.dart';
8 import 'package:analysis_server/src/services/completion/statement/statement_comp letion.dart'; 8 import 'package:analysis_server/src/services/completion/statement/statement_comp letion.dart';
9 import 'package:analyzer/src/dart/analysis/driver.dart'; 9 import 'package:analyzer/src/dart/analysis/driver.dart';
10 import 'package:test/test.dart'; 10 import 'package:test/test.dart';
11 import 'package:test_reflective_loader/test_reflective_loader.dart'; 11 import 'package:test_reflective_loader/test_reflective_loader.dart';
12 12
13 import '../../../abstract_single_unit.dart'; 13 import '../../../abstract_single_unit.dart';
14 14
15 main() { 15 main() {
16 defineReflectiveSuite(() { 16 defineReflectiveSuite(() {
17 defineReflectiveTests(_DeclarationCompletionTest); 17 defineReflectiveTests(_DeclarationCompletionTest);
18 defineReflectiveTests(_ControlFlowCompletionTest); 18 defineReflectiveTests(_ControlFlowCompletionTest);
19 defineReflectiveTests(_DoCompletionTest); 19 defineReflectiveTests(_DoCompletionTest);
20 defineReflectiveTests(_ExpressionCompletionTest);
20 defineReflectiveTests(_ForCompletionTest); 21 defineReflectiveTests(_ForCompletionTest);
21 defineReflectiveTests(_ForEachCompletionTest); 22 defineReflectiveTests(_ForEachCompletionTest);
22 defineReflectiveTests(_IfCompletionTest); 23 defineReflectiveTests(_IfCompletionTest);
23 defineReflectiveTests(_SimpleCompletionTest); 24 defineReflectiveTests(_SimpleCompletionTest);
24 defineReflectiveTests(_SwitchCompletionTest); 25 defineReflectiveTests(_SwitchCompletionTest);
25 defineReflectiveTests(_TryCompletionTest); 26 defineReflectiveTests(_TryCompletionTest);
26 defineReflectiveTests(_WhileCompletionTest); 27 defineReflectiveTests(_WhileCompletionTest);
27 }); 28 });
28 } 29 }
29 30
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 _assertHasChange( 297 _assertHasChange(
297 'Complete class declaration', 298 'Complete class declaration',
298 ''' 299 '''
299 class Sample { 300 class Sample {
300 //// 301 ////
301 } 302 }
302 ''', 303 ''',
303 (s) => _afterLast(s, ' ')); 304 (s) => _afterLast(s, ' '));
304 } 305 }
305 306
307 test_extendsNoBody() async {
308 await _prepareCompletion(
309 'Sample',
310 '''
311 class Sample extends Object
312 ''',
313 atEnd: true);
314 _assertHasChange(
315 'Complete class declaration',
316 '''
317 class Sample extends Object {
318 ////
319 }
320 ''',
321 (s) => _afterLast(s, ' '));
322 }
323
306 test_functionDeclNoBody() async { 324 test_functionDeclNoBody() async {
307 await _prepareCompletion( 325 await _prepareCompletion(
308 'source()', 326 'source()',
309 ''' 327 '''
310 String source() 328 String source()
311 ''', 329 ''',
312 atEnd: true); 330 atEnd: true);
313 _assertHasChange( 331 _assertHasChange(
314 'Complete function declaration', 332 'Complete function declaration',
315 ''' 333 '''
316 String source() { 334 String source() {
317 //// 335 ////
318 } 336 }
319 ''', 337 ''',
320 (s) => _after(s, ' ')); 338 (s) => _after(s, ' '));
321 } 339 }
322 340
341 test_functionDeclNoParen() async {
342 await _prepareCompletion(
343 'source(',
344 '''
345 String source(
346 ''',
347 atEnd: true);
348 _assertHasChange(
349 'Complete function declaration',
350 '''
351 String source() {
352 ////
353 }
354 ''',
355 (s) => _after(s, ' '));
356 }
357
323 test_methodDeclNoBody() async { 358 test_methodDeclNoBody() async {
324 await _prepareCompletion( 359 await _prepareCompletion(
325 'source()', 360 'source()',
326 ''' 361 '''
327 class Sample { 362 class Sample {
328 String source() 363 String source()
329 } 364 }
330 ''', 365 ''',
331 atEnd: true); 366 atEnd: true);
332 _assertHasChange( 367 _assertHasChange(
333 'Complete function declaration', 368 'Complete function declaration',
334 ''' 369 '''
335 class Sample { 370 class Sample {
336 String source() { 371 String source() {
337 //// 372 ////
338 } 373 }
339 } 374 }
340 ''', 375 ''',
341 (s) => _after(s, ' ')); 376 (s) => _after(s, ' '));
342 } 377 }
343 378
379 test_methodDeclNoParen() async {
380 await _prepareCompletion(
381 'source(',
382 '''
383 class Sample {
384 String source(
385 }
386 ''',
387 atEnd: true);
388 _assertHasChange(
389 'Complete function declaration',
390 '''
391 class Sample {
392 String source() {
393 ////
394 }
395 }
396 ''',
397 (s) => _after(s, ' '));
398 }
399
344 test_variableDeclNoBody() async { 400 test_variableDeclNoBody() async {
345 await _prepareCompletion( 401 await _prepareCompletion(
346 'source', 402 'source',
347 ''' 403 '''
348 String source 404 String source
349 ''', 405 ''',
350 atEnd: true); 406 atEnd: true);
351 _assertHasChange( 407 _assertHasChange(
352 'Complete variable declaration', 408 'Complete variable declaration',
353 ''' 409 '''
354 String source; 410 String source;
355 //// 411 ////
356 ''', 412 ''',
357 (s) => _after(s, ';\n')); 413 (s) => _after(s, ';\n'));
358 } 414 }
415
416 test_withNoBody() async {
417 await _prepareCompletion(
418 'Sample',
419 '''
420 class M {}
421 class Sample extends Object with M
422 ''',
423 atEnd: true);
424 _assertHasChange(
425 'Complete class declaration',
426 '''
427 class M {}
428 class Sample extends Object with M {
429 ////
430 }
431 ''',
432 (s) => _afterLast(s, ' '));
433 }
359 } 434 }
360 435
361 @reflectiveTest 436 @reflectiveTest
362 class _DoCompletionTest extends StatementCompletionTest { 437 class _DoCompletionTest extends StatementCompletionTest {
363 test_emptyCondition() async { 438 test_emptyCondition() async {
364 await _prepareCompletion( 439 await _prepareCompletion(
365 'while ()', 440 'while ()',
366 ''' 441 '''
367 main() { 442 main() {
368 do { 443 do {
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 main() { 559 main() {
485 do { 560 do {
486 } while (); 561 } while ();
487 } 562 }
488 ''', 563 ''',
489 (s) => _after(s, 'while (')); 564 (s) => _after(s, 'while ('));
490 } 565 }
491 } 566 }
492 567
493 @reflectiveTest 568 @reflectiveTest
569 class _ExpressionCompletionTest extends StatementCompletionTest {
570 test_listAssign() async {
571 await _prepareCompletion(
572 '= ',
573 '''
574 main() {
575 var x = [1, 2, 3
576 }
577 ''',
578 atEnd: true);
579 _assertHasChange(
580 'Add a semicolon and newline',
581 '''
582 main() {
583 var x = [1, 2, 3];
584 ////
585 }
586 ''',
587 (s) => _afterLast(s, ' '));
588 }
589
590 test_listAssignMultiLine() async {
591 // The indent of the final line is incorrect.
592 await _prepareCompletion(
593 '3',
594 '''
595 main() {
596 var x = [
597 1,
598 2,
599 3
600 }
601 ''',
602 atEnd: true);
603 _assertHasChange(
604 'Add a semicolon and newline',
605 '''
606 main() {
607 var x = [
608 1,
609 2,
610 3,
611 ];
612 ////
613 }
614 ''',
615 (s) => _afterLast(s, ' '));
616 }
617
618 @failingTest
619 test_mapAssign() async {
620 await _prepareCompletion(
621 '3: 3',
622 '''
623 main() {
624 var x = {1: 1, 2: 2, 3: 3
625 }
626 ''',
627 atEnd: true);
628 _assertHasChange(
629 'Add a semicolon and newline',
630 '''
631 main() {
632 var x = {1: 1, 2: 2, 3: 3};
633 ////
634 }
635 ''',
636 (s) => _afterLast(s, ' '));
637 }
638
639 @failingTest
640 test_mapAssignMissingColon() async {
641 await _prepareCompletion(
642 '3',
643 '''
644 main() {
645 var x = {1: 1, 2: 2, 3
646 }
647 ''',
648 atEnd: true);
649 _assertHasChange(
650 'Add a semicolon and newline',
651 '''
652 main() {
653 var x = {1: 1, 2: 2, 3: };
654 ////
655 }
656 ''',
657 (s) => _afterLast(s, ' '));
658 }
659
660 test_returnString() async {
661 await _prepareCompletion(
662 'text',
663 '''
664 main() {
665 if (done()) {
666 return 'text
667 }
668 }
669 ''',
670 atEnd: true);
671 _assertHasChange(
672 'Complete control flow block',
673 '''
674 main() {
675 if (done()) {
676 return 'text';
677 }
678 ////
679 }
680 ''',
681 (s) => _afterLast(s, ' '));
682 }
683
684 test_stringAssign() async {
685 await _prepareCompletion(
686 '= ',
687 '''
688 main() {
689 var x = '
690 }
691 ''',
692 atEnd: true);
693 _assertHasChange(
694 'Add a semicolon and newline',
695 '''
696 main() {
697 var x = '';
698 ////
699 }
700 ''',
701 (s) => _afterLast(s, ' '));
702 }
703
704 test_stringSingle() async {
705 await _prepareCompletion(
706 'text',
707 '''
708 main() {
709 print("text
710 }
711 ''',
712 atEnd: true);
713 _assertHasChange(
714 'Insert a newline at the end of the current line',
715 '''
716 main() {
717 print("text");
718 ////
719 }
720 ''',
721 (s) => _afterLast(s, ' '));
722 }
723
724 test_stringTriple() async {
725 await _prepareCompletion(
726 'text',
727 '''
728 main() {
729 print(\'\'\'text
730 }
731 ''',
732 atEnd: true);
733 _assertHasChange(
734 'Insert a newline at the end of the current line',
735 '''
736 main() {
737 print(\'\'\'text\'\'\');
738 ////
739 }
740 ''',
741 (s) => _afterLast(s, ' '));
742 }
743 }
744
745 @reflectiveTest
494 class _ForCompletionTest extends StatementCompletionTest { 746 class _ForCompletionTest extends StatementCompletionTest {
495 test_emptyCondition() async { 747 test_emptyCondition() async {
496 await _prepareCompletion( 748 await _prepareCompletion(
497 '}', 749 '0;',
750 '''
751 main() {
752 for (int i = 0;) /**/ ////
753 }
754 ''',
755 atEnd: true);
756 _assertHasChange(
757 'Complete for-statement',
758 '''
759 main() {
760 for (int i = 0; ; ) /**/ {
761 ////
762 }
763 }
764 ''',
765 (s) => _after(s, ' '));
766 }
767
768 test_emptyConditionWithBody() async {
769 await _prepareCompletion(
770 '0;',
498 ''' 771 '''
499 main() { 772 main() {
500 for (int i = 0;) { 773 for (int i = 0;) {
501 } 774 }
502 } 775 }
503 ''', 776 ''',
504 atEnd: true); 777 atEnd: true);
505 _assertHasChange( 778 _assertHasChange(
506 'Complete for-statement', 779 'Complete for-statement',
507 ''' 780 '''
508 main() { 781 main() {
509 for (int i = 0; ; ) { 782 for (int i = 0; ; ) {
510 } 783 }
511 } 784 }
512 ''', 785 ''',
513 (s) => _after(s, '0; ')); 786 (s) => _after(s, '0; '));
514 } 787 }
515 788
516 test_emptyInitializers() async { 789 test_emptyInitializers() async {
517 // TODO(messick) This should insert a newline and move the cursor there. 790 // This does nothing, same as for Java.
518 await _prepareCompletion( 791 await _prepareCompletion(
519 '}', 792 'r (',
520 ''' 793 '''
521 main() { 794 main() {
522 for () { 795 for () {
523 } 796 }
524 } 797 }
525 ''', 798 ''',
526 atEnd: true); 799 atEnd: true);
527 _assertHasChange( 800 _assertHasChange(
528 'Complete for-statement', 801 'Complete for-statement',
529 ''' 802 '''
530 main() { 803 main() {
531 for () { 804 for () {
532 } 805 }
533 } 806 }
534 ''', 807 ''',
535 (s) => _after(s, 'for (')); 808 (s) => _after(s, 'r ('));
809 }
810
811 test_emptyInitializersAfterBody() async {
812 await _prepareCompletion(
813 '}',
814 '''
815 main() {
816 for () {
817 }
818 }
819 ''',
820 atEnd: true);
821 _assertHasChange(
822 'Insert a newline at the end of the current line',
823 '''
824 main() {
825 for () {
826 }
827 ////
828 }
829 ''',
830 (s) => _afterLast(s, ' '));
536 } 831 }
537 832
538 test_emptyInitializersEmptyCondition() async { 833 test_emptyInitializersEmptyCondition() async {
539 await _prepareCompletion( 834 await _prepareCompletion(
540 '}', 835 '/**/',
541 ''' 836 '''
542 main() { 837 main() {
543 for (;/**/) { 838 for (;/**/)
544 }
545 } 839 }
546 ''', 840 ''',
547 atEnd: true); 841 atEnd: true);
548 _assertHasChange( 842 _assertHasChange(
549 'Complete for-statement', 843 'Complete for-statement',
550 ''' 844 '''
551 main() { 845 main() {
552 for (;/**/) { 846 for (; /**/; ) {
847 ////
553 } 848 }
554 } 849 }
555 ''', 850 ''',
556 (s) => _after(s, '/**/')); 851 (s) => _after(s, ' '));
557 } 852 }
558 853
559 test_emptyParts() async { 854 test_emptyParts() async {
560 await _prepareCompletion( 855 await _prepareCompletion(
561 ';)', 856 ';)',
562 ''' 857 '''
563 main() { 858 main() {
564 for (;;) 859 for (;;)
565 } 860 }
566 ''', 861 ''',
567 atEnd: true); 862 atEnd: true);
568 _assertHasChange( 863 _assertHasChange(
569 'Complete for-statement', 864 'Complete for-statement',
570 ''' 865 '''
571 main() { 866 main() {
572 for (;;) { 867 for (;;) {
573 //// 868 ////
574 } 869 }
575 } 870 }
576 ''', 871 ''',
577 (s) => _after(s, ' ')); 872 (s) => _after(s, ' '));
578 } 873 }
579 874
580 test_emptyUpdaters() async { 875 test_emptyUpdaters() async {
581 await _prepareCompletion( 876 await _prepareCompletion(
582 '}', 877 '/**/',
878 '''
879 main() {
880 for (int i = 0; i < 10 /**/)
881 }
882 ''',
883 atEnd: true);
884 _assertHasChange(
885 'Complete for-statement',
886 '''
887 main() {
888 for (int i = 0; i < 10 /**/; ) {
889 ////
890 }
891 }
892 ''',
893 (s) => _after(s, ' '));
894 }
895
896 test_emptyUpdatersWithBody() async {
897 await _prepareCompletion(
898 '/**/',
583 ''' 899 '''
584 main() { 900 main() {
585 for (int i = 0; i < 10 /**/) { 901 for (int i = 0; i < 10 /**/) {
586 } 902 }
587 } 903 }
588 ''', 904 ''',
589 atEnd: true); 905 atEnd: true);
590 _assertHasChange( 906 _assertHasChange(
591 'Complete for-statement', 907 'Complete for-statement',
592 ''' 908 '''
593 main() { 909 main() {
594 for (int i = 0; i < 10 /**/; ) { 910 for (int i = 0; i < 10 /**/; ) {
595 } 911 }
596 } 912 }
597 ''', 913 ''',
598 (s) => _after(s, '10 /**/; ')); 914 (s) => _after(s, '*/; '));
599 } 915 }
600 916
601 test_keywordOnly() async { 917 test_keywordOnly() async {
602 await _prepareCompletion( 918 await _prepareCompletion(
603 'for', 919 'for',
604 ''' 920 '''
605 main() { 921 main() {
606 for 922 for
607 } 923 }
608 ''', 924 ''',
609 atEnd: true); 925 atEnd: true);
610 _assertHasChange( 926 _assertHasChange(
611 'Complete for-statement', 927 'Complete for-statement',
612 ''' 928 '''
613 main() { 929 main() {
614 for () { 930 for () {
615 //// 931 ////
616 } 932 }
617 } 933 }
618 ''', 934 ''',
619 (s) => _after(s, 'for (')); 935 (s) => _after(s, 'for ('));
620 } 936 }
621 937
622 test_missingLeftSeparator() async { 938 test_missingLeftSeparator() async {
623 await _prepareCompletion( 939 await _prepareCompletion(
624 '}', 940 '= 0',
625 ''' 941 '''
626 main() { 942 main() {
627 for (int i = 0) { 943 for (int i = 0) {
628 } 944 }
629 } 945 }
630 ''', 946 ''',
631 atEnd: true); 947 atEnd: true);
632 _assertHasChange( 948 _assertHasChange(
633 'Complete for-statement', 949 'Complete for-statement',
634 ''' 950 '''
635 main() { 951 main() {
636 for (int i = 0; ) { 952 for (int i = 0; ; ) {
637 } 953 }
638 } 954 }
639 ''', 955 ''',
640 (s) => _after(s, '0; ')); 956 (s) => _after(s, '0; '));
641 } 957 }
642 958
643 test_noError() async { 959 test_noError() async {
644 await _prepareCompletion( 960 await _prepareCompletion(
645 ';)', 961 ';)',
646 ''' 962 '''
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 } 1064 }
749 return; 1065 return;
750 } 1066 }
751 ''', 1067 ''',
752 (s) => _after(s, ' ')); 1068 (s) => _after(s, ' '));
753 } 1069 }
754 } 1070 }
755 1071
756 @reflectiveTest 1072 @reflectiveTest
757 class _IfCompletionTest extends StatementCompletionTest { 1073 class _IfCompletionTest extends StatementCompletionTest {
758 test_afterCondition_BAD() async { 1074 test_afterCondition() async {
759 // TODO(messick) Stop inserting the space after the closing brace.
760 await _prepareCompletion( 1075 await _prepareCompletion(
761 'if (true) ', // Trigger completion after space. 1076 'if (true) ', // Trigger completion after space.
762 ''' 1077 '''
763 main() { 1078 main() {
764 if (true) //// 1079 if (true) ////
765 } 1080 }
766 ''', 1081 ''',
767 atEnd: true); 1082 atEnd: true);
768 _assertHasChange( 1083 _assertHasChange(
769 'Complete if-statement', 1084 'Complete if-statement',
770 ''' 1085 '''
771 main() { 1086 main() {
772 if (true) { 1087 if (true) {
773 //// 1088 ////
774 } //// 1089 }
775 } 1090 }
776 ''', 1091 ''',
777 (s) => _after(s, ' ')); 1092 (s) => _after(s, ' '));
778 } 1093 }
779 1094
780 test_emptyCondition() async { 1095 test_emptyCondition() async {
781 await _prepareCompletion( 1096 await _prepareCompletion(
782 'if ()', 1097 'if ()',
783 ''' 1098 '''
784 main() { 1099 main() {
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 test_onCatch() async { 1641 test_onCatch() async {
1327 await _prepareCompletion( 1642 await _prepareCompletion(
1328 'on', 1643 'on',
1329 ''' 1644 '''
1330 main() { 1645 main() {
1331 try { 1646 try {
1332 } on catch 1647 } on catch
1333 } 1648 }
1334 ''', 1649 ''',
1335 atEnd: true); 1650 atEnd: true);
1336 // It would be better to expect the cursor to follow the on-keyword but
1337 // the parser thinks the exception type is 'catch' so it's kinda broken.
1338 // See https://github.com/dart-lang/sdk/issues/29410
1339 _assertHasChange( 1651 _assertHasChange(
1340 'Complete try-statement', 1652 'Complete try-statement',
1341 ''' 1653 '''
1342 main() { 1654 main() {
1343 try { 1655 try {
1344 } on catch () { 1656 } on catch () {
1345 //// 1657 ////
1346 } 1658 }
1347 } 1659 }
1348 ''', 1660 ''',
1349 (s) => _after(s, 'catch (')); 1661 (s) => _after(s, 'catch ('));
1350 } 1662 }
1351 1663
1664 test_onCatchComment() async {
1665 await _prepareCompletion(
1666 'on',
1667 '''
1668 main() {
1669 try {
1670 } on catch
1671 //
1672 }
1673 ''',
1674 atEnd: true);
1675 _assertHasChange(
1676 'Complete try-statement',
1677 '''
1678 main() {
1679 try {
1680 } on catch () {
1681 ////
1682 }
1683 //
1684 }
1685 ''',
1686 (s) => _after(s, 'catch ('));
1687 }
1688
1352 test_onOnly() async { 1689 test_onOnly() async {
1353 await _prepareCompletion( 1690 await _prepareCompletion(
1354 'on', 1691 'on',
1355 ''' 1692 '''
1356 main() { 1693 main() {
1357 try { 1694 try {
1358 } on 1695 } on
1359 } 1696 }
1360 ''', 1697 ''',
1361 atEnd: true); 1698 atEnd: true);
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1465 ''' 1802 '''
1466 main() { 1803 main() {
1467 while () { 1804 while () {
1468 //// 1805 ////
1469 } 1806 }
1470 } 1807 }
1471 ''', 1808 ''',
1472 (s) => _after(s, 'while (')); 1809 (s) => _after(s, 'while ('));
1473 } 1810 }
1474 } 1811 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698