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

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

Issue 338683003: Extract 'DartUnitHighlightsComputer' tests into a separate file. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 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 | Annotate | Revision Log
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.analysis; 5 library test.domain.analysis;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 8
9 import 'package:analysis_server/src/computer/computer_highlights.dart'; 9 import 'package:analysis_server/src/computer/computer_highlights.dart';
10 import 'package:analysis_server/src/analysis_server.dart'; 10 import 'package:analysis_server/src/analysis_server.dart';
(...skipping 20 matching lines...) Expand all
31 31
32 setUp(() { 32 setUp(() {
33 serverChannel = new MockServerChannel(); 33 serverChannel = new MockServerChannel();
34 resourceProvider = new MemoryResourceProvider(); 34 resourceProvider = new MemoryResourceProvider();
35 server = new AnalysisServer(serverChannel, resourceProvider); 35 server = new AnalysisServer(serverChannel, resourceProvider);
36 server.defaultSdk = new MockSdk(); 36 server.defaultSdk = new MockSdk();
37 handler = new AnalysisDomainHandler(server); 37 handler = new AnalysisDomainHandler(server);
38 }); 38 });
39 39
40 group('notification.errors', testNotificationErrors); 40 group('notification.errors', testNotificationErrors);
41 group('notification.highlights', testNotificationHighlights);
42 group('notification.navigation', testNotificationNavigation);
43 group('updateContent', testUpdateContent); 41 group('updateContent', testUpdateContent);
44 group('setSubscriptions', test_setSubscriptions); 42 group('setSubscriptions', test_setSubscriptions);
45 43
46 group('AnalysisDomainHandler', () { 44 group('AnalysisDomainHandler', () {
47 group('setAnalysisRoots', () { 45 group('setAnalysisRoots', () {
48 Request request; 46 Request request;
49 47
50 setUp(() { 48 setUp(() {
51 request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS); 49 request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
52 request.setParameter(INCLUDED, []); 50 request.setParameter(INCLUDED, []);
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 return helper.waitForOperationsFinished().then((_) { 412 return helper.waitForOperationsFinished().then((_) {
415 List<AnalysisError> errors = helper.getTestErrors(); 413 List<AnalysisError> errors = helper.getTestErrors();
416 expect(errors, hasLength(1)); 414 expect(errors, hasLength(1));
417 AnalysisError error = errors[0]; 415 AnalysisError error = errors[0];
418 expect(error.errorCode, 'StaticWarningCode.UNDEFINED_IDENTIFIER'); 416 expect(error.errorCode, 'StaticWarningCode.UNDEFINED_IDENTIFIER');
419 }); 417 });
420 }); 418 });
421 } 419 }
422 420
423 421
424 class NotificationHighlightHelper extends AnalysisTestHelper {
425 List<Map<String, Object>> regions;
426
427 Future prepareRegions(then()) {
428 addAnalysisSubscriptionHighlights(testFile);
429 return waitForOperationsFinished().then((_) {
430 regions = getTestHighlights();
431 then();
432 });
433 }
434
435 void assertHasRawRegion(HighlightType type, int offset, int length) {
436 for (Map<String, Object> region in regions) {
437 if (region['offset'] == offset && region['length'] == length
438 && region['type'] == type.name) {
439 return;
440 }
441 }
442 fail('Expected to find (offset=$offset; length=$length; type=$type) in\n'
443 '${regions.join('\n')}');
444 }
445
446 void assertNoRawRegion(HighlightType type, int offset, int length) {
447 for (Map<String, Object> region in regions) {
448 if (region['offset'] == offset && region['length'] == length
449 && region['type'] == type.name) {
450 fail('Not expected to find (offset=$offset; length=$length; type=$type) in\n'
451 '${regions.join('\n')}');
452 }
453 }
454 }
455
456 void assertHasRegion(HighlightType type, String search, [int length = -1]) {
457 int offset = testCode.indexOf(search);
458 expect(offset, isNot(-1));
459 length = findRegionLength(search, length);
460 assertHasRawRegion(type, offset, length);
461 }
462
463 void assertNoRegion(HighlightType type, String search, [int length = -1]) {
464 int offset = testCode.indexOf(search);
465 expect(offset, isNot(-1));
466 length = findRegionLength(search, length);
467 assertNoRawRegion(type, offset, length);
468 }
469
470 int findRegionLength(String search, int length) {
471 if (length == -1) {
472 length = 0;
473 while (length < search.length) {
474 int c = search.codeUnitAt(length);
475 if (length == 0 && c == '@'.codeUnitAt(0)) {
476 length++;
477 continue;
478 }
479 if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) ||
480 c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) ||
481 c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) {
482 break;
483 }
484 length++;
485 }
486 }
487 return length;
488 }
489 }
490
491
492 testNotificationHighlights() {
493 Future testRegions(String code, then(NotificationHighlightHelper helper)) {
494 var helper = new NotificationHighlightHelper();
495 helper.createSingleFileProject(code);
496 return helper.prepareRegions(() {
497 then(helper);
498 });
499 }
500
501 group('ANNOTATION', () {
502 test('no arguments', () {
503 var code = '''
504 const AAA = 42;
505 @AAA main() {}
506 ''';
507 return testRegions(code, (NotificationHighlightHelper helper) {
508 helper.assertHasRegion(HighlightType.ANNOTATION, '@AAA');
509 });
510 });
511
512 test('has arguments', () {
513 var code = '''
514 class AAA {
515 const AAA(a, b, c);
516 }
517 @AAA(1, 2, 3) main() {}
518 ''';
519 return testRegions(code, (NotificationHighlightHelper helper) {
520 helper.assertHasRegion(HighlightType.ANNOTATION, '@AAA(', '@AAA('.length );
521 helper.assertHasRegion(HighlightType.ANNOTATION, ') main', ')'.length);
522 });
523 });
524 });
525
526 group('BUILT_IN', () {
527 test('abstract', () {
528 var code = '''
529 abstract class A {};
530 main() {
531 var abstract = 42;
532 }''';
533 return testRegions(code, (NotificationHighlightHelper helper) {
534 helper.assertHasRegion(HighlightType.BUILT_IN, 'abstract class');
535 helper.assertNoRegion(HighlightType.BUILT_IN, 'abstract = 42');
536 });
537 });
538
539 test('as', () {
540 var code = '''
541 import 'dart:math' as math;
542 main() {
543 p as int;
544 var as = 42;
545 }''';
546 return testRegions(code, (NotificationHighlightHelper helper) {
547 helper.assertHasRegion(HighlightType.BUILT_IN, 'as math');
548 helper.assertHasRegion(HighlightType.BUILT_IN, 'as int');
549 helper.assertNoRegion(HighlightType.BUILT_IN, 'as = 42');
550 });
551 });
552
553 test('deferred', () {
554 var code = '''
555 import 'dart:math' deferred as math;
556 main() {
557 var deferred = 42;
558 }''';
559 return testRegions(code, (NotificationHighlightHelper helper) {
560 helper.assertHasRegion(HighlightType.BUILT_IN, 'deferred as math');
561 helper.assertNoRegion(HighlightType.BUILT_IN, 'deferred = 42');
562 });
563 });
564
565 test('export', () {
566 var code = '''
567 export "dart:math";
568 main() {
569 var export = 42;
570 }''';
571 return testRegions(code, (NotificationHighlightHelper helper) {
572 helper.assertHasRegion(HighlightType.BUILT_IN, 'export "dart:');
573 helper.assertNoRegion(HighlightType.BUILT_IN, 'export = 42');
574 });
575 });
576
577 test('external', () {
578 var code = '''
579 class A {
580 external A();
581 external aaa();
582 }
583 external main() {
584 var external = 42;
585 }''';
586 return testRegions(code, (NotificationHighlightHelper helper) {
587 helper.assertHasRegion(HighlightType.BUILT_IN, 'external A()');
588 helper.assertHasRegion(HighlightType.BUILT_IN, 'external aaa()');
589 helper.assertHasRegion(HighlightType.BUILT_IN, 'external main()');
590 helper.assertNoRegion(HighlightType.BUILT_IN, 'external = 42');
591 });
592 });
593
594 test('factory', () {
595 var code = '''
596 class A {
597 factory A() => null;
598 }
599 main() {
600 var factory = 42;
601 }''';
602 return testRegions(code, (NotificationHighlightHelper helper) {
603 helper.assertHasRegion(HighlightType.BUILT_IN, 'factory A()');
604 helper.assertNoRegion(HighlightType.BUILT_IN, 'factory = 42');
605 });
606 });
607
608 test('get', () {
609 var code = '''
610 get aaa => 1;
611 class A {
612 get bbb => 2;
613 }
614 main() {
615 var get = 42;
616 }''';
617 return testRegions(code, (NotificationHighlightHelper helper) {
618 helper.assertHasRegion(HighlightType.BUILT_IN, 'get aaa =>');
619 helper.assertHasRegion(HighlightType.BUILT_IN, 'get bbb =>');
620 helper.assertNoRegion(HighlightType.BUILT_IN, 'get = 42');
621 });
622 });
623
624 test('hide', () {
625 var code = '''
626 import 'foo.dart' hide Foo;
627 main() {
628 var hide = 42;
629 }''';
630 return testRegions(code, (NotificationHighlightHelper helper) {
631 helper.assertHasRegion(HighlightType.BUILT_IN, 'hide Foo');
632 helper.assertNoRegion(HighlightType.BUILT_IN, 'hide = 42');
633 });
634 });
635
636 test('implements', () {
637 var code = '''
638 class A {}
639 class B implements A {}
640 main() {
641 var implements = 42;
642 }''';
643 return testRegions(code, (NotificationHighlightHelper helper) {
644 helper.assertHasRegion(HighlightType.BUILT_IN, 'implements A {}');
645 helper.assertNoRegion(HighlightType.BUILT_IN, 'implements = 42');
646 });
647 });
648
649 test('import', () {
650 var code = '''
651 import "foo.dart";
652 main() {
653 var import = 42;
654 }''';
655 return testRegions(code, (NotificationHighlightHelper helper) {
656 helper.assertHasRegion(HighlightType.BUILT_IN, 'import "');
657 helper.assertNoRegion(HighlightType.BUILT_IN, 'import = 42');
658 });
659 });
660
661 test('library', () {
662 var code = '''
663 library lib;
664 main() {
665 var library = 42;
666 }''';
667 return testRegions(code, (NotificationHighlightHelper helper) {
668 helper.assertHasRegion(HighlightType.BUILT_IN, 'library lib;');
669 helper.assertNoRegion(HighlightType.BUILT_IN, 'library = 42');
670 });
671 });
672
673 test('native', () {
674 var code = '''
675 class A native "A_native" {}
676 class B {
677 bbb() native "bbb_native";
678 }
679 main() {
680 var native = 42;
681 }''';
682 return testRegions(code, (NotificationHighlightHelper helper) {
683 helper.assertHasRegion(HighlightType.BUILT_IN, 'native "A_');
684 helper.assertHasRegion(HighlightType.BUILT_IN, 'native "bbb_');
685 helper.assertNoRegion(HighlightType.BUILT_IN, 'native = 42');
686 });
687 });
688
689 test('on', () {
690 var code = '''
691 main() {
692 try {
693 } on int catch (e) {
694 }
695 var on = 42;
696 }''';
697 return testRegions(code, (NotificationHighlightHelper helper) {
698 helper.assertHasRegion(HighlightType.BUILT_IN, 'on int');
699 helper.assertNoRegion(HighlightType.BUILT_IN, 'on = 42');
700 });
701 });
702
703 test('operator', () {
704 var code = '''
705 class A {
706 operator +(x) => null;
707 }
708 main() {
709 var operator = 42;
710 }''';
711 return testRegions(code, (NotificationHighlightHelper helper) {
712 helper.assertHasRegion(HighlightType.BUILT_IN, 'operator +(');
713 helper.assertNoRegion(HighlightType.BUILT_IN, 'operator = 42');
714 });
715 });
716
717 test('part', () {
718 var helper = new NotificationHighlightHelper();
719 var code = '''
720 part "my_part.dart";
721 main() {
722 var part = 42;
723 }''';
724 helper.createSingleFileProject(code);
725 helper.setFileContent('/project/bin/my_part.dart', 'part of lib;');
726 return helper.prepareRegions(() {
727 helper.assertHasRegion(HighlightType.BUILT_IN, 'part "my_');
728 helper.assertNoRegion(HighlightType.BUILT_IN, 'part = 42');
729 });
730 });
731
732 test('part', () {
733 var helper = new NotificationHighlightHelper();
734 var code = '''
735 part of lib;
736 main() {
737 var part = 1;
738 var of = 2;
739 }''';
740 helper.createSingleFileProject(code);
741 helper.setFileContent('/project/bin/lib.dart', '''
742 library lib;
743 part 'test.dart';
744 ''');
745 return helper.prepareRegions(() {
746 helper.assertHasRegion(HighlightType.BUILT_IN, 'part of', 'part of'.leng th);
747 helper.assertNoRegion(HighlightType.BUILT_IN, 'part = 1');
748 helper.assertNoRegion(HighlightType.BUILT_IN, 'of = 2');
749 });
750 });
751
752 test('set', () {
753 var code = '''
754 set aaa(x) {}
755 class A
756 set bbb(x) {}
757 }
758 main() {
759 var set = 42;
760 }''';
761 return testRegions(code, (NotificationHighlightHelper helper) {
762 helper.assertHasRegion(HighlightType.BUILT_IN, 'set aaa(');
763 helper.assertHasRegion(HighlightType.BUILT_IN, 'set bbb(');
764 helper.assertNoRegion(HighlightType.BUILT_IN, 'set = 42');
765 });
766 });
767
768 test('show', () {
769 var code = '''
770 import 'foo.dart' show Foo;
771 main() {
772 var show = 42;
773 }''';
774 return testRegions(code, (NotificationHighlightHelper helper) {
775 helper.assertHasRegion(HighlightType.BUILT_IN, 'show Foo');
776 helper.assertNoRegion(HighlightType.BUILT_IN, 'show = 42');
777 });
778 });
779
780 test('static', () {
781 var code = '''
782 class A {
783 static aaa;
784 static bbb() {}
785 }
786 main() {
787 var static = 42;
788 }''';
789 return testRegions(code, (NotificationHighlightHelper helper) {
790 helper.assertHasRegion(HighlightType.BUILT_IN, 'static aaa;');
791 helper.assertHasRegion(HighlightType.BUILT_IN, 'static bbb()');
792 helper.assertNoRegion(HighlightType.BUILT_IN, 'static = 42');
793 });
794 });
795
796 test('typedef', () {
797 var code = '''
798 typedef A();
799 main() {
800 var typedef = 42;
801 }''';
802 return testRegions(code, (NotificationHighlightHelper helper) {
803 helper.assertHasRegion(HighlightType.BUILT_IN, 'typedef A();');
804 helper.assertNoRegion(HighlightType.BUILT_IN, 'typedef = 42');
805 });
806 });
807 });
808
809 group('CLASS', () {
810 test('CLASS', () {
811 var code = '''
812 class AAA {}
813 AAA aaa;
814 ''';
815 return testRegions(code, (NotificationHighlightHelper helper) {
816 helper.assertHasRegion(HighlightType.CLASS, 'AAA {}');
817 helper.assertHasRegion(HighlightType.CLASS, 'AAA aaa');
818 });
819 });
820
821 test('not dynamic', () {
822 var code = '''
823 dynamic f() {}
824 ''';
825 return testRegions(code, (NotificationHighlightHelper helper) {
826 helper.assertNoRegion(HighlightType.CLASS, 'dynamic f()');
827 });
828 });
829
830 test('not void', () {
831 var code = '''
832 void f() {}
833 ''';
834 return testRegions(code, (NotificationHighlightHelper helper) {
835 helper.assertNoRegion(HighlightType.CLASS, 'void f()');
836 });
837 });
838 });
839
840 test('CONSTRUCTOR', () {
841 var code = '''
842 class AAA {
843 AAA() {}
844 AAA.name(p) {}
845 }
846 main() {
847 new AAA();
848 new AAA.name(42);
849 }
850 ''';
851 return testRegions(code, (NotificationHighlightHelper helper) {
852 helper.assertHasRegion(HighlightType.CONSTRUCTOR, 'name(p)');
853 helper.assertHasRegion(HighlightType.CONSTRUCTOR, 'name(42)');
854 helper.assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA() {}');
855 helper.assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA();');
856 });
857 });
858
859 test('DYNAMIC_TYPE', () {
860 var code = '''
861 f() {}
862 main(p) {
863 print(p);
864 var v1 = f();
865 int v2;
866 var v3 = v2;
867 }
868 ''';
869 return testRegions(code, (NotificationHighlightHelper helper) {
870 helper.assertHasRegion(HighlightType.DYNAMIC_TYPE, 'p)');
871 helper.assertHasRegion(HighlightType.DYNAMIC_TYPE, 'v1 =');
872 helper.assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v2;');
873 helper.assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v3 =');
874 });
875 });
876
877 test('FIELD', () {
878 var code = '''
879 class A {
880 int aaa = 1;
881 int bbb = 2;
882 A([this.bbb = 3]);
883 }
884 main(A a) {
885 a.aaa = 4;
886 a.bbb = 5;
887 }
888 ''';
889 return testRegions(code, (NotificationHighlightHelper helper) {
890 helper.assertHasRegion(HighlightType.FIELD, 'aaa = 1');
891 helper.assertHasRegion(HighlightType.FIELD, 'bbb = 2');
892 helper.assertHasRegion(HighlightType.FIELD, 'bbb = 3');
893 helper.assertHasRegion(HighlightType.FIELD, 'aaa = 4');
894 helper.assertHasRegion(HighlightType.FIELD, 'bbb = 5');
895 });
896 });
897
898 test('FIELD_STATIC', () {
899 var code = '''
900 class A {
901 static aaa = 1;
902 static get bbb => null;
903 static set ccc(x) {}
904 }
905 main() {
906 A.aaa = 2;
907 A.bbb;
908 A.ccc = 3;
909 }
910 ''';
911 return testRegions(code, (NotificationHighlightHelper helper) {
912 helper.assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
913 helper.assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 2');
914 helper.assertHasRegion(HighlightType.FIELD_STATIC, 'bbb;');
915 helper.assertHasRegion(HighlightType.FIELD_STATIC, 'ccc = 3');
916 });
917 });
918
919 test('FUNCTION', () {
920 var code = '''
921 fff(p) {}
922 main() {
923 fff(42);
924 }
925 ''';
926 return testRegions(code, (NotificationHighlightHelper helper) {
927 helper.assertHasRegion(HighlightType.FUNCTION_DECLARATION, 'fff(p) {}');
928 helper.assertHasRegion(HighlightType.FUNCTION, 'fff(42)');
929 });
930 });
931
932 test('FUNCTION_TYPE_ALIAS', () {
933 var code = '''
934 typedef FFF(p);
935 main(FFF fff) {
936 }
937 ''';
938 return testRegions(code, (NotificationHighlightHelper helper) {
939 helper.assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF(p)');
940 helper.assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF fff)');
941 });
942 });
943
944 test('GETTER_DECLARATION', () {
945 var code = '''
946 get aaa => null;
947 class A {
948 get bbb => null;
949 }
950 main(A a) {
951 aaa;
952 a.bbb;
953 }
954 ''';
955 return testRegions(code, (NotificationHighlightHelper helper) {
956 helper.assertHasRegion(HighlightType.GETTER_DECLARATION, 'aaa => null');
957 helper.assertHasRegion(HighlightType.GETTER_DECLARATION, 'bbb => null');
958 helper.assertHasRegion(HighlightType.FIELD_STATIC, 'aaa;');
959 helper.assertHasRegion(HighlightType.FIELD, 'bbb;');
960 });
961 });
962
963 test('IDENTIFIER_DEFAULT', () {
964 var code = '''
965 main() {
966 aaa = 42;
967 bbb(84);
968 CCC ccc;
969 }
970 ''';
971 return testRegions(code, (NotificationHighlightHelper helper) {
972 helper.assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'aaa = 42');
973 helper.assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'bbb(84)');
974 helper.assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'CCC ccc');
975 });
976 });
977
978 test('IMPORT_PREFIX', () {
979 var code = '''
980 import 'dart:math' as ma;
981 main() {
982 ma.max(1, 2);
983 }
984 ''';
985 return testRegions(code, (NotificationHighlightHelper helper) {
986 helper.assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma;');
987 helper.assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma.max');
988 });
989 });
990
991 test('KEYWORD void', () {
992 var code = '''
993 void main() {
994 }
995 ''';
996 return testRegions(code, (NotificationHighlightHelper helper) {
997 helper.assertHasRegion(HighlightType.KEYWORD, 'void main()');
998 });
999 });
1000
1001 test('LITERAL_BOOLEAN', () {
1002 var code = 'var V = true;';
1003 return testRegions(code, (NotificationHighlightHelper helper) {
1004 helper.assertHasRegion(HighlightType.LITERAL_BOOLEAN, 'true;');
1005 });
1006 });
1007
1008 test('LITERAL_DOUBLE', () {
1009 var code = 'var V = 4.2;';
1010 return testRegions(code, (NotificationHighlightHelper helper) {
1011 helper.assertHasRegion(HighlightType.LITERAL_DOUBLE, '4.2;', '4.2'.length) ;
1012 });
1013 });
1014
1015 test('LITERAL_INTEGER', () {
1016 var code = 'var V = 42;';
1017 return testRegions(code, (NotificationHighlightHelper helper) {
1018 helper.assertHasRegion(HighlightType.LITERAL_INTEGER, '42;');
1019 });
1020 });
1021
1022 test('LITERAL_STRING', () {
1023 var code = 'var V = "abc";';
1024 return testRegions(code, (NotificationHighlightHelper helper) {
1025 helper.assertHasRegion(HighlightType.LITERAL_STRING, '"abc";', '"abc"'.len gth);
1026 });
1027 });
1028
1029 test('LOCAL_VARIABLE', () {
1030 var code = '''
1031 main() {
1032 int vvv = 0;
1033 vvv;
1034 vvv = 1;
1035 }
1036 ''';
1037 return testRegions(code, (NotificationHighlightHelper helper) {
1038 helper.assertHasRegion(HighlightType.LOCAL_VARIABLE_DECLARATION, 'vvv = 0' );
1039 helper.assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv;');
1040 helper.assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv = 1;');
1041 });
1042 });
1043
1044 test('METHOD', () {
1045 var code = '''
1046 class A {
1047 aaa() {}
1048 static bbb() {}
1049 }
1050 main(A a) {
1051 a.aaa();
1052 a.aaa;
1053 A.bbb();
1054 A.bbb;
1055 }
1056 ''';
1057 return testRegions(code, (NotificationHighlightHelper helper) {
1058 helper.assertHasRegion(HighlightType.METHOD_DECLARATION, 'aaa() {}');
1059 helper.assertHasRegion(HighlightType.METHOD_DECLARATION_STATIC, 'bbb() {}' );
1060 helper.assertHasRegion(HighlightType.METHOD, 'aaa();');
1061 helper.assertHasRegion(HighlightType.METHOD, 'aaa;');
1062 helper.assertHasRegion(HighlightType.METHOD_STATIC, 'bbb();');
1063 helper.assertHasRegion(HighlightType.METHOD_STATIC, 'bbb;');
1064 });
1065 });
1066
1067 test('METHOD best type', () {
1068 var code = '''
1069 main(p) {
1070 if (p is List) {
1071 p.add(null);
1072 }
1073 }
1074 ''';
1075 return testRegions(code, (NotificationHighlightHelper helper) {
1076 helper.assertHasRegion(HighlightType.METHOD, 'add(null)');
1077 });
1078 });
1079
1080 test('PARAMETER', () {
1081 var code = '''
1082 main(int p) {
1083 p;
1084 p = 42;
1085 }
1086 ''';
1087 return testRegions(code, (NotificationHighlightHelper helper) {
1088 helper.assertHasRegion(HighlightType.PARAMETER, 'p) {');
1089 helper.assertHasRegion(HighlightType.PARAMETER, 'p;');
1090 helper.assertHasRegion(HighlightType.PARAMETER, 'p = 42');
1091 });
1092 });
1093
1094 test('SETTER_DECLARATION', () {
1095 var code = '''
1096 set aaa(x) {}
1097 class A {
1098 set bbb(x) {}
1099 }
1100 main(A a) {
1101 aaa = 1;
1102 a.bbb = 2;
1103 }
1104 ''';
1105 return testRegions(code, (NotificationHighlightHelper helper) {
1106 helper.assertHasRegion(HighlightType.SETTER_DECLARATION, 'aaa(x)');
1107 helper.assertHasRegion(HighlightType.SETTER_DECLARATION, 'bbb(x)');
1108 helper.assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
1109 helper.assertHasRegion(HighlightType.FIELD, 'bbb = 2');
1110 });
1111 });
1112
1113 test('TOP_LEVEL_VARIABLE', () {
1114 var code = '''
1115 var VVV = 0;
1116 main() {
1117 print(VVV);
1118 VVV = 1;
1119 }
1120 ''';
1121 return testRegions(code, (NotificationHighlightHelper helper) {
1122 helper.assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'VVV = 0');
1123 helper.assertHasRegion(HighlightType.FIELD_STATIC, 'VVV);');
1124 helper.assertHasRegion(HighlightType.FIELD_STATIC, 'VVV = 1');
1125 });
1126 });
1127
1128 test('TYPE_NAME_DYNAMIC', () {
1129 var code = '''
1130 dynamic main() {
1131 dynamic = 42;
1132 }
1133 ''';
1134 return testRegions(code, (NotificationHighlightHelper helper) {
1135 helper.assertHasRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic main()');
1136 helper.assertNoRegion(HighlightType.IDENTIFIER_DEFAULT, 'dynamic main()');
1137 helper.assertNoRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic = 42');
1138 });
1139 });
1140
1141 test('TYPE_PARAMETER', () {
1142 var code = '''
1143 class A<T> {
1144 T fff;
1145 T mmm(T p) => null;
1146 }
1147 ''';
1148 return testRegions(code, (NotificationHighlightHelper helper) {
1149 helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T> {');
1150 helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T fff;');
1151 helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T mmm(');
1152 helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T p)');
1153 });
1154 });
1155 }
1156
1157
1158
1159
1160 class NotificationNavigationHelper extends AnalysisTestHelper {
1161 List<Map<String, Object>> regions;
1162
1163 Future prepareRegions(then()) {
1164 addAnalysisSubscriptionNavigation(testFile);
1165 return waitForOperationsFinished().then((_) {
1166 regions = getTestNavigation();
1167 then();
1168 });
1169 }
1170
1171 void assertHasRegion(String regionSearch, String targetSearch) {
1172 var regionOffset = findOffset(regionSearch);
1173 int regionLength = findIdentifierLength(regionSearch);
1174 var targetOffset = findOffset(targetSearch);
1175 var targetLength = findIdentifierLength(targetSearch);
1176 asserHasRegionInts(regionOffset, regionLength, targetOffset, targetLength);
1177 }
1178
1179 void asserHasOperatorRegion(String search, int regionLength, int targetLength) {
1180 var regionOffset = findOffset(search);
1181 var region = asserHasRegionInts(regionOffset, regionLength, -1, 0);
1182 if (targetLength != -1) {
1183 expect(region['targets'][0]['length'], targetLength);
1184 }
1185 }
1186
1187 asserHasRegionInts(int regionOffset, int regionLength,
1188 int targetOffset, int targetLength) {
1189 Map<String, Object> region = findRegion(regionOffset, regionLength);
1190 if (region != null) {
1191 List<Map<String, Object>> targets = region['targets'];
1192 if (targetOffset == -1) {
1193 return region;
1194 }
1195 var target = findTarget(targets, testFile, targetOffset, targetLength);
1196 if (target != null) {
1197 return target;
1198 }
1199 }
1200 fail('Expected to find (offset=$regionOffset; length=$regionLength) => '
1201 '(offset=$targetOffset; length=$targetLength) in\n'
1202 '${regions.join('\n')}');
1203 }
1204
1205 Map<String, Object> findRegionString(String search, [bool notNull]) {
1206 int offset = findOffset(search);
1207 int length = search.length;
1208 return findRegion(offset, length, notNull);
1209 }
1210
1211 Map<String, Object> findRegionAt(String search, [bool notNull]) {
1212 int offset = findOffset(search);
1213 for (Map<String, Object> region in regions) {
1214 if (region['offset'] == offset) {
1215 if (notNull == false) {
1216 fail('Not expected to find at offset=$offset in\n'
1217 '${regions.join('\n')}');
1218 }
1219 return region;
1220 }
1221 }
1222 if (notNull == true) {
1223 fail('Expected to find at offset=$offset in\n'
1224 '${regions.join('\n')}');
1225 }
1226 return null;
1227 }
1228
1229 Map<String, Object> findRegionIdentifier(String search, [bool notNull]) {
1230 int offset = findOffset(search);
1231 int length = findIdentifierLength(search);
1232 return findRegion(offset, length, notNull);
1233 }
1234
1235 Map<String, Object> findRegion(int offset, int length, [bool notNull]) {
1236 for (Map<String, Object> region in regions) {
1237 if (region['offset'] == offset && region['length'] == length) {
1238 if (notNull == false) {
1239 fail('Not expected to find (offset=$offset; length=$length) in\n'
1240 '${regions.join('\n')}');
1241 }
1242 return region;
1243 }
1244 }
1245 if (notNull == true) {
1246 fail('Expected to find (offset=$offset; length=$length) in\n'
1247 '${regions.join('\n')}');
1248 }
1249 return null;
1250 }
1251
1252 Map<String, Object> findTarget(List<Map<String, Object>> targets,
1253 String file, int offset, int length) {
1254 for (Map<String, Object> target in targets) {
1255 if (target['file'] == file &&
1256 target['offset'] == offset &&
1257 target['length'] == length) {
1258 return target;
1259 }
1260 }
1261 return null;
1262 }
1263
1264 void assertNoRegion(String regionSearch) {
1265 var regionOffset = findOffset(regionSearch);
1266 var regionLength = findIdentifierLength(regionSearch);
1267 for (Map<String, Object> region in regions) {
1268 if (region['offset'] == regionOffset && region['length'] == regionLength) {
1269 fail('Unexpected (offset=$regionOffset; length=$regionLength) in\n'
1270 '${regions.join('\n')}');
1271 }
1272 }
1273 }
1274 }
1275
1276
1277 int findIdentifierLength(String search) {
1278 int length = 0;
1279 while (length < search.length) {
1280 int c = search.codeUnitAt(length);
1281 if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) ||
1282 c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) ||
1283 c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) {
1284 break;
1285 }
1286 length++;
1287 }
1288 return length;
1289 }
1290
1291
1292 testNotificationNavigation() {
1293 Future testNavigation(String code, then(NotificationNavigationHelper helper)) {
1294 var helper = new NotificationNavigationHelper();
1295 helper.createSingleFileProject(code);
1296 return helper.prepareRegions(() {
1297 then(helper);
1298 });
1299 }
1300
1301 group('constructor', () {
1302 test('named', () {
1303 var code = '''
1304 class A {
1305 A.named(int p) {}
1306 }
1307 ''';
1308 return testNavigation(code, (NotificationNavigationHelper helper) {
1309 // has region for complete "A.named"
1310 helper.asserHasRegionInts(
1311 helper.findOffset('A.named'), 'A.named'.length,
1312 helper.findOffset('named(int'), 'named'.length);
1313 // no separate regions for "A" and "named"
1314 helper.assertNoRegion('A.named(');
1315 helper.assertNoRegion('named(');
1316 // validate that we don't forget to resolve parameters
1317 helper.asserHasRegionInts(
1318 helper.findOffset('int p'), 'int'.length,
1319 -1, 0);
1320 });
1321 });
1322
1323 test('unnamed', () {
1324 var code = '''
1325 class A {
1326 A(int p) {}
1327 }
1328 ''';
1329 return testNavigation(code, (NotificationNavigationHelper helper) {
1330 // has constructor region for "A()"
1331 helper.asserHasRegionInts(
1332 helper.findOffset('A(int p)'), 'A'.length,
1333 helper.findOffset('A(int p)'), 0);
1334 // validate that we don't forget to resolve parameters
1335 helper.asserHasRegionInts(
1336 helper.findOffset('int p'), 'int'.length,
1337 -1, 0);
1338 });
1339 });
1340 });
1341
1342 group('identifier', () {
1343 test('resolved', () {
1344 var code = '''
1345 class AAA {}
1346 main() {
1347 AAA aaa = null;
1348 print(aaa);
1349 }
1350 ''';
1351 return testNavigation(code, (NotificationNavigationHelper helper) {
1352 helper.assertHasRegion('AAA aaa', 'AAA {}');
1353 helper.assertHasRegion('aaa);', 'aaa = null');
1354 helper.assertHasRegion('main() {', 'main() {');
1355 });
1356 });
1357
1358 test('unresolved', () {
1359 var code = '''
1360 main() {
1361 print(noo);
1362 }
1363 ''';
1364 return testNavigation(code, (NotificationNavigationHelper helper) {
1365 helper.assertNoRegion('noo);');
1366 });
1367 });
1368 });
1369
1370 test('fieldFormalParameter', () {
1371 var code = '''
1372 class A {
1373 int fff = 123;
1374 A(this.fff);
1375 }
1376 ''';
1377 return testNavigation(code, (NotificationNavigationHelper helper) {
1378 helper.assertHasRegion('fff);', 'fff = 123');
1379 });
1380 });
1381
1382 group('instanceCreation', () {
1383 test('implicit', () {
1384 var code = '''
1385 class A {
1386 }
1387 main() {
1388 new A();
1389 }
1390 ''';
1391 return testNavigation(code, (NotificationNavigationHelper helper) {
1392 helper.asserHasRegionInts(
1393 helper.findOffset('new A'), 'new A'.length,
1394 helper.findOffset('A {'), 'A'.length);
1395 });
1396 });
1397
1398 test('named', () {
1399 var code = '''
1400 class A {
1401 A.named() {}
1402 }
1403 main() {
1404 new A.named();
1405 }
1406 ''';
1407 return testNavigation(code, (NotificationNavigationHelper helper) {
1408 helper.asserHasRegionInts(
1409 helper.findOffset('new A.named'), 'new A.named'.length,
1410 helper.findOffset('named()'), 'named'.length);
1411 });
1412 });
1413
1414 test('unnamed', () {
1415 var code = '''
1416 class A {
1417 A() {}
1418 }
1419 main() {
1420 new A();
1421 }
1422 ''';
1423 return testNavigation(code, (NotificationNavigationHelper helper) {
1424 helper.asserHasRegionInts(
1425 helper.findOffset('new A'), 'new A'.length,
1426 helper.findOffset('A()'), ''.length);
1427 });
1428 });
1429 });
1430
1431 group('operator', () {
1432 test('int', () {
1433 var code = '''
1434 main() {
1435 var v = 0;
1436 v - 1;
1437 v + 2;
1438 -v; // unary
1439 --v;
1440 ++v;
1441 v--; // mm
1442 v++; // pp
1443 v -= 3;
1444 v += 4;
1445 v *= 5;
1446 v /= 6;
1447 }
1448 ''';
1449 return testNavigation(code, (NotificationNavigationHelper helper) {
1450 helper.asserHasOperatorRegion('- 1;', 1, 1);
1451 helper.asserHasOperatorRegion('+ 2;', 1, 1);
1452 helper.asserHasOperatorRegion('-v; // unary', 1, -1);
1453 helper.asserHasOperatorRegion('--v;', 2, 1);
1454 helper.asserHasOperatorRegion('++v;', 2, 1);
1455 helper.asserHasOperatorRegion('--; // mm', 2, 1);
1456 helper.asserHasOperatorRegion('++; // pp', 2, 1);
1457 helper.asserHasOperatorRegion('-= 3;', 2, 1);
1458 helper.asserHasOperatorRegion('+= 4;', 2, 1);
1459 helper.asserHasOperatorRegion('*= 5;', 2, 1);
1460 helper.asserHasOperatorRegion('/= 6;', 2, 1);
1461 });
1462 });
1463
1464 test('list', () {
1465 var code = '''
1466 main() {
1467 List<int> v = [1, 2, 3];
1468 v[0]; // []
1469 v[1] = 1; // []=
1470 v[2] += 2;
1471 }
1472 ''';
1473 return testNavigation(code, (NotificationNavigationHelper helper) {
1474 helper.asserHasOperatorRegion(']; // []', 1, 2);
1475 helper.asserHasOperatorRegion('] = 1', 1, 3);
1476 helper.asserHasOperatorRegion('] += 2', 1, 3);
1477 helper.asserHasOperatorRegion('+= 2', 2, 1);
1478 });
1479 });
1480 });
1481
1482 test('partOf', () {
1483 var helper = new NotificationNavigationHelper();
1484 var code = '''
1485 part of lib;
1486 ''';
1487 helper.createSingleFileProject(code);
1488 var libPath = helper.setFileContent('/project/bin/lib.dart', '''
1489 library lib;
1490 part 'test.dart';
1491 ''');
1492 return helper.prepareRegions(() {
1493 var region = helper.findRegionString('part of lib', true);
1494 var target = region['targets'][0];
1495 expect(target['file'], libPath);
1496 });
1497 });
1498
1499 group('string', () {
1500 test('export', () {
1501 var code = '''
1502 export "dart:math";
1503 ''';
1504 return testNavigation(code, (NotificationNavigationHelper helper) {
1505 helper.findRegionString('export "dart:math"', true);
1506 });
1507 });
1508
1509 test('export unresolved URI', () {
1510 var code = '''
1511 export 'no.dart';
1512 ''';
1513 return testNavigation(code, (NotificationNavigationHelper helper) {
1514 helper.findRegionAt('export ', false);
1515 });
1516 });
1517
1518 test('import', () {
1519 var code = '''
1520 import "dart:math" as m;
1521 ''';
1522 return testNavigation(code, (NotificationNavigationHelper helper) {
1523 helper.findRegionString('import "dart:math"', true);
1524 });
1525 });
1526
1527 test('import no URI', () {
1528 var code = '''
1529 import ;
1530 ''';
1531 return testNavigation(code, (NotificationNavigationHelper helper) {
1532 helper.findRegionAt('import ', false);
1533 });
1534 });
1535
1536 test('import unresolved URI', () {
1537 var code = '''
1538 import 'no.dart';
1539 ''';
1540 return testNavigation(code, (NotificationNavigationHelper helper) {
1541 helper.findRegionAt('import ', false);
1542 });
1543 });
1544
1545 test('part', () {
1546 var helper = new NotificationNavigationHelper();
1547 var code = '''
1548 library lib;
1549 part "my_part.dart";
1550 ''';
1551 helper.createSingleFileProject(code);
1552 var unitPath = helper.setFileContent('/project/bin/my_part.dart', '''
1553 part of lib;
1554 ''');
1555 return helper.prepareRegions(() {
1556 var region = helper.findRegionString('part "my_part.dart"', true);
1557 var target = region['targets'][0];
1558 expect(target['file'], unitPath);
1559 });
1560 });
1561
1562 test('part unresolved URI', () {
1563 // TODO(scheglov) why do we throw MemoryResourceException here?
1564 // This Source/File does not exist.
1565 // var helper = new NotificationNavigationHelper();
1566 // var code = '''
1567 //library lib;
1568 //part "my_part.dart";
1569 //''';
1570 // helper.createSingleFileProject(code);
1571 // return helper.prepareRegions(() {
1572 // helper.findRegionAt('part ', false);
1573 // });
1574 });
1575 });
1576 }
1577
1578
1579 testUpdateContent() { 422 testUpdateContent() {
1580 test('full content', () { 423 test('full content', () {
1581 AnalysisTestHelper helper = new AnalysisTestHelper(); 424 AnalysisTestHelper helper = new AnalysisTestHelper();
1582 helper.createSingleFileProject('// empty'); 425 helper.createSingleFileProject('// empty');
1583 return helper.waitForOperationsFinished().then((_) { 426 return helper.waitForOperationsFinished().then((_) {
1584 // no errors initially 427 // no errors initially
1585 List<AnalysisError> errors = helper.getTestErrors(); 428 List<AnalysisError> errors = helper.getTestErrors();
1586 expect(errors, isEmpty); 429 expect(errors, isEmpty);
1587 // update code 430 // update code
1588 helper.sendContentChange({ 431 helper.sendContentChange({
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1727 // create project and wait for analysis 570 // create project and wait for analysis
1728 createProject(); 571 createProject();
1729 return waitForTasksFinished().then((_) { 572 return waitForTasksFinished().then((_) {
1730 // if 'package:pkgA/libA.dart' was resolved, then there are no errors 573 // if 'package:pkgA/libA.dart' was resolved, then there are no errors
1731 expect(filesErrors[testFile], isEmpty); 574 expect(filesErrors[testFile], isEmpty);
1732 // packages file also was resolved 575 // packages file also was resolved
1733 expect(filesErrors[pkgFile], isEmpty); 576 expect(filesErrors[pkgFile], isEmpty);
1734 }); 577 });
1735 } 578 }
1736 } 579 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698