Index: tools/telemetry/third_party/rope/ropetest/refactor/similarfindertest.py |
diff --git a/tools/telemetry/third_party/rope/ropetest/refactor/similarfindertest.py b/tools/telemetry/third_party/rope/ropetest/refactor/similarfindertest.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..eed515ec101fef290f5c796b1d2497b2967f6eb9 |
--- /dev/null |
+++ b/tools/telemetry/third_party/rope/ropetest/refactor/similarfindertest.py |
@@ -0,0 +1,282 @@ |
+import unittest |
+ |
+from rope.refactor import similarfinder |
+from ropetest import testutils |
+ |
+ |
+class SimilarFinderTest(unittest.TestCase): |
+ |
+ def setUp(self): |
+ super(SimilarFinderTest, self).setUp() |
+ self.project = testutils.sample_project() |
+ self.mod = testutils.create_module(self.project, 'mod') |
+ |
+ def tearDown(self): |
+ testutils.remove_project(self.project) |
+ super(SimilarFinderTest, self).tearDown() |
+ |
+ def _create_finder(self, source, **kwds): |
+ self.mod.write(source) |
+ pymodule = self.project.get_pymodule(self.mod) |
+ return similarfinder.SimilarFinder(pymodule, **kwds) |
+ |
+ def test_trivial_case(self): |
+ finder = self._create_finder('') |
+ self.assertEquals([], list(finder.get_match_regions('10'))) |
+ |
+ def test_constant_integer(self): |
+ source = 'a = 10\n' |
+ finder = self._create_finder(source) |
+ result = [(source.index('10'), source.index('10') + 2)] |
+ self.assertEquals(result, list(finder.get_match_regions('10'))) |
+ |
+ def test_simple_addition(self): |
+ source = 'a = 1 + 2\n' |
+ finder = self._create_finder(source) |
+ result = [(source.index('1'), source.index('2') + 1)] |
+ self.assertEquals(result, list(finder.get_match_regions('1 + 2'))) |
+ |
+ def test_simple_addition2(self): |
+ source = 'a = 1 +2\n' |
+ finder = self._create_finder(source) |
+ result = [(source.index('1'), source.index('2') + 1)] |
+ self.assertEquals(result, list(finder.get_match_regions('1 + 2'))) |
+ |
+ def test_simple_assign_statements(self): |
+ source = 'a = 1 + 2\n' |
+ finder = self._create_finder(source) |
+ self.assertEquals([(0, len(source) - 1)], |
+ list(finder.get_match_regions('a = 1 + 2'))) |
+ |
+ def test_simple_multiline_statements(self): |
+ source = 'a = 1\nb = 2\n' |
+ finder = self._create_finder(source) |
+ self.assertEquals([(0, len(source) - 1)], |
+ list(finder.get_match_regions('a = 1\nb = 2'))) |
+ |
+ def test_multiple_matches(self): |
+ source = 'a = 1 + 1\n' |
+ finder = self._create_finder(source) |
+ result = list(finder.get_match_regions('1')) |
+ self.assertEquals(2, len(result)) |
+ start1 = source.index('1') |
+ self.assertEquals((start1, start1 + 1), result[0]) |
+ start2 = source.rindex('1') |
+ self.assertEquals((start2, start2 + 1), result[1]) |
+ |
+ def test_multiple_matches2(self): |
+ source = 'a = 1\nb = 2\n\na = 1\nb = 2\n' |
+ finder = self._create_finder(source) |
+ self.assertEquals( |
+ 2, len(list(finder.get_match_regions('a = 1\nb = 2')))) |
+ |
+ def test_restricting_the_region_to_search(self): |
+ source = '1\n\n1\n' |
+ finder = self._create_finder(source) |
+ result = list(finder.get_match_regions('1', start=2)) |
+ start = source.rfind('1') |
+ self.assertEquals([(start, start + 1)], result) |
+ |
+ def test_matching_basic_patterns(self): |
+ source = 'b = a\n' |
+ finder = self._create_finder(source) |
+ result = list(finder.get_match_regions('${a}', args={'a': 'exact'})) |
+ start = source.rfind('a') |
+ self.assertEquals([(start, start + 1)], result) |
+ |
+ def test_match_get_ast(self): |
+ source = 'b = a\n' |
+ finder = self._create_finder(source) |
+ result = list(finder.get_matches('${a}', args={'a': 'exact'})) |
+ self.assertEquals('a', result[0].get_ast('a').id) |
+ |
+ def test_match_get_ast_for_statements(self): |
+ source = 'b = a\n' |
+ finder = self._create_finder(source) |
+ result = list(finder.get_matches('b = ${a}')) |
+ self.assertEquals('a', result[0].get_ast('a').id) |
+ |
+ def test_matching_multiple_patterns(self): |
+ source = 'c = a + b\n' |
+ finder = self._create_finder(source) |
+ result = list(finder.get_matches('${a} + ${b}')) |
+ self.assertEquals('a', result[0].get_ast('a').id) |
+ self.assertEquals('b', result[0].get_ast('b').id) |
+ |
+ def test_matching_any_patterns(self): |
+ source = 'b = a\n' |
+ finder = self._create_finder(source) |
+ result = list(finder.get_matches('b = ${x}')) |
+ self.assertEquals('a', result[0].get_ast('x').id) |
+ |
+ def test_matching_any_patterns_repeating(self): |
+ source = 'b = 1 + 1\n' |
+ finder = self._create_finder(source) |
+ result = list(finder.get_matches('b = ${x} + ${x}')) |
+ self.assertEquals(1, result[0].get_ast('x').n) |
+ |
+ def test_matching_any_patterns_not_matching_different_nodes(self): |
+ source = 'b = 1 + 2\n' |
+ finder = self._create_finder(source) |
+ result = list(finder.get_matches('b = ${x} + ${x}')) |
+ self.assertEquals(0, len(result)) |
+ |
+ def test_matching_normal_names_and_assname(self): |
+ source = 'a = 1\n' |
+ finder = self._create_finder(source) |
+ result = list(finder.get_matches('${a} = 1')) |
+ self.assertEquals('a', result[0].get_ast('a').id) |
+ |
+ def test_matching_normal_names_and_assname2(self): |
+ source = 'a = 1\n' |
+ finder = self._create_finder(source) |
+ result = list(finder.get_matches('${a}', args={'a': 'exact'})) |
+ self.assertEquals(1, len(result)) |
+ |
+ def test_matching_normal_names_and_attributes(self): |
+ source = 'x.a = 1\n' |
+ finder = self._create_finder(source) |
+ result = list(finder.get_matches('${a} = 1', args={'a': 'exact'})) |
+ self.assertEquals(0, len(result)) |
+ |
+ def test_functions_not_matching_when_only_first_parameters(self): |
+ source = 'f(1, 2)\n' |
+ finder = self._create_finder(source) |
+ self.assertEquals(0, len(list(finder.get_matches('f(1)')))) |
+ |
+ def test_matching_nested_try_finally(self): |
+ source = 'if 1:\n try:\n pass\n except:\n pass\n' |
+ pattern = 'try:\n pass\nexcept:\n pass\n' |
+ finder = self._create_finder(source) |
+ self.assertEquals(1, len(list(finder.get_matches(pattern)))) |
+ |
+ def test_matching_dicts_inside_functions(self): |
+ source = 'def f(p):\n d = {1: p.x}\n' |
+ pattern = '{1: ${a}.x}' |
+ finder = self._create_finder(source) |
+ self.assertEquals(1, len(list(finder.get_matches(pattern)))) |
+ |
+ |
+class CheckingFinderTest(unittest.TestCase): |
+ |
+ def setUp(self): |
+ super(CheckingFinderTest, self).setUp() |
+ self.project = testutils.sample_project() |
+ self.mod1 = testutils.create_module(self.project, 'mod1') |
+ |
+ def tearDown(self): |
+ testutils.remove_project(self.project) |
+ super(CheckingFinderTest, self).tearDown() |
+ |
+ def test_trivial_case(self): |
+ self.mod1.write('') |
+ pymodule = self.project.get_pymodule(self.mod1) |
+ finder = similarfinder.SimilarFinder(pymodule) |
+ self.assertEquals([], list(finder.get_matches('10', {}))) |
+ |
+ def test_simple_finding(self): |
+ self.mod1.write('class A(object):\n pass\na = A()\n') |
+ pymodule = self.project.get_pymodule(self.mod1) |
+ finder = similarfinder.SimilarFinder(pymodule) |
+ result = list(finder.get_matches('${anything} = ${A}()', {})) |
+ self.assertEquals(1, len(result)) |
+ |
+ def test_not_matching_when_the_name_does_not_match(self): |
+ self.mod1.write('class A(object):\n pass\na = list()\n') |
+ pymodule = self.project.get_pymodule(self.mod1) |
+ finder = similarfinder.SimilarFinder(pymodule) |
+ result = list(finder.get_matches('${anything} = ${C}()', |
+ {'C': 'name=mod1.A'})) |
+ self.assertEquals(0, len(result)) |
+ |
+ def test_not_matching_unknowns_finding(self): |
+ self.mod1.write('class A(object):\n pass\na = unknown()\n') |
+ pymodule = self.project.get_pymodule(self.mod1) |
+ finder = similarfinder.SimilarFinder(pymodule) |
+ result = list(finder.get_matches('${anything} = ${C}()', |
+ {'C': 'name=mod1.A'})) |
+ self.assertEquals(0, len(result)) |
+ |
+ def test_finding_and_matching_pyobjects(self): |
+ source = 'class A(object):\n pass\nNewA = A\na = NewA()\n' |
+ self.mod1.write(source) |
+ pymodule = self.project.get_pymodule(self.mod1) |
+ finder = similarfinder.SimilarFinder(pymodule) |
+ result = list(finder.get_matches('${anything} = ${A}()', |
+ {'A': 'object=mod1.A'})) |
+ self.assertEquals(1, len(result)) |
+ start = source.rindex('a =') |
+ self.assertEquals((start, len(source) - 1), result[0].get_region()) |
+ |
+ def test_finding_and_matching_types(self): |
+ source = 'class A(object):\n def f(self):\n pass\n' \ |
+ 'a = A()\nb = a.f()\n' |
+ self.mod1.write(source) |
+ pymodule = self.project.get_pymodule(self.mod1) |
+ finder = similarfinder.SimilarFinder(pymodule) |
+ result = list(finder.get_matches('${anything} = ${inst}.f()', |
+ {'inst': 'type=mod1.A'})) |
+ self.assertEquals(1, len(result)) |
+ start = source.rindex('b') |
+ self.assertEquals((start, len(source) - 1), result[0].get_region()) |
+ |
+ def test_checking_the_type_of_an_ass_name_node(self): |
+ self.mod1.write('class A(object):\n pass\nan_a = A()\n') |
+ pymodule = self.project.get_pymodule(self.mod1) |
+ finder = similarfinder.SimilarFinder(pymodule) |
+ result = list(finder.get_matches('${a} = ${assigned}', |
+ {'a': 'type=mod1.A'})) |
+ self.assertEquals(1, len(result)) |
+ |
+ def test_checking_instance_of_an_ass_name_node(self): |
+ self.mod1.write('class A(object):\n pass\n' |
+ 'class B(A):\n pass\nb = B()\n') |
+ pymodule = self.project.get_pymodule(self.mod1) |
+ finder = similarfinder.SimilarFinder(pymodule) |
+ result = list(finder.get_matches('${a} = ${assigned}', |
+ {'a': 'instance=mod1.A'})) |
+ self.assertEquals(1, len(result)) |
+ |
+ def test_checking_equality_of_imported_pynames(self): |
+ mod2 = testutils.create_module(self.project, 'mod2') |
+ mod2.write('class A(object):\n pass\n') |
+ self.mod1.write('from mod2 import A\nan_a = A()\n') |
+ pymod1 = self.project.get_pymodule(self.mod1) |
+ finder = similarfinder.SimilarFinder(pymod1) |
+ result = list(finder.get_matches('${a_class}()', |
+ {'a_class': 'name=mod2.A'})) |
+ self.assertEquals(1, len(result)) |
+ |
+ |
+class TemplateTest(unittest.TestCase): |
+ |
+ def test_simple_templates(self): |
+ template = similarfinder.CodeTemplate('${a}\n') |
+ self.assertEquals(set(['a']), set(template.get_names())) |
+ |
+ def test_ignoring_matches_in_comments(self): |
+ template = similarfinder.CodeTemplate('#${a}\n') |
+ self.assertEquals([], template.get_names()) |
+ |
+ def test_ignoring_matches_in_strings(self): |
+ template = similarfinder.CodeTemplate("'${a}'\n") |
+ self.assertEquals([], template.get_names()) |
+ |
+ def test_simple_substitution(self): |
+ template = similarfinder.CodeTemplate('${a}\n') |
+ self.assertEquals('b\n', template.substitute({'a': 'b'})) |
+ |
+ def test_substituting_multiple_names(self): |
+ template = similarfinder.CodeTemplate('${a}, ${b}\n') |
+ self.assertEquals('1, 2\n', template.substitute({'a': '1', 'b': '2'})) |
+ |
+ |
+def suite(): |
+ result = unittest.TestSuite() |
+ result.addTests(unittest.makeSuite(SimilarFinderTest)) |
+ result.addTests(unittest.makeSuite(CheckingFinderTest)) |
+ result.addTests(unittest.makeSuite(TemplateTest)) |
+ return result |
+ |
+if __name__ == '__main__': |
+ unittest.main() |