~n-muench/+junk/cssutils

« back to all changes in this revision

Viewing changes to src/tests/test_tokenize2.py

  • Committer: Nate Muench
  • Date: 2010-09-28 00:18:28 UTC
  • Revision ID: nowiwilldestroyabydos@gmail.com-20100928001828-70392l841d8fkqdv
Initial Import, Version 0.9.7b3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
"""Testcases for new cssutils.tokenize.Tokenizer
 
3
 
 
4
TODO: old tests as new ones are **not complete**!
 
5
"""
 
6
__version__ = '$Id: test_tokenize2.py 1794 2009-07-22 13:07:15Z cthedot $'
 
7
 
 
8
import xml.dom
 
9
import basetest
 
10
from cssutils.tokenize2 import *
 
11
 
 
12
class TokenizerTestCase(basetest.BaseTestCase):
 
13
 
 
14
    testsall = {
 
15
        # IDENT
 
16
        u'äöü߀': [('IDENT', u'äöü߀', 1, 1)],
 
17
        u' a ': [('S', u' ', 1, 1),
 
18
                 ('IDENT', u'a', 1, 2),
 
19
                 ('S', u' ', 1, 3)],
 
20
        u'_a': [('IDENT', u'_a', 1, 1)],
 
21
        u'-a': [('IDENT', u'-a', 1, 1)],
 
22
        u'aA-_\200\377': [('IDENT', u'aA-_\200\377', 1, 1)],
 
23
        u'a1': [('IDENT', u'a1', 1, 1)],
 
24
        # escapes must end with S or max 6 digits:
 
25
        u'\\44 b': [('IDENT', u'Db', 1, 1)],
 
26
        u'\\44  b': [('IDENT', u'D', 1, 1),
 
27
                     ('S', u' ', 1, 5),
 
28
                     ('IDENT', u'b', 1, 6)],
 
29
        u'\\44\nb': [('IDENT', u'Db', 1, 1)],
 
30
        u'\\44\rb': [('IDENT', u'Db', 1, 1)],
 
31
        u'\\44\fb': [('IDENT', u'Db', 1, 1)],
 
32
        u'\\44\n*': [('IDENT', u'D', 1, 1),
 
33
                    ('CHAR', u'*', 2, 1)],
 
34
        u'\\44  a': [('IDENT', u'D', 1, 1),
 
35
                    ('S', u' ', 1, 5),
 
36
                    ('IDENT', u'a', 1, 6)],
 
37
        # TODO:
 
38
        # Note that this means that a "real" space after the escape sequence 
 
39
        # must itself either be escaped or doubled:
 
40
        u'\\44\ x': [('IDENT', u'D\\ x', 1, 1)],
 
41
        u'\\44  ': [('IDENT', u'D', 1, 1),
 
42
                     ('S', u' ', 1, 5)],
 
43
 
 
44
        ur'\44': [('IDENT', u'D', 1, 1)],
 
45
        ur'\\': [('IDENT', ur'\\', 1, 1)],
 
46
        ur'\{': [('IDENT', ur'\{', 1, 1)],
 
47
        ur'\"': [('IDENT', ur'\"', 1, 1)],
 
48
        ur'\(': [('IDENT', ur'\(', 1, 1)],
 
49
        ur'\1 \22 \333 \4444 \55555 \666666 \777777 7 \7777777': [
 
50
                ('IDENT', u'\x01"\u0333\u4444\\55555 \\666666 \\777777 7', 1, 1),
 
51
                ('S', ' ', 1, 43),
 
52
                ('IDENT', '\\7777777', 1, 44)],
 
53
 
 
54
 
 
55
        u'\\1 b': [('IDENT', u'\x01b', 1, 1)],
 
56
        u'\\44 b': [('IDENT', u'Db', 1, 1)],
 
57
        u'\\123 b': [('IDENT', u'\u0123b', 1, 1)],
 
58
        u'\\1234 b': [('IDENT', u'\u1234b', 1, 1)],
 
59
        u'\\12345 b': [('IDENT', u'\\12345 b', 1, 1)],
 
60
        u'\\123456 b': [('IDENT', u'\\123456 b', 1, 1)],
 
61
        u'\\1234567 b': [('IDENT', u'\\1234567', 1, 1),
 
62
                         ('S', u' ', 1, 9),
 
63
                         ('IDENT', u'b', 1, 10)],
 
64
        u'\\{\\}\\(\\)\\[\\]\\#\\@\\.\\,':
 
65
            [('IDENT', u'\\{\\}\\(\\)\\[\\]\\#\\@\\.\\,', 1, 1)],
 
66
 
 
67
        # STRING
 
68
        u' "" ': [('S', u' ', 1, 1),
 
69
                 ('STRING', u'""', 1, 2),
 
70
                 ('S', u' ', 1, 4)],
 
71
        u' "\'" ': [('S', u' ', 1, 1),
 
72
                 ('STRING', u'"\'"', 1, 2),
 
73
                 ('S', u' ', 1, 5)],
 
74
        u" '' ": [('S', u' ', 1, 1),
 
75
                 ('STRING', u"''", 1, 2),
 
76
                 ('S', u' ', 1, 4)],
 
77
        u" '' ": [('S', u' ', 1, 1),
 
78
                 ('STRING', u"''", 1, 2),
 
79
                 ('S', u' ', 1, 4)],
 
80
        # until 0.9.5.x
 
81
        #u"'\\\n'": [('STRING', u"'\\\n'", 1, 1)],
 
82
        #u"'\\\n\\\n\\\n'": [('STRING', u"'\\\n\\\n\\\n'", 1, 1)],
 
83
        #u"'\\\f'": [('STRING', u"'\\\f'", 1, 1)],
 
84
        #u"'\\\r'": [('STRING', u"'\\\r'", 1, 1)],
 
85
        #u"'\\\r\n'": [('STRING', u"'\\\r\n'", 1, 1)],
 
86
        #u"'1\\\n2'": [('STRING', u"'1\\\n2'", 1, 1)],
 
87
        # from 0.9.6a0 escaped nl is removed from string
 
88
        u"'\\\n'": [('STRING', u"''", 1, 1)],
 
89
        u"'\\\n\\\n\\\n'": [('STRING', u"''", 1, 1)],
 
90
        u"'\\\f'": [('STRING', u"''", 1, 1)],
 
91
        u"'\\\r'": [('STRING', u"''", 1, 1)],
 
92
        u"'1\\\n2'": [('STRING', u"'12'", 1, 1)],
 
93
        u"'1\\\r\n2'": [('STRING', u"'12'", 1, 1)],
 
94
 
 
95
        # HASH
 
96
        u' #a ': [('S', u' ', 1, 1),
 
97
                 ('HASH', u'#a', 1, 2),
 
98
                 ('S', u' ', 1, 4)],
 
99
 
 
100
        u'#ccc': [('HASH', u'#ccc', 1, 1)],
 
101
        u'#111': [('HASH', u'#111', 1, 1)],
 
102
        u'#a1a1a1': [('HASH', u'#a1a1a1', 1, 1)],
 
103
        u'#1a1a1a': [('HASH', u'#1a1a1a', 1, 1)],
 
104
 
 
105
        # NUMBER, for plus see CSS3
 
106
        u' 0 ': [('S', u' ', 1, 1),
 
107
                 ('NUMBER', u'0', 1, 2),
 
108
                 ('S', u' ', 1, 3)],
 
109
        u' 0.1 ': [('S', u' ', 1, 1),
 
110
                 ('NUMBER', u'0.1', 1, 2),
 
111
                 ('S', u' ', 1, 5)],
 
112
        u' .0 ': [('S', u' ', 1, 1),
 
113
                 ('NUMBER', u'.0', 1, 2),
 
114
                 ('S', u' ', 1, 4)],
 
115
 
 
116
        u' -0 ': [('S', u' ', 1, 1),
 
117
                 ('CHAR', u'-', 1, 2),
 
118
                 ('NUMBER', u'0', 1, 3),
 
119
                 ('S', u' ', 1, 4)],
 
120
 
 
121
        # PERCENTAGE
 
122
        u' 0% ': [('S', u' ', 1, 1),
 
123
                 ('PERCENTAGE', u'0%', 1, 2),
 
124
                 ('S', u' ', 1, 4)],
 
125
        u' .5% ': [('S', u' ', 1, 1),
 
126
                 ('PERCENTAGE', u'.5%', 1, 2),
 
127
                 ('S', u' ', 1, 5)],
 
128
 
 
129
        # URI
 
130
        u' url() ': [('S', u' ', 1, 1),
 
131
                 ('URI', u'url()', 1, 2),
 
132
                 ('S', u' ', 1, 7)],
 
133
        u' url(a) ': [('S', u' ', 1, 1),
 
134
                 ('URI', u'url(a)', 1, 2),
 
135
                 ('S', u' ', 1, 8)],
 
136
        u' url("a") ': [('S', u' ', 1, 1),
 
137
                 ('URI', u'url("a")', 1, 2),
 
138
                 ('S', u' ', 1, 10)],
 
139
        u' url( a ) ': [('S', u' ', 1, 1),
 
140
                 ('URI', u'url( a )', 1, 2),
 
141
                 ('S', u' ', 1, 10)],
 
142
 
 
143
        # UNICODE-RANGE
 
144
 
 
145
        # CDO
 
146
        u' <!-- ': [('S', u' ', 1, 1),
 
147
                   ('CDO', u'<!--', 1, 2),
 
148
                   ('S', u' ', 1, 6)],
 
149
        u'"<!--""-->"': [('STRING', u'"<!--"', 1, 1),
 
150
                    ('STRING', u'"-->"', 1, 7)],
 
151
 
 
152
        # CDC
 
153
        u' --> ': [('S', u' ', 1, 1),
 
154
                  ('CDC', u'-->', 1, 2),
 
155
                  ('S', u' ', 1, 5)],
 
156
 
 
157
        # S
 
158
        u' ': [('S', u' ', 1, 1)],
 
159
        u'  ': [('S', u'  ', 1, 1)],
 
160
        u'\r': [('S', u'\r', 1, 1)],
 
161
        u'\n': [('S', u'\n', 1, 1)],
 
162
        u'\r\n': [('S', u'\r\n', 1, 1)],
 
163
        u'\f': [('S', u'\f', 1, 1)],
 
164
        u'\r': [('S', u'\r', 1, 1)],
 
165
        u'\t': [('S', u'\t', 1, 1)],
 
166
        u'\r\n\r\n\f\t ': [('S', u'\r\n\r\n\f\t ', 1, 1)],
 
167
 
 
168
        # COMMENT, for incomplete see later
 
169
        u'/*x*/ ': [('COMMENT', u'/*x*/', 1, 1),
 
170
                    ('S', u' ', 1, 6)],
 
171
 
 
172
        # FUNCTION
 
173
        u' x( ': [('S', u' ', 1, 1),
 
174
                  ('FUNCTION', u'x(', 1, 2),
 
175
                  ('S', u' ', 1, 4)],
 
176
 
 
177
        # INCLUDES
 
178
        u' ~= ': [('S', u' ', 1, 1),
 
179
                  ('INCLUDES', u'~=', 1, 2),
 
180
                  ('S', u' ', 1, 4)],
 
181
        u'~==': [('INCLUDES', u'~=', 1, 1), ('CHAR', u'=', 1, 3)],
 
182
 
 
183
        # DASHMATCH
 
184
        u' |= ': [('S', u' ', 1, 1),
 
185
                  ('DASHMATCH', u'|=', 1, 2),
 
186
                  ('S', u' ', 1, 4)],
 
187
        u'|==': [('DASHMATCH', u'|=', 1, 1), ('CHAR', u'=', 1, 3)],
 
188
 
 
189
        # CHAR
 
190
        u' @ ': [('S', u' ', 1, 1),
 
191
                  ('CHAR', u'@', 1, 2),
 
192
                  ('S', u' ', 1, 3)],
 
193
 
 
194
        # --- overwritten for CSS 2.1 ---
 
195
        # LBRACE
 
196
        u' { ': [('S', u' ', 1, 1),
 
197
                 ('CHAR', u'{', 1, 2),
 
198
                 ('S', u' ', 1, 3)],
 
199
        # PLUS
 
200
        u' + ': [('S', u' ', 1, 1),
 
201
                 ('CHAR', u'+', 1, 2),
 
202
                 ('S', u' ', 1, 3)],
 
203
        # GREATER
 
204
        u' > ': [('S', u' ', 1, 1),
 
205
                 ('CHAR', u'>', 1, 2),
 
206
                 ('S', u' ', 1, 3)],
 
207
        # COMMA
 
208
        u' , ': [('S', u' ', 1, 1),
 
209
                 ('CHAR', u',', 1, 2),
 
210
                 ('S', u' ', 1, 3)],
 
211
        # class
 
212
        u' . ': [('S', u' ', 1, 1),
 
213
                  ('CHAR', u'.', 1, 2),
 
214
                  ('S', u' ', 1, 3)],
 
215
        }
 
