OLD | NEW |
(Empty) | |
| 1 import sys |
| 2 try: |
| 3 import unittest2 as unittest |
| 4 except ImportError: |
| 5 import unittest |
| 6 |
| 7 from rope.base import exceptions |
| 8 from rope.base import libutils |
| 9 from rope.base.pycore import _TextChangeDetector |
| 10 from rope.base.pyobjects import get_base_type, AbstractFunction |
| 11 from ropetest import testutils |
| 12 |
| 13 |
| 14 class PyCoreTest(unittest.TestCase): |
| 15 |
| 16 def setUp(self): |
| 17 super(PyCoreTest, self).setUp() |
| 18 self.project = testutils.sample_project() |
| 19 self.pycore = self.project.pycore |
| 20 |
| 21 def tearDown(self): |
| 22 testutils.remove_project(self.project) |
| 23 super(PyCoreTest, self).tearDown() |
| 24 |
| 25 def test_simple_module(self): |
| 26 testutils.create_module(self.project, 'mod') |
| 27 result = self.project.get_module('mod') |
| 28 self.assertEquals(get_base_type('Module'), result.type) |
| 29 self.assertEquals(0, len(result.get_attributes())) |
| 30 |
| 31 def test_nested_modules(self): |
| 32 pkg = testutils.create_package(self.project, 'pkg') |
| 33 mod = testutils.create_module(self.project, 'mod', pkg) # noqa |
| 34 package = self.project.get_module('pkg') |
| 35 self.assertEquals(get_base_type('Module'), package.get_type()) |
| 36 self.assertEquals(1, len(package.get_attributes())) |
| 37 module = package['mod'].get_object() |
| 38 self.assertEquals(get_base_type('Module'), module.get_type()) |
| 39 |
| 40 def test_package(self): |
| 41 pkg = testutils.create_package(self.project, 'pkg') |
| 42 mod = testutils.create_module(self.project, 'mod', pkg) # noqa |
| 43 result = self.project.get_module('pkg') |
| 44 self.assertEquals(get_base_type('Module'), result.type) |
| 45 |
| 46 def test_simple_class(self): |
| 47 mod = testutils.create_module(self.project, 'mod') |
| 48 mod.write('class SampleClass(object):\n pass\n') |
| 49 mod_element = self.project.get_module('mod') |
| 50 result = mod_element['SampleClass'].get_object() |
| 51 self.assertEquals(get_base_type('Type'), result.get_type()) |
| 52 |
| 53 def test_simple_function(self): |
| 54 mod = testutils.create_module(self.project, 'mod') |
| 55 mod.write('def sample_function():\n pass\n') |
| 56 mod_element = self.project.get_module('mod') |
| 57 result = mod_element['sample_function'].get_object() |
| 58 self.assertEquals(get_base_type('Function'), result.get_type()) |
| 59 |
| 60 def test_class_methods(self): |
| 61 mod = testutils.create_module(self.project, 'mod') |
| 62 code = 'class SampleClass(object):\n' \ |
| 63 ' def sample_method(self):\n' \ |
| 64 ' pass\n' |
| 65 mod.write(code) |
| 66 mod_element = self.project.get_module('mod') |
| 67 sample_class = mod_element['SampleClass'].get_object() |
| 68 self.assertTrue('sample_method' in sample_class) |
| 69 method = sample_class['sample_method'].get_object() |
| 70 self.assertEquals(get_base_type('Function'), method.get_type()) |
| 71 |
| 72 def test_global_variables(self): |
| 73 mod = testutils.create_module(self.project, 'mod') |
| 74 mod.write('var = 10') |
| 75 mod_element = self.project.get_module('mod') |
| 76 result = mod_element['var'] # noqa |
| 77 |
| 78 def test_class_variables(self): |
| 79 mod = testutils.create_module(self.project, 'mod') |
| 80 mod.write('class SampleClass(object):\n var = 10\n') |
| 81 mod_element = self.project.get_module('mod') |
| 82 sample_class = mod_element['SampleClass'].get_object() |
| 83 var = sample_class['var'] # noqa |
| 84 |
| 85 def test_class_attributes_set_in_init(self): |
| 86 mod = testutils.create_module(self.project, 'mod') |
| 87 mod.write('class C(object):\n' |
| 88 ' def __init__(self):\n self.var = 20\n') |
| 89 mod_element = self.project.get_module('mod') |
| 90 sample_class = mod_element['C'].get_object() |
| 91 var = sample_class['var'] # noqa |
| 92 |
| 93 def test_class_attributes_set_in_init_overwriting_a_defined(self): |
| 94 mod = testutils.create_module(self.project, 'mod') |
| 95 code = 'class C(object):\n' \ |
| 96 ' def __init__(self):\n' \ |
| 97 ' self.f = 20\n' \ |
| 98 ' def f():\n' \ |
| 99 ' pass\n' |
| 100 mod.write(code) |
| 101 mod_element = self.project.get_module('mod') |
| 102 sample_class = mod_element['C'].get_object() |
| 103 f = sample_class['f'].get_object() |
| 104 self.assertTrue(isinstance(f, AbstractFunction)) |
| 105 |
| 106 def test_classes_inside_other_classes(self): |
| 107 mod = testutils.create_module(self.project, 'mod') |
| 108 code = 'class SampleClass(object):\n' \ |
| 109 ' class InnerClass(object):\n' \ |
| 110 ' pass\n\n' |
| 111 mod.write(code) |
| 112 mod_element = self.project.get_module('mod') |
| 113 sample_class = mod_element['SampleClass'].get_object() |
| 114 var = sample_class['InnerClass'].get_object() |
| 115 self.assertEquals(get_base_type('Type'), var.get_type()) |
| 116 |
| 117 def test_non_existent_module(self): |
| 118 with self.assertRaises(exceptions.ModuleNotFoundError): |
| 119 self.project.get_module('doesnotexistmodule') |
| 120 |
| 121 def test_imported_names(self): |
| 122 testutils.create_module(self.project, 'mod1') |
| 123 mod = testutils.create_module(self.project, 'mod2') |
| 124 mod.write('import mod1\n') |
| 125 module = self.project.get_module('mod2') |
| 126 imported_sys = module['mod1'].get_object() |
| 127 self.assertEquals(get_base_type('Module'), imported_sys.get_type()) |
| 128 |
| 129 def test_imported_as_names(self): |
| 130 testutils.create_module(self.project, 'mod1') |
| 131 mod = testutils.create_module(self.project, 'mod2') |
| 132 mod.write('import mod1 as my_import\n') |
| 133 module = self.project.get_module('mod2') |
| 134 imported_mod = module['my_import'].get_object() |
| 135 self.assertEquals(get_base_type('Module'), imported_mod.get_type()) |
| 136 |
| 137 def test_get_string_module(self): |
| 138 mod = libutils.get_string_module( |
| 139 self.project, 'class Sample(object):\n pass\n') |
| 140 sample_class = mod['Sample'].get_object() |
| 141 self.assertEquals(get_base_type('Type'), sample_class.get_type()) |
| 142 |
| 143 def test_get_string_module_with_extra_spaces(self): |
| 144 mod = libutils.get_string_module( |
| 145 self.project, 'a = 10\n ') # noqa |
| 146 |
| 147 def test_parameter_info_for_functions(self): |
| 148 code = 'def func(param1, param2=10, *param3, **param4):\n pass' |
| 149 mod = libutils.get_string_module(self.project, code) |
| 150 sample_function = mod['func'] |
| 151 self.assertEquals(['param1', 'param2', 'param3', 'param4'], |
| 152 sample_function.get_object().get_param_names()) |
| 153 |
| 154 # FIXME: Not found modules |
| 155 def xxx_test_not_found_module_is_module(self): |
| 156 mod = libutils.get_string_module( |
| 157 self.project, 'import doesnotexist\n') |
| 158 self.assertEquals(get_base_type('Module'), |
| 159 mod['doesnotexist']. |
| 160 get_object().get_type()) |
| 161 |
| 162 def test_mixing_scopes_and_objects_hierarchy(self): |
| 163 mod = libutils.get_string_module(self.project, 'var = 200\n') |
| 164 scope = mod.get_scope() |
| 165 self.assertTrue('var' in scope.get_names()) |
| 166 |
| 167 def test_inheriting_base_class_attributes(self): |
| 168 code = 'class Base(object):\n' \ |
| 169 ' def method(self):\n' \ |
| 170 ' pass\n' \ |
| 171 'class Derived(Base):\n' \ |
| 172 ' pass\n' |
| 173 mod = libutils.get_string_module(self.project, code) |
| 174 derived = mod['Derived'].get_object() |
| 175 self.assertTrue('method' in derived) |
| 176 self.assertEquals(get_base_type('Function'), |
| 177 derived['method'].get_object().get_type()) |
| 178 |
| 179 def test_inheriting_multiple_base_class_attributes(self): |
| 180 code = 'class Base1(object):\n def method1(self):\n pass\n' \ |
| 181 'class Base2(object):\n def method2(self):\n pass\n' \ |
| 182 'class Derived(Base1, Base2):\n pass\n' |
| 183 mod = libutils.get_string_module(self.project, code) |
| 184 derived = mod['Derived'].get_object() |
| 185 self.assertTrue('method1' in derived) |
| 186 self.assertTrue('method2' in derived) |
| 187 |
| 188 def test_inherit_multiple_base_class_attrs_with_the_same_name(self): |
| 189 code = 'class Base1(object):\n def method(self):\n pass\n' \ |
| 190 'class Base2(object):\n def method(self):\n pass\n' \ |
| 191 'class Derived(Base1, Base2):\n pass\n' |
| 192 mod = libutils.get_string_module(self.project, code) |
| 193 base1 = mod['Base1'].get_object() |
| 194 derived = mod['Derived'].get_object() |
| 195 self.assertEquals(base1['method'].get_object(), |
| 196 derived['method'].get_object()) |
| 197 |
| 198 def test_inheriting_unknown_base_class(self): |
| 199 code = 'class Derived(NotFound):\n' \ |
| 200 ' def f(self):\n' \ |
| 201 ' pass\n' |
| 202 mod = libutils.get_string_module(self.project, code) |
| 203 derived = mod['Derived'].get_object() |
| 204 self.assertTrue('f' in derived) |
| 205 |
| 206 def test_module_creation(self): |
| 207 new_module = testutils.create_module(self.project, 'module') |
| 208 self.assertFalse(new_module.is_folder()) |
| 209 self.assertEquals(self.project.get_resource('module.py'), new_module) |
| 210 |
| 211 def test_packaged_module_creation(self): |
| 212 package = self.project.root.create_folder('package') # noqa |
| 213 new_module = testutils.create_module(self.project, 'package.module') |
| 214 self.assertEquals(self.project.get_resource('package/module.py'), |
| 215 new_module) |
| 216 |
| 217 def test_packaged_module_creation_with_nested_src(self): |
| 218 src = self.project.root.create_folder('src') |
| 219 src.create_folder('pkg') |
| 220 new_module = testutils.create_module(self.project, 'pkg.mod', src) |
| 221 self.assertEquals(self.project.get_resource('src/pkg/mod.py'), |
| 222 new_module) |
| 223 |
| 224 def test_package_creation(self): |
| 225 new_package = testutils.create_package(self.project, 'pkg') |
| 226 self.assertTrue(new_package.is_folder()) |
| 227 self.assertEquals(self.project.get_resource('pkg'), new_package) |
| 228 self.assertEquals(self.project.get_resource('pkg/__init__.py'), |
| 229 new_package.get_child('__init__.py')) |
| 230 |
| 231 def test_nested_package_creation(self): |
| 232 testutils.create_package(self.project, 'pkg1') |
| 233 nested_package = testutils.create_package(self.project, 'pkg1.pkg2') |
| 234 self.assertEquals(self.project.get_resource('pkg1/pkg2'), |
| 235 nested_package) |
| 236 |
| 237 def test_packaged_package_creation_with_nested_src(self): |
| 238 src = self.project.root.create_folder('src') |
| 239 testutils.create_package(self.project, 'pkg1', src) |
| 240 nested_package = testutils.create_package(self.project, 'pkg1.pkg2', |
| 241 src) |
| 242 self.assertEquals(self.project.get_resource('src/pkg1/pkg2'), |
| 243 nested_package) |
| 244 |
| 245 def test_find_module(self): |
| 246 src = self.project.root.create_folder('src') |
| 247 samplemod = testutils.create_module(self.project, 'samplemod', src) |
| 248 found_module = self.project.find_module('samplemod') |
| 249 self.assertEquals(samplemod, found_module) |
| 250 |
| 251 def test_find_nested_module(self): |
| 252 src = self.project.root.create_folder('src') |
| 253 samplepkg = testutils.create_package(self.project, 'samplepkg', src) |
| 254 samplemod = testutils.create_module(self.project, 'samplemod', |
| 255 samplepkg) |
| 256 found_module = self.project.find_module('samplepkg.samplemod') |
| 257 self.assertEquals(samplemod, found_module) |
| 258 |
| 259 def test_find_multiple_module(self): |
| 260 src = self.project.root.create_folder('src') |
| 261 samplemod1 = testutils.create_module(self.project, 'samplemod', src) |
| 262 samplemod2 = testutils.create_module(self.project, 'samplemod') |
| 263 test = self.project.root.create_folder('test') |
| 264 samplemod3 = testutils.create_module(self.project, 'samplemod', test) |
| 265 found_module = self.project.find_module('samplemod') |
| 266 self.assertTrue(samplemod1 == found_module or |
| 267 samplemod2 == found_module or |
| 268 samplemod3 == found_module) |
| 269 |
| 270 def test_find_module_packages(self): |
| 271 src = self.project.root |
| 272 samplepkg = testutils.create_package(self.project, 'samplepkg', src) |
| 273 found_module = self.project.find_module('samplepkg') |
| 274 self.assertEquals(samplepkg, found_module) |
| 275 |
| 276 def test_find_module_when_module_and_package_with_the_same_name(self): |
| 277 src = self.project.root |
| 278 testutils.create_module(self.project, 'sample', src) |
| 279 samplepkg = testutils.create_package(self.project, 'sample', src) |
| 280 found_module = self.project.find_module('sample') |
| 281 self.assertEquals(samplepkg, found_module) |
| 282 |
| 283 def test_source_folders_preference(self): |
| 284 testutils.create_package(self.project, 'pkg1') |
| 285 testutils.create_package(self.project, 'pkg1.src2') |
| 286 lost = testutils.create_module(self.project, 'pkg1.src2.lost') |
| 287 self.assertEqual(self.project.find_module('lost'), None) |
| 288 self.project.close() |
| 289 from rope.base.project import Project |
| 290 self.project = Project(self.project.address, |
| 291 source_folders=['pkg1/src2']) |
| 292 self.assertEqual(self.project.find_module('lost'), lost) |
| 293 |
| 294 def test_get_pyname_definition_location(self): |
| 295 mod = libutils.get_string_module(self.project, 'a_var = 20\n') |
| 296 a_var = mod['a_var'] |
| 297 self.assertEquals((mod, 1), a_var.get_definition_location()) |
| 298 |
| 299 def test_get_pyname_definition_location_functions(self): |
| 300 mod = libutils.get_string_module( |
| 301 self.project, 'def a_func():\n pass\n') |
| 302 a_func = mod['a_func'] |
| 303 self.assertEquals((mod, 1), a_func.get_definition_location()) |
| 304 |
| 305 def test_get_pyname_definition_location_class(self): |
| 306 code = 'class AClass(object):\n pass\n\n' |
| 307 mod = libutils.get_string_module(self.project, code) |
| 308 a_class = mod['AClass'] |
| 309 self.assertEquals((mod, 1), a_class.get_definition_location()) |
| 310 |
| 311 def test_get_pyname_definition_location_local_variables(self): |
| 312 mod = libutils.get_string_module( |
| 313 self.project, 'def a_func():\n a_var = 10\n') |
| 314 a_func_scope = mod.get_scope().get_scopes()[0] |
| 315 a_var = a_func_scope['a_var'] |
| 316 self.assertEquals((mod, 2), a_var.get_definition_location()) |
| 317 |
| 318 def test_get_pyname_definition_location_reassigning(self): |
| 319 mod = libutils.get_string_module( |
| 320 self.project, 'a_var = 20\na_var=30\n') |
| 321 a_var = mod['a_var'] |
| 322 self.assertEquals((mod, 1), a_var.get_definition_location()) |
| 323 |
| 324 def test_get_pyname_definition_location_importes(self): |
| 325 testutils.create_module(self.project, 'mod') |
| 326 mod = libutils.get_string_module(self.project, 'import mod\n') |
| 327 imported_module = self.project.get_module('mod') |
| 328 module_pyname = mod['mod'] |
| 329 self.assertEquals((imported_module, 1), |
| 330 module_pyname.get_definition_location()) |
| 331 |
| 332 def test_get_pyname_definition_location_imports(self): |
| 333 module_resource = testutils.create_module(self.project, 'mod') |
| 334 module_resource.write('\ndef a_func():\n pass\n') |
| 335 imported_module = self.project.get_module('mod') |
| 336 mod = libutils.get_string_module( |
| 337 self.project, 'from mod import a_func\n') |
| 338 a_func = mod['a_func'] |
| 339 self.assertEquals((imported_module, 2), |
| 340 a_func.get_definition_location()) |
| 341 |
| 342 def test_get_pyname_definition_location_parameters(self): |
| 343 code = 'def a_func(param1, param2):\n a_var = param\n' |
| 344 mod = libutils.get_string_module(self.project, code) |
| 345 a_func_scope = mod.get_scope().get_scopes()[0] |
| 346 param1 = a_func_scope['param1'] |
| 347 self.assertEquals((mod, 1), param1.get_definition_location()) |
| 348 param2 = a_func_scope['param2'] |
| 349 self.assertEquals((mod, 1), param2.get_definition_location()) |
| 350 |
| 351 def test_module_get_resource(self): |
| 352 module_resource = testutils.create_module(self.project, 'mod') |
| 353 module = self.project.get_module('mod') |
| 354 self.assertEquals(module_resource, module.get_resource()) |
| 355 string_module = libutils.get_string_module( |
| 356 self.project, 'from mod import a_func\n') |
| 357 self.assertEquals(None, string_module.get_resource()) |
| 358 |
| 359 def test_get_pyname_definition_location_class2(self): |
| 360 code = 'class AClass(object):\n' \ |
| 361 ' def __init__(self):\n' \ |
| 362 ' self.an_attr = 10\n' |
| 363 mod = libutils.get_string_module(self.project, code) |
| 364 a_class = mod['AClass'].get_object() |
| 365 an_attr = a_class['an_attr'] |
| 366 self.assertEquals((mod, 3), an_attr.get_definition_location()) |
| 367 |
| 368 def test_import_not_found_module_get_definition_location(self): |
| 369 mod = libutils.get_string_module( |
| 370 self.project, 'import doesnotexist\n') |
| 371 does_not_exist = mod['doesnotexist'] |
| 372 self.assertEquals((None, None), |
| 373 does_not_exist.get_definition_location()) |
| 374 |
| 375 def test_from_not_found_module_get_definition_location(self): |
| 376 mod = libutils.get_string_module( |
| 377 self.project, 'from doesnotexist import Sample\n') |
| 378 sample = mod['Sample'] |
| 379 self.assertEquals((None, None), sample.get_definition_location()) |
| 380 |
| 381 def test_from_package_import_module_get_definition_location(self): |
| 382 pkg = testutils.create_package(self.project, 'pkg') |
| 383 testutils.create_module(self.project, 'mod', pkg) |
| 384 pkg_mod = self.project.get_module('pkg.mod') |
| 385 mod = libutils.get_string_module( |
| 386 self.project, 'from pkg import mod\n') |
| 387 imported_mod = mod['mod'] |
| 388 self.assertEquals((pkg_mod, 1), |
| 389 imported_mod.get_definition_location()) |
| 390 |
| 391 def test_get_module_for_defined_pyobjects(self): |
| 392 mod = libutils.get_string_module( |
| 393 self.project, 'class AClass(object):\n pass\n') |
| 394 a_class = mod['AClass'].get_object() |
| 395 self.assertEquals(mod, a_class.get_module()) |
| 396 |
| 397 def test_get_definition_location_for_packages(self): |
| 398 testutils.create_package(self.project, 'pkg') |
| 399 init_module = self.project.get_module('pkg.__init__') |
| 400 mod = libutils.get_string_module(self.project, 'import pkg\n') |
| 401 pkg_pyname = mod['pkg'] |
| 402 self.assertEquals((init_module, 1), |
| 403 pkg_pyname.get_definition_location()) |
| 404 |
| 405 def test_get_definition_location_for_filtered_packages(self): |
| 406 pkg = testutils.create_package(self.project, 'pkg') |
| 407 testutils.create_module(self.project, 'mod', pkg) |
| 408 init_module = self.project.get_module('pkg.__init__') |
| 409 mod = libutils.get_string_module(self.project, 'import pkg.mod') |
| 410 pkg_pyname = mod['pkg'] |
| 411 self.assertEquals((init_module, 1), |
| 412 pkg_pyname.get_definition_location()) |
| 413 |
| 414 def test_out_of_project_modules(self): |
| 415 scope = libutils.get_string_scope( |
| 416 self.project, 'import rope.base.project as project\n') |
| 417 imported_module = scope['project'].get_object() |
| 418 self.assertTrue('Project' in imported_module) |
| 419 |
| 420 def test_file_encoding_reading(self): |
| 421 contents = u'# -*- coding: utf-8 -*-\n' + \ |
| 422 u'#\N{LATIN SMALL LETTER I WITH DIAERESIS}\n' |
| 423 mod = testutils.create_module(self.project, 'mod') |
| 424 mod.write(contents) |
| 425 self.project.get_module('mod') |
| 426 |
| 427 def test_global_keyword(self): |
| 428 contents = 'a_var = 1\ndef a_func():\n global a_var\n' |
| 429 mod = libutils.get_string_module(self.project, contents) |
| 430 global_var = mod['a_var'] |
| 431 func_scope = mod['a_func'].get_object().get_scope() |
| 432 local_var = func_scope['a_var'] |
| 433 self.assertEquals(global_var, local_var) |
| 434 |
| 435 def test_not_leaking_for_vars_inside_parent_scope(self): |
| 436 mod = testutils.create_module(self.project, 'mod') |
| 437 code = 'class C(object):\n' \ |
| 438 ' def f(self):\n' \ |
| 439 ' for my_var1, my_var2 in []:\n' \ |
| 440 ' pass\n' |
| 441 mod.write(code) |
| 442 pymod = self.pycore.resource_to_pyobject(mod) |
| 443 c_class = pymod['C'].get_object() |
| 444 self.assertFalse('my_var1' in c_class) |
| 445 self.assertFalse('my_var2' in c_class) |
| 446 |
| 447 def test_not_leaking_for_vars_inside_parent_scope2(self): |
| 448 mod = testutils.create_module(self.project, 'mod') |
| 449 code = 'class C(object):\n' \ |
| 450 ' def f(self):\n' \ |
| 451 ' for my_var in []:\n' \ |
| 452 ' pass\n' |
| 453 mod.write(code) |
| 454 pymod = self.pycore.resource_to_pyobject(mod) |
| 455 c_class = pymod['C'].get_object() |
| 456 self.assertFalse('my_var' in c_class) |
| 457 |
| 458 def test_variables_defined_in_excepts(self): |
| 459 mod = testutils.create_module(self.project, 'mod') |
| 460 code = 'try:\n' \ |
| 461 ' myvar1 = 1\n' \ |
| 462 'except:\n' \ |
| 463 ' myvar2 = 1\n' \ |
| 464 'finally:\n' \ |
| 465 ' myvar3 = 1\n' |
| 466 mod.write(code) |
| 467 pymod = self.pycore.resource_to_pyobject(mod) |
| 468 self.assertTrue('myvar1' in pymod) |
| 469 self.assertTrue('myvar2' in pymod) |
| 470 self.assertTrue('myvar3' in pymod) |
| 471 |
| 472 def test_not_leaking_tuple_assigned_names_inside_parent_scope(self): |
| 473 mod = testutils.create_module(self.project, 'mod') |
| 474 code = 'class C(object):\n' \ |
| 475 ' def f(self):\n' \ |
| 476 ' var1, var2 = range(2)\n' |
| 477 mod.write(code) |
| 478 pymod = self.pycore.resource_to_pyobject(mod) |
| 479 c_class = pymod['C'].get_object() |
| 480 self.assertFalse('var1' in c_class) |
| 481 |
| 482 @testutils.run_only_for_25 |
| 483 def test_with_statement_variables(self): |
| 484 code = 'import threading\nwith threading.lock() as var: pass\n' |
| 485 if sys.version_info < (2, 6, 0): |
| 486 code = 'from __future__ import with_statement\n' + code |
| 487 pymod = libutils.get_string_module(self.project, code) |
| 488 self.assertTrue('var' in pymod) |
| 489 |
| 490 @testutils.run_only_for_25 |
| 491 def test_with_statement_variables_and_tuple_assignment(self): |
| 492 code = 'class A(object):\n' \ |
| 493 ' def __enter__(self):' \ |
| 494 ' return (1, 2)\n' \ |
| 495 ' def __exit__(self, type, value, tb):\n' \ |
| 496 ' pass\n'\ |
| 497 'with A() as (a, b):\n' \ |
| 498 ' pass\n' |
| 499 if sys.version_info < (2, 6, 0): |
| 500 code = 'from __future__ import with_statement\n' + code |
| 501 pymod = libutils.get_string_module(self.project, code) |
| 502 self.assertTrue('a' in pymod) |
| 503 self.assertTrue('b' in pymod) |
| 504 |
| 505 @testutils.run_only_for_25 |
| 506 def test_with_statement_variable_type(self): |
| 507 code = 'class A(object):\n' \ |
| 508 ' def __enter__(self):\n' \ |
| 509 ' return self\n'\ |
| 510 ' def __exit__(self, type, value, tb):\n' \ |
| 511 ' pass\n' \ |
| 512 'with A() as var:\n' \ |
| 513 ' pass\n' |
| 514 if sys.version_info < (2, 6, 0): |
| 515 code = 'from __future__ import with_statement\n' + code |
| 516 pymod = libutils.get_string_module(self.project, code) |
| 517 a_class = pymod['A'].get_object() |
| 518 var = pymod['var'].get_object() |
| 519 self.assertEquals(a_class, var.get_type()) |
| 520 |
| 521 @testutils.run_only_for_25 |
| 522 def test_with_statement_with_no_vars(self): |
| 523 code = 'with open("file"): pass\n' |
| 524 if sys.version_info < (2, 6, 0): |
| 525 code = 'from __future__ import with_statement\n' + code |
| 526 pymod = libutils.get_string_module(self.project, code) |
| 527 pymod.get_attributes() |
| 528 |
| 529 def test_check_for_else_block(self): |
| 530 code = 'for i in range(10):\n' \ |
| 531 ' pass\n' \ |
| 532 'else:\n' \ |
| 533 ' myvar = 1\n' |
| 534 mod = libutils.get_string_module(self.project, code) |
| 535 a_var = mod['myvar'] |
| 536 self.assertEquals((mod, 4), a_var.get_definition_location()) |
| 537 |
| 538 def test_check_names_defined_in_whiles(self): |
| 539 mod = libutils.get_string_module( |
| 540 self.project, 'while False:\n myvar = 1\n') |
| 541 a_var = mod['myvar'] |
| 542 self.assertEquals((mod, 2), a_var.get_definition_location()) |
| 543 |
| 544 def test_get_definition_location_in_tuple_assnames(self): |
| 545 mod = libutils.get_string_module( |
| 546 self.project, 'def f(x):\n x.z, a = range(2)\n') |
| 547 x = mod['f'].get_object().get_scope()['x'] |
| 548 a = mod['f'].get_object().get_scope()['a'] |
| 549 self.assertEquals((mod, 1), x.get_definition_location()) |
| 550 self.assertEquals((mod, 2), a.get_definition_location()) |
| 551 |
| 552 def test_syntax_errors_in_code(self): |
| 553 with self.assertRaises(exceptions.ModuleSyntaxError): |
| 554 libutils.get_string_module(self.project, 'xyx print\n') |
| 555 |
| 556 def test_holding_error_location_information(self): |
| 557 try: |
| 558 libutils.get_string_module(self.project, 'xyx print\n') |
| 559 except exceptions.ModuleSyntaxError as e: |
| 560 self.assertEquals(1, e.lineno) |
| 561 |
| 562 def test_no_exceptions_on_module_encoding_problems(self): |
| 563 mod = testutils.create_module(self.project, 'mod') |
| 564 contents = '\nsdsdsd\n\xa9\n' |
| 565 file = open(mod.real_path, 'wb') |
| 566 file.write(contents) |
| 567 file.close() |
| 568 mod.read() |
| 569 |
| 570 def test_syntax_errors_when_cannot_decode_file2(self): |
| 571 mod = testutils.create_module(self.project, 'mod') |
| 572 contents = '\n\xa9\n' |
| 573 file = open(mod.real_path, 'wb') |
| 574 file.write(contents) |
| 575 file.close() |
| 576 with self.assertRaises(exceptions.ModuleSyntaxError): |
| 577 self.pycore.resource_to_pyobject(mod) |
| 578 |
| 579 def test_syntax_errors_when_null_bytes(self): |
| 580 mod = testutils.create_module(self.project, 'mod') |
| 581 contents = '\n\x00\n' |
| 582 file = open(mod.real_path, 'wb') |
| 583 file.write(contents) |
| 584 file.close() |
| 585 with self.assertRaises(exceptions.ModuleSyntaxError): |
| 586 self.pycore.resource_to_pyobject(mod) |
| 587 |
| 588 def test_syntax_errors_when_bad_strs(self): |
| 589 mod = testutils.create_module(self.project, 'mod') |
| 590 contents = '\n"\\x0"\n' |
| 591 file = open(mod.real_path, 'wb') |
| 592 file.write(contents) |
| 593 file.close() |
| 594 with self.assertRaises(exceptions.ModuleSyntaxError): |
| 595 self.pycore.resource_to_pyobject(mod) |
| 596 |
| 597 def test_not_reaching_maximum_recursions_with_from_star_imports(self): |
| 598 mod1 = testutils.create_module(self.project, 'mod1') |
| 599 mod2 = testutils.create_module(self.project, 'mod2') |
| 600 mod1.write('from mod2 import *\n') |
| 601 mod2.write('from mod1 import *\n') |
| 602 pymod1 = self.pycore.resource_to_pyobject(mod1) |
| 603 pymod1.get_attributes() |
| 604 |
| 605 def test_not_reaching_maximum_recursions_when_importing_variables(self): |
| 606 mod1 = testutils.create_module(self.project, 'mod1') |
| 607 mod2 = testutils.create_module(self.project, 'mod2') |
| 608 mod1.write('from mod2 import myvar\n') |
| 609 mod2.write('from mod1 import myvar\n') |
| 610 pymod1 = self.pycore.resource_to_pyobject(mod1) |
| 611 pymod1['myvar'].get_object() |
| 612 |
| 613 def test_not_reaching_maximum_recursions_when_importing_variables2(self): |
| 614 mod1 = testutils.create_module(self.project, 'mod1') |
| 615 mod1.write('from mod1 import myvar\n') |
| 616 pymod1 = self.pycore.resource_to_pyobject(mod1) |
| 617 pymod1['myvar'].get_object() |
| 618 |
| 619 def test_pyobject_equality_should_compare_types(self): |
| 620 mod1 = testutils.create_module(self.project, 'mod1') |
| 621 mod1.write('var1 = ""\nvar2 = ""\n') |
| 622 pymod1 = self.pycore.resource_to_pyobject(mod1) |
| 623 self.assertEquals(pymod1['var1'].get_object(), |
| 624 pymod1['var2'].get_object()) |
| 625 |
| 626 |
| 627 class PyCoreInProjectsTest(unittest.TestCase): |
| 628 |
| 629 def setUp(self): |
| 630 super(self.__class__, self).setUp() |
| 631 self.project = testutils.sample_project() |
| 632 self.pycore = self.project.pycore |
| 633 samplemod = testutils.create_module(self.project, 'samplemod') |
| 634 code = 'class SampleClass(object):\n' \ |
| 635 ' def sample_method():\n' \ |
| 636 ' pass\n\n' \ |
| 637 'def sample_func():\n' \ |
| 638 ' pass\n' \ |
| 639 'sample_var = 10\n\n' \ |
| 640 'def _underlined_func():\n' \ |
| 641 ' pass\n\n' |
| 642 samplemod.write(code) |
| 643 package = testutils.create_package(self.project, 'package') |
| 644 testutils.create_module(self.project, 'nestedmod', package) |
| 645 |
| 646 def tearDown(self): |
| 647 testutils.remove_project(self.project) |
| 648 super(self.__class__, self).tearDown() |
| 649 |
| 650 def test_simple_import(self): |
| 651 mod = libutils.get_string_module( |
| 652 self.project, 'import samplemod\n') |
| 653 samplemod = mod['samplemod'].get_object() |
| 654 self.assertEquals(get_base_type('Module'), samplemod.get_type()) |
| 655 |
| 656 def test_from_import_class(self): |
| 657 mod = libutils.get_string_module( |
| 658 self.project, 'from samplemod import SampleClass\n') |
| 659 result = mod['SampleClass'].get_object() |
| 660 self.assertEquals(get_base_type('Type'), result.get_type()) |
| 661 self.assertTrue('sample_func' not in mod.get_attributes()) |
| 662 |
| 663 def test_from_import_star(self): |
| 664 mod = libutils.get_string_module( |
| 665 self.project, 'from samplemod import *\n') |
| 666 self.assertEquals(get_base_type('Type'), |
| 667 mod['SampleClass'].get_object().get_type()) |
| 668 self.assertEquals(get_base_type('Function'), |
| 669 mod['sample_func'].get_object().get_type()) |
| 670 self.assertTrue(mod['sample_var'] is not None) |
| 671 |
| 672 def test_from_import_star_overwriting(self): |
| 673 code = 'from samplemod import *\n' \ |
| 674 'class SampleClass(object):\n pass\n' |
| 675 mod = libutils.get_string_module(self.project, code) |
| 676 samplemod = self.project.get_module('samplemod') |
| 677 sample_class = samplemod['SampleClass'].get_object() |
| 678 self.assertNotEquals(sample_class, |
| 679 mod.get_attributes()['SampleClass'].get_object()) |
| 680 |
| 681 def test_from_import_star_not_imporing_underlined(self): |
| 682 mod = libutils.get_string_module( |
| 683 self.project, 'from samplemod import *') |
| 684 self.assertTrue('_underlined_func' not in mod.get_attributes()) |
| 685 |
| 686 def test_from_import_star_imports_in_functions(self): |
| 687 mod = libutils.get_string_module( |
| 688 self.project, 'def f():\n from os import *\n') |
| 689 mod['f'].get_object().get_scope().get_names() |
| 690 |
| 691 def test_from_package_import_mod(self): |
| 692 mod = libutils.get_string_module( |
| 693 self.project, 'from package import nestedmod\n') |
| 694 self.assertEquals(get_base_type('Module'), |
| 695 mod['nestedmod'].get_object().get_type()) |
| 696 |
| 697 # XXX: Deciding to import everything on import start from packages |
| 698 def xxx_test_from_package_import_star(self): |
| 699 mod = libutils.get_string_module( |
| 700 self.project, 'from package import *\n') |
| 701 self.assertTrue('nestedmod' not in mod.get_attributes()) |
| 702 |
| 703 def test_unknown_when_module_cannot_be_found(self): |
| 704 mod = libutils.get_string_module( |
| 705 self.project, 'from doesnotexist import nestedmod\n') |
| 706 self.assertTrue('nestedmod' in mod) |
| 707 |
| 708 def test_from_import_function(self): |
| 709 code = 'def f():\n from samplemod import SampleClass\n' |
| 710 scope = libutils.get_string_scope(self.project, code) |
| 711 self.assertEquals(get_base_type('Type'), |
| 712 scope.get_scopes()[0]['SampleClass']. |
| 713 get_object().get_type()) |
| 714 |
| 715 def test_circular_imports(self): |
| 716 mod1 = testutils.create_module(self.project, 'mod1') |
| 717 mod2 = testutils.create_module(self.project, 'mod2') |
| 718 mod1.write('import mod2\n') |
| 719 mod2.write('import mod1\n') |
| 720 self.project.get_module('mod1') |
| 721 |
| 722 def test_circular_imports2(self): |
| 723 mod1 = testutils.create_module(self.project, 'mod1') |
| 724 mod2 = testutils.create_module(self.project, 'mod2') |
| 725 mod1.write( |
| 726 'from mod2 import Sample2\nclass Sample1(object):\n pass\n') |
| 727 mod2.write( |
| 728 'from mod1 import Sample1\nclass Sample2(object):\n pass\n') |
| 729 self.project.get_module('mod1').get_attributes() |
| 730 |
| 731 def test_multi_dot_imports(self): |
| 732 pkg = testutils.create_package(self.project, 'pkg') |
| 733 pkg_mod = testutils.create_module(self.project, 'mod', pkg) |
| 734 pkg_mod.write('def sample_func():\n pass\n') |
| 735 mod = libutils.get_string_module(self.project, 'import pkg.mod\n') |
| 736 self.assertTrue('pkg' in mod) |
| 737 self.assertTrue('sample_func' in mod['pkg'].get_object()['mod']. |
| 738 get_object()) |
| 739 |
| 740 def test_multi_dot_imports2(self): |
| 741 pkg = testutils.create_package(self.project, 'pkg') |
| 742 testutils.create_module(self.project, 'mod1', pkg) |
| 743 testutils.create_module(self.project, 'mod2', pkg) |
| 744 mod = libutils.get_string_module( |
| 745 self.project, 'import pkg.mod1\nimport pkg.mod2\n') |
| 746 package = mod['pkg'].get_object() |
| 747 self.assertEquals(2, len(package.get_attributes())) |
| 748 self.assertTrue('mod1' in package and |
| 749 'mod2' in package) |
| 750 |
| 751 def test_multi_dot_imports3(self): |
| 752 pkg1 = testutils.create_package(self.project, 'pkg1') |
| 753 pkg2 = testutils.create_package(self.project, 'pkg2', pkg1) |
| 754 testutils.create_module(self.project, 'mod1', pkg2) |
| 755 testutils.create_module(self.project, 'mod2', pkg2) |
| 756 code = 'import pkg1.pkg2.mod1\nimport pkg1.pkg2.mod2\n' |
| 757 mod = libutils.get_string_module(self.project, code) |
| 758 package1 = mod['pkg1'].get_object() |
| 759 package2 = package1['pkg2'].get_object() |
| 760 self.assertEquals(2, len(package2.get_attributes())) |
| 761 self.assertTrue('mod1' in package2 and 'mod2' in package2) |
| 762 |
| 763 def test_multi_dot_imports_as(self): |
| 764 pkg = testutils.create_package(self.project, 'pkg') |
| 765 mod1 = testutils.create_module(self.project, 'mod1', pkg) |
| 766 mod1.write('def f():\n pass\n') |
| 767 mod = libutils.get_string_module( |
| 768 self.project, 'import pkg.mod1 as mod1\n') |
| 769 module = mod['mod1'].get_object() |
| 770 self.assertTrue('f' in module) |
| 771 |
| 772 # TODO: not showing unimported names as attributes of packages |
| 773 def xxx_test_from_package_import_package(self): |
| 774 pkg1 = testutils.create_package(self.project, 'pkg1') |
| 775 pkg2 = testutils.create_package(self.project, 'pkg2', pkg1) |
| 776 testutils.create_module(self.project, 'mod', pkg2) |
| 777 mod = libutils.get_string_module( |
| 778 self.project, 'from pkg1 import pkg2\n') |
| 779 package = mod['pkg2'] |
| 780 self.assertEquals(0, len(package.get_attributes())) |
| 781 |
| 782 def test_invalidating_cache_after_resource_change(self): |
| 783 module = testutils.create_module(self.project, 'mod') |
| 784 module.write('import sys\n') |
| 785 mod1 = self.project.get_module('mod') |
| 786 self.assertTrue('var' not in mod1.get_attributes()) |
| 787 module.write('var = 10\n') |
| 788 mod2 = self.project.get_module('mod') |
| 789 self.assertTrue('var' in mod2) |
| 790 |
| 791 def test_invalidating_cache_after_resource_change_for_init_dot_pys(self): |
| 792 pkg = testutils.create_package(self.project, 'pkg') |
| 793 mod = testutils.create_module(self.project, 'mod') |
| 794 init_dot_py = pkg.get_child('__init__.py') |
| 795 init_dot_py.write('a_var = 10\n') |
| 796 mod.write('import pkg\n') |
| 797 pymod = self.project.get_module('mod') |
| 798 self.assertTrue('a_var' in pymod['pkg'].get_object()) |
| 799 init_dot_py.write('new_var = 10\n') |
| 800 self.assertTrue('a_var' not in |
| 801 pymod['pkg'].get_object().get_attributes()) |
| 802 |
| 803 def test_invalidating_cache_after_rsrc_chng_for_nested_init_dot_pys(self): |
| 804 pkg1 = testutils.create_package(self.project, 'pkg1') |
| 805 pkg2 = testutils.create_package(self.project, 'pkg2', pkg1) |
| 806 mod = testutils.create_module(self.project, 'mod') |
| 807 init_dot_py = pkg2.get_child('__init__.py') |
| 808 init_dot_py.write('a_var = 10\n') |
| 809 mod.write('import pkg1\n') |
| 810 pymod = self.project.get_module('mod') |
| 811 self.assertTrue('a_var' in |
| 812 pymod['pkg1'].get_object()['pkg2'].get_object()) |
| 813 init_dot_py.write('new_var = 10\n') |
| 814 self.assertTrue('a_var' not in |
| 815 pymod['pkg1'].get_object()['pkg2'].get_object()) |
| 816 |
| 817 def test_from_import_nonexistent_module(self): |
| 818 code = 'from doesnotexistmod import DoesNotExistClass\n' |
| 819 mod = libutils.get_string_module(self.project, code) |
| 820 self.assertTrue('DoesNotExistClass' in mod) |
| 821 self.assertEquals(get_base_type('Unknown'), |
| 822 mod['DoesNotExistClass']. |
| 823 get_object().get_type()) |
| 824 |
| 825 def test_from_import_nonexistent_name(self): |
| 826 code = 'from samplemod import DoesNotExistClass\n' |
| 827 mod = libutils.get_string_module(self.project, code) |
| 828 self.assertTrue('DoesNotExistClass' in mod) |
| 829 self.assertEquals(get_base_type('Unknown'), |
| 830 mod['DoesNotExistClass']. |
| 831 get_object().get_type()) |
| 832 |
| 833 def test_not_considering_imported_names_as_sub_scopes(self): |
| 834 code = 'from samplemod import SampleClass\n' |
| 835 scope = libutils.get_string_scope(self.project, code) |
| 836 self.assertEquals(0, len(scope.get_scopes())) |
| 837 |
| 838 def test_not_considering_imported_modules_as_sub_scopes(self): |
| 839 scope = libutils.get_string_scope( |
| 840 self.project, 'import samplemod\n') |
| 841 self.assertEquals(0, len(scope.get_scopes())) |
| 842 |
| 843 def test_inheriting_dotted_base_class(self): |
| 844 code = 'import samplemod\n' \ |
| 845 'class Derived(samplemod.SampleClass):\n' \ |
| 846 ' pass\n' |
| 847 mod = libutils.get_string_module(self.project, code) |
| 848 derived = mod['Derived'].get_object() |
| 849 self.assertTrue('sample_method' in derived) |
| 850 |
| 851 def test_self_in_methods(self): |
| 852 code = 'class Sample(object):\n' \ |
| 853 ' def func(self):\n' \ |
| 854 ' pass\n' |
| 855 scope = libutils.get_string_scope(self.project, code) |
| 856 sample_class = scope['Sample'].get_object() |
| 857 func_scope = scope.get_scopes()[0].get_scopes()[0] |
| 858 self.assertEquals(sample_class, |
| 859 func_scope['self'].get_object().get_type()) |
| 860 self.assertTrue('func' in func_scope['self'].get_object()) |
| 861 |
| 862 def test_none_assignments_in_classes(self): |
| 863 code = 'class C(object):\n' \ |
| 864 ' var = ""\n' \ |
| 865 ' def f(self):\n' \ |
| 866 ' self.var += "".join([])\n' |
| 867 scope = libutils.get_string_scope(self.project, code) |
| 868 c_class = scope['C'].get_object() |
| 869 self.assertTrue('var' in c_class) |
| 870 |
| 871 def test_self_in_methods_with_decorators(self): |
| 872 code = 'class Sample(object):\n' \ |
| 873 ' @staticmethod\n' \ |
| 874 ' def func(self):\n' \ |
| 875 ' pass\n' |
| 876 scope = libutils.get_string_scope(self.project, code) |
| 877 sample_class = scope['Sample'].get_object() |
| 878 func_scope = scope.get_scopes()[0].get_scopes()[0] |
| 879 self.assertNotEquals(sample_class, |
| 880 func_scope['self'].get_object().get_type()) |
| 881 |
| 882 def test_location_of_imports_when_importing(self): |
| 883 mod = testutils.create_module(self.project, 'mod') |
| 884 mod.write('from samplemod import SampleClass\n') |
| 885 scope = libutils.get_string_scope( |
| 886 self.project, 'from mod import SampleClass\n') |
| 887 sample_class = scope['SampleClass'] |
| 888 samplemod = self.project.get_module('samplemod') |
| 889 self.assertEquals((samplemod, 1), |
| 890 sample_class.get_definition_location()) |
| 891 |
| 892 def test_nested_modules(self): |
| 893 pkg = testutils.create_package(self.project, 'pkg') |
| 894 testutils.create_module(self.project, 'mod', pkg) |
| 895 imported_module = self.project.get_module('pkg.mod') |
| 896 scope = libutils.get_string_scope(self.project, 'import pkg.mod\n') |
| 897 mod_pyobject = scope['pkg'].get_object()['mod'] |
| 898 self.assertEquals((imported_module, 1), |
| 899 mod_pyobject.get_definition_location()) |
| 900 |
| 901 def test_reading_init_dot_py(self): |
| 902 pkg = testutils.create_package(self.project, 'pkg') |
| 903 init_dot_py = pkg.get_child('__init__.py') |
| 904 init_dot_py.write('a_var = 1\n') |
| 905 pkg_object = self.project.get_module('pkg') |
| 906 self.assertTrue('a_var' in pkg_object) |
| 907 |
| 908 def test_relative_imports(self): |
| 909 pkg = testutils.create_package(self.project, 'pkg') |
| 910 mod1 = testutils.create_module(self.project, 'mod1', pkg) |
| 911 mod2 = testutils.create_module(self.project, 'mod2', pkg) |
| 912 mod2.write('import mod1\n') |
| 913 mod1_object = self.pycore.resource_to_pyobject(mod1) |
| 914 mod2_object = self.pycore.resource_to_pyobject(mod2) |
| 915 self.assertEquals(mod1_object, |
| 916 mod2_object.get_attributes()['mod1'].get_object()) |
| 917 |
| 918 def test_relative_froms(self): |
| 919 pkg = testutils.create_package(self.project, 'pkg') |
| 920 mod1 = testutils.create_module(self.project, 'mod1', pkg) |
| 921 mod2 = testutils.create_module(self.project, 'mod2', pkg) |
| 922 mod1.write('def a_func():\n pass\n') |
| 923 mod2.write('from mod1 import a_func\n') |
| 924 mod1_object = self.pycore.resource_to_pyobject(mod1) |
| 925 mod2_object = self.pycore.resource_to_pyobject(mod2) |
| 926 self.assertEquals(mod1_object['a_func'].get_object(), |
| 927 mod2_object['a_func'].get_object()) |
| 928 |
| 929 def test_relative_imports_for_string_modules(self): |
| 930 pkg = testutils.create_package(self.project, 'pkg') |
| 931 mod1 = testutils.create_module(self.project, 'mod1', pkg) |
| 932 mod2 = testutils.create_module(self.project, 'mod2', pkg) |
| 933 mod2.write('import mod1\n') |
| 934 mod1_object = self.pycore.resource_to_pyobject(mod1) |
| 935 mod2_object = libutils.get_string_module( |
| 936 self.project, mod2.read(), mod2) |
| 937 self.assertEquals(mod1_object, mod2_object['mod1'].get_object()) |
| 938 |
| 939 def test_relative_imports_for_string_scopes(self): |
| 940 pkg = testutils.create_package(self.project, 'pkg') |
| 941 mod1 = testutils.create_module(self.project, 'mod1', pkg) |
| 942 mod2 = testutils.create_module(self.project, 'mod2', pkg) |
| 943 mod2.write('import mod1\n') |
| 944 mod1_object = self.pycore.resource_to_pyobject(mod1) |
| 945 mod2_scope = libutils.get_string_scope(self.project, mod2.read(), |
| 946 mod2) |
| 947 self.assertEquals(mod1_object, mod2_scope['mod1'].get_object()) |
| 948 |
| 949 @testutils.run_only_for_25 |
| 950 def test_new_style_relative_imports(self): |
| 951 pkg = testutils.create_package(self.project, 'pkg') |
| 952 mod1 = testutils.create_module(self.project, 'mod1', pkg) |
| 953 mod2 = testutils.create_module(self.project, 'mod2', pkg) |
| 954 mod2.write('from . import mod1\n') |
| 955 mod1_object = self.pycore.resource_to_pyobject(mod1) |
| 956 mod2_object = self.pycore.resource_to_pyobject(mod2) |
| 957 self.assertEquals(mod1_object, mod2_object['mod1'].get_object()) |
| 958 |
| 959 @testutils.run_only_for_25 |
| 960 def test_new_style_relative_imports2(self): |
| 961 pkg = testutils.create_package(self.project, 'pkg') |
| 962 mod1 = testutils.create_module(self.project, 'mod1') |
| 963 mod2 = testutils.create_module(self.project, 'mod2', pkg) |
| 964 mod1.write('def a_func():\n pass\n') |
| 965 mod2.write('from ..mod1 import a_func\n') |
| 966 mod1_object = self.pycore.resource_to_pyobject(mod1) |
| 967 mod2_object = self.pycore.resource_to_pyobject(mod2) |
| 968 self.assertEquals(mod1_object['a_func'].get_object(), |
| 969 mod2_object['a_func'].get_object()) |
| 970 |
| 971 def test_invalidating_cache_for_from_imports_after_resource_change(self): |
| 972 mod1 = testutils.create_module(self.project, 'mod1') |
| 973 mod2 = testutils.create_module(self.project, 'mod2') |
| 974 mod2.write('def a_func():\n print(1)\n') |
| 975 mod1.write('from mod2 import a_func\na_func()\n') |
| 976 |
| 977 pymod1 = self.project.get_module('mod1') |
| 978 pymod2 = self.project.get_module('mod2') |
| 979 self.assertEquals(pymod1['a_func'].get_object(), |
| 980 pymod2['a_func'].get_object()) |
| 981 mod2.write(mod2.read() + '\n') |
| 982 pymod2 = self.project.get_module('mod2') |
| 983 self.assertEquals(pymod1['a_func'].get_object(), |
| 984 pymod2['a_func'].get_object()) |
| 985 |
| 986 def test_invalidating_superclasses_after_change(self): |
| 987 mod1 = testutils.create_module(self.project, 'mod1') |
| 988 mod2 = testutils.create_module(self.project, 'mod2') |
| 989 mod1.write('class A(object):\n def func1(self):\n pass\n') |
| 990 mod2.write('import mod1\nclass B(mod1.A):\n pass\n') |
| 991 |
| 992 b_class = self.project.get_module('mod2')['B'].get_object() |
| 993 self.assertTrue('func1' in b_class) |
| 994 |
| 995 mod1.write('class A(object):\n def func2(self):\n pass\n') |
| 996 self.assertTrue('func2' in b_class) |
| 997 |
| 998 def test_caching_pymodule_with_syntax_errors(self): |
| 999 self.project.prefs['ignore_syntax_errors'] = True |
| 1000 self.project.prefs['automatic_soa'] = True |
| 1001 self.project.pycore._init_automatic_soa() |
| 1002 source = 'import sys\nab cd' |
| 1003 mod = testutils.create_module(self.project, 'mod') |
| 1004 mod.write(source) |
| 1005 from rope.contrib import fixsyntax |
| 1006 fixer = fixsyntax.FixSyntax(self.project, source, mod, 10) |
| 1007 pymodule = fixer.get_pymodule() |
| 1008 self.assertTrue(pymodule.source_code.startswith('import sys\npass\n')) |
| 1009 |
| 1010 |
| 1011 class TextChangeDetectorTest(unittest.TestCase): |
| 1012 |
| 1013 def test_trivial_case(self): |
| 1014 detector = _TextChangeDetector('\n', '\n') |
| 1015 self.assertFalse(detector.is_changed(1, 1)) |
| 1016 |
| 1017 def test_one_line_change(self): |
| 1018 detector = _TextChangeDetector('1\n2\n', '1\n3\n') |
| 1019 self.assertFalse(detector.is_changed(1, 1)) |
| 1020 self.assertTrue(detector.is_changed(2, 2)) |
| 1021 |
| 1022 def test_line_expansion(self): |
| 1023 detector = _TextChangeDetector('1\n2\n', '1\n3\n4\n2\n') |
| 1024 self.assertFalse(detector.is_changed(1, 1)) |
| 1025 self.assertFalse(detector.is_changed(2, 2)) |
| 1026 |
| 1027 def test_line_removals(self): |
| 1028 detector = _TextChangeDetector('1\n3\n4\n2\n', '1\n2\n') |
| 1029 self.assertFalse(detector.is_changed(1, 1)) |
| 1030 self.assertTrue(detector.is_changed(2, 3)) |
| 1031 self.assertFalse(detector.is_changed(4, 4)) |
| 1032 |
| 1033 def test_multi_line_checks(self): |
| 1034 detector = _TextChangeDetector('1\n2\n', '1\n3\n') |
| 1035 self.assertTrue(detector.is_changed(1, 2)) |
| 1036 |
| 1037 def test_consume_change(self): |
| 1038 detector = _TextChangeDetector('1\n2\n', '1\n3\n') |
| 1039 self.assertTrue(detector.is_changed(1, 2)) |
| 1040 self.assertTrue(detector.consume_changes(1, 2)) |
| 1041 self.assertFalse(detector.is_changed(1, 2)) |
| 1042 |
| 1043 |
| 1044 class PyCoreProjectConfigsTest(unittest.TestCase): |
| 1045 |
| 1046 def setUp(self): |
| 1047 super(PyCoreProjectConfigsTest, self).setUp() |
| 1048 self.project = None |
| 1049 |
| 1050 def tearDown(self): |
| 1051 if self.project: |
| 1052 testutils.remove_project(self.project) |
| 1053 super(PyCoreProjectConfigsTest, self).tearDown() |
| 1054 |
| 1055 def test_python_files_config(self): |
| 1056 self.project = testutils.sample_project(python_files=['myscript']) |
| 1057 myscript = self.project.root.create_file('myscript') |
| 1058 self.assertTrue(self.project.pycore.is_python_file(myscript)) |
| 1059 |
| 1060 def test_ignore_bad_imports(self): |
| 1061 self.project = testutils.sample_project(ignore_bad_imports=True) |
| 1062 pymod = libutils.get_string_module( |
| 1063 self.project, 'import some_nonexistent_module\n') |
| 1064 self.assertFalse('some_nonexistent_module' in pymod) |
| 1065 |
| 1066 def test_ignore_bad_imports_for_froms(self): |
| 1067 self.project = testutils.sample_project(ignore_bad_imports=True) |
| 1068 pymod = libutils.get_string_module( |
| 1069 self.project, 'from some_nonexistent_module import var\n') |
| 1070 self.assertFalse('var' in pymod) |
| 1071 |
| 1072 def test_reporting_syntax_errors_with_force_errors(self): |
| 1073 self.project = testutils.sample_project(ignore_syntax_errors=True) |
| 1074 mod = testutils.create_module(self.project, 'mod') |
| 1075 mod.write('syntax error ...\n') |
| 1076 with self.assertRaises(exceptions.ModuleSyntaxError): |
| 1077 self.project.pycore.resource_to_pyobject(mod, force_errors=True) |
| 1078 |
| 1079 def test_reporting_syntax_errors_in_strings_with_force_errors(self): |
| 1080 self.project = testutils.sample_project(ignore_syntax_errors=True) |
| 1081 with self.assertRaises(exceptions.ModuleSyntaxError): |
| 1082 libutils.get_string_module( |
| 1083 self.project, 'syntax error ...', force_errors=True) |
| 1084 |
| 1085 def test_not_raising_errors_for_strings_with_ignore_errors(self): |
| 1086 self.project = testutils.sample_project(ignore_syntax_errors=True) |
| 1087 libutils.get_string_module(self.project, 'syntax error ...') |
| 1088 |
| 1089 def test_reporting_syntax_errors_with_force_errors_for_packages(self): |
| 1090 self.project = testutils.sample_project(ignore_syntax_errors=True) |
| 1091 pkg = testutils.create_package(self.project, 'pkg') |
| 1092 pkg.get_child('__init__.py').write('syntax error ...\n') |
| 1093 with self.assertRaises(exceptions.ModuleSyntaxError): |
| 1094 self.project.pycore.resource_to_pyobject(pkg, force_errors=True) |
| 1095 |
| 1096 |
| 1097 def suite(): |
| 1098 result = unittest.TestSuite() |
| 1099 result.addTests(unittest.makeSuite(PyCoreTest)) |
| 1100 result.addTests(unittest.makeSuite(PyCoreInProjectsTest)) |
| 1101 result.addTests(unittest.makeSuite(TextChangeDetectorTest)) |
| 1102 result.addTests(unittest.makeSuite(PyCoreProjectConfigsTest)) |
| 1103 return result |
| 1104 |
| 1105 |
| 1106 if __name__ == '__main__': |
| 1107 unittest.main() |
OLD | NEW |