OLD | NEW |
(Empty) | |
| 1 import unittest |
| 2 |
| 3 from rope.refactor import similarfinder |
| 4 from ropetest import testutils |
| 5 |
| 6 |
| 7 class SimilarFinderTest(unittest.TestCase): |
| 8 |
| 9 def setUp(self): |
| 10 super(SimilarFinderTest, self).setUp() |
| 11 self.project = testutils.sample_project() |
| 12 self.mod = testutils.create_module(self.project, 'mod') |
| 13 |
| 14 def tearDown(self): |
| 15 testutils.remove_project(self.project) |
| 16 super(SimilarFinderTest, self).tearDown() |
| 17 |
| 18 def _create_finder(self, source, **kwds): |
| 19 self.mod.write(source) |
| 20 pymodule = self.project.get_pymodule(self.mod) |
| 21 return similarfinder.SimilarFinder(pymodule, **kwds) |
| 22 |
| 23 def test_trivial_case(self): |
| 24 finder = self._create_finder('') |
| 25 self.assertEquals([], list(finder.get_match_regions('10'))) |
| 26 |
| 27 def test_constant_integer(self): |
| 28 source = 'a = 10\n' |
| 29 finder = self._create_finder(source) |
| 30 result = [(source.index('10'), source.index('10') + 2)] |
| 31 self.assertEquals(result, list(finder.get_match_regions('10'))) |
| 32 |
| 33 def test_simple_addition(self): |
| 34 source = 'a = 1 + 2\n' |
| 35 finder = self._create_finder(source) |
| 36 result = [(source.index('1'), source.index('2') + 1)] |
| 37 self.assertEquals(result, list(finder.get_match_regions('1 + 2'))) |
| 38 |
| 39 def test_simple_addition2(self): |
| 40 source = 'a = 1 +2\n' |
| 41 finder = self._create_finder(source) |
| 42 result = [(source.index('1'), source.index('2') + 1)] |
| 43 self.assertEquals(result, list(finder.get_match_regions('1 + 2'))) |
| 44 |
| 45 def test_simple_assign_statements(self): |
| 46 source = 'a = 1 + 2\n' |
| 47 finder = self._create_finder(source) |
| 48 self.assertEquals([(0, len(source) - 1)], |
| 49 list(finder.get_match_regions('a = 1 + 2'))) |
| 50 |
| 51 def test_simple_multiline_statements(self): |
| 52 source = 'a = 1\nb = 2\n' |
| 53 finder = self._create_finder(source) |
| 54 self.assertEquals([(0, len(source) - 1)], |
| 55 list(finder.get_match_regions('a = 1\nb = 2'))) |
| 56 |
| 57 def test_multiple_matches(self): |
| 58 source = 'a = 1 + 1\n' |
| 59 finder = self._create_finder(source) |
| 60 result = list(finder.get_match_regions('1')) |
| 61 self.assertEquals(2, len(result)) |
| 62 start1 = source.index('1') |
| 63 self.assertEquals((start1, start1 + 1), result[0]) |
| 64 start2 = source.rindex('1') |
| 65 self.assertEquals((start2, start2 + 1), result[1]) |
| 66 |
| 67 def test_multiple_matches2(self): |
| 68 source = 'a = 1\nb = 2\n\na = 1\nb = 2\n' |
| 69 finder = self._create_finder(source) |
| 70 self.assertEquals( |
| 71 2, len(list(finder.get_match_regions('a = 1\nb = 2')))) |
| 72 |
| 73 def test_restricting_the_region_to_search(self): |
| 74 source = '1\n\n1\n' |
| 75 finder = self._create_finder(source) |
| 76 result = list(finder.get_match_regions('1', start=2)) |
| 77 start = source.rfind('1') |
| 78 self.assertEquals([(start, start + 1)], result) |
| 79 |
| 80 def test_matching_basic_patterns(self): |
| 81 source = 'b = a\n' |
| 82 finder = self._create_finder(source) |
| 83 result = list(finder.get_match_regions('${a}', args={'a': 'exact'})) |
| 84 start = source.rfind('a') |
| 85 self.assertEquals([(start, start + 1)], result) |
| 86 |
| 87 def test_match_get_ast(self): |
| 88 source = 'b = a\n' |
| 89 finder = self._create_finder(source) |
| 90 result = list(finder.get_matches('${a}', args={'a': 'exact'})) |
| 91 self.assertEquals('a', result[0].get_ast('a').id) |
| 92 |
| 93 def test_match_get_ast_for_statements(self): |
| 94 source = 'b = a\n' |
| 95 finder = self._create_finder(source) |
| 96 result = list(finder.get_matches('b = ${a}')) |
| 97 self.assertEquals('a', result[0].get_ast('a').id) |
| 98 |
| 99 def test_matching_multiple_patterns(self): |
| 100 source = 'c = a + b\n' |
| 101 finder = self._create_finder(source) |
| 102 result = list(finder.get_matches('${a} + ${b}')) |
| 103 self.assertEquals('a', result[0].get_ast('a').id) |
| 104 self.assertEquals('b', result[0].get_ast('b').id) |
| 105 |
| 106 def test_matching_any_patterns(self): |
| 107 source = 'b = a\n' |
| 108 finder = self._create_finder(source) |
| 109 result = list(finder.get_matches('b = ${x}')) |
| 110 self.assertEquals('a', result[0].get_ast('x').id) |
| 111 |
| 112 def test_matching_any_patterns_repeating(self): |
| 113 source = 'b = 1 + 1\n' |
| 114 finder = self._create_finder(source) |
| 115 result = list(finder.get_matches('b = ${x} + ${x}')) |
| 116 self.assertEquals(1, result[0].get_ast('x').n) |
| 117 |
| 118 def test_matching_any_patterns_not_matching_different_nodes(self): |
| 119 source = 'b = 1 + 2\n' |
| 120 finder = self._create_finder(source) |
| 121 result = list(finder.get_matches('b = ${x} + ${x}')) |
| 122 self.assertEquals(0, len(result)) |
| 123 |
| 124 def test_matching_normal_names_and_assname(self): |
| 125 source = 'a = 1\n' |
| 126 finder = self._create_finder(source) |
| 127 result = list(finder.get_matches('${a} = 1')) |
| 128 self.assertEquals('a', result[0].get_ast('a').id) |
| 129 |
| 130 def test_matching_normal_names_and_assname2(self): |
| 131 source = 'a = 1\n' |
| 132 finder = self._create_finder(source) |
| 133 result = list(finder.get_matches('${a}', args={'a': 'exact'})) |
| 134 self.assertEquals(1, len(result)) |
| 135 |
| 136 def test_matching_normal_names_and_attributes(self): |
| 137 source = 'x.a = 1\n' |
| 138 finder = self._create_finder(source) |
| 139 result = list(finder.get_matches('${a} = 1', args={'a': 'exact'})) |
| 140 self.assertEquals(0, len(result)) |
| 141 |
| 142 def test_functions_not_matching_when_only_first_parameters(self): |
| 143 source = 'f(1, 2)\n' |
| 144 finder = self._create_finder(source) |
| 145 self.assertEquals(0, len(list(finder.get_matches('f(1)')))) |
| 146 |
| 147 def test_matching_nested_try_finally(self): |
| 148 source = 'if 1:\n try:\n pass\n except:\n pass\n' |
| 149 pattern = 'try:\n pass\nexcept:\n pass\n' |
| 150 finder = self._create_finder(source) |
| 151 self.assertEquals(1, len(list(finder.get_matches(pattern)))) |
| 152 |
| 153 def test_matching_dicts_inside_functions(self): |
| 154 source = 'def f(p):\n d = {1: p.x}\n' |
| 155 pattern = '{1: ${a}.x}' |
| 156 finder = self._create_finder(source) |
| 157 self.assertEquals(1, len(list(finder.get_matches(pattern)))) |
| 158 |
| 159 |
| 160 class CheckingFinderTest(unittest.TestCase): |
| 161 |
| 162 def setUp(self): |
| 163 super(CheckingFinderTest, self).setUp() |
| 164 self.project = testutils.sample_project() |
| 165 self.mod1 = testutils.create_module(self.project, 'mod1') |
| 166 |
| 167 def tearDown(self): |
| 168 testutils.remove_project(self.project) |
| 169 super(CheckingFinderTest, self).tearDown() |
| 170 |
| 171 def test_trivial_case(self): |
| 172 self.mod1.write('') |
| 173 pymodule = self.project.get_pymodule(self.mod1) |
| 174 finder = similarfinder.SimilarFinder(pymodule) |
| 175 self.assertEquals([], list(finder.get_matches('10', {}))) |
| 176 |
| 177 def test_simple_finding(self): |
| 178 self.mod1.write('class A(object):\n pass\na = A()\n') |
| 179 pymodule = self.project.get_pymodule(self.mod1) |
| 180 finder = similarfinder.SimilarFinder(pymodule) |
| 181 result = list(finder.get_matches('${anything} = ${A}()', {})) |
| 182 self.assertEquals(1, len(result)) |
| 183 |
| 184 def test_not_matching_when_the_name_does_not_match(self): |
| 185 self.mod1.write('class A(object):\n pass\na = list()\n') |
| 186 pymodule = self.project.get_pymodule(self.mod1) |
| 187 finder = similarfinder.SimilarFinder(pymodule) |
| 188 result = list(finder.get_matches('${anything} = ${C}()', |
| 189 {'C': 'name=mod1.A'})) |
| 190 self.assertEquals(0, len(result)) |
| 191 |
| 192 def test_not_matching_unknowns_finding(self): |
| 193 self.mod1.write('class A(object):\n pass\na = unknown()\n') |
| 194 pymodule = self.project.get_pymodule(self.mod1) |
| 195 finder = similarfinder.SimilarFinder(pymodule) |
| 196 result = list(finder.get_matches('${anything} = ${C}()', |
| 197 {'C': 'name=mod1.A'})) |
| 198 self.assertEquals(0, len(result)) |
| 199 |
| 200 def test_finding_and_matching_pyobjects(self): |
| 201 source = 'class A(object):\n pass\nNewA = A\na = NewA()\n' |
| 202 self.mod1.write(source) |
| 203 pymodule = self.project.get_pymodule(self.mod1) |
| 204 finder = similarfinder.SimilarFinder(pymodule) |
| 205 result = list(finder.get_matches('${anything} = ${A}()', |
| 206 {'A': 'object=mod1.A'})) |
| 207 self.assertEquals(1, len(result)) |
| 208 start = source.rindex('a =') |
| 209 self.assertEquals((start, len(source) - 1), result[0].get_region()) |
| 210 |
| 211 def test_finding_and_matching_types(self): |
| 212 source = 'class A(object):\n def f(self):\n pass\n' \ |
| 213 'a = A()\nb = a.f()\n' |
| 214 self.mod1.write(source) |
| 215 pymodule = self.project.get_pymodule(self.mod1) |
| 216 finder = similarfinder.SimilarFinder(pymodule) |
| 217 result = list(finder.get_matches('${anything} = ${inst}.f()', |
| 218 {'inst': 'type=mod1.A'})) |
| 219 self.assertEquals(1, len(result)) |
| 220 start = source.rindex('b') |
| 221 self.assertEquals((start, len(source) - 1), result[0].get_region()) |
| 222 |
| 223 def test_checking_the_type_of_an_ass_name_node(self): |
| 224 self.mod1.write('class A(object):\n pass\nan_a = A()\n') |
| 225 pymodule = self.project.get_pymodule(self.mod1) |
| 226 finder = similarfinder.SimilarFinder(pymodule) |
| 227 result = list(finder.get_matches('${a} = ${assigned}', |
| 228 {'a': 'type=mod1.A'})) |
| 229 self.assertEquals(1, len(result)) |
| 230 |
| 231 def test_checking_instance_of_an_ass_name_node(self): |
| 232 self.mod1.write('class A(object):\n pass\n' |
| 233 'class B(A):\n pass\nb = B()\n') |
| 234 pymodule = self.project.get_pymodule(self.mod1) |
| 235 finder = similarfinder.SimilarFinder(pymodule) |
| 236 result = list(finder.get_matches('${a} = ${assigned}', |
| 237 {'a': 'instance=mod1.A'})) |
| 238 self.assertEquals(1, len(result)) |
| 239 |
| 240 def test_checking_equality_of_imported_pynames(self): |
| 241 mod2 = testutils.create_module(self.project, 'mod2') |
| 242 mod2.write('class A(object):\n pass\n') |
| 243 self.mod1.write('from mod2 import A\nan_a = A()\n') |
| 244 pymod1 = self.project.get_pymodule(self.mod1) |
| 245 finder = similarfinder.SimilarFinder(pymod1) |
| 246 result = list(finder.get_matches('${a_class}()', |
| 247 {'a_class': 'name=mod2.A'})) |
| 248 self.assertEquals(1, len(result)) |
| 249 |
| 250 |
| 251 class TemplateTest(unittest.TestCase): |
| 252 |
| 253 def test_simple_templates(self): |
| 254 template = similarfinder.CodeTemplate('${a}\n') |
| 255 self.assertEquals(set(['a']), set(template.get_names())) |
| 256 |
| 257 def test_ignoring_matches_in_comments(self): |
| 258 template = similarfinder.CodeTemplate('#${a}\n') |
| 259 self.assertEquals([], template.get_names()) |
| 260 |
| 261 def test_ignoring_matches_in_strings(self): |
| 262 template = similarfinder.CodeTemplate("'${a}'\n") |
| 263 self.assertEquals([], template.get_names()) |
| 264 |
| 265 def test_simple_substitution(self): |
| 266 template = similarfinder.CodeTemplate('${a}\n') |
| 267 self.assertEquals('b\n', template.substitute({'a': 'b'})) |
| 268 |
| 269 def test_substituting_multiple_names(self): |
| 270 template = similarfinder.CodeTemplate('${a}, ${b}\n') |
| 271 self.assertEquals('1, 2\n', template.substitute({'a': '1', 'b': '2'})) |
| 272 |
| 273 |
| 274 def suite(): |
| 275 result = unittest.TestSuite() |
| 276 result.addTests(unittest.makeSuite(SimilarFinderTest)) |
| 277 result.addTests(unittest.makeSuite(CheckingFinderTest)) |
| 278 result.addTests(unittest.makeSuite(TemplateTest)) |
| 279 return result |
| 280 |
| 281 if __name__ == '__main__': |
| 282 unittest.main() |
OLD | NEW |