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