OLD | NEW |
(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() |
OLD | NEW |