예제 #1
0
 def test_a_file_pattern_can_be_mapped_to_its_own_tier(self):
     project = ProjectLayout()
     project.addTierForModulesLike('**/repository/I[A-Z]*.h', 7)
     self.assertEqual(
         7,
         project.tierForModule(
             'Source/Module1/repository/ISomeInterface.h'))
예제 #2
0
 def test_a_series_of_matching_tier_rules_are_applied_in_order(self):
     project = ProjectLayout()
     project.addTierForModulesLike('**/Module1/**', 4)
     project.addTierForModulesLike('**/BusinessLogic/**', 2)
     project.addTierForModulesLike('**/Source/**', 1)
     self.assertEqual(4,
                      project.tierForModule('Source/Module1/BusinessLogic'))
예제 #3
0
    def test_reorganize_headers_inside_a_module(self):
        layout = ProjectLayout()
        layout.addSourceFolder('Source')
        layout.addTierForModulesLike('**/Plugins', 4)
        layout.addTierForModulesLike('**/Plugins/File9.h', 2)

        services = StubProjectServices()
        services.files_lists['Source'] = []
        services.files_lists['Source/Module1'] = []
        services.files_lists['Source/Module1/Plugins'] = [
            'File1.cpp', 'File1.h', 'File2.h', 'File9.h'
        ]
        services.files_lists['build/include/T4'] = []
        services.folders_lists['Source'] = ['Source/Module1']
        services.folders_lists['Source/Module1'] = ['Source/Module1/Plugins']
        services.folders_lists['Source/Module1/Plugins'] = []

        reorganizer = HeaderReorganization(layout, services)

        reorganizer.reorganizeHeaders()
        self.assertEquals(3, len(services.linked_files))
        self.assertEquals(
            'build/include/T4',
            services.linked_files['Source/Module1/Plugins/File1.h'])
        self.assertEquals(
            'build/include/T4',
            services.linked_files['Source/Module1/Plugins/File2.h'])
        self.assertEquals(
            'build/include/T2',
            services.linked_files['Source/Module1/Plugins/File9.h'])
예제 #4
0
    def test_resolve_include_path_for_module_with_third_party_headers(self):
        layout = ProjectLayout()
        layout.addSourceFolder('Source')
        layout.addTierForModulesLike('**/Module1', 3)
        layout.addTierForModulesLike('CoreLib', 3, 'CoreLib')

        services = StubProjectServices()
        services.files_lists['Source'] = []
        services.files_lists['Source/Module1'] = [
            'Source/Module1/File1.cpp', 'Source/Module1/File1.h',
            'Source/Module1/File2.h'
        ]
        services.files_lists['Source/Module1/private'] = [
            'Source/Module1/private/File1.cpp',
            'Source/Module1/private/File1.h', 'Source/Module1/private/File2.h'
        ]
        services.folders_lists['Source'] = ['Source/Module1']
        services.folders_lists['Source/Module1'] = ['Source/Module1/private']
        services.folders_lists['Source/Module1/private'] = []

        path_resolver = IncludePath(layout, services)
        self.assertEqual([
            'CoreLib', 'build/include/T1', 'build/include/T2',
            'build/include/T3'
        ], path_resolver.resolveIncludePaths('Source/Module1'))
예제 #5
0
    def test_private_headers_are_reorganized_if_a_module_is_prescient(self):
        layout = ProjectLayout()
        layout.addSourceFolder('Source')
        layout.addTierForModulesLike('**/private', -1)
        layout.addTierForModulesLike('**/TestCases', 5, None, True)

        services = StubProjectServices()
        services.files_lists['Source'] = []
        services.files_lists['Source/Module1'] = []
        services.files_lists['Source/Module1/private'] = [
            'File1.cpp', 'File1.h', 'File2.h'
        ]
        services.files_lists['build/include/T0'] = []
        services.folders_lists['Source'] = ['Source/Module1']
        services.folders_lists['Source/Module1'] = ['Source/Module1/private']
        services.folders_lists['Source/Module1/private'] = []

        reorganizer = HeaderReorganization(layout, services)

        reorganizer.reorganizeHeaders()
        self.assertEquals(2, len(services.linked_files))
        self.assertEquals(
            'build/include/T0',
            services.linked_files['Source/Module1/private/File1.h'])
        self.assertEquals(
            'build/include/T0',
            services.linked_files['Source/Module1/private/File2.h'])
