renametest.py :  » Development » Rope » rope-0.9.2 » ropetest » refactor » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Development » Rope 
Rope » rope 0.9.2 » ropetest » refactor » renametest.py
import sys
import unittest

import rope.base.codeanalyze
import rope.refactor.occurrences
from rope.refactor import rename
from rope.refactor.rename import Rename
from ropetest import testutils


class RenameRefactoringTest(unittest.TestCase):

    def setUp(self):
        super(RenameRefactoringTest, self).setUp()
        self.project = testutils.sample_project()
        self.pycore = self.project.pycore

    def tearDown(self):
        testutils.remove_project(self.project)
        super(RenameRefactoringTest, self).tearDown()

    def _local_rename(self, source_code, offset, new_name):
        testmod = testutils.create_module(self.project, 'testmod')
        testmod.write(source_code)
        changes = Rename(self.project, testmod, offset).\
            get_changes(new_name, resources=[testmod])
        self.project.do(changes)
        return testmod.read()

    def _rename(self, resource, offset, new_name, **kwds):
        changes = Rename(self.project, resource, offset).\
                  get_changes(new_name, **kwds)
        self.project.do(changes)

    def test_simple_global_variable_renaming(self):
        refactored = self._local_rename('a_var = 20\n', 2, 'new_var')
        self.assertEquals('new_var = 20\n', refactored)

    def test_variable_renaming_only_in_its_scope(self):
        refactored = self._local_rename(
            'a_var = 20\ndef a_func():\n    a_var = 10\n', 32, 'new_var')
        self.assertEquals('a_var = 20\ndef a_func():\n    new_var = 10\n',
                          refactored)

    def test_not_renaming_dot_name(self):
        refactored = self._local_rename(
            "replace = True\n'aaa'.replace('a', 'b')\n", 1, 'new_var')
        self.assertEquals("new_var = True\n'aaa'.replace('a', 'b')\n",
                          refactored)

    def test_renaming_multiple_names_in_the_same_line(self):
        refactored = self._local_rename(
            'a_var = 10\na_var = 10 + a_var / 2\n', 2, 'new_var')
        self.assertEquals('new_var = 10\nnew_var = 10 + new_var / 2\n',
                          refactored)

    def test_renaming_names_when_getting_some_attribute(self):
        refactored = self._local_rename(
            "a_var = 'a b c'\na_var.split('\\n')\n", 2, 'new_var')
        self.assertEquals("new_var = 'a b c'\nnew_var.split('\\n')\n",
                          refactored)

    def test_renaming_names_when_getting_some_attribute2(self):
        refactored = self._local_rename(
            "a_var = 'a b c'\na_var.split('\\n')\n", 20, 'new_var')
        self.assertEquals("new_var = 'a b c'\nnew_var.split('\\n')\n",
                          refactored)

    def test_renaming_function_parameters1(self):
        refactored = self._local_rename(
            "def f(a_param):\n    print(a_param)\n", 8, 'new_param')
        self.assertEquals("def f(new_param):\n    print(new_param)\n",
                          refactored)

    def test_renaming_function_parameters2(self):
        refactored = self._local_rename(
            "def f(a_param):\n    print(a_param)\n", 30, 'new_param')
        self.assertEquals("def f(new_param):\n    print(new_param)\n",
                          refactored)

    def test_renaming_occurrences_inside_functions(self):
        code = 'def a_func(p1):\n    a = p1\na_func(1)\n'
        refactored = self._local_rename(code, code.index('p1') + 1, 'new_param')
        self.assertEquals(
            'def a_func(new_param):\n    a = new_param\na_func(1)\n', 
            refactored)

    def test_renaming_arguments_for_normal_args_changing_calls(self):
        code = 'def a_func(p1=None, p2=None):\n    pass\na_func(p2=1)\n'
        refactored = self._local_rename(code, code.index('p2') + 1, 'p3')
        self.assertEquals(
            'def a_func(p1=None, p3=None):\n    pass\na_func(p3=1)\n',
            refactored)

    def test_renaming_function_parameters_of_class_init(self):
        code = 'class A(object):\n    def __init__(self, a_param):\n        pass\n' \
               'a_var = A(a_param=1)\n'
        refactored = self._local_rename(code, code.index('a_param') + 1, 'new_param')
        expected = 'class A(object):\n    def __init__(self, new_param):\n        pass\n' \
                   'a_var = A(new_param=1)\n'
        self.assertEquals(expected, refactored)

    def test_renaming_functions_parameters_and_occurances_in_other_modules(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod1.write('def a_func(a_param):\n    print(a_param)\n')
        mod2.write('from mod1 import a_func\na_func(a_param=10)\n')
        self._rename(mod1, mod1.read().index('a_param') + 1, 'new_param')
        self.assertEquals('def a_func(new_param):\n    print(new_param)\n',
                          mod1.read())
        self.assertEquals('from mod1 import a_func\na_func(new_param=10)\n',
                          mod2.read())

    def test_renaming_with_backslash_continued_names(self):
        refactored = self._local_rename(
            "replace = True\n'ali'.\\\nreplace\n", 2, 'is_replace')
        self.assertEquals("is_replace = True\n'ali'.\\\nreplace\n",
                          refactored)

    def test_not_renaming_string_contents(self):
        refactored = self._local_rename("a_var = 20\na_string='a_var'\n",
                                        2, 'new_var')
        self.assertEquals("new_var = 20\na_string='a_var'\n",
                          refactored)

    def test_not_renaming_comment_contents(self):
        refactored = self._local_rename("a_var = 20\n# a_var\n",
                                        2, 'new_var')
        self.assertEquals("new_var = 20\n# a_var\n", refactored)

    def test_renaming_all_occurances_in_containing_scope(self):
        code = 'if True:\n    a_var = 1\nelse:\n    a_var = 20\n'
        refactored = self._local_rename(code, 16, 'new_var')
        self.assertEquals(
            'if True:\n    new_var = 1\nelse:\n    new_var = 20\n', refactored)

    def test_renaming_a_variable_with_arguement_name(self):
        code = 'a_var = 10\ndef a_func(a_var):\n    print(a_var)\n'
        refactored = self._local_rename(code, 1, 'new_var')
        self.assertEquals(
            'new_var = 10\ndef a_func(a_var):\n    print(a_var)\n', refactored)

    def test_renaming_an_arguement_with_variable_name(self):
        code = 'a_var = 10\ndef a_func(a_var):\n    print(a_var)\n'
        refactored = self._local_rename(code, len(code) - 3, 'new_var')
        self.assertEquals(
            'a_var = 10\ndef a_func(new_var):\n    print(new_var)\n',
            refactored)

    def test_renaming_function_with_local_variable_name(self):
        code = 'def a_func():\n    a_func=20\na_func()'
        refactored = self._local_rename(code, len(code) - 3, 'new_func')
        self.assertEquals('def new_func():\n    a_func=20\nnew_func()',
                          refactored)

    def test_renaming_functions(self):
        code = 'def a_func():\n    pass\na_func()\n'
        refactored = self._local_rename(code, len(code) - 5, 'new_func')
        self.assertEquals('def new_func():\n    pass\nnew_func()\n',
                          refactored)

    def test_renaming_functions_across_modules(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write('def a_func():\n    pass\na_func()\n')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod2.write('import mod1\nmod1.a_func()\n')
        self._rename(mod1, len(mod1.read()) - 5, 'new_func')
        self.assertEquals('def new_func():\n    pass\nnew_func()\n',
                          mod1.read())
        self.assertEquals('import mod1\nmod1.new_func()\n', mod2.read())

    def test_renaming_functions_across_modules_from_import(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write('def a_func():\n    pass\na_func()\n')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod2.write('from mod1 import a_func\na_func()\n')
        self._rename(mod1, len(mod1.read()) - 5, 'new_func')
        self.assertEquals('def new_func():\n    pass\nnew_func()\n',
                          mod1.read())
        self.assertEquals('from mod1 import new_func\nnew_func()\n',
                          mod2.read())

    def test_renaming_functions_from_another_module(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write('def a_func():\n    pass\na_func()\n')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod2.write('import mod1\nmod1.a_func()\n')
        self._rename(mod2, len(mod2.read()) - 5, 'new_func')
        self.assertEquals('def new_func():\n    pass\nnew_func()\n',
                          mod1.read())
        self.assertEquals('import mod1\nmod1.new_func()\n', mod2.read())

    def test_applying_all_changes_together(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write('import mod2\nmod2.a_func()\n')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod2.write('def a_func():\n    pass\na_func()\n')
        self._rename(mod2, len(mod2.read()) - 5, 'new_func')
        self.assertEquals('import mod2\nmod2.new_func()\n', mod1.read())
        self.assertEquals('def new_func():\n    pass\nnew_func()\n',
                          mod2.read())

    def test_renaming_modules(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write('def a_func():\n    pass\n')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod2.write('from mod1 import a_func\n')
        self._rename(mod2, mod2.read().index('mod1') + 1, 'newmod')
        self.assertTrue(not mod1.exists() and
                        self.pycore.find_module('newmod') is not None)
        self.assertEquals('from newmod import a_func\n', mod2.read())

    def test_renaming_packages(self):
        pkg = testutils.create_package(self.project, 'pkg')
        mod1 = testutils.create_module(self.project, 'mod1', pkg)
        mod1.write('def a_func():\n    pass\n')
        mod2 = testutils.create_module(self.project, 'mod2', pkg)
        mod2.write('from pkg.mod1 import a_func\n')
        self._rename(mod2, 6, 'newpkg')
        self.assertTrue(self.pycore.find_module('newpkg.mod1') is not None)
        new_mod2 = self.pycore.find_module('newpkg.mod2')
        self.assertEquals('from newpkg.mod1 import a_func\n', new_mod2.read())

    def test_module_dependencies(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write('class AClass(object):\n    pass\n')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod2.write('import mod1\na_var = mod1.AClass()\n')
        self.pycore.resource_to_pyobject(mod2).get_attributes()['mod1']
        mod1.write('def AClass():\n    return 0\n')

        self._rename(mod2, len(mod2.read()) - 3, 'a_func')
        self.assertEquals('def a_func():\n    return 0\n', mod1.read())
        self.assertEquals('import mod1\na_var = mod1.a_func()\n', mod2.read())

    def test_renaming_class_attributes(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write('class AClass(object):\n    def __init__(self):\n'
                   '        self.an_attr = 10\n')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod2.write('import mod1\na_var = mod1.AClass()\n'
                   'another_var = a_var.an_attr')

        self._rename(mod1, mod1.read().index('an_attr'), 'attr')
        self.assertEquals('class AClass(object):\n    def __init__(self):\n'
                          '        self.attr = 10\n', mod1.read())
        self.assertEquals(
            'import mod1\na_var = mod1.AClass()\nanother_var = a_var.attr',
            mod2.read())

    def test_renaming_class_attributes2(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write('class AClass(object):\n    def __init__(self):\n'
                   '        an_attr = 10\n        self.an_attr = 10\n')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod2.write('import mod1\na_var = mod1.AClass()\n'
                   'another_var = a_var.an_attr')

        self._rename(mod1, mod1.read().rindex('an_attr'), 'attr')
        self.assertEquals(
            'class AClass(object):\n    def __init__(self):\n'
            '        an_attr = 10\n        self.attr = 10\n', mod1.read())
        self.assertEquals(
            'import mod1\na_var = mod1.AClass()\nanother_var = a_var.attr',
            mod2.read())

    def test_renaming_methods_in_subclasses(self):
        mod = testutils.create_module(self.project, 'mod1')
        mod.write('class A(object):\n    def a_method(self):\n        pass\n'
                  'class B(A):\n    def a_method(self):\n        pass\n')

        self._rename(mod, mod.read().rindex('a_method') + 1, 'new_method',
                     in_hierarchy=True)
        self.assertEquals(
            'class A(object):\n    def new_method(self):\n        pass\n'
            'class B(A):\n    def new_method(self):\n        pass\n', mod.read())

    def test_renaming_methods_in_sibling_classes(self):
        mod = testutils.create_module(self.project, 'mod1')
        mod.write('class A(object):\n    def a_method(self):\n        pass\n'
                  'class B(A):\n    def a_method(self):\n        pass\n'
                  'class C(A):\n    def a_method(self):\n        pass\n')

        self._rename(mod, mod.read().rindex('a_method') + 1, 'new_method',
                     in_hierarchy=True)
        self.assertEquals(
            'class A(object):\n    def new_method(self):\n        pass\n'
            'class B(A):\n    def new_method(self):\n        pass\n'
            'class C(A):\n    def new_method(self):\n        pass\n', mod.read())

    def test_not_renaming_methods_in_hierarchies(self):
        mod = testutils.create_module(self.project, 'mod1')
        mod.write('class A(object):\n    def a_method(self):\n        pass\n'
                  'class B(A):\n    def a_method(self):\n        pass\n')

        self._rename(mod, mod.read().rindex('a_method') + 1, 'new_method',
                     in_hierarchy=False)
        self.assertEquals(
            'class A(object):\n    def a_method(self):\n        pass\n'
            'class B(A):\n    def new_method(self):\n        pass\n', mod.read())

    def test_undoing_refactorings(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write('def a_func():\n    pass\na_func()\n')
        self._rename(mod1, len(mod1.read()) - 5, 'new_func')
        self.project.history.undo()
        self.assertEquals('def a_func():\n    pass\na_func()\n', mod1.read())

    def test_undoing_renaming_modules(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write('def a_func():\n    pass\n')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod2.write('from mod1 import a_func\n')
        self._rename(mod2, 6, 'newmod')
        self.project.history.undo()
        self.assertEquals('mod1.py', mod1.path)
        self.assertEquals('from mod1 import a_func\n', mod2.read())

    def test_rename_in_module_renaming_one_letter_names_for_expressions(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write('a = 10\nprint(1+a)\n')
        pymod = self.pycore.get_module('mod1')
        old_pyname = pymod['a']
        finder = rope.refactor.occurrences.create_finder(
            self.pycore, 'a', old_pyname)
        refactored = rename.rename_in_module(
            finder, 'new_var', pymodule=pymod, replace_primary=True)
        self.assertEquals('new_var = 10\nprint(1+new_var)\n', refactored)

    def test_renaming_for_loop_variable(self):
        code = 'for var in range(10):\n    print(var)\n'
        refactored = self._local_rename(code, code.find('var') + 1, 'new_var')
        self.assertEquals('for new_var in range(10):\n    print(new_var)\n',
                          refactored)

    def test_renaming_parameters(self):
        code = 'def a_func(param):\n    print(param)\na_func(param=hey)\n'
        refactored = self._local_rename(code, code.find('param') + 1,
                                        'new_param')
        self.assertEquals('def a_func(new_param):\n    print(new_param)\n'
                          'a_func(new_param=hey)\n', refactored)

    def test_renaming_assigned_parameters(self):
        code = 'def f(p):\n    p = p + 1\n    return p\nf(p=1)\n'
        refactored = self._local_rename(code, code.find('p'), 'arg')
        self.assertEquals('def f(arg):\n    arg = arg + 1\n'
                          '    return arg\nf(arg=1)\n', refactored)

    def test_renaming_parameters_not_renaming_others(self):
        code = 'def a_func(param):\n    print(param)\nparam=10\na_func(param)\n'
        refactored = self._local_rename(code, code.find('param') + 1, 'new_param')
        self.assertEquals('def a_func(new_param):\n    print(new_param)\n'
                          'param=10\na_func(param)\n', refactored)

    def test_renaming_parameters_not_renaming_others2(self):
        code = 'def a_func(param):\n    print(param)\nparam=10\na_func(param=param)'
        refactored = self._local_rename(code, code.find('param') + 1, 'new_param')
        self.assertEquals('def a_func(new_param):\n    print(new_param)\n'
                          'param=10\na_func(new_param=param)', refactored)

    def test_renaming_parameters_with_multiple_params(self):
        code = 'def a_func(param1, param2):\n    print(param1)\n'\
               'a_func(param1=1, param2=2)\n'
        refactored = self._local_rename(code, code.find('param1') + 1, 'new_param')
        self.assertEquals(
            'def a_func(new_param, param2):\n    print(new_param)\n'
            'a_func(new_param=1, param2=2)\n', refactored)

    def test_renaming_parameters_with_multiple_params2(self):
        code = 'def a_func(param1, param2):\n    print(param1)\n' \
               'a_func(param1=1, param2=2)\n'
        refactored = self._local_rename(code, code.rfind('param2') + 1,
                                        'new_param')
        self.assertEquals('def a_func(param1, new_param):\n    print(param1)\n'
                          'a_func(param1=1, new_param=2)\n', refactored)

    def test_renaming_parameters_on_calls(self):
        code = 'def a_func(param):\n    print(param)\na_func(param = hey)\n'
        refactored = self._local_rename(code, code.rfind('param') + 1,
                                        'new_param')
        self.assertEquals('def a_func(new_param):\n    print(new_param)\n'
                          'a_func(new_param = hey)\n', refactored)

    def test_renaming_parameters_spaces_before_call(self):
        code = 'def a_func(param):\n    print(param)\na_func  (param=hey)\n'
        refactored = self._local_rename(code, code.rfind('param') + 1,
                                        'new_param')
        self.assertEquals('def a_func(new_param):\n    print(new_param)\n'
                          'a_func  (new_param=hey)\n', refactored)

    def test_renaming_parameter_like_objects_after_keywords(self):
        code = 'def a_func(param):\n    print(param)\ndict(param=hey)\n'
        refactored = self._local_rename(code, code.find('param') + 1, 'new_param')
        self.assertEquals('def a_func(new_param):\n    print(new_param)\n'
                          'dict(param=hey)\n', refactored)

    def test_renaming_variables_in_init_dot_pys(self):
        pkg = testutils.create_package(self.project, 'pkg')
        init_dot_py = pkg.get_child('__init__.py')
        init_dot_py.write('a_var = 10\n')
        mod = testutils.create_module(self.project, 'mod')
        mod.write('import pkg\nprint(pkg.a_var)\n')
        self._rename(mod, mod.read().index('a_var') + 1, 'new_var')
        self.assertEquals('new_var = 10\n', init_dot_py.read())
        self.assertEquals('import pkg\nprint(pkg.new_var)\n', mod.read())

    def test_renaming_variables_in_init_dot_pys2(self):
        pkg = testutils.create_package(self.project, 'pkg')
        init_dot_py = pkg.get_child('__init__.py')
        init_dot_py.write('a_var = 10\n')
        mod = testutils.create_module(self.project, 'mod')
        mod.write('import pkg\nprint(pkg.a_var)\n')
        self._rename(init_dot_py,
                     init_dot_py.read().index('a_var') + 1, 'new_var')
        self.assertEquals('new_var = 10\n', init_dot_py.read())
        self.assertEquals('import pkg\nprint(pkg.new_var)\n', mod.read())

    def test_renaming_variables_in_init_dot_pys3(self):
        pkg = testutils.create_package(self.project, 'pkg')
        init_dot_py = pkg.get_child('__init__.py')
        init_dot_py.write('a_var = 10\n')
        mod = testutils.create_module(self.project, 'mod')
        mod.write('import pkg\nprint(pkg.a_var)\n')
        self._rename(mod, mod.read().index('a_var') + 1, 'new_var')
        self.assertEquals('new_var = 10\n', init_dot_py.read())
        self.assertEquals('import pkg\nprint(pkg.new_var)\n', mod.read())

    def test_renaming_resources_using_rename_module_refactoring(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod1.write('a_var = 1')
        mod2.write('import mod1\nmy_var = mod1.a_var\n')
        renamer = rename.Rename(self.project, mod1)
        renamer.get_changes('newmod').do()
        self.assertEquals('import newmod\nmy_var = newmod.a_var\n', mod2.read())

    def test_renaming_resources_using_rename_module_refactoring_for_packages(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        pkg = testutils.create_package(self.project, 'pkg')
        mod1.write('import pkg\nmy_pkg = pkg')
        renamer = rename.Rename(self.project, pkg)
        renamer.get_changes('newpkg').do()
        self.assertEquals('import newpkg\nmy_pkg = newpkg', mod1.read())

    def test_renaming_resources_using_rename_module_refactoring_for_init_dot_py(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        pkg = testutils.create_package(self.project, 'pkg')
        mod1.write('import pkg\nmy_pkg = pkg')
        renamer = rename.Rename(self.project, pkg.get_child('__init__.py'))
        renamer.get_changes('newpkg').do()
        self.assertEquals('import newpkg\nmy_pkg = newpkg', mod1.read())

    def test_renaming_global_variables(self):
        code = 'a_var = 1\ndef a_func():\n    global a_var\n    var = a_var\n'
        refactored = self._local_rename(code, code.index('a_var'), 'new_var')
        self.assertEquals(
            'new_var = 1\ndef a_func():\n    global new_var\n    var = new_var\n',
            refactored)

    def test_renaming_global_variables2(self):
        code = 'a_var = 1\ndef a_func():\n    global a_var\n    var = a_var\n'
        refactored = self._local_rename(code, code.rindex('a_var'), 'new_var')
        self.assertEquals(
            'new_var = 1\ndef a_func():\n    global new_var\n    var = new_var\n',
            refactored)

    def test_renaming_when_unsure(self):
        code = 'class C(object):\n    def a_func(self):\n        pass\n' \
               'def f(arg):\n    arg.a_func()\n'
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write(code)
        self._rename(mod1, code.index('a_func'),
                     'new_func', unsure=self._true)
        self.assertEquals(
            'class C(object):\n    def new_func(self):\n        pass\n' \
            'def f(arg):\n    arg.new_func()\n',
            mod1.read())

    def _true(self, *args):
        return True

    def test_renaming_when_unsure_with_confirmation(self):
        def confirm(occurrence):
            return False
        code = 'class C(object):\n    def a_func(self):\n        pass\n' \
               'def f(arg):\n    arg.a_func()\n'
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write(code)
        self._rename(mod1, code.index('a_func'), 'new_func', unsure=confirm)
        self.assertEquals(
            'class C(object):\n    def new_func(self):\n        pass\n' \
            'def f(arg):\n    arg.a_func()\n', mod1.read())

    def test_renaming_when_unsure_not_renaming_knowns(self):
        code = 'class C1(object):\n    def a_func(self):\n        pass\n' \
               'class C2(object):\n    def a_func(self):\n        pass\n' \
               'c1 = C1()\nc1.a_func()\nc2 = C2()\nc2.a_func()\n'
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write(code)
        self._rename(mod1, code.index('a_func'), 'new_func', unsure=self._true)
        self.assertEquals(
            'class C1(object):\n    def new_func(self):\n        pass\n' \
            'class C2(object):\n    def a_func(self):\n        pass\n' \
            'c1 = C1()\nc1.new_func()\nc2 = C2()\nc2.a_func()\n',
            mod1.read())

    def test_renaming_in_strings_and_comments(self):
        code = 'a_var = 1\n# a_var\n'
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write(code)
        self._rename(mod1, code.index('a_var'), 'new_var', docs=True)
        self.assertEquals('new_var = 1\n# new_var\n', mod1.read())

    def test_not_renaming_in_strings_and_comments_where_not_visible(self):
        code = 'def f():\n    a_var = 1\n# a_var\n'
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write(code)
        self._rename(mod1, code.index('a_var'), 'new_var', docs=True)
        self.assertEquals('def f():\n    new_var = 1\n# a_var\n', mod1.read())

    def test_not_renaming_all_text_occurrences_in_strings_and_comments(self):
        code = 'a_var = 1\n# a_vard _a_var\n'
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write(code)
        self._rename(mod1, code.index('a_var'), 'new_var', docs=True)
        self.assertEquals('new_var = 1\n# a_vard _a_var\n', mod1.read())

    def test_renaming_occurrences_in_overwritten_scopes(self):
        refactored = self._local_rename(
            'a_var = 20\ndef f():\n    print(a_var)\n'
            'def f():\n    print(a_var)\n', 2, 'new_var')
        self.assertEquals('new_var = 20\ndef f():\n    print(new_var)\n'
                          'def f():\n    print(new_var)\n', refactored)

    def test_renaming_occurrences_in_overwritten_scopes2(self):
        code = 'def f():\n    a_var = 1\n    print(a_var)\n' \
               'def f():\n    a_var = 1\n    print(a_var)\n'
        refactored = self._local_rename(code, code.index('a_var') + 1, 'new_var')
        self.assertEquals(code.replace('a_var', 'new_var', 2), refactored)

    def test_dos_line_ending_and_renaming(self):
        code = '\r\na = 1\r\n\r\nprint(2 + a + 2)\r\n'
        offset = code.replace('\r\n', '\n').rindex('a')
        refactored = self._local_rename(code, offset, 'b')
        self.assertEquals('\nb = 1\n\nprint(2 + b + 2)\n',
                          refactored.replace('\r\n', '\n'))

    def test_multi_byte_strs_and_renaming(self):
        s = u'{LATIN SMALL LETTER I WITH DIAERESIS}' * 4
        code = u'# -*- coding: utf-8 -*-\n# ' + s + \
                '\na = 1\nprint(2 + a + 2)\n'
        refactored = self._local_rename(code, code.rindex('a'), 'b')
        self.assertEquals(u'# -*- coding: utf-8 -*-\n# ' + s +
                          '\nb = 1\nprint(2 + b + 2)\n', refactored)

    def test_resources_parameter(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod1.write('def f():\n    pass\n')
        mod2.write('import mod1\nmod1.f()\n')
        self._rename(mod1, mod1.read().rindex('f'), 'g',
                     resources=[mod1])
        self.assertEquals('def g():\n    pass\n', mod1.read())
        self.assertEquals('import mod1\nmod1.f()\n', mod2.read())

    def test_resources_parameter_not_changing_defining_module(self):
        mod1 = testutils.create_module(self.project, 'mod1')
        mod2 = testutils.create_module(self.project, 'mod2')
        mod1.write('def f():\n    pass\n')
        mod2.write('import mod1\nmod1.f()\n')
        self._rename(mod1, mod1.read().rindex('f'), 'g',
                     resources=[mod2])
        self.assertEquals('def f():\n    pass\n', mod1.read())
        self.assertEquals('import mod1\nmod1.g()\n', mod2.read())

    # XXX: with variables should not leak
    @testutils.only_for('2.5')
    def xxx_test_with_statement_variables_should_not_leak(self):
        code = 'f = 1\nwith open("1.txt") as f:\n    print(f)\n'
        if sys.version_info < (2, 6, 0):
            code = 'from __future__ import with_statement\n' + code
        mod1 = testutils.create_module(self.project, 'mod1')
        mod1.write(code)
        self._rename(mod1, code.rindex('f'), 'file')
        expected = 'f = 1\nwith open("1.txt") as file:\n    print(file)\n'
        self.assertEquals(expected, mod1.read())


class ChangeOccurrencesTest(unittest.TestCase):

    def setUp(self):
        self.project = testutils.sample_project()
        self.mod = testutils.create_module(self.project, 'mod')

    def tearDown(self):
        testutils.remove_project(self.project)
        super(ChangeOccurrencesTest, self).tearDown()

    def test_simple_case(self):
        self.mod.write('a_var = 1\nprint(a_var)\n')
        changer = rename.ChangeOccurrences(self.project, self.mod,
                                           self.mod.read().index('a_var'))
        changer.get_changes('new_var').do()
        self.assertEquals('new_var = 1\nprint(new_var)\n', self.mod.read())

    def test_only_performing_inside_scopes(self):
        self.mod.write('a_var = 1\nnew_var = 2\ndef f():\n    print(a_var)\n')
        changer = rename.ChangeOccurrences(self.project, self.mod,
                                           self.mod.read().rindex('a_var'))
        changer.get_changes('new_var').do()
        self.assertEquals(
            'a_var = 1\nnew_var = 2\ndef f():\n    print(new_var)\n',
            self.mod.read())

    def test_only_performing_on_calls(self):
        self.mod.write('def f1():\n    pass\ndef f2():\n    pass\n'
                       'g = f1\na = f1()\n')
        changer = rename.ChangeOccurrences(self.project, self.mod,
                                           self.mod.read().rindex('f1'))
        changer.get_changes('f2', only_calls=True).do()
        self.assertEquals(
            'def f1():\n    pass\ndef f2():\n    pass\ng = f1\na = f2()\n',
            self.mod.read())

    def test_only_performing_on_reads(self):
        self.mod.write('a = 1\nb = 2\nprint(a)\n')
        changer = rename.ChangeOccurrences(self.project, self.mod,
                                           self.mod.read().rindex('a'))
        changer.get_changes('b', writes=False).do()
        self.assertEquals('a = 1\nb = 2\nprint(b)\n', self.mod.read())


class ImplicitInterfacesTest(unittest.TestCase):

    def setUp(self):
        super(ImplicitInterfacesTest, self).setUp()
        self.project = testutils.sample_project(validate_objectdb=True)
        self.pycore = self.project.pycore
        self.mod1 = testutils.create_module(self.project, 'mod1')
        self.mod2 = testutils.create_module(self.project, 'mod2')

    def tearDown(self):
        testutils.remove_project(self.project)
        super(ImplicitInterfacesTest, self).tearDown()

    def _rename(self, resource, offset, new_name, **kwds):
        changes = Rename(self.project, resource, offset).\
                  get_changes(new_name, **kwds)
        self.project.do(changes)

    def test_performing_rename_on_parameters(self):
        self.mod1.write('def f(arg):\n    arg.run()\n')
        self.mod2.write('import mod1\n\n\n'
                        'class A(object):\n    def run(self):\n        pass\n'
                        'class B(object):\n    def run(self):\n        pass\n'
                        'mod1.f(A())\nmod1.f(B())\n')
        self.pycore.analyze_module(self.mod2)
        self._rename(self.mod1, self.mod1.read().index('run'), 'newrun')
        self.assertEquals('def f(arg):\n    arg.newrun()\n', self.mod1.read())
        self.assertEquals(
            'import mod1\n\n\n'
            'class A(object):\n    def newrun(self):\n        pass\n'
            'class B(object):\n    def newrun(self):\n        pass\n'
            'mod1.f(A())\nmod1.f(B())\n', self.mod2.read())


def suite():
    result = unittest.TestSuite()
    result.addTests(unittest.makeSuite(RenameRefactoringTest))
    result.addTests(unittest.makeSuite(ChangeOccurrencesTest))
    result.addTests(unittest.makeSuite(ImplicitInterfacesTest))
    return result


if __name__ == '__main__':
    unittest.main()
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.