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

Side by Side Diff: tools/telemetry/third_party/rope/ropetest/advanced_oi_test.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 try:
2 import unittest2 as unittest
3 except ImportError:
4 import unittest
5
6 import rope.base.oi
7 import rope.base.libutils
8 from ropetest import testutils
9
10
11 class DynamicOITest(unittest.TestCase):
12
13 def setUp(self):
14 super(DynamicOITest, self).setUp()
15 self.project = testutils.sample_project(validate_objectdb=True)
16 self.pycore = self.project.pycore
17
18 def tearDown(self):
19 testutils.remove_project(self.project)
20 super(DynamicOITest, self).tearDown()
21
22 def test_simple_dti(self):
23 mod = testutils.create_module(self.project, 'mod')
24 code = 'def a_func(arg):\n return eval("arg")\n' \
25 'a_var = a_func(a_func)\n'
26 mod.write(code)
27 self.pycore.run_module(mod).wait_process()
28 pymod = self.project.get_pymodule(mod)
29 self.assertEquals(pymod['a_func'].get_object(),
30 pymod['a_var'].get_object())
31
32 def test_module_dti(self):
33 mod1 = testutils.create_module(self.project, 'mod1')
34 mod2 = testutils.create_module(self.project, 'mod2')
35 code = 'import mod1\ndef a_func(arg):\n return eval("arg")\n' \
36 'a_var = a_func(mod1)\n'
37 mod2.write(code)
38 self.pycore.run_module(mod2).wait_process()
39 pymod2 = self.project.get_pymodule(mod2)
40 self.assertEquals(self.project.get_pymodule(mod1),
41 pymod2['a_var'].get_object())
42
43 def test_class_from_another_module_dti(self):
44 mod1 = testutils.create_module(self.project, 'mod1')
45 mod2 = testutils.create_module(self.project, 'mod2')
46 code1 = 'class AClass(object):\n pass\n'
47 code2 = 'from mod1 import AClass\n' \
48 '\ndef a_func(arg):\n return eval("arg")\n' \
49 'a_var = a_func(AClass)\n'
50 mod1.write(code1)
51 mod2.write(code2)
52 self.pycore.run_module(mod2).wait_process()
53 #pymod1 = self.project.get_pymodule(mod1)
54 pymod2 = self.project.get_pymodule(mod2)
55 self.assertEquals(pymod2['AClass'].get_object(),
56 pymod2['a_var'].get_object())
57
58 def test_class_dti(self):
59 mod = testutils.create_module(self.project, 'mod')
60 code = 'class AClass(object):\n pass\n' \
61 '\ndef a_func(arg):\n return eval("arg")\n' \
62 'a_var = a_func(AClass)\n'
63 mod.write(code)
64 self.pycore.run_module(mod).wait_process()
65 pymod = self.project.get_pymodule(mod)
66 self.assertEquals(pymod['AClass'].get_object(),
67 pymod['a_var'].get_object())
68
69 def test_instance_dti(self):
70 mod = testutils.create_module(self.project, 'mod')
71 code = 'class AClass(object):\n pass\n' \
72 '\ndef a_func(arg):\n return eval("arg()")\n' \
73 'a_var = a_func(AClass)\n'
74 mod.write(code)
75 self.pycore.run_module(mod).wait_process()
76 pymod = self.project.get_pymodule(mod)
77 self.assertEquals(pymod['AClass'].get_object(),
78 pymod['a_var'].get_object().get_type())
79
80 def test_method_dti(self):
81 mod = testutils.create_module(self.project, 'mod')
82 code = 'class AClass(object):\n def a_method(self, arg):\n' \
83 ' return eval("arg()")\n' \
84 'an_instance = AClass()\n' \
85 'a_var = an_instance.a_method(AClass)\n'
86 mod.write(code)
87 self.pycore.run_module(mod).wait_process()
88 pymod = self.project.get_pymodule(mod)
89 self.assertEquals(pymod['AClass'].get_object(),
90 pymod['a_var'].get_object().get_type())
91
92 def test_function_argument_dti(self):
93 mod = testutils.create_module(self.project, 'mod')
94 code = 'def a_func(arg):\n pass\n' \
95 'a_func(a_func)\n'
96 mod.write(code)
97 self.pycore.run_module(mod).wait_process()
98 pyscope = self.project.get_pymodule(mod).get_scope()
99 self.assertEquals(pyscope['a_func'].get_object(),
100 pyscope.get_scopes()[0]['arg'].get_object())
101
102 def test_classes_with_the_same_name(self):
103 mod = testutils.create_module(self.project, 'mod')
104 code = 'def a_func(arg):\n class AClass(object):\n' \
105 ' pass\n return eval("arg")\n' \
106 'class AClass(object):\n pass\n' \
107 'a_var = a_func(AClass)\n'
108 mod.write(code)
109 self.pycore.run_module(mod).wait_process()
110 pymod = self.project.get_pymodule(mod)
111 self.assertEquals(pymod['AClass'].get_object(),
112 pymod['a_var'].get_object())
113
114 def test_nested_classes(self):
115 mod = testutils.create_module(self.project, 'mod')
116 code = 'def a_func():\n class AClass(object):\n' \
117 ' pass\n return AClass\n' \
118 'def another_func(arg):\n return eval("arg")\n' \
119 'a_var = another_func(a_func())\n'
120 mod.write(code)
121 self.pycore.run_module(mod).wait_process()
122 pyscope = self.project.get_pymodule(mod).get_scope()
123 self.assertEquals(pyscope.get_scopes()[0]['AClass'].get_object(),
124 pyscope['a_var'].get_object())
125
126 def test_function_argument_dti2(self):
127 mod = testutils.create_module(self.project, 'mod')
128 code = 'def a_func(arg, a_builtin_type):\n pass\n' \
129 'a_func(a_func, [])\n'
130 mod.write(code)
131 self.pycore.run_module(mod).wait_process()
132 pyscope = self.project.get_pymodule(mod).get_scope()
133 self.assertEquals(pyscope['a_func'].get_object(),
134 pyscope.get_scopes()[0]['arg'].get_object())
135
136 def test_dti_and_concluded_data_invalidation(self):
137 mod = testutils.create_module(self.project, 'mod')
138 code = 'def a_func(arg):\n return eval("arg")\n' \
139 'a_var = a_func(a_func)\n'
140 mod.write(code)
141 pymod = self.project.get_pymodule(mod)
142 pymod['a_var'].get_object()
143 self.pycore.run_module(mod).wait_process()
144 self.assertEquals(pymod['a_func'].get_object(),
145 pymod['a_var'].get_object())
146
147 def test_list_objects_and_dynamicoi(self):
148 mod = testutils.create_module(self.project, 'mod')
149 code = 'class C(object):\n pass\n' \
150 'def a_func(arg):\n return eval("arg")\n' \
151 'a_var = a_func([C()])[0]\n'
152 mod.write(code)
153 self.pycore.run_module(mod).wait_process()
154 pymod = self.project.get_pymodule(mod)
155 c_class = pymod['C'].get_object()
156 a_var = pymod['a_var'].get_object()
157 self.assertEquals(c_class, a_var.get_type())
158
159 def test_for_loops_and_dynamicoi(self):
160 mod = testutils.create_module(self.project, 'mod')
161 code = 'class C(object):\n pass\n' \
162 'def a_func(arg):\n return eval("arg")\n' \
163 'for c in a_func([C()]):\n a_var = c\n'
164 mod.write(code)
165 self.pycore.run_module(mod).wait_process()
166 pymod = self.project.get_pymodule(mod)
167 c_class = pymod['C'].get_object()
168 a_var = pymod['a_var'].get_object()
169 self.assertEquals(c_class, a_var.get_type())
170
171 def test_dict_objects_and_dynamicoi(self):
172 mod = testutils.create_module(self.project, 'mod')
173 code = 'class C(object):\n pass\n' \
174 'def a_func(arg):\n return eval("arg")\n' \
175 'a_var = a_func({1: C()})[1]\n'
176 mod.write(code)
177 self.pycore.run_module(mod).wait_process()
178 pymod = self.project.get_pymodule(mod)
179 c_class = pymod['C'].get_object()
180 a_var = pymod['a_var'].get_object()
181 self.assertEquals(c_class, a_var.get_type())
182
183 def test_dict_keys_and_dynamicoi(self):
184 mod = testutils.create_module(self.project, 'mod')
185 code = 'class C(object):\n pass\n' \
186 'def a_func(arg):\n return eval("arg")\n' \
187 'a_var = a_func({C(): 1}).keys()[0]\n'
188 mod.write(code)
189 self.pycore.run_module(mod).wait_process()
190 pymod = self.project.get_pymodule(mod)
191 c_class = pymod['C'].get_object()
192 a_var = pymod['a_var'].get_object()
193 self.assertEquals(c_class, a_var.get_type())
194
195 def test_dict_keys_and_dynamicoi2(self):
196 mod = testutils.create_module(self.project, 'mod')
197 code = 'class C1(object):\n pass\nclass C2(object):\n pass\n' \
198 'def a_func(arg):\n return eval("arg")\n' \
199 'a, b = a_func((C1(), C2()))\n'
200 mod.write(code)
201 self.pycore.run_module(mod).wait_process()
202 pymod = self.project.get_pymodule(mod)
203 c1_class = pymod['C1'].get_object()
204 c2_class = pymod['C2'].get_object()
205 a_var = pymod['a'].get_object()
206 b_var = pymod['b'].get_object()
207 self.assertEquals(c1_class, a_var.get_type())
208 self.assertEquals(c2_class, b_var.get_type())
209
210 def test_strs_and_dynamicoi(self):
211 mod = testutils.create_module(self.project, 'mod')
212 code = 'def a_func(arg):\n return eval("arg")\n' \
213 'a_var = a_func("hey")\n'
214 mod.write(code)
215 self.pycore.run_module(mod).wait_process()
216 pymod = self.project.get_pymodule(mod)
217 a_var = pymod['a_var'].get_object()
218 self.assertTrue(isinstance(a_var.get_type(), rope.base.builtins.Str))
219
220 def test_textual_transformations(self):
221 mod = testutils.create_module(self.project, 'mod')
222 code = 'class C(object):\n pass\ndef f():' \
223 '\n pass\na_var = C()\n' \
224 'a_list = [C()]\na_str = "hey"\na_file = open("file.txt")\n'
225 mod.write(code)
226 to_pyobject = rope.base.oi.transform.TextualToPyObject(self.project)
227 to_textual = rope.base.oi.transform.PyObjectToTextual(self.project)
228 pymod = self.project.get_pymodule(mod)
229
230 def complex_to_textual(pyobject):
231 return to_textual.transform(
232 to_pyobject.transform(to_textual.transform(pyobject)))
233 for name in ('C', 'f', 'a_var', 'a_list', 'a_str', 'a_file'):
234 var = pymod[name].get_object()
235 self.assertEquals(to_textual.transform(var),
236 complex_to_textual(var))
237 self.assertEquals(to_textual.transform(pymod),
238 complex_to_textual(pymod))
239 enumerate_func = rope.base.builtins.builtins['enumerate'].get_object()
240 self.assertEquals(to_textual.transform(enumerate_func),
241 complex_to_textual(enumerate_func))
242
243 def test_arguments_with_keywords(self):
244 mod = testutils.create_module(self.project, 'mod')
245 code = 'class C1(object):\n pass\nclass C2(object):\n pass\n' \
246 'def a_func(arg):\n return eval("arg")\n' \
247 'a = a_func(arg=C1())\nb = a_func(arg=C2())\n'
248 mod.write(code)
249 self.pycore.run_module(mod).wait_process()
250 pymod = self.project.get_pymodule(mod)
251 c1_class = pymod['C1'].get_object()
252 c2_class = pymod['C2'].get_object()
253 a_var = pymod['a'].get_object()
254 b_var = pymod['b'].get_object()
255 self.assertEquals(c1_class, a_var.get_type())
256 self.assertEquals(c2_class, b_var.get_type())
257
258 def test_a_function_with_different_returns(self):
259 mod = testutils.create_module(self.project, 'mod')
260 code = 'class C1(object):\n pass\nclass C2(object):\n pass\n' \
261 'def a_func(arg):\n return eval("arg")\n' \
262 'a = a_func(C1())\nb = a_func(C2())\n'
263 mod.write(code)
264 self.pycore.run_module(mod).wait_process()
265 pymod = self.project.get_pymodule(mod)
266 c1_class = pymod['C1'].get_object()
267 c2_class = pymod['C2'].get_object()
268 a_var = pymod['a'].get_object()
269 b_var = pymod['b'].get_object()
270 self.assertEquals(c1_class, a_var.get_type())
271 self.assertEquals(c2_class, b_var.get_type())
272
273 def test_a_function_with_different_returns2(self):
274 mod = testutils.create_module(self.project, 'mod')
275 code = 'class C1(object):\n pass\nclass C2(object):\n pass\n' \
276 'def a_func(p):\n if p == C1:\n return C1()\n' \
277 ' else:\n return C2()\n' \
278 'a = a_func(C1)\nb = a_func(C2)\n'
279 mod.write(code)
280 self.pycore.run_module(mod).wait_process()
281 pymod = self.project.get_pymodule(mod)
282 c1_class = pymod['C1'].get_object()
283 c2_class = pymod['C2'].get_object()
284 a_var = pymod['a'].get_object()
285 b_var = pymod['b'].get_object()
286 self.assertEquals(c1_class, a_var.get_type())
287 self.assertEquals(c2_class, b_var.get_type())
288
289 def test_ignoring_star_args(self):
290 mod = testutils.create_module(self.project, 'mod')
291 code = 'class C1(object):\n pass\nclass C2(object):\n pass\n' \
292 'def a_func(p, *args):' \
293 '\n if p == C1:\n return C1()\n' \
294 ' else:\n return C2()\n' \
295 'a = a_func(C1, 1)\nb = a_func(C2, 2)\n'
296 mod.write(code)
297 self.pycore.run_module(mod).wait_process()
298 pymod = self.project.get_pymodule(mod)
299 c1_class = pymod['C1'].get_object()
300 c2_class = pymod['C2'].get_object()
301 a_var = pymod['a'].get_object()
302 b_var = pymod['b'].get_object()
303 self.assertEquals(c1_class, a_var.get_type())
304 self.assertEquals(c2_class, b_var.get_type())
305
306 def test_ignoring_double_star_args(self):
307 mod = testutils.create_module(self.project, 'mod')
308 code = 'class C1(object):\n pass\nclass C2(object):\n pass\n' \
309 'def a_func(p, *kwds, **args):\n ' \
310 'if p == C1:\n return C1()\n' \
311 ' else:\n return C2()\n' \
312 'a = a_func(C1, kwd=1)\nb = a_func(C2, kwd=2)\n'
313 mod.write(code)
314 self.pycore.run_module(mod).wait_process()
315 pymod = self.project.get_pymodule(mod)
316 c1_class = pymod['C1'].get_object()
317 c2_class = pymod['C2'].get_object()
318 a_var = pymod['a'].get_object()
319 b_var = pymod['b'].get_object()
320 self.assertEquals(c1_class, a_var.get_type())
321 self.assertEquals(c2_class, b_var.get_type())
322
323 def test_invalidating_data_after_changing(self):
324 mod = testutils.create_module(self.project, 'mod')
325 code = 'def a_func(arg):\n return eval("arg")\n' \
326 'a_var = a_func(a_func)\n'
327 mod.write(code)
328 self.pycore.run_module(mod).wait_process()
329 mod.write(code.replace('a_func', 'newfunc'))
330 mod.write(code)
331 pymod = self.project.get_pymodule(mod)
332 self.assertNotEquals(pymod['a_func'].get_object(),
333 pymod['a_var'].get_object())
334
335 def test_invalidating_data_after_moving(self):
336 mod2 = testutils.create_module(self.project, 'mod2')
337 mod2.write('class C(object):\n pass\n')
338 mod = testutils.create_module(self.project, 'mod')
339 code = 'import mod2\ndef a_func(arg):\n return eval(arg)\n' \
340 'a_var = a_func("mod2.C")\n'
341 mod.write(code)
342 self.pycore.run_module(mod).wait_process()
343 mod.move('newmod.py')
344 pymod = self.project.get_module('newmod')
345 pymod2 = self.project.get_pymodule(mod2)
346 self.assertEquals(pymod2['C'].get_object(),
347 pymod['a_var'].get_object())
348
349
350 class NewStaticOITest(unittest.TestCase):
351
352 def setUp(self):
353 super(NewStaticOITest, self).setUp()
354 self.project = testutils.sample_project(validate_objectdb=True)
355 self.pycore = self.project.pycore
356 self.mod = testutils.create_module(self.project, 'mod')
357
358 def tearDown(self):
359 testutils.remove_project(self.project)
360 super(NewStaticOITest, self).tearDown()
361
362 def test_static_oi_for_simple_function_calls(self):
363 code = 'class C(object):\n pass\ndef f(p):\n pass\nf(C())\n'
364 self.mod.write(code)
365 self.pycore.analyze_module(self.mod)
366 pymod = self.project.get_pymodule(self.mod)
367 c_class = pymod['C'].get_object()
368 f_scope = pymod['f'].get_object().get_scope()
369 p_type = f_scope['p'].get_object().get_type()
370 self.assertEquals(c_class, p_type)
371
372 def test_static_oi_not_failing_when_callin_callables(self):
373 code = 'class C(object):\n pass\nC()\n'
374 self.mod.write(code)
375 self.pycore.analyze_module(self.mod)
376
377 def test_static_oi_for_nested_calls(self):
378 code = 'class C(object):\n pass\ndef f(p):\n pass\n' \
379 'def g(p):\n return p\nf(g(C()))\n'
380 self.mod.write(code)
381 self.pycore.analyze_module(self.mod)
382 pymod = self.project.get_pymodule(self.mod)
383 c_class = pymod['C'].get_object()
384 f_scope = pymod['f'].get_object().get_scope()
385 p_type = f_scope['p'].get_object().get_type()
386 self.assertEquals(c_class, p_type)
387
388 def test_static_oi_class_methods(self):
389 code = 'class C(object):\n def f(self, p):\n pass\n' \
390 'C().f(C())'
391 self.mod.write(code)
392 self.pycore.analyze_module(self.mod)
393 pymod = self.project.get_pymodule(self.mod)
394 c_class = pymod['C'].get_object()
395 f_scope = c_class['f'].get_object().get_scope()
396 p_type = f_scope['p'].get_object().get_type()
397 self.assertEquals(c_class, p_type)
398
399 def test_static_oi_preventing_soi_maximum_recursion_exceptions(self):
400 code = 'item = {}\nfor item in item.keys():\n pass\n'
401 self.mod.write(code)
402 try:
403 self.pycore.analyze_module(self.mod)
404 except RuntimeError as e:
405 self.fail(str(e))
406
407 def test_static_oi_for_infer_return_typs_from_funcs_based_on_params(self):
408 code = 'class C(object):\n pass\ndef func(p):\n return p\n' \
409 'a_var = func(C())\n'
410 self.mod.write(code)
411 pymod = self.project.get_pymodule(self.mod)
412 c_class = pymod['C'].get_object()
413 a_var = pymod['a_var'].get_object()
414 self.assertEquals(c_class, a_var.get_type())
415
416 def test_a_function_with_different_returns(self):
417 code = 'class C1(object):\n pass\nclass C2(object):\n pass\n' \
418 'def a_func(arg):\n return arg\n' \
419 'a = a_func(C1())\nb = a_func(C2())\n'
420 self.mod.write(code)
421 pymod = self.project.get_pymodule(self.mod)
422 c1_class = pymod['C1'].get_object()
423 c2_class = pymod['C2'].get_object()
424 a_var = pymod['a'].get_object()
425 b_var = pymod['b'].get_object()
426 self.assertEquals(c1_class, a_var.get_type())
427 self.assertEquals(c2_class, b_var.get_type())
428
429 def test_not_reporting_out_of_date_information(self):
430 code = 'class C1(object):\n pass\n' \
431 'def f(arg):\n return C1()\na_var = f('')\n'
432 self.mod.write(code)
433 pymod = self.project.get_pymodule(self.mod)
434 c1_class = pymod['C1'].get_object()
435 a_var = pymod['a_var'].get_object()
436 self.assertEquals(c1_class, a_var.get_type())
437
438 self.mod.write(code.replace('C1', 'C2'))
439 pymod = self.project.get_pymodule(self.mod)
440 c2_class = pymod['C2'].get_object()
441 a_var = pymod['a_var'].get_object()
442 self.assertEquals(c2_class, a_var.get_type())
443
444 def test_invalidating_concluded_data_in_a_function(self):
445 mod1 = testutils.create_module(self.project, 'mod1')
446 mod2 = testutils.create_module(self.project, 'mod2')
447 mod1.write('def func(arg):\n temp = arg\n return temp\n')
448 mod2.write('import mod1\n'
449 'class C1(object):\n pass\n'
450 'class C2(object):\n pass\n'
451 'a_var = mod1.func(C1())\n')
452 pymod2 = self.project.get_pymodule(mod2)
453 c1_class = pymod2['C1'].get_object()
454 a_var = pymod2['a_var'].get_object()
455 self.assertEquals(c1_class, a_var.get_type())
456
457 mod2.write(mod2.read()[:mod2.read().rfind('C1()')] + 'C2())\n')
458 pymod2 = self.project.get_pymodule(mod2)
459 c2_class = pymod2['C2'].get_object()
460 a_var = pymod2['a_var'].get_object()
461 self.assertEquals(c2_class, a_var.get_type())
462
463 def test_handling_generator_functions_for_strs(self):
464 self.mod.write('class C(object):\n pass\ndef f(p):\n yield p()\n'
465 'for c in f(C):\n a_var = c\n')
466 pymod = self.project.get_pymodule(self.mod)
467 c_class = pymod['C'].get_object()
468 a_var = pymod['a_var'].get_object()
469 self.assertEquals(c_class, a_var.get_type())
470
471 # TODO: Returning a generator for functions that yield unknowns
472 @unittest.skip("Returning a generator that yields unknowns")
473 def xxx_test_handl_generator_functions_when_unknown_type_is_yielded(self):
474 self.mod.write('class C(object):\n pass'
475 '\ndef f():\n yield eval("C()")\n'
476 'a_var = f()\n')
477 pymod = self.project.get_pymodule(self.mod)
478 a_var = pymod['a_var'].get_object()
479 self.assertTrue(isinstance(a_var.get_type(),
480 rope.base.builtins.Generator))
481
482 def test_static_oi_for_lists_depending_on_append_function(self):
483 code = 'class C(object):\n pass\nl = list()\n' \
484 'l.append(C())\na_var = l.pop()\n'
485 self.mod.write(code)
486 self.pycore.analyze_module(self.mod)
487 pymod = self.project.get_pymodule(self.mod)
488 c_class = pymod['C'].get_object()
489 a_var = pymod['a_var'].get_object()
490 self.assertEquals(c_class, a_var.get_type())
491
492 def test_static_oi_for_lists_per_object_for_get_item(self):
493 code = 'class C(object):\n pass\nl = list()\n' \
494 'l.append(C())\na_var = l[0]\n'
495 self.mod.write(code)
496 self.pycore.analyze_module(self.mod)
497 pymod = self.project.get_pymodule(self.mod)
498 c_class = pymod['C'].get_object()
499 a_var = pymod['a_var'].get_object()
500 self.assertEquals(c_class, a_var.get_type())
501
502 def test_static_oi_for_lists_per_object_for_fields(self):
503 code = 'class C(object):\n pass\n' \
504 'class A(object):\n ' \
505 'def __init__(self):\n self.l = []\n' \
506 ' def set(self):\n self.l.append(C())\n' \
507 'a = A()\na.set()\na_var = a.l[0]\n'
508 self.mod.write(code)
509 self.pycore.analyze_module(self.mod)
510 pymod = self.project.get_pymodule(self.mod)
511 c_class = pymod['C'].get_object()
512 a_var = pymod['a_var'].get_object()
513 self.assertEquals(c_class, a_var.get_type())
514
515 def test_static_oi_for_lists_per_object_for_set_item(self):
516 code = 'class C(object):\n pass\nl = [None]\n' \
517 'l[0] = C()\na_var = l[0]\n'
518 self.mod.write(code)
519 self.pycore.analyze_module(self.mod)
520 pymod = self.project.get_pymodule(self.mod)
521 c_class = pymod['C'].get_object()
522 a_var = pymod['a_var'].get_object()
523 self.assertEquals(c_class, a_var.get_type())
524
525 def test_static_oi_for_lists_per_object_for_extending_lists(self):
526 code = 'class C(object):\n pass\nl = []\n' \
527 'l.append(C())\nl2 = []\nl2.extend(l)\na_var = l2[0]\n'
528 self.mod.write(code)
529 self.pycore.analyze_module(self.mod)
530 pymod = self.project.get_pymodule(self.mod)
531 c_class = pymod['C'].get_object()
532 a_var = pymod['a_var'].get_object()
533 self.assertEquals(c_class, a_var.get_type())
534
535 def test_static_oi_for_lists_per_object_for_iters(self):
536 code = 'class C(object):\n pass\n' \
537 'l = []\nl.append(C())\n' \
538 'for c in l:\n a_var = c\n'
539 self.mod.write(code)
540 self.pycore.analyze_module(self.mod)
541 pymod = self.project.get_pymodule(self.mod)
542 c_class = pymod['C'].get_object()
543 a_var = pymod['a_var'].get_object()
544 self.assertEquals(c_class, a_var.get_type())
545
546 def test_static_oi_for_dicts_depending_on_append_function(self):
547 code = 'class C1(object):\n pass\nclass C2(object):\n pass\n' \
548 'd = {}\nd[C1()] = C2()\na, b = d.popitem()\n'
549 self.mod.write(code)
550 self.pycore.analyze_module(self.mod)
551 pymod = self.project.get_pymodule(self.mod)
552 c1_class = pymod['C1'].get_object()
553 c2_class = pymod['C2'].get_object()
554 a_var = pymod['a'].get_object()
555 b_var = pymod['b'].get_object()
556 self.assertEquals(c1_class, a_var.get_type())
557 self.assertEquals(c2_class, b_var.get_type())
558
559 def test_static_oi_for_dicts_depending_on_for_loops(self):
560 code = 'class C1(object):\n pass\nclass C2(object):\n pass\n' \
561 'd = {}\nd[C1()] = C2()\n' \
562 'for k, v in d.items():\n a = k\n b = v\n'
563 self.mod.write(code)
564 self.pycore.analyze_module(self.mod)
565 pymod = self.project.get_pymodule(self.mod)
566 c1_class = pymod['C1'].get_object()
567 c2_class = pymod['C2'].get_object()
568 a_var = pymod['a'].get_object()
569 b_var = pymod['b'].get_object()
570 self.assertEquals(c1_class, a_var.get_type())
571 self.assertEquals(c2_class, b_var.get_type())
572
573 def test_static_oi_for_dicts_depending_on_update(self):
574 code = 'class C1(object):\n pass\nclass C2(object):\n pass\n' \
575 'd = {}\nd[C1()] = C2()\n' \
576 'd2 = {}\nd2.update(d)\na, b = d2.popitem()\n'
577 self.mod.write(code)
578 self.pycore.analyze_module(self.mod)
579 pymod = self.project.get_pymodule(self.mod)
580 c1_class = pymod['C1'].get_object()
581 c2_class = pymod['C2'].get_object()
582 a_var = pymod['a'].get_object()
583 b_var = pymod['b'].get_object()
584 self.assertEquals(c1_class, a_var.get_type())
585 self.assertEquals(c2_class, b_var.get_type())
586
587 def test_static_oi_for_dicts_depending_on_update_on_seqs(self):
588 code = 'class C1(object):\n pass\nclass C2(object):\n pass\n' \
589 'd = {}\nd.update([(C1(), C2())])\na, b = d.popitem()\n'
590 self.mod.write(code)
591 self.pycore.analyze_module(self.mod)
592 pymod = self.project.get_pymodule(self.mod)
593 c1_class = pymod['C1'].get_object()
594 c2_class = pymod['C2'].get_object()
595 a_var = pymod['a'].get_object()
596 b_var = pymod['b'].get_object()
597 self.assertEquals(c1_class, a_var.get_type())
598 self.assertEquals(c2_class, b_var.get_type())
599
600 def test_static_oi_for_sets_per_object_for_set_item(self):
601 code = 'class C(object):\n pass\ns = set()\n' \
602 's.add(C())\na_var = s.pop() \n'
603 self.mod.write(code)
604 self.pycore.analyze_module(self.mod)
605 pymod = self.project.get_pymodule(self.mod)
606 c_class = pymod['C'].get_object()
607 a_var = pymod['a_var'].get_object()
608 self.assertEquals(c_class, a_var.get_type())
609
610 def test_properties_and_calling_get_property(self):
611 code = 'class C1(object):\n pass\n' \
612 'class C2(object):\n c1 = C1()\n' \
613 ' def get_c1(self):\n return self.c1\n' \
614 ' p = property(get_c1)\nc2 = C2()\na_var = c2.p\n'
615 self.mod.write(code)
616 pymod = self.project.get_pymodule(self.mod)
617 c1_class = pymod['C1'].get_object()
618 a_var = pymod['a_var'].get_object()
619 self.assertEquals(c1_class, a_var.get_type())
620
621 def test_soi_on_constructors(self):
622 code = 'class C1(object):\n pass\n' \
623 'class C2(object):\n' \
624 ' def __init__(self, arg):\n self.attr = arg\n' \
625 'c2 = C2(C1())\na_var = c2.attr'
626 self.mod.write(code)
627 self.pycore.analyze_module(self.mod)
628 pymod = self.project.get_pymodule(self.mod)
629 c1_class = pymod['C1'].get_object()
630 a_var = pymod['a_var'].get_object()
631 self.assertEquals(c1_class, a_var.get_type())
632
633 def test_not_saving_unknown_function_returns(self):
634 mod2 = testutils.create_module(self.project, 'mod2')
635 self.mod.write('class C(object):\n pass\nl = []\nl.append(C())\n')
636 mod2.write('import mod\ndef f():\n '
637 'return mod.l.pop()\na_var = f()\n')
638 pymod = self.project.get_pymodule(self.mod)
639 pymod2 = self.project.get_pymodule(mod2)
640 c_class = pymod['C'].get_object()
641 a_var = pymod2['a_var']
642
643 self.pycore.analyze_module(mod2)
644 self.assertNotEquals(c_class, a_var.get_object().get_type())
645
646 self.pycore.analyze_module(self.mod)
647 self.assertEquals(c_class, a_var.get_object().get_type())
648
649 def test_using_the_best_callinfo(self):
650 code = 'class C1(object):\n pass\n' \
651 'def f(arg1, arg2, arg3):\n pass\n' \
652 'f("", None, C1())\nf("", C1(), None)\n'
653 self.mod.write(code)
654 self.pycore.analyze_module(self.mod)
655 pymod = self.project.get_pymodule(self.mod)
656 c1_class = pymod['C1'].get_object()
657 f_scope = pymod['f'].get_object().get_scope()
658 arg2 = f_scope['arg2'].get_object()
659 self.assertEquals(c1_class, arg2.get_type())
660
661 def test_call_function_and_parameters(self):
662 code = 'class A(object):\n def __call__(self, p):\n pass\n' \
663 'A()("")\n'
664 self.mod.write(code)
665 self.pycore.analyze_module(self.mod)
666 scope = self.project.get_pymodule(self.mod).get_scope()
667 p_object = scope.get_scopes()[0].get_scopes()[0]['p'].get_object()
668 self.assertTrue(isinstance(p_object.get_type(),
669 rope.base.builtins.Str))
670
671 def test_report_change_in_libutils(self):
672 self.project.prefs['automatic_soa'] = True
673 code = 'class C(object):\n pass\ndef f(p):\n pass\nf(C())\n'
674 mod_file = open(self.mod.real_path, 'w')
675 mod_file.write(code)
676 mod_file.close()
677 rope.base.libutils.report_change(self.project, self.mod.real_path, '')
678 pymod = self.project.get_pymodule(self.mod)
679 c_class = pymod['C'].get_object()
680 f_scope = pymod['f'].get_object().get_scope()
681 p_type = f_scope['p'].get_object().get_type()
682 self.assertEquals(c_class, p_type)
683
684 def test_report_libutils_and_analyze_all_modules(self):
685 code = 'class C(object):\n pass\ndef f(p):\n pass\nf(C())\n'
686 self.mod.write(code)
687 rope.base.libutils.analyze_modules(self.project)
688 pymod = self.project.get_pymodule(self.mod)
689 c_class = pymod['C'].get_object()
690 f_scope = pymod['f'].get_object().get_scope()
691 p_type = f_scope['p'].get_object().get_type()
692 self.assertEquals(c_class, p_type)
693
694 def test_validation_problems_for_objectdb_retrievals(self):
695 mod1 = testutils.create_module(self.project, 'mod1')
696 mod2 = testutils.create_module(self.project, 'mod2')
697 mod1.write('l = []\nvar = l.pop()\n')
698 mod2.write('import mod1\n\nclass C(object):\n pass\n'
699 'mod1.l.append(C())\n')
700 self.pycore.analyze_module(mod2)
701
702 pymod2 = self.project.get_pymodule(mod2)
703 c_class = pymod2['C'].get_object()
704 pymod1 = self.project.get_pymodule(mod1)
705 var_pyname = pymod1['var']
706 self.assertEquals(c_class, var_pyname.get_object().get_type())
707 mod2.write('import mod1\n\nmod1.l.append("")\n')
708 self.assertNotEquals(c_class, var_pyname.get_object().get_type(),
709 'Class `C` no more exists')
710
711 def test_validation_problems_for_changing_builtin_types(self):
712 mod1 = testutils.create_module(self.project, 'mod1')
713 mod1.write('l = []\nl.append("")\n')
714 self.pycore.analyze_module(mod1)
715
716 mod1.write('l = {}\nv = l["key"]\n')
717 pymod1 = self.project.get_pymodule(mod1) # noqa
718 var = pymod1['v'].get_object() # noqa
719
720 def test_always_returning_containing_class_for_selfs(self):
721 code = 'class A(object):\n def f(p):\n return p\n' \
722 'class B(object):\n pass\nb = B()\nb.f()\n'
723 self.mod.write(code)
724 self.pycore.analyze_module(self.mod)
725 pymod = self.project.get_pymodule(self.mod)
726 a_class = pymod['A'].get_object()
727 f_scope = a_class.get_scope().get_scopes()[0]
728 p_type = f_scope['p'].get_object().get_type()
729 self.assertEquals(a_class, p_type)
730
731 def test_following_function_calls_when_asked_to(self):
732 code = 'class A(object):\n pass\n' \
733 'class C(object):\n' \
734 ' def __init__(self, arg):\n' \
735 ' self.attr = arg\n' \
736 'def f(p):\n return C(p)\n' \
737 'c = f(A())\nx = c.attr\n'
738 self.mod.write(code)
739 self.pycore.analyze_module(self.mod, followed_calls=1)
740 pymod = self.project.get_pymodule(self.mod)
741 a_class = pymod['A'].get_object()
742 x_var = pymod['x'].get_object().get_type()
743 self.assertEquals(a_class, x_var)
744
745
746 def suite():
747 result = unittest.TestSuite()
748 result.addTests(unittest.makeSuite(DynamicOITest))
749 result.addTests(unittest.makeSuite(NewStaticOITest))
750 return result
751
752
753 if __name__ == '__main__':
754 unittest.main()
OLDNEW
« no previous file with comments | « tools/telemetry/third_party/rope/ropetest/__init__.py ('k') | tools/telemetry/third_party/rope/ropetest/builtinstest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698