216
 
 
217
    tests3 = {     
 
218
        # UNICODE-RANGE
 
219
        u' u+0 ': [('S', u' ', 1, 1),
 
220
                  ('UNICODE-RANGE', u'u+0', 1, 2),
 
221
                  ('S', u' ', 1, 5)],
 
222
        u' u+01 ': [('S', u' ', 1, 1),
 
223
                  ('UNICODE-RANGE', u'u+01', 1, 2),
 
224
                  ('S', u' ', 1, 6)],
 
225
        u' u+012 ': [('S', u' ', 1, 1),
 
226
                  ('UNICODE-RANGE', u'u+012', 1, 2),
 
227
                  ('S', u' ', 1, 7)],
 
228
        u' u+0123 ': [('S', u' ', 1, 1),
 
229
                  ('UNICODE-RANGE', u'u+0123', 1, 2),
 
230
                  ('S', u' ', 1, 8)],
 
231
        u' u+01234 ': [('S', u' ', 1, 1),
 
232
                  ('UNICODE-RANGE', u'u+01234', 1, 2),
 
233
                  ('S', u' ', 1, 9)],
 
234
        u' u+012345 ': [('S', u' ', 1, 1),
 
235
                  ('UNICODE-RANGE', u'u+012345', 1, 2),
 
236
                  ('S', u' ', 1, 10)],
 
237
        u' u+0123456 ': [('S', u' ', 1, 1),
 
238
                  ('UNICODE-RANGE', u'u+012345', 1, 2),
 
239
                  ('NUMBER', u'6', 1, 10),
 
240
                  ('S', u' ', 1, 11)],
 
241
        u' U+123456 ': [('S', u' ', 1, 1),
 
242
                  ('UNICODE-RANGE', u'U+123456', 1, 2),
 
243
                  ('S', u' ', 1, 10)],
 
244
        u' \\55+abcdef ': [('S', u' ', 1, 1),
 
245
                  ('UNICODE-RANGE', u'U+abcdef', 1, 2),
 
246
                  ('S', u' ', 1, 12)],
 
247
        u' \\75+abcdef ': [('S', u' ', 1, 1),
 
248
                  ('UNICODE-RANGE', u'u+abcdef', 1, 2),
 
249
                  ('S', u' ', 1, 12)],
 
250
        u' u+0-1 ': [('S', u' ', 1, 1),
 
251
                  ('UNICODE-RANGE', u'u+0-1', 1, 2),
 
252
                  ('S', u' ', 1, 7)],
 
253
        u' u+0-1, u+123456-abcdef ': [('S', u' ', 1, 1),
 
254
                  ('UNICODE-RANGE', u'u+0-1', 1, 2),
 
255
                  ('CHAR', u',', 1, 7),
 
256
                  ('S', u' ', 1, 8),
 
257
                  ('UNICODE-RANGE', u'u+123456-abcdef', 1, 9),
 
258
                  ('S', u' ', 1, 24)],
 
259
 
 
260
        # specials
 
261
        u'c\\olor': [('IDENT', u'c\\olor', 1, 1)],
 
262
        u'-1': [('CHAR', u'-', 1, 1), ('NUMBER', u'1', 1, 2)],
 
263
        u'-1px': [('CHAR', u'-', 1, 1), ('DIMENSION', u'1px', 1, 2)],
 
264
 
 
265
        # ATKEYWORD
 
266
        u' @x ': [('S', u' ', 1, 1),
 
267
                  ('ATKEYWORD', u'@x', 1, 2),
 
268
                  ('S', u' ', 1, 4)],
 
269
        u'@X': [('ATKEYWORD', u'@X', 1, 1)],
 
270
        u'@\\x': [('ATKEYWORD', u'@\\x', 1, 1)],
 
271
        # -
 
272
        u'@1x': [('CHAR', u'@', 1, 1),
 
273
                  ('DIMENSION', u'1x', 1, 2)],
 
274
 
 
275
        # DIMENSION
 
276
        u' 0px ': [('S', u' ', 1, 1),
 
277
                 ('DIMENSION', u'0px', 1, 2),
 
278
                 ('S', u' ', 1, 5)],
 
279
        u' 1s ': [('S', u' ', 1, 1),
 
280
                 ('DIMENSION', u'1s', 1, 2),
 
281
                 ('S', u' ', 1, 4)],
 
282
        u'0.2EM': [('DIMENSION', u'0.2EM', 1, 1)],
 
283
        u'1p\\x': [('DIMENSION', u'1p\\x', 1, 1)],
 
284
        u'1PX': [('DIMENSION', u'1PX', 1, 1)],
 
285
 
 
286
        # NUMBER
 
287
        u' - 0 ': [('S', u' ', 1, 1),
 
288
                 ('CHAR', u'-', 1, 2),
 
289
                 ('S', u' ', 1, 3),
 
290
                 ('NUMBER', u'0', 1, 4),
 
291
                 ('S', u' ', 1, 5)],
 
292
        u' + 0 ': [('S', u' ', 1, 1),
 
293
                 ('CHAR', u'+', 1, 2),
 
294
                 ('S', u' ', 1, 3),
 
295
                 ('NUMBER', u'0', 1, 4),
 
296
                 ('S', u' ', 1, 5)],
 
297
 
 
298
        # PREFIXMATCH
 
299
        u' ^= ': [('S', u' ', 1, 1),
 
300
                  ('PREFIXMATCH', u'^=', 1, 2),
 
301
                  ('S', u' ', 1, 4)],
 
302
        u'^==': [('PREFIXMATCH', u'^=', 1, 1), ('CHAR', u'=', 1, 3)],
 
303
 
 
304
        # SUFFIXMATCH
 
305
        u' $= ': [('S', u' ', 1, 1),
 
306
                  ('SUFFIXMATCH', u'$=', 1, 2),
 
307
                  ('S', u' ', 1, 4)],
 
308
        u'$==': [('SUFFIXMATCH', u'$=', 1, 1), ('CHAR', u'=', 1, 3)],
 
309
 
 
310
        # SUBSTRINGMATCH
 
311
        u' *= ': [('S', u' ', 1, 1),
 
312
                  ('SUBSTRINGMATCH', u'*=', 1, 2),
 
313
                  ('S', u' ', 1, 4)],
 
314
        u'*==': [('SUBSTRINGMATCH', u'*=', 1, 1), ('CHAR', u'=', 1, 3)],
 
315
 
 
316
        # BOM only at start
 
317
        u'\xFEFF ': [('BOM', u'\xfeFF', 1, 1),
 
318
                  ('S', u' ', 1, 1)],
 
319
        u' \xFEFF ': [('S', u' ', 1, 1),
 
320
                  ('IDENT', u'\xfeFF', 1, 2),
 
321
                  ('S', u' ', 1, 5)],
 
322
        }
 
