tox does not test with unsupported python versions.
[docutils.git] / docutils / test / test_language.py
blobde0372ca7fd394987679c14b97d40a509922ad42
1 #!/usr/bin/env python3
3 # $Id$
4 # Authors: Engelbert Gruber <grubert@users.sourceforge.net>;
5 # David Goodger <goodger@python.org>
6 # Copyright: This module has been placed in the public domain.
8 """
9 Tests for language module completeness.
11 Specify a language code (e.g. "de") as a command-line parameter to test only
12 that language.
13 """
15 from pathlib import Path
16 import os
17 import re
18 import sys
19 import unittest
21 if __name__ == '__main__':
22 # prepend the "docutils root" to the Python library path
23 # so we import the local `docutils` package.
24 sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
27 from docutils import frontend, languages, utils
28 from docutils.parsers.rst import languages as rst_languages
29 from docutils.parsers.rst.directives import _directive_registry # NoQA
30 from docutils.parsers.rst.roles import _role_registry # NoQA
32 LANGUAGE_MODULE_PATTERN = re.compile(r'^([a-z]{2,3}(_[a-z]{2,8})*)\.py$')
33 REPORTER = utils.new_reporter('', frontend.get_default_settings())
34 REF = languages.get_language('en', REPORTER)
37 def get_languages():
38 """
39 Get installed language translations from docutils.languages and from
40 docutils.parsers.rst.languages.
41 """
42 translations = set()
43 for mod in (os.listdir(languages.__path__[0])
44 + os.listdir(rst_languages.__path__[0])):
45 match = LANGUAGE_MODULE_PATTERN.match(mod)
46 if match:
47 translations.add(match.group(1))
48 language_list = list(translations)
49 # test language tag normalization:
50 language_list += ['en_gb', 'en_US', 'en-CA', 'de-DE', 'de-AT-1901',
51 'pt-BR', 'pt-foo-BR']
52 # test that locally created language files are also loaded.
53 # requires local_dummy_lang.py in test directory (testroot)
54 # The local_dummy_lang.py contains all the fields from both
55 # the docutils language tags and the parser.rst language tags
56 language_list += ['test.local_dummy_lang']
57 return language_list
60 class LanguageTestCase(unittest.TestCase):
61 maxDiff = None
63 def test_labels(self):
64 ref_labels = {*REF.labels}
65 for language in get_languages():
66 with self.subTest(id=f'{language}.py'):
67 try:
68 module = languages.get_language(language, REPORTER)
69 except ImportError:
70 mod = f'docutils.languages.{language}'
71 raise AssertionError(f'No {mod} module.')
72 self.assertIsNotNone(module)
73 self.assertSetEqual({*module.labels}, ref_labels)
75 def test_bibliographic_fields(self):
76 ref_fields = {*REF.bibliographic_fields.values()}
77 for language in get_languages():
78 with self.subTest(id=f'{language}.py'):
79 try:
80 module = languages.get_language(language, REPORTER)
81 except ImportError:
82 mod = f'docutils.languages.{language}'
83 raise AssertionError(f'No {mod} module.')
84 self.assertIsNotNone(module)
85 mod_fields = {*module.bibliographic_fields.values()}
86 self.assertSetEqual(mod_fields, ref_fields)
88 def test_directives(self):
89 for language in get_languages():
90 with self.subTest(id=f'{language}.py'):
91 try:
92 module = rst_languages.get_language(language)
93 except ImportError:
94 mod = f'docutils.parsers.rst.languages.{language}'
95 raise AssertionError(f'No {mod} module.')
96 self.assertIsNotNone(module)
97 for d in module.directives.values():
98 self.assertIn(d, _directive_registry)
99 for name in _directive_registry:
100 if name != 'restructuredtext-test-directive':
101 self.assertIn(name, set(module.directives.values()))
103 def test_roles(self):
104 for language in get_languages():
105 with self.subTest(id=f'{language}.py'):
106 try:
107 module = rst_languages.get_language(language)
108 except ImportError:
109 mod = f'docutils.parsers.rst.languages.{language}'
110 raise AssertionError(f'No {mod} module.')
111 self.assertIsNotNone(module)
112 for d in module.roles.values():
113 self.assertIn(d, _role_registry)
114 for name in _role_registry:
115 if name != 'restructuredtext-unimplemented-role':
116 self.assertIn(name, set(module.roles.values()))
119 if __name__ == '__main__':
120 unittest.main()