From 08d56e2eee72cf7f69e48ce2a6c9825e7b15b6c4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 4 Jul 2016 09:37:15 +0530 Subject: [PATCH] Add the tag mapper tests to the main test runner --- setup/test.py | 7 ++- src/calibre/ebooks/metadata/tag_mapper.py | 73 ++++++++++++----------- 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/setup/test.py b/setup/test.py index 56ade73453..ba364dd46d 100644 --- a/setup/test.py +++ b/setup/test.py @@ -8,7 +8,7 @@ import unittest from setup import Command -TEST_MODULES = frozenset('srv db polish opf css docx cfi matcher icu smartypants build'.split()) +TEST_MODULES = frozenset('srv db polish opf css docx cfi matcher icu smartypants build misc'.split()) def find_tests(which_tests=None): ans = [] @@ -59,6 +59,9 @@ def find_tests(which_tests=None): if ok('smartypants'): from calibre.utils.smartypants import run_tests a(run_tests(return_tests=True)) + if ok('misc'): + from calibre.ebooks.metadata.tag_mapper import find_tests + a(find_tests()) tests = unittest.TestSuite(ans) return tests @@ -68,7 +71,7 @@ class Test(Command): description = 'Run the calibre test suite' def add_options(self, parser): - parser.add_option('--test-module', default=[], action='append', type='choice', choices=sorted(map(str, TEST_MODULES)), + parser.add_option('--test-module', '--test-group', default=[], action='append', type='choice', choices=sorted(map(str, TEST_MODULES)), help='The test module to run (can be specified more than once for multiple modules). Choices: %s' % ', '.join(sorted(TEST_MODULES))) parser.add_option('--test-verbosity', type=int, default=4, help='Test verbosity (0-4)') parser.add_option('--test-name', default=[], action='append', diff --git a/src/calibre/ebooks/metadata/tag_mapper.py b/src/calibre/ebooks/metadata/tag_mapper.py index d34bf350fd..db8cec7c2f 100644 --- a/src/calibre/ebooks/metadata/tag_mapper.py +++ b/src/calibre/ebooks/metadata/tag_mapper.py @@ -122,42 +122,47 @@ def map_tags(tags, rules=()): ans.extend(apply_rules(t, rules)) return uniq(filter(None, ans)) -def test(): +def find_tests(): + import unittest + class TestTagMapper(unittest.TestCase): - def rule(action, query, replace=None, match_type='one_of'): - ans = {'action':action, 'query': query, 'match_type':match_type} - if replace is not None: - ans['replace'] = replace - return ans + def test_tag_mapper(self): - def run(rules, tags, expected): - if isinstance(rules, dict): - rules = [rules] - if isinstance(tags, type('')): - tags = [x.strip() for x in tags.split(',')] - if isinstance(expected, type('')): - expected = [x.strip() for x in expected.split(',')] - ans = map_tags(tags, rules) - if ans != expected: - raise AssertionError('Expected: %r != %r' % (expected, ans)) + def rule(action, query, replace=None, match_type='one_of'): + ans = {'action':action, 'query': query, 'match_type':match_type} + if replace is not None: + ans['replace'] = replace + return ans - run(rule('capitalize', 't1,t2'), 't1,x1', 'T1,x1') - run(rule('upper', 'ta,t2'), 'ta,x1', 'TA,x1') - run(rule('lower', 'ta,x1'), 'TA,X1', 'ta,x1') - run(rule('replace', 't1', 't2'), 't1,x1', 't2,x1') - run(rule('replace', '(.)1', r'\g<1>2', 'matches'), 't1,x1', 't2,x2') - run(rule('replace', '(.)1', r'\g<1>2,3', 'matches'), 't1,x1', 't2,3,x2') - run(rule('replace', 't1', 't2, t3'), 't1,x1', 't2,t3,x1') - run([rule('replace', 't1', 't2,t3'), rule('remove', 't2')], 't1,x1', 't3,x1') - run(rule('replace', 't1', 't1'), 't1,x1', 't1,x1') - run([rule('replace', 't1', 't2'), rule('replace', 't2', 't1')], 't1,t2', 't1,t2') - run(rule('replace', 'a', 'A'), 'a,b', 'A,b') - run(rule('replace', 'a,b', 'A,B'), 'a,b', 'A,B') - run(rule('replace', 'L', 'T', 'has'), 'L', 'T') - run(rule('split', '/', '/', 'has'), 'a/b/c,d', 'a,b,c,d') - run(rule('split', '/', '/', 'has'), '/,d', 'd') - run(rule('split', '/', '/', 'has'), '/a/', 'a') - run(rule('split', 'a,b', '/'), 'a,b', 'a,b') + def run(rules, tags, expected): + if isinstance(rules, dict): + rules = [rules] + if isinstance(tags, type('')): + tags = [x.strip() for x in tags.split(',')] + if isinstance(expected, type('')): + expected = [x.strip() for x in expected.split(',')] + ans = map_tags(tags, rules) + self.assertEqual(ans, expected) + + run(rule('capitalize', 't1,t2'), 't1,x1', 'T1,x1') + run(rule('upper', 'ta,t2'), 'ta,x1', 'TA,x1') + run(rule('lower', 'ta,x1'), 'TA,X1', 'ta,x1') + run(rule('replace', 't1', 't2'), 't1,x1', 't2,x1') + run(rule('replace', '(.)1', r'\g<1>2', 'matches'), 't1,x1', 't2,x2') + run(rule('replace', '(.)1', r'\g<1>2,3', 'matches'), 't1,x1', 't2,3,x2') + run(rule('replace', 't1', 't2, t3'), 't1,x1', 't2,t3,x1') + run([rule('replace', 't1', 't2,t3'), rule('remove', 't2')], 't1,x1', 't3,x1') + run(rule('replace', 't1', 't1'), 't1,x1', 't1,x1') + run([rule('replace', 't1', 't2'), rule('replace', 't2', 't1')], 't1,t2', 't1,t2') + run(rule('replace', 'a', 'A'), 'a,b', 'A,b') + run(rule('replace', 'a,b', 'A,B'), 'a,b', 'A,B') + run(rule('replace', 'L', 'T', 'has'), 'L', 'T') + run(rule('split', '/', '/', 'has'), 'a/b/c,d', 'a,b,c,d') + run(rule('split', '/', '/', 'has'), '/,d', 'd') + run(rule('split', '/', '/', 'has'), '/a/', 'a') + run(rule('split', 'a,b', '/'), 'a,b', 'a,b') + return unittest.defaultTestLoader.loadTestsFromTestCase(TestTagMapper) if __name__ == '__main__': - test() + from calibre.utils.run_tests import run_cli + run_cli(find_tests())