예제 #6
0
    def test_reorganize_headers_for_single_module(self):
        layout = ProjectLayout()
        layout.addSourceFolder('Source')

        services = StubProjectServices()
        services.files_lists['Source'] = []
        services.files_lists['Source/Module1'] = [
            'Source/Module1/File1.cpp', 'Source/Module1/File1.h',
            'Source/Module1/File2.h'
        ]
        services.folders_lists['Source'] = ['Source/Module1']
        services.folders_lists['Source/Module1'] = []

        path_resolver = IncludePath(layout, services)
        self.assertEqual(['build/include/T1'],
                         path_resolver.resolveIncludePaths('Source/Module1'))
예제 #7
0
    def test_headers_which_are_no_longer_in_the_sources_are_removed_from_the_destinations_even_if_their_tier_folder_is_unused(
            self):
        layout = ProjectLayout()
        layout.addSourceFolder('Source')
        layout.addTierForModulesLike('**/Plugins', 4)
        layout.addTierForModulesLike('**/Plugins/File9.h', 8)

        services = StubProjectServices()
        services.files_lists['Source'] = []
        services.files_lists['Source/Module1'] = []
        services.files_lists['Source/Module1/Plugins'] = [
            'File1.cpp', 'File1.h', 'File9.h'
        ]
        services.files_lists['build/include/T8'] = ['File2.h', 'File9.h']
        services.files_lists['build/include/T7'] = ['File2.h', 'File9.h']
        services.files_lists['build/include/T6'] = ['File2.h', 'File9.h']
        services.files_lists['build/include/T5'] = ['File2.h', 'File9.h']
        services.files_lists['build/include/T4'] = ['File2.h', 'File9.h']
        services.files_lists['build/include/T3'] = ['File2.h']
        services.files_lists['build/include/T2'] = ['File2.h']
        services.files_lists['build/include/T1'] = ['File2.h']
        services.folders_lists['Source'] = ['Source/Module1']
        services.folders_lists['Source/Module1'] = ['Source/Module1/Plugins']
        services.folders_lists['Source/Module1/Plugins'] = []
        services.folders_lists['build/include/T8'] = []
        services.folders_lists['build/include/T7'] = []
        services.folders_lists['build/include/T6'] = []
        services.folders_lists['build/include/T5'] = []
        services.folders_lists['build/include/T4'] = []
        services.folders_lists['build/include/T3'] = []
        services.folders_lists['build/include/T2'] = []
        services.folders_lists['build/include/T1'] = []

        reorganizer = HeaderReorganization(layout, services)

        reorganizer.reorganizeHeaders()
        self.assertEquals(2, len(services.linked_files))
        self.assertEquals(
            'build/include/T4',
            services.linked_files['Source/Module1/Plugins/File1.h'])
        self.assertEquals(
            'build/include/T8',
            services.linked_files['Source/Module1/Plugins/File9.h'])
        self.assertEquals(12, len(services.removed_files))
        self.assertTrue('build/include/T8/File2.h' in services.removed_files)
        self.assertTrue('build/include/T7/File2.h' in services.removed_files)
        self.assertTrue('build/include/T6/File2.h' in services.removed_files)
        self.assertTrue('build/include/T5/File2.h' in services.removed_files)
        self.assertTrue('build/include/T4/File2.h' in services.removed_files)
        self.assertTrue('build/include/T1/File2.h' in services.removed_files)
        self.assertTrue('build/include/T2/File2.h' in services.removed_files)
        self.assertTrue('build/include/T3/File2.h' in services.removed_files)
        self.assertTrue('build/include/T7/File9.h' in services.removed_files)
        self.assertTrue('build/include/T6/File9.h' in services.removed_files)
        self.assertTrue('build/include/T5/File9.h' in services.removed_files)
        self.assertTrue('build/include/T4/File9.h' in services.removed_files)
