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