OLD | NEW |
(Empty) | |
| 1 import os |
| 2 import os.path |
| 3 import shutil |
| 4 try: |
| 5 import unittest2 as unittest |
| 6 except ImportError: |
| 7 import unittest |
| 8 |
| 9 from rope.base.exceptions import RopeError, ResourceNotFoundError |
| 10 from rope.base.fscommands import FileSystemCommands |
| 11 from rope.base.libutils import path_to_resource |
| 12 from rope.base.project import Project, NoProject, _realpath |
| 13 from ropetest import testutils |
| 14 from rope.base.resourceobserver import FilteredResourceObserver |
| 15 |
| 16 |
| 17 class ProjectTest(unittest.TestCase): |
| 18 |
| 19 def setUp(self): |
| 20 unittest.TestCase.setUp(self) |
| 21 self.project = testutils.sample_project(foldername='sampleproject', |
| 22 ropefolder=None) |
| 23 self.project_root = self.project.address |
| 24 self._make_sample_project() |
| 25 self.no_project = NoProject() |
| 26 |
| 27 def _make_sample_project(self): |
| 28 self.sample_file = 'sample_file.txt' |
| 29 self.sample_path = os.path.join(self.project_root, 'sample_file.txt') |
| 30 if not os.path.exists(self.project_root): |
| 31 os.mkdir(self.project_root) |
| 32 self.sample_folder = 'sample_folder' |
| 33 os.mkdir(os.path.join(self.project_root, self.sample_folder)) |
| 34 sample = open(self.sample_path, 'w') |
| 35 sample.write('sample text\n') |
| 36 sample.close() |
| 37 |
| 38 def tearDown(self): |
| 39 testutils.remove_project(self.project) |
| 40 unittest.TestCase.tearDown(self) |
| 41 |
| 42 def test_project_creation(self): |
| 43 self.assertEquals(_realpath(self.project_root), |
| 44 self.project.address) |
| 45 |
| 46 def test_getting_project_file(self): |
| 47 project_file = self.project.get_resource(self.sample_file) |
| 48 self.assertTrue(project_file is not None) |
| 49 |
| 50 def test_project_file_reading(self): |
| 51 projectFile = self.project.get_resource(self.sample_file) |
| 52 self.assertEquals('sample text\n', projectFile.read()) |
| 53 |
| 54 def test_getting_not_existing_project_file(self): |
| 55 with self.assertRaises(ResourceNotFoundError): |
| 56 self.project.get_resource('DoesNotExistFile.txt') |
| 57 |
| 58 def test_writing_in_project_files(self): |
| 59 project_file = self.project.get_resource(self.sample_file) |
| 60 project_file.write('another text\n') |
| 61 self.assertEquals('another text\n', project_file.read()) |
| 62 |
| 63 def test_creating_files(self): |
| 64 project_file = 'newfile.txt' |
| 65 self.project.root.create_file(project_file) |
| 66 newFile = self.project.get_resource(project_file) |
| 67 self.assertTrue(newFile is not None) |
| 68 |
| 69 def test_creating_files_that_already_exist(self): |
| 70 with self.assertRaises(RopeError): |
| 71 self.project.root.create_file(self.sample_file) |
| 72 |
| 73 def test_making_root_folder_if_it_does_not_exist(self): |
| 74 project = Project('sampleproject2') |
| 75 try: |
| 76 self.assertTrue(os.path.exists('sampleproject2') and |
| 77 os.path.isdir('sampleproject2')) |
| 78 finally: |
| 79 testutils.remove_project(project) |
| 80 |
| 81 def test_failure_when_project_root_exists_and_is_a_file(self): |
| 82 project_root = 'sampleproject2' |
| 83 try: |
| 84 open(project_root, 'w').close() |
| 85 with self.assertRaises(RopeError): |
| 86 Project(project_root) |
| 87 finally: |
| 88 testutils.remove_recursively(project_root) |
| 89 |
| 90 def test_creating_folders(self): |
| 91 folderName = 'SampleFolder' |
| 92 self.project.root.create_folder(folderName) |
| 93 folderPath = os.path.join(self.project.address, folderName) |
| 94 self.assertTrue(os.path.exists(folderPath) and |
| 95 os.path.isdir(folderPath)) |
| 96 |
| 97 def test_making_folder_that_already_exists(self): |
| 98 folderName = 'SampleFolder' |
| 99 with self.assertRaises(RopeError): |
| 100 self.project.root.create_folder(folderName) |
| 101 self.project.root.create_folder(folderName) |
| 102 |
| 103 def test_failing_if_creating_folder_while_file_already_exists(self): |
| 104 folderName = 'SampleFolder' |
| 105 with self.assertRaises(RopeError): |
| 106 self.project.root.create_file(folderName) |
| 107 self.project.root.create_folder(folderName) |
| 108 |
| 109 def test_creating_file_inside_folder(self): |
| 110 folder_name = 'sampleFolder' |
| 111 file_name = 'sample2.txt' |
| 112 file_path = folder_name + '/' + file_name |
| 113 parent_folder = self.project.root.create_folder(folder_name) |
| 114 parent_folder.create_file(file_name) |
| 115 file = self.project.get_resource(file_path) |
| 116 file.write('sample notes') |
| 117 self.assertEquals(file_path, file.path) |
| 118 self.assertEquals('sample notes', |
| 119 open(os.path.join(self.project.address, |
| 120 file_path)).read()) |
| 121 |
| 122 def test_failing_when_creating_file_inside_non_existent_folder(self): |
| 123 with self.assertRaises(ResourceNotFoundError): |
| 124 self.project.root.create_file('NonexistentFolder/SomeFile.txt') |
| 125 |
| 126 def test_nested_directories(self): |
| 127 folder_name = 'SampleFolder' |
| 128 parent = self.project.root.create_folder(folder_name) |
| 129 parent.create_folder(folder_name) |
| 130 folder_path = os.path.join(self.project.address, |
| 131 folder_name, folder_name) |
| 132 self.assertTrue(os.path.exists(folder_path) and |
| 133 os.path.isdir(folder_path)) |
| 134 |
| 135 def test_removing_files(self): |
| 136 self.assertTrue(os.path.exists(self.sample_path)) |
| 137 self.project.get_resource(self.sample_file).remove() |
| 138 self.assertFalse(os.path.exists(self.sample_path)) |
| 139 |
| 140 def test_removing_files_invalidating_in_project_resource_pool(self): |
| 141 root_folder = self.project.root |
| 142 my_file = root_folder.create_file('my_file.txt') |
| 143 my_file.remove() |
| 144 self.assertFalse(root_folder.has_child('my_file.txt')) |
| 145 |
| 146 def test_removing_directories(self): |
| 147 self.assertTrue(os.path.exists(os.path.join(self.project.address, |
| 148 self.sample_folder))) |
| 149 self.project.get_resource(self.sample_folder).remove() |
| 150 self.assertFalse(os.path.exists(os.path.join(self.project.address, |
| 151 self.sample_folder))) |
| 152 |
| 153 def test_removing_non_existent_files(self): |
| 154 with self.assertRaises(ResourceNotFoundError): |
| 155 self.project.get_resource('NonExistentFile.txt').remove() |
| 156 |
| 157 def test_removing_nested_files(self): |
| 158 file_name = self.sample_folder + '/sample_file.txt' |
| 159 self.project.root.create_file(file_name) |
| 160 self.project.get_resource(file_name).remove() |
| 161 self.assertTrue(os.path.exists(os.path.join(self.project.address, |
| 162 self.sample_folder))) |
| 163 self.assertTrue(not os.path.exists(os.path.join(self.project.address, |
| 164 file_name))) |
| 165 |
| 166 def test_file_get_name(self): |
| 167 file = self.project.get_resource(self.sample_file) |
| 168 self.assertEquals(self.sample_file, file.name) |
| 169 file_name = 'nestedFile.txt' |
| 170 parent = self.project.get_resource(self.sample_folder) |
| 171 filePath = self.sample_folder + '/' + file_name |
| 172 parent.create_file(file_name) |
| 173 nestedFile = self.project.get_resource(filePath) |
| 174 self.assertEquals(file_name, nestedFile.name) |
| 175 |
| 176 def test_folder_get_name(self): |
| 177 folder = self.project.get_resource(self.sample_folder) |
| 178 self.assertEquals(self.sample_folder, folder.name) |
| 179 |
| 180 def test_file_get_path(self): |
| 181 file = self.project.get_resource(self.sample_file) |
| 182 self.assertEquals(self.sample_file, file.path) |
| 183 fileName = 'nestedFile.txt' |
| 184 parent = self.project.get_resource(self.sample_folder) |
| 185 filePath = self.sample_folder + '/' + fileName |
| 186 parent.create_file(fileName) |
| 187 nestedFile = self.project.get_resource(filePath) |
| 188 self.assertEquals(filePath, nestedFile.path) |
| 189 |
| 190 def test_folder_get_path(self): |
| 191 folder = self.project.get_resource(self.sample_folder) |
| 192 self.assertEquals(self.sample_folder, folder.path) |
| 193 |
| 194 def test_is_folder(self): |
| 195 self.assertTrue(self.project.get_resource( |
| 196 self.sample_folder).is_folder()) |
| 197 self.assertTrue(not self.project.get_resource( |
| 198 self.sample_file).is_folder()) |
| 199 |
| 200 def testget_children(self): |
| 201 children = self.project.get_resource(self.sample_folder).get_children() |
| 202 self.assertEquals([], children) |
| 203 |
| 204 def test_nonempty_get_children(self): |
| 205 file_name = 'nestedfile.txt' |
| 206 filePath = self.sample_folder + '/' + file_name |
| 207 parent = self.project.get_resource(self.sample_folder) |
| 208 parent.create_file(file_name) |
| 209 children = parent.get_children() |
| 210 self.assertEquals(1, len(children)) |
| 211 self.assertEquals(filePath, children[0].path) |
| 212 |
| 213 def test_nonempty_get_children2(self): |
| 214 file_name = 'nestedfile.txt' |
| 215 folder_name = 'nestedfolder.txt' |
| 216 filePath = self.sample_folder + '/' + file_name |
| 217 folderPath = self.sample_folder + '/' + folder_name |
| 218 parent = self.project.get_resource(self.sample_folder) |
| 219 parent.create_file(file_name) |
| 220 parent.create_folder(folder_name) |
| 221 children = parent.get_children() |
| 222 self.assertEquals(2, len(children)) |
| 223 self.assertTrue(filePath == children[0].path or |
| 224 filePath == children[1].path) |
| 225 self.assertTrue(folderPath == children[0].path or |
| 226 folderPath == children[1].path) |
| 227 |
| 228 def test_does_not_fail_for_permission_denied(self): |
| 229 bad_dir = os.path.join(self.sample_folder, "bad_dir") |
| 230 os.makedirs(bad_dir) |
| 231 self.addCleanup(shutil.rmtree, bad_dir) |
| 232 os.chmod(bad_dir, 0o000) |
| 233 try: |
| 234 parent = self.project.get_resource(self.sample_folder) |
| 235 |
| 236 parent.get_children() |
| 237 |
| 238 finally: |
| 239 os.chmod(bad_dir, 0o755) |
| 240 |
| 241 def test_getting_files(self): |
| 242 files = self.project.root.get_files() |
| 243 self.assertEquals(1, len(files)) |
| 244 self.assertTrue(self.project.get_resource(self.sample_file) in files) |
| 245 |
| 246 def test_getting_folders(self): |
| 247 folders = self.project.root.get_folders() |
| 248 self.assertEquals(1, len(folders)) |
| 249 self.assertTrue(self.project.get_resource( |
| 250 self.sample_folder) in folders) |
| 251 |
| 252 def test_nested_folder_get_files(self): |
| 253 parent = self.project.root.create_folder('top') |
| 254 parent.create_file('file1.txt') |
| 255 parent.create_file('file2.txt') |
| 256 files = parent.get_files() |
| 257 self.assertEquals(2, len(files)) |
| 258 self.assertTrue(self.project.get_resource('top/file2.txt') in files) |
| 259 self.assertEquals(0, len(parent.get_folders())) |
| 260 |
| 261 def test_nested_folder_get_folders(self): |
| 262 parent = self.project.root.create_folder('top') |
| 263 parent.create_folder('dir1') |
| 264 parent.create_folder('dir2') |
| 265 folders = parent.get_folders() |
| 266 self.assertEquals(2, len(folders)) |
| 267 self.assertTrue(self.project.get_resource('top/dir1') in folders) |
| 268 self.assertEquals(0, len(parent.get_files())) |
| 269 |
| 270 def test_root_folder(self): |
| 271 root_folder = self.project.root |
| 272 self.assertEquals(2, len(root_folder.get_children())) |
| 273 self.assertEquals('', root_folder.path) |
| 274 self.assertEquals('', root_folder.name) |
| 275 |
| 276 def test_get_all_files(self): |
| 277 files = tuple(self.project.get_files()) |
| 278 self.assertEquals(1, len(files)) |
| 279 self.assertEquals(self.sample_file, files[0].name) |
| 280 |
| 281 def test_get_all_files_after_changing(self): |
| 282 self.assertEquals(1, len(self.project.get_files())) |
| 283 myfile = self.project.root.create_file('myfile.txt') |
| 284 self.assertEquals(2, len(self.project.get_files())) |
| 285 myfile.move('newfile.txt') |
| 286 self.assertEquals(2, len(self.project.get_files())) |
| 287 self.project.get_file('newfile.txt').remove() |
| 288 self.assertEquals(1, len(self.project.get_files())) |
| 289 |
| 290 def test_multifile_get_all_files(self): |
| 291 fileName = 'nestedFile.txt' |
| 292 parent = self.project.get_resource(self.sample_folder) |
| 293 parent.create_file(fileName) |
| 294 files = list(self.project.get_files()) |
| 295 self.assertEquals(2, len(files)) |
| 296 self.assertTrue(fileName == files[0].name or fileName == files[1].name) |
| 297 |
| 298 def test_ignoring_dot_pyc_files_in_get_files(self): |
| 299 root = self.project.address |
| 300 src_folder = os.path.join(root, 'src') |
| 301 os.mkdir(src_folder) |
| 302 test_pyc = os.path.join(src_folder, 'test.pyc') |
| 303 open(test_pyc, 'w').close() |
| 304 for x in self.project.get_files(): |
| 305 self.assertNotEquals('src/test.pyc', x.path) |
| 306 |
| 307 def test_folder_creating_files(self): |
| 308 projectFile = 'NewFile.txt' |
| 309 self.project.root.create_file(projectFile) |
| 310 new_file = self.project.get_resource(projectFile) |
| 311 self.assertTrue(new_file is not None and not new_file.is_folder()) |
| 312 |
| 313 def test_folder_creating_nested_files(self): |
| 314 project_file = 'NewFile.txt' |
| 315 parent_folder = self.project.get_resource(self.sample_folder) |
| 316 parent_folder.create_file(project_file) |
| 317 new_file = self.project.get_resource(self.sample_folder |
| 318 + '/' + project_file) |
| 319 self.assertTrue(new_file is not None and not new_file.is_folder()) |
| 320 |
| 321 def test_folder_creating_files2(self): |
| 322 projectFile = 'newfolder' |
| 323 self.project.root.create_folder(projectFile) |
| 324 new_folder = self.project.get_resource(projectFile) |
| 325 self.assertTrue(new_folder is not None and new_folder.is_folder()) |
| 326 |
| 327 def test_folder_creating_nested_files2(self): |
| 328 project_file = 'newfolder' |
| 329 parent_folder = self.project.get_resource(self.sample_folder) |
| 330 parent_folder.create_folder(project_file) |
| 331 new_folder = self.project.get_resource(self.sample_folder |
| 332 + '/' + project_file) |
| 333 self.assertTrue(new_folder is not None and new_folder.is_folder()) |
| 334 |
| 335 def test_folder_get_child(self): |
| 336 folder = self.project.root |
| 337 folder.create_file('myfile.txt') |
| 338 folder.create_folder('myfolder') |
| 339 self.assertEquals(self.project.get_resource('myfile.txt'), |
| 340 folder.get_child('myfile.txt')) |
| 341 self.assertEquals(self.project.get_resource('myfolder'), |
| 342 folder.get_child('myfolder')) |
| 343 |
| 344 def test_folder_get_child_nested(self): |
| 345 root = self.project.root |
| 346 folder = root.create_folder('myfolder') |
| 347 folder.create_file('myfile.txt') |
| 348 folder.create_folder('myfolder') |
| 349 self.assertEquals(self.project.get_resource('myfolder/myfile.txt'), |
| 350 folder.get_child('myfile.txt')) |
| 351 self.assertEquals(self.project.get_resource('myfolder/myfolder'), |
| 352 folder.get_child('myfolder')) |
| 353 |
| 354 def test_project_root_is_root_folder(self): |
| 355 self.assertEquals('', self.project.root.path) |
| 356 |
| 357 def test_moving_files(self): |
| 358 root_folder = self.project.root |
| 359 my_file = root_folder.create_file('my_file.txt') |
| 360 my_file.move('my_other_file.txt') |
| 361 self.assertFalse(my_file.exists()) |
| 362 root_folder.get_child('my_other_file.txt') |
| 363 |
| 364 def test_moving_folders(self): |
| 365 root_folder = self.project.root |
| 366 my_folder = root_folder.create_folder('my_folder') |
| 367 my_file = my_folder.create_file('my_file.txt') |
| 368 my_folder.move('new_folder') |
| 369 self.assertFalse(root_folder.has_child('my_folder')) |
| 370 self.assertFalse(my_file.exists()) |
| 371 self.assertTrue(root_folder.get_child('new_folder') is not None) |
| 372 |
| 373 def test_moving_destination_folders(self): |
| 374 root_folder = self.project.root |
| 375 my_folder = root_folder.create_folder('my_folder') |
| 376 my_file = root_folder.create_file('my_file.txt') |
| 377 my_file.move('my_folder') |
| 378 self.assertFalse(root_folder.has_child('my_file.txt')) |
| 379 self.assertFalse(my_file.exists()) |
| 380 my_folder.get_child('my_file.txt') |
| 381 |
| 382 def test_moving_files_and_resource_objects(self): |
| 383 root_folder = self.project.root |
| 384 my_file = root_folder.create_file('my_file.txt') |
| 385 old_hash = hash(my_file) |
| 386 my_file.move('my_other_file.txt') |
| 387 self.assertEquals(old_hash, hash(my_file)) |
| 388 |
| 389 def test_file_encoding_reading(self): |
| 390 sample_file = self.project.root.create_file('my_file.txt') |
| 391 contents = u'# -*- coding: utf-8 -*-\n' \ |
| 392 '#\N{LATIN SMALL LETTER I WITH DIAERESIS}\n' |
| 393 file = open(sample_file.real_path, 'w') |
| 394 file.write(contents.encode('utf-8')) |
| 395 file.close() |
| 396 self.assertEquals(contents, sample_file.read()) |
| 397 |
| 398 def test_file_encoding_writing(self): |
| 399 sample_file = self.project.root.create_file('my_file.txt') |
| 400 contents = u'# -*- coding: utf-8 -*-\n' \ |
| 401 '\N{LATIN SMALL LETTER I WITH DIAERESIS}\n' |
| 402 sample_file.write(contents) |
| 403 self.assertEquals(contents, sample_file.read()) |
| 404 |
| 405 def test_using_utf8_when_writing_in_case_of_errors(self): |
| 406 sample_file = self.project.root.create_file('my_file.txt') |
| 407 contents = u'\n\N{LATIN SMALL LETTER I WITH DIAERESIS}\n' |
| 408 sample_file.write(contents) |
| 409 self.assertEquals(contents, sample_file.read()) |
| 410 |
| 411 def test_encoding_declaration_in_the_second_line(self): |
| 412 sample_file = self.project.root.create_file('my_file.txt') |
| 413 contents = '\n# -*- coding: latin-1 -*-\n\xa9\n' |
| 414 file = open(sample_file.real_path, 'wb') |
| 415 file.write(contents) |
| 416 file.close() |
| 417 self.assertEquals(contents, sample_file.read().encode('latin-1')) |
| 418 |
| 419 def test_read_bytes(self): |
| 420 sample_file = self.project.root.create_file('my_file.txt') |
| 421 contents = '\n# -*- coding: latin-1 -*-\n\xa9\n' |
| 422 file = open(sample_file.real_path, 'wb') |
| 423 file.write(contents) |
| 424 file.close() |
| 425 self.assertEquals(contents, sample_file.read_bytes()) |
| 426 |
| 427 # TODO: Detecting utf-16 encoding |
| 428 def xxx_test_using_utf16(self): |
| 429 sample_file = self.project.root.create_file('my_file.txt') |
| 430 contents = '# -*- coding: utf-16 -*-\n# This is a sample file ...\n' |
| 431 file = open(sample_file.real_path, 'w') |
| 432 file.write(contents.encode('utf-16')) |
| 433 file.close() |
| 434 sample_file.write(contents) |
| 435 self.assertEquals(contents, sample_file.read()) |
| 436 |
| 437 # XXX: supporting utf_8_sig |
| 438 def xxx_test_file_encoding_reading_for_notepad_styles(self): |
| 439 sample_file = self.project.root.create_file('my_file.txt') |
| 440 contents = u'#\N{LATIN SMALL LETTER I WITH DIAERESIS}\n' |
| 441 file = open(sample_file.real_path, 'w') |
| 442 # file.write('\xef\xbb\xbf') |
| 443 file.write(contents.encode('utf-8-sig')) |
| 444 file.close() |
| 445 self.assertEquals(contents, sample_file.read()) |
| 446 |
| 447 def test_using_project_get_file(self): |
| 448 myfile = self.project.get_file(self.sample_file) |
| 449 self.assertTrue(myfile.exists()) |
| 450 |
| 451 def test_using_file_create(self): |
| 452 myfile = self.project.get_file('myfile.txt') |
| 453 self.assertFalse(myfile.exists()) |
| 454 myfile.create() |
| 455 self.assertTrue(myfile.exists()) |
| 456 self.assertFalse(myfile.is_folder()) |
| 457 |
| 458 def test_using_folder_create(self): |
| 459 myfolder = self.project.get_folder('myfolder') |
| 460 self.assertFalse(myfolder.exists()) |
| 461 myfolder.create() |
| 462 self.assertTrue(myfolder.exists()) |
| 463 self.assertTrue(myfolder.is_folder()) |
| 464 |
| 465 def test_exception_when_creating_twice(self): |
| 466 with self.assertRaises(RopeError): |
| 467 myfile = self.project.get_file('myfile.txt') |
| 468 myfile.create() |
| 469 myfile.create() |
| 470 |
| 471 def test_exception_when_parent_does_not_exist(self): |
| 472 with self.assertRaises(ResourceNotFoundError): |
| 473 myfile = self.project.get_file('myfolder/myfile.txt') |
| 474 myfile.create() |
| 475 |
| 476 def test_simple_path_to_resource(self): |
| 477 myfile = self.project.root.create_file('myfile.txt') |
| 478 self.assertEquals(myfile, path_to_resource(self.project, |
| 479 myfile.real_path)) |
| 480 self.assertEquals(myfile, path_to_resource( |
| 481 self.project, myfile.real_path, type='file')) |
| 482 myfolder = self.project.root.create_folder('myfolder') |
| 483 self.assertEquals(myfolder, path_to_resource(self.project, |
| 484 myfolder.real_path)) |
| 485 self.assertEquals(myfolder, path_to_resource( |
| 486 self.project, myfolder.real_path, type='folder')) |
| 487 |
| 488 @testutils.run_only_for_unix |
| 489 def test_ignoring_symlinks_inside_project(self): |
| 490 project2 = testutils.sample_project(folder_name='sampleproject2') |
| 491 mod = project2.root.create_file('mod.py') |
| 492 try: |
| 493 path = os.path.join(self.project.address, 'linkedfile.txt') |
| 494 os.symlink(mod.real_path, path) |
| 495 files = self.project.root.get_files() |
| 496 self.assertEquals(1, len(files)) |
| 497 finally: |
| 498 testutils.remove_project(project2) |
| 499 |
| 500 def test_getting_empty_source_folders(self): |
| 501 self.assertEquals([], self.project.get_source_folders()) |
| 502 |
| 503 def test_root_source_folder(self): |
| 504 self.project.root.create_file('sample.py') |
| 505 source_folders = self.project.get_source_folders() |
| 506 self.assertEquals(1, len(source_folders)) |
| 507 self.assertTrue(self.project.root in source_folders) |
| 508 |
| 509 def test_root_source_folder2(self): |
| 510 self.project.root.create_file('mod1.py') |
| 511 self.project.root.create_file('mod2.py') |
| 512 source_folders = self.project.get_source_folders() |
| 513 self.assertEquals(1, len(source_folders)) |
| 514 self.assertTrue(self.project.root in source_folders) |
| 515 |
| 516 def test_src_source_folder(self): |
| 517 src = self.project.root.create_folder('src') |
| 518 src.create_file('sample.py') |
| 519 source_folders = self.project.get_source_folders() |
| 520 self.assertEquals(1, len(source_folders)) |
| 521 self.assertTrue(self.project.get_resource('src') in source_folders) |
| 522 |
| 523 def test_packages(self): |
| 524 src = self.project.root.create_folder('src') |
| 525 pkg = src.create_folder('package') |
| 526 pkg.create_file('__init__.py') |
| 527 source_folders = self.project.get_source_folders() |
| 528 self.assertEquals(1, len(source_folders)) |
| 529 self.assertTrue(src in source_folders) |
| 530 |
| 531 def test_multi_source_folders(self): |
| 532 src = self.project.root.create_folder('src') |
| 533 package = src.create_folder('package') |
| 534 package.create_file('__init__.py') |
| 535 test = self.project.root.create_folder('test') |
| 536 test.create_file('alltests.py') |
| 537 source_folders = self.project.get_source_folders() |
| 538 self.assertEquals(2, len(source_folders)) |
| 539 self.assertTrue(src in source_folders) |
| 540 self.assertTrue(test in source_folders) |
| 541 |
| 542 def test_multi_source_folders2(self): |
| 543 testutils.create_module(self.project, 'mod1') |
| 544 src = self.project.root.create_folder('src') |
| 545 package = testutils.create_package(self.project, 'package', src) |
| 546 testutils.create_module(self.project, 'mod2', package) |
| 547 source_folders = self.project.get_source_folders() |
| 548 self.assertEquals(2, len(source_folders)) |
| 549 self.assertTrue(self.project.root in source_folders and |
| 550 src in source_folders) |
| 551 |
| 552 |
| 553 class ResourceObserverTest(unittest.TestCase): |
| 554 |
| 555 def setUp(self): |
| 556 super(ResourceObserverTest, self).setUp() |
| 557 self.project = testutils.sample_project() |
| 558 |
| 559 def tearDown(self): |
| 560 testutils.remove_project(self.project) |
| 561 super(ResourceObserverTest, self).tearDown() |
| 562 |
| 563 def test_resource_change_observer(self): |
| 564 sample_file = self.project.root.create_file('my_file.txt') |
| 565 sample_file.write('a sample file version 1') |
| 566 sample_observer = _SampleObserver() |
| 567 self.project.add_observer(sample_observer) |
| 568 sample_file.write('a sample file version 2') |
| 569 self.assertEquals(1, sample_observer.change_count) |
| 570 self.assertEquals(sample_file, sample_observer.last_changed) |
| 571 |
| 572 def test_resource_change_observer_after_removal(self): |
| 573 sample_file = self.project.root.create_file('my_file.txt') |
| 574 sample_file.write('text') |
| 575 sample_observer = _SampleObserver() |
| 576 self.project.add_observer(FilteredResourceObserver(sample_observer, |
| 577 [sample_file])) |
| 578 sample_file.remove() |
| 579 self.assertEquals(1, sample_observer.change_count) |
| 580 self.assertEquals(sample_file, sample_observer.last_removed) |
| 581 |
| 582 def test_resource_change_observer2(self): |
| 583 sample_file = self.project.root.create_file('my_file.txt') |
| 584 sample_observer = _SampleObserver() |
| 585 self.project.add_observer(sample_observer) |
| 586 self.project.remove_observer(sample_observer) |
| 587 sample_file.write('a sample file version 2') |
| 588 self.assertEquals(0, sample_observer.change_count) |
| 589 |
| 590 def test_resource_change_observer_for_folders(self): |
| 591 root_folder = self.project.root |
| 592 my_folder = root_folder.create_folder('my_folder') |
| 593 my_folder_observer = _SampleObserver() |
| 594 root_folder_observer = _SampleObserver() |
| 595 self.project.add_observer( |
| 596 FilteredResourceObserver(my_folder_observer, [my_folder])) |
| 597 self.project.add_observer( |
| 598 FilteredResourceObserver(root_folder_observer, [root_folder])) |
| 599 my_file = my_folder.create_file('my_file.txt') |
| 600 self.assertEquals(1, my_folder_observer.change_count) |
| 601 my_file.move('another_file.txt') |
| 602 self.assertEquals(2, my_folder_observer.change_count) |
| 603 self.assertEquals(1, root_folder_observer.change_count) |
| 604 self.project.get_resource('another_file.txt').remove() |
| 605 self.assertEquals(2, my_folder_observer.change_count) |
| 606 self.assertEquals(2, root_folder_observer.change_count) |
| 607 |
| 608 def test_resource_change_observer_after_moving(self): |
| 609 sample_file = self.project.root.create_file('my_file.txt') |
| 610 sample_observer = _SampleObserver() |
| 611 self.project.add_observer(sample_observer) |
| 612 sample_file.move('new_file.txt') |
| 613 self.assertEquals(1, sample_observer.change_count) |
| 614 self.assertEquals((sample_file, |
| 615 self.project.get_resource('new_file.txt')), |
| 616 sample_observer.last_moved) |
| 617 |
| 618 def test_revalidating_files(self): |
| 619 root = self.project.root |
| 620 my_file = root.create_file('my_file.txt') |
| 621 sample_observer = _SampleObserver() |
| 622 self.project.add_observer(FilteredResourceObserver(sample_observer, |
| 623 [my_file])) |
| 624 os.remove(my_file.real_path) |
| 625 self.project.validate(root) |
| 626 self.assertEquals(my_file, sample_observer.last_removed) |
| 627 self.assertEquals(1, sample_observer.change_count) |
| 628 |
| 629 def test_revalidating_files_and_no_changes2(self): |
| 630 root = self.project.root |
| 631 my_file = root.create_file('my_file.txt') |
| 632 sample_observer = _SampleObserver() |
| 633 self.project.add_observer(FilteredResourceObserver(sample_observer, |
| 634 [my_file])) |
| 635 self.project.validate(root) |
| 636 self.assertEquals(None, sample_observer.last_moved) |
| 637 self.assertEquals(0, sample_observer.change_count) |
| 638 |
| 639 def test_revalidating_folders(self): |
| 640 root = self.project.root |
| 641 my_folder = root.create_folder('myfolder') |
| 642 my_file = my_folder.create_file('myfile.txt') # noqa |
| 643 sample_observer = _SampleObserver() |
| 644 self.project.add_observer(FilteredResourceObserver(sample_observer, |
| 645 [my_folder])) |
| 646 testutils.remove_recursively(my_folder.real_path) |
| 647 self.project.validate(root) |
| 648 self.assertEquals(my_folder, sample_observer.last_removed) |
| 649 self.assertEquals(1, sample_observer.change_count) |
| 650 |
| 651 def test_removing_and_adding_resources_to_filtered_observer(self): |
| 652 my_file = self.project.root.create_file('my_file.txt') |
| 653 sample_observer = _SampleObserver() |
| 654 filtered_observer = FilteredResourceObserver(sample_observer) |
| 655 self.project.add_observer(filtered_observer) |
| 656 my_file.write('1') |
| 657 self.assertEquals(0, sample_observer.change_count) |
| 658 filtered_observer.add_resource(my_file) |
| 659 my_file.write('2') |
| 660 self.assertEquals(1, sample_observer.change_count) |
| 661 filtered_observer.remove_resource(my_file) |
| 662 my_file.write('3') |
| 663 self.assertEquals(1, sample_observer.change_count) |
| 664 |
| 665 def test_validation_and_changing_files(self): |
| 666 my_file = self.project.root.create_file('my_file.txt') |
| 667 sample_observer = _SampleObserver() |
| 668 timekeeper = _MockChangeIndicator() |
| 669 filtered_observer = FilteredResourceObserver( |
| 670 sample_observer, [my_file], timekeeper=timekeeper) |
| 671 self.project.add_observer(filtered_observer) |
| 672 self._write_file(my_file.real_path) |
| 673 timekeeper.set_indicator(my_file, 1) |
| 674 self.project.validate(self.project.root) |
| 675 self.assertEquals(1, sample_observer.change_count) |
| 676 |
| 677 def test_validation_and_changing_files2(self): |
| 678 my_file = self.project.root.create_file('my_file.txt') |
| 679 sample_observer = _SampleObserver() |
| 680 timekeeper = _MockChangeIndicator() |
| 681 self.project.add_observer(FilteredResourceObserver( |
| 682 sample_observer, [my_file], |
| 683 timekeeper=timekeeper)) |
| 684 timekeeper.set_indicator(my_file, 1) |
| 685 my_file.write('hey') |
| 686 self.assertEquals(1, sample_observer.change_count) |
| 687 self.project.validate(self.project.root) |
| 688 self.assertEquals(1, sample_observer.change_count) |
| 689 |
| 690 def test_not_reporting_multiple_changes_to_folders(self): |
| 691 root = self.project.root |
| 692 file1 = root.create_file('file1.txt') |
| 693 file2 = root.create_file('file2.txt') |
| 694 sample_observer = _SampleObserver() |
| 695 self.project.add_observer(FilteredResourceObserver( |
| 696 sample_observer, [root, file1, file2])) |
| 697 os.remove(file1.real_path) |
| 698 os.remove(file2.real_path) |
| 699 self.assertEquals(0, sample_observer.change_count) |
| 700 self.project.validate(self.project.root) |
| 701 self.assertEquals(3, sample_observer.change_count) |
| 702 |
| 703 def _write_file(self, path): |
| 704 my_file = open(path, 'w') |
| 705 my_file.write('\n') |
| 706 my_file.close() |
| 707 |
| 708 def test_moving_and_being_interested_about_a_folder_and_a_child(self): |
| 709 my_folder = self.project.root.create_folder('my_folder') |
| 710 my_file = my_folder.create_file('my_file.txt') |
| 711 sample_observer = _SampleObserver() |
| 712 filtered_observer = FilteredResourceObserver( |
| 713 sample_observer, [my_folder, my_file]) |
| 714 self.project.add_observer(filtered_observer) |
| 715 my_folder.move('new_folder') |
| 716 self.assertEquals(2, sample_observer.change_count) |
| 717 |
| 718 def test_contains_for_folders(self): |
| 719 folder1 = self.project.root.create_folder('folder') |
| 720 folder2 = self.project.root.create_folder('folder2') |
| 721 self.assertFalse(folder1.contains(folder2)) |
| 722 |
| 723 def test_validating_when_created(self): |
| 724 root = self.project.root |
| 725 my_file = self.project.get_file('my_file.txt') |
| 726 sample_observer = _SampleObserver() |
| 727 self.project.add_observer(FilteredResourceObserver(sample_observer, |
| 728 [my_file])) |
| 729 open(my_file.real_path, 'w').close() |
| 730 self.project.validate(root) |
| 731 self.assertEquals(my_file, sample_observer.last_created) |
| 732 self.assertEquals(1, sample_observer.change_count) |
| 733 |
| 734 def test_validating_twice_when_created(self): |
| 735 root = self.project.root |
| 736 my_file = self.project.get_file('my_file.txt') |
| 737 sample_observer = _SampleObserver() |
| 738 self.project.add_observer(FilteredResourceObserver(sample_observer, |
| 739 [my_file])) |
| 740 open(my_file.real_path, 'w').close() |
| 741 self.project.validate(root) |
| 742 self.project.validate(root) |
| 743 self.assertEquals(my_file, sample_observer.last_created) |
| 744 self.assertEquals(1, sample_observer.change_count) |
| 745 |
| 746 def test_changes_and_adding_resources(self): |
| 747 root = self.project.root # noqa |
| 748 file1 = self.project.get_file('file1.txt') |
| 749 file2 = self.project.get_file('file2.txt') |
| 750 file1.create() |
| 751 sample_observer = _SampleObserver() |
| 752 self.project.add_observer(FilteredResourceObserver(sample_observer, |
| 753 [file1, file2])) |
| 754 file1.move(file2.path) |
| 755 self.assertEquals(2, sample_observer.change_count) |
| 756 self.assertEquals(file2, sample_observer.last_created) |
| 757 self.assertEquals((file1, file2), sample_observer.last_moved) |
| 758 |
| 759 def test_validating_get_files_list(self): |
| 760 root = self.project.root # noqa |
| 761 self.assertEquals(0, len(self.project.get_files())) |
| 762 file = open(os.path.join(self.project.address, 'myfile.txt'), 'w') |
| 763 file.close() |
| 764 self.project.validate() |
| 765 self.assertEquals(1, len(self.project.get_files())) |
| 766 |
| 767 def test_clear_observered_resources_for_filtered_observers(self): |
| 768 sample_file = self.project.root.create_file('myfile.txt') |
| 769 sample_observer = _SampleObserver() |
| 770 filtered = FilteredResourceObserver(sample_observer) |
| 771 self.project.add_observer(filtered) |
| 772 filtered.add_resource(sample_file) |
| 773 filtered.clear_resources() |
| 774 sample_file.write('1') |
| 775 self.assertEquals(0, sample_observer.change_count) |
| 776 |
| 777 |
| 778 class _MockChangeIndicator(object): |
| 779 |
| 780 def __init__(self): |
| 781 self.times = {} |
| 782 |
| 783 def set_indicator(self, resource, time): |
| 784 self.times[resource] = time |
| 785 |
| 786 def get_indicator(self, resource): |
| 787 return self.times.get(resource, 0) |
| 788 |
| 789 |
| 790 class _SampleObserver(object): |
| 791 |
| 792 def __init__(self): |
| 793 self.change_count = 0 |
| 794 self.last_changed = None |
| 795 self.last_moved = None |
| 796 self.last_created = None |
| 797 self.last_removed = None |
| 798 |
| 799 def resource_changed(self, resource): |
| 800 self.last_changed = resource |
| 801 self.change_count += 1 |
| 802 |
| 803 def resource_moved(self, resource, new_resource): |
| 804 self.last_moved = (resource, new_resource) |
| 805 self.change_count += 1 |
| 806 |
| 807 def resource_created(self, resource): |
| 808 self.last_created = resource |
| 809 self.change_count += 1 |
| 810 |
| 811 def resource_removed(self, resource): |
| 812 self.last_removed = resource |
| 813 self.change_count += 1 |
| 814 |
| 815 |
| 816 class OutOfProjectTest(unittest.TestCase): |
| 817 |
| 818 def setUp(self): |
| 819 super(OutOfProjectTest, self).setUp() |
| 820 self.test_directory = 'temp_test_directory' |
| 821 testutils.remove_recursively(self.test_directory) |
| 822 os.mkdir(self.test_directory) |
| 823 self.project = testutils.sample_project() |
| 824 self.no_project = NoProject() |
| 825 |
| 826 def tearDown(self): |
| 827 testutils.remove_project(self.project) |
| 828 testutils.remove_recursively(self.test_directory) |
| 829 super(OutOfProjectTest, self).tearDown() |
| 830 |
| 831 def test_simple_out_of_project_file(self): |
| 832 sample_file_path = os.path.join(self.test_directory, 'sample.txt') |
| 833 sample_file = open(sample_file_path, 'w') |
| 834 sample_file.write('sample content\n') |
| 835 sample_file.close() |
| 836 sample_resource = self.no_project.get_resource(sample_file_path) |
| 837 self.assertEquals('sample content\n', sample_resource.read()) |
| 838 |
| 839 def test_simple_out_of_project_folder(self): |
| 840 sample_folder_path = os.path.join(self.test_directory, 'sample_folder') |
| 841 os.mkdir(sample_folder_path) |
| 842 sample_folder = self.no_project.get_resource(sample_folder_path) |
| 843 self.assertEquals([], sample_folder.get_children()) |
| 844 |
| 845 sample_file_path = os.path.join(sample_folder_path, 'sample.txt') |
| 846 open(sample_file_path, 'w').close() |
| 847 sample_resource = self.no_project.get_resource(sample_file_path) |
| 848 self.assertEquals(sample_resource, sample_folder.get_children()[0]) |
| 849 |
| 850 def test_using_absolute_path(self): |
| 851 sample_file_path = os.path.join(self.test_directory, 'sample.txt') |
| 852 open(sample_file_path, 'w').close() |
| 853 normal_sample_resource = self.no_project.get_resource(sample_file_path) |
| 854 absolute_sample_resource = \ |
| 855 self.no_project.get_resource(os.path.abspath(sample_file_path)) |
| 856 self.assertEquals(normal_sample_resource, absolute_sample_resource) |
| 857 |
| 858 def test_folder_get_child(self): |
| 859 sample_folder_path = os.path.join(self.test_directory, 'sample_folder') |
| 860 os.mkdir(sample_folder_path) |
| 861 sample_folder = self.no_project.get_resource(sample_folder_path) |
| 862 self.assertEquals([], sample_folder.get_children()) |
| 863 |
| 864 sample_file_path = os.path.join(sample_folder_path, 'sample.txt') |
| 865 open(sample_file_path, 'w').close() |
| 866 sample_resource = self.no_project.get_resource(sample_file_path) |
| 867 self.assertTrue(sample_folder.has_child('sample.txt')) |
| 868 self.assertFalse(sample_folder.has_child('doesnothave.txt')) |
| 869 self.assertEquals(sample_resource, |
| 870 sample_folder.get_child('sample.txt')) |
| 871 |
| 872 def test_out_of_project_files_and_path_to_resource(self): |
| 873 sample_file_path = os.path.join(self.test_directory, 'sample.txt') |
| 874 sample_file = open(sample_file_path, 'w') |
| 875 sample_file.write('sample content\n') |
| 876 sample_file.close() |
| 877 sample_resource = self.no_project.get_resource(sample_file_path) |
| 878 self.assertEquals(sample_resource, |
| 879 path_to_resource(self.project, sample_file_path)) |
| 880 |
| 881 |
| 882 class _MockFSCommands(object): |
| 883 def __init__(self): |
| 884 self.log = '' |
| 885 self.fscommands = FileSystemCommands() |
| 886 |
| 887 def create_file(self, path): |
| 888 self.log += 'create_file ' |
| 889 self.fscommands.create_file(path) |
| 890 |
| 891 def create_folder(self, path): |
| 892 self.log += 'create_folder ' |
| 893 self.fscommands.create_folder(path) |
| 894 |
| 895 def move(self, path, new_location): |
| 896 self.log += 'move ' |
| 897 self.fscommands.move(path, new_location) |
| 898 |
| 899 def remove(self, path): |
| 900 self.log += 'remove ' |
| 901 self.fscommands.remove(path) |
| 902 |
| 903 |
| 904 class RopeFolderTest(unittest.TestCase): |
| 905 |
| 906 def setUp(self): |
| 907 super(RopeFolderTest, self).setUp() |
| 908 self.project = None |
| 909 |
| 910 def tearDown(self): |
| 911 if self.project: |
| 912 testutils.remove_project(self.project) |
| 913 super(RopeFolderTest, self).tearDown() |
| 914 |
| 915 def test_none_project_rope_folder(self): |
| 916 self.project = testutils.sample_project(ropefolder=None) |
| 917 self.assertTrue(self.project.ropefolder is None) |
| 918 |
| 919 def test_getting_project_rope_folder(self): |
| 920 self.project = testutils.sample_project(ropefolder='.ropeproject') |
| 921 self.assertTrue(self.project.ropefolder.exists()) |
| 922 self.assertTrue('.ropeproject', self.project.ropefolder.path) |
| 923 |
| 924 def test_setting_ignored_resources(self): |
| 925 self.project = testutils.sample_project( |
| 926 ignored_resources=['myfile.txt']) |
| 927 myfile = self.project.get_file('myfile.txt') |
| 928 file2 = self.project.get_file('file2.txt') |
| 929 self.assertTrue(self.project.is_ignored(myfile)) |
| 930 self.assertFalse(self.project.is_ignored(file2)) |
| 931 |
| 932 def test_ignored_folders(self): |
| 933 self.project = testutils.sample_project(ignored_resources=['myfolder']) |
| 934 myfolder = self.project.root.create_folder('myfolder') |
| 935 self.assertTrue(self.project.is_ignored(myfolder)) |
| 936 myfile = myfolder.create_file('myfile.txt') |
| 937 self.assertTrue(self.project.is_ignored(myfile)) |
| 938 |
| 939 def test_ignored_resources_and_get_files(self): |
| 940 self.project = testutils.sample_project( |
| 941 ignored_resources=['myfile.txt'], ropefolder=None) |
| 942 myfile = self.project.get_file('myfile.txt') |
| 943 self.assertEquals(0, len(self.project.get_files())) |
| 944 myfile.create() |
| 945 self.assertEquals(0, len(self.project.get_files())) |
| 946 |
| 947 def test_ignored_resources_and_get_files2(self): |
| 948 self.project = testutils.sample_project( |
| 949 ignored_resources=['myfile.txt'], ropefolder=None) |
| 950 myfile = self.project.root.create_file('myfile.txt') # noqa |
| 951 self.assertEquals(0, len(self.project.get_files())) |
| 952 |
| 953 def test_setting_ignored_resources_patterns(self): |
| 954 self.project = testutils.sample_project(ignored_resources=['m?file.*']) |
| 955 myfile = self.project.get_file('myfile.txt') |
| 956 file2 = self.project.get_file('file2.txt') |
| 957 self.assertTrue(self.project.is_ignored(myfile)) |
| 958 self.assertFalse(self.project.is_ignored(file2)) |
| 959 |
| 960 def test_star_should_not_include_slashes(self): |
| 961 self.project = testutils.sample_project(ignored_resources=['f*.txt']) |
| 962 folder = self.project.root.create_folder('folder') |
| 963 file1 = folder.create_file('myfile.txt') |
| 964 file2 = folder.create_file('file2.txt') |
| 965 self.assertFalse(self.project.is_ignored(file1)) |
| 966 self.assertTrue(self.project.is_ignored(file2)) |
| 967 |
| 968 def test_normal_fscommands(self): |
| 969 fscommands = _MockFSCommands() |
| 970 self.project = testutils.sample_project(fscommands=fscommands) |
| 971 myfile = self.project.get_file('myfile.txt') |
| 972 myfile.create() |
| 973 self.assertTrue('create_file ', fscommands.log) |
| 974 |
| 975 def test_fscommands_and_ignored_resources(self): |
| 976 fscommands = _MockFSCommands() |
| 977 self.project = testutils.sample_project( |
| 978 fscommands=fscommands, |
| 979 ignored_resources=['myfile.txt'], ropefolder=None) |
| 980 myfile = self.project.get_file('myfile.txt') |
| 981 myfile.create() |
| 982 self.assertEquals('', fscommands.log) |
| 983 |
| 984 def test_ignored_resources_and_prefixes(self): |
| 985 self.project = testutils.sample_project( |
| 986 ignored_resources=['.hg']) |
| 987 myfile = self.project.root.create_file('.hgignore') |
| 988 self.assertFalse(self.project.is_ignored(myfile)) |
| 989 |
| 990 def test_loading_config_dot_py(self): |
| 991 self.project = testutils.sample_project(ropefolder='.ropeproject') |
| 992 config = self.project.get_file('.ropeproject/config.py') |
| 993 if not config.exists(): |
| 994 config.create() |
| 995 config.write('def set_prefs(prefs):\n' |
| 996 ' prefs["ignored_resources"] = ["myfile.txt"]\n' |
| 997 'def project_opened(project):\n' |
| 998 ' project.root.create_file("loaded")\n') |
| 999 self.project.close() |
| 1000 self.project = Project(self.project.address, ropefolder='.ropeproject') |
| 1001 self.assertTrue(self.project.get_file('loaded').exists()) |
| 1002 myfile = self.project.get_file('myfile.txt') |
| 1003 self.assertTrue(self.project.is_ignored(myfile)) |
| 1004 |
| 1005 def test_ignoring_syntax_errors(self): |
| 1006 self.project = testutils.sample_project(ropefolder=None, |
| 1007 ignore_syntax_errors=True) |
| 1008 mod = testutils.create_module(self.project, 'mod') |
| 1009 mod.write('xyz print') |
| 1010 pymod = self.project.get_pymodule(mod) # noqa |
| 1011 |
| 1012 def test_compressed_history(self): |
| 1013 self.project = testutils.sample_project(compress_history=True) |
| 1014 mod = testutils.create_module(self.project, 'mod') |
| 1015 mod.write('') |
| 1016 |
| 1017 def test_compressed_objectdb(self): |
| 1018 self.project = testutils.sample_project(compress_objectdb=True) |
| 1019 mod = testutils.create_module(self.project, 'mod') |
| 1020 self.project.pycore.analyze_module(mod) |
| 1021 |
| 1022 def test_nested_dot_ropeproject_folder(self): |
| 1023 self.project = testutils.sample_project(ropefolder='.f1/f2') |
| 1024 ropefolder = self.project.ropefolder |
| 1025 self.assertEquals('.f1/f2', ropefolder.path) |
| 1026 self.assertTrue(ropefolder.exists()) |
| 1027 |
| 1028 |
| 1029 def suite(): |
| 1030 result = unittest.TestSuite() |
| 1031 result.addTests(unittest.makeSuite(ProjectTest)) |
| 1032 result.addTests(unittest.makeSuite(ResourceObserverTest)) |
| 1033 result.addTests(unittest.makeSuite(OutOfProjectTest)) |
| 1034 result.addTests(unittest.makeSuite(RopeFolderTest)) |
| 1035 return result |
| 1036 |
| 1037 if __name__ == '__main__': |
| 1038 unittest.main() |
OLD | NEW |