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