1
2 """
3 tests for css.CSSStyleSheet
4 """
5 __author__ = '$LastChangedBy: cthedot $'
6 __date__ = '$LastChangedDate: 2008-01-12 21:28:54 +0100 (Sa, 12 Jan 2008) $'
7 __version__ = '$LastChangedRevision: 831 $'
8
9 import xml.dom
10 import basetest
11 import cssutils.css
12
14
20
22 "CSSStyleSheet.__init__()"
23 self.assertEqual(False, self.s._readonly)
24 self.assertEqual([], self.s.cssRules)
25 self.assertEqual('text/css', self.s.type)
26 self.assertEqual(False, self.s.disabled)
27 self.assertEqual(None, self.s.href)
28 self.assertEqual(None, self.s.media)
29 self.assertEqual(None, self.s.ownerNode)
30 self.assertEqual(None, self.s.parentStyleSheet)
31 self.assertEqual(u'', self.s.title)
32
34 "CSSStyleSheet NoModificationAllowedErr"
35 css = cssutils.css.CSSStyleSheet(readonly=True)
36
37 self.assertEqual(True, css._readonly)
38
39 self.assertRaises(xml.dom.NoModificationAllowedErr,
40 css._setCssText, u'@x;')
41 self.assertRaises(xml.dom.NoModificationAllowedErr,
42 css.insertRule, self.rule)
43 self.assertRaises(xml.dom.NoModificationAllowedErr,
44 css.insertRule, self.rule, 0)
45 self.assertRaises(xml.dom.NoModificationAllowedErr,
46 css.deleteRule, 0)
47
49 "CSSStyleSheet.cssText HierarchyRequestErr"
50 tests = {
51
52 u' @charset "utf-8";': xml.dom.HierarchyRequestErr,
53 u'@charset "ascii";@charset "ascii";': xml.dom.HierarchyRequestErr, u'/*c*/@charset "ascii";': xml.dom.HierarchyRequestErr,
54 u'@import "x"; @charset "ascii";': xml.dom.HierarchyRequestErr,
55 u'@namespace a "x"; @charset "ascii";': xml.dom.HierarchyRequestErr,
56 u'@media all {} @charset "ascii";': xml.dom.HierarchyRequestErr,
57 u'@page {} @charset "ascii";': xml.dom.HierarchyRequestErr,
58 u'a {} @charset "ascii";': xml.dom.HierarchyRequestErr,
59
60
61 u'@namespace a "x"; @import "x";': xml.dom.HierarchyRequestErr,
62 u'@media all {} @import "x";': xml.dom.HierarchyRequestErr,
63 u'@page {} @import "x";': xml.dom.HierarchyRequestErr,
64 u'a {} @import "x";': xml.dom.HierarchyRequestErr,
65
66
67 u'@media all {} @namespace a "x";': xml.dom.HierarchyRequestErr,
68 u'@page {} @namespace a "x";': xml.dom.HierarchyRequestErr,
69 u'a {} @namespace a "x";': xml.dom.HierarchyRequestErr,
70 }
71 self.do_raise_r(tests)
72 self.do_raise_p(tests)
73
75 """CSSStyleSheet.cssText SyntaxErr
76
77 for single {, } or ;
78 """
79 tests = {
80 u'{': xml.dom.SyntaxErr,
81 u'}': xml.dom.SyntaxErr,
82 u';': xml.dom.SyntaxErr,
83 u'@charset "ascii";{': xml.dom.SyntaxErr,
84 u'@charset "ascii";}': xml.dom.SyntaxErr,
85 u'@charset "ascii";;': xml.dom.SyntaxErr,
86 }
87 self.do_raise_r(tests)
88 self.do_raise_p(tests)
89
91 "CSSStyleRule (incomplete)"
92 tests = {
93 u'@import "a': u'@import "a";',
94 u'a { x: 1': u'a {\n x: 1\n }',
95 u'a { font-family: "arial sans':
96 u'a {\n font-family: "arial sans"\n }',
97 }
98 self.do_equal_p(tests)
99
100 - def test_cssText(self):
101 "CSSStyleSheet.cssText"
102 tests = {
103 u'': None,
104
105 u'@charset "ascii";\n@import "x";': None,
106 u'@charset "ascii";\n@media all {}': u'@charset "ascii";',
107 u'@charset "ascii";\n@x;': None,
108 u'@charset "ascii";\na {\n x: 1\n }': None,
109
110 u'@x;\n@import "x";': None,
111 u'@import "x";\n@import "y";': None,
112 u'@import "x";\n@media all {}': u'@import "x";',
113 u'@import "x";\n@x;': None,
114 u'@import "x";\na {\n x: 1\n }': None,
115
116 u'@x;\n@namespace a "x";': None,
117 u'@namespace a "x";\n@namespace b "y";': None,
118 u'@import "x";\n@namespace a "x";\n@media all {}': u'@import "x";\n@namespace a "x";',
119 u'@namespace a "x";\n@x;': None,
120 u'@namespace a "x";\na {\n x: 1\n }': None,
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137 }
138 self.do_equal_r(tests)
139 self.do_equal_p(tests)
140
141 s = cssutils.css.CSSStyleSheet()
142 s.cssText = u'''@charset "ascii";@import "x";@namespace a "x";
143 @media all {/*1*/}@page {margin: 0}a {\n x: 1\n }@unknown;/*comment*/'''
144 for r in s.cssRules:
145 self.assertEqual(s, r.parentStyleSheet)
146
164
166 "CSSStyleSheet.encoding"
167 self.s.cssText=''
168 self.assertEqual('utf-8', self.s.encoding)
169
170 self.s.encoding = 'ascii'
171 self.assertEqual('ascii', self.s.encoding)
172 self.assertEqual(1, self.s.cssRules.length)
173 self.assertEqual('ascii', self.s.cssRules[0].encoding)
174
175 self.s.encoding = None
176 self.assertEqual('utf-8', self.s.encoding)
177 self.assertEqual(0, self.s.cssRules.length)
178
179 self.s.encoding = 'UTF-8'
180 self.assertEqual('utf-8', self.s.encoding)
181 self.assertEqual(1, self.s.cssRules.length)
182
183 self.assertRaises(xml.dom.SyntaxErr, self.s._setEncoding,
184 'INVALID ENCODING')
185 self.assertEqual('utf-8', self.s.encoding)
186 self.assertEqual(1, self.s.cssRules.length)
187
189 "CSSStyleSheet.deleteRule()"
190 self.s.cssText = u'@charset "ascii"; @import "x"; @x; a {\n x: 1\n }@y;'
191 self.assertEqual(5, self.s.cssRules.length)
192
193 self.assertRaises(xml.dom.IndexSizeErr, self.s.deleteRule, 5)
194
195
196
197 r = self.s.cssRules[-1]
198 self.assertEqual(self.s, r.parentStyleSheet)
199 self.s.deleteRule(-1)
200 self.assertEqual(None, r.parentStyleSheet)
201
202 self.assertEqual(4, self.s.cssRules.length)
203 self.assertEqual(
204 u'@charset "ascii";\n@import "x";\n@x;\na {\n x: 1\n }', self.s.cssText)
205
206 self.s.deleteRule(0)
207 self.assertEqual(3, self.s.cssRules.length)
208 self.assertEqual(u'@import "x";\n@x;\na {\n x: 1\n }', self.s.cssText)
209
210 self.s.deleteRule(1)
211 self.assertEqual(2, self.s.cssRules.length)
212 self.assertEqual(u'@import "x";\na {\n x: 1\n }', self.s.cssText)
213
214 self.s.deleteRule(1)
215 self.assertEqual(1, self.s.cssRules.length)
216 self.assertEqual(u'@import "x";', self.s.cssText)
217
243
245 "CSSStyleSheet.insertRule()"
246 s, L = self._gets()
247
248
249 self.assertRaises(xml.dom.IndexSizeErr,
250 s.insertRule, self.sr, -1)
251 self.assertRaises(xml.dom.IndexSizeErr,
252 s.insertRule, self.sr, s.cssRules.length + 1)
253
254 self.assertEqual(L, s.cssRules.length)
255
256
257 s.insertRule('a {}')
258 self.assertEqual(L+1, s.cssRules.length)
259
260 s.insertRule(self.sr)
261 self.assertEqual(L+2, s.cssRules.length)
262
263 s2, L2 = self._gets()
264 rulelist = s2.cssRules
265 del rulelist[:-2]
266 s.insertRule(rulelist)
267 self.assertEqual(L+2 + 2, s.cssRules.length)
268
269 - def _insertRule(self, rules, notbefore, notafter, anywhere):
293
295 "CSSStyleSheet.insertRule(@charset)"
296 s, L = self._gets()
297 notbefore = (self.cr,)
298 notafter = (self.cr, self.ir, self.nr, self.mr, self.pr, self.sr,
299 self.c, self.ur)
300 anywhere = ()
301 self._insertRule((self.cr,),
302 notbefore, notafter, anywhere)
303
305 "CSSStyleSheet.insertRule(@import)"
306 s, L = self._gets()
307 notbefore = (self.cr,)
308 notafter = (self.nr, self.pr, self.mr, self.sr)
309 anywhere = (self.c, self.ur, self.ir)
310 self._insertRule((self.ir,),
311 notbefore, notafter, anywhere)
312
314 "CSSStyleSheet.insertRule(@namespace)"
315 s, L = self._gets()
316 notbefore = (self.cr, self.ir)
317 notafter = (self.pr, self.mr, self.sr)
318 anywhere = (self.c, self.ur, self.nr)
319 self._insertRule((self.nr,), notbefore, notafter, anywhere)
320
322 "CSSStyleSheet.insertRule(@media, @page, stylerule)"
323 s, L = self._gets()
324 notbefore = (self.cr, self.ir, self.nr)
325 notafter = ()
326 anywhere = (self.c, self.ur, self.mr, self.pr, self.sr)
327 self._insertRule((self.pr, self.mr, self.sr),
328 notbefore, notafter, anywhere)
329
339
341 "CSSStyleSheet.replaceUrls()"
342 cssutils.ser.prefs.keepAllProperties = True
343
344 css='''
345 @import "im1";
346 @import url(im2);
347 a {
348 background-image: url(c) !important;
349 background-\image: url(b);
350 background: url(a) no-repeat !important;
351 }'''
352 s = cssutils.parseString(css)
353 s.replaceUrls(lambda old: "NEW" + old)
354 self.assertEqual(u'@import "NEWim1";', s.cssRules[0].cssText)
355 self.assertEqual(u'NEWim2', s.cssRules[1].href)
356 self.assertEqual(u'''background-image: url(NEWc) !important;
357 background-\\image: url(NEWb);
358 background: url(NEWa) no-repeat !important''', s.cssRules[2].style.cssText)
359
360 cssutils.ser.prefs.keepAllProperties = False
361
363 "CSSStyleSheet.__repr__(), .__str__()"
364 href = 'file:foo.css'
365 title = 'title-of-css'
366
367 s = cssutils.css.CSSStyleSheet(href=href, title=title)
368
369 self.assert_(href in str(s))
370 self.assert_(title in str(s))
371
372 s2 = eval(repr(s))
373 self.assert_(isinstance(s2, s.__class__))
374 self.assert_(href == s2.href)
375 self.assert_(title == s2.title)
376
377
378 if __name__ == '__main__':
379 import unittest
380 unittest.main()
381