1 """Testcases for cssutils.css.CSSImportRule"""
2 __version__ = '$Id: test_cssimportrule.py 1175 2008-03-20 17:43:26Z cthedot $'
3
4 import xml.dom
5 from minimock import mock, restore
6 import test_cssrule
7 import cssutils
8
10
17
19 "CSSImportRule.__init__()"
20 super(CSSImportRuleTestCase, self).test_init()
21
22
23 self.assertEqual(None, self.r.href)
24 self.assertEqual(None, self.r.hreftype)
25 self.assertEqual(u'all', self.r.media.mediaText)
26 self.assertEqual(
27 cssutils.stylesheets.MediaList, type(self.r.media))
28 self.assertEqual(None, self.r.name)
29 self.assertEqual(None, self.r.styleSheet)
30 self.assertEqual(u'', self.r.cssText)
31 self.assertEqual(None, self.r.styleSheet)
32
33
34 r = cssutils.css.CSSImportRule(href='href', mediaText='tv', name='name')
35 self.assertEqual(u'@import url(href) tv "name";', r.cssText)
36 self.assertEqual("href", r.href)
37 self.assertEqual(None, r.hreftype)
38 self.assertEqual(u'tv', r.media.mediaText)
39 self.assertEqual(
40 cssutils.stylesheets.MediaList, type(r.media))
41 self.assertEqual('name', r.name)
42 self.assertEqual(None, r.parentRule)
43 self.assertEqual(None, r.parentStyleSheet)
44 self.assertEqual(None, r.styleSheet)
45
46
47 r = cssutils.css.CSSImportRule(u'x')
48 self.assertEqual(u'@import url(x);', r.cssText)
49 self.assertEqual('x', r.href)
50 self.assertEqual(None, r.hreftype)
51
52
53 r = cssutils.css.CSSImportRule(u'x', u'print')
54 self.assertEqual(u'@import url(x) print;', r.cssText)
55 self.assertEqual('x', r.href)
56 self.assertEqual('print', r.media.mediaText)
57
58
59 r = cssutils.css.CSSImportRule(u'x', name=u'n')
60 self.assertEqual(u'@import url(x) "n";', r.cssText)
61 self.assertEqual('x', r.href)
62 self.assertEqual('n', r.name)
63
64
65 r = cssutils.css.CSSImportRule(u'x', u'print', 'n')
66 self.assertEqual(u'@import url(x) print "n";', r.cssText)
67 self.assertEqual('x', r.href)
68 self.assertEqual('print', r.media.mediaText)
69 self.assertEqual('n', r.name)
70
71
72 self.r = cssutils.css.CSSImportRule(mediaText=u'print', name="n")
73 self.assertEqual(cssutils.stylesheets.MediaList,
74 type(self.r.media))
75 self.assertEqual(u'', self.r.cssText)
76 self.assertEqual(u'print', self.r.media.mediaText)
77 self.assertEqual(u'n', self.r.name)
78
79
80 self.assertRaises(xml.dom.InvalidModificationErr, self.r._setAtkeyword, 'x')
81
82 - def test_cssText(self):
83 "CSSImportRule.cssText"
84 tests = {
85
86 u'''@import "str";''': None,
87 u'''@import"str";''': u'''@import "str";''',
88 u'''@\\import "str";''': u'''@import "str";''',
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";''': None,
93 u'''@import "str" ;''': u'''@import "str";''',
94 ur'''@import "\"" ;''': ur'''@import "\"";''',
95 u'''@import '\\'';''': ur'''@import "'";''',
96 u'''@import '"';''': ur'''@import "\"";''',
97
98 u'''@import url(x.css);''': None,
99
100 u'''@importurl(x.css);''': u'''@import url(x.css);''',
101 u'''@import url(")");''': u'''@import url(")");''',
102 u'''@import url("\\"");''': u'''@import url(");''',
103 u'''@import url('\\'');''': u'''@import url(');''',
104
105
106
107 u'''@import "str" all;''': u'''@import "str";''',
108 u'''@import "str" tv, print;''': None,
109 u'''@import"str"tv,print;''': u'''@import "str" tv, print;''',
110 u'''@import "str" tv, print, all;''': u'''@import "str";''',
111 u'''@import "str" handheld, all;''': u'''@import "str" all, handheld;''',
112 u'''@import "str" all, handheld;''': None,
113 u'''@import "str" not tv;''': None,
114 u'''@import "str" only tv;''': None,
115 u'''@import "str" only tv and (color: 2);''': None,
116
117
118 u'''@import "str" "name";''': None,
119 u'''@import "str" 'name';''': u'''@import "str" "name";''',
120 u'''@import url(x) "name";''': None,
121 u'''@import "str" "\\"";''': None,
122 u'''@import "str" '\\'';''': u'''@import "str" "'";''',
123
124
125 u'''@import"str"tv"name";''': u'''@import "str" tv "name";''',
126 u'''@import\t\r\f\n"str"\t\t\r\f\ntv\t\t\r\f\n"name"\t;''':
127 u'''@import "str" tv "name";''',
128
129
130 u'''@import /*1*/ "str" /*2*/;''': None,
131 u'@import/*1*//*2*/"str"/*3*//*4*/all/*5*//*6*/"name"/*7*//*8*/ ;':
132 u'@import /*1*/ /*2*/ "str" /*3*/ /*4*/ all /*5*/ /*6*/ "name" /*7*/ /*8*/;',
133 u'@import/*1*//*2*/url(u)/*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
138 u'@import\n\t\f "str"\n\t\f tv\n\t\f "name"\n\t\f ;':
139 u'@import "str" tv "name";',
140 u'@import\n\t\f url(\n\t\f u\n\t\f )\n\t\f tv\n\t\f "name"\n\t\f ;':
141 u'@import url(u) tv "name";',
142 u'@import\n\t\f url("u")\n\t\f tv\n\t\f "name"\n\t\f ;':
143 u'@import url(u) tv "name";',
144 u'@import\n\t\f url(\n\t\f "u"\n\t\f )\n\t\f tv\n\t\f "name"\n\t\f ;':
145 u'@import url(u) tv "name";',
146 }
147 self.do_equal_r(tests)
148 tests.update({
149 u'@import "x.css" tv': '@import "x.css" tv;',
150 u'@import "x.css"': '@import "x.css";',
151 u"@import 'x.css'": '@import "x.css";',
152 u'@import url(x.css)': '@import url(x.css);',
153 u'@import "x;': '@import "x;";',
154 })
155 self.do_equal_p(tests)
156
157 tests = {
158 u'''@import;''': xml.dom.SyntaxErr,
159 u'''@import all;''': xml.dom.SyntaxErr,
160 u'''@import all"name";''': xml.dom.SyntaxErr,
161 u'''@import;''': xml.dom.SyntaxErr,
162 u'''@import x";''': xml.dom.SyntaxErr,
163 u'''@import "str" ,all;''': xml.dom.SyntaxErr,
164 u'''@import "str" all,;''': xml.dom.SyntaxErr,
165 u'''@import "str" all tv;''': xml.dom.SyntaxErr,
166 u'''@import "str" "name" all;''': xml.dom.SyntaxErr,
167 }
168 self.do_raise_p(tests)
169 tests.update({
170 u'@import "x.css"': xml.dom.SyntaxErr,
171 u"@import 'x.css'": xml.dom.SyntaxErr,
172 u'@import url(x.css)': xml.dom.SyntaxErr,
173 u'@import "x.css" tv': xml.dom.SyntaxErr,
174 u'@import "x;': xml.dom.SyntaxErr,
175 u'''@import url("x);''': xml.dom.SyntaxErr,
176
177 u'''@import "x";"a"''': xml.dom.SyntaxErr,
178
179 u'''@import "x";/**/''': xml.dom.SyntaxErr,
180 u'''@import "x"; ''': xml.dom.SyntaxErr,
181 })
182 self.do_raise_r(tests)
183
185 "CSSImportRule.href"
186
187 self.r.href = 'x'
188 self.assertEqual('x', self.r.href)
189 self.assertEqual(u'@import url(x);', self.r.cssText)
190
191
192 self.r.href = 'http://www.example.com/x?css=z&v=1'
193 self.assertEqual('http://www.example.com/x?css=z&v=1' , self.r.href)
194 self.assertEqual(u'@import url(http://www.example.com/x?css=z&v=1);',
195 self.r.cssText)
196
197
198 self.r.hreftype='string'
199 self.assertEqual('http://www.example.com/x?css=z&v=1' , self.r.href)
200 self.assertEqual(u'@import "http://www.example.com/x?css=z&v=1";',
201 self.r.cssText)
202
203
204 self.r.href = '"'
205 self.assertEqual(u'@import "\\"";', self.r.cssText)
206 self.r.hreftype='url'
207 self.assertEqual(u'@import url(");', self.r.cssText)
208
209
210 self.r.href = ')'
211 self.assertEqual(u'@import url(")");', self.r.cssText)
212
213 self.r.hreftype = 'NOT VALID'
214 self.assertEqual(u'@import url(")");', self.r.cssText)
215
217 "CSSImportRule.hreftype"
218 self.r = cssutils.css.CSSImportRule()
219
220 self.r.cssText = '@import /*1*/url(org) /*2*/;'
221 self.assertEqual('uri', self.r.hreftype)
222 self.assertEqual(u'@import /*1*/ url(org) /*2*/;', self.r.cssText)
223
224 self.r.cssText = '@import /*1*/"org" /*2*/;'
225 self.assertEqual('string', self.r.hreftype)
226 self.assertEqual(u'@import /*1*/ "org" /*2*/;', self.r.cssText)
227
228 self.r.href = 'new'
229 self.assertEqual(u'@import /*1*/ "new" /*2*/;', self.r.cssText)
230
231 self.r.hreftype='uri'
232 self.assertEqual(u'@import /*1*/ url(new) /*2*/;', self.r.cssText)
233
244
246 "CSSImportRule.name"
247 r = cssutils.css.CSSImportRule('x', name='0')
248 self.assertEqual('0', r.name)
249 self.assertEqual(u'@import url(x) "0";', r.cssText)
250
251 r.name = "n"
252 self.assertEqual('n', r.name)
253 self.assertEqual(u'@import url(x) "n";', r.cssText)
254 r.name = '"'
255 self.assertEqual('"', r.name)
256 self.assertEqual(u'@import url(x) "\\"";', r.cssText)
257
258 r.hreftype = 'string'
259 self.assertEqual(u'@import "x" "\\"";', r.cssText)
260 r.name = "123"
261 self.assertEqual(u'@import "x" "123";', r.cssText)
262
263 r.name = None
264 self.assertEqual(None, r.name)
265 self.assertEqual(u'@import "x";', r.cssText)
266
267 r.name = ""
268 self.assertEqual(None, r.name)
269 self.assertEqual(u'@import "x";', r.cssText)
270
271 self.assertRaises(xml.dom.SyntaxErr, r._setName, 0)
272 self.assertRaises(xml.dom.SyntaxErr, r._setName, 123)
273
275 "CSSImportRule.styleSheet"
276 i = [-1]
277 examples = [
278 '@import "level2/css.css" "title2";',
279 'a { color: red }'
280 ]
281 def m(*p, **kw):
282 i[0] += 1
283 return examples[i[0]]
284 mock('cssutils.util._readURL', mock_obj=m)
285 sheet = cssutils.parseString('@import "level1/anything.css" tv "title";',
286 href='/root/')
287 restore()
288
289 self.assertEqual(sheet.href, '/root/')
290
291 ir = sheet.cssRules[0]
292 self.assertEqual(ir.href, 'level1/anything.css')
293 self.assertEqual(ir.styleSheet.href, '/root/level1/anything.css')
294 self.assertEqual(ir.styleSheet.ownerRule, ir)
295 self.assertEqual(ir.styleSheet.media.mediaText, 'tv')
296 self.assertEqual(ir.styleSheet.parentStyleSheet, sheet)
297 self.assertEqual(ir.styleSheet.title, 'title')
298 self.assertEqual(ir.styleSheet.cssText, '@import "level2/css.css" "title2";')
299
300 ir2 = ir.styleSheet.cssRules[0]
301 self.assertEqual(ir2.href, 'level2/css.css')
302 self.assertEqual(ir2.styleSheet.href, '/root/level1/level2/css.css')
303 self.assertEqual(ir2.styleSheet.ownerRule, ir2)
304 self.assertEqual(ir2.styleSheet.media.mediaText, 'all')
305 self.assertEqual(ir2.styleSheet.parentStyleSheet, ir.styleSheet)
306 self.assertEqual(ir2.styleSheet.title, 'title2')
307 self.assertEqual(ir2.styleSheet.cssText, 'a {\n color: red\n }')
308
309 sheet = cssutils.parseString('@import "CANNOT-FIND.css";')
310 ir = sheet.cssRules[0]
311 self.assertEqual(ir.href, "CANNOT-FIND.css")
312 self.assertEqual(ir.styleSheet, None)
313
315 "CSSImportRule (incomplete)"
316 tests = {
317 u'@import "x.css': u'@import "x.css";',
318 u"@import 'x": u'@import "x";',
319
320 u"@import url(x": u'@import url(x);',
321 u"@import url('x": u'@import url(x);',
322 u'@import url("x;': u'@import url("x;");',
323 u'@import url( "x;': u'@import url("x;");',
324 u'@import url("x ': u'@import url("x ");',
325 u'@import url(x ': u'@import url(x);',
326 u'''@import "a
327 @import "b";
328 @import "c";''': u'@import "c";'
329 }
330 self.do_equal_p(tests, raising=False)
331
335
352
353
354 if __name__ == '__main__':
355 import unittest
356 unittest.main()
357