def __init__(self, methodName='runTest'):
     super(TestFileSourceCollector, self).__init__(methodName)
     key_transformer = StandardKeyTransformer()
     ip_key_transformer = lambda key, value, state: state.state_id + '_ip'
     aggregate_fun = lambda old_value, item: old_value + 1
     filters = [CommentFilter('#'), SpacesFilter()]
     handlers = [StandardConfigSectionHandler(),
                 SimpleKeyListHandler.create_with_known_key_list('=', ['key13', 'key666'], key_transformer),
                 AggregateKeyValueHandler.create_with_known_key_list('=', ['key555', 'key999'], key_transformer, aggregate_fun, 0),
                 AggregateKeyValueHandler.create_with_known_key_list('=', ['ip0', 'ip1', 'ip2', 'ip3', 'ip4'], ip_key_transformer, aggregate_fun, 0)]
     self._collector = FileSourceCollector(filters, handlers, OrderedDict())
class TestFileSourceCollector(TestCase):

    def __init__(self, methodName='runTest'):
        super(TestFileSourceCollector, self).__init__(methodName)
        key_transformer = StandardKeyTransformer()
        ip_key_transformer = lambda key, value, state: state.state_id + '_ip'
        aggregate_fun = lambda old_value, item: old_value + 1
        filters = [CommentFilter('#'), SpacesFilter()]
        handlers = [StandardConfigSectionHandler(),
                    SimpleKeyListHandler.create_with_known_key_list('=', ['key13', 'key666'], key_transformer),
                    AggregateKeyValueHandler.create_with_known_key_list('=', ['key555', 'key999'], key_transformer, aggregate_fun, 0),
                    AggregateKeyValueHandler.create_with_known_key_list('=', ['ip0', 'ip1', 'ip2', 'ip3', 'ip4'], ip_key_transformer, aggregate_fun, 0)]
        self._collector = FileSourceCollector(filters, handlers, OrderedDict())

    def test_simple_collect(self):
        source =[' # first comment',
                 '\tkey13=IDDQD\t',
                 'key555=666 # BFG caliber ',
                 'key13=IDKFA # DOOM CHEAT\t\t\t',
                 '# second comment',
                 'key999=11',
                 'key555=999 # BFG some other characteristic']
        expected = OrderedDict([('key13', ['IDDQD', 'IDKFA']), ('key555', 2), ('key999', 1)])
        actual = self._collector.collect(source)
        self.assertDictEqual(expected, actual)

    def test_sections_collect(self):
        source =[' # comment',
                 '[section_number_1]',
                 '\t # non empty section\t',
                 'key13=IDDQD\t\t\t',
                 'key555=999 # some strange value',
                 '[section_number_2]',
                 '# empty section',
                 '[section_number_3]',
                 '# nonempty section',
                 'key13=IDKFA\t\t\t',
                 'key555=777 # yet one some strange value',
                 'key555=11']
        expected = OrderedDict([('section_number_1.key13', ['IDDQD']), ('section_number_1.key555', 1), ('section_number_3.key13', ['IDKFA']), ('section_number_3.key555', 2)])
        actual = self._collector.collect(source)
        self.assertDictEqual(expected, actual)

    def test_collect_with_skipped_items(self):
        source =[' # comment',
                 '[section_1]',
                 'key777=333',
                 'key13:999',
                 '[section_number_2',
                 '# yet one comment',
                 'key555=1111']
        expected = OrderedDict([('section_1.key555', 1)])
        actual = self._collector.collect(source)
        self.assertDictEqual(expected, actual)

    def test_collect_with_aggegate_by_one_key(self):
        source =[' # comment',
                 '[gate]',
                 'ip0=192.168.0.1',
                 'ip1=192.168.0.2',
                 '[dns]',
                 'ip0=192.168.100.1',
                 'ip1=192.168.101.1',
                 'ip2=192.168.122.2',
                 'ip9=192.168.166.66',
                 '[wins]',
                 'ip0=192.168.111.11']
        expected = OrderedDict([('gate_ip', 2), ('dns_ip', 3), ('wins_ip', 1)])
        actual = self._collector.collect(source)
        self.assertDictEqual(expected, actual)