323
 
 
324
    tests2 = {
 
325
        # escapes work not for a-f!
 
326
        # IMPORT_SYM
 
327
        u' @import ': [('S', u' ', 1, 1),
 
328
                 ('IMPORT_SYM', u'@import', 1, 2),
 
329
                 ('S', u' ', 1, 9)],
 
330
        u'@IMPORT': [('IMPORT_SYM', u'@IMPORT', 1, 1)],
 
331
        u'@\\49\r\nMPORT': [('IMPORT_SYM', u'@\\49\r\nMPORT', 1, 1)],
 
332
        ur'@\i\m\p\o\r\t': [('IMPORT_SYM', ur'@\i\m\p\o\r\t', 1, 1)],
 
333
        ur'@\I\M\P\O\R\T': [('IMPORT_SYM', ur'@\I\M\P\O\R\T', 1, 1)],
 
334
        ur'@\49 \04d\0050\0004f\000052\54': [('IMPORT_SYM',
 
335
                                        ur'@\49 \04d\0050\0004f\000052\54',
 
336
                                        1, 1)],
 
337
        ur'@\69 \06d\0070\0006f\000072\74': [('IMPORT_SYM',
 
338
                                        ur'@\69 \06d\0070\0006f\000072\74',
 
339
                                        1, 1)],
 
340
 
 
341
        # PAGE_SYM
 
342
        u' @page ': [('S', u' ', 1, 1),
 
343
                 ('PAGE_SYM', u'@page', 1, 2),
 
344
                 ('S', u' ', 1, 7)],
 
345
        u'@PAGE': [('PAGE_SYM', u'@PAGE', 1, 1)],
 
346
        ur'@\pa\ge': [('PAGE_SYM', ur'@\pa\ge', 1, 1)],
 
347
        ur'@\PA\GE': [('PAGE_SYM', ur'@\PA\GE', 1, 1)],
 
348
        ur'@\50\41\47\45': [('PAGE_SYM', ur'@\50\41\47\45', 1, 1)],
 
349
        ur'@\70\61\67\65': [('PAGE_SYM', ur'@\70\61\67\65', 1, 1)],
 
350
 
 
351
        # MEDIA_SYM
 
352
        u' @media ': [('S', u' ', 1, 1),
 
353
                 ('MEDIA_SYM', u'@media', 1, 2),
 
354
                 ('S', u' ', 1, 8)],
 
355
        u'@MEDIA': [('MEDIA_SYM', u'@MEDIA', 1, 1)],
 
356
        ur'@\med\ia': [('MEDIA_SYM', ur'@\med\ia', 1, 1)],
 
357
        ur'@\MED\IA': [('MEDIA_SYM', ur'@\MED\IA', 1, 1)],
 
358
        u'@\\4d\n\\45\r\\44\t\\49\r\nA': [('MEDIA_SYM', u'@\\4d\n\\45\r\\44\t\\49\r\nA', 1, 1)],
 
359
        u'@\\4d\n\\45\r\\44\t\\49\r\\41\f': [('MEDIA_SYM',
 
360
                                        u'@\\4d\n\\45\r\\44\t\\49\r\\41\f',
 
361
                                        1, 1)],
 
362
        u'@\\6d\n\\65\r\\64\t\\69\r\\61\f': [('MEDIA_SYM',
 
363
                                        u'@\\6d\n\\65\r\\64\t\\69\r\\61\f',
 
364
                                        1, 1)],
 
365
 
 
366
        # FONT_FACE_SYM
 
367
        u' @font-face ': [('S', u' ', 1, 1),
 
368
                 ('FONT_FACE_SYM', u'@font-face', 1, 2),
 
369
                 ('S', u' ', 1, 12)],
 
370
        u'@FONT-FACE': [('FONT_FACE_SYM', u'@FONT-FACE', 1, 1)],
 
371
        ur'@f\o\n\t\-face': [('FONT_FACE_SYM', ur'@f\o\n\t\-face', 1, 1)],
 
372
        ur'@F\O\N\T\-FACE': [('FONT_FACE_SYM', ur'@F\O\N\T\-FACE', 1, 1)],
 
373
        # TODO: "-" as hex!
 
374
        ur'@\46\4f\4e\54\-\46\41\43\45': [('FONT_FACE_SYM',
 
375
            ur'@\46\4f\4e\54\-\46\41\43\45', 1, 1)],
 
376
        ur'@\66\6f\6e\74\-\66\61\63\65': [('FONT_FACE_SYM',
 
377
            ur'@\66\6f\6e\74\-\66\61\63\65', 1, 1)],
 
378
 
 
379
        # CHARSET_SYM only if "@charset "!
 
380
        u'@charset  ': [('CHARSET_SYM', u'@charset ', 1, 1),
 
381
                        ('S', u' ', 1, 10)],
 
382
        u' @charset  ': [('S', u' ', 1, 1),
 
383
                 ('CHARSET_SYM', u'@charset ', 1, 2), # not at start
 
384
                 ('S', u' ', 1, 11)],
 
385
        u'@charset': [('ATKEYWORD', u'@charset', 1, 1)], # no ending S
 
386
        u'@CHARSET ': [('ATKEYWORD', u'@CHARSET', 1, 1),# uppercase
 
387
                       ('S', u' ', 1, 9)],
 
388
        u'@cha\\rset ': [('ATKEYWORD', u'@cha\\rset', 1, 1), # not literal
 
389
                         ('S', u' ', 1, 10)],
 
390
 
 
391
        # NAMESPACE_SYM
 
392
        u' @namespace ': [('S', u' ', 1, 1),
 
393
                 ('NAMESPACE_SYM', u'@namespace', 1, 2),
 
394
                 ('S', u' ', 1, 12)],
 
395
        ur'@NAMESPACE': [('NAMESPACE_SYM', ur'@NAMESPACE', 1, 1)],
 
396
        ur'@\na\me\s\pace': [('NAMESPACE_SYM', ur'@\na\me\s\pace', 1, 1)],
 
397
        ur'@\NA\ME\S\PACE': [('NAMESPACE_SYM', ur'@\NA\ME\S\PACE', 1, 1)],
 
398
        ur'@\4e\41\4d\45\53\50\41\43\45': [('NAMESPACE_SYM',
 
399
            ur'@\4e\41\4d\45\53\50\41\43\45', 1, 1)],
 
400
        ur'@\6e\61\6d\65\73\70\61\63\65': [('NAMESPACE_SYM',
 
401
            ur'@\6e\61\6d\65\73\70\61\63\65', 1, 1)],
 
402
 
 
403
        # ATKEYWORD
 
404
        u' @unknown ': [('S', u' ', 1, 1),
 
405
                 ('ATKEYWORD', u'@unknown', 1, 2),
 
406
                 ('S', u' ', 1, 10)],
 
407
 
 
408
        # STRING
 
409
        # strings with linebreak in it
 
410
        u' "\\na"\na': [('S', u' ', 1, 1),
 
411
                   ('STRING', u'"\\na"', 1, 2),
 
412
                   ('S', u'\n', 1, 7),
 
413
                   ('IDENT', u'a', 2, 1)],
 
414
        u" '\\na'\na": [('S', u' ', 1, 1),
 
415
                   ('STRING', u"'\\na'", 1, 2),
 
416
                   ('S', u'\n', 1, 7),
 
417
                   ('IDENT', u'a', 2, 1)],
 
418
        u' "\\r\\n\\t\\n\\ra"a': [('S', u' ', 1, 1),
 
419
                   ('STRING', u'"\\r\\n\\t\\n\\ra"', 1, 2),
 
420
                   ('IDENT', u'a', 1, 15)],
 
421
 
 
422
        # IMPORTANT_SYM is not IDENT!!!
 
423
        u' !important ': [('S', u' ', 1, 1),
 
424
                ('CHAR', u'!', 1, 2),
 
425
                 ('IDENT', u'important', 1, 3),
 
426
                 ('S', u' ', 1, 12)],
 
427
        u'! /*1*/ important ': [
 
428
                ('CHAR', u'!', 1, 1),
 
429
                ('S', u' ', 1, 2),
 
430
                ('COMMENT', u'/*1*/', 1, 3),
 
431
                ('S', u' ', 1, 8),
 
432
                 ('IDENT', u'important', 1, 9),
 
433
                 ('S', u' ', 1, 18)],
 
434
        u'! important': [('CHAR', u'!', 1, 1),
 
435
                         ('S', u' ', 1, 2),
 
436
                         ('IDENT', u'important', 1, 3)],
 
437
        u'!\n\timportant': [('CHAR', u'!', 1, 1),
 
438
                            ('S', u'\n\t', 1, 2),
 
439
                            ('IDENT', u'important', 2, 2)],
 
440
        u'!IMPORTANT': [('CHAR', u'!', 1, 1),
 
441
                        ('IDENT', u'IMPORTANT', 1, 2)],
 
442
        ur'!\i\m\p\o\r\ta\n\t': [('CHAR', u'!', 1, 1),
 
443
                                 ('IDENT',
 
444
                                  ur'\i\m\p\o\r\ta\n\t', 1, 2)],
 
445
        ur'!\I\M\P\O\R\Ta\N\T': [('CHAR', u'!', 1, 1),
 
446
                                 ('IDENT',
 
447
                                  ur'\I\M\P\O\R\Ta\N\T', 1, 2)],
 
448
        ur'!\49\4d\50\4f\52\54\41\4e\54': [('CHAR', u'!', 1, 1),
 
449
                                           ('IDENT',
 
450
                                            ur'IMPORTANT',
 
451
                                            1, 2)],
 
452
        ur'!\69\6d\70\6f\72\74\61\6e\74': [('CHAR', u'!', 1, 1),
 
453
                                           ('IDENT',
 
454
                                            ur'important',
 
455
                                            1, 2)],
 
456
        }
 