예제 #8
0
 def test_a_double_star_in_the_middle_can_match_no_folder_but_a_separator(
         self):
     project = ProjectLayout()
     project.addTierForModulesLike('afolder/**/someotherfolder', 6)
     self.assertEqual(6, project.tierForModule('afolder/someotherfolder'))
     self.assertEqual(
         6, project.tierForModule('afolder/anextrafolder/someotherfolder'))
     self.assertEqual(
         1, project.tierForModule('thewrongfolder/someotherfolder'))
     self.assertEqual(1,
                      project.tierForModule('afolder/alsothewrongfolder'))
예제 #9
0
 def test_multiple_source_folders_can_be_added(self):
     project = ProjectLayout()
     project.addSourceFolder('Source/Feature1')
     project.addSourceFolder('Source/Feature2')
     project.addSourceFolder('Source/Feature3')
     self.assertListEqual(
         ['Source/Feature1', 'Source/Feature2', 'Source/Feature3'],
         project.getSourceFolders())
예제 #10
0
    def test_reorganize_headers_when_a_target_folder_is_missing(self):
        layout = ProjectLayout()
        layout.addSourceFolder('Source')

        services = StubProjectServices()
        services.files_lists['Source'] = []
        services.files_lists['Source/Module1'] = [
            'File1.cpp', 'File1.h', 'File2.h'
        ]
        services.folders_lists['Source'] = ['Source/Module1']
        services.folders_lists['Source/Module1'] = []

        reorganizer = HeaderReorganization(layout, services)

        reorganizer.reorganizeHeaders()
        self.assertTrue('build/include/T1' in services.files_lists)
        self.assertEquals(2, len(services.linked_files))
        self.assertEquals('build/include/T1',
                          services.linked_files['Source/Module1/File1.h'])
        self.assertEquals('build/include/T1',
                          services.linked_files['Source/Module1/File2.h'])
예제 #11
0
    def test_headers_which_are_no_longer_in_the_sources_are_removed_from_the_destinations(
            self):
        layout = ProjectLayout()
        layout.addSourceFolder('Source')
        layout.addTierForModulesLike('**/Plugins', 4)

        services = StubProjectServices()
        services.files_lists['Source'] = []
        services.files_lists['Source/Module1'] = []
        services.files_lists['Source/Module1/Plugins'] = [
            'File1.cpp', 'File1.h'
        ]
        services.files_lists['build/include/T4'] = ['File2.h']
        services.folders_lists['Source'] = ['Source/Module1']
        services.folders_lists['Source/Module1'] = ['Source/Module1/Plugins']
        services.folders_lists['Source/Module1/Plugins'] = []
        services.folders_lists['build/include/T4'] = []

        reorganizer = HeaderReorganization(layout, services)

        reorganizer.reorganizeHeaders()
        self.assertEquals(1, len(services.linked_files))
        self.assertEquals(
            'build/include/T4',
            services.linked_files['Source/Module1/Plugins/File1.h'])
        self.assertEquals(1, len(services.removed_files))
        self.assertTrue('build/include/T4/File2.h' in services.removed_files)
예제 #12
0
    def test_headers_which_are_out_of_date_at_the_target_are_shifted(self):
        layout = ProjectLayout()
        layout.addSourceFolder('Source')
        layout.addTierForModulesLike('**/Plugins', 4)

        services = StubProjectServices()
        services.files_lists['Source'] = []
        services.files_lists['Source/Module1'] = []
        services.files_lists['Source/Module1/Plugins'] = [
            'File1.cpp', 'File1.h', 'File2.h'
        ]
        services.files_lists['build/include/T4'] = ['File1.h', 'File2.h']
        services.folders_lists['Source'] = ['Source/Module1']
        services.folders_lists['Source/Module1'] = ['Source/Module1/Plugins']
        services.folders_lists['Source/Module1/Plugins'] = []
        services.file_dates['Source/Module1/Plugins/File1.h'] = 'uptodate'
        services.file_dates['Source/Module1/Plugins/File2.h'] = 'uptodate'
        services.file_dates['build/include/T4/File1.h'] = 'notuptodate'
        services.file_dates['build/include/T4/File2.h'] = 'notuptodate'
        reorganizer = HeaderReorganization(layout, services)

        reorganizer.reorganizeHeaders()
        self.assertEquals(2, len(services.linked_files))
        self.assertEquals(
            'build/include/T4',
            services.linked_files['Source/Module1/Plugins/File1.h'])
        self.assertEquals(
            'build/include/T4',
            services.linked_files['Source/Module1/Plugins/File2.h'])
        self.assertEquals(2, len(services.removed_files))
        self.assertTrue('build/include/T4/File1.h' in services.removed_files)
        self.assertTrue('build/include/T4/File2.h' in services.removed_files)
