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

Side by Side Diff: tools/telemetry/third_party/rope/ropetest/refactor/renametest.py

Issue 1132103009: Example of refactoring using rope library. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 import sys
2 import unittest
3
4 import rope.base.codeanalyze
5 import rope.refactor.occurrences
6 from rope.refactor import rename
7 from rope.refactor.rename import Rename
8 from ropetest import testutils
9
10
11 class RenameRefactoringTest(unittest.TestCase):
12
13 def setUp(self):
14 super(RenameRefactoringTest, self).setUp()
15 self.project = testutils.sample_project()
16
17 def tearDown(self):
18 testutils.remove_project(self.project)
19 super(RenameRefactoringTest, self).tearDown()
20
21 def _local_rename(self, source_code, offset, new_name):
22 testmod = testutils.create_module(self.project, 'testmod')
23 testmod.write(source_code)
24 changes = Rename(self.project, testmod, offset).\
25 get_changes(new_name, resources=[testmod])
26 self.project.do(changes)
27 return testmod.read()
28
29 def _rename(self, resource, offset, new_name, **kwds):
30 changes = Rename(self.project, resource, offset).\
31 get_changes(new_name, **kwds)
32 self.project.do(changes)
33
34 def test_simple_global_variable_renaming(self):
35 refactored = self._local_rename('a_var = 20\n', 2, 'new_var')
36 self.assertEquals('new_var = 20\n', refactored)
37
38 def test_variable_renaming_only_in_its_scope(self):
39 refactored = self._local_rename(
40 'a_var = 20\ndef a_func():\n a_var = 10\n', 32, 'new_var')
41 self.assertEquals('a_var = 20\ndef a_func():\n new_var = 10\n',
42 refactored)
43
44 def test_not_renaming_dot_name(self):
45 refactored = self._local_rename(
46 "replace = True\n'aaa'.replace('a', 'b')\n", 1, 'new_var')
47 self.assertEquals("new_var = True\n'aaa'.replace('a', 'b')\n",
48 refactored)
49
50 def test_renaming_multiple_names_in_the_same_line(self):
51 refactored = self._local_rename(
52 'a_var = 10\na_var = 10 + a_var / 2\n', 2, 'new_var')
53 self.assertEquals('new_var = 10\nnew_var = 10 + new_var / 2\n',
54 refactored)
55
56 def test_renaming_names_when_getting_some_attribute(self):
57 refactored = self._local_rename(
58 "a_var = 'a b c'\na_var.split('\\n')\n", 2, 'new_var')
59 self.assertEquals("new_var = 'a b c'\nnew_var.split('\\n')\n",
60 refactored)
61
62 def test_renaming_names_when_getting_some_attribute2(self):
63 refactored = self._local_rename(
64 "a_var = 'a b c'\na_var.split('\\n')\n", 20, 'new_var')
65 self.assertEquals("new_var = 'a b c'\nnew_var.split('\\n')\n",
66 refactored)
67
68 def test_renaming_function_parameters1(self):
69 refactored = self._local_rename(
70 "def f(a_param):\n print(a_param)\n", 8, 'new_param')
71 self.assertEquals("def f(new_param):\n print(new_param)\n",
72 refactored)
73
74 def test_renaming_function_parameters2(self):
75 refactored = self._local_rename(
76 "def f(a_param):\n print(a_param)\n", 30, 'new_param')
77 self.assertEquals("def f(new_param):\n print(new_param)\n",
78 refactored)
79
80 def test_renaming_occurrences_inside_functions(self):
81 code = 'def a_func(p1):\n a = p1\na_func(1)\n'
82 refactored = self._local_rename(code, code.index('p1') + 1,
83 'new_param')
84 self.assertEquals(
85 'def a_func(new_param):\n a = new_param\na_func(1)\n',
86 refactored)
87
88 def test_renaming_arguments_for_normal_args_changing_calls(self):
89 code = 'def a_func(p1=None, p2=None):\n pass\na_func(p2=1)\n'
90 refactored = self._local_rename(code, code.index('p2') + 1, 'p3')
91 self.assertEquals(
92 'def a_func(p1=None, p3=None):\n pass\na_func(p3=1)\n',
93 refactored)
94
95 def test_renaming_function_parameters_of_class_init(self):
96 code = 'class A(object):\n def __init__(self, a_param):' \
97 '\n pass\n' \
98 'a_var = A(a_param=1)\n'
99 refactored = self._local_rename(code, code.index('a_param') + 1,
100 'new_param')
101 expected = 'class A(object):\n ' \
102 'def __init__(self, new_param):\n pass\n' \
103 'a_var = A(new_param=1)\n'
104 self.assertEquals(expected, refactored)
105
106 def test_renam_functions_parameters_and_occurances_in_other_modules(self):
107 mod1 = testutils.create_module(self.project, 'mod1')
108 mod2 = testutils.create_module(self.project, 'mod2')
109 mod1.write('def a_func(a_param):\n print(a_param)\n')
110 mod2.write('from mod1 import a_func\na_func(a_param=10)\n')
111 self._rename(mod1, mod1.read().index('a_param') + 1, 'new_param')
112 self.assertEquals('def a_func(new_param):\n print(new_param)\n',
113 mod1.read())
114 self.assertEquals('from mod1 import a_func\na_func(new_param=10)\n',
115 mod2.read())
116
117 def test_renaming_with_backslash_continued_names(self):
118 refactored = self._local_rename(
119 "replace = True\n'ali'.\\\nreplace\n", 2, 'is_replace')
120 self.assertEquals("is_replace = True\n'ali'.\\\nreplace\n",
121 refactored)
122
123 def test_not_renaming_string_contents(self):
124 refactored = self._local_rename("a_var = 20\na_string='a_var'\n",
125 2, 'new_var')
126 self.assertEquals("new_var = 20\na_string='a_var'\n",
127 refactored)
128
129 def test_not_renaming_comment_contents(self):
130 refactored = self._local_rename("a_var = 20\n# a_var\n",
131 2, 'new_var')
132 self.assertEquals("new_var = 20\n# a_var\n", refactored)
133
134 def test_renaming_all_occurances_in_containing_scope(self):
135 code = 'if True:\n a_var = 1\nelse:\n a_var = 20\n'
136 refactored = self._local_rename(code, 16, 'new_var')
137 self.assertEquals(
138 'if True:\n new_var = 1\nelse:\n new_var = 20\n', refactored)
139
140 def test_renaming_a_variable_with_arguement_name(self):
141 code = 'a_var = 10\ndef a_func(a_var):\n print(a_var)\n'
142 refactored = self._local_rename(code, 1, 'new_var')
143 self.assertEquals(
144 'new_var = 10\ndef a_func(a_var):\n print(a_var)\n', refactored)
145
146 def test_renaming_an_arguement_with_variable_name(self):
147 code = 'a_var = 10\ndef a_func(a_var):\n print(a_var)\n'
148 refactored = self._local_rename(code, len(code) - 3, 'new_var')
149 self.assertEquals(
150 'a_var = 10\ndef a_func(new_var):\n print(new_var)\n',
151 refactored)
152
153 def test_renaming_function_with_local_variable_name(self):
154 code = 'def a_func():\n a_func=20\na_func()'
155 refactored = self._local_rename(code, len(code) - 3, 'new_func')
156 self.assertEquals('def new_func():\n a_func=20\nnew_func()',
157 refactored)
158
159 def test_renaming_functions(self):
160 code = 'def a_func():\n pass\na_func()\n'
161 refactored = self._local_rename(code, len(code) - 5, 'new_func')
162 self.assertEquals('def new_func():\n pass\nnew_func()\n',
163 refactored)
164
165 def test_renaming_functions_across_modules(self):
166 mod1 = testutils.create_module(self.project, 'mod1')
167 mod1.write('def a_func():\n pass\na_func()\n')
168 mod2 = testutils.create_module(self.project, 'mod2')
169 mod2.write('import mod1\nmod1.a_func()\n')
170 self._rename(mod1, len(mod1.read()) - 5, 'new_func')
171 self.assertEquals('def new_func():\n pass\nnew_func()\n',
172 mod1.read())
173 self.assertEquals('import mod1\nmod1.new_func()\n', mod2.read())
174
175 def test_renaming_functions_across_modules_from_import(self):
176 mod1 = testutils.create_module(self.project, 'mod1')
177 mod1.write('def a_func():\n pass\na_func()\n')
178 mod2 = testutils.create_module(self.project, 'mod2')
179 mod2.write('from mod1 import a_func\na_func()\n')
180 self._rename(mod1, len(mod1.read()) - 5, 'new_func')
181 self.assertEquals('def new_func():\n pass\nnew_func()\n',
182 mod1.read())
183 self.assertEquals('from mod1 import new_func\nnew_func()\n',
184 mod2.read())
185
186 def test_renaming_functions_from_another_module(self):
187 mod1 = testutils.create_module(self.project, 'mod1')
188 mod1.write('def a_func():\n pass\na_func()\n')
189 mod2 = testutils.create_module(self.project, 'mod2')
190 mod2.write('import mod1\nmod1.a_func()\n')
191 self._rename(mod2, len(mod2.read()) - 5, 'new_func')
192 self.assertEquals('def new_func():\n pass\nnew_func()\n',
193 mod1.read())
194 self.assertEquals('import mod1\nmod1.new_func()\n', mod2.read())
195
196 def test_applying_all_changes_together(self):
197 mod1 = testutils.create_module(self.project, 'mod1')
198 mod1.write('import mod2\nmod2.a_func()\n')
199 mod2 = testutils.create_module(self.project, 'mod2')
200 mod2.write('def a_func():\n pass\na_func()\n')
201 self._rename(mod2, len(mod2.read()) - 5, 'new_func')
202 self.assertEquals('import mod2\nmod2.new_func()\n', mod1.read())
203 self.assertEquals('def new_func():\n pass\nnew_func()\n',
204 mod2.read())
205
206 def test_renaming_modules(self):
207 mod1 = testutils.create_module(self.project, 'mod1')
208 mod1.write('def a_func():\n pass\n')
209 mod2 = testutils.create_module(self.project, 'mod2')
210 mod2.write('from mod1 import a_func\n')
211 self._rename(mod2, mod2.read().index('mod1') + 1, 'newmod')
212 self.assertTrue(not mod1.exists() and
213 self.project.find_module('newmod') is not None)
214 self.assertEquals('from newmod import a_func\n', mod2.read())
215
216 def test_renaming_packages(self):
217 pkg = testutils.create_package(self.project, 'pkg')
218 mod1 = testutils.create_module(self.project, 'mod1', pkg)
219 mod1.write('def a_func():\n pass\n')
220 mod2 = testutils.create_module(self.project, 'mod2', pkg)
221 mod2.write('from pkg.mod1 import a_func\n')
222 self._rename(mod2, 6, 'newpkg')
223 self.assertTrue(self.project.find_module('newpkg.mod1') is not None)
224 new_mod2 = self.project.find_module('newpkg.mod2')
225 self.assertEquals('from newpkg.mod1 import a_func\n', new_mod2.read())
226
227 def test_module_dependencies(self):
228 mod1 = testutils.create_module(self.project, 'mod1')
229 mod1.write('class AClass(object):\n pass\n')
230 mod2 = testutils.create_module(self.project, 'mod2')
231 mod2.write('import mod1\na_var = mod1.AClass()\n')
232 self.project.get_pymodule(mod2).get_attributes()['mod1']
233 mod1.write('def AClass():\n return 0\n')
234
235 self._rename(mod2, len(mod2.read()) - 3, 'a_func')
236 self.assertEquals('def a_func():\n return 0\n', mod1.read())
237 self.assertEquals('import mod1\na_var = mod1.a_func()\n', mod2.read())
238
239 def test_renaming_class_attributes(self):
240 mod1 = testutils.create_module(self.project, 'mod1')
241 mod1.write('class AClass(object):\n def __init__(self):\n'
242 ' self.an_attr = 10\n')
243 mod2 = testutils.create_module(self.project, 'mod2')
244 mod2.write('import mod1\na_var = mod1.AClass()\n'
245 'another_var = a_var.an_attr')
246
247 self._rename(mod1, mod1.read().index('an_attr'), 'attr')
248 self.assertEquals('class AClass(object):\n def __init__(self):\n'
249 ' self.attr = 10\n', mod1.read())
250 self.assertEquals(
251 'import mod1\na_var = mod1.AClass()\nanother_var = a_var.attr',
252 mod2.read())
253
254 def test_renaming_class_attributes2(self):
255 mod1 = testutils.create_module(self.project, 'mod1')
256 mod1.write('class AClass(object):\n def __init__(self):\n'
257 ' an_attr = 10\n self.an_attr = 10\n')
258 mod2 = testutils.create_module(self.project, 'mod2')
259 mod2.write('import mod1\na_var = mod1.AClass()\n'
260 'another_var = a_var.an_attr')
261
262 self._rename(mod1, mod1.read().rindex('an_attr'), 'attr')
263 self.assertEquals(
264 'class AClass(object):\n def __init__(self):\n'
265 ' an_attr = 10\n self.attr = 10\n', mod1.read())
266 self.assertEquals(
267 'import mod1\na_var = mod1.AClass()\nanother_var = a_var.attr',
268 mod2.read())
269
270 def test_renaming_methods_in_subclasses(self):
271 mod = testutils.create_module(self.project, 'mod1')
272 mod.write('class A(object):\n def a_method(self):\n pass\n'
273 'class B(A):\n def a_method(self):\n pass\n')
274
275 self._rename(mod, mod.read().rindex('a_method') + 1, 'new_method',
276 in_hierarchy=True)
277 self.assertEquals(
278 'class A(object):\n def new_method(self):\n pass\n'
279 'class B(A):\n def new_method(self):\n pass\n',
280 mod.read())
281
282 def test_renaming_methods_in_sibling_classes(self):
283 mod = testutils.create_module(self.project, 'mod1')
284 mod.write('class A(object):\n def a_method(self):\n pass\n'
285 'class B(A):\n def a_method(self):\n pass\n'
286 'class C(A):\n def a_method(self):\n pass\n')
287
288 self._rename(mod, mod.read().rindex('a_method') + 1, 'new_method',
289 in_hierarchy=True)
290 self.assertEquals(
291 'class A(object):\n def new_method(self):\n pass\n'
292 'class B(A):\n def new_method(self):\n pass\n'
293 'class C(A):\n def new_method(self):\n pass\n',
294 mod.read())
295
296 def test_not_renaming_methods_in_hierarchies(self):
297 mod = testutils.create_module(self.project, 'mod1')
298 mod.write('class A(object):\n def a_method(self):\n pass\n'
299 'class B(A):\n def a_method(self):\n pass\n')
300
301 self._rename(mod, mod.read().rindex('a_method') + 1, 'new_method',
302 in_hierarchy=False)
303 self.assertEquals(
304 'class A(object):\n def a_method(self):\n pass\n'
305 'class B(A):\n def new_method(self):\n pass\n',
306 mod.read())
307
308 def test_undoing_refactorings(self):
309 mod1 = testutils.create_module(self.project, 'mod1')
310 mod1.write('def a_func():\n pass\na_func()\n')
311 self._rename(mod1, len(mod1.read()) - 5, 'new_func')
312 self.project.history.undo()
313 self.assertEquals('def a_func():\n pass\na_func()\n', mod1.read())
314
315 def test_undoing_renaming_modules(self):
316 mod1 = testutils.create_module(self.project, 'mod1')
317 mod1.write('def a_func():\n pass\n')
318 mod2 = testutils.create_module(self.project, 'mod2')
319 mod2.write('from mod1 import a_func\n')
320 self._rename(mod2, 6, 'newmod')
321 self.project.history.undo()
322 self.assertEquals('mod1.py', mod1.path)
323 self.assertEquals('from mod1 import a_func\n', mod2.read())
324
325 def test_rename_in_module_renaming_one_letter_names_for_expressions(self):
326 mod1 = testutils.create_module(self.project, 'mod1')
327 mod1.write('a = 10\nprint(1+a)\n')
328 pymod = self.project.get_module('mod1')
329 old_pyname = pymod['a']
330 finder = rope.refactor.occurrences.create_finder(
331 self.project, 'a', old_pyname)
332 refactored = rename.rename_in_module(
333 finder, 'new_var', pymodule=pymod, replace_primary=True)
334 self.assertEquals('new_var = 10\nprint(1+new_var)\n', refactored)
335
336 def test_renaming_for_loop_variable(self):
337 code = 'for var in range(10):\n print(var)\n'
338 refactored = self._local_rename(code, code.find('var') + 1, 'new_var')
339 self.assertEquals('for new_var in range(10):\n print(new_var)\n',
340 refactored)
341
342 def test_renaming_parameters(self):
343 code = 'def a_func(param):\n print(param)\na_func(param=hey)\n'
344 refactored = self._local_rename(code, code.find('param') + 1,
345 'new_param')
346 self.assertEquals('def a_func(new_param):\n print(new_param)\n'
347 'a_func(new_param=hey)\n', refactored)
348
349 def test_renaming_assigned_parameters(self):
350 code = 'def f(p):\n p = p + 1\n return p\nf(p=1)\n'
351 refactored = self._local_rename(code, code.find('p'), 'arg')
352 self.assertEquals('def f(arg):\n arg = arg + 1\n'
353 ' return arg\nf(arg=1)\n', refactored)
354
355 def test_renaming_parameters_not_renaming_others(self):
356 code = 'def a_func(param):' \
357 '\n print(param)\nparam=10\na_func(param)\n'
358 refactored = self._local_rename(code, code.find('param') + 1,
359 'new_param')
360 self.assertEquals('def a_func(new_param):\n print(new_param)\n'
361 'param=10\na_func(param)\n', refactored)
362
363 def test_renaming_parameters_not_renaming_others2(self):
364 code = 'def a_func(param):\n print(param)\n' \
365 'param=10\na_func(param=param)'
366 refactored = self._local_rename(code, code.find('param') + 1,
367 'new_param')
368 self.assertEquals('def a_func(new_param):\n print(new_param)\n'
369 'param=10\na_func(new_param=param)', refactored)
370
371 def test_renaming_parameters_with_multiple_params(self):
372 code = 'def a_func(param1, param2):\n print(param1)\n'\
373 'a_func(param1=1, param2=2)\n'
374 refactored = self._local_rename(code, code.find('param1') + 1,
375 'new_param')
376 self.assertEquals(
377 'def a_func(new_param, param2):\n print(new_param)\n'
378 'a_func(new_param=1, param2=2)\n', refactored)
379
380 def test_renaming_parameters_with_multiple_params2(self):
381 code = 'def a_func(param1, param2):\n print(param1)\n' \
382 'a_func(param1=1, param2=2)\n'
383 refactored = self._local_rename(code, code.rfind('param2') + 1,
384 'new_param')
385 self.assertEquals('def a_func(param1, new_param):\n print(param1)\n'
386 'a_func(param1=1, new_param=2)\n', refactored)
387
388 def test_renaming_parameters_on_calls(self):
389 code = 'def a_func(param):\n print(param)\na_func(param = hey)\n'
390 refactored = self._local_rename(code, code.rfind('param') + 1,
391 'new_param')
392 self.assertEquals('def a_func(new_param):\n print(new_param)\n'
393 'a_func(new_param = hey)\n', refactored)
394
395 def test_renaming_parameters_spaces_before_call(self):
396 code = 'def a_func(param):\n print(param)\na_func (param=hey)\n'
397 refactored = self._local_rename(code, code.rfind('param') + 1,
398 'new_param')
399 self.assertEquals('def a_func(new_param):\n print(new_param)\n'
400 'a_func (new_param=hey)\n', refactored)
401
402 def test_renaming_parameter_like_objects_after_keywords(self):
403 code = 'def a_func(param):\n print(param)\ndict(param=hey)\n'
404 refactored = self._local_rename(code, code.find('param') + 1,
405 'new_param')
406 self.assertEquals('def a_func(new_param):\n print(new_param)\n'
407 'dict(param=hey)\n', refactored)
408
409 def test_renaming_variables_in_init_dot_pys(self):
410 pkg = testutils.create_package(self.project, 'pkg')
411 init_dot_py = pkg.get_child('__init__.py')
412 init_dot_py.write('a_var = 10\n')
413 mod = testutils.create_module(self.project, 'mod')
414 mod.write('import pkg\nprint(pkg.a_var)\n')
415 self._rename(mod, mod.read().index('a_var') + 1, 'new_var')
416 self.assertEquals('new_var = 10\n', init_dot_py.read())
417 self.assertEquals('import pkg\nprint(pkg.new_var)\n', mod.read())
418
419 def test_renaming_variables_in_init_dot_pys2(self):
420 pkg = testutils.create_package(self.project, 'pkg')
421 init_dot_py = pkg.get_child('__init__.py')
422 init_dot_py.write('a_var = 10\n')
423 mod = testutils.create_module(self.project, 'mod')
424 mod.write('import pkg\nprint(pkg.a_var)\n')
425 self._rename(init_dot_py,
426 init_dot_py.read().index('a_var') + 1, 'new_var')
427 self.assertEquals('new_var = 10\n', init_dot_py.read())
428 self.assertEquals('import pkg\nprint(pkg.new_var)\n', mod.read())
429
430 def test_renaming_variables_in_init_dot_pys3(self):
431 pkg = testutils.create_package(self.project, 'pkg')
432 init_dot_py = pkg.get_child('__init__.py')
433 init_dot_py.write('a_var = 10\n')
434 mod = testutils.create_module(self.project, 'mod')
435 mod.write('import pkg\nprint(pkg.a_var)\n')
436 self._rename(mod, mod.read().index('a_var') + 1, 'new_var')
437 self.assertEquals('new_var = 10\n', init_dot_py.read())
438 self.assertEquals('import pkg\nprint(pkg.new_var)\n', mod.read())
439
440 def test_renaming_resources_using_rename_module_refactoring(self):
441 mod1 = testutils.create_module(self.project, 'mod1')
442 mod2 = testutils.create_module(self.project, 'mod2')
443 mod1.write('a_var = 1')
444 mod2.write('import mod1\nmy_var = mod1.a_var\n')
445 renamer = rename.Rename(self.project, mod1)
446 renamer.get_changes('newmod').do()
447 self.assertEquals('import newmod\nmy_var = newmod.a_var\n',
448 mod2.read())
449
450 def test_renam_resources_using_rename_module_refactor_for_packages(self):
451 mod1 = testutils.create_module(self.project, 'mod1')
452 pkg = testutils.create_package(self.project, 'pkg')
453 mod1.write('import pkg\nmy_pkg = pkg')
454 renamer = rename.Rename(self.project, pkg)
455 renamer.get_changes('newpkg').do()
456 self.assertEquals('import newpkg\nmy_pkg = newpkg', mod1.read())
457
458 def test_renam_resources_use_rename_module_refactor_for_init_dot_py(self):
459 mod1 = testutils.create_module(self.project, 'mod1')
460 pkg = testutils.create_package(self.project, 'pkg')
461 mod1.write('import pkg\nmy_pkg = pkg')
462 renamer = rename.Rename(self.project, pkg.get_child('__init__.py'))
463 renamer.get_changes('newpkg').do()
464 self.assertEquals('import newpkg\nmy_pkg = newpkg', mod1.read())
465
466 def test_renaming_global_variables(self):
467 code = 'a_var = 1\ndef a_func():\n global a_var\n var = a_var\n'
468 refactored = self._local_rename(code, code.index('a_var'), 'new_var')
469 self.assertEquals(
470 'new_var = 1\ndef a_func():\n '
471 'global new_var\n var = new_var\n',
472 refactored)
473
474 def test_renaming_global_variables2(self):
475 code = 'a_var = 1\ndef a_func():\n global a_var\n var = a_var\n'
476 refactored = self._local_rename(code, code.rindex('a_var'), 'new_var')
477 self.assertEquals(
478 'new_var = 1\ndef a_func():\n '
479 'global new_var\n var = new_var\n',
480 refactored)
481
482 def test_renaming_when_unsure(self):
483 code = 'class C(object):\n def a_func(self):\n pass\n' \
484 'def f(arg):\n arg.a_func()\n'
485 mod1 = testutils.create_module(self.project, 'mod1')
486 mod1.write(code)
487 self._rename(mod1, code.index('a_func'),
488 'new_func', unsure=self._true)
489 self.assertEquals(
490 'class C(object):\n def new_func(self):\n pass\n'
491 'def f(arg):\n arg.new_func()\n',
492 mod1.read())
493
494 def _true(self, *args):
495 return True
496
497 def test_renaming_when_unsure_with_confirmation(self):
498 def confirm(occurrence):
499 return False
500 code = 'class C(object):\n def a_func(self):\n pass\n' \
501 'def f(arg):\n arg.a_func()\n'
502 mod1 = testutils.create_module(self.project, 'mod1')
503 mod1.write(code)
504 self._rename(mod1, code.index('a_func'), 'new_func', unsure=confirm)
505 self.assertEquals(
506 'class C(object):\n def new_func(self):\n pass\n'
507 'def f(arg):\n arg.a_func()\n', mod1.read())
508
509 def test_renaming_when_unsure_not_renaming_knowns(self):
510 code = 'class C1(object):\n def a_func(self):\n pass\n' \
511 'class C2(object):\n def a_func(self):\n pass\n' \
512 'c1 = C1()\nc1.a_func()\nc2 = C2()\nc2.a_func()\n'
513 mod1 = testutils.create_module(self.project, 'mod1')
514 mod1.write(code)
515 self._rename(mod1, code.index('a_func'), 'new_func', unsure=self._true)
516 self.assertEquals(
517 'class C1(object):\n def new_func(self):\n pass\n'
518 'class C2(object):\n def a_func(self):\n pass\n'
519 'c1 = C1()\nc1.new_func()\nc2 = C2()\nc2.a_func()\n',
520 mod1.read())
521
522 def test_renaming_in_strings_and_comments(self):
523 code = 'a_var = 1\n# a_var\n'
524 mod1 = testutils.create_module(self.project, 'mod1')
525 mod1.write(code)
526 self._rename(mod1, code.index('a_var'), 'new_var', docs=True)
527 self.assertEquals('new_var = 1\n# new_var\n', mod1.read())
528
529 def test_not_renaming_in_strings_and_comments_where_not_visible(self):
530 code = 'def f():\n a_var = 1\n# a_var\n'
531 mod1 = testutils.create_module(self.project, 'mod1')
532 mod1.write(code)
533 self._rename(mod1, code.index('a_var'), 'new_var', docs=True)
534 self.assertEquals('def f():\n new_var = 1\n# a_var\n', mod1.read())
535
536 def test_not_renaming_all_text_occurrences_in_strings_and_comments(self):
537 code = 'a_var = 1\n# a_vard _a_var\n'
538 mod1 = testutils.create_module(self.project, 'mod1')
539 mod1.write(code)
540 self._rename(mod1, code.index('a_var'), 'new_var', docs=True)
541 self.assertEquals('new_var = 1\n# a_vard _a_var\n', mod1.read())
542
543 def test_renaming_occurrences_in_overwritten_scopes(self):
544 refactored = self._local_rename(
545 'a_var = 20\ndef f():\n print(a_var)\n'
546 'def f():\n print(a_var)\n', 2, 'new_var')
547 self.assertEquals('new_var = 20\ndef f():\n print(new_var)\n'
548 'def f():\n print(new_var)\n', refactored)
549
550 def test_renaming_occurrences_in_overwritten_scopes2(self):
551 code = 'def f():\n a_var = 1\n print(a_var)\n' \
552 'def f():\n a_var = 1\n print(a_var)\n'
553 refactored = self._local_rename(code, code.index('a_var') + 1,
554 'new_var')
555 self.assertEquals(code.replace('a_var', 'new_var', 2), refactored)
556
557 def test_dos_line_ending_and_renaming(self):
558 code = '\r\na = 1\r\n\r\nprint(2 + a + 2)\r\n'
559 offset = code.replace('\r\n', '\n').rindex('a')
560 refactored = self._local_rename(code, offset, 'b')
561 self.assertEquals('\nb = 1\n\nprint(2 + b + 2)\n',
562 refactored.replace('\r\n', '\n'))
563
564 def test_multi_byte_strs_and_renaming(self):
565 s = u'{LATIN SMALL LETTER I WITH DIAERESIS}' * 4
566 code = u'# -*- coding: utf-8 -*-\n# ' + s + \
567 '\na = 1\nprint(2 + a + 2)\n'
568 refactored = self._local_rename(code, code.rindex('a'), 'b')
569 self.assertEquals(u'# -*- coding: utf-8 -*-\n# ' + s +
570 '\nb = 1\nprint(2 + b + 2)\n', refactored)
571
572 def test_resources_parameter(self):
573 mod1 = testutils.create_module(self.project, 'mod1')
574 mod2 = testutils.create_module(self.project, 'mod2')
575 mod1.write('def f():\n pass\n')
576 mod2.write('import mod1\nmod1.f()\n')
577 self._rename(mod1, mod1.read().rindex('f'), 'g',
578 resources=[mod1])
579 self.assertEquals('def g():\n pass\n', mod1.read())
580 self.assertEquals('import mod1\nmod1.f()\n', mod2.read())
581
582 def test_resources_parameter_not_changing_defining_module(self):
583 mod1 = testutils.create_module(self.project, 'mod1')
584 mod2 = testutils.create_module(self.project, 'mod2')
585 mod1.write('def f():\n pass\n')
586 mod2.write('import mod1\nmod1.f()\n')
587 self._rename(mod1, mod1.read().rindex('f'), 'g',
588 resources=[mod2])
589 self.assertEquals('def f():\n pass\n', mod1.read())
590 self.assertEquals('import mod1\nmod1.g()\n', mod2.read())
591
592 # XXX: with variables should not leak
593 @testutils.only_for('2.5')
594 def xxx_test_with_statement_variables_should_not_leak(self):
595 code = 'f = 1\nwith open("1.txt") as f:\n print(f)\n'
596 if sys.version_info < (2, 6, 0):
597 code = 'from __future__ import with_statement\n' + code
598 mod1 = testutils.create_module(self.project, 'mod1')
599 mod1.write(code)
600 self._rename(mod1, code.rindex('f'), 'file')
601 expected = 'f = 1\nwith open("1.txt") as file:\n print(file)\n'
602 self.assertEquals(expected, mod1.read())
603
604
605 class ChangeOccurrencesTest(unittest.TestCase):
606
607 def setUp(self):
608 self.project = testutils.sample_project()
609 self.mod = testutils.create_module(self.project, 'mod')
610
611 def tearDown(self):
612 testutils.remove_project(self.project)
613 super(ChangeOccurrencesTest, self).tearDown()
614
615 def test_simple_case(self):
616 self.mod.write('a_var = 1\nprint(a_var)\n')
617 changer = rename.ChangeOccurrences(self.project, self.mod,
618 self.mod.read().index('a_var'))
619 changer.get_changes('new_var').do()
620 self.assertEquals('new_var = 1\nprint(new_var)\n', self.mod.read())
621
622 def test_only_performing_inside_scopes(self):
623 self.mod.write('a_var = 1\nnew_var = 2\ndef f():\n print(a_var)\n')
624 changer = rename.ChangeOccurrences(self.project, self.mod,
625 self.mod.read().rindex('a_var'))
626 changer.get_changes('new_var').do()
627 self.assertEquals(
628 'a_var = 1\nnew_var = 2\ndef f():\n print(new_var)\n',
629 self.mod.read())
630
631 def test_only_performing_on_calls(self):
632 self.mod.write('def f1():\n pass\ndef f2():\n pass\n'
633 'g = f1\na = f1()\n')
634 changer = rename.ChangeOccurrences(self.project, self.mod,
635 self.mod.read().rindex('f1'))
636 changer.get_changes('f2', only_calls=True).do()
637 self.assertEquals(
638 'def f1():\n pass\ndef f2():\n pass\ng = f1\na = f2()\n',
639 self.mod.read())
640
641 def test_only_performing_on_reads(self):
642 self.mod.write('a = 1\nb = 2\nprint(a)\n')
643 changer = rename.ChangeOccurrences(self.project, self.mod,
644 self.mod.read().rindex('a'))
645 changer.get_changes('b', writes=False).do()
646 self.assertEquals('a = 1\nb = 2\nprint(b)\n', self.mod.read())
647
648
649 class ImplicitInterfacesTest(unittest.TestCase):
650
651 def setUp(self):
652 super(ImplicitInterfacesTest, self).setUp()
653 self.project = testutils.sample_project(validate_objectdb=True)
654 self.pycore = self.project.pycore
655 self.mod1 = testutils.create_module(self.project, 'mod1')
656 self.mod2 = testutils.create_module(self.project, 'mod2')
657
658 def tearDown(self):
659 testutils.remove_project(self.project)
660 super(ImplicitInterfacesTest, self).tearDown()
661
662 def _rename(self, resource, offset, new_name, **kwds):
663 changes = Rename(self.project, resource, offset).\
664 get_changes(new_name, **kwds)
665 self.project.do(changes)
666
667 def test_performing_rename_on_parameters(self):
668 self.mod1.write('def f(arg):\n arg.run()\n')
669 self.mod2.write('import mod1\n\n\n'
670 'class A(object):\n def run(self):\n pass\n'
671 'class B(object):\n def run(self):\n pass\n'
672 'mod1.f(A())\nmod1.f(B())\n')
673 self.pycore.analyze_module(self.mod2)
674 self._rename(self.mod1, self.mod1.read().index('run'), 'newrun')
675 self.assertEquals('def f(arg):\n arg.newrun()\n', self.mod1.read())
676 self.assertEquals(
677 'import mod1\n\n\n'
678 'class A(object):\n def newrun(self):\n pass\n'
679 'class B(object):\n def newrun(self):\n pass\n'
680 'mod1.f(A())\nmod1.f(B())\n', self.mod2.read())
681
682
683 def suite():
684 result = unittest.TestSuite()
685 result.addTests(unittest.makeSuite(RenameRefactoringTest))
686 result.addTests(unittest.makeSuite(ChangeOccurrencesTest))
687 result.addTests(unittest.makeSuite(ImplicitInterfacesTest))
688 return result
689
690
691 if __name__ == '__main__':
692 unittest.main()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698