OLD | NEW |
(Empty) | |
| 1 try: |
| 2 import unittest2 as unittest |
| 3 except ImportError: |
| 4 import unittest |
| 5 |
| 6 import rope.base.exceptions |
| 7 from rope.refactor import inline |
| 8 from ropetest import testutils |
| 9 |
| 10 |
| 11 class InlineTest(unittest.TestCase): |
| 12 |
| 13 def setUp(self): |
| 14 super(InlineTest, self).setUp() |
| 15 self.project = testutils.sample_project() |
| 16 self.pycore = self.project.pycore |
| 17 self.mod = testutils.create_module(self.project, 'mod') |
| 18 self.mod2 = testutils.create_module(self.project, 'mod2') |
| 19 |
| 20 def tearDown(self): |
| 21 testutils.remove_project(self.project) |
| 22 super(InlineTest, self).tearDown() |
| 23 |
| 24 def _inline(self, code, offset, **kwds): |
| 25 self.mod.write(code) |
| 26 self._inline2(self.mod, offset, **kwds) |
| 27 return self.mod.read() |
| 28 |
| 29 def _inline2(self, resource, offset, **kwds): |
| 30 inliner = inline.create_inline(self.project, resource, offset) |
| 31 changes = inliner.get_changes(**kwds) |
| 32 self.project.do(changes) |
| 33 return self.mod.read() |
| 34 |
| 35 def test_simple_case(self): |
| 36 code = 'a_var = 10\nanother_var = a_var\n' |
| 37 refactored = self._inline(code, code.index('a_var') + 1) |
| 38 self.assertEquals('another_var = 10\n', refactored) |
| 39 |
| 40 def test_empty_case(self): |
| 41 code = 'a_var = 10\n' |
| 42 refactored = self._inline(code, code.index('a_var') + 1) |
| 43 self.assertEquals('', refactored) |
| 44 |
| 45 def test_long_definition(self): |
| 46 code = 'a_var = 10 + (10 + 10)\nanother_var = a_var\n' |
| 47 refactored = self._inline(code, code.index('a_var') + 1) |
| 48 self.assertEquals('another_var = 10 + (10 + 10)\n', refactored) |
| 49 |
| 50 def test_explicit_continuation(self): |
| 51 code = 'a_var = (10 +\n 10)\nanother_var = a_var\n' |
| 52 refactored = self._inline(code, code.index('a_var') + 1) |
| 53 self.assertEquals('another_var = (10 + 10)\n', refactored) |
| 54 |
| 55 def test_implicit_continuation(self): |
| 56 code = 'a_var = 10 +\\\n 10\nanother_var = a_var\n' |
| 57 refactored = self._inline(code, code.index('a_var') + 1) |
| 58 self.assertEquals('another_var = 10 + 10\n', refactored) |
| 59 |
| 60 def test_inlining_at_the_end_of_input(self): |
| 61 code = 'a = 1\nb = a' |
| 62 refactored = self._inline(code, code.index('a') + 1) |
| 63 self.assertEquals('b = 1', refactored) |
| 64 |
| 65 def test_on_classes(self): |
| 66 code = 'class AClass(object):\n pass\n' |
| 67 with self.assertRaises(rope.base.exceptions.RefactoringError): |
| 68 self._inline(code, code.index('AClass') + 1) |
| 69 |
| 70 def test_multiple_assignments(self): |
| 71 code = 'a_var = 10\na_var = 20\n' |
| 72 with self.assertRaises(rope.base.exceptions.RefactoringError): |
| 73 self._inline(code, code.index('a_var') + 1) |
| 74 |
| 75 def test_tuple_assignments(self): |
| 76 code = 'a_var, another_var = (20, 30)\n' |
| 77 with self.assertRaises(rope.base.exceptions.RefactoringError): |
| 78 self._inline(code, code.index('a_var') + 1) |
| 79 |
| 80 def test_on_unknown_vars(self): |
| 81 code = 'a_var = another_var\n' |
| 82 with self.assertRaises(rope.base.exceptions.RefactoringError): |
| 83 self._inline(code, code.index('another_var') + 1) |
| 84 |
| 85 def test_attribute_inlining(self): |
| 86 code = 'class A(object):\n def __init__(self):\n' \ |
| 87 ' self.an_attr = 3\n range(self.an_attr)\n' |
| 88 refactored = self._inline(code, code.index('an_attr') + 1) |
| 89 expected = 'class A(object):\n def __init__(self):\n' \ |
| 90 ' range(3)\n' |
| 91 self.assertEquals(expected, refactored) |
| 92 |
| 93 def test_attribute_inlining2(self): |
| 94 code = 'class A(object):\n def __init__(self):\n' \ |
| 95 ' self.an_attr = 3\n range(self.an_attr)\n' \ |
| 96 'a = A()\nrange(a.an_attr)' |
| 97 refactored = self._inline(code, code.index('an_attr') + 1) |
| 98 expected = 'class A(object):\n def __init__(self):\n' \ |
| 99 ' range(3)\n' \ |
| 100 'a = A()\nrange(3)' |
| 101 self.assertEquals(expected, refactored) |
| 102 |
| 103 def test_a_function_with_no_occurance(self): |
| 104 self.mod.write('def a_func():\n pass\n') |
| 105 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 106 self.assertEquals('', self.mod.read()) |
| 107 |
| 108 def test_a_function_with_no_occurance2(self): |
| 109 self.mod.write('a_var = 10\ndef a_func():\n pass\nprint(a_var)\n') |
| 110 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 111 self.assertEquals('a_var = 10\nprint(a_var)\n', self.mod.read()) |
| 112 |
| 113 def test_replacing_calls_with_function_definition_in_other_modules(self): |
| 114 self.mod.write('def a_func():\n print(1)\n') |
| 115 mod1 = testutils.create_module(self.project, 'mod1') |
| 116 mod1.write('import mod\nmod.a_func()\n') |
| 117 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 118 self.assertEquals('import mod\nprint(1)\n', mod1.read()) |
| 119 |
| 120 def test_replacing_calls_with_function_definition_in_other_modules2(self): |
| 121 self.mod.write('def a_func():\n print(1)\n') |
| 122 mod1 = testutils.create_module(self.project, 'mod1') |
| 123 mod1.write('import mod\nif True:\n mod.a_func()\n') |
| 124 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 125 self.assertEquals('import mod\nif True:\n print(1)\n', mod1.read()) |
| 126 |
| 127 def test_replacing_calls_with_method_definition_in_other_modules(self): |
| 128 self.mod.write('class A(object):\n var = 10\n' |
| 129 ' def a_func(self):\n print(1)\n') |
| 130 mod1 = testutils.create_module(self.project, 'mod1') |
| 131 mod1.write('import mod\nmod.A().a_func()\n') |
| 132 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 133 self.assertEquals('import mod\nprint(1)\n', mod1.read()) |
| 134 self.assertEquals('class A(object):\n var = 10\n', self.mod.read()) |
| 135 |
| 136 def test_replacing_calls_with_function_definition_in_defining_module(self): |
| 137 self.mod.write('def a_func():\n print(1)\na_func()\n') |
| 138 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 139 self.assertEquals('print(1)\n', self.mod.read()) |
| 140 |
| 141 def test_replac_calls_with_function_definition_in_defining_module2(self): |
| 142 self.mod.write('def a_func():\n ' |
| 143 'for i in range(10):\n print(1)\na_func()\n') |
| 144 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 145 self.assertEquals('for i in range(10):\n print(1)\n', |
| 146 self.mod.read()) |
| 147 |
| 148 def test_replacing_calls_with_method_definition_in_defining_modules(self): |
| 149 self.mod.write('class A(object):\n var = 10\n' |
| 150 ' def a_func(self):\n print(1)\nA().a_func()') |
| 151 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 152 self.assertEquals('class A(object):\n var = 10\nprint(1)\n', |
| 153 self.mod.read()) |
| 154 |
| 155 def test_parameters_with_the_same_name_as_passed(self): |
| 156 self.mod.write('def a_func(var):\n ' |
| 157 'print(var)\nvar = 1\na_func(var)\n') |
| 158 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 159 self.assertEquals('var = 1\nprint(var)\n', self.mod.read()) |
| 160 |
| 161 def test_parameters_with_the_same_name_as_passed2(self): |
| 162 self.mod.write('def a_func(var):\n ' |
| 163 'print(var)\nvar = 1\na_func(var=var)\n') |
| 164 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 165 self.assertEquals('var = 1\nprint(var)\n', self.mod.read()) |
| 166 |
| 167 def test_simple_parameters_renaming(self): |
| 168 self.mod.write('def a_func(param):\n ' |
| 169 'print(param)\nvar = 1\na_func(var)\n') |
| 170 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 171 self.assertEquals('var = 1\nprint(var)\n', self.mod.read()) |
| 172 |
| 173 def test_simple_parameters_renaming_for_multiple_params(self): |
| 174 self.mod.write('def a_func(param1, param2):\n p = param1 + param2\n' |
| 175 'var1 = 1\nvar2 = 1\na_func(var1, var2)\n') |
| 176 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 177 self.assertEquals('var1 = 1\nvar2 = 1\np = var1 + var2\n', |
| 178 self.mod.read()) |
| 179 |
| 180 def test_parameters_renaming_for_passed_constants(self): |
| 181 self.mod.write('def a_func(param):\n print(param)\na_func(1)\n') |
| 182 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 183 self.assertEquals('print(1)\n', self.mod.read()) |
| 184 |
| 185 def test_parameters_renaming_for_passed_statements(self): |
| 186 self.mod.write('def a_func(param):\n ' |
| 187 'print(param)\na_func((1 + 2) / 3)\n') |
| 188 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 189 self.assertEquals('print((1 + 2) / 3)\n', self.mod.read()) |
| 190 |
| 191 def test_simple_parameters_renam_for_multiple_params_using_keywords(self): |
| 192 self.mod.write('def a_func(param1, param2):\n ' |
| 193 'p = param1 + param2\n' |
| 194 'var1 = 1\nvar2 = 1\n' |
| 195 'a_func(param2=var1, param1=var2)\n') |
| 196 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 197 self.assertEquals('var1 = 1\nvar2 = 1\np = var2 + var1\n', |
| 198 self.mod.read()) |
| 199 |
| 200 def test_simple_params_renam_for_multi_params_using_mixed_keywords(self): |
| 201 self.mod.write('def a_func(param1, param2):\n p = param1 + param2\n' |
| 202 'var1 = 1\nvar2 = 1\na_func(var2, param2=var1)\n') |
| 203 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 204 self.assertEquals('var1 = 1\nvar2 = 1\np = var2 + var1\n', |
| 205 self.mod.read()) |
| 206 |
| 207 def test_simple_putting_in_default_arguments(self): |
| 208 self.mod.write('def a_func(param=None):\n print(param)\n' |
| 209 'a_func()\n') |
| 210 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 211 self.assertEquals('print(None)\n', self.mod.read()) |
| 212 |
| 213 def test_overriding_default_arguments(self): |
| 214 self.mod.write('def a_func(param1=1, param2=2):' |
| 215 '\n print(param1, param2)\n' |
| 216 'a_func(param2=3)\n') |
| 217 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 218 self.assertEquals('print(1, 3)\n', self.mod.read()) |
| 219 |
| 220 def test_badly_formatted_text(self): |
| 221 self.mod.write('def a_func ( param1 = 1 ,param2 = 2 ) :' |
| 222 '\n print(param1, param2)\n' |
| 223 'a_func ( param2 \n = 3 ) \n') |
| 224 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 225 self.assertEquals('print(1, 3)\n', self.mod.read()) |
| 226 |
| 227 def test_passing_first_arguments_for_methods(self): |
| 228 a_class = 'class A(object):\n' \ |
| 229 ' def __init__(self):\n' \ |
| 230 ' self.var = 1\n' \ |
| 231 ' self.a_func(self.var)\n' \ |
| 232 ' def a_func(self, param):\n' \ |
| 233 ' print(param)\n' |
| 234 self.mod.write(a_class) |
| 235 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 236 expected = 'class A(object):\n' \ |
| 237 ' def __init__(self):\n' \ |
| 238 ' self.var = 1\n' \ |
| 239 ' print(self.var)\n' |
| 240 self.assertEquals(expected, self.mod.read()) |
| 241 |
| 242 def test_passing_first_arguments_for_methods2(self): |
| 243 a_class = 'class A(object):\n' \ |
| 244 ' def __init__(self):\n' \ |
| 245 ' self.var = 1\n' \ |
| 246 ' def a_func(self, param):\n' \ |
| 247 ' print(param, self.var)\n' \ |
| 248 'an_a = A()\n' \ |
| 249 'an_a.a_func(1)\n' |
| 250 self.mod.write(a_class) |
| 251 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 252 expected = 'class A(object):\n' \ |
| 253 ' def __init__(self):\n' \ |
| 254 ' self.var = 1\n' \ |
| 255 'an_a = A()\n' \ |
| 256 'print(1, an_a.var)\n' |
| 257 self.assertEquals(expected, self.mod.read()) |
| 258 |
| 259 def test_passing_first_arguments_for_methods3(self): |
| 260 a_class = 'class A(object):\n' \ |
| 261 ' def __init__(self):\n' \ |
| 262 ' self.var = 1\n' \ |
| 263 ' def a_func(self, param):\n' \ |
| 264 ' print(param, self.var)\n' \ |
| 265 'an_a = A()\n' \ |
| 266 'A.a_func(an_a, 1)\n' |
| 267 self.mod.write(a_class) |
| 268 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 269 expected = 'class A(object):\n' \ |
| 270 ' def __init__(self):\n' \ |
| 271 ' self.var = 1\n' \ |
| 272 'an_a = A()\n' \ |
| 273 'print(1, an_a.var)\n' |
| 274 self.assertEquals(expected, self.mod.read()) |
| 275 |
| 276 def test_inlining_staticmethods(self): |
| 277 a_class = 'class A(object):\n' \ |
| 278 ' @staticmethod\n' \ |
| 279 ' def a_func(param):\n' \ |
| 280 ' print(param)\n' \ |
| 281 'A.a_func(1)\n' |
| 282 self.mod.write(a_class) |
| 283 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 284 expected = 'class A(object):\n' \ |
| 285 ' pass\n' \ |
| 286 'print(1)\n' |
| 287 self.assertEquals(expected, self.mod.read()) |
| 288 |
| 289 def test_static_methods2(self): |
| 290 a_class = 'class A(object):\n' \ |
| 291 ' var = 10\n' \ |
| 292 ' @staticmethod\n' \ |
| 293 ' def a_func(param):\n' \ |
| 294 ' print(param)\n' \ |
| 295 'an_a = A()\n' \ |
| 296 'an_a.a_func(1)\n' \ |
| 297 'A.a_func(2)\n' |
| 298 self.mod.write(a_class) |
| 299 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 300 expected = 'class A(object):\n' \ |
| 301 ' var = 10\n' \ |
| 302 'an_a = A()\n' \ |
| 303 'print(1)\n' \ |
| 304 'print(2)\n' |
| 305 self.assertEquals(expected, self.mod.read()) |
| 306 |
| 307 def test_inlining_classmethods(self): |
| 308 a_class = 'class A(object):\n' \ |
| 309 ' @classmethod\n' \ |
| 310 ' def a_func(cls, param):\n' \ |
| 311 ' print(param)\n' \ |
| 312 'A.a_func(1)\n' |
| 313 self.mod.write(a_class) |
| 314 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 315 expected = 'class A(object):\n' \ |
| 316 ' pass\n' \ |
| 317 'print(1)\n' |
| 318 self.assertEquals(expected, self.mod.read()) |
| 319 |
| 320 def test_inlining_classmethods2(self): |
| 321 a_class = 'class A(object):\n' \ |
| 322 ' @classmethod\n' \ |
| 323 ' def a_func(cls, param):\n' \ |
| 324 ' return cls\n' \ |
| 325 'print(A.a_func(1))\n' |
| 326 self.mod.write(a_class) |
| 327 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 328 expected = 'class A(object):\n' \ |
| 329 ' pass\n' \ |
| 330 'print(A)\n' |
| 331 self.assertEquals(expected, self.mod.read()) |
| 332 |
| 333 def test_simple_return_values_and_inlining_functions(self): |
| 334 self.mod.write('def a_func():\n return 1\na = a_func()\n') |
| 335 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 336 self.assertEquals('a = 1\n', |
| 337 self.mod.read()) |
| 338 |
| 339 def test_simple_return_values_and_inlining_lonely_functions(self): |
| 340 self.mod.write('def a_func():\n return 1\na_func()\n') |
| 341 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 342 self.assertEquals('1\n', self.mod.read()) |
| 343 |
| 344 def test_empty_returns_and_inlining_lonely_functions(self): |
| 345 self.mod.write('def a_func():\n ' |
| 346 'if True:\n return\na_func()\n') |
| 347 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 348 self.assertEquals('if True:\n pass\n', self.mod.read()) |
| 349 |
| 350 def test_multiple_returns(self): |
| 351 self.mod.write('def less_than_five(var):\n if var < 5:\n' |
| 352 ' return True\n return False\n' |
| 353 'a = less_than_five(2)\n') |
| 354 with self.assertRaises(rope.base.exceptions.RefactoringError): |
| 355 self._inline2(self.mod, self.mod.read().index('less') + 1) |
| 356 |
| 357 def test_multiple_returns_and_not_using_the_value(self): |
| 358 self.mod.write('def less_than_five(var):\n if var < 5:\n' |
| 359 ' return True\n ' |
| 360 'return False\nless_than_five(2)\n') |
| 361 self._inline2(self.mod, self.mod.read().index('less') + 1) |
| 362 self.assertEquals('if 2 < 5:\n True\nFalse\n', self.mod.read()) |
| 363 |
| 364 def test_raising_exception_for_list_arguments(self): |
| 365 self.mod.write('def a_func(*args):\n print(args)\na_func(1)\n') |
| 366 with self.assertRaises(rope.base.exceptions.RefactoringError): |
| 367 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 368 |
| 369 def test_raising_exception_for_list_keywods(self): |
| 370 self.mod.write('def a_func(**kwds):\n print(kwds)\na_func(n=1)\n') |
| 371 with self.assertRaises(rope.base.exceptions.RefactoringError): |
| 372 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 373 |
| 374 def test_function_parameters_and_returns_in_other_functions(self): |
| 375 code = 'def a_func(param1, param2):\n' \ |
| 376 ' return param1 + param2\n' \ |
| 377 'range(a_func(20, param2=abs(10)))\n' |
| 378 self.mod.write(code) |
| 379 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 380 self.assertEquals('range(20 + abs(10))\n', self.mod.read()) |
| 381 |
| 382 def test_function_references_other_than_call(self): |
| 383 self.mod.write('def a_func(param):\n print(param)\nf = a_func\n') |
| 384 with self.assertRaises(rope.base.exceptions.RefactoringError): |
| 385 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 386 |
| 387 def test_function_referencing_itself(self): |
| 388 self.mod.write('def a_func(var):\n func = a_func\n') |
| 389 with self.assertRaises(rope.base.exceptions.RefactoringError): |
| 390 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 391 |
| 392 def test_recursive_functions(self): |
| 393 self.mod.write('def a_func(var):\n a_func(var)\n') |
| 394 with self.assertRaises(rope.base.exceptions.RefactoringError): |
| 395 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 396 |
| 397 # TODO: inlining on function parameters |
| 398 def xxx_test_inlining_function_default_parameters(self): |
| 399 self.mod.write('def a_func(p1=1):\n pass\na_func()\n') |
| 400 self._inline2(self.mod, self.mod.read().index('p1') + 1) |
| 401 self.assertEquals('def a_func(p1=1):\n pass\na_func()\n', |
| 402 self.mod.read()) |
| 403 |
| 404 def test_simple_inlining_after_extra_indented_lines(self): |
| 405 self.mod.write('def a_func():\n for i in range(10):\n pass\n' |
| 406 'if True:\n pass\na_func()\n') |
| 407 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 408 self.assertEquals('if True:\n pass\nfor i in range(10):' |
| 409 '\n pass\n', |
| 410 self.mod.read()) |
| 411 |
| 412 def test_inlining_a_function_with_pydoc(self): |
| 413 self.mod.write('def a_func():\n """docs"""\n a = 1\na_func()') |
| 414 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 415 self.assertEquals('a = 1\n', self.mod.read()) |
| 416 |
| 417 def test_inlining_methods(self): |
| 418 self.mod.write("class A(object):\n name = 'hey'\n" |
| 419 " def get_name(self):\n return self.name\n" |
| 420 "a = A()\nname = a.get_name()\n") |
| 421 self._inline2(self.mod, self.mod.read().rindex('get_name') + 1) |
| 422 self.assertEquals("class A(object):\n name = 'hey'\n" |
| 423 "a = A()\nname = a.name\n", self.mod.read()) |
| 424 |
| 425 def test_simple_returns_with_backslashes(self): |
| 426 self.mod.write('def a_func():\n return 1' |
| 427 '\\\n + 2\na = a_func()\n') |
| 428 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 429 self.assertEquals('a = 1 + 2\n', self.mod.read()) |
| 430 |
| 431 def test_a_function_with_pass_body(self): |
| 432 self.mod.write('def a_func():\n print(1)\na = a_func()\n') |
| 433 self._inline2(self.mod, self.mod.read().index('a_func') + 1) |
| 434 self.assertEquals('print(1)\na = None\n', self.mod.read()) |
| 435 |
| 436 def test_inlining_the_last_method_of_a_class(self): |
| 437 self.mod.write('class A(object):\n' |
| 438 ' def a_func(self):\n pass\n') |
| 439 self._inline2(self.mod, self.mod.read().rindex('a_func') + 1) |
| 440 self.assertEquals('class A(object):\n pass\n', |
| 441 self.mod.read()) |
| 442 |
| 443 def test_adding_needed_imports_in_the_dest_module(self): |
| 444 self.mod.write('import sys\n\ndef ver():\n print(sys.version)\n') |
| 445 self.mod2.write('import mod\n\nmod.ver()') |
| 446 self._inline2(self.mod, self.mod.read().index('ver') + 1) |
| 447 self.assertEquals('import mod\nimport sys\n\nprint(sys.version)\n', |
| 448 self.mod2.read()) |
| 449 |
| 450 def test_adding_needed_imports_in_the_dest_module_removing_selfs(self): |
| 451 self.mod.write('import mod2\n\ndef f():\n print(mod2.var)\n') |
| 452 self.mod2.write('import mod\n\nvar = 1\nmod.f()\n') |
| 453 self._inline2(self.mod, self.mod.read().index('f(') + 1) |
| 454 self.assertEquals('import mod\n\nvar = 1\nprint(var)\n', |
| 455 self.mod2.read()) |
| 456 |
| 457 def test_handling_relative_imports_when_inlining(self): |
| 458 pkg = testutils.create_package(self.project, 'pkg') |
| 459 mod3 = testutils.create_module(self.project, 'mod3', pkg) |
| 460 mod4 = testutils.create_module(self.project, 'mod4', pkg) |
| 461 mod4.write('var = 1\n') |
| 462 mod3.write('from . import mod4\n\ndef f():\n print(mod4.var)\n') |
| 463 self.mod.write('import pkg.mod3\n\npkg.mod3.f()\n') |
| 464 self._inline2(self.mod, self.mod.read().index('f(') + 1) |
| 465 # Cannot determine the exact import |
| 466 self.assertTrue('\n\nprint(mod4.var)\n' in self.mod.read()) |
| 467 |
| 468 def test_adding_needed_imports_for_elements_in_source(self): |
| 469 self.mod.write('def f1():\n return f2()\ndef f2():\n return 1\n') |
| 470 self.mod2.write('import mod\n\nprint(mod.f1())\n') |
| 471 self._inline2(self.mod, self.mod.read().index('f1') + 1) |
| 472 self.assertEquals('import mod\nfrom mod import f2\n\nprint(f2())\n', |
| 473 self.mod2.read()) |
| 474 |
| 475 def test_relative_imports_and_changing_inlining_body(self): |
| 476 pkg = testutils.create_package(self.project, 'pkg') |
| 477 mod3 = testutils.create_module(self.project, 'mod3', pkg) |
| 478 mod4 = testutils.create_module(self.project, 'mod4', pkg) |
| 479 mod4.write('var = 1\n') |
| 480 mod3.write('import mod4\n\ndef f():\n print(mod4.var)\n') |
| 481 self.mod.write('import pkg.mod3\n\npkg.mod3.f()\n') |
| 482 self._inline2(self.mod, self.mod.read().index('f(') + 1) |
| 483 self.assertEquals( |
| 484 'import pkg.mod3\nimport pkg.mod4\n\nprint(pkg.mod4.var)\n', |
| 485 self.mod.read()) |
| 486 |
| 487 def test_inlining_with_different_returns(self): |
| 488 self.mod.write('def f(p):\n return p\n' |
| 489 'print(f(1))\nprint(f(2))\nprint(f(1))\n') |
| 490 self._inline2(self.mod, self.mod.read().index('f(') + 1) |
| 491 self.assertEquals('print(1)\nprint(2)\nprint(1)\n', |
| 492 self.mod.read()) |
| 493 |
| 494 def test_not_removing_definition_for_variables(self): |
| 495 code = 'a_var = 10\nanother_var = a_var\n' |
| 496 refactored = self._inline(code, code.index('a_var') + 1, |
| 497 remove=False) |
| 498 self.assertEquals('a_var = 10\nanother_var = 10\n', refactored) |
| 499 |
| 500 def test_not_removing_definition_for_methods(self): |
| 501 code = 'def func():\n print(1)\n\nfunc()\n' |
| 502 refactored = self._inline(code, code.index('func') + 1, |
| 503 remove=False) |
| 504 self.assertEquals('def func():\n print(1)\n\nprint(1)\n', |
| 505 refactored) |
| 506 |
| 507 def test_only_current_for_methods(self): |
| 508 code = 'def func():\n print(1)\n\nfunc()\nfunc()\n' |
| 509 refactored = self._inline(code, code.rindex('func') + 1, |
| 510 remove=False, only_current=True) |
| 511 self.assertEquals('def func():\n print(1)\n\nfunc()\nprint(1)\n', |
| 512 refactored) |
| 513 |
| 514 def test_only_current_for_variables(self): |
| 515 code = 'one = 1\n\na = one\nb = one\n' |
| 516 refactored = self._inline(code, code.rindex('one') + 1, |
| 517 remove=False, only_current=True) |
| 518 self.assertEquals('one = 1\n\na = one\nb = 1\n', refactored) |
| 519 |
| 520 def test_inlining_one_line_functions(self): |
| 521 code = 'def f(): return 1\nvar = f()\n' |
| 522 refactored = self._inline(code, code.rindex('f')) |
| 523 self.assertEquals('var = 1\n', refactored) |
| 524 |
| 525 def test_inlining_one_line_functions_with_breaks(self): |
| 526 code = 'def f(\np): return p\nvar = f(1)\n' |
| 527 refactored = self._inline(code, code.rindex('f')) |
| 528 self.assertEquals('var = 1\n', refactored) |
| 529 |
| 530 def test_inlining_one_line_functions_with_breaks2(self): |
| 531 code = 'def f(\n): return 1\nvar = f()\n' |
| 532 refactored = self._inline(code, code.rindex('f')) |
| 533 self.assertEquals('var = 1\n', refactored) |
| 534 |
| 535 def test_resources_parameter(self): |
| 536 self.mod.write('def a_func():\n print(1)\n') |
| 537 mod1 = testutils.create_module(self.project, 'mod1') |
| 538 mod1.write('import mod\nmod.a_func()\n') |
| 539 self._inline2(self.mod, self.mod.read().index('a_func'), |
| 540 resources=[self.mod]) |
| 541 self.assertEquals('', self.mod.read()) |
| 542 self.assertEquals('import mod\nmod.a_func()\n', mod1.read()) |
| 543 |
| 544 def test_inlining_parameters(self): |
| 545 code = 'def f(p=1):\n pass\nf()\n' |
| 546 result = self._inline(code, code.index('p')) |
| 547 self.assertEquals('def f(p=1):\n pass\nf(1)\n', result) |
| 548 |
| 549 def test_inlining_function_with_line_breaks_in_args(self): |
| 550 code = 'def f(p): return p\nvar = f(1 +\n1)\n' |
| 551 refactored = self._inline(code, code.rindex('f')) |
| 552 self.assertEquals('var = 1 + 1\n', refactored) |
| 553 |
| 554 def test_inlining_variables_before_comparison(self): |
| 555 code = 'start = 1\nprint(start <= 2)\n' |
| 556 refactored = self._inline(code, code.index('start')) |
| 557 self.assertEquals('print(1 <= 2)\n', refactored) |
| 558 |
| 559 def test_inlining_variables_in_other_modules(self): |
| 560 self.mod.write('myvar = 1\n') |
| 561 self.mod2.write('import mod\nprint(mod.myvar)\n') |
| 562 self._inline2(self.mod, 2) |
| 563 self.assertEquals('import mod\nprint(1)\n', self.mod2.read()) |
| 564 |
| 565 def test_inlining_variables_and_back_importing(self): |
| 566 self.mod.write('mainvar = 1\nmyvar = mainvar\n') |
| 567 self.mod2.write('import mod\nprint(mod.myvar)\n') |
| 568 self._inline2(self.mod, self.mod.read().index('myvar')) |
| 569 expected = 'import mod\n' \ |
| 570 'from mod import mainvar\n' \ |
| 571 'print(mainvar)\n' |
| 572 self.assertEquals(expected, self.mod2.read()) |
| 573 |
| 574 def test_inlining_variables_and_importing_used_imports(self): |
| 575 self.mod.write('import sys\nmyvar = sys.argv\n') |
| 576 self.mod2.write('import mod\nprint(mod.myvar)\n') |
| 577 self._inline2(self.mod, self.mod.read().index('myvar')) |
| 578 expected = 'import mod\n' \ |
| 579 'import sys\n' \ |
| 580 'print(sys.argv)\n' |
| 581 self.assertEquals(expected, self.mod2.read()) |
| 582 |
| 583 def test_inlining_variables_and_removing_old_froms(self): |
| 584 self.mod.write('var = 1\n') |
| 585 self.mod2.write('from mod import var\nprint(var)\n') |
| 586 self._inline2(self.mod2, self.mod2.read().rindex('var')) |
| 587 self.assertEquals('print(1)\n', self.mod2.read()) |
| 588 |
| 589 def test_inlining_method_and_removing_old_froms(self): |
| 590 self.mod.write('def f(): return 1\n') |
| 591 self.mod2.write('from mod import f\nprint(f())\n') |
| 592 self._inline2(self.mod2, self.mod2.read().rindex('f')) |
| 593 self.assertEquals('print(1)\n', self.mod2.read()) |
| 594 |
| 595 def test_inlining_functions_in_other_modules_and_only_current(self): |
| 596 code1 = 'def f():\n' \ |
| 597 ' return 1\n' \ |
| 598 'print(f())\n' |
| 599 code2 = 'import mod\n' \ |
| 600 'print(mod.f())\n' \ |
| 601 'print(mod.f())\n' |
| 602 self.mod.write(code1) |
| 603 self.mod2.write(code2) |
| 604 self._inline2(self.mod2, self.mod2.read().rindex('f'), |
| 605 remove=False, only_current=True) |
| 606 expected2 = 'import mod\n' \ |
| 607 'print(mod.f())\n' \ |
| 608 'print(1)\n' |
| 609 self.assertEquals(code1, self.mod.read()) |
| 610 self.assertEquals(expected2, self.mod2.read()) |
| 611 |
| 612 def test_inlining_variables_in_other_modules_and_only_current(self): |
| 613 code1 = 'var = 1\n' \ |
| 614 'print(var)\n' |
| 615 code2 = 'import mod\n' \ |
| 616 'print(mod.var)\n' \ |
| 617 'print(mod.var)\n' |
| 618 self.mod.write(code1) |
| 619 self.mod2.write(code2) |
| 620 self._inline2(self.mod2, self.mod2.read().rindex('var'), |
| 621 remove=False, only_current=True) |
| 622 expected2 = 'import mod\n' \ |
| 623 'print(mod.var)\n' \ |
| 624 'print(1)\n' |
| 625 self.assertEquals(code1, self.mod.read()) |
| 626 self.assertEquals(expected2, self.mod2.read()) |
| 627 |
| 628 def test_inlining_does_not_change_string_constants(self): |
| 629 code = 'var = 1\n' \ |
| 630 'print("var\\\n' \ |
| 631 '")\n' |
| 632 expected = 'var = 1\n' \ |
| 633 'print("var\\\n' \ |
| 634 '")\n' |
| 635 refactored = self._inline(code, code.rindex('var'), |
| 636 remove=False, only_current=True, docs=False) |
| 637 self.assertEquals(expected, refactored) |
| 638 |
| 639 def test_inlining_does_change_string_constants_if_docs_is_set(self): |
| 640 code = 'var = 1\n' \ |
| 641 'print("var\\\n' \ |
| 642 '")\n' |
| 643 expected = 'var = 1\n' \ |
| 644 'print("1\\\n' \ |
| 645 '")\n' |
| 646 refactored = self._inline(code, code.rindex('var'), |
| 647 remove=False, only_current=True, docs=True) |
| 648 self.assertEquals(expected, refactored) |
| 649 |
| 650 |
| 651 def suite(): |
| 652 result = unittest.TestSuite() |
| 653 result.addTests(unittest.makeSuite(InlineTest)) |
| 654 return result |
| 655 |
| 656 |
| 657 if __name__ == '__main__': |
| 658 unittest.main() |
OLD | NEW |