예제 #13
0
 def test_an_underscore_in_the_pattern_matches_an_underscore(self):
     project = ProjectLayout()
     project.addTierForModulesLike('**/repository/I[A-Z]*_h', 6)
     self.assertEqual(
         6,
         project.tierForModule(
             'Source/Module1/repository/ISomeInterface_h'))
     self.assertEqual(
         1,
         project.tierForModule(
             'Source/Module1/repository/ISomeInterfacedoth'))
예제 #14
0
 def test_a_star_in_the_pattern_matches_a_dash(self):
     project = ProjectLayout()
     project.addTierForModulesLike('**/repository/*.h', 6)
     self.assertEqual(
         6,
         project.tierForModule(
             'Source/Module1/repository/I-SomeInterface.h'))
     self.assertEqual(
         1,
         project.tierForModule(
             'Source/Module1/repository/I-SomeInterfacedoth'))
예제 #15
0
    def test_resolve_include_path_for_a_higher_tier_module_with_reach_limit(
            self):
        layout = ProjectLayout()
        layout.addSourceFolder('Source')
        layout.setTierStepLimit(1)
        layout.addTierForModulesLike('**/Module2', 3)

        services = StubProjectServices()
        services.files_lists['Source'] = []
        services.files_lists['Source/Module2'] = [
            'Source/Module2/File1.cpp', 'Source/Module2/File1.h',
            'Source/Module2/File2.h'
        ]
        services.folders_lists['Source'] = ['Source/Module2']
        services.folders_lists['Source/Module2'] = []

        path_resolver = IncludePath(layout, services)
        self.assertEqual(['build/include/T2', 'build/include/T3'],
                         path_resolver.resolveIncludePaths('Source/Module2'))
예제 #16
0
    def test_private_headers_in_a_public_module_are_not_reorganized(self):
        layout = ProjectLayout()
        layout.addSourceFolder('Source')
        layout.addTierForModulesLike('**/public', 6)
        layout.addTierForModulesLike('**/public/*_p.h', 0)

        services = StubProjectServices()
        services.files_lists['Source'] = []
        services.files_lists['Source/Module1'] = []
        services.files_lists['Source/Module1/public'] = [
            'File1_p.cpp', 'File1_p.h', 'File2_p.h'
        ]
        services.folders_lists['Source'] = ['Source/Module1']
        services.folders_lists['Source/Module1'] = ['Source/Module1/public']
        services.folders_lists['Source/Module1/public'] = []

        reorganizer = HeaderReorganization(layout, services)

        reorganizer.reorganizeHeaders()
        self.assertEquals(0, len(services.linked_files))
예제 #17
0
    def test_public_headers_in_a_private_module_are_reorganized(self):
        layout = ProjectLayout()
        layout.addSourceFolder('Source')
        layout.addTierForModulesLike('**/private', 0)
        layout.addTierForModulesLike('**/private/Public*.h', 4)

        services = StubProjectServices()
        services.files_lists['Source'] = []
        services.files_lists['Source/Module1'] = []
        services.files_lists['Source/Module1/private'] = [
            'PublicFile1.cpp', 'PublicFile1.h', 'PublicFile2.h'
        ]
        services.folders_lists['Source'] = ['Source/Module1']
        services.folders_lists['Source/Module1'] = ['Source/Module1/private']
        services.folders_lists['Source/Module1/private'] = []

        reorganizer = HeaderReorganization(layout, services)

        reorganizer.reorganizeHeaders()
        self.assertEquals(2, len(services.linked_files))
        self.assertTrue(
            'Source/Module1/private/PublicFile1.h' in services.linked_files)
        self.assertTrue(
            'Source/Module1/private/PublicFile2.h' in services.linked_files)