457
 
 
458
    # overwriting tests in testsall
 
459
    tests2only = {
 
460
        # LBRACE
 
461
        u' { ': [('S', u' ', 1, 1),
 
462
                 ('LBRACE', u'{', 1, 2),
 
463
                 ('S', u' ', 1, 3)],
 
464
        # PLUS
 
465
        u' + ': [('S', u' ', 1, 1),
 
466
                 ('PLUS', u'+', 1, 2),
 
467
                 ('S', u' ', 1, 3)],
 
468
        # GREATER
 
469
        u' > ': [('S', u' ', 1, 1),
 
470
                 ('GREATER', u'>', 1, 2),
 
471
                 ('S', u' ', 1, 3)],
 
472
        # COMMA
 
473
        u' , ': [('S', u' ', 1, 1),
 
474
                 ('COMMA', u',', 1, 2),
 
475
                 ('S', u' ', 1, 3)],
 
476
        # class
 
477
        u' . ': [('S', u' ', 1, 1),
 
478
                 ('CLASS', u'.', 1, 2),
 
479
                 ('S', u' ', 1, 3)],
 
480
        }
 
481
 
 
482
    testsfullsheet = {
 
483
        # escape ends with explicit space but \r\n as single space
 
484
        u'\\65\r\nb': [('IDENT', u'eb', 1, 1)],
 
485
 
 
486
        # STRING
 
487
        ur'"\""': [('STRING', ur'"\""', 1, 1)],
 
488
        ur'"\" "': [('STRING', ur'"\" "', 1, 1)],
 
489
        u"""'\\''""": [('STRING', u"""'\\''""", 1, 1)],
 
490
        u'''"\\""''': [('STRING', u'''"\\""''', 1, 1)],
 
491
        u' "\na': [('S', u' ', 1, 1),
 
492
                   ('INVALID', u'"', 1, 2),
 
493
                   ('S', u'\n', 1, 3),
 
494
                   ('IDENT', u'a', 2, 1)],
 
495
 
 
496
        # strings with linebreak in it
 
497
        u' "\\na\na': [('S', u' ', 1, 1),
 
498
                   ('INVALID', u'"\\na', 1, 2),
 
499
                   ('S', u'\n', 1, 6),
 
500
                   ('IDENT', u'a', 2, 1)],
 
501
        u' "\\r\\n\\t\\n\\ra\na': [('S', u' ', 1, 1),
 
502
                   ('INVALID', u'"\\r\\n\\t\\n\\ra', 1, 2),
 
503
                   ('S', u'\n', 1, 14),
 
504
                   ('IDENT', u'a', 2, 1)],
 
505
        # URI
 
506
        u'ur\\l(a)': [('URI', u'ur\\l(a)', 1, 1)],
 
507
        u'url(a)': [('URI', u'url(a)', 1, 1)],
 
508
        u'\\55r\\4c(a)': [('URI', u'UrL(a)', 1, 1)],
 
509
        u'\\75r\\6c(a)': [('URI', u'url(a)', 1, 1)],        
 
510
        u' url())': [('S', u' ', 1, 1),
 
511
                 ('URI', u'url()', 1, 2),
 
512
                 ('CHAR', u')', 1, 7)],
 
513
        u'url("x"))': [('URI', u'url("x")', 1, 1),
 
514
                       ('CHAR', u')', 1, 9)],
 
515
        u"url('x'))": [('URI', u"url('x')", 1, 1),
 
516
                       ('CHAR', u')', 1, 9)],
 
517
        }
 
