1 """
2 testcases for cssutils.codec
3 """
4 __author__ = '$LastChangedBy: cthedot $'
5 __date__ = '$LastChangedDate: 2007-11-01 20:10:49 +0100 (Do, 01 Nov 2007) $'
6 __version__ = '$LastChangedRevision: 613 $'
7
8 import unittest
9
10 import codecs
11
12 from cssutils import codec
13
14
15 try:
16 codecs.lookup("utf-32")
17 except LookupError:
18 haveutf32 = False
19 else:
20 haveutf32 = True
21
22
24 """
25 queue: write bytes at one end, read bytes from the other end
26 """
29
32
33 - def read(self, size=-1):
34 if size<0:
35 s = self._buffer
36 self._buffer = ""
37 return s
38 else:
39 s = self._buffer[:size]
40 self._buffer = self._buffer[size:]
41 return s
42
43
45
47 self.assert_(codec._detectencoding_str('') is None)
48 self.assert_(codec._detectencoding_str('\xef') is None)
49 self.assertEqual(codec._detectencoding_str('\xef\x33'), "utf-8")
50 self.assert_(codec._detectencoding_str('\xef\xbb') is None)
51 self.assertEqual(codec._detectencoding_str('\xef\xbb\x33'), "utf-8")
52 self.assertEqual(codec._detectencoding_str('\xef\xbb\xbf'), "utf-8-sig")
53 self.assert_(codec._detectencoding_str('\xff') is None)
54 self.assertEqual(codec._detectencoding_str('\xff\x33'), "utf-8")
55 self.assert_(codec._detectencoding_str('\xff\xfe') is None)
56 self.assertEqual(codec._detectencoding_str('\xff\xfe\x33'), "utf-16")
57 self.assert_(codec._detectencoding_str('\xff\xfe\x00') is None)
58 self.assertEqual(codec._detectencoding_str('\xff\xfe\x00\x33'), "utf-16")
59 self.assertEqual(codec._detectencoding_str('\xff\xfe\x00\x00'), "utf-32")
60 self.assert_(codec._detectencoding_str('\x00') is None)
61 self.assertEqual(codec._detectencoding_str('\x00\x33'), "utf-8")
62 self.assert_(codec._detectencoding_str('\x00\x00') is None)
63 self.assertEqual(codec._detectencoding_str('\x00\x00\x33'), "utf-8")
64 self.assert_(codec._detectencoding_str('\x00\x00\xfe') is None)
65 self.assertEqual(codec._detectencoding_str('\x00\x00\x00\x33'), "utf-8")
66 self.assertEqual(codec._detectencoding_str('\x00\x00\x00@'), "utf-32-be")
67 self.assertEqual(codec._detectencoding_str('\x00\x00\xfe\xff'), "utf-32")
68 self.assert_(codec._detectencoding_str('@') is None)
69 self.assertEqual(codec._detectencoding_str('@\x33'), "utf-8")
70 self.assert_(codec._detectencoding_str('@\x00') is None)
71 self.assertEqual(codec._detectencoding_str('@\x00\x33'), "utf-8")
72 self.assert_(codec._detectencoding_str('@\x00\x00') is None)
73 self.assertEqual(codec._detectencoding_str('@\x00\x00\x33'), "utf-8")
74 self.assertEqual(codec._detectencoding_str('@\x00\x00\x00'), "utf-32-le")
75 self.assert_(codec._detectencoding_str('@c') is None)
76 self.assert_(codec._detectencoding_str('@ch') is None)
77 self.assert_(codec._detectencoding_str('@cha') is None)
78 self.assert_(codec._detectencoding_str('@char') is None)
79 self.assert_(codec._detectencoding_str('@chars') is None)
80 self.assert_(codec._detectencoding_str('@charse') is None)
81 self.assert_(codec._detectencoding_str('@charset') is None)
82 self.assert_(codec._detectencoding_str('@charset ') is None)
83 self.assert_(codec._detectencoding_str('@charset "') is None)
84 self.assert_(codec._detectencoding_str('@charset "x') is None)
85 self.assertEqual(codec._detectencoding_str('@charset ""'), "")
86 self.assertEqual(codec._detectencoding_str('@charset "x"'), "x")
87 self.assert_(codec._detectencoding_str("@", False) is None)
88 self.assertEqual(codec._detectencoding_str("@", True), "utf-8")
89 self.assert_(codec._detectencoding_str("@c", False) is None)
90 self.assertEqual(codec._detectencoding_str("@c", True), "utf-8")
91
97
99 s = u'@charset "'
100 self.assert_(codec._fixencoding(s, u"utf-8") is None)
101
102 s = u'@charset "x'
103 self.assert_(codec._fixencoding(s, u"utf-8") is None)
104
105 s = u'@charset "x'
106 self.assertEqual(codec._fixencoding(s, u"utf-8", True), s)
107
108 s = u'@charset x'
109 self.assertEqual(codec._fixencoding(s, u"utf-8"), s)
110
111 s = u'@charset "x"'
112 self.assertEqual(codec._fixencoding(s, u"utf-8"), s.replace('"x"', '"utf-8"'))
113
115 def checkauto(encoding, input=u'@charset "x";g\xfcrk\u20ac{}'):
116 outputencoding = encoding
117 if outputencoding == "utf-8-sig":
118 outputencoding = "utf-8"
119
120 d = codecs.getdecoder("css")
121 self.assertEqual(d(input.encode(encoding))[0], input.replace('"x"', '"%s"' % outputencoding))
122
123
124 self.assertEqual(d(input.encode(encoding), encoding=encoding)[0], input.replace('"x"', '"%s"' % outputencoding))
125
126 if hasattr(codec, "getincrementaldecoder"):
127
128 id = codecs.getincrementaldecoder("css")()
129 self.assertEqual("".join(id.iterdecode(input.encode(encoding))), input.replace('"x"', '"%s"' % outputencoding))
130
131
132 id = codecs.getincrementaldecoder("css")(encoding=encoding)
133 self.assertEqual("".join(id.iterdecode(input.encode(encoding))), input.replace('"x"', '"%s"' % outputencoding))
134
135
136 q = Queue()
137 sr = codecs.getreader("css")(q)
138 result = []
139 for c in input.encode(encoding):
140 q.write(c)
141 result.append(sr.read())
142 self.assertEqual("".join(result), input.replace('"x"', '"%s"' % outputencoding))
143
144
145 q = Queue()
146 sr = codecs.getreader("css")(q, encoding=encoding)
147 result = []
148 for c in input.encode(encoding):
149 q.write(c)
150 result.append(sr.read())
151 self.assertEqual("".join(result), input.replace('"x"', '"%s"' % outputencoding))
152
153
154
155 checkauto("utf-16")
156 checkauto("utf-16-le")
157 checkauto("utf-16-be")
158 if haveutf32:
159 checkauto("utf-32")
160 checkauto("utf-32-le")
161 checkauto("utf-32-be")
162
163 def checkdecl(encoding, input=u'@charset "%s";g\xfcrk{}'):
164
165 d = codecs.getdecoder("css")
166 input = input % encoding
167 outputencoding = encoding
168 if outputencoding == "utf-8-sig":
169 outputencoding = "utf-8"
170 self.assertEqual(d(input.encode(encoding))[0], input)
171
172
173 self.assertEqual(d(input.encode(encoding), encoding=encoding)[0], input)
174
175 if hasattr(codec, "getincrementaldecoder"):
176
177 id = codecs.getincrementaldecoder("css")()
178 self.assertEqual("".join(id.iterdecode(input.encode(encoding))), input)
179
180
181 id = codecs.getincrementaldecoder("css")(encoding)
182 self.assertEqual("".join(id.iterdecode(input.encode(encoding))), input)
183
184
185 q = Queue()
186 sr = codecs.getreader("css")(q)
187 result = []
188 for c in input.encode(encoding):
189 q.write(c)
190 result.append(sr.read())
191 self.assertEqual("".join(result), input)
192
193
194 q = Queue()
195 sr = codecs.getreader("css")(q, encoding=encoding)
196 result = []
197 for c in input.encode(encoding):
198 q.write(c)
199 result.append(sr.read())
200 self.assertEqual("".join(result), input)
201
202
203 checkdecl("utf-8")
204 checkdecl("iso-8859-1", u'@charset "%s";g\xfcrk')
205 checkdecl("iso-8859-15")
206 checkdecl("cp1252")
207
208
209 self.assertRaises(ValueError, '@charset "css";div{}'.decode, "css")
210
212 def check(encoding, input=u'@charset "x";g\xfcrk\u20ac{}'):
213 outputencoding = encoding
214 if outputencoding == "utf-8-sig":
215 outputencoding = "utf-8"
216
217
218 e = codecs.getencoder("css")
219 inputdecl = input.replace('"x"', '"%s"' % encoding)
220 outputdecl = input.replace('"x"', '"%s"' % outputencoding)
221 self.assertEqual(e(inputdecl)[0].decode(encoding), outputdecl)
222
223
224 self.assertEqual(e(input, encoding=encoding)[0].decode(encoding), outputdecl)
225
226 if hasattr(codec, "getincrementalencoder"):
227
228 ie = codecs.getincrementalencoder("css")()
229 self.assertEqual("".join(ie.iterencode(inputdecl)).decode(encoding), outputdecl)
230
231
232 ie = codecs.getincrementalencoder("css")(encoding=encoding)
233 self.assertEqual("".join(ie.iterencode(input)).decode(encoding), outputdecl)
234
235
236 q = Queue()
237 sw = codecs.getwriter("css")(q)
238 for c in inputdecl:
239 sw.write(c)
240 self.assertEqual(q.read().decode(encoding), input.replace('"x"', '"%s"' % outputencoding))
241
242
243 q = Queue()
244 sw = codecs.getwriter("css")(q, encoding=encoding)
245 for c in input:
246 sw.write(c)
247 self.assertEqual(q.read().decode(encoding), input.replace('"x"', '"%s"' % outputencoding))
248
249
250 check("utf-8-sig")
251 check("utf-16")
252 check("utf-16-le")
253 check("utf-16-be")
254 if haveutf32:
255 check("utf-32")
256 check("utf-32-le")
257 check("utf-32-be")
258 check("utf-8")
259 check("iso-8859-1", u'@charset "x";g\xfcrk{}')
260 check("iso-8859-15")
261 check("cp1252")
262
263
264 self.assertRaises(ValueError, u'@charset "css";div{}'.encode, "css")
265
266
267 if __name__ == '__main__':
268 import unittest
269 unittest.main()
270