예제 #18
0
    def test_reorganize_headers_for_a_prescient_module(self):
        layout = ProjectLayout()
        layout.addSourceFolder('Source')
        layout.addTierForModulesLike('**/Module2', 3, None, True)

        services = StubProjectServices()
        services.files_lists['Source'] = []
        services.files_lists['Source/Module2'] = [
            'Source/Module2/File1.cpp', 'Source/Module2/File1.h',
            'Source/Module2/File2.h'
        ]
        services.folders_lists['Source'] = ['Source/Module2']
        services.folders_lists['Source/Module2'] = []

        path_resolver = IncludePath(layout, services)
        self.assertEqual([
            'build/include/T0', 'build/include/T1', 'build/include/T2',
            'build/include/T3'
        ], path_resolver.resolveIncludePaths('Source/Module2'))
예제 #19
0
 def test_get_third_party_include_folder_returns_an_empty_list_for_higher_tiers_than_configured(
         self):
     project = ProjectLayout()
     project.addTierForModulesLike('*/CodeLib', 1, 'code/CodeLib')
     self.assertEqual([], project.getThirdPartyIncludeFolders(5))
예제 #20
0
 def test_get_third_party_include_folder_returns_an_empty_list_for_no_folders(
         self):
     project = ProjectLayout()
     project.addTierForModulesLike('*/CodeLib', 4, 'code/CodeLib')
     self.assertEqual([], project.getThirdPartyIncludeFolders(1))
예제 #21
0
 def test_get_include_folder_correct_when_multiple_tiers_requested(self):
     project = ProjectLayout()
     project.setBaseIncludeFolder('Build/include')
     self.assertEqual('Build/include/T1', project.getIncludeFolder(1))
     self.assertEqual('Build/include/T4', project.getIncludeFolder(4))
예제 #22
0
 def test_a_non_default_tier_can_be_configured_and_returned_for_a_module(
         self):
     project = ProjectLayout()
     project.addTierForModulesLike('**/BusinessLogic', 2)
     self.assertEqual(2,
                      project.tierForModule('Source/Module1/BusinessLogic'))
예제 #23
0
 def test_a_negative_value_can_be_used_for_a_private_tier(self):
     project = ProjectLayout()
     project.addTierForModulesLike('**/private', -1)
     self.assertEqual(0, project.tierForModule('Source/Module1/private'))
예제 #24
0
 def test_a_default_tier_is_returned_for_a_module_when_none_is_configured(
         self):
     project = ProjectLayout()
     self.assertEqual(1, project.tierForModule('Source/Module1/Entity'))
예제 #25
0
 def test_a_dot_cpp_file_is_not_an_include_file(self):
     project = ProjectLayout()
     self.assertFalse(project.isIncludeFile('Source/Module1/File.cpp'))
예제 #26
0
 def test_dots_in_extensions_are_escaped(self):
     project = ProjectLayout()
     project.addHeaderPattern('*.i')
     self.assertFalse(project.isIncludeFile('Source/Module1/Fileai'))
예제 #27
0
 def test_another_extension_can_be_added_to_includes(self):
     project = ProjectLayout()
     project.addHeaderPattern('*.i')
     self.assertTrue(project.isIncludeFile('Source/Module1/File.i'))
예제 #28
0
 def test_a_source_folder_can_be_added(self):
     project = ProjectLayout()
     project.addSourceFolder('Source/Feature1')
     self.assertListEqual(['Source/Feature1'], project.getSourceFolders())
예제 #29
0
 def test_get_third_party_include_folder_returns_third_party_folders_in_that_tier(
         self):
     project = ProjectLayout()
     project.addTierForModulesLike('*/CodeLib', 1, 'code/CodeLib')
     self.assertEqual(['code/CodeLib'],
                      project.getThirdPartyIncludeFolders(1))
예제 #30
0
 def test_a_dot_h_file_is_an_include_file(self):
     project = ProjectLayout()
     self.assertTrue(project.isIncludeFile('Source/Module1/File.h'))