518
 
 
519
    # tests if fullsheet=False is set on tokenizer
 
520
    testsfullsheetfalse = {
 
521
        # COMMENT incomplete
 
522
        u'/*': [('CHAR', u'/', 1, 1),
 
523
                ('CHAR', u'*', 1, 2)],
 
524
 
 
525
        # INVALID incomplete
 
526
        u' " ': [('S', u' ', 1, 1),
 
527
                 ('INVALID', u'" ', 1, 2)],
 
528
        u" 'abc\"with quote\" in it": [('S', u' ', 1, 1),
 
529
                 ('INVALID', u"'abc\"with quote\" in it", 1, 2)],
 
530
 
 
531
        # URI incomplete
 
532
        u'url(a': [('FUNCTION', u'url(', 1, 1),
 
533
                   ('IDENT', u'a', 1, 5)],
 
534
        u'url("a': [('FUNCTION', u'url(', 1, 1),
 
535
                   ('INVALID', u'"a', 1, 5)],
 
536
        u"url('a": [('FUNCTION', u'url(', 1, 1),
 
537
                   ('INVALID', u"'a", 1, 5)],
 
538
        u"UR\\l('a": [('FUNCTION', u'UR\\l(', 1, 1),
 
539
                   ('INVALID', u"'a", 1, 6)],
 
540
        }
 
