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.
9 Tests for language module completeness.
11 Specify a language code (e.g. "de") as a command-line parameter to test only
18 import DocutilsTestSupport
# must be imported before docutils
19 import docutils
.languages
20 import docutils
.parsers
.rst
.languages
21 from docutils
.parsers
.rst
import states
, directives
, roles
24 reference_language
= 'en'
27 class LanguageTestSuite(DocutilsTestSupport
.CustomTestSuite
):
29 language_module_pattern
= re
.compile('^([a-z]{2,3}(_[a-z]{2,8})*)\.py$')
31 def __init__(self
, languages
=None):
32 DocutilsTestSupport
.CustomTestSuite
.__init
__(self
)
34 self
.languages
= languages
38 def get_languages(self
):
40 Get installed language translations from docutils.languages and from
41 docutils.parsers.rst.languages.
44 for mod
in (os
.listdir(docutils
.languages
.__path
__[0])
45 + os
.listdir(docutils
.parsers
.rst
.languages
.__path
__[0])):
46 match
= self
.language_module_pattern
.match(mod
)
48 languages
[match
.group(1)] = 1
49 self
.languages
= languages
.keys()
51 def generateTests(self
):
52 for language
in self
.languages
:
53 for method
in LanguageTestCase
.test_methods
:
54 self
.addTestCase(LanguageTestCase
, method
, None, None,
55 id=language
+'.py', language
=language
)
58 class LanguageTestCase(DocutilsTestSupport
.CustomTestCase
):
60 test_methods
= ['test_labels', 'test_bibliographic_fields',
61 'test_directives', 'test_roles']
62 """Names of methods used to test each language."""
64 def __init__(self
, *args
, **kwargs
):
65 self
.ref
= docutils
.languages
.get_language(reference_language
)
66 self
.language
= kwargs
['language']
67 del kwargs
['language'] # only wanted here
68 DocutilsTestSupport
.CustomTestCase
.__init
__(self
, *args
, **kwargs
)
70 def _xor(self
, ref_dict
, l_dict
):
72 Returns entries that are only in one dictionary.
73 (missing_in_lang, more_than_in_ref).
75 missing
= [] # in ref but not in l.
76 too_much
= [] # in l but not in ref.
77 for label
in ref_dict
.keys():
78 if label
not in l_dict
:
80 for label
in l_dict
.keys():
81 if label
not in ref_dict
:
82 too_much
.append(label
)
83 return (missing
, too_much
)
85 def _invert(self
, adict
):
86 """Return an inverted (keys & values swapped) dictionary."""
88 for key
, value
in adict
.items():
92 def test_labels(self
):
94 module
= docutils
.languages
.get_language(self
.language
)
98 self
.fail('No docutils.languages.%s module.' % self
.language
)
99 missed
, unknown
= self
._xor
(self
.ref
.labels
, module
.labels
)
100 if missed
or unknown
:
101 self
.fail('Module docutils.languages.%s.labels:\n'
102 ' Missed: %s; Unknown: %s'
103 % (self
.language
, str(missed
), str(unknown
)))
105 def test_bibliographic_fields(self
):
107 module
= docutils
.languages
.get_language(self
.language
)
111 self
.fail('No docutils.languages.%s module.' % self
.language
)
112 missed
, unknown
= self
._xor
(
113 self
._invert
(self
.ref
.bibliographic_fields
),
114 self
._invert
(module
.bibliographic_fields
))
115 if missed
or unknown
:
116 self
.fail('Module docutils.languages.%s.bibliographic_fields:\n'
117 ' Missed: %s; Unknown: %s'
118 % (self
.language
, str(missed
), str(unknown
)))
120 def test_directives(self
):
122 module
= docutils
.parsers
.rst
.languages
.get_language(
127 self
.fail('No docutils.parsers.rst.languages.%s module.'
130 for d
in module
.directives
.keys():
132 func
, msg
= directives
.directive(d
, module
, None)
134 failures
.append('"%s": unknown directive' % d
)
135 except Exception, error
:
136 failures
.append('"%s": %s' % (d
, error
))
137 inverted
= self
._invert
(module
.directives
)
138 canonical
= directives
._directive
_registry
.keys()
140 canonical
.remove('restructuredtext-test-directive')
141 for name
in canonical
:
142 if name
not in inverted
:
143 failures
.append('"%s": translation missing' % name
)
145 text
= ('Module docutils.parsers.rst.languages.%s:\n %s'
146 % (self
.language
, '\n '.join(failures
)))
147 if type(text
) is unicode:
148 text
= text
.encode('raw_unicode_escape')
151 def test_roles(self
):
153 module
= docutils
.parsers
.rst
.languages
.get_language(
159 self
.fail('No docutils.parsers.rst.languages.%s module.'
161 except AttributeError:
162 self
.fail('No "roles" mapping in docutils.parsers.rst.languages.'
163 '%s module.' % self
.language
)
165 for d
in module
.roles
.values():
167 method
= roles
._role
_registry
[d
]
169 # failures.append('"%s": unknown role' % d)
170 except KeyError, error
:
171 failures
.append('"%s": %s' % (d
, error
))
172 inverted
= self
._invert
(module
.roles
)
173 canonical
= roles
._role
_registry
.keys()
175 canonical
.remove('restructuredtext-unimplemented-role')
176 for name
in canonical
:
177 if name
not in inverted
:
178 failures
.append('"%s": translation missing' % name
)
180 text
= ('Module docutils.parsers.rst.languages.%s:\n %s'
181 % (self
.language
, '\n '.join(failures
)))
182 if type(text
) is unicode:
183 text
= text
.encode('raw_unicode_escape')
187 languages_to_test
= []
190 s
= LanguageTestSuite(languages_to_test
)
194 def get_language_arguments():
195 while len(sys
.argv
) > 1:
197 if last
.startswith('-'):
199 languages_to_test
.append(last
)
201 languages_to_test
.reverse()
204 if __name__
== '__main__':
205 get_language_arguments()
207 unittest
.main(defaultTest
='suite')
209 # vim: set et ts=4 ai :