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_cssmediarule.py @ 475
History | View | Annotate | Download (17.7 KB)
1 |
"""Testcases for cssutils.css.CSSMediaRule"""
|
---|---|
2 |
|
3 |
import xml.dom |
4 |
import test_cssrule |
5 |
import cssutils |
6 |
|
7 |
class CSSMediaRuleTestCase(test_cssrule.CSSRuleTestCase): |
8 |
|
9 |
def setUp(self): |
10 |
super(CSSMediaRuleTestCase, self).setUp() |
11 |
self.r = cssutils.css.CSSMediaRule()
|
12 |
self.rRO = cssutils.css.CSSMediaRule(readonly=True) |
13 |
self.r_type = cssutils.css.CSSMediaRule.MEDIA_RULE
|
14 |
self.r_typeString = 'MEDIA_RULE' |
15 |
# for tests
|
16 |
self.stylerule = cssutils.css.CSSStyleRule()
|
17 |
self.stylerule.cssText = u'a {}' |
18 |
|
19 |
def test_init(self): |
20 |
"CSSMediaRule.__init__()"
|
21 |
super(CSSMediaRuleTestCase, self).test_init() |
22 |
|
23 |
r = cssutils.css.CSSMediaRule() |
24 |
self.assertEqual(cssutils.css.CSSRuleList, type(r.cssRules)) |
25 |
self.assertEqual([], r.cssRules)
|
26 |
self.assertEqual(u'', r.cssText) |
27 |
self.assertEqual(cssutils.stylesheets.MediaList, type(r.media)) |
28 |
self.assertEqual('all', r.media.mediaText) |
29 |
self.assertEqual(None, r.name) |
30 |
|
31 |
r = cssutils.css.CSSMediaRule(mediaText='print', name='name') |
32 |
self.assertEqual(cssutils.css.CSSRuleList, type(r.cssRules)) |
33 |
self.assertEqual([], r.cssRules)
|
34 |
self.assertEqual(u'', r.cssText) |
35 |
self.assertEqual(cssutils.stylesheets.MediaList, type(r.media)) |
36 |
self.assertEqual('print', r.media.mediaText) |
37 |
self.assertEqual('name', r.name) |
38 |
|
39 |
# only possible to set @... similar name
|
40 |
self.assertRaises(xml.dom.InvalidModificationErr, self.r._setAtkeyword, 'x') |
41 |
|
42 |
def test_iter(self): |
43 |
"CSSMediaRule.__iter__()"
|
44 |
m = cssutils.css.CSSMediaRule() |
45 |
m.cssText = '''@media all { /*1*/a { left: 0} b{ top:0} }'''
|
46 |
types = [cssutils.css.CSSRule.COMMENT, |
47 |
cssutils.css.CSSRule.STYLE_RULE, |
48 |
cssutils.css.CSSRule.STYLE_RULE] |
49 |
for i, rule in enumerate(m): |
50 |
self.assertEqual(rule, m.cssRules[i])
|
51 |
self.assertEqual(rule.type, types[i])
|
52 |
self.assertEqual(rule.parentRule, m)
|
53 |
|
54 |
def test_refs(self): |
55 |
"""CSSStylesheet references"""
|
56 |
s = cssutils.parseString('@media all {a {color: red}}')
|
57 |
r = s.cssRules[0]
|
58 |
rules = r.cssRules |
59 |
self.assertEqual(r.cssRules[0].parentStyleSheet, s) |
60 |
self.assertEqual(rules[0].parentStyleSheet, s) |
61 |
|
62 |
# set cssText
|
63 |
r.cssText = '@media all {a {color: blue}}'
|
64 |
# not anymore: self.assertEqual(rules, r.cssRules)
|
65 |
|
66 |
# set cssRules
|
67 |
r.cssRules = cssutils.parseString('''
|
68 |
/**/
|
69 |
@x;
|
70 |
b {}').cssRules''').cssRules
|
71 |
# new object
|
72 |
self.assertNotEqual(rules, r.cssRules)
|
73 |
for i, sr in enumerate(r.cssRules): |
74 |
self.assertEqual(sr.parentStyleSheet, s)
|
75 |
self.assertEqual(sr.parentRule, r)
|
76 |
|
77 |
def test_cssRules(self): |
78 |
"CSSMediaRule.cssRules"
|
79 |
r = cssutils.css.CSSMediaRule() |
80 |
self.assertEqual([], r.cssRules)
|
81 |
sr = cssutils.css.CSSStyleRule() |
82 |
r.cssRules.append(sr) |
83 |
self.assertEqual([sr], r.cssRules)
|
84 |
ir = cssutils.css.CSSImportRule() |
85 |
self.assertRaises(xml.dom.HierarchyRequestErr, r.cssRules.append, ir)
|
86 |
|
87 |
s = cssutils.parseString('@media all { /*1*/a {x:1} }')
|
88 |
m = s.cssRules[0]
|
89 |
self.assertEqual(2, m.cssRules.length) |
90 |
del m.cssRules[0] |
91 |
self.assertEqual(1, m.cssRules.length) |
92 |
m.cssRules.append('/*2*/')
|
93 |
self.assertEqual(2, m.cssRules.length) |
94 |
m.cssRules.extend(cssutils.parseString('/*3*/x {y:2}').cssRules)
|
95 |
self.assertEqual(4, m.cssRules.length) |
96 |
self.assertEqual(u'@media all {\n a {\n x: 1\n }\n /*2*/\n /*3*/\n x {\n y: 2\n }\n }', |
97 |
m.cssText) |
98 |
|
99 |
for rule in m.cssRules: |
100 |
self.assertEqual(rule.parentStyleSheet, s)
|
101 |
self.assertEqual(rule.parentRule, m)
|
102 |
|
103 |
def test_cssText(self): |
104 |
"CSSMediaRule.cssText"
|
105 |
style = '''{
|
106 |
a {
|
107 |
color: red
|
108 |
}
|
109 |
}'''
|
110 |
|
111 |
mls = { |
112 |
u' (min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx) ': None, |
113 |
u' tv ': None, |
114 |
u' only tv ': None, |
115 |
u' not tv ': None, |
116 |
u' only tv and (color) ': None, |
117 |
u' only tv and(color)': u' only tv and (color) ', |
118 |
u' only tv and (color: red) ': None, |
119 |
u' only tv and (color: red) and (width: 100px) ': None, |
120 |
u' only tv and (color: red) and (width: 100px), tv ': None, |
121 |
u' only tv and (color: red) and (width: 100px), tv and (width: 20px) ': None, |
122 |
u' only tv and(color :red)and( width :100px ) ,tv and(width: 20px) ':
|
123 |
u' only tv and (color: red) and (width: 100px), tv and (width: 20px) ',
|
124 |
u' (color: red) and (width: 100px), (width: 20px) ': None, |
125 |
u' /*1*/ only /*2*/ tv /*3*/ and /*4*/ (/*5*/ width) /*5*/ /*6*/, (color) and (height) ': None, |
126 |
u'(color)and(width),(height)': u' (color) and (width), (height) ' |
127 |
} |
128 |
tests = {} |
129 |
for b, a in mls.items(): |
130 |
if a is None: |
131 |
a = b |
132 |
tests[u'@media%s%s' % (b, style)] = u'@media%s%s' % (a, style) |
133 |
|
134 |
self.do_equal_p(tests)
|
135 |
self.do_equal_r(tests)
|
136 |
|
137 |
tests = { |
138 |
u'@media only tv{}': u'', |
139 |
u'@media not tv{}': u'', |
140 |
u'@media only tv and (color){}': u'', |
141 |
u'@media only tv and (color: red){}': u'', |
142 |
u'@media only tv and (color: red) and (width: 100px){}': u'', |
143 |
u'@media only tv and (color: red) and (width: 100px), tv{}': u'', |
144 |
u'@media only tv and (color: red) and (width: 100px), tv and (width: 20px){}': u'', |
145 |
u'@media (color: red) and (width: 100px), (width: 20px){}': u'', |
146 |
u'@media (width){}': u'', |
147 |
u'@media (width:10px){}': u'', |
148 |
u'@media (width), (color){}': u'', |
149 |
u'@media (width) , (color),(height){}': u'', |
150 |
u'@media (width) , (color) and (height){}': u'', |
151 |
u'@media (width) and (color){}': u'', |
152 |
u'@media all and (width){}': u'', |
153 |
u'@media all and (width:10px){}': u'', |
154 |
u'@media all and (width), (color){}': u'', |
155 |
u'@media all and (width) , (color),(height){}': u'', |
156 |
u'@media all and (width) , (color) and (height){}': u'', |
157 |
u'@media all and (width) and (color){}': u'', |
158 |
u'@media only tv and (width){}': u'', |
159 |
u'@media only tv and (width:10px){}': u'', |
160 |
u'@media only tv and (width), (color){}': u'', |
161 |
u'@media only tv and (width) , (color),(height){}': u'', |
162 |
u'@media only tv and (width) , (color) and (height){}': u'', |
163 |
u'@media only tv and (width) and (color){}': u'', |
164 |
|
165 |
u'@media only tv and (width) "name" {}': u'', |
166 |
u'@media only tv and (width:10px) "name" {}': u'', |
167 |
u'@media only tv and (width), (color){}': u'', |
168 |
u'@media only tv and (width) , (color),(height){}': u'', |
169 |
u'@media only tv and (width) , (color) and (height){}': u'', |
170 |
u'@media only tv and (width) and (color){}': u'', |
171 |
|
172 |
|
173 |
|
174 |
u'@media all "name"{}': u'', |
175 |
u'@media all {}': u'', |
176 |
u'@media/*x*/all{}': u'', |
177 |
u'@media all { a{ x: 1} }': u'@media all {\n a {\n x: 1\n }\n }', |
178 |
u'@media all "name" { a{ x: 1} }': u'@media all "name" {\n a {\n x: 1\n }\n }', |
179 |
u'@MEDIA all { a{x:1} }': u'@media all {\n a {\n x: 1\n }\n }', |
180 |
u'@\\media all { a{x:1} }': u'@media all {\n a {\n x: 1\n }\n }', |
181 |
u'@media all {@x some;a{color: red;}b{color: green;}}':
|
182 |
u'''@media all {
|
183 |
@x some;
|
184 |
a {
|
185 |
color: red
|
186 |
}
|
187 |
b {
|
188 |
color: green
|
189 |
}
|
190 |
}''',
|
191 |
u'@media all { @x{}}': u'@media all {\n @x {\n }\n }', |
192 |
u'@media all "n" /**/ { @x{}}':
|
193 |
u'@media all "n" /**/ {\n @x {\n }\n }',
|
194 |
# comments
|
195 |
u'@media/*1*//*2*/all/*3*//*4*/{/*5*/a{x:1}}':
|
196 |
u'@media /*1*/ /*2*/ all /*3*/ /*4*/ {\n /*5*/\n a {\n x: 1\n }\n }',
|
197 |
u'@media /*1*/ /*2*/ all /*3*/ /*4*/ { /*5*/ a{ x: 1} }':
|
198 |
u'@media /*1*/ /*2*/ all /*3*/ /*4*/ {\n /*5*/\n a {\n x: 1\n }\n }',
|
199 |
# WS
|
200 |
u'@media\n\t\f all\n\t\f {\n\t\f a{ x: 1}\n\t\f }':
|
201 |
u'@media all {\n a {\n x: 1\n }\n }',
|
202 |
} |
203 |
self.do_equal_p(tests)
|
204 |
self.do_equal_r(tests)
|
205 |
|
206 |
tests = { |
207 |
u'@media {}': xml.dom.SyntaxErr,
|
208 |
u'@media;': xml.dom.SyntaxErr,
|
209 |
u'@media/*only comment*/{}': xml.dom.SyntaxErr,
|
210 |
u'@media all;': xml.dom.SyntaxErr,
|
211 |
u'@media all "n";': xml.dom.SyntaxErr,
|
212 |
u'@media all; @x{}': xml.dom.SyntaxErr,
|
213 |
u'@media { a{ x: 1} }': xml.dom.SyntaxErr,
|
214 |
u'@media "name" { a{ x: 1} }': xml.dom.SyntaxErr,
|
215 |
u'@media "name" all { a{ x: 1} }': xml.dom.SyntaxErr,
|
216 |
u'@media all { @charset "x"; a{}}': xml.dom.HierarchyRequestErr,
|
217 |
u'@media all { @import "x"; a{}}': xml.dom.HierarchyRequestErr,
|
218 |
u'@media all { @media all {} }': xml.dom.HierarchyRequestErr,
|
219 |
u'@media all { , }': xml.dom.SyntaxErr,
|
220 |
u'@media all {}EXTRA': xml.dom.SyntaxErr,
|
221 |
u'@media ({}': xml.dom.SyntaxErr,
|
222 |
u'@media (color{}': xml.dom.SyntaxErr,
|
223 |
u'@media (color:{}': xml.dom.SyntaxErr,
|
224 |
u'@media (color:red{}': xml.dom.SyntaxErr,
|
225 |
u'@media (:red){}': xml.dom.SyntaxErr,
|
226 |
u'@media (:){}': xml.dom.SyntaxErr,
|
227 |
u'@media color:red){}': xml.dom.SyntaxErr,
|
228 |
|
229 |
} |
230 |
self.do_raise_p(tests)
|
231 |
self.do_raise_r(tests)
|
232 |
|
233 |
tests = { |
234 |
# extra stuff
|
235 |
'@media all { x{} } a{}': xml.dom.SyntaxErr,
|
236 |
} |
237 |
self.do_raise_r(tests)
|
238 |
|
239 |
m = cssutils.css.CSSMediaRule() |
240 |
m.cssText = u'''@media all {@x; /*1*/a{color: red;}}'''
|
241 |
for r in m.cssRules: |
242 |
self.assertEqual(m, r.parentRule)
|
243 |
self.assertEqual(m.parentStyleSheet, r.parentStyleSheet)
|
244 |
|
245 |
cssutils.ser.prefs.useDefaults() |
246 |
|
247 |
def test_media(self): |
248 |
"CSSMediaRule.media"
|
249 |
# see CSSImportRule.media
|
250 |
|
251 |
# setting not allowed
|
252 |
self.assertRaises(AttributeError, |
253 |
self.r.__setattr__, 'media', None) |
254 |
self.assertRaises(AttributeError, |
255 |
self.r.__setattr__, 'media', 0) |
256 |
|
257 |
# set mediaText instead
|
258 |
self.r.media.mediaText = 'print' |
259 |
self.r.insertRule(self.stylerule) |
260 |
self.assertEqual(u'', self.r.cssText) |
261 |
cssutils.ser.prefs.keepEmptyRules = True
|
262 |
self.assertEqual(u'@media print {\n a {}\n }', self.r.cssText) |
263 |
cssutils.ser.prefs.useDefaults() |
264 |
|
265 |
def test_name(self): |
266 |
"CSSMediaRule.name"
|
267 |
r = cssutils.css.CSSMediaRule() |
268 |
r.cssText = '@media all "\\n\\"ame" {a{left: 0}}'
|
269 |
|
270 |
self.assertEqual('\\n"ame', r.name) |
271 |
r.name = "n"
|
272 |
self.assertEqual('n', r.name) |
273 |
self.assertEqual(u'@media all "n" {\n a {\n left: 0\n }\n }', |
274 |
r.cssText) |
275 |
r.name = '"'
|
276 |
self.assertEqual('"', r.name) |
277 |
self.assertEqual(u'@media all "\\"" {\n a {\n left: 0\n }\n }', |
278 |
r.cssText) |
279 |
|
280 |
r.name = ''
|
281 |
self.assertEqual(None, r.name) |
282 |
self.assertEqual(u'@media all {\n a {\n left: 0\n }\n }', |
283 |
r.cssText) |
284 |
|
285 |
r.name = None
|
286 |
self.assertEqual(None, r.name) |
287 |
self.assertEqual(u'@media all {\n a {\n left: 0\n }\n }', |
288 |
r.cssText) |
289 |
|
290 |
self.assertRaises(xml.dom.SyntaxErr, r._setName, 0) |
291 |
self.assertRaises(xml.dom.SyntaxErr, r._setName, 123) |
292 |
|
293 |
def test_deleteRuleIndex(self): |
294 |
"CSSMediaRule.deleteRule(index)"
|
295 |
# see CSSStyleSheet.deleteRule
|
296 |
m = cssutils.css.CSSMediaRule() |
297 |
m.cssText = u'''@media all {
|
298 |
@a;
|
299 |
/* x */
|
300 |
@b;
|
301 |
@c;
|
302 |
@d;
|
303 |
}'''
|
304 |
self.assertEqual(5, m.cssRules.length) |
305 |
self.assertRaises(xml.dom.IndexSizeErr, m.deleteRule, 5) |
306 |
|
307 |
# end -1
|
308 |
# check parentRule
|
309 |
r = m.cssRules[-1]
|
310 |
self.assertEqual(m, r.parentRule)
|
311 |
m.deleteRule(-1)
|
312 |
self.assertEqual(None, r.parentRule) |
313 |
|
314 |
self.assertEqual(4, m.cssRules.length) |
315 |
self.assertEqual(
|
316 |
u'@media all {\n @a;\n /* x */\n @b;\n @c;\n }', m.cssText)
|
317 |
# beginning
|
318 |
m.deleteRule(0)
|
319 |
self.assertEqual(3, m.cssRules.length) |
320 |
self.assertEqual(u'@media all {\n /* x */\n @b;\n @c;\n }', m.cssText) |
321 |
# middle
|
322 |
m.deleteRule(1)
|
323 |
self.assertEqual(2, m.cssRules.length) |
324 |
self.assertEqual(u'@media all {\n /* x */\n @c;\n }', m.cssText) |
325 |
# end
|
326 |
m.deleteRule(1)
|
327 |
self.assertEqual(1, m.cssRules.length) |
328 |
self.assertEqual(u'@media all {\n /* x */\n }', m.cssText) |
329 |
|
330 |
def test_deleteRule(self): |
331 |
"CSSMediaRule.deleteRule(rule)"
|
332 |
m = cssutils.css.CSSMediaRule() |
333 |
m.cssText='''@media all {
|
334 |
a { color: red; }
|
335 |
b { color: blue; }
|
336 |
c { color: green; }
|
337 |
}'''
|
338 |
s1, s2, s3 = m.cssRules |
339 |
|
340 |
r = cssutils.css.CSSStyleRule() |
341 |
self.assertRaises(xml.dom.IndexSizeErr, m.deleteRule, r)
|
342 |
|
343 |
self.assertEqual(3, m.cssRules.length) |
344 |
m.deleteRule(s2) |
345 |
self.assertEqual(2, m.cssRules.length) |
346 |
self.assertEqual(m.cssText, '@media all {\n a {\n color: red\n }\n c {\n color: green\n }\n }') |
347 |
self.assertRaises(xml.dom.IndexSizeErr, m.deleteRule, s2)
|
348 |
|
349 |
def test_add(self): |
350 |
"CSSMediaRule.add()"
|
351 |
# see CSSStyleSheet.add
|
352 |
r = cssutils.css.CSSMediaRule() |
353 |
stylerule1 = cssutils.css.CSSStyleRule() |
354 |
stylerule2 = cssutils.css.CSSStyleRule() |
355 |
r.add(stylerule1) |
356 |
r.add(stylerule2) |
357 |
self.assertEqual(r.cssRules[0], stylerule1) |
358 |
self.assertEqual(r.cssRules[1], stylerule2) |
359 |
|
360 |
def test_insertRule(self): |
361 |
"CSSMediaRule.insertRule"
|
362 |
# see CSSStyleSheet.insertRule
|
363 |
r = cssutils.css.CSSMediaRule() |
364 |
charsetrule = cssutils.css.CSSCharsetRule('ascii')
|
365 |
importrule = cssutils.css.CSSImportRule('x')
|
366 |
namespacerule = cssutils.css.CSSNamespaceRule() |
367 |
pagerule = cssutils.css.CSSPageRule() |
368 |
mediarule = cssutils.css.CSSMediaRule() |
369 |
unknownrule = cssutils.css.CSSUnknownRule('@x;')
|
370 |
stylerule = cssutils.css.CSSStyleRule('a')
|
371 |
stylerule.cssText = u'a { x: 1}'
|
372 |
comment1 = cssutils.css.CSSComment(u'/*1*/')
|
373 |
comment2 = cssutils.css.CSSComment(u'/*2*/')
|
374 |
|
375 |
# hierarchy
|
376 |
self.assertRaises(xml.dom.HierarchyRequestErr,
|
377 |
r.insertRule, charsetrule, 0)
|
378 |
self.assertRaises(xml.dom.HierarchyRequestErr,
|
379 |
r.insertRule, importrule, 0)
|
380 |
self.assertRaises(xml.dom.HierarchyRequestErr,
|
381 |
r.insertRule, namespacerule, 0)
|
382 |
self.assertRaises(xml.dom.HierarchyRequestErr,
|
383 |
r.insertRule, pagerule, 0)
|
384 |
self.assertRaises(xml.dom.HierarchyRequestErr,
|
385 |
r.insertRule, mediarule, 0)
|
386 |
|
387 |
# start insert
|
388 |
r.insertRule(stylerule, 0)
|
389 |
self.assertEqual(r, stylerule.parentRule)
|
390 |
self.assertEqual(r.parentStyleSheet, stylerule.parentStyleSheet)
|
391 |
# before
|
392 |
r.insertRule(comment1, 0)
|
393 |
self.assertEqual(r, comment1.parentRule)
|
394 |
self.assertEqual(r.parentStyleSheet, stylerule.parentStyleSheet)
|
395 |
# end explicit
|
396 |
r.insertRule(unknownrule, 2)
|
397 |
self.assertEqual(r, unknownrule.parentRule)
|
398 |
self.assertEqual(r.parentStyleSheet, stylerule.parentStyleSheet)
|
399 |
# end implicit
|
400 |
r.insertRule(comment2) |
401 |
self.assertEqual(r, comment2.parentRule)
|
402 |
self.assertEqual(r.parentStyleSheet, stylerule.parentStyleSheet)
|
403 |
self.assertEqual(
|
404 |
'@media all {\n /*1*/\n a {\n x: 1\n }\n @x;\n /*2*/\n }',
|
405 |
r.cssText) |
406 |
|
407 |
# index
|
408 |
self.assertRaises(xml.dom.IndexSizeErr,
|
409 |
r.insertRule, stylerule, -1)
|
410 |
self.assertRaises(xml.dom.IndexSizeErr,
|
411 |
r.insertRule, stylerule, r.cssRules.length + 1)
|
412 |
|
413 |
def test_InvalidModificationErr(self): |
414 |
"CSSMediaRule.cssText InvalidModificationErr"
|
415 |
self._test_InvalidModificationErr(u'@media') |
416 |
|
417 |
def test_incomplete(self): |
418 |
"CSSMediaRule (incomplete)"
|
419 |
tests = { |
420 |
u'@media all { @unknown;': # no } |
421 |
u'@media all {\n @unknown;\n }',
|
422 |
u'@media all { a {x:"1"}': # no } |
423 |
u'@media all {\n a {\n x: "1"\n }\n }',
|
424 |
u'@media all { a {x:"1"': # no }} |
425 |
u'@media all {\n a {\n x: "1"\n }\n }',
|
426 |
u'@media all { a {x:"1': # no "}} |
427 |
u'@media all {\n a {\n x: "1"\n }\n }',
|
428 |
} |
429 |
self.do_equal_p(tests) # parse |
430 |
|
431 |
def test_reprANDstr(self): |
432 |
"CSSMediaRule.__repr__(), .__str__()"
|
433 |
mediaText='tv, print'
|
434 |
|
435 |
s = cssutils.css.CSSMediaRule(mediaText=mediaText) |
436 |
|
437 |
self.assertTrue(mediaText in str(s)) |
438 |
|
439 |
s2 = eval(repr(s)) |
440 |
self.assertTrue(isinstance(s2, s.__class__)) |
441 |
self.assertTrue(mediaText == s2.media.mediaText)
|
442 |
|
443 |
|
444 |
if __name__ == '__main__': |
445 |
import unittest |
446 |
unittest.main() |