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

Side by Side Diff: pkg/analysis_server/test/edit/refactoring_test.dart

Issue 717513003: Issue 21552. Fixes for navigation, hover and rename in instance creation expressions. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 1 month 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.edit.refactoring; 5 library test.edit.refactoring;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 8
9 import 'package:analysis_server/src/edit/edit_domain.dart'; 9 import 'package:analysis_server/src/edit/edit_domain.dart';
10 import 'package:analysis_server/src/protocol.dart'; 10 import 'package:analysis_server/src/protocol.dart';
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 return sendStringSuffixRequest('1 + 2', '); // marker', 'res', false); 293 return sendStringSuffixRequest('1 + 2', '); // marker', 'res', false);
294 }, ''' 294 }, '''
295 main() { 295 main() {
296 print(1 + 2); 296 print(1 + 2);
297 var res = 1 + 2; 297 var res = 1 + 2;
298 print(res); // marker 298 print(res); // marker
299 } 299 }
300 '''); 300 ''');
301 } 301 }
302 302
303 test_names() {
304 addTestFile('''
305 class TreeItem {}
306 TreeItem getSelectedItem() => null;
307 main() {
308 var a = getSelectedItem();
309 }
310 ''');
311 return getRefactoringResult(() {
312 return sendStringSuffixRequest('getSelectedItem()', ';', null, true);
313 }).then((result) {
314 ExtractLocalVariableFeedback feedback = result.feedback;
315 expect(
316 feedback.names,
317 unorderedEquals(['treeItem', 'item', 'selectedItem']));
318 expect(result.change, isNull);
319 });
320 }
321
303 test_nameWarning() { 322 test_nameWarning() {
304 addTestFile(''' 323 addTestFile('''
305 main() { 324 main() {
306 print(1 + 2); 325 print(1 + 2);
307 } 326 }
308 '''); 327 ''');
309 return getRefactoringResult(() { 328 return getRefactoringResult(() {
310 return sendStringRequest('1 + 2', 'Name', true); 329 return sendStringRequest('1 + 2', 'Name', true);
311 }).then((result) { 330 }).then((result) {
312 assertResultProblemsWarning( 331 assertResultProblemsWarning(
313 result.optionsProblems, 332 result.optionsProblems,
314 'Variable name should start with a lowercase letter.'); 333 'Variable name should start with a lowercase letter.');
315 // ...but there is still a change 334 // ...but there is still a change
316 assertTestRefactoringResult(result, ''' 335 assertTestRefactoringResult(result, '''
317 main() { 336 main() {
318 var Name = 1 + 2; 337 var Name = 1 + 2;
319 print(Name); 338 print(Name);
320 } 339 }
321 '''); 340 ''');
322 }); 341 });
323 } 342 }
324 343
325 test_names() {
326 addTestFile('''
327 class TreeItem {}
328 TreeItem getSelectedItem() => null;
329 main() {
330 var a = getSelectedItem();
331 }
332 ''');
333 return getRefactoringResult(() {
334 return sendStringSuffixRequest('getSelectedItem()', ';', null, true);
335 }).then((result) {
336 ExtractLocalVariableFeedback feedback = result.feedback;
337 expect(
338 feedback.names,
339 unorderedEquals(['treeItem', 'item', 'selectedItem']));
340 expect(result.change, isNull);
341 });
342 }
343
344 test_offsetsLengths() { 344 test_offsetsLengths() {
345 addTestFile(''' 345 addTestFile('''
346 main() { 346 main() {
347 print(1 + 2); 347 print(1 + 2);
348 print(1 + 2); 348 print(1 + 2);
349 } 349 }
350 '''); 350 ''');
351 return getRefactoringResult(() { 351 return getRefactoringResult(() {
352 return sendStringRequest('1 + 2', 'res', true); 352 return sendStringRequest('1 + 2', 'res', true);
353 }).then((result) { 353 }).then((result) {
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 List<RefactoringKind> kinds = 726 List<RefactoringKind> kinds =
727 getRefactoringsAtString('// not an element'); 727 getRefactoringsAtString('// not an element');
728 expect(kinds, isNot(contains(RefactoringKind.RENAME))); 728 expect(kinds, isNot(contains(RefactoringKind.RENAME)));
729 }); 729 });
730 } 730 }
731 } 731 }
732 732
733 733
734 @ReflectiveTestCase() 734 @ReflectiveTestCase()
735 class InlineLocalTest extends _AbstractGetRefactoring_Test { 735 class InlineLocalTest extends _AbstractGetRefactoring_Test {
736 test_OK() {
737 addTestFile('''
738 main() {
739 int test = 42;
740 int a = test + 2;
741 print(test);
742 }
743 ''');
744 return assertSuccessfulRefactoring(() {
745 return _sendInlineRequest('test + 2');
746 }, '''
747 main() {
748 int a = 42 + 2;
749 print(42);
750 }
751 ''');
752 }
753
754 test_feedback() { 736 test_feedback() {
755 addTestFile(''' 737 addTestFile('''
756 main() { 738 main() {
757 int test = 42; 739 int test = 42;
758 print(test); 740 print(test);
759 print(test); 741 print(test);
760 } 742 }
761 '''); 743 ''');
762 return getRefactoringResult(() { 744 return getRefactoringResult(() {
763 return _sendInlineRequest('test ='); 745 return _sendInlineRequest('test =');
(...skipping 10 matching lines...) Expand all
774 return _sendInlineRequest('main() {}'); 756 return _sendInlineRequest('main() {}');
775 }).then((result) { 757 }).then((result) {
776 assertResultProblemsFatal( 758 assertResultProblemsFatal(
777 result.initialProblems, 759 result.initialProblems,
778 'Local variable declaration or reference must be selected to activate this refactoring.'); 760 'Local variable declaration or reference must be selected to activate this refactoring.');
779 // ...there is no any change 761 // ...there is no any change
780 expect(result.change, isNull); 762 expect(result.change, isNull);
781 }); 763 });
782 } 764 }
783 765
766 test_OK() {
767 addTestFile('''
768 main() {
769 int test = 42;
770 int a = test + 2;
771 print(test);
772 }
773 ''');
774 return assertSuccessfulRefactoring(() {
775 return _sendInlineRequest('test + 2');
776 }, '''
777 main() {
778 int a = 42 + 2;
779 print(42);
780 }
781 ''');
782 }
783
784 Future<Response> _sendInlineRequest(String search) { 784 Future<Response> _sendInlineRequest(String search) {
785 Request request = new EditGetRefactoringParams( 785 Request request = new EditGetRefactoringParams(
786 RefactoringKind.INLINE_LOCAL_VARIABLE, 786 RefactoringKind.INLINE_LOCAL_VARIABLE,
787 testFile, 787 testFile,
788 findOffset(search), 788 findOffset(search),
789 0, 789 0,
790 false).toRequest('0'); 790 false).toRequest('0');
791 return serverChannel.sendRequest(request); 791 return serverChannel.sendRequest(request);
792 } 792 }
793 } 793 }
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
962 testFile, 962 testFile,
963 findOffset(search), 963 findOffset(search),
964 0, 964 0,
965 validateOnly, 965 validateOnly,
966 options: options).toRequest('0'); 966 options: options).toRequest('0');
967 return serverChannel.sendRequest(request); 967 return serverChannel.sendRequest(request);
968 } 968 }
969 969
970 test_class() { 970 test_class() {
971 addTestFile(''' 971 addTestFile('''
972 class Test {
973 Test() {}
974 Test.named() {}
975 }
976 main() {
977 Test v;
978 new Test();
979 new Test.named();
980 }
981 ''');
982 return assertSuccessfulRefactoring(() {
983 return sendRenameRequest('Test {', 'NewName');
984 }, '''
985 class NewName {
986 NewName() {}
987 NewName.named() {}
988 }
989 main() {
990 NewName v;
991 new NewName();
992 new NewName.named();
993 }
994 ''');
995 }
996
997 test_class_options_fatalError() {
998 addTestFile('''
972 class Test {} 999 class Test {}
973 main() { 1000 main() {
974 Test v; 1001 Test v;
975 } 1002 }
976 '''); 1003 ''');
977 return assertSuccessfulRefactoring(() { 1004 return getRefactoringResult(() {
978 return sendRenameRequest('Test {}', 'NewName'); 1005 return sendRenameRequest('Test {}', '');
979 }, ''' 1006 }).then((result) {
1007 assertResultProblemsFatal(
1008 result.optionsProblems,
1009 'Class name must not be empty.');
1010 // ...there is no any change
1011 expect(result.change, isNull);
1012 });
1013 }
1014
1015 test_class_validateOnly() {
1016 addTestFile('''
1017 class Test {}
1018 main() {
1019 Test v;
1020 }
1021 ''');
1022 return getRefactoringResult(() {
1023 return sendRenameRequest('Test {}', 'NewName', true);
1024 }).then((result) {
1025 RenameFeedback feedback = result.feedback;
1026 assertResultProblemsOK(result);
1027 expect(feedback.elementKindName, 'class');
1028 expect(feedback.oldName, 'Test');
1029 expect(result.change, isNull);
1030 });
1031 }
1032
1033 test_class_warning() {
1034 addTestFile('''
1035 class Test {}
1036 main() {
1037 Test v;
1038 }
1039 ''');
1040 return getRefactoringResult(() {
1041 return sendRenameRequest('Test {}', 'newName');
1042 }).then((result) {
1043 assertResultProblemsWarning(
1044 result.optionsProblems,
1045 'Class name should start with an uppercase letter.');
1046 // ...but there is still a change
1047 assertTestRefactoringResult(result, '''
1048 class newName {}
1049 main() {
1050 newName v;
1051 }
1052 ''');
1053 }).then((_) {
1054 // "NewName" is a perfectly valid name
1055 return getRefactoringResult(() {
1056 return sendRenameRequest('Test {}', 'NewName');
1057 }).then((result) {
1058 assertResultProblemsOK(result);
1059 // ...and there is a new change
1060 assertTestRefactoringResult(result, '''
980 class NewName {} 1061 class NewName {}
981 main() { 1062 main() {
982 NewName v; 1063 NewName v;
983 } 1064 }
984 '''); 1065 ''');
1066 });
1067 });
985 } 1068 }
986 1069
987 test_classMember_field() { 1070 test_classMember_field() {
988 addTestFile(''' 1071 addTestFile('''
989 class A { 1072 class A {
990 var test = 0; 1073 var test = 0;
991 main() { 1074 main() {
992 print(test); 1075 print(test);
993 } 1076 }
994 } 1077 }
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 }, ''' 1177 }, '''
1095 class A { 1178 class A {
1096 set newName(x) {} 1179 set newName(x) {}
1097 main() { 1180 main() {
1098 newName = 0; 1181 newName = 0;
1099 } 1182 }
1100 } 1183 }
1101 '''); 1184 ''');
1102 } 1185 }
1103 1186
1104 test_class_fromInstanceCreation() {
1105 addTestFile('''
1106 class Test {
1107 Test() {}
1108 Test.named() {}
1109 }
1110 main() {
1111 new Test();
1112 new Test.named();
1113 }
1114 ''');
1115 return assertSuccessfulRefactoring(() {
1116 return sendRenameRequest('Test();', 'NewName');
1117 }, '''
1118 class NewName {
1119 NewName() {}
1120 NewName.named() {}
1121 }
1122 main() {
1123 new NewName();
1124 new NewName.named();
1125 }
1126 ''');
1127 }
1128
1129 test_class_options_fatalError() {
1130 addTestFile('''
1131 class Test {}
1132 main() {
1133 Test v;
1134 }
1135 ''');
1136 return getRefactoringResult(() {
1137 return sendRenameRequest('Test {}', '');
1138 }).then((result) {
1139 assertResultProblemsFatal(
1140 result.optionsProblems,
1141 'Class name must not be empty.');
1142 // ...there is no any change
1143 expect(result.change, isNull);
1144 });
1145 }
1146
1147 test_class_validateOnly() {
1148 addTestFile('''
1149 class Test {}
1150 main() {
1151 Test v;
1152 }
1153 ''');
1154 return getRefactoringResult(() {
1155 return sendRenameRequest('Test {}', 'NewName', true);
1156 }).then((result) {
1157 RenameFeedback feedback = result.feedback;
1158 assertResultProblemsOK(result);
1159 expect(feedback.elementKindName, 'class');
1160 expect(feedback.oldName, 'Test');
1161 expect(result.change, isNull);
1162 });
1163 }
1164
1165 test_class_warning() {
1166 addTestFile('''
1167 class Test {}
1168 main() {
1169 Test v;
1170 }
1171 ''');
1172 return getRefactoringResult(() {
1173 return sendRenameRequest('Test {}', 'newName');
1174 }).then((result) {
1175 assertResultProblemsWarning(
1176 result.optionsProblems,
1177 'Class name should start with an uppercase letter.');
1178 // ...but there is still a change
1179 assertTestRefactoringResult(result, '''
1180 class newName {}
1181 main() {
1182 newName v;
1183 }
1184 ''');
1185 }).then((_) {
1186 // "NewName" is a perfectly valid name
1187 return getRefactoringResult(() {
1188 return sendRenameRequest('Test {}', 'NewName');
1189 }).then((result) {
1190 assertResultProblemsOK(result);
1191 // ...and there is a new change
1192 assertTestRefactoringResult(result, '''
1193 class NewName {}
1194 main() {
1195 NewName v;
1196 }
1197 ''');
1198 });
1199 });
1200 }
1201
1202 test_constructor_fromInstanceCreation() { 1187 test_constructor_fromInstanceCreation() {
1203 addTestFile(''' 1188 addTestFile('''
1204 class A { 1189 class A {
1205 A.test() {} 1190 A.test() {}
1206 } 1191 }
1207 main() { 1192 main() {
1208 new A.test(); 1193 new A.test();
1209 } 1194 }
1210 '''); 1195 ''');
1211 return assertSuccessfulRefactoring(() { 1196 return assertSuccessfulRefactoring(() {
1212 return sendRenameRequest('test();', 'newName'); 1197 return sendRenameRequest('test();', 'newName');
1213 }, ''' 1198 }, '''
1214 class A { 1199 class A {
1215 A.newName() {} 1200 A.newName() {}
1201 }
1202 main() {
1203 new A.newName();
1204 }
1205 ''');
1206 }
1207
1208 test_constructor_fromInstanceCreation_default_onClassName() {
1209 addTestFile('''
1210 class A {
1211 A() {}
1212 }
1213 main() {
1214 new A();
1215 }
1216 ''');
1217 return assertSuccessfulRefactoring(() {
1218 return sendRenameRequest('A();', 'newName');
1219 }, '''
1220 class A {
1221 A.newName() {}
1222 }
1223 main() {
1224 new A.newName();
1225 }
1226 ''');
1227 }
1228
1229 test_constructor_fromInstanceCreation_default_onNew() {
1230 addTestFile('''
1231 class A {
1232 A() {}
1233 }
1234 main() {
1235 new A();
1236 }
1237 ''');
1238 return assertSuccessfulRefactoring(() {
1239 return sendRenameRequest('new A();', 'newName');
1240 }, '''
1241 class A {
1242 A.newName() {}
1216 } 1243 }
1217 main() { 1244 main() {
1218 new A.newName(); 1245 new A.newName();
1219 } 1246 }
1220 '''); 1247 ''');
1221 } 1248 }
1222 1249
1223 test_feedback() { 1250 test_feedback() {
1224 addTestFile(''' 1251 addTestFile('''
1225 class Test {} 1252 class Test {}
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
1542 } 1569 }
1543 1570
1544 @override 1571 @override
1545 void setUp() { 1572 void setUp() {
1546 super.setUp(); 1573 super.setUp();
1547 server.handlers = [new EditDomainHandler(server),]; 1574 server.handlers = [new EditDomainHandler(server),];
1548 createProject(); 1575 createProject();
1549 handler = new EditDomainHandler(server); 1576 handler = new EditDomainHandler(server);
1550 } 1577 }
1551 } 1578 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698