541
 
 
542
    # tests if fullsheet=True is set on tokenizer
 
543
    testsfullsheettrue = {
 
544
        # COMMENT incomplete
 
545
        u'/*': [('COMMENT', u'/**/', 1, 1)],
 
546
 
 
547
#        # INVALID incomplete => STRING 
 
548
        u' " ': [('S', u' ', 1, 1),
 
549
                 ('STRING', u'" "', 1, 2)],
 
550
        u" 'abc\"with quote\" in it": [('S', u' ', 1, 1),
 
551
                 ('STRING', u"'abc\"with quote\" in it'", 1, 2)],
 
552
 
 
553
        # URI incomplete FUNC => URI
 
554
        u'url(a': [('URI', u'url(a)', 1, 1)],
 
555
        u'url( a': [('URI', u'url( a)', 1, 1)],
 
556
        u'url("a': [('URI', u'url("a")', 1, 1)],
 
557
        u'url( "a ': [('URI', u'url( "a ")', 1, 1)],
 
558
        u"url('a": [('URI', u"url('a')", 1, 1)],
 
559
        u'url("a"': [('URI', u'url("a")', 1, 1)],
 
560
        u"url('a'": [('URI', u"url('a')", 1, 1)],
 
561
        }
 
562
 
 
563
    def setUp(self):
 
564
        #log = cssutils.errorhandler.ErrorHandler()
 
565
        self.tokenizer = Tokenizer()
 
566
 
 
567
#    NOT USED
 
568
#    def test_push(self):
 
569
#        "Tokenizer.push()"
 
570
#        r = []
 
571
#        def do():
 
572
#            T = Tokenizer()
 
573
#            x = False
 
574
#            for t in T.tokenize('1 x 2 3'):
 
575
#                if not x and t[1] == 'x':
 
576
#                    T.push(t)
 
577
#                    x = True
 
578
#                r.append(t[1])
 
579
#            return ''.join(r)
 
580
#    
 
581
#        # push reinserts token into token stream, so x is doubled 
 
582
#        self.assertEqual('1 xx 2 3', do()) 
 
583
 
 
584
#    def test_linenumbers(self):
 
585
#        "Tokenizer line + col"
 
586
#        pass
 
587
 
 
588
    def test_tokenize(self):
 
589
        "cssutils Tokenizer().tokenize()"
 
590
        import cssutils.cssproductions
 
591
        tokenizer = Tokenizer(cssutils.cssproductions.MACROS,
 
592
                              cssutils.cssproductions.PRODUCTIONS)
 
593
        tests = {}
 
594
        tests.update(self.testsall)
 
595
        tests.update(self.tests2)
 
596
        tests.update(self.tests3)
 
597
        tests.update(self.testsfullsheet)
 
598
        tests.update(self.testsfullsheetfalse)
 
599
        for css in tests:
 
600
            # check token format
 
601
            tokens = tokenizer.tokenize(css)
 
602
            for i, actual in enumerate(tokens):
 
603
                expected = tests[css][i]
 
604
                self.assertEqual(expected, actual)
 
605
 
 
606
            # check if all same number of tokens
 
607
            tokens = [t for t in tokenizer.tokenize(css)]
 
608
            self.assertEqual(len(tokens), len(tests[css]))
 
609
 
 
610
    def test_tokenizefullsheet(self):
 
611
        "cssutils Tokenizer().tokenize(fullsheet=True)"
 
