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