Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Side by Side Diff: tools/telemetry/third_party/rope/ropetest/refactor/similarfindertest.py

Issue 1132103009: Example of refactoring using rope library. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698