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

Side by Side Diff: tools/telemetry/third_party/rope/ropetest/refactor/__init__.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.taskhandle
7 import rope.refactor.introduce_parameter
8 import ropetest.refactor.extracttest
9 import ropetest.refactor.importutilstest
10 import ropetest.refactor.inlinetest
11 import ropetest.refactor.movetest
12 import ropetest.refactor.multiprojecttest
13 import ropetest.refactor.patchedasttest
14 import ropetest.refactor.renametest
15 import ropetest.refactor.restructuretest
16 import ropetest.refactor.suitestest
17 import ropetest.refactor.usefunctiontest
18 from rope.base.exceptions import RefactoringError, InterruptedTaskError
19 from rope.refactor.encapsulate_field import EncapsulateField
20 from rope.refactor.introduce_factory import IntroduceFactory
21 from rope.refactor.localtofield import LocalToField
22 from rope.refactor.method_object import MethodObject
23 from ropetest import testutils
24 from ropetest.refactor import change_signature_test, similarfindertest
25
26
27 class MethodObjectTest(unittest.TestCase):
28
29 def setUp(self):
30 super(MethodObjectTest, self).setUp()
31 self.project = testutils.sample_project()
32 self.pycore = self.project.pycore
33 self.mod = testutils.create_module(self.project, 'mod')
34
35 def tearDown(self):
36 testutils.remove_project(self.project)
37 super(MethodObjectTest, self).tearDown()
38
39 def test_empty_method(self):
40 code = 'def func():\n pass\n'
41 self.mod.write(code)
42 replacer = MethodObject(self.project, self.mod, code.index('func'))
43 self.assertEquals(
44 'class _New(object):\n\n def __call__(self):\n pass\n',
45 replacer.get_new_class('_New'))
46
47 def test_trivial_return(self):
48 code = 'def func():\n return 1\n'
49 self.mod.write(code)
50 replacer = MethodObject(self.project, self.mod, code.index('func'))
51 self.assertEquals(
52 'class _New(object):\n\n def __call__(self):'
53 '\n return 1\n',
54 replacer.get_new_class('_New'))
55
56 def test_multi_line_header(self):
57 code = 'def func(\n ):\n return 1\n'
58 self.mod.write(code)
59 replacer = MethodObject(self.project, self.mod, code.index('func'))
60 self.assertEquals(
61 'class _New(object):\n\n def __call__(self):'
62 '\n return 1\n',
63 replacer.get_new_class('_New'))
64
65 def test_a_single_parameter(self):
66 code = 'def func(param):\n return 1\n'
67 self.mod.write(code)
68 replacer = MethodObject(self.project, self.mod, code.index('func'))
69 self.assertEquals(
70 'class _New(object):\n\n'
71 ' def __init__(self, param):\n self.param = param\n\n'
72 ' def __call__(self):\n return 1\n',
73 replacer.get_new_class('_New'))
74
75 def test_self_parameter(self):
76 code = 'def func(self):\n return 1\n'
77 self.mod.write(code)
78 replacer = MethodObject(self.project, self.mod, code.index('func'))
79 self.assertEquals(
80 'class _New(object):\n\n'
81 ' def __init__(self, host):\n self.self = host\n\n'
82 ' def __call__(self):\n return 1\n',
83 replacer.get_new_class('_New'))
84
85 def test_simple_using_passed_parameters(self):
86 code = 'def func(param):\n return param\n'
87 self.mod.write(code)
88 replacer = MethodObject(self.project, self.mod, code.index('func'))
89 self.assertEquals(
90 'class _New(object):\n\n'
91 ' def __init__(self, param):\n self.param = param\n\n'
92 ' def __call__(self):\n return self.param\n',
93 replacer.get_new_class('_New'))
94
95 def test_self_keywords_and_args_parameters(self):
96 code = 'def func(arg, *args, **kwds):\n' \
97 ' result = arg + args[0] + kwds[arg]\n' \
98 ' return result\n'
99 self.mod.write(code)
100 replacer = MethodObject(self.project, self.mod, code.index('func'))
101 expected = 'class _New(object):\n\n' \
102 ' def __init__(self, arg, args, kwds):\n' \
103 ' self.arg = arg\n' \
104 ' self.args = args\n' \
105 ' self.kwds = kwds\n\n' \
106 ' def __call__(self):\n' \
107 ' result = self.arg + ' \
108 'self.args[0] + self.kwds[self.arg]\n' \
109 ' return result\n'
110 self.assertEquals(expected, replacer.get_new_class('_New'))
111
112 def test_performing_on_not_a_function(self):
113 code = 'my_var = 10\n'
114 self.mod.write(code)
115 with self.assertRaises(RefactoringError):
116 MethodObject(self.project, self.mod, code.index('my_var'))
117
118 def test_changing_the_module(self):
119 code = 'def func():\n return 1\n'
120 self.mod.write(code)
121 replacer = MethodObject(self.project, self.mod, code.index('func'))
122 self.project.do(replacer.get_changes('_New'))
123 expected = 'def func():\n' \
124 ' return _New()()\n\n\n' \
125 'class _New(object):\n\n' \
126 ' def __call__(self):\n' \
127 ' return 1\n'
128 self.assertEquals(expected, self.mod.read())
129
130 def test_changing_the_module_and_class_methods(self):
131 code = 'class C(object):\n\n' \
132 ' def a_func(self):\n' \
133 ' return 1\n\n' \
134 ' def another_func(self):\n' \
135 ' pass\n'
136 self.mod.write(code)
137 replacer = MethodObject(self.project, self.mod, code.index('func'))
138 self.project.do(replacer.get_changes('_New'))
139 expected = 'class C(object):\n\n' \
140 ' def a_func(self):\n' \
141 ' return _New(self)()\n\n' \
142 ' def another_func(self):\n' \
143 ' pass\n\n\n' \
144 'class _New(object):\n\n' \
145 ' def __init__(self, host):\n' \
146 ' self.self = host\n\n' \
147 ' def __call__(self):\n' \
148 ' return 1\n'
149 self.assertEquals(expected, self.mod.read())
150
151
152 class IntroduceFactoryTest(unittest.TestCase):
153
154 def setUp(self):
155 super(IntroduceFactoryTest, self).setUp()
156 self.project = testutils.sample_project()
157 self.pycore = self.project.pycore
158
159 def tearDown(self):
160 testutils.remove_project(self.project)
161 super(IntroduceFactoryTest, self).tearDown()
162
163 def _introduce_factory(self, resource, offset, *args, **kwds):
164 factory_introducer = IntroduceFactory(self.project,
165 resource, offset)
166 changes = factory_introducer.get_changes(*args, **kwds)
167 self.project.do(changes)
168
169 def test_adding_the_method(self):
170 code = 'class AClass(object):\n an_attr = 10\n'
171 mod = testutils.create_module(self.project, 'mod')
172 mod.write(code)
173 expected = 'class AClass(object):\n' \
174 ' an_attr = 10\n\n' \
175 ' @staticmethod\n' \
176 ' def create(*args, **kwds):\n' \
177 ' return AClass(*args, **kwds)\n'
178 self._introduce_factory(mod, mod.read().index('AClass') + 1, 'create')
179 self.assertEquals(expected, mod.read())
180
181 def test_changing_occurances_in_the_main_module(self):
182 code = 'class AClass(object):\n' \
183 ' an_attr = 10\n' \
184 'a_var = AClass()'
185 mod = testutils.create_module(self.project, 'mod')
186 mod.write(code)
187 expected = 'class AClass(object):\n' \
188 ' an_attr = 10\n\n' \
189 ' @staticmethod\n' \
190 ' def create(*args, **kwds):\n' \
191 ' return AClass(*args, **kwds)\n'\
192 'a_var = AClass.create()'
193 self._introduce_factory(mod, mod.read().index('AClass') + 1, 'create')
194 self.assertEquals(expected, mod.read())
195
196 def test_changing_occurances_with_arguments(self):
197 code = 'class AClass(object):\n' \
198 ' def __init__(self, arg):\n' \
199 ' pass\n' \
200 'a_var = AClass(10)\n'
201 mod = testutils.create_module(self.project, 'mod')
202 mod.write(code)
203 expected = 'class AClass(object):\n' \
204 ' def __init__(self, arg):\n' \
205 ' pass\n\n' \
206 ' @staticmethod\n' \
207 ' def create(*args, **kwds):\n' \
208 ' return AClass(*args, **kwds)\n' \
209 'a_var = AClass.create(10)\n'
210 self._introduce_factory(mod, mod.read().index('AClass') + 1, 'create')
211 self.assertEquals(expected, mod.read())
212
213 def test_changing_occurances_in_other_modules(self):
214 mod1 = testutils.create_module(self.project, 'mod1')
215 mod2 = testutils.create_module(self.project, 'mod2')
216 mod1.write('class AClass(object):\n an_attr = 10\n')
217 mod2.write('import mod1\na_var = mod1.AClass()\n')
218 self._introduce_factory(mod1, mod1.read().index('AClass') + 1,
219 'create')
220 expected1 = 'class AClass(object):\n' \
221 ' an_attr = 10\n\n' \
222 ' @staticmethod\n' \
223 ' def create(*args, **kwds):\n' \
224 ' return AClass(*args, **kwds)\n'
225 expected2 = 'import mod1\n' \
226 'a_var = mod1.AClass.create()\n'
227 self.assertEquals(expected1, mod1.read())
228 self.assertEquals(expected2, mod2.read())
229
230 def test_raising_exception_for_non_classes(self):
231 mod = testutils.create_module(self.project, 'mod')
232 mod.write('def a_func():\n pass\n')
233 with self.assertRaises(RefactoringError):
234 self._introduce_factory(mod, mod.read().index('a_func') + 1,
235 'create')
236
237 def test_undoing_introduce_factory(self):
238 mod1 = testutils.create_module(self.project, 'mod1')
239 mod2 = testutils.create_module(self.project, 'mod2')
240 code1 = 'class AClass(object):\n an_attr = 10\n'
241 mod1.write(code1)
242 code2 = 'from mod1 import AClass\na_var = AClass()\n'
243 mod2.write(code2)
244 self._introduce_factory(mod1, mod1.read().index('AClass') + 1,
245 'create')
246 self.project.history.undo()
247 self.assertEquals(code1, mod1.read())
248 self.assertEquals(code2, mod2.read())
249
250 def test_using_on_an_occurance_outside_the_main_module(self):
251 mod1 = testutils.create_module(self.project, 'mod1')
252 mod2 = testutils.create_module(self.project, 'mod2')
253 mod1.write('class AClass(object):\n an_attr = 10\n')
254 mod2.write('import mod1\na_var = mod1.AClass()\n')
255 self._introduce_factory(mod2, mod2.read().index('AClass') + 1,
256 'create')
257 expected1 = 'class AClass(object):\n' \
258 ' an_attr = 10\n\n' \
259 ' @staticmethod\n' \
260 ' def create(*args, **kwds):\n' \
261 ' return AClass(*args, **kwds)\n'
262 expected2 = 'import mod1\n' \
263 'a_var = mod1.AClass.create()\n'
264 self.assertEquals(expected1, mod1.read())
265 self.assertEquals(expected2, mod2.read())
266
267 def test_introduce_factory_in_nested_scopes(self):
268 code = 'def create_var():\n'\
269 ' class AClass(object):\n'\
270 ' an_attr = 10\n'\
271 ' return AClass()\n'
272 mod = testutils.create_module(self.project, 'mod')
273 mod.write(code)
274 expected = 'def create_var():\n'\
275 ' class AClass(object):\n'\
276 ' an_attr = 10\n\n'\
277 ' @staticmethod\n ' \
278 'def create(*args, **kwds):\n'\
279 ' return AClass(*args, **kwds)\n'\
280 ' return AClass.create()\n'
281 self._introduce_factory(mod, mod.read().index('AClass') + 1, 'create')
282 self.assertEquals(expected, mod.read())
283
284 def test_adding_factory_for_global_factories(self):
285 code = 'class AClass(object):\n an_attr = 10\n'
286 mod = testutils.create_module(self.project, 'mod')
287 mod.write(code)
288 expected = 'class AClass(object):\n' \
289 ' an_attr = 10\n\n' \
290 'def create(*args, **kwds):\n' \
291 ' return AClass(*args, **kwds)\n'
292 self._introduce_factory(mod, mod.read().index('AClass') + 1,
293 'create', global_factory=True)
294 self.assertEquals(expected, mod.read())
295
296 def test_get_name_for_factories(self):
297 code = 'class C(object):\n pass\n'
298 mod = testutils.create_module(self.project, 'mod')
299 mod.write(code)
300 factory = IntroduceFactory(self.project, mod,
301 mod.read().index('C') + 1)
302 self.assertEquals('C', factory.get_name())
303
304 def test_raising_exception_for_global_factory_for_nested_classes(self):
305 code = 'def create_var():\n'\
306 ' class AClass(object):\n'\
307 ' an_attr = 10\n'\
308 ' return AClass()\n'
309 mod = testutils.create_module(self.project, 'mod')
310 mod.write(code)
311 with self.assertRaises(RefactoringError):
312 self._introduce_factory(mod, mod.read().index('AClass') + 1,
313 'create', global_factory=True)
314
315 def test_changing_occurances_in_the_main_module_for_global_factories(self):
316 code = 'class AClass(object):\n' \
317 ' an_attr = 10\n' \
318 'a_var = AClass()'
319 mod = testutils.create_module(self.project, 'mod')
320 mod.write(code)
321 expected = 'class AClass(object):\n an_attr = 10\n\n' \
322 'def create(*args, **kwds):\n' \
323 ' return AClass(*args, **kwds)\n'\
324 'a_var = create()'
325 self._introduce_factory(mod, mod.read().index('AClass') + 1,
326 'create', global_factory=True)
327 self.assertEquals(expected, mod.read())
328
329 def test_changing_occurances_in_other_modules_for_global_factories(self):
330 mod1 = testutils.create_module(self.project, 'mod1')
331 mod2 = testutils.create_module(self.project, 'mod2')
332 mod1.write('class AClass(object):\n an_attr = 10\n')
333 mod2.write('import mod1\na_var = mod1.AClass()\n')
334 self._introduce_factory(mod1, mod1.read().index('AClass') + 1,
335 'create', global_factory=True)
336 expected1 = 'class AClass(object):\n' \
337 ' an_attr = 10\n\n' \
338 'def create(*args, **kwds):\n' \
339 ' return AClass(*args, **kwds)\n'
340 expected2 = 'import mod1\n' \
341 'a_var = mod1.create()\n'
342 self.assertEquals(expected1, mod1.read())
343 self.assertEquals(expected2, mod2.read())
344
345 def test_import_if_necessary_in_other_mods_for_global_factories(self):
346 mod1 = testutils.create_module(self.project, 'mod1')
347 mod2 = testutils.create_module(self.project, 'mod2')
348 mod1.write('class AClass(object):\n an_attr = 10\n')
349 mod2.write('from mod1 import AClass\npair = AClass(), AClass\n')
350 self._introduce_factory(mod1, mod1.read().index('AClass') + 1,
351 'create', global_factory=True)
352 expected1 = 'class AClass(object):\n' \
353 ' an_attr = 10\n\n' \
354 'def create(*args, **kwds):\n' \
355 ' return AClass(*args, **kwds)\n'
356 expected2 = 'from mod1 import AClass, create\n' \
357 'pair = create(), AClass\n'
358 self.assertEquals(expected1, mod1.read())
359 self.assertEquals(expected2, mod2.read())
360
361 def test_changing_occurances_for_renamed_classes(self):
362 code = 'class AClass(object):\n an_attr = 10' \
363 '\na_class = AClass\na_var = a_class()'
364 mod = testutils.create_module(self.project, 'mod')
365 mod.write(code)
366 expected = 'class AClass(object):\n' \
367 ' an_attr = 10\n\n' \
368 ' @staticmethod\n' \
369 ' def create(*args, **kwds):\n' \
370 ' return AClass(*args, **kwds)\n' \
371 'a_class = AClass\n' \
372 'a_var = a_class()'
373 self._introduce_factory(mod, mod.read().index('a_class') + 1, 'create')
374 self.assertEquals(expected, mod.read())
375
376 def test_changing_occurrs_in_the_same_module_with_conflict_ranges(self):
377 mod = testutils.create_module(self.project, 'mod')
378 code = 'class C(object):\n' \
379 ' def create(self):\n' \
380 ' return C()\n'
381 mod.write(code)
382 self._introduce_factory(mod, mod.read().index('C'), 'create_c', True)
383 expected = 'class C(object):\n' \
384 ' def create(self):\n' \
385 ' return create_c()\n'
386 self.assertTrue(mod.read().startswith(expected))
387
388 def _transform_module_to_package(self, resource):
389 self.project.do(rope.refactor.ModuleToPackage(
390 self.project, resource).get_changes())
391
392 def test_transform_module_to_package(self):
393 mod1 = testutils.create_module(self.project, 'mod1')
394 mod1.write('import mod2\nfrom mod2 import AClass\n')
395 mod2 = testutils.create_module(self.project, 'mod2')
396 mod2.write('class AClass(object):\n pass\n')
397 self._transform_module_to_package(mod2)
398 mod2 = self.project.get_resource('mod2')
399 root_folder = self.project.root
400 self.assertFalse(root_folder.has_child('mod2.py'))
401 self.assertEquals('class AClass(object):\n pass\n',
402 root_folder.get_child('mod2').
403 get_child('__init__.py').read())
404
405 def test_transform_module_to_package_undoing(self):
406 pkg = testutils.create_package(self.project, 'pkg')
407 mod = testutils.create_module(self.project, 'mod', pkg)
408 self._transform_module_to_package(mod)
409 self.assertFalse(pkg.has_child('mod.py'))
410 self.assertTrue(pkg.get_child('mod').has_child('__init__.py'))
411 self.project.history.undo()
412 self.assertTrue(pkg.has_child('mod.py'))
413 self.assertFalse(pkg.has_child('mod'))
414
415 def test_transform_module_to_package_with_relative_imports(self):
416 pkg = testutils.create_package(self.project, 'pkg')
417 mod1 = testutils.create_module(self.project, 'mod1', pkg)
418 mod1.write('import mod2\nfrom mod2 import AClass\n')
419 mod2 = testutils.create_module(self.project, 'mod2', pkg)
420 mod2.write('class AClass(object):\n pass\n')
421 self._transform_module_to_package(mod1)
422 new_init = self.project.get_resource('pkg/mod1/__init__.py')
423 self.assertEquals('import pkg.mod2\nfrom pkg.mod2 import AClass\n',
424 new_init.read())
425
426 def test_resources_parameter(self):
427 code = 'class A(object):\n an_attr = 10\n'
428 code1 = 'import mod\na = mod.A()\n'
429 mod = testutils.create_module(self.project, 'mod')
430 mod1 = testutils.create_module(self.project, 'mod1')
431 mod.write(code)
432 mod1.write(code1)
433 expected = 'class A(object):\n' \
434 ' an_attr = 10\n\n' \
435 ' @staticmethod\n' \
436 ' def create(*args, **kwds):\n' \
437 ' return A(*args, **kwds)\n'
438 self._introduce_factory(mod, mod.read().index('A') + 1,
439 'create', resources=[mod])
440 self.assertEquals(expected, mod.read())
441 self.assertEquals(code1, mod1.read())
442
443
444 class EncapsulateFieldTest(unittest.TestCase):
445
446 def setUp(self):
447 super(EncapsulateFieldTest, self).setUp()
448 self.project = testutils.sample_project()
449 self.pycore = self.project.pycore
450 self.mod = testutils.create_module(self.project, 'mod')
451 self.mod1 = testutils.create_module(self.project, 'mod1')
452 self.a_class = 'class A(object):\n' \
453 ' def __init__(self):\n' \
454 ' self.attr = 1\n'
455 self.added_methods = '\n' \
456 ' def get_attr(self):\n' \
457 ' return self.attr\n\n' \
458 ' def set_attr(self, value):\n' \
459 ' self.attr = value\n'
460 self.encapsulated = self.a_class + self.added_methods
461
462 def tearDown(self):
463 testutils.remove_project(self.project)
464 super(EncapsulateFieldTest, self).tearDown()
465
466 def _encapsulate(self, resource, offset, **args):
467 changes = EncapsulateField(self.project, resource, offset).\
468 get_changes(**args)
469 self.project.do(changes)
470
471 def test_adding_getters_and_setters(self):
472 code = self.a_class
473 self.mod.write(code)
474 self._encapsulate(self.mod, code.index('attr') + 1)
475 self.assertEquals(self.encapsulated, self.mod.read())
476
477 def test_changing_getters_in_other_modules(self):
478 code = 'import mod\n' \
479 'a_var = mod.A()\n' \
480 'range(a_var.attr)\n'
481 self.mod1.write(code)
482 self.mod.write(self.a_class)
483 self._encapsulate(self.mod, self.mod.read().index('attr') + 1)
484 expected = 'import mod\n' \
485 'a_var = mod.A()\n' \
486 'range(a_var.get_attr())\n'
487 self.assertEquals(expected, self.mod1.read())
488
489 def test_changing_setters_in_other_modules(self):
490 code = 'import mod\n' \
491 'a_var = mod.A()\n' \
492 'a_var.attr = 1\n'
493 self.mod1.write(code)
494 self.mod.write(self.a_class)
495 self._encapsulate(self.mod, self.mod.read().index('attr') + 1)
496 expected = 'import mod\n' \
497 'a_var = mod.A()\n' \
498 'a_var.set_attr(1)\n'
499 self.assertEquals(expected, self.mod1.read())
500
501 def test_changing_getters_in_setters(self):
502 code = 'import mod\n' \
503 'a_var = mod.A()\n' \
504 'a_var.attr = 1 + a_var.attr\n'
505 self.mod1.write(code)
506 self.mod.write(self.a_class)
507 self._encapsulate(self.mod, self.mod.read().index('attr') + 1)
508 expected = 'import mod\n' \
509 'a_var = mod.A()\n' \
510 'a_var.set_attr(1 + a_var.get_attr())\n'
511 self.assertEquals(expected, self.mod1.read())
512
513 def test_appending_to_class_end(self):
514 self.mod1.write(self.a_class + 'a_var = A()\n')
515 self._encapsulate(self.mod1, self.mod1.read().index('attr') + 1)
516 self.assertEquals(self.encapsulated + 'a_var = A()\n',
517 self.mod1.read())
518
519 def test_performing_in_other_modules(self):
520 code = 'import mod\n' \
521 'a_var = mod.A()\n' \
522 'range(a_var.attr)\n'
523 self.mod1.write(code)
524 self.mod.write(self.a_class)
525 self._encapsulate(self.mod1, self.mod1.read().index('attr') + 1)
526 self.assertEquals(self.encapsulated, self.mod.read())
527 expected = 'import mod\n' \
528 'a_var = mod.A()\n' \
529 'range(a_var.get_attr())\n'
530 self.assertEquals(expected, self.mod1.read())
531
532 def test_changing_main_module_occurances(self):
533 code = self.a_class + \
534 'a_var = A()\n' \
535 'a_var.attr = a_var.attr * 2\n'
536 self.mod1.write(code)
537 self._encapsulate(self.mod1, self.mod1.read().index('attr') + 1)
538 expected = self.encapsulated + \
539 'a_var = A()\n' \
540 'a_var.set_attr(a_var.get_attr() * 2)\n'
541 self.assertEquals(expected, self.mod1.read())
542
543 def test_raising_exception_when_performed_on_non_attributes(self):
544 self.mod1.write('attr = 10')
545 with self.assertRaises(RefactoringError):
546 self._encapsulate(self.mod1, self.mod1.read().index('attr') + 1)
547
548 def test_raising_exception_on_tuple_assignments(self):
549 self.mod.write(self.a_class)
550 code = 'import mod\n' \
551 'a_var = mod.A()\n' \
552 'a_var.attr = 1\n' \
553 'a_var.attr, b = 1, 2\n'
554 self.mod1.write(code)
555 with self.assertRaises(RefactoringError):
556 self._encapsulate(self.mod1, self.mod1.read().index('attr') + 1)
557
558 def test_raising_exception_on_tuple_assignments2(self):
559 self.mod.write(self.a_class)
560 code = 'import mod\n' \
561 'a_var = mod.A()\n' \
562 'a_var.attr = 1\n' \
563 'b, a_var.attr = 1, 2\n'
564 self.mod1.write(code)
565 with self.assertRaises(RefactoringError):
566 self._encapsulate(self.mod1, self.mod1.read().index('attr') + 1)
567
568 def test_tuple_assignments_and_function_calls(self):
569 code = 'import mod\n' \
570 'def func(a1=0, a2=0):\n' \
571 ' pass\n' \
572 'a_var = mod.A()\n' \
573 'func(a_var.attr, a2=2)\n'
574 self.mod1.write(code)
575 self.mod.write(self.a_class)
576 self._encapsulate(self.mod, self.mod.read().index('attr') + 1)
577 expected = 'import mod\n' \
578 'def func(a1=0, a2=0):\n' \
579 ' pass\n' \
580 'a_var = mod.A()\n' \
581 'func(a_var.get_attr(), a2=2)\n'
582 self.assertEquals(expected, self.mod1.read())
583
584 def test_tuple_assignments(self):
585 code = 'import mod\n' \
586 'a_var = mod.A()\n' \
587 'a, b = a_var.attr, 1\n'
588 self.mod1.write(code)
589 self.mod.write(self.a_class)
590 self._encapsulate(self.mod, self.mod.read().index('attr') + 1)
591 expected = 'import mod\n' \
592 'a_var = mod.A()\n' \
593 'a, b = a_var.get_attr(), 1\n'
594 self.assertEquals(expected, self.mod1.read())
595
596 def test_changing_augmented_assignments(self):
597 code = 'import mod\n' \
598 'a_var = mod.A()\n' \
599 'a_var.attr += 1\n'
600 self.mod1.write(code)
601 self.mod.write(self.a_class)
602 self._encapsulate(self.mod, self.mod.read().index('attr') + 1)
603 expected = 'import mod\n' \
604 'a_var = mod.A()\n' \
605 'a_var.set_attr(a_var.get_attr() + 1)\n'
606 self.assertEquals(expected, self.mod1.read())
607
608 def test_changing_augmented_assignments2(self):
609 code = 'import mod\n' \
610 'a_var = mod.A()\n' \
611 'a_var.attr <<= 1\n'
612 self.mod1.write(code)
613 self.mod.write(self.a_class)
614 self._encapsulate(self.mod, self.mod.read().index('attr') + 1)
615 expected = 'import mod\n' \
616 'a_var = mod.A()\n' \
617 'a_var.set_attr(a_var.get_attr() << 1)\n'
618 self.assertEquals(expected, self.mod1.read())
619
620 def test_changing_occurrences_inside_the_class(self):
621 new_class = self.a_class + '\n' \
622 ' def a_func(self):\n' \
623 ' self.attr = 1\n'
624 self.mod.write(new_class)
625 self._encapsulate(self.mod, self.mod.read().index('attr') + 1)
626 expected = self.a_class + '\n' \
627 ' def a_func(self):\n' \
628 ' self.set_attr(1)\n' + \
629 self.added_methods
630 self.assertEquals(expected, self.mod.read())
631
632 def test_getter_and_setter_parameters(self):
633 self.mod.write(self.a_class)
634 self._encapsulate(self.mod, self.mod.read().index('attr') + 1,
635 getter='getAttr', setter='setAttr')
636 new_methods = self.added_methods.replace('get_attr', 'getAttr').\
637 replace('set_attr', 'setAttr')
638 expected = self.a_class + new_methods
639 self.assertEquals(expected, self.mod.read())
640
641 def test_using_resources_parameter(self):
642 self.mod1.write('import mod\na = mod.A()\nvar = a.attr\n')
643 self.mod.write(self.a_class)
644 self._encapsulate(self.mod, self.mod.read().index('attr') + 1,
645 resources=[self.mod])
646 self.assertEquals('import mod\na = mod.A()\nvar = a.attr\n',
647 self.mod1.read())
648 expected = self.a_class + self.added_methods
649 self.assertEquals(expected, self.mod.read())
650
651
652 class LocalToFieldTest(unittest.TestCase):
653
654 def setUp(self):
655 super(LocalToFieldTest, self).setUp()
656 self.project = testutils.sample_project()
657 self.pycore = self.project.pycore
658 self.mod = testutils.create_module(self.project, 'mod')
659
660 def tearDown(self):
661 testutils.remove_project(self.project)
662 super(LocalToFieldTest, self).tearDown()
663
664 def _perform_convert_local_variable_to_field(self, resource, offset):
665 changes = LocalToField(
666 self.project, resource, offset).get_changes()
667 self.project.do(changes)
668
669 def test_simple_local_to_field(self):
670 code = 'class A(object):\n' \
671 ' def a_func(self):\n' \
672 ' var = 10\n'
673 self.mod.write(code)
674 self._perform_convert_local_variable_to_field(self.mod,
675 code.index('var') + 1)
676 expected = 'class A(object):\n' \
677 ' def a_func(self):\n' \
678 ' self.var = 10\n'
679 self.assertEquals(expected, self.mod.read())
680
681 def test_raising_exception_when_performed_on_a_global_var(self):
682 self.mod.write('var = 10\n')
683 with self.assertRaises(RefactoringError):
684 self._perform_convert_local_variable_to_field(
685 self.mod, self.mod.read().index('var') + 1)
686
687 def test_raising_exception_when_performed_on_field(self):
688 code = 'class A(object):\n' \
689 ' def a_func(self):\n' \
690 ' self.var = 10\n'
691 self.mod.write(code)
692 with self.assertRaises(RefactoringError):
693 self._perform_convert_local_variable_to_field(
694 self.mod, self.mod.read().index('var') + 1)
695
696 def test_raising_exception_when_performed_on_a_parameter(self):
697 code = 'class A(object):\n' \
698 ' def a_func(self, var):\n' \
699 ' a = var\n'
700 self.mod.write(code)
701 with self.assertRaises(RefactoringError):
702 self._perform_convert_local_variable_to_field(
703 self.mod, self.mod.read().index('var') + 1)
704
705 # NOTE: This situation happens alot and is normally not an error
706 #@testutils.assert_raises(RefactoringError)
707 def test_not_rais_exception_when_there_is_a_field_with_the_same_name(self):
708 code = 'class A(object):\n' \
709 ' def __init__(self):\n' \
710 ' self.var = 1\n' \
711 ' def a_func(self):\n var = 10\n'
712 self.mod.write(code)
713 self._perform_convert_local_variable_to_field(
714 self.mod, self.mod.read().rindex('var') + 1)
715
716 def test_local_to_field_with_self_renamed(self):
717 code = 'class A(object):\n' \
718 ' def a_func(myself):\n' \
719 ' var = 10\n'
720 self.mod.write(code)
721 self._perform_convert_local_variable_to_field(self.mod,
722 code.index('var') + 1)
723 expected = 'class A(object):\n' \
724 ' def a_func(myself):\n' \
725 ' myself.var = 10\n'
726 self.assertEquals(expected, self.mod.read())
727
728
729 class IntroduceParameterTest(unittest.TestCase):
730
731 def setUp(self):
732 super(IntroduceParameterTest, self).setUp()
733 self.project = testutils.sample_project()
734 self.pycore = self.project.pycore
735 self.mod = testutils.create_module(self.project, 'mod')
736
737 def tearDown(self):
738 testutils.remove_project(self.project)
739 super(IntroduceParameterTest, self).tearDown()
740
741 def _introduce_parameter(self, offset, name):
742 rope.refactor.introduce_parameter.IntroduceParameter(
743 self.project, self.mod, offset).get_changes(name).do()
744
745 def test_simple_case(self):
746 code = 'var = 1\n' \
747 'def f():\n' \
748 ' b = var\n'
749 self.mod.write(code)
750 offset = self.mod.read().rindex('var')
751 self._introduce_parameter(offset, 'var')
752 expected = 'var = 1\n' \
753 'def f(var=var):\n' \
754 ' b = var\n'
755 self.assertEquals(expected, self.mod.read())
756
757 def test_changing_function_body(self):
758 code = 'var = 1\n' \
759 'def f():\n' \
760 ' b = var\n'
761 self.mod.write(code)
762 offset = self.mod.read().rindex('var')
763 self._introduce_parameter(offset, 'p1')
764 expected = 'var = 1\n' \
765 'def f(p1=var):\n' \
766 ' b = p1\n'
767 self.assertEquals(expected, self.mod.read())
768
769 def test_unknown_variables(self):
770 self.mod.write('def f():\n b = var + c\n')
771 offset = self.mod.read().rindex('var')
772 with self.assertRaises(RefactoringError):
773 self._introduce_parameter(offset, 'p1')
774 self.assertEquals('def f(p1=var):\n b = p1 + c\n',
775 self.mod.read())
776
777 def test_failing_when_not_inside(self):
778 self.mod.write('var = 10\nb = var\n')
779 offset = self.mod.read().rindex('var')
780 with self.assertRaises(RefactoringError):
781 self._introduce_parameter(offset, 'p1')
782
783 def test_attribute_accesses(self):
784 code = 'class C(object):\n' \
785 ' a = 10\nc = C()\n' \
786 'def f():\n' \
787 ' b = c.a\n'
788 self.mod.write(code)
789 offset = self.mod.read().rindex('a')
790 self._introduce_parameter(offset, 'p1')
791 expected = 'class C(object):\n' \
792 ' a = 10\n' \
793 'c = C()\n' \
794 'def f(p1=c.a):\n' \
795 ' b = p1\n'
796 self.assertEquals(expected, self.mod.read())
797
798 def test_introducing_parameters_for_methods(self):
799 code = 'var = 1\n' \
800 'class C(object):\n' \
801 ' def f(self):\n' \
802 ' b = var\n'
803 self.mod.write(code)
804 offset = self.mod.read().rindex('var')
805 self._introduce_parameter(offset, 'p1')
806 expected = 'var = 1\n' \
807 'class C(object):\n' \
808 ' def f(self, p1=var):\n' \
809 ' b = p1\n'
810 self.assertEquals(expected, self.mod.read())
811
812
813 class _MockTaskObserver(object):
814
815 def __init__(self):
816 self.called = 0
817
818 def __call__(self):
819 self.called += 1
820
821
822 class TaskHandleTest(unittest.TestCase):
823
824 def test_trivial_case(self):
825 handle = rope.base.taskhandle.TaskHandle()
826 self.assertFalse(handle.is_stopped())
827
828 def test_stopping(self):
829 handle = rope.base.taskhandle.TaskHandle()
830 handle.stop()
831 self.assertTrue(handle.is_stopped())
832
833 def test_job_sets(self):
834 handle = rope.base.taskhandle.TaskHandle()
835 jobs = handle.create_jobset()
836 self.assertEquals([jobs], handle.get_jobsets())
837
838 def test_starting_and_finishing_jobs(self):
839 handle = rope.base.taskhandle.TaskHandle()
840 jobs = handle.create_jobset(name='test job set', count=1)
841 jobs.started_job('job1')
842 jobs.finished_job()
843
844 def test_test_checking_status(self):
845 handle = rope.base.taskhandle.TaskHandle()
846 jobs = handle.create_jobset()
847 handle.stop()
848 with self.assertRaises(InterruptedTaskError):
849 jobs.check_status()
850
851 def test_test_checking_status_when_starting(self):
852 handle = rope.base.taskhandle.TaskHandle()
853 jobs = handle.create_jobset()
854 handle.stop()
855 with self.assertRaises(InterruptedTaskError):
856 jobs.started_job('job1')
857
858 def test_calling_the_observer_after_stopping(self):
859 handle = rope.base.taskhandle.TaskHandle()
860 observer = _MockTaskObserver()
861 handle.add_observer(observer)
862 handle.stop()
863 self.assertEquals(1, observer.called)
864
865 def test_calling_the_observer_after_creating_job_sets(self):
866 handle = rope.base.taskhandle.TaskHandle()
867 observer = _MockTaskObserver()
868 handle.add_observer(observer)
869 jobs = handle.create_jobset() # noqa
870 self.assertEquals(1, observer.called)
871
872 def test_calling_the_observer_when_starting_and_finishing_jobs(self):
873 handle = rope.base.taskhandle.TaskHandle()
874 observer = _MockTaskObserver()
875 handle.add_observer(observer)
876 jobs = handle.create_jobset(name='test job set', count=1)
877 jobs.started_job('job1')
878 jobs.finished_job()
879 self.assertEquals(3, observer.called)
880
881 def test_job_set_get_percent_done(self):
882 handle = rope.base.taskhandle.TaskHandle()
883 jobs = handle.create_jobset(name='test job set', count=2)
884 self.assertEquals(0, jobs.get_percent_done())
885 jobs.started_job('job1')
886 jobs.finished_job()
887 self.assertEquals(50, jobs.get_percent_done())
888 jobs.started_job('job2')
889 jobs.finished_job()
890 self.assertEquals(100, jobs.get_percent_done())
891
892 def test_getting_job_name(self):
893 handle = rope.base.taskhandle.TaskHandle()
894 jobs = handle.create_jobset(name='test job set', count=1)
895 self.assertEquals('test job set', jobs.get_name())
896 self.assertEquals(None, jobs.get_active_job_name())
897 jobs.started_job('job1')
898 self.assertEquals('job1', jobs.get_active_job_name())
899
900
901 def suite():
902 result = unittest.TestSuite()
903 result.addTests(ropetest.refactor.renametest.suite())
904 result.addTests(unittest.makeSuite(
905 ropetest.refactor.extracttest.ExtractMethodTest))
906 result.addTests(unittest.makeSuite(IntroduceFactoryTest))
907 result.addTests(unittest.makeSuite(
908 ropetest.refactor.movetest.MoveRefactoringTest))
909 result.addTests(ropetest.refactor.inlinetest.suite())
910 result.addTests(unittest.makeSuite(
911 ropetest.refactor.patchedasttest.PatchedASTTest))
912 result.addTests(unittest.makeSuite(EncapsulateFieldTest))
913 result.addTests(unittest.makeSuite(LocalToFieldTest))
914 result.addTests(unittest.makeSuite(
915 change_signature_test.ChangeSignatureTest))
916 result.addTests(unittest.makeSuite(IntroduceParameterTest))
917 result.addTests(ropetest.refactor.importutilstest.suite())
918 result.addTests(similarfindertest.suite())
919 result.addTests(unittest.makeSuite(TaskHandleTest))
920 result.addTests(unittest.makeSuite(ropetest.refactor.
921 restructuretest.RestructureTest))
922 result.addTests(unittest.makeSuite(ropetest.refactor.
923 suitestest.SuiteTest))
924 result.addTests(unittest.makeSuite(ropetest.refactor.multiprojecttest.
925 MultiProjectRefactoringTest))
926 result.addTests(unittest.makeSuite(ropetest.refactor.usefunctiontest.
927 UseFunctionTest))
928 return result
929
930
931 if __name__ == '__main__':
932 import sys
933 if len(sys.argv) > 1:
934 unittest.main()
935 else:
936 runner = unittest.TextTestRunner()
937 result = runner.run(suite())
938 sys.exit(not result.wasSuccessful())
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698