1
2 """
3 tests for css.CSSStyleSheet
4 """
5 __author__ = '$LastChangedBy: cthedot $'
6 __date__ = '$LastChangedDate: 2007-11-01 22:39:48 +0100 (Do, 01 Nov 2007) $'
7 __version__ = '$LastChangedRevision: 621 $'
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.deleteRule()"
167 self.s.cssText = u'@charset "ascii"; @import "x"; @x; a {\n x: 1\n }@y;'
168 self.assertEqual(5, self.s.cssRules.length)
169
170 self.assertRaises(xml.dom.IndexSizeErr, self.s.deleteRule, 5)
171
172
173
174 r = self.s.cssRules[-1]
175 self.assertEqual(self.s, r.parentStyleSheet)
176 self.s.deleteRule(-1)
177 self.assertEqual(None, r.parentStyleSheet)
178
179 self.assertEqual(4, self.s.cssRules.length)
180 self.assertEqual(
181 u'@charset "ascii";\n@import "x";\n@x;\na {\n x: 1\n }', self.s.cssText)
182
183 self.s.deleteRule(0)
184 self.assertEqual(3, self.s.cssRules.length)
185 self.assertEqual(u'@import "x";\n@x;\na {\n x: 1\n }', self.s.cssText)
186
187 self.s.deleteRule(1)
188 self.assertEqual(2, self.s.cssRules.length)
189 self.assertEqual(u'@import "x";\na {\n x: 1\n }', self.s.cssText)
190
191 self.s.deleteRule(1)
192 self.assertEqual(1, self.s.cssRules.length)
193 self.assertEqual(u'@import "x";', self.s.cssText)
194
220
222 "CSSStyleSheet.insertRule()"
223 s, L = self._gets()
224
225
226 self.assertRaises(xml.dom.IndexSizeErr,
227 s.insertRule, self.sr, -1)
228 self.assertRaises(xml.dom.IndexSizeErr,
229 s.insertRule, self.sr, s.cssRules.length + 1)
230
231 self.assertEqual(L, s.cssRules.length)
232
233 - def _insertRule(self, rules, notbefore, notafter, anywhere):
257
259 "CSSStyleSheet.insertRule(@charset)"
260 s, L = self._gets()
261 notbefore = (self.cr,)
262 notafter = (self.cr, self.ir, self.nr, self.mr, self.pr, self.sr,
263 self.c, self.ur)
264 anywhere = ()
265 self._insertRule((self.cr,),
266 notbefore, notafter, anywhere)
267
269 "CSSStyleSheet.insertRule(@import)"
270 s, L = self._gets()
271 notbefore = (self.cr,)
272 notafter = (self.nr, self.pr, self.mr, self.sr)
273 anywhere = (self.c, self.ur, self.ir)
274 self._insertRule((self.ir,),
275 notbefore, notafter, anywhere)
276
278 "CSSStyleSheet.insertRule(@namespace)"
279 s, L = self._gets()
280 notbefore = (self.cr, self.ir)
281 notafter = (self.pr, self.mr, self.sr)
282 anywhere = (self.c, self.ur, self.nr)
283 self._insertRule((self.nr,), notbefore, notafter, anywhere)
284
286 "CSSStyleSheet.insertRule(@media, @page, stylerule)"
287 s, L = self._gets()
288 notbefore = (self.cr, self.ir, self.nr)
289 notafter = ()
290 anywhere = (self.c, self.ur, self.mr, self.pr, self.sr)
291 self._insertRule((self.pr, self.mr, self.sr),
292 notbefore, notafter, anywhere)
293
303
305 cssutils.ser.prefs.keepAllProperties = True
306
307 css='''
308 @import "im1";
309 @import url(im2);
310 a {
311 background-image: url(c) !important;
312 background-\image: url(b);
313 background: url(a) no-repeat !important;
314 }'''
315 s = cssutils.parseString(css)
316 s.replaceUrls(lambda old: "NEW" + old)
317 self.assertEqual(u'@import "NEWim1";', s.cssRules[0].cssText)
318 self.assertEqual(u'NEWim2', s.cssRules[1].href)
319 self.assertEqual(u'''background-image: url(NEWc) !important;
320 background-\\image: url(NEWb);
321 background: url(NEWa) no-repeat !important''', s.cssRules[2].style.cssText)
322
323 cssutils.ser.prefs.keepAllProperties = False
324
326 "CSSStyleSheet.__repr__(), .__str__()"
327 href = 'file:foo.css'
328 title = 'title-of-css'
329
330 s = cssutils.css.CSSStyleSheet(href=href, title=title)
331
332 self.assert_(href in str(s))
333 self.assert_(title in str(s))
334
335 s2 = eval(repr(s))
336 self.assert_(isinstance(s2, s.__class__))
337 self.assert_(href == s2.href)
338 self.assert_(title == s2.title)
339
340
341 if __name__ == '__main__':
342 import unittest
343 unittest.main()
344