1 """
2 tests for encutils.py
3 """
4 __version__ = '$Id: __init__.py 1143 2008-03-16 17:18:41Z cthedot $'
5
6 import httplib
7 from StringIO import StringIO
8 import sys
9 import unittest
10
11 try:
12 import encutils
13 except ImportError:
14 import cssutils.encutils as encutils
15
16
17 log = encutils.buildlog(stream=StringIO())
18
20
22 "build a fake HTTP response"
23 class FakeRes:
24 def __init__(self, content):
25 fp = StringIO(content)
26 self._info = httplib.HTTPMessage(fp)
27
28 def info(self):
29 return self._info
30 return FakeRes(content)
31
33 "encutils._getTextTypeByMediaType"
34 tests = {
35 'application/xml': encutils._XML_APPLICATION_TYPE,
36 'application/xml-dtd': encutils._XML_APPLICATION_TYPE,
37 'application/xml-external-parsed-entity': encutils._XML_APPLICATION_TYPE,
38 'application/xhtml+xml': encutils._XML_APPLICATION_TYPE,
39 'text/xml': encutils._XML_TEXT_TYPE,
40 'text/xml-external-parsed-entity': encutils._XML_TEXT_TYPE,
41 'text/xhtml+xml': encutils._XML_TEXT_TYPE,
42 'text/html': encutils._HTML_TEXT_TYPE,
43 'text/css': encutils._TEXT_UTF8,
44 'text/plain': encutils._TEXT_TYPE,
45 'x/x': encutils._OTHER_TYPE,
46 'ANYTHING': encutils._OTHER_TYPE
47 }
48 for test, exp in tests.items():
49 self.assertEqual(
50 exp, encutils._getTextTypeByMediaType(test, log=log))
51
53 "encutils._getTextType"
54 tests = {
55 u'\x00\x00\xFE\xFF<?xml version="1.0"': encutils._XML_APPLICATION_TYPE,
56 u'\xFF\xFE\x00\x00<?xml version="1.0"': encutils._XML_APPLICATION_TYPE,
57 u'\xFE\xFF<?xml version="1.0"': encutils._XML_APPLICATION_TYPE,
58 u'\xFF\xFE<?xml version="1.0"': encutils._XML_APPLICATION_TYPE,
59 u'\xef\xbb\xbf<?xml version="1.0"': encutils._XML_APPLICATION_TYPE,
60 u'<?xml version="1.0"': encutils._XML_APPLICATION_TYPE,
61 u'\x00\x00\xFE\xFFanything': encutils._OTHER_TYPE,
62 u'\xFF\xFE\x00\x00anything': encutils._OTHER_TYPE,
63 u'\xFE\xFFanything': encutils._OTHER_TYPE,
64 u'\xFF\xFEanything': encutils._OTHER_TYPE,
65 u'\xef\xbb\xbfanything': encutils._OTHER_TYPE,
66 u'x/x': encutils._OTHER_TYPE,
67 u'ANYTHING': encutils._OTHER_TYPE
68 }
69 for test, exp in tests.items():
70 self.assertEqual(
71 exp, encutils._getTextType(test, log=log))
72
92
139
141 "encutils.detectXMLEncoding"
142 tests = {
143
144 ('utf_32_be'): u'\x00\x00\xFE\xFFanything',
145 ('utf_32_le'): u'\xFF\xFE\x00\x00anything',
146 ('utf_16_be'): u'\xFE\xFFanything',
147 ('utf_16_le'): u'\xFF\xFEanything',
148 ('utf-8'): u'\xef\xbb\xbfanything',
149
150 ('ascii'): '<?xml version="1.0" encoding="ascii" ?>',
151 ('ascii'): "<?xml version='1.0' encoding='ascii' ?>",
152 ('iso-8859-1'): "<?xml version='1.0' encoding='iso-8859-1' ?>",
153
154 ('utf-8'): '<?xml version="1.0" ?>',
155 ('utf-8'): '<?xml version="1.0"?><x encoding="ascii"/>'
156 }
157 for exp, test in tests.items():
158 self.assertEqual(exp, encutils.detectXMLEncoding(test, log=log))
159
161 "encutils.tryEncodings"
162 try:
163 import chardet
164 tests = [
165 ('ascii', 'abc'),
166 ('windows-1252', u'\xf6'),
167 ('ascii', u'\u1111')
168 ]
169 except ImportError:
170 tests = [
171 ('ascii', 'abc'),
172 ('iso-8859-1', u'\xf6'),
173 ('utf-8', u'\u1111')
174 ]
175 for exp, test in tests:
176 self.assertEqual(exp, encutils.tryEncodings(test))
177
178
179 fulltests = {
180 ('utf-8', False): (
181 '''NoContentType''', '''OnlyText'''),
182
183
184
185 ('utf-8', False): (
186 '''Content-Type: application/xhtml+xml''',
187 '''<?xml version="1.0" ?>
188 <example>
189 <meta http-equiv="Content-Type"
190 content="application/xhtml+xml"/>
191 </example>'''),
192
193 ('iso-h', True): (
194 '''Content-Type: application/xhtml+xml;charset=iso-H''',
195 '''<?xml version="1.0" ?>
196 <example>
197 <meta http-equiv="Content-Type"
198 content="application/xhtml+xml"/>
199 </example>'''),
200
201 ('iso-h', True): (
202 '''Content-Type: application/xhtml+xml;charset=iso-H''',
203 '''<?xml version="1.0" ?>
204 <example>
205 <meta http-equiv="Content-Type"
206 content="application/xhtml+xml;charset=iso_M"/>
207 </example>'''),
208
209 ('iso-x', False): (
210 '''Content-Type: application/xhtml+xml''',
211 '''<?xml version="1.0" encoding="iso-X" ?>
212 <example>
213 <meta http-equiv="Content-Type"
214 content="application/xhtml+xml;charset=iso_M"/>
215 </example>'''),
216
217 ('iso-h', True): (
218 '''Content-Type: application/xhtml+xml;charset=iso-H''',
219 '''<?xml version="1.0" encoding="iso-X" ?>
220 <example/>'''),
221
222
223
224 ('ascii', False): (
225 '''Content-Type: text/xml''',
226 '''<?xml version="1.0" ?>
227 <example>
228 <meta http-equiv="Content-Type"
229 content="text/xml"/>
230 </example>'''),
231
232 ('iso-h', True): (
233 '''Content-Type: text/xml;charset=iso-H''',
234 '''<?xml version="1.0" ?>
235 <example>
236 <meta http-equiv="Content-Type"
237 content="text/xml"/>
238 </example>'''),
239
240 ('iso-h', True): (
241 '''Content-Type: text/xml;charset=iso-H''',
242 '''<?xml version="1.0" ?>
243 <example>
244 <meta http-equiv="Content-Type"
245 content="text/xml;charset=iso_M"/>
246 </example>'''),
247
248 ('ascii', False): (
249 '''Content-Type: text/xml''',
250 '''<?xml version="1.0" encoding="iso-X" ?>
251 <example>
252 <meta http-equiv="Content-Type"
253 content="text/xml;charset=iso_M"/>
254 </example>'''),
255
256 ('iso-h', True): (
257 '''Content-Type: text/xml;charset=iso-H''',
258 '''<?xml version="1.0" encoding="iso-X" ?>
259 <example/>'''),
260
261
262
263 (None, False): ('Content-Type: text/html;',
264 '''<meta http-equiv="Content-Type"
265 content="text/html">'''),
266
267 ('iso-h', True): ('Content-Type: text/html;charset=iso-H',
268 '''<meta http-equiv="Content-Type"
269 content="text/html">'''),
270
271 ('iso-m', False): ('Content-Type: text/html',
272 '''<meta http-equiv="Content-Type"
273 content="text/html;charset=iso-m">'''),
274
275 ('iso-h', True): ('Content-Type: text/html;charset=iso-H',
276 '''<meta http-equiv="Content-Type"
277 content="text/html;charset=iso-m">'''),
278
279
280 (None, False): (None,
281 '''<meta http-equiv="Content-Type"
282 content="text/html;charset=iso-m">'''),
283 (None, False): (None, '''text'''),
284 ('utf-8', False): (None, '''<?xml version='''),
285 ('utf-8', False): (None, '''<?xml version='''),
286 ('iso-x', False): (None, '''<?xml version="1.0" encoding="iso-X"?>''')
287 }
288
290 "encutils.getEncodingInfo"
291 for exp, test in self.fulltests.items():
292 header, text = test
293 if header:
294 res = encutils.getEncodingInfo(self._fakeRes(header), text)
295 else:
296 res = encutils.getEncodingInfo(text=text)
297 res = (res.encoding, res.mismatch)
298 self.assertEqual(exp, res)
299
300
301 if __name__ == '__main__':
302 unittest.main()
303