#!/usr/bin/env python2 # vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2016, Kovid Goyal from __future__ import (unicode_literals, division, absolute_import, print_function) import unittest from setup import Command TEST_MODULES = frozenset('srv db polish opf css docx cfi matcher icu smartypants'.split()) def find_tests(which_tests=None): ans = [] a = ans.append def ok(x): return not which_tests or x in which_tests if ok('srv'): from calibre.srv.tests.main import find_tests a(find_tests()) if ok('db'): from calibre.db.tests.main import find_tests a(find_tests()) if ok('polish'): from calibre.ebooks.oeb.polish.tests.main import find_tests a(find_tests()) if ok('opf'): from calibre.ebooks.metadata.opf2 import suite a(suite()) from calibre.ebooks.metadata.opf3_test import suite a(suite()) if ok('css'): from tinycss.tests.main import find_tests a(find_tests()) from calibre.ebooks.oeb.normalize_css import test_normalization a(test_normalization(return_tests=True)) from calibre.ebooks.css_transform_rules import test a(test(return_tests=True)) from css_selectors.tests import find_tests a(find_tests()) if ok('docx'): from calibre.ebooks.docx.fields import test_parse_fields a(test_parse_fields(return_tests=True)) from calibre.ebooks.docx.writer.utils import test_convert_color a(test_convert_color(return_tests=True)) if ok('cfi'): from calibre.ebooks.epub.cfi.tests import find_tests a(find_tests()) if ok('matcher'): from calibre.utils.matcher import test a(test(return_tests=True)) if ok('icu'): from calibre.utils.icu_test import find_tests a(find_tests()) if ok('smartypants'): from calibre.utils.smartypants import run_tests a(run_tests(return_tests=True)) tests = unittest.TestSuite(ans) return tests def filter_tests(suite, *names): names = {x if x.startswith('test_') else 'test_' + x for x in names} tests = [] for test in suite._tests: if test.__class__.__name__ == 'ModuleImportFailure': raise Exception('Failed to import a test module: %s' % test) for s in test: if s._testMethodName in names: tests.append(s) return unittest.TestSuite(tests) class Test(Command): def add_options(self, parser): parser.add_option('--test-module', default=[], action='append', type='choice', choices=list(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', help='The name of an individual test to run. Can be specified more than once for multiple tests. The name of the' ' test is the name of the test function without the leading test_. For example, the function test_something()' ' can be run by specifying the name "something".') def run(self, opts): from calibre.gui2 import ensure_app, load_builtin_fonts ensure_app(), load_builtin_fonts() r = unittest.TextTestRunner tests = find_tests(which_tests=frozenset(opts.test_module)) if opts.test_name: tests = filter_tests(tests, *opts.test_name) r(verbosity=opts.test_verbosity).run(tests)