1
# -*- coding: utf-8 -*-
2
"""Testcases for new cssutils.tokenize.Tokenizer
4
TODO: old tests as new ones are **not complete**!
6
__version__ = '$Id: test_tokenize2.py 1794 2009-07-22 13:07:15Z cthedot $'
10
from cssutils.tokenize2 import *
12
class TokenizerTestCase(basetest.BaseTestCase):
16
u'äöü߀': [('IDENT', u'äöü߀', 1, 1)],
17
u' a ': [('S', u' ', 1, 1),
18
('IDENT', u'a', 1, 2),
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),
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),
36
('IDENT', u'a', 1, 6)],
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),
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),
52
('IDENT', '\\7777777', 1, 44)],
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),
63
('IDENT', u'b', 1, 10)],
64
u'\\{\\}\\(\\)\\[\\]\\#\\@\\.\\,':
65
[('IDENT', u'\\{\\}\\(\\)\\[\\]\\#\\@\\.\\,', 1, 1)],
68
u' "" ': [('S', u' ', 1, 1),
69
('STRING', u'""', 1, 2),
71
u' "\'" ': [('S', u' ', 1, 1),
72
('STRING', u'"\'"', 1, 2),
74
u" '' ": [('S', u' ', 1, 1),
75
('STRING', u"''", 1, 2),
77
u" '' ": [('S', u' ', 1, 1),
78
('STRING', u"''", 1, 2),
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)],
96
u' #a ': [('S', u' ', 1, 1),
97
('HASH', u'#a', 1, 2),
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)],
105
# NUMBER, for plus see CSS3
106
u' 0 ': [('S', u' ', 1, 1),
107
('NUMBER', u'0', 1, 2),
109
u' 0.1 ': [('S', u' ', 1, 1),
110
('NUMBER', u'0.1', 1, 2),
112
u' .0 ': [('S', u' ', 1, 1),
113
('NUMBER', u'.0', 1, 2),
116
u' -0 ': [('S', u' ', 1, 1),
117
('CHAR', u'-', 1, 2),
118
('NUMBER', u'0', 1, 3),
122
u' 0% ': [('S', u' ', 1, 1),
123
('PERCENTAGE', u'0%', 1, 2),
125
u' .5% ': [('S', u' ', 1, 1),
126
('PERCENTAGE', u'.5%', 1, 2),
130
u' url() ': [('S', u' ', 1, 1),
131
('URI', u'url()', 1, 2),
133
u' url(a) ': [('S', u' ', 1, 1),
134
('URI', u'url(a)', 1, 2),
136
u' url("a") ': [('S', u' ', 1, 1),
137
('URI', u'url("a")', 1, 2),
139
u' url( a ) ': [('S', u' ', 1, 1),
140
('URI', u'url( a )', 1, 2),
146
u' <!-- ': [('S', u' ', 1, 1),
147
('CDO', u'<!--', 1, 2),
149
u'"<!--""-->"': [('STRING', u'"<!--"', 1, 1),
150
('STRING', u'"-->"', 1, 7)],
153
u' --> ': [('S', u' ', 1, 1),
154
('CDC', u'-->', 1, 2),
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)],
168
# COMMENT, for incomplete see later
169
u'/*x*/ ': [('COMMENT', u'/*x*/', 1, 1),
173
u' x( ': [('S', u' ', 1, 1),
174
('FUNCTION', u'x(', 1, 2),
178
u' ~= ': [('S', u' ', 1, 1),
179
('INCLUDES', u'~=', 1, 2),
181
u'~==': [('INCLUDES', u'~=', 1, 1), ('CHAR', u'=', 1, 3)],
184
u' |= ': [('S', u' ', 1, 1),
185
('DASHMATCH', u'|=', 1, 2),
187
u'|==': [('DASHMATCH', u'|=', 1, 1), ('CHAR', u'=', 1, 3)],
190
u' @ ': [('S', u' ', 1, 1),
191
('CHAR', u'@', 1, 2),
194
# --- overwritten for CSS 2.1 ---
196
u' { ': [('S', u' ', 1, 1),
197
('CHAR', u'{', 1, 2),
200
u' + ': [('S', u' ', 1, 1),
201
('CHAR', u'+', 1, 2),
204
u' > ': [('S', u' ', 1, 1),
205
('CHAR', u'>', 1, 2),
208
u' , ': [('S', u' ', 1, 1),
209
('CHAR', u',', 1, 2),
212
u' . ': [('S', u' ', 1, 1),
213
('CHAR', u'.', 1, 2),
219
u' u+0 ': [('S', u' ', 1, 1),
220
('UNICODE-RANGE', u'u+0', 1, 2),
222
u' u+01 ': [('S', u' ', 1, 1),
223
('UNICODE-RANGE', u'u+01', 1, 2),
225
u' u+012 ': [('S', u' ', 1, 1),
226
('UNICODE-RANGE', u'u+012', 1, 2),
228
u' u+0123 ': [('S', u' ', 1, 1),
229
('UNICODE-RANGE', u'u+0123', 1, 2),
231
u' u+01234 ': [('S', u' ', 1, 1),
232
('UNICODE-RANGE', u'u+01234', 1, 2),
234
u' u+012345 ': [('S', u' ', 1, 1),
235
('UNICODE-RANGE', u'u+012345', 1, 2),
237
u' u+0123456 ': [('S', u' ', 1, 1),
238
('UNICODE-RANGE', u'u+012345', 1, 2),
239
('NUMBER', u'6', 1, 10),
241
u' U+123456 ': [('S', u' ', 1, 1),
242
('UNICODE-RANGE', u'U+123456', 1, 2),
244
u' \\55+abcdef ': [('S', u' ', 1, 1),
245
('UNICODE-RANGE', u'U+abcdef', 1, 2),
247
u' \\75+abcdef ': [('S', u' ', 1, 1),
248
('UNICODE-RANGE', u'u+abcdef', 1, 2),
250
u' u+0-1 ': [('S', u' ', 1, 1),
251
('UNICODE-RANGE', u'u+0-1', 1, 2),
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),
257
('UNICODE-RANGE', u'u+123456-abcdef', 1, 9),
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)],
266
u' @x ': [('S', u' ', 1, 1),
267
('ATKEYWORD', u'@x', 1, 2),
269
u'@X': [('ATKEYWORD', u'@X', 1, 1)],
270
u'@\\x': [('ATKEYWORD', u'@\\x', 1, 1)],
272
u'@1x': [('CHAR', u'@', 1, 1),
273
('DIMENSION', u'1x', 1, 2)],
276
u' 0px ': [('S', u' ', 1, 1),
277
('DIMENSION', u'0px', 1, 2),
279
u' 1s ': [('S', u' ', 1, 1),
280
('DIMENSION', u'1s', 1, 2),
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)],
287
u' - 0 ': [('S', u' ', 1, 1),
288
('CHAR', u'-', 1, 2),
290
('NUMBER', u'0', 1, 4),
292
u' + 0 ': [('S', u' ', 1, 1),
293
('CHAR', u'+', 1, 2),
295
('NUMBER', u'0', 1, 4),
299
u' ^= ': [('S', u' ', 1, 1),
300
('PREFIXMATCH', u'^=', 1, 2),
302
u'^==': [('PREFIXMATCH', u'^=', 1, 1), ('CHAR', u'=', 1, 3)],
305
u' $= ': [('S', u' ', 1, 1),
306
('SUFFIXMATCH', u'$=', 1, 2),
308
u'$==': [('SUFFIXMATCH', u'$=', 1, 1), ('CHAR', u'=', 1, 3)],
311
u' *= ': [('S', u' ', 1, 1),
312
('SUBSTRINGMATCH', u'*=', 1, 2),
314
u'*==': [('SUBSTRINGMATCH', u'*=', 1, 1), ('CHAR', u'=', 1, 3)],
317
u'\xFEFF ': [('BOM', u'\xfeFF', 1, 1),
319
u' \xFEFF ': [('S', u' ', 1, 1),
320
('IDENT', u'\xfeFF', 1, 2),
325
# escapes work not for a-f!
327
u' @import ': [('S', u' ', 1, 1),
328
('IMPORT_SYM', u'@import', 1, 2),
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',
337
ur'@\69 \06d\0070\0006f\000072\74': [('IMPORT_SYM',
338
ur'@\69 \06d\0070\0006f\000072\74',
342
u' @page ': [('S', u' ', 1, 1),
343
('PAGE_SYM', u'@page', 1, 2),
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)],
352
u' @media ': [('S', u' ', 1, 1),
353
('MEDIA_SYM', u'@media', 1, 2),
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',
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',
367
u' @font-face ': [('S', u' ', 1, 1),
368
('FONT_FACE_SYM', u'@font-face', 1, 2),
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)],
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)],
379
# CHARSET_SYM only if "@charset "!
380
u'@charset ': [('CHARSET_SYM', u'@charset ', 1, 1),
382
u' @charset ': [('S', u' ', 1, 1),
383
('CHARSET_SYM', u'@charset ', 1, 2), # not at start
385
u'@charset': [('ATKEYWORD', u'@charset', 1, 1)], # no ending S
386
u'@CHARSET ': [('ATKEYWORD', u'@CHARSET', 1, 1),# uppercase
388
u'@cha\\rset ': [('ATKEYWORD', u'@cha\\rset', 1, 1), # not literal
392
u' @namespace ': [('S', u' ', 1, 1),
393
('NAMESPACE_SYM', u'@namespace', 1, 2),
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)],
404
u' @unknown ': [('S', u' ', 1, 1),
405
('ATKEYWORD', u'@unknown', 1, 2),
409
# strings with linebreak in it
410
u' "\\na"\na': [('S', u' ', 1, 1),
411
('STRING', u'"\\na"', 1, 2),
413
('IDENT', u'a', 2, 1)],
414
u" '\\na'\na": [('S', u' ', 1, 1),
415
('STRING', u"'\\na'", 1, 2),
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)],
422
# IMPORTANT_SYM is not IDENT!!!
423
u' !important ': [('S', u' ', 1, 1),
424
('CHAR', u'!', 1, 2),
425
('IDENT', u'important', 1, 3),
427
u'! /*1*/ important ': [
428
('CHAR', u'!', 1, 1),
430
('COMMENT', u'/*1*/', 1, 3),
432
('IDENT', u'important', 1, 9),
434
u'! important': [('CHAR', u'!', 1, 1),
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),
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),
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),
452
ur'!\69\6d\70\6f\72\74\61\6e\74': [('CHAR', u'!', 1, 1),
458
# overwriting tests in testsall
461
u' { ': [('S', u' ', 1, 1),
462
('LBRACE', u'{', 1, 2),
465
u' + ': [('S', u' ', 1, 1),
466
('PLUS', u'+', 1, 2),
469
u' > ': [('S', u' ', 1, 1),
470
('GREATER', u'>', 1, 2),
473
u' , ': [('S', u' ', 1, 1),
474
('COMMA', u',', 1, 2),
477
u' . ': [('S', u' ', 1, 1),
478
('CLASS', u'.', 1, 2),
483
# escape ends with explicit space but \r\n as single space
484
u'\\65\r\nb': [('IDENT', u'eb', 1, 1)],
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),
494
('IDENT', u'a', 2, 1)],
496
# strings with linebreak in it
497
u' "\\na\na': [('S', u' ', 1, 1),
498
('INVALID', u'"\\na', 1, 2),
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),
504
('IDENT', u'a', 2, 1)],
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)],
519
# tests if fullsheet=False is set on tokenizer
520
testsfullsheetfalse = {
522
u'/*': [('CHAR', u'/', 1, 1),
523
('CHAR', u'*', 1, 2)],
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)],
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)],
542
# tests if fullsheet=True is set on tokenizer
543
testsfullsheettrue = {
545
u'/*': [('COMMENT', u'/**/', 1, 1)],
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)],
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)],
564
#log = cssutils.errorhandler.ErrorHandler()
565
self.tokenizer = Tokenizer()
568
# def test_push(self):
574
# for t in T.tokenize('1 x 2 3'):
575
# if not x and t[1] == 'x':
581
# # push reinserts token into token stream, so x is doubled
582
# self.assertEqual('1 xx 2 3', do())
584
# def test_linenumbers(self):
585
# "Tokenizer line + col"
588
def test_tokenize(self):
589
"cssutils Tokenizer().tokenize()"
590
import cssutils.cssproductions
591
tokenizer = Tokenizer(cssutils.cssproductions.MACROS,
592
cssutils.cssproductions.PRODUCTIONS)
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)
601
tokens = tokenizer.tokenize(css)
602
for i, actual in enumerate(tokens):
603
expected = tests[css][i]
604
self.assertEqual(expected, actual)
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]))
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)
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)
623
tokens = tokenizer.tokenize(css, fullsheet=True)
624
for i, actual in enumerate(tokens):
626
expected = tests[css][i]
629
self.assertEqual(actual[0], 'EOF')
631
self.assertEqual(expected, actual)
633
# check if all same number of tokens
634
tokens = [t for t in tokenizer.tokenize(css, fullsheet=True)]
636
self.assertEqual(len(tokens) - 1, len(tests[css]))
644
u'x x1 -x .-x #_x -': [(1, 1, tt.IDENT, u'x'),
646
(1, 3, tt.IDENT, u'x1'),
648
(1, 6, tt.IDENT, u'-x'),
650
(1, 9, tt.CLASS, u'.'),
651
(1, 10, tt.IDENT, u'-x'),
653
(1, 13, tt.HASH, u'#_x'),
655
(1, 17, 'DELIM', u'-')],
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'),
665
(1, 22, tt.NUMBER, u'1'), (1, 23, tt.CLASS, u'.')
668
u'::': [(1, 1, tt.PSEUDO_ELEMENT, u'::')],
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',')],
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'|')],
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' ')],
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' ')],
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' ')],
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' ')],
705
u'5em5_-': [(1, 1, tt.DIMENSION, u'5em5_-')],
707
u'a a5 a5a 5 5a 5a5': [(1, 1, tt.IDENT, u'a'),
709
(1, 3, tt.IDENT, u'a5'),
711
(1, 6, tt.IDENT, u'a5a'),
713
(1, 10, tt.NUMBER, u'5'),
715
(1, 12, tt.DIMENSION, u'5a'),
717
(1, 15, tt.DIMENSION, u'5a5')],
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")')],
728
(1, 2, tt.URI, u'url("x")')],
730
(1, 1, tt.URI, u'url("x")'),
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)')],
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')'),
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')'),
750
(1, 1, tt.FUNCTION, u'url('),
751
(1, 5, tt.IDENT, u'a'),
753
(1, 7, tt.IDENT, u'b'),
754
(1, 8, tt.RPARANTHESIS, u')'),
760
(1, 2, tt.FUNCTION, u'counter('),
761
(1, 10, tt.STRING, u'"x"'),
762
(1, 13, tt.RPARANTHESIS, u')')],
764
u'# #a #_a #-a #1': [
765
(1, 1, 'DELIM', u'#'),
767
(1, 3, tt.HASH, u'#a'),
769
(1, 6, tt.HASH, u'#_a'),
771
(1, 10, tt.HASH, u'#-a'),
773
(1, 14, tt.HASH, u'#1')
776
(1, 1, tt.HASH, u'#1a1'),
780
(1, 1, tt.HASH, u'#1a1'),
784
(1, 1, tt.HASH, u'#1a1'),
785
(1, 5, tt.LBRACE, u'{'),
788
(1, 1, tt.HASH, u'#1a1'),
790
(1, 6, tt.LBRACE, u'{'),
793
(1, 1, tt.HASH, u'#1a1'),
795
(2, 1, tt.LBRACE, u'{'),
798
(1, 1, tt.HASH, u'#1a1'),
800
(2, 2, tt.LBRACE, u'{'),
803
(1, 1, tt.HASH, u'#1a1'),
805
(2, 1, tt.LBRACE, u'{'),
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')],
812
(1,1, tt.INVALID, u'"x\n'),
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
830
# self.tokenizer.log.raiseExceptions = True #!!
831
# for css, exception in tests.items():
832
# self.assertRaises(exception, self.tokenizer.tokenize, css)
835
if __name__ == '__main__':