612
        import cssutils.cssproductions
 
613
        tokenizer = Tokenizer(cssutils.cssproductions.MACROS,
 
614
                              cssutils.cssproductions.PRODUCTIONS)
 
615
        tests = {}
 
616
        tests.update(self.testsall)
 
617
        tests.update(self.tests2)
 
618
        tests.update(self.tests3)
 
619
        tests.update(self.testsfullsheet)
 
620
        tests.update(self.testsfullsheettrue)
 
621
        for css in tests:
 
622
            # check token format
 
623
            tokens = tokenizer.tokenize(css, fullsheet=True)
 
624
            for i, actual in enumerate(tokens):
 
625
                try:
 
626
                    expected = tests[css][i]
 
627
                except IndexError:
 
628
                    # EOF is added
 
629
                    self.assertEqual(actual[0], 'EOF')
 
630
                else:
 
631
                    self.assertEqual(expected, actual)
 
632
 
 
633
            # check if all same number of tokens
 
634
            tokens = [t for t in tokenizer.tokenize(css, fullsheet=True)]
 
635
            # EOF is added so -1
 
636
            self.assertEqual(len(tokens) - 1, len(tests[css]))
 
637
 
 
638
 
 
639
    # --------------
 
640
 
 
641
    def __old(self):
 
642
 
 
643
        testsOLD = {
 
644
            u'x x1 -x .-x #_x -': [(1, 1, tt.IDENT, u'x'),
 
645
               (1, 2, 'S', u' '),
 
646
               (1, 3, tt.IDENT, u'x1'),
 
647
               (1, 5, 'S', u' '),
 
648
               (1, 6, tt.IDENT, u'-x'),
 
649
               (1, 8, 'S', u' '),
 
650
               (1, 9, tt.CLASS, u'.'),
 
651
               (1, 10, tt.IDENT, u'-x'),
 
652
               (1, 12, 'S', u' '),
 
653
               (1, 13, tt.HASH, u'#_x'),
 
654
               (1, 16, 'S', u' '),
 
655
               (1, 17, 'DELIM', u'-')],
 
656
 
 
657
            # num
 
658
            u'1 1.1 -1 -1.1 .1 -.1 1.': [(1, 1, tt.NUMBER, u'1'),
 
659
               (1, 2, 'S', u' '), (1, 3, tt.NUMBER, u'1.1'),
 
660
               (1, 6, 'S', u' '), (1, 7, tt.NUMBER, u'-1'),
 
661
               (1, 9, 'S', u' '), (1, 10, tt.NUMBER, u'-1.1'),
 
662
               (1, 14, 'S', u' '), (1, 15, tt.NUMBER, u'0.1'),
 
663
               (1, 17, 'S', u' '), (1, 18, tt.NUMBER, u'-0.1'),
 
664
               (1, 21, 'S', u' '),
 
665
               (1, 22, tt.NUMBER, u'1'), (1, 23, tt.CLASS, u'.')
 
666
                                         ],
 
667
            # CSS3 pseudo
 
668
            u'::': [(1, 1, tt.PSEUDO_ELEMENT, u'::')],
 
669
 
 
670
            # SPECIALS
 
671
            u'*+>~{},': [(1, 1, tt.UNIVERSAL, u'*'),
 
672
               (1, 2, tt.PLUS, u'+'),
 
673
               (1, 3, tt.GREATER, u'>'),
 
674
               (1, 4, tt.TILDE, u'~'),
 
675
               (1, 5, tt.LBRACE, u'{'),
 
676
               (1, 6, tt.RBRACE, u'}'),
 
677
               (1, 7, tt.COMMA, u',')],
 
678
 
 
679
            # DELIM
 
680
            u'!%:&$|': [(1, 1, 'DELIM', u'!'),
 
681
               (1, 2, 'DELIM', u'%'),
 
682
               (1, 3, 'DELIM', u':'),
 
683
               (1, 4, 'DELIM', u'&'),
 
684
               (1, 5, 'DELIM', u'$'),
 
685
               (1, 6, 'DELIM', u'|')],
 
686
 
 
687
 
 
688
            # DIMENSION
 
689
            u'5em': [(1, 1, tt.DIMENSION, u'5em')],
 
690
            u' 5em': [(1, 1, 'S', u' '), (1, 2, tt.DIMENSION, u'5em')],
 
691
            u'5em ': [(1, 1, tt.DIMENSION, u'5em'), (1, 4, 'S', u' ')],
 
692
 
 
693
            u'-5em': [(1, 1, tt.DIMENSION, u'-5em')],
 
694
            u' -5em': [(1, 1, 'S', u' '), (1, 2, tt.DIMENSION, u'-5em')],
 
695
            u'-5em ': [(1, 1, tt.DIMENSION, u'-5em'), (1, 5, 'S', u' ')],
 
696
 
 
697
            u'.5em': [(1, 1, tt.DIMENSION, u'0.5em')],
 
698
            u' .5em': [(1, 1, 'S', u' '), (1, 2, tt.DIMENSION, u'0.5em')],
 
699
            u'.5em ': [(1, 1, tt.DIMENSION, u'0.5em'), (1, 5, 'S', u' ')],
 
700
 
 
701
            u'-.5em': [(1, 1, tt.DIMENSION, u'-0.5em')],
 
702
            u' -.5em': [(1, 1, 'S', u' '), (1, 2, tt.DIMENSION, u'-0.5em')],
 
703
            u'-.5em ': [(1, 1, tt.DIMENSION, u'-0.5em'), (1, 6, 'S', u' ')],
 
704
 
 
705
            u'5em5_-': [(1, 1, tt.DIMENSION, u'5em5_-')],
 
706
 
 
707
            u'a a5 a5a 5 5a 5a5': [(1, 1, tt.IDENT, u'a'),
 
708
               (1, 2, 'S', u' '),
 
709
               (1, 3, tt.IDENT, u'a5'),
 
710
               (1, 5, 'S', u' '),
 
711
               (1, 6, tt.IDENT, u'a5a'),
 
712
               (1, 9, 'S', u' '),
 
713
               (1, 10, tt.NUMBER, u'5'),
 
714
               (1, 11, 'S', u' '),
 
715
               (1, 12, tt.DIMENSION, u'5a'),
 
716
               (1, 14, 'S', u' '),
 
717
               (1, 15, tt.DIMENSION, u'5a5')],
 
718
 
 
719
            # URI
 
720
            u'url()': [(1, 1, tt.URI, u'url()')],
 
721
            u'url();': [(1, 1, tt.URI, u'url()'), (1, 6, tt.SEMICOLON, ';')],
 
722
            u'url("x")': [(1, 1, tt.URI, u'url("x")')],
 
723
            u'url( "x")': [(1, 1, tt.URI, u'url("x")')],
 
724
            u'url("x" )': [(1, 1, tt.URI, u'url("x")')],
 
725
            u'url( "x" )': [(1, 1, tt.URI, u'url("x")')],
 
726
            u' url("x")': [
 
727
                (1, 1, 'S', u' '),
 
728
                (1, 2, tt.URI, u'url("x")')],
 
729
            u'url("x") ': [
 
730
                (1, 1, tt.URI, u'url("x")'),
 
731
                (1, 9, 'S', u' '),
 
732
                ],
 
733
            u'url(ab)': [(1, 1, tt.URI, u'url(ab)')],
 
734
            u'url($#/ab)': [(1, 1, tt.URI, u'url($#/ab)')],
 
735
            u'url(\1233/a/b)': [(1, 1, tt.URI, u'url(\1233/a/b)')],
 
736
            # not URI
 
737
            u'url("1""2")': [
 
738
                (1, 1, tt.FUNCTION, u'url('),
 
739
                (1, 5, tt.STRING, u'"1"'),
 
740
                (1, 8, tt.STRING, u'"2"'),
 
741
                (1, 11, tt.RPARANTHESIS, u')'),
 
742
                ],
 
743
            u'url(a"2")': [
 
744
                (1, 1, tt.FUNCTION, u'url('),
 
745
                (1, 5, tt.IDENT, u'a'),
 
746
                (1, 6, tt.STRING, u'"2"'),
 
747
                (1, 9, tt.RPARANTHESIS, u')'),
 
748
                ],
 
749
            u'url(a b)': [
 
750
                (1, 1, tt.FUNCTION, u'url('),
 
751
                (1, 5, tt.IDENT, u'a'),
 
752
                (1, 6, 'S', u' '),
 
753
                (1, 7, tt.IDENT, u'b'),
 
754
                (1, 8, tt.RPARANTHESIS, u')'),
 
755
                ],
 
756
 
 
757
            # FUNCTION
 
758
            u' counter("x")': [
 
759
               (1,1, 'S', u' '),
 
760
               (1, 2, tt.FUNCTION, u'counter('),
 
761
               (1, 10, tt.STRING, u'"x"'),
 
762
               (1, 13, tt.RPARANTHESIS, u')')],
 
763
            # HASH
 
764
            u'# #a #_a #-a #1': [
 
765
                (1, 1, 'DELIM', u'#'),
 
766
                (1, 2, 'S', u' '),
 
767
                (1, 3, tt.HASH, u'#a'),
 
768
                (1, 5, 'S', u' '),
 
769
                (1, 6, tt.HASH, u'#_a'),
 
770
                (1, 9, 'S', u' '),
 
771
                (1, 10, tt.HASH, u'#-a'),
 
772
                (1, 13, 'S', u' '),
 
773
                (1, 14, tt.HASH, u'#1')
 
774
                ],
 
775
            u'#1a1 ': [
 
776
                (1, 1, tt.HASH, u'#1a1'),
 
777
                (1, 5, 'S', u' '),
 
778
                ],
 
779
            u'#1a1\n': [
 
780
                (1, 1, tt.HASH, u'#1a1'),
 
781
                (1, 5, 'S', u'\n'),
 
782
                ],
 
783
            u'#1a1{': [
 
784
                (1, 1, tt.HASH, u'#1a1'),
 
785
                (1, 5, tt.LBRACE, u'{'),
 
786
                ],
 
787
            u'#1a1 {': [
 
788
                (1, 1, tt.HASH, u'#1a1'),
 
789
                (1, 5, 'S', u' '),
 
790
                (1, 6, tt.LBRACE, u'{'),
 
791
                ],
 
792
            u'#1a1\n{': [
 
793
                (1, 1, tt.HASH, u'#1a1'),
 
794
                (1, 5, 'S', u'\n'),
 
795
                (2, 1, tt.LBRACE, u'{'),
 
796
                ],
 
797
            u'#1a1\n {': [
 
798
                (1, 1, tt.HASH, u'#1a1'),
 
799
                (1, 5, 'S', u'\n '),
 
800
                (2, 2, tt.LBRACE, u'{'),
 
801
                ],
 
802
            u'#1a1 \n{': [
 
803
                (1, 1, tt.HASH, u'#1a1'),
 
804
                (1, 5, 'S', u' \n'),
 
805
                (2, 1, tt.LBRACE, u'{'),
 
806
                ],
 
807
            # STRINGS with NL
 
808
            u'"x\n': [(1,1, tt.INVALID, u'"x\n')],
 
809
            u'"x\r': [(1,1, tt.INVALID, u'"x\r')],
 
810
            u'"x\f': [(1,1, tt.INVALID, u'"x\f')],
 
811
            u'"x\n ': [
 
812
               (1,1, tt.INVALID, u'"x\n'),
 
813
               (2,1, 'S', u' ')
 
814
               ]
 
815
 
 
816
            }
 
817
 
 
818
        tests = {
 
819
            u'/*a': xml.dom.SyntaxErr,
 
820
            u'"a': xml.dom.SyntaxErr,
 
821
            u"'a": xml.dom.SyntaxErr,
 
822
            u"\\0 a": xml.dom.SyntaxErr,
 
823
            u"\\00": xml.dom.SyntaxErr,
 
824
            u"\\000": xml.dom.SyntaxErr,
 
825
            u"\\0000": xml.dom.SyntaxErr,
 
826
            u"\\00000": xml.dom.SyntaxErr,
 
827
            u"\\000000": xml.dom.SyntaxErr,
 
828
            u"\\0000001": xml.dom.SyntaxErr
 
829
            }
 
830
#        self.tokenizer.log.raiseExceptions = True #!!
 
831
#        for css, exception in tests.items():
 
832
#            self.assertRaises(exception, self.tokenizer.tokenize, css)
 
833
 
 
834
 
 
835
if __name__ == '__main__':
 
836
    import unittest
 
837
    unittest.main()