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

Side by Side Diff: tools/telemetry/third_party/rope/ropetest/refactor/change_signature_test.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 try:
2 import unittest2 as unittest
3 except ImportError:
4 import unittest
5
6 import rope.base.exceptions
7 from rope.refactor import change_signature
8 from ropetest import testutils
9
10
11 class ChangeSignatureTest(unittest.TestCase):
12
13 def setUp(self):
14 super(ChangeSignatureTest, self).setUp()
15 self.project = testutils.sample_project()
16 self.pycore = self.project.pycore
17 self.mod = testutils.create_module(self.project, 'mod')
18
19 def tearDown(self):
20 testutils.remove_project(self.project)
21 super(ChangeSignatureTest, self).tearDown()
22
23 def test_normalizing_parameters_for_trivial_case(self):
24 code = 'def a_func():\n pass\na_func()'
25 self.mod.write(code)
26 signature = change_signature.ChangeSignature(
27 self.project, self.mod, self.mod.read().index('a_func') + 1)
28 self.project.do(signature.get_changes(
29 [change_signature.ArgumentNormalizer()]))
30 self.assertEquals(code, self.mod.read())
31
32 def test_normalizing_parameters_for_trivial_case2(self):
33 code = 'def a_func(param):\n pass\na_func(2)'
34 self.mod.write(code)
35 signature = change_signature.ChangeSignature(
36 self.project, self.mod, self.mod.read().index('a_func') + 1)
37 self.project.do(signature.get_changes(
38 [change_signature.ArgumentNormalizer()]))
39 self.assertEquals(code, self.mod.read())
40
41 def test_normalizing_parameters_for_unneeded_keyword(self):
42 self.mod.write('def a_func(param):\n pass\na_func(param=1)')
43 signature = change_signature.ChangeSignature(
44 self.project, self.mod, self.mod.read().index('a_func') + 1)
45 self.project.do(signature.get_changes(
46 [change_signature.ArgumentNormalizer()]))
47 self.assertEquals('def a_func(param):\n pass\na_func(1)',
48 self.mod.read())
49
50 def test_normalizing_parameters_for_unneeded_keyword_for_methods(self):
51 code = 'class A(object):\n' \
52 ' def a_func(self, param):\n' \
53 ' pass\n' \
54 'a_var = A()\n' \
55 'a_var.a_func(param=1)\n'
56 self.mod.write(code)
57 signature = change_signature.ChangeSignature(
58 self.project, self.mod, self.mod.read().index('a_func') + 1)
59 self.project.do(signature.get_changes(
60 [change_signature.ArgumentNormalizer()]))
61 expected = 'class A(object):\n' \
62 ' def a_func(self, param):\n' \
63 ' pass\n' \
64 'a_var = A()\n' \
65 'a_var.a_func(1)\n'
66 self.assertEquals(expected, self.mod.read())
67
68 def test_normalizing_parameters_for_unsorted_keyword(self):
69 self.mod.write('def a_func(p1, p2):\n pass\na_func(p2=2, p1=1)')
70 signature = change_signature.ChangeSignature(
71 self.project, self.mod, self.mod.read().index('a_func') + 1)
72 self.project.do(signature.get_changes(
73 [change_signature.ArgumentNormalizer()]))
74 self.assertEquals('def a_func(p1, p2):\n pass\na_func(1, 2)',
75 self.mod.read())
76
77 def test_raising_exceptions_for_non_functions(self):
78 self.mod.write('a_var = 10')
79 with self.assertRaises(rope.base.exceptions.RefactoringError):
80 change_signature.ChangeSignature(
81 self.project, self.mod, self.mod.read().index('a_var') + 1)
82
83 def test_normalizing_parameters_for_args_parameter(self):
84 self.mod.write('def a_func(*arg):\n pass\na_func(1, 2)\n')
85 signature = change_signature.ChangeSignature(
86 self.project, self.mod, self.mod.read().index('a_func') + 1)
87 self.project.do(signature.get_changes(
88 [change_signature.ArgumentNormalizer()]))
89 self.assertEquals('def a_func(*arg):\n pass\na_func(1, 2)\n',
90 self.mod.read())
91
92 def test_normalizing_parameters_for_args_parameter_and_keywords(self):
93 self.mod.write(
94 'def a_func(param, *args):\n pass\na_func(*[1, 2, 3])\n')
95 signature = change_signature.ChangeSignature(
96 self.project, self.mod, self.mod.read().index('a_func') + 1)
97 self.project.do(signature.get_changes(
98 [change_signature.ArgumentNormalizer()]))
99 self.assertEquals('def a_func(param, *args):\n pass\n'
100 'a_func(*[1, 2, 3])\n', self.mod.read())
101
102 def test_normalizing_functions_from_other_modules(self):
103 mod1 = testutils.create_module(self.project, 'mod1')
104 mod1.write('def a_func(param):\n pass\n')
105 self.mod.write('import mod1\nmod1.a_func(param=1)\n')
106 signature = change_signature.ChangeSignature(
107 self.project, mod1, mod1.read().index('a_func') + 1)
108 self.project.do(signature.get_changes(
109 [change_signature.ArgumentNormalizer()]))
110 self.assertEquals('import mod1\nmod1.a_func(1)\n', self.mod.read())
111
112 def test_normalizing_parameters_for_keyword_parameters(self):
113 self.mod.write('def a_func(p1, **kwds):\n pass\n'
114 'a_func(p2=2, p1=1)\n')
115 signature = change_signature.ChangeSignature(
116 self.project, self.mod, self.mod.read().index('a_func') + 1)
117 self.project.do(signature.get_changes(
118 [change_signature.ArgumentNormalizer()]))
119 self.assertEquals('def a_func(p1, **kwds):\n pass\n'
120 'a_func(1, p2=2)\n', self.mod.read())
121
122 def test_removing_arguments(self):
123 self.mod.write('def a_func(p1):\n pass\na_func(1)\n')
124 signature = change_signature.ChangeSignature(
125 self.project, self.mod, self.mod.read().index('a_func') + 1)
126 self.project.do(signature.get_changes(
127 [change_signature.ArgumentRemover(0)]))
128 self.assertEquals('def a_func():\n pass\na_func()\n',
129 self.mod.read())
130
131 def test_removing_arguments_with_multiple_args(self):
132 self.mod.write('def a_func(p1, p2):\n pass\na_func(1, 2)\n')
133 signature = change_signature.ChangeSignature(
134 self.project, self.mod, self.mod.read().index('a_func') + 1)
135 self.project.do(signature.get_changes(
136 [change_signature.ArgumentRemover(0)]))
137 self.assertEquals('def a_func(p2):\n pass\na_func(2)\n',
138 self.mod.read())
139
140 def test_removing_arguments_passed_as_keywords(self):
141 self.mod.write('def a_func(p1):\n pass\na_func(p1=1)\n')
142 signature = change_signature.ChangeSignature(
143 self.project, self.mod, self.mod.read().index('a_func') + 1)
144 self.project.do(signature.get_changes(
145 [change_signature.ArgumentRemover(0)]))
146 self.assertEquals('def a_func():\n pass\na_func()\n',
147 self.mod.read())
148
149 def test_removing_arguments_with_defaults(self):
150 self.mod.write('def a_func(p1=1):\n pass\na_func(1)\n')
151 signature = change_signature.ChangeSignature(
152 self.project, self.mod, self.mod.read().index('a_func') + 1)
153 self.project.do(signature.get_changes(
154 [change_signature.ArgumentRemover(0)]))
155 self.assertEquals('def a_func():\n pass\na_func()\n',
156 self.mod.read())
157
158 def test_removing_arguments_star_args(self):
159 self.mod.write('def a_func(p1, *args):\n pass\na_func(1)\n')
160 signature = change_signature.ChangeSignature(
161 self.project, self.mod, self.mod.read().index('a_func') + 1)
162 self.project.do(signature.get_changes(
163 [change_signature.ArgumentRemover(1)]))
164 self.assertEquals('def a_func(p1):\n pass\na_func(1)\n',
165 self.mod.read())
166
167 def test_removing_keyword_arg(self):
168 self.mod.write('def a_func(p1, **kwds):\n pass\na_func(1)\n')
169 signature = change_signature.ChangeSignature(
170 self.project, self.mod, self.mod.read().index('a_func') + 1)
171 self.project.do(signature.get_changes(
172 [change_signature.ArgumentRemover(1)]))
173 self.assertEquals('def a_func(p1):\n pass\na_func(1)\n',
174 self.mod.read())
175
176 def test_removing_keyword_arg2(self):
177 self.mod.write('def a_func(p1, *args, **kwds):\n pass\na_func(1)\n')
178 signature = change_signature.ChangeSignature(
179 self.project, self.mod, self.mod.read().index('a_func') + 1)
180 self.project.do(signature.get_changes(
181 [change_signature.ArgumentRemover(2)]))
182 self.assertEquals('def a_func(p1, *args):\n pass\na_func(1)\n',
183 self.mod.read())
184
185 # XXX: What to do here for star args?
186 @unittest.skip("How to deal with start args?")
187 def xxx_test_removing_arguments_star_args2(self):
188 self.mod.write('def a_func(p1, *args):\n pass\n'
189 'a_func(2, 3, p1=1)\n')
190 signature = change_signature.ChangeSignature(
191 self.project, self.mod, self.mod.read().index('a_func') + 1)
192 self.project.do(signature.get_changes(
193 [change_signature.ArgumentRemover(1)]))
194 self.assertEquals('def a_func(p1):\n pass\na_func(p1=1)\n',
195 self.mod.read())
196
197 # XXX: What to do here for star args?
198 def xxx_test_removing_arguments_star_args3(self):
199 self.mod.write('def a_func(p1, *args):\n pass\n'
200 'a_func(*[1, 2, 3])\n')
201 signature = change_signature.ChangeSignature(
202 self.project, self.mod, self.mod.read().index('a_func') + 1)
203 self.project.do(signature.get_changes(
204 [change_signature.ArgumentRemover(1)]))
205 self.assertEquals('def a_func(p1):\n pass\na_func(*[1, 2, 3])\n',
206 self.mod.read())
207
208 def test_adding_arguments_for_normal_args_changing_definition(self):
209 self.mod.write('def a_func():\n pass\n')
210 signature = change_signature.ChangeSignature(
211 self.project, self.mod, self.mod.read().index('a_func') + 1)
212 self.project.do(signature.get_changes(
213 [change_signature.ArgumentAdder(0, 'p1')]))
214 self.assertEquals('def a_func(p1):\n pass\n', self.mod.read())
215
216 def test_adding_arguments_for_normal_args_with_defaults(self):
217 self.mod.write('def a_func():\n pass\na_func()\n')
218 signature = change_signature.ChangeSignature(
219 self.project, self.mod, self.mod.read().index('a_func') + 1)
220 adder = change_signature.ArgumentAdder(0, 'p1', 'None')
221 self.project.do(signature.get_changes([adder]))
222 self.assertEquals('def a_func(p1=None):\n pass\na_func()\n',
223 self.mod.read())
224
225 def test_adding_arguments_for_normal_args_changing_calls(self):
226 self.mod.write('def a_func():\n pass\na_func()\n')
227 signature = change_signature.ChangeSignature(
228 self.project, self.mod, self.mod.read().index('a_func') + 1)
229 adder = change_signature.ArgumentAdder(0, 'p1', 'None', '1')
230 self.project.do(signature.get_changes([adder]))
231 self.assertEquals('def a_func(p1=None):\n pass\na_func(1)\n',
232 self.mod.read())
233
234 def test_adding_arguments_for_norm_args_chang_calls_with_kwords(self):
235 self.mod.write('def a_func(p1=0):\n pass\na_func()\n')
236 signature = change_signature.ChangeSignature(
237 self.project, self.mod, self.mod.read().index('a_func') + 1)
238 adder = change_signature.ArgumentAdder(1, 'p2', '0', '1')
239 self.project.do(signature.get_changes([adder]))
240 self.assertEquals('def a_func(p1=0, p2=0):\n pass\na_func(p2=1)\n',
241 self.mod.read())
242
243 def test_adding_arguments_for_norm_args_chang_calls_with_no_value(self):
244 self.mod.write('def a_func(p2=0):\n pass\na_func(1)\n')
245 signature = change_signature.ChangeSignature(
246 self.project, self.mod, self.mod.read().index('a_func') + 1)
247 adder = change_signature.ArgumentAdder(0, 'p1', '0', None)
248 self.project.do(signature.get_changes([adder]))
249 self.assertEquals('def a_func(p1=0, p2=0):\n pass\na_func(p2=1)\n',
250 self.mod.read())
251
252 def test_adding_duplicate_parameter_and_raising_exceptions(self):
253 self.mod.write('def a_func(p1):\n pass\n')
254 with self.assertRaises(rope.base.exceptions.RefactoringError):
255 signature = change_signature.ChangeSignature(
256 self.project, self.mod, self.mod.read().index('a_func') + 1)
257 self.project.do(signature.get_changes(
258 [change_signature.ArgumentAdder(1, 'p1')]))
259
260 def test_inlining_default_arguments(self):
261 self.mod.write('def a_func(p1=0):\n pass\na_func()\n')
262 signature = change_signature.ChangeSignature(
263 self.project, self.mod, self.mod.read().index('a_func') + 1)
264 self.project.do(signature.get_changes(
265 [change_signature.ArgumentDefaultInliner(0)]))
266 self.assertEquals('def a_func(p1=0):\n pass\n'
267 'a_func(0)\n', self.mod.read())
268
269 def test_inlining_default_arguments2(self):
270 self.mod.write('def a_func(p1=0):\n pass\na_func(1)\n')
271 signature = change_signature.ChangeSignature(
272 self.project, self.mod, self.mod.read().index('a_func') + 1)
273 self.project.do(signature.get_changes(
274 [change_signature.ArgumentDefaultInliner(0)]))
275 self.assertEquals('def a_func(p1=0):\n pass\n'
276 'a_func(1)\n', self.mod.read())
277
278 def test_preserving_args_and_keywords_order(self):
279 self.mod.write('def a_func(*args, **kwds):\n pass\n'
280 'a_func(3, 1, 2, a=1, c=3, b=2)\n')
281 signature = change_signature.ChangeSignature(
282 self.project, self.mod, self.mod.read().index('a_func') + 1)
283 self.project.do(signature.get_changes(
284 [change_signature.ArgumentNormalizer()]))
285 self.assertEquals('def a_func(*args, **kwds):\n pass\n'
286 'a_func(3, 1, 2, a=1, c=3, b=2)\n', self.mod.read())
287
288 def test_change_order_for_only_one_parameter(self):
289 self.mod.write('def a_func(p1):\n pass\na_func(1)\n')
290 signature = change_signature.ChangeSignature(
291 self.project, self.mod, self.mod.read().index('a_func') + 1)
292 self.project.do(signature.get_changes(
293 [change_signature.ArgumentReorderer([0])]))
294 self.assertEquals('def a_func(p1):\n pass\na_func(1)\n',
295 self.mod.read())
296
297 def test_change_order_for_two_parameter(self):
298 self.mod.write('def a_func(p1, p2):\n pass\na_func(1, 2)\n')
299 signature = change_signature.ChangeSignature(
300 self.project, self.mod, self.mod.read().index('a_func') + 1)
301 self.project.do(signature.get_changes(
302 [change_signature.ArgumentReorderer([1, 0])]))
303 self.assertEquals('def a_func(p2, p1):\n pass\na_func(2, 1)\n',
304 self.mod.read())
305
306 def test_reordering_multi_line_function_headers(self):
307 self.mod.write('def a_func(p1,\n p2):\n pass\na_func(1, 2)\n')
308 signature = change_signature.ChangeSignature(
309 self.project, self.mod, self.mod.read().index('a_func') + 1)
310 self.project.do(signature.get_changes(
311 [change_signature.ArgumentReorderer([1, 0])]))
312 self.assertEquals('def a_func(p2, p1):\n pass\na_func(2, 1)\n',
313 self.mod.read())
314
315 def test_changing_order_with_static_params(self):
316 self.mod.write('def a_func(p1, p2=0, p3=0):\n pass\na_func(1, 2)\n')
317 signature = change_signature.ChangeSignature(
318 self.project, self.mod, self.mod.read().index('a_func') + 1)
319 self.project.do(signature.get_changes(
320 [change_signature.ArgumentReorderer([0, 2, 1])]))
321 self.assertEquals('def a_func(p1, p3=0, p2=0):\n pass\n'
322 'a_func(1, p2=2)\n', self.mod.read())
323
324 def test_doing_multiple_changes(self):
325 changers = []
326 self.mod.write('def a_func(p1):\n pass\na_func(1)\n')
327 changers.append(change_signature.ArgumentRemover(0))
328 changers.append(change_signature.ArgumentAdder(0, 'p2', None, None))
329 signature = change_signature.ChangeSignature(
330 self.project, self.mod, self.mod.read().index('a_func') + 1)
331 signature.get_changes(changers).do()
332 self.assertEquals('def a_func(p2):\n pass\na_func()\n',
333 self.mod.read())
334
335 def test_doing_multiple_changes2(self):
336 changers = []
337 self.mod.write('def a_func(p1, p2):\n pass\na_func(p2=2)\n')
338 changers.append(change_signature.ArgumentAdder(2, 'p3', None, '3'))
339 changers.append(change_signature.ArgumentReorderer([1, 0, 2]))
340 changers.append(change_signature.ArgumentRemover(1))
341 signature = change_signature.ChangeSignature(
342 self.project, self.mod, self.mod.read().index('a_func') + 1)
343 signature.get_changes(changers).do()
344 self.assertEquals('def a_func(p2, p3):\n pass\na_func(2, 3)\n',
345 self.mod.read())
346
347 def test_changing_signature_in_subclasses(self):
348 self.mod.write(
349 'class A(object):\n def a_method(self):\n pass\n'
350 'class B(A):\n def a_method(self):\n pass\n')
351 signature = change_signature.ChangeSignature(
352 self.project, self.mod, self.mod.read().index('a_method') + 1)
353 signature.get_changes([change_signature.ArgumentAdder(1, 'p1')],
354 in_hierarchy=True).do()
355 self.assertEquals(
356 'class A(object):\n def a_method(self, p1):\n pass\n'
357 'class B(A):\n def a_method(self, p1):\n pass\n',
358 self.mod.read())
359
360 def test_differentiating_class_accesses_from_instance_accesses(self):
361 self.mod.write(
362 'class A(object):\n def a_func(self, param):\n pass\n'
363 'a_var = A()\nA.a_func(a_var, param=1)')
364 signature = change_signature.ChangeSignature(
365 self.project, self.mod, self.mod.read().index('a_func') + 1)
366 self.project.do(signature.get_changes(
367 [change_signature.ArgumentRemover(1)]))
368 self.assertEquals(
369 'class A(object):\n def a_func(self):\n pass\n'
370 'a_var = A()\nA.a_func(a_var)', self.mod.read())
371
372 def test_changing_signature_for_constructors(self):
373 self.mod.write(
374 'class C(object):\n def __init__(self, p):\n pass\n'
375 'c = C(1)\n')
376 signature = change_signature.ChangeSignature(
377 self.project, self.mod, self.mod.read().index('C') + 1)
378 signature.get_changes([change_signature.ArgumentRemover(1)]).do()
379 self.assertEquals(
380 'class C(object):\n def __init__(self):\n pass\n'
381 'c = C()\n',
382 self.mod.read())
383
384 def test_changing_signature_for_constructors2(self):
385 self.mod.write(
386 'class C(object):\n def __init__(self, p):\n pass\n'
387 'c = C(1)\n')
388 signature = change_signature.ChangeSignature(
389 self.project, self.mod, self.mod.read().index('__init__') + 1)
390 signature.get_changes([change_signature.ArgumentRemover(1)]).do()
391 self.assertEquals(
392 'class C(object):\n def __init__(self):\n pass\n'
393 'c = C()\n',
394 self.mod.read())
395
396 def test_changing_signature_for_constructors_when_using_super(self):
397 self.mod.write(
398 'class A(object):\n def __init__(self, p):\n pass\n'
399 'class B(A):\n '
400 'def __init__(self, p):\n super(B, self).__init__(p)\n')
401 signature = change_signature.ChangeSignature(
402 self.project, self.mod, self.mod.read().index('__init__') + 1)
403 signature.get_changes([change_signature.ArgumentRemover(1)]).do()
404 self.assertEquals(
405 'class A(object):\n def __init__(self):\n pass\n'
406 'class B(A):\n '
407 'def __init__(self, p):\n super(B, self).__init__()\n',
408 self.mod.read())
409
410 def test_redordering_arguments_reported_by_mft(self):
411 self.mod.write('def f(a, b, c):\n pass\nf(1, 2, 3)\n')
412 signature = change_signature.ChangeSignature(
413 self.project, self.mod, self.mod.read().rindex('f'))
414 signature.get_changes(
415 [change_signature.ArgumentReorderer([1, 2, 0])]).do()
416 self.assertEquals('def f(b, c, a):\n pass\nf(2, 3, 1)\n',
417 self.mod.read())
418
419 def test_resources_parameter(self):
420 mod1 = testutils.create_module(self.project, 'mod1')
421 mod1.write('def a_func(param):\n pass\n')
422 self.mod.write('import mod1\nmod1.a_func(1)\n')
423 signature = change_signature.ChangeSignature(
424 self.project, mod1, mod1.read().index('a_func') + 1)
425 signature.get_changes([change_signature.ArgumentRemover(0)],
426 resources=[mod1]).do()
427 self.assertEquals('import mod1\nmod1.a_func(1)\n', self.mod.read())
428 self.assertEquals('def a_func():\n pass\n', mod1.read())
429
430 def test_reordering_and_automatic_defaults(self):
431 code = 'def f(p1, p2=2):\n' \
432 ' pass\n' \
433 'f(1, 2)\n'
434 self.mod.write(code)
435 signature = change_signature.ChangeSignature(
436 self.project, self.mod, code.index('f('))
437 reorder = change_signature.ArgumentReorderer([1, 0], autodef='1')
438 signature.get_changes([reorder]).do()
439 expected = 'def f(p2=2, p1=1):\n' \
440 ' pass\n' \
441 'f(2, 1)\n'
442 self.assertEquals(expected, self.mod.read())
443
444
445 if __name__ == '__main__':
446 unittest.main()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698