Changeset 92136 in webkit


Ignore:
Timestamp:
Aug 1, 2011 12:55:45 PM (13 years ago)
Author:
Dimitri Glazkov
Message:

Introduce SpecifierSorter, a thing that knows how specifiers should be ordered.
https://bugs.webkit.org/show_bug.cgi?id=65413

Reviewed by Adam Barth.

  • Scripts/webkitpy/layout_tests/models/test_configuration.py: Added SpecifierSorter and converted

existing code to use it.

  • Scripts/webkitpy/layout_tests/models/test_configuration_unittest.py: Added unit tests and cleaned up a bit.
Location:
trunk/Tools
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r92135 r92136  
     12011-08-01  Dimitri Glazkov  <dglazkov@chromium.org>
     2
     3        Introduce SpecifierSorter, a thing that knows how specifiers should be ordered.
     4        https://bugs.webkit.org/show_bug.cgi?id=65413
     5
     6        Reviewed by Adam Barth.
     7
     8        * Scripts/webkitpy/layout_tests/models/test_configuration.py: Added SpecifierSorter and converted
     9            existing code to use it.
     10        * Scripts/webkitpy/layout_tests/models/test_configuration_unittest.py: Added unit tests and cleaned up a bit.
     11
    1122011-08-01  Adam Barth  <abarth@webkit.org>
    213
  • trunk/Tools/Scripts/webkitpy/layout_tests/models/test_configuration.py

    r92006 r92136  
    6565
    6666
     67class SpecifierSorter:
     68    def __init__(self, all_test_configurations=None, macros=None):
     69        self._specifier_to_category = {}
     70
     71        if not all_test_configurations:
     72            return
     73        for test_configuration in all_test_configurations:
     74            for category, specifier in test_configuration.items():
     75                self.add_specifier(category, specifier)
     76
     77        if not macros:
     78            return
     79        # Assume well-formed macros.
     80        for macro, specifier_list in macros.items():
     81            self.add_specifier(self.category_for_specifier(specifier_list[0]), macro)
     82
     83    def add_specifier(self, category, specifier):
     84        self._specifier_to_category[specifier] = category
     85
     86    @classmethod
     87    def category_priority(cls, category):
     88        return TestConfiguration.category_order().index(category)
     89
     90    def specifier_priority(self, specifier):
     91        return self.category_priority(self._specifier_to_category[specifier])
     92
     93    def category_for_specifier(self, specifier):
     94        return self._specifier_to_category.get(specifier)
     95
     96    def sort_specifiers(self, specifiers):
     97        category_slots = map(lambda x: [], TestConfiguration.category_order())
     98        for specifier in specifiers:
     99            category_slots[self.specifier_priority(specifier)].append(specifier)
     100
     101        def sort_and_return(result, specifier_list):
     102            specifier_list.sort()
     103            return result + specifier_list
     104
     105        return reduce(sort_and_return, category_slots, [])
     106
     107
    67108class TestConfigurationConverter:
    68109    def __init__(self, all_test_configurations, configuration_macros=None):
     
    70111        self._configuration_macros = configuration_macros or {}
    71112        self._specifier_to_configuration_set = {}
    72         self._specifier_to_category = {}
     113        self._specifier_sorter = SpecifierSorter()
    73114        self._collapsing_sets_by_size = {}
    74115        self._junk_specifier_combinations = {}
     
    78119            for category, specifier in configuration.items():
    79120                self._specifier_to_configuration_set.setdefault(specifier, set()).add(configuration)
    80                 self._specifier_to_category[specifier] = category
     121                self._specifier_sorter.add_specifier(category, specifier)
    81122                collapsing_sets_by_category.setdefault(category, set()).add(specifier)
    82123                # FIXME: This seems extra-awful.
     
    88129            self._collapsing_sets_by_size.setdefault(len(collapsing_set), set()).add(frozenset(collapsing_set))
    89130
    90         def category_priority(category):
    91             return TestConfiguration.category_order().index(category)
    92 
    93         def specifier_priority(specifier):
    94             return category_priority(self._specifier_to_category[specifier])
    95 
    96131        for specifier, sets_by_category in matching_sets_by_category.items():
    97132            for category, set_by_category in sets_by_category.items():
    98                 if len(set_by_category) == 1 and category_priority(category) > specifier_priority(specifier):
     133                if len(set_by_category) == 1 and self._specifier_sorter.category_priority(category) > self._specifier_sorter.specifier_priority(specifier):
    99134                    self._junk_specifier_combinations[specifier] = set_by_category
    100135
     
    117152                        error_list.append("Unrecognized modifier '" + expanded_specifier + "'")
    118153                    return set()
    119                 category = self._specifier_to_category[expanded_specifier]
     154                category = self._specifier_sorter.category_for_specifier(expanded_specifier)
    120155                matching_sets.setdefault(category, set()).update(configurations)
    121156
  • trunk/Tools/Scripts/webkitpy/layout_tests/models/test_configuration_unittest.py

    r92006 r92136  
    3333
    3434
     35def make_mock_all_test_configurations_set():
     36    all_test_configurations = set()
     37    for version, architecture in (('snowleopard', 'x86'), ('xp', 'x86'), ('win7', 'x86'), ('lucid', 'x86'), ('lucid', 'x86_64')):
     38        for build_type in ('debug', 'release'):
     39            for graphics_type in ('cpu', 'gpu'):
     40                all_test_configurations.add(TestConfiguration(None, version, architecture, build_type, graphics_type))
     41    return all_test_configurations
     42
     43MOCK_MACROS = {
     44    'mac': ['snowleopard'],
     45    'win': ['xp', 'win7'],
     46    'linux': ['lucid'],
     47}
     48
     49
    3550class TestConfigurationTest(unittest.TestCase):
    3651    def test_items(self):
     
    92107
    93108
     109class SpecifierSorterTest(unittest.TestCase):
     110    def __init__(self, testFunc):
     111        self._all_test_configurations = make_mock_all_test_configurations_set()
     112        unittest.TestCase.__init__(self, testFunc)
     113
     114    def test_init(self):
     115        sorter = SpecifierSorter()
     116        self.assertEquals(sorter.category_for_specifier('control'), None)
     117        sorter = SpecifierSorter(self._all_test_configurations)
     118        self.assertEquals(sorter.category_for_specifier('xp'), 'version')
     119        sorter = SpecifierSorter(self._all_test_configurations, MOCK_MACROS)
     120        self.assertEquals(sorter.category_for_specifier('mac'), 'version')
     121
     122    def test_add_specifier(self):
     123        sorter = SpecifierSorter()
     124        self.assertEquals(sorter.category_for_specifier('control'), None)
     125        sorter.add_specifier('version', 'control')
     126        self.assertEquals(sorter.category_for_specifier('control'), 'version')
     127        sorter.add_specifier('version', 'one')
     128        self.assertEquals(sorter.category_for_specifier('one'), 'version')
     129        sorter.add_specifier('architecture', 'renaissance')
     130        self.assertEquals(sorter.category_for_specifier('one'), 'version')
     131        self.assertEquals(sorter.category_for_specifier('renaissance'), 'architecture')
     132
     133    def test_category_priority(self):
     134        sorter = SpecifierSorter(self._all_test_configurations)
     135        self.assertEquals(sorter.category_priority('version'), 0)
     136        self.assertEquals(sorter.category_priority('build_type'), 2)
     137
     138    def test_specifier_priority(self):
     139        sorter = SpecifierSorter(self._all_test_configurations)
     140        self.assertEquals(sorter.specifier_priority('x86'), 1)
     141        self.assertEquals(sorter.specifier_priority('gpu'), 3)
     142        self.assertEquals(sorter.specifier_priority('snowleopard'), 0)
     143
     144    def test_sort_specifiers(self):
     145        sorter = SpecifierSorter(self._all_test_configurations, MOCK_MACROS)
     146        self.assertEquals(sorter.sort_specifiers(set()), [])
     147        self.assertEquals(sorter.sort_specifiers(set(['x86'])), ['x86'])
     148        self.assertEquals(sorter.sort_specifiers(set(['x86', 'win7'])), ['win7', 'x86'])
     149        self.assertEquals(sorter.sort_specifiers(set(['gpu', 'x86', 'debug', 'win7'])), ['win7', 'x86', 'debug', 'gpu'])
     150        self.assertEquals(sorter.sort_specifiers(set(['gpu', 'snowleopard', 'x86', 'debug', 'win7'])), ['snowleopard', 'win7', 'x86', 'debug', 'gpu'])
     151        self.assertEquals(sorter.sort_specifiers(set(['gpu', 'x86', 'mac', 'debug', 'win7'])), ['mac', 'win7', 'x86', 'debug', 'gpu'])
     152
     153
    94154class TestConfigurationConverterTest(unittest.TestCase):
    95155    def __init__(self, testFunc):
    96         self._all_test_configurations = set()
    97         for version, architecture in (('snowleopard', 'x86'), ('xp', 'x86'), ('win7', 'x86'), ('lucid', 'x86'), ('lucid', 'x86_64')):
    98             for build_type in ('debug', 'release'):
    99                 for graphics_type in ('cpu', 'gpu'):
    100                     self._all_test_configurations.add(TestConfiguration(None, version, architecture, build_type, graphics_type))
    101         self._macros = {
    102             'mac': ['snowleopard'],
    103             'win': ['xp', 'win7'],
    104             'linux': ['lucid'],
    105         }
     156        self._all_test_configurations = make_mock_all_test_configurations_set()
    106157        unittest.TestCase.__init__(self, testFunc)
    107158
     
    180231
    181232    def test_macro_expansion(self):
    182         converter = TestConfigurationConverter(self._all_test_configurations, self._macros)
     233        converter = TestConfigurationConverter(self._all_test_configurations, MOCK_MACROS)
    183234
    184235        configs_to_match = set([
     
    284335
    285336    def test_converter_macro_collapsing(self):
    286         converter = TestConfigurationConverter(self._all_test_configurations, self._macros)
     337        converter = TestConfigurationConverter(self._all_test_configurations, MOCK_MACROS)
    287338
    288339        configs_to_match = set([
Note: See TracChangeset for help on using the changeset viewer.