diff options
Diffstat (limited to 'test/test_language.py')
-rwxr-xr-x | test/test_language.py | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/test/test_language.py b/test/test_language.py new file mode 100755 index 000000000..0571275e7 --- /dev/null +++ b/test/test_language.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python + +# Authors: Engelbert Gruber; David Goodger +# Contact: grubert@users.sourceforge.net +# Revision: $Revision$ +# Date: $Date$ +# Copyright: This module has been placed in the public domain. + +""" +Tests for language module completeness. + +Specify a language code (e.g. "de") as a command-line parameter to test only +that language. +""" + +import sys +import os +import re +from types import UnicodeType +import DocutilsTestSupport # must be imported before docutils +import docutils.languages +import docutils.parsers.rst.languages +from docutils.parsers.rst import states, directives, roles + + +reference_language = 'en' + + +class LanguageTestSuite(DocutilsTestSupport.CustomTestSuite): + + language_module_pattern = re.compile('^([a-z]{2,3}(_[a-z]{2,8})*)\.py$') + + def __init__(self, languages=None): + DocutilsTestSupport.CustomTestSuite.__init__(self) + if languages: + self.languages = languages + else: + self.get_languages() + + def get_languages(self): + """ + Get installed language translations from docutils.languages and from + docutils.parsers.rst.languages. + """ + languages = {} + for mod in (os.listdir(docutils.languages.__path__[0]) + + os.listdir(docutils.parsers.rst.languages.__path__[0])): + match = self.language_module_pattern.match(mod) + if match: + languages[match.group(1)] = 1 + self.languages = languages.keys() + + def generateTests(self): + for language in self.languages: + for method in LanguageTestCase.test_methods: + self.addTestCase(LanguageTestCase, method, None, None, + id=language+'.py', language=language) + + +class LanguageTestCase(DocutilsTestSupport.CustomTestCase): + + test_methods = ['test_labels', 'test_bibliographic_fields', + 'test_directives', 'test_roles'] + """Names of methods used to test each language.""" + + def __init__(self, *args, **kwargs): + self.ref = docutils.languages.get_language(reference_language) + self.language = kwargs['language'] + del kwargs['language'] # only wanted here + DocutilsTestSupport.CustomTestCase.__init__(self, *args, **kwargs) + + def _xor(self, ref_dict, l_dict): + """ + Returns entries that are only in one dictionary. + (missing_in_lang, more_than_in_ref). + """ + missing = [] # in ref but not in l. + too_much = [] # in l but not in ref. + for label in ref_dict.keys(): + if not l_dict.has_key(label): + missing.append(label) + for label in l_dict.keys(): + if not ref_dict.has_key(label): + too_much.append(label) + return (missing, too_much) + + def _invert(self, adict): + """Return an inverted (keys & values swapped) dictionary.""" + inverted = {} + for key, value in adict.items(): + inverted[value] = key + return inverted + + def test_labels(self): + try: + module = docutils.languages.get_language(self.language) + if not module: + raise ImportError + except ImportError: + self.fail('No docutils.languages.%s module.' % self.language) + missed, unknown = self._xor(self.ref.labels, module.labels) + if missed or unknown: + self.fail('Module docutils.languages.%s.labels:\n' + ' Missed: %s; Unknown: %s' + % (self.language, str(missed), str(unknown))) + + def test_bibliographic_fields(self): + try: + module = docutils.languages.get_language(self.language) + if not module: + raise ImportError + except ImportError: + self.fail('No docutils.languages.%s module.' % self.language) + missed, unknown = self._xor( + self._invert(self.ref.bibliographic_fields), + self._invert(module.bibliographic_fields)) + if missed or unknown: + self.fail('Module docutils.languages.%s.bibliographic_fields:\n' + ' Missed: %s; Unknown: %s' + % (self.language, str(missed), str(unknown))) + + def test_directives(self): + try: + module = docutils.parsers.rst.languages.get_language( + self.language) + if not module: + raise ImportError + except ImportError: + self.fail('No docutils.parsers.rst.languages.%s module.' + % self.language) + failures = [] + for d in module.directives.keys(): + try: + func, msg = directives.directive(d, module, None) + if not func: + failures.append('"%s": unknown directive' % d) + except Exception, error: + failures.append('"%s": %s' % (d, error)) + inverted = self._invert(module.directives) + canonical = directives._directive_registry.keys() + canonical.sort() + canonical.remove('restructuredtext-test-directive') + for name in canonical: + if not inverted.has_key(name): + failures.append('"%s": translation missing' % name) + if failures: + text = ('Module docutils.parsers.rst.languages.%s:\n %s' + % (self.language, '\n '.join(failures))) + if type(text) == UnicodeType: + text = text.encode('raw_unicode_escape') + self.fail(text) + + def test_roles(self): + try: + module = docutils.parsers.rst.languages.get_language( + self.language) + if not module: + raise ImportError + module.roles + except ImportError: + self.fail('No docutils.parsers.rst.languages.%s module.' + % self.language) + except AttributeError: + self.fail('No "roles" mapping in docutils.parsers.rst.languages.' + '%s module.' % self.language) + failures = [] + for d in module.roles.values(): + try: + method = roles._role_registry[d] + #if not method: + # failures.append('"%s": unknown role' % d) + except KeyError, error: + failures.append('"%s": %s' % (d, error)) + inverted = self._invert(module.roles) + canonical = roles._role_registry.keys() + canonical.sort() + canonical.remove('restructuredtext-unimplemented-role') + for name in canonical: + if not inverted.has_key(name): + failures.append('"%s": translation missing' % name) + if failures: + text = ('Module docutils.parsers.rst.languages.%s:\n %s' + % (self.language, '\n '.join(failures))) + if type(text) == UnicodeType: + text = text.encode('raw_unicode_escape') + self.fail(text) + + +languages_to_test = [] + +def suite(): + s = LanguageTestSuite(languages_to_test) + s.generateTests() + return s + +def get_language_arguments(): + while len(sys.argv) > 1: + last = sys.argv[-1] + if last.startswith('-'): + break + languages_to_test.append(last) + sys.argv.pop() + languages_to_test.reverse() + + +if __name__ == '__main__': + get_language_arguments() + import unittest + unittest.main(defaultTest='suite') + +# vim: set et ts=4 ai : |