gvsig-scripting / org.gvsig.scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.app / org.gvsig.scripting.app.mainplugin / src / main / resources-plugin / scripting / lib / cssutils / tests / test_cssimportrule.py @ 475
History | View | Annotate | Download (18.3 KB)
1 |
"""Testcases for cssutils.css.CSSImportRule"""
|
---|---|
2 |
|
3 |
import xml.dom |
4 |
import test_cssrule |
5 |
import cssutils |
6 |
|
7 |
import basetest |
8 |
|
9 |
class CSSImportRuleTestCase(test_cssrule.CSSRuleTestCase): |
10 |
|
11 |
def setUp(self): |
12 |
super(CSSImportRuleTestCase, self).setUp() |
13 |
self.r = cssutils.css.CSSImportRule()
|
14 |
self.rRO = cssutils.css.CSSImportRule(readonly=True) |
15 |
self.r_type = cssutils.css.CSSImportRule.IMPORT_RULE
|
16 |
self.r_typeString = 'IMPORT_RULE' |
17 |
|
18 |
def test_init(self): |
19 |
"CSSImportRule.__init__()"
|
20 |
super(CSSImportRuleTestCase, self).test_init() |
21 |
|
22 |
# no init param
|
23 |
self.assertEqual(None, self.r.href) |
24 |
self.assertEqual(None, self.r.hreftype) |
25 |
self.assertEqual(False, self.r.hrefFound) |
26 |
self.assertEqual(u'all', self.r.media.mediaText) |
27 |
self.assertEqual(
|
28 |
cssutils.stylesheets.MediaList, type(self.r.media)) |
29 |
self.assertEqual(None, self.r.name) |
30 |
self.assertEqual(cssutils.css.CSSStyleSheet, type(self.r.styleSheet)) |
31 |
self.assertEqual(0, self.r.styleSheet.cssRules.length) |
32 |
self.assertEqual(u'', self.r.cssText) |
33 |
|
34 |
# all
|
35 |
r = cssutils.css.CSSImportRule(href='href', mediaText='tv', name='name') |
36 |
self.assertEqual(u'@import url(href) tv "name";', r.cssText) |
37 |
self.assertEqual("href", r.href) |
38 |
self.assertEqual(None, r.hreftype) |
39 |
self.assertEqual(u'tv', r.media.mediaText) |
40 |
self.assertEqual(
|
41 |
cssutils.stylesheets.MediaList, type(r.media))
|
42 |
self.assertEqual('name', r.name) |
43 |
self.assertEqual(None, r.parentRule) # see CSSRule |
44 |
self.assertEqual(None, r.parentStyleSheet) # see CSSRule |
45 |
self.assertEqual(cssutils.css.CSSStyleSheet, type(self.r.styleSheet)) |
46 |
self.assertEqual(0, self.r.styleSheet.cssRules.length) |
47 |
|
48 |
# href
|
49 |
r = cssutils.css.CSSImportRule(u'x')
|
50 |
self.assertEqual(u'@import url(x);', r.cssText) |
51 |
self.assertEqual('x', r.href) |
52 |
self.assertEqual(None, r.hreftype) |
53 |
|
54 |
# href + mediaText
|
55 |
r = cssutils.css.CSSImportRule(u'x', u'print') |
56 |
self.assertEqual(u'@import url(x) print;', r.cssText) |
57 |
self.assertEqual('x', r.href) |
58 |
self.assertEqual('print', r.media.mediaText) |
59 |
|
60 |
# href + name
|
61 |
r = cssutils.css.CSSImportRule(u'x', name=u'n') |
62 |
self.assertEqual(u'@import url(x) "n";', r.cssText) |
63 |
self.assertEqual('x', r.href) |
64 |
self.assertEqual('n', r.name) |
65 |
|
66 |
# href + mediaText + name
|
67 |
r = cssutils.css.CSSImportRule(u'x', u'print', 'n') |
68 |
self.assertEqual(u'@import url(x) print "n";', r.cssText) |
69 |
self.assertEqual('x', r.href) |
70 |
self.assertEqual('print', r.media.mediaText) |
71 |
self.assertEqual('n', r.name) |
72 |
|
73 |
# media +name only
|
74 |
self.r = cssutils.css.CSSImportRule(mediaText=u'print', name="n") |
75 |
self.assertEqual(cssutils.stylesheets.MediaList,
|
76 |
type(self.r.media)) |
77 |
self.assertEqual(u'', self.r.cssText) |
78 |
self.assertEqual(u'print', self.r.media.mediaText) |
79 |
self.assertEqual(u'n', self.r.name) |
80 |
|
81 |
# only possible to set @... similar name
|
82 |
self.assertRaises(xml.dom.InvalidModificationErr, self.r._setAtkeyword, 'x') |
83 |
|
84 |
def test_cssText(self): |
85 |
"CSSImportRule.cssText"
|
86 |
tests = { |
87 |
# href string
|
88 |
u'''@import "str";''': None, |
89 |
u'''@import"str";''': u'''@import "str";''', |
90 |
u'''@\\import "str";''': u'''@import "str";''', |
91 |
u'''@IMPORT "str";''': u'''@import "str";''', |
92 |
u'''@import 'str';''': u'''@import "str";''', |
93 |
u'''@import 'str' ;''': u'''@import "str";''', |
94 |
u'''@import "str";''': None, |
95 |
u'''@import "str" ;''': u'''@import "str";''', |
96 |
ur'''@import "\"" ;''': ur'''@import "\"";''', |
97 |
u'''@import '\\'';''': ur'''@import "'";''', |
98 |
u'''@import '"';''': ur'''@import "\"";''', |
99 |
# href url
|
100 |
u'''@import url(x.css);''': None, |
101 |
# nospace
|
102 |
u'''@import url(")");''': u'''@import url(")");''', |
103 |
u'''@import url("\\"");''': u'''@import url("\\"");''', |
104 |
u'''@import url('\\'');''': u'''@import url("'");''', |
105 |
|
106 |
# href + media
|
107 |
# all is removed
|
108 |
u'''@import "str" all;''': u'''@import "str";''', |
109 |
u'''@import "str" tv, print;''': None, |
110 |
u'''@import"str"tv,print;''': u'''@import "str" tv, print;''', |
111 |
u'''@import "str" tv, print, all;''': u'''@import "str";''', |
112 |
u'''@import "str" handheld, all;''': u'''@import "str";''', |
113 |
u'''@import "str" all, handheld;''': u'''@import "str";''', |
114 |
u'''@import "str" not tv;''': None, |
115 |
u'''@import "str" only tv;''': None, |
116 |
u'''@import "str" only tv and (color: 2);''': None, |
117 |
|
118 |
# href + name
|
119 |
u'''@import "str" "name";''': None, |
120 |
u'''@import "str" 'name';''': u'''@import "str" "name";''', |
121 |
u'''@import url(x) "name";''': None, |
122 |
u'''@import "str" "\\"";''': None, |
123 |
u'''@import "str" '\\'';''': u'''@import "str" "'";''', |
124 |
|
125 |
# href + media + name
|
126 |
u'''@import"str"tv"name";''': u'''@import "str" tv "name";''', |
127 |
u'''@import\t\r\f\n"str"\t\t\r\f\ntv\t\t\r\f\n"name"\t;''':
|
128 |
u'''@import "str" tv "name";''',
|
129 |
|
130 |
# comments
|
131 |
u'''@import /*1*/ "str" /*2*/;''': None, |
132 |
u'@import/*1*//*2*/"str"/*3*//*4*/all/*5*//*6*/"name"/*7*//*8*/ ;':
|
133 |
u'@import /*1*/ /*2*/ "str" /*3*/ /*4*/ all /*5*/ /*6*/ "name" /*7*/ /*8*/;',
|
134 |
u'@import/*1*//*2*/url(u)/*3*//*4*/all/*5*//*6*/"name"/*7*//*8*/ ;':
|
135 |
u'@import /*1*/ /*2*/ url(u) /*3*/ /*4*/ all /*5*/ /*6*/ "name" /*7*/ /*8*/;',
|
136 |
u'@import/*1*//*2*/url("u")/*3*//*4*/all/*5*//*6*/"name"/*7*//*8*/ ;':
|
137 |
u'@import /*1*/ /*2*/ url(u) /*3*/ /*4*/ all /*5*/ /*6*/ "name" /*7*/ /*8*/;',
|
138 |
# WS
|
139 |
u'@import\n\t\f "str"\n\t\f tv\n\t\f "name"\n\t\f ;':
|
140 |
u'@import "str" tv "name";',
|
141 |
u'@import\n\t\f url(\n\t\f u\n\t\f )\n\t\f tv\n\t\f "name"\n\t\f ;':
|
142 |
u'@import url(u) tv "name";',
|
143 |
u'@import\n\t\f url("u")\n\t\f tv\n\t\f "name"\n\t\f ;':
|
144 |
u'@import url(u) tv "name";',
|
145 |
u'@import\n\t\f url(\n\t\f "u"\n\t\f )\n\t\f tv\n\t\f "name"\n\t\f ;':
|
146 |
u'@import url(u) tv "name";',
|
147 |
} |
148 |
self.do_equal_r(tests) # set cssText |
149 |
tests.update({ |
150 |
u'@import "x.css" tv': '@import "x.css" tv;', |
151 |
u'@import "x.css"': '@import "x.css";', # no ; |
152 |
u"@import 'x.css'": '@import "x.css";', # no ; |
153 |
u'@import url(x.css)': '@import url(x.css);', # no ; |
154 |
u'@import "x;': '@import "x;";', # no "! |
155 |
}) |
156 |
self.do_equal_p(tests) # parse |
157 |
|
158 |
tests = { |
159 |
u'''@import;''': xml.dom.SyntaxErr,
|
160 |
u'''@import all;''': xml.dom.SyntaxErr,
|
161 |
u'''@import all"name";''': xml.dom.SyntaxErr,
|
162 |
u'''@import;''': xml.dom.SyntaxErr,
|
163 |
u'''@import x";''': xml.dom.SyntaxErr,
|
164 |
u'''@import "str" ,all;''': xml.dom.SyntaxErr,
|
165 |
u'''@import "str" all,;''': xml.dom.SyntaxErr,
|
166 |
u'''@import "str" all tv;''': xml.dom.SyntaxErr,
|
167 |
u'''@import "str" "name" all;''': xml.dom.SyntaxErr,
|
168 |
} |
169 |
self.do_raise_p(tests) # parse |
170 |
tests.update({ |
171 |
u'@import "x.css"': xml.dom.SyntaxErr,
|
172 |
u"@import 'x.css'": xml.dom.SyntaxErr,
|
173 |
u'@import url(x.css)': xml.dom.SyntaxErr,
|
174 |
u'@import "x.css" tv': xml.dom.SyntaxErr,
|
175 |
u'@import "x;': xml.dom.SyntaxErr,
|
176 |
u'''@import url("x);''': xml.dom.SyntaxErr,
|
177 |
# trailing
|
178 |
u'''@import "x";"a"''': xml.dom.SyntaxErr,
|
179 |
# trailing S or COMMENT
|
180 |
u'''@import "x";/**/''': xml.dom.SyntaxErr,
|
181 |
u'''@import "x"; ''': xml.dom.SyntaxErr,
|
182 |
}) |
183 |
self.do_raise_r(tests) # set cssText |
184 |
|
185 |
def test_href(self): |
186 |
"CSSImportRule.href"
|
187 |
# set
|
188 |
self.r.href = 'x' |
189 |
self.assertEqual('x', self.r.href) |
190 |
self.assertEqual(u'@import url(x);', self.r.cssText) |
191 |
|
192 |
# http
|
193 |
self.r.href = 'http://www.example.com/x?css=z&v=1' |
194 |
self.assertEqual('http://www.example.com/x?css=z&v=1' , self.r.href) |
195 |
self.assertEqual(u'@import url(http://www.example.com/x?css=z&v=1);', |
196 |
self.r.cssText)
|
197 |
|
198 |
# also if hreftype changed
|
199 |
self.r.hreftype='string' |
200 |
self.assertEqual('http://www.example.com/x?css=z&v=1' , self.r.href) |
201 |
self.assertEqual(u'@import "http://www.example.com/x?css=z&v=1";', |
202 |
self.r.cssText)
|
203 |
|
204 |
# string escaping?
|
205 |
self.r.href = '"' |
206 |
self.assertEqual(u'@import "\\"";', self.r.cssText) |
207 |
self.r.hreftype='url' |
208 |
self.assertEqual(u'@import url("\\"");', self.r.cssText) |
209 |
|
210 |
# url escaping?
|
211 |
self.r.href = ')' |
212 |
self.assertEqual(u'@import url(")");', self.r.cssText) |
213 |
|
214 |
self.r.hreftype = 'NOT VALID' # using default |
215 |
self.assertEqual(u'@import url(")");', self.r.cssText) |
216 |
|
217 |
def test_hrefFound(self): |
218 |
"CSSImportRule.hrefFound"
|
219 |
def fetcher(url): |
220 |
if url == u'http://example.com/yes': |
221 |
return None, u'/**/' |
222 |
else:
|
223 |
return None, None |
224 |
|
225 |
parser = cssutils.CSSParser(fetcher=fetcher) |
226 |
sheet = parser.parseString(u'@import "http://example.com/yes" "name"')
|
227 |
|
228 |
r = sheet.cssRules[0]
|
229 |
self.assertEqual(u'/**/'.encode(), r.styleSheet.cssText) |
230 |
self.assertEqual(True, r.hrefFound) |
231 |
self.assertEqual(u'name', r.name) |
232 |
|
233 |
r.cssText = '@import url(http://example.com/none) "name2";'
|
234 |
self.assertEqual(u''.encode(), r.styleSheet.cssText) |
235 |
self.assertEqual(False, r.hrefFound) |
236 |
self.assertEqual(u'name2', r.name) |
237 |
|
238 |
sheet.cssText = '@import url(http://example.com/none);'
|
239 |
self.assertNotEqual(r, sheet.cssRules[0]) |
240 |
|
241 |
def test_hreftype(self): |
242 |
"CSSImportRule.hreftype"
|
243 |
self.r = cssutils.css.CSSImportRule()
|
244 |
|
245 |
self.r.cssText = '@import /*1*/url(org) /*2*/;' |
246 |
self.assertEqual('uri', self.r.hreftype) |
247 |
self.assertEqual(u'@import /*1*/ url(org) /*2*/;', self.r.cssText) |
248 |
|
249 |
self.r.cssText = '@import /*1*/"org" /*2*/;' |
250 |
self.assertEqual('string', self.r.hreftype) |
251 |
self.assertEqual(u'@import /*1*/ "org" /*2*/;', self.r.cssText) |
252 |
|
253 |
self.r.href = 'new' |
254 |
self.assertEqual(u'@import /*1*/ "new" /*2*/;', self.r.cssText) |
255 |
|
256 |
self.r.hreftype='uri' |
257 |
self.assertEqual(u'@import /*1*/ url(new) /*2*/;', self.r.cssText) |
258 |
|
259 |
def test_media(self): |
260 |
"CSSImportRule.media"
|
261 |
self.r.href = 'x' # @import url(x) |
262 |
|
263 |
# media is readonly
|
264 |
self.assertRaises(AttributeError, self.r.__setattr__, 'media', None) |
265 |
|
266 |
# but not static
|
267 |
self.r.media.mediaText = 'print' |
268 |
self.assertEqual(u'@import url(x) print;', self.r.cssText) |
269 |
self.r.media.appendMedium('tv') |
270 |
self.assertEqual(u'@import url(x) print, tv;', self.r.cssText) |
271 |
|
272 |
# for generated rule
|
273 |
r = cssutils.css.CSSImportRule(href='x')
|
274 |
self.assertRaisesMsg(xml.dom.InvalidModificationErr,
|
275 |
basetest.msg3x('''MediaList: Ignoring new medium cssutils.stylesheets.MediaQuery(mediaText=u'tv') as already specified "all" (set ``mediaText`` instead).'''),
|
276 |
r.media.appendMedium, 'tv')
|
277 |
self.assertEqual(u'@import url(x);', r.cssText) |
278 |
self.assertRaisesMsg(xml.dom.InvalidModificationErr,
|
279 |
basetest.msg3x('''MediaList: Ignoring new medium cssutils.stylesheets.MediaQuery(mediaText=u'tv') as already specified "all" (set ``mediaText`` instead).'''),
|
280 |
r.media.appendMedium, 'tv')
|
281 |
self.assertEqual(u'@import url(x);', r.cssText) |
282 |
r.media.mediaText = 'tv'
|
283 |
self.assertEqual(u'@import url(x) tv;', r.cssText) |
284 |
r.media.appendMedium('print') # all + tv = all! |
285 |
self.assertEqual(u'@import url(x) tv, print;', r.cssText) |
286 |
|
287 |
# for parsed rule without initial media
|
288 |
s = cssutils.parseString('@import url(x);')
|
289 |
r = s.cssRules[0]
|
290 |
|
291 |
self.assertRaisesMsg(xml.dom.InvalidModificationErr,
|
292 |
basetest.msg3x('''MediaList: Ignoring new medium cssutils.stylesheets.MediaQuery(mediaText=u'tv') as already specified "all" (set ``mediaText`` instead).'''),
|
293 |
r.media.appendMedium, 'tv')
|
294 |
self.assertEqual(u'@import url(x);', r.cssText) |
295 |
self.assertRaisesMsg(xml.dom.InvalidModificationErr,
|
296 |
basetest.msg3x('''MediaList: Ignoring new medium cssutils.stylesheets.MediaQuery(mediaText=u'tv') as already specified "all" (set ``mediaText`` instead).'''),
|
297 |
r.media.appendMedium, 'tv')
|
298 |
self.assertEqual(u'@import url(x);', r.cssText) |
299 |
r.media.mediaText = 'tv'
|
300 |
self.assertEqual(u'@import url(x) tv;', r.cssText) |
301 |
r.media.appendMedium('print') # all + tv = all! |
302 |
self.assertEqual(u'@import url(x) tv, print;', r.cssText) |
303 |
|
304 |
def test_name(self): |
305 |
"CSSImportRule.name"
|
306 |
r = cssutils.css.CSSImportRule('x', name='a000000') |
307 |
self.assertEqual('a000000', r.name) |
308 |
self.assertEqual(u'@import url(x) "a000000";', r.cssText) |
309 |
|
310 |
r.name = "n"
|
311 |
self.assertEqual('n', r.name) |
312 |
self.assertEqual(u'@import url(x) "n";', r.cssText) |
313 |
r.name = '"'
|
314 |
self.assertEqual('"', r.name) |
315 |
self.assertEqual(u'@import url(x) "\\"";', r.cssText) |
316 |
|
317 |
r.hreftype = 'string'
|
318 |
self.assertEqual(u'@import "x" "\\"";', r.cssText) |
319 |
r.name = "123"
|
320 |
self.assertEqual(u'@import "x" "123";', r.cssText) |
321 |
|
322 |
r.name = None
|
323 |
self.assertEqual(None, r.name) |
324 |
self.assertEqual(u'@import "x";', r.cssText) |
325 |
|
326 |
r.name = ""
|
327 |
self.assertEqual(None, r.name) |
328 |
self.assertEqual(u'@import "x";', r.cssText) |
329 |
|
330 |
self.assertRaises(xml.dom.SyntaxErr, r._setName, 0) |
331 |
self.assertRaises(xml.dom.SyntaxErr, r._setName, 123) |
332 |
|
333 |
def test_styleSheet(self): |
334 |
"CSSImportRule.styleSheet"
|
335 |
def fetcher(url): |
336 |
if url == "/root/level1/anything.css": |
337 |
return None, '@import "level2/css.css" "title2";' |
338 |
else:
|
339 |
return None, 'a { color: red }' |
340 |
|
341 |
parser = cssutils.CSSParser(fetcher=fetcher) |
342 |
sheet = parser.parseString('''@charset "ascii";
|
343 |
@import "level1/anything.css" tv "title";''',
|
344 |
href='/root/')
|
345 |
|
346 |
self.assertEqual(sheet.href, '/root/') |
347 |
|
348 |
ir = sheet.cssRules[1]
|
349 |
self.assertEqual(ir.href, 'level1/anything.css') |
350 |
self.assertEqual(ir.styleSheet.href, '/root/level1/anything.css') |
351 |
# inherits ascii as no self charset is set
|
352 |
self.assertEqual(ir.styleSheet.encoding, 'ascii') |
353 |
self.assertEqual(ir.styleSheet.ownerRule, ir)
|
354 |
self.assertEqual(ir.styleSheet.media.mediaText, 'tv') |
355 |
self.assertEqual(ir.styleSheet.parentStyleSheet, None) # sheet |
356 |
self.assertEqual(ir.styleSheet.title, 'title') |
357 |
self.assertEqual(ir.styleSheet.cssText,
|
358 |
'@charset "ascii";\n@import "level2/css.css" "title2";'.encode())
|
359 |
|
360 |
ir2 = ir.styleSheet.cssRules[1]
|
361 |
self.assertEqual(ir2.href, 'level2/css.css') |
362 |
self.assertEqual(ir2.styleSheet.href, '/root/level1/level2/css.css') |
363 |
# inherits ascii as no self charset is set
|
364 |
self.assertEqual(ir2.styleSheet.encoding, 'ascii') |
365 |
self.assertEqual(ir2.styleSheet.ownerRule, ir2)
|
366 |
self.assertEqual(ir2.styleSheet.media.mediaText, 'all') |
367 |
self.assertEqual(ir2.styleSheet.parentStyleSheet, None) #ir.styleSheet |
368 |
self.assertEqual(ir2.styleSheet.title, 'title2') |
369 |
self.assertEqual(ir2.styleSheet.cssText,
|
370 |
'@charset "ascii";\na {\n color: red\n }'.encode())
|
371 |
|
372 |
sheet = cssutils.parseString('@import "CANNOT-FIND.css";')
|
373 |
ir = sheet.cssRules[0]
|
374 |
self.assertEqual(ir.href, "CANNOT-FIND.css") |
375 |
self.assertEqual(type(ir.styleSheet), cssutils.css.CSSStyleSheet) |
376 |
|
377 |
def fetcher(url): |
378 |
if url.endswith('level1.css'): |
379 |
return None, u'@charset "ascii"; @import "level2.css";'.encode() |
380 |
else:
|
381 |
return None, u'a { color: red }'.encode() |
382 |
|
383 |
parser = cssutils.CSSParser(fetcher=fetcher) |
384 |
|
385 |
sheet = parser.parseString('@charset "iso-8859-1";@import "level1.css";')
|
386 |
self.assertEqual(sheet.encoding, 'iso-8859-1') |
387 |
|
388 |
sheet = sheet.cssRules[1].styleSheet
|
389 |
self.assertEqual(sheet.encoding, 'ascii') |
390 |
|
391 |
sheet = sheet.cssRules[1].styleSheet
|
392 |
self.assertEqual(sheet.encoding, 'ascii') |
393 |
|
394 |
def test_incomplete(self): |
395 |
"CSSImportRule (incomplete)"
|
396 |
tests = { |
397 |
u'@import "x.css': u'@import "x.css";', |
398 |
u"@import 'x": u'@import "x";', |
399 |
# TODO:
|
400 |
u"@import url(x": u'@import url(x);', |
401 |
u"@import url('x": u'@import url(x);', |
402 |
u'@import url("x;': u'@import url("x;");', |
403 |
u'@import url( "x;': u'@import url("x;");', |
404 |
u'@import url("x ': u'@import url("x ");', |
405 |
u'@import url(x ': u'@import url(x);', |
406 |
u'''@import "a
|
407 |
@import "b";
|
408 |
@import "c";''': u'@import "c";' |
409 |
} |
410 |
self.do_equal_p(tests, raising=False) # parse |
411 |
|
412 |
def test_InvalidModificationErr(self): |
413 |
"CSSImportRule.cssText InvalidModificationErr"
|
414 |
self._test_InvalidModificationErr(u'@import') |
415 |
|
416 |
def test_reprANDstr(self): |
417 |
"CSSImportRule.__repr__(), .__str__()"
|
418 |
href = 'x.css'
|
419 |
mediaText = 'tv, print'
|
420 |
name = 'name'
|
421 |
s = cssutils.css.CSSImportRule(href=href, mediaText=mediaText, name=name) |
422 |
|
423 |
# str(): mediaText nor name are present here
|
424 |
self.assertTrue(href in str(s)) |
425 |
|
426 |
# repr()
|
427 |
s2 = eval(repr(s)) |
428 |
self.assertTrue(isinstance(s2, s.__class__)) |
429 |
self.assertTrue(href == s2.href)
|
430 |
self.assertTrue(mediaText == s2.media.mediaText)
|
431 |
self.assertTrue(name == s2.name)
|
432 |
|
433 |
|
434 |
if __name__ == '__main__': |
435 |
import unittest |
436 |
unittest.main() |