Statistics
| Revision:

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()