1 """
2 tests for css.CSSStyleSheet
3 """
4 __author__ = '$LastChangedBy: cthedot $'
5 __date__ = '$LastChangedDate: 2007-10-27 21:33:00 +0200 (Sa, 27 Okt 2007) $'
6 __version__ = '$LastChangedRevision: 579 $'
7
8 import xml.dom
9 import basetest
10 import cssutils.css
11
13
19
21 "CSSStyleSheet.__init__()"
22 self.assertEqual(False, self.s._readonly)
23 self.assertEqual([], self.s.cssRules)
24 self.assertEqual('text/css', self.s.type)
25 self.assertEqual(False, self.s.disabled)
26 self.assertEqual(None, self.s.href)
27 self.assertEqual(None, self.s.media)
28 self.assertEqual(None, self.s.ownerNode)
29 self.assertEqual(None, self.s.parentStyleSheet)
30 self.assertEqual(u'', self.s.title)
31
33 "CSSStyleSheet NoModificationAllowedErr"
34 css = cssutils.css.CSSStyleSheet(readonly=True)
35
36 self.assertEqual(True, css._readonly)
37
38 self.assertRaises(xml.dom.NoModificationAllowedErr,
39 css._setCssText, u'@x;')
40 self.assertRaises(xml.dom.NoModificationAllowedErr,
41 css.insertRule, self.rule)
42 self.assertRaises(xml.dom.NoModificationAllowedErr,
43 css.insertRule, self.rule, 0)
44 self.assertRaises(xml.dom.NoModificationAllowedErr,
45 css.deleteRule, 0)
46
48 "CSSStyleSheet.cssText HierarchyRequestErr"
49 tests = {
50
51 u' @charset "utf-8";': xml.dom.HierarchyRequestErr,
52 u'@charset "ascii";@charset "ascii";': xml.dom.HierarchyRequestErr, u'/*c*/@charset "ascii";': xml.dom.HierarchyRequestErr,
53 u'@import "x"; @charset "ascii";': xml.dom.HierarchyRequestErr,
54 u'@namespace a "x"; @charset "ascii";': xml.dom.HierarchyRequestErr,
55 u'@media all {} @charset "ascii";': xml.dom.HierarchyRequestErr,
56 u'@page {} @charset "ascii";': xml.dom.HierarchyRequestErr,
57 u'a {} @charset "ascii";': xml.dom.HierarchyRequestErr,
58
59
60 u'@namespace a "x"; @import "x";': xml.dom.HierarchyRequestErr,
61 u'@media all {} @import "x";': xml.dom.HierarchyRequestErr,
62 u'@page {} @import "x";': xml.dom.HierarchyRequestErr,
63 u'a {} @import "x";': xml.dom.HierarchyRequestErr,
64
65
66 u'@media all {} @namespace a "x";': xml.dom.HierarchyRequestErr,
67 u'@page {} @namespace a "x";': xml.dom.HierarchyRequestErr,
68 u'a {} @namespace a "x";': xml.dom.HierarchyRequestErr,
69 }
70 self.do_raise_r(tests)
71 self.do_raise_p(tests)
72
74 """CSSStyleSheet.cssText SyntaxErr
75
76 for single {, } or ;
77 """
78 tests = {
79 u'{': xml.dom.SyntaxErr,
80 u'}': xml.dom.SyntaxErr,
81 u';': xml.dom.SyntaxErr,
82 u'@charset "ascii";{': xml.dom.SyntaxErr,
83 u'@charset "ascii";}': xml.dom.SyntaxErr,
84 u'@charset "ascii";;': xml.dom.SyntaxErr,
85 }
86 self.do_raise_r(tests)
87 self.do_raise_p(tests)
88
90 "CSSStyleRule (incomplete)"
91 tests = {
92 u'@import "a': u'@import "a";',
93 u'a { x: 1': u'a {\n x: 1\n }',
94 u'a { font-family: "arial sans':
95 u'a {\n font-family: "arial sans"\n }',
96 }
97 self.do_equal_p(tests)
98
99 - def test_cssText(self):
100 "CSSStyleSheet.cssText"
101 tests = {
102 u'': None,
103
104 u'@charset "ascii";\n@import "x";': None,
105 u'@charset "ascii";\n@media all {}': u'@charset "ascii";',
106 u'@charset "ascii";\n@x;': None,
107 u'@charset "ascii";\na {\n x: 1\n }': None,
108
109 u'@x;\n@import "x";': None,
110 u'@import "x";\n@import "y";': None,
111 u'@import "x";\n@media all {}': u'@import "x";',
112 u'@import "x";\n@x;': None,
113 u'@import "x";\na {\n x: 1\n }': None,
114
115 u'@x;\n@namespace a "x";': None,
116 u'@namespace a "x";\n@namespace b "y";': None,
117 u'@import "x";\n@namespace a "x";\n@media all {}': u'@import "x";\n@namespace a "x";',
118 u'@namespace a "x";\n@x;': None,
119 u'@namespace a "x";\na {\n x: 1\n }': None,
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136 }
137 self.do_equal_r(tests)
138 self.do_equal_p(tests)
139
140 s = cssutils.css.CSSStyleSheet()
141 s.cssText = u'''@charset "ascii";@import "x";@namespace a "x";
142 @media all {/*1*/}@page {margin: 0}a {\n x: 1\n }@unknown;/*comment*/'''
143 for r in s.cssRules:
144 self.assertEqual(s, r.parentStyleSheet)
145
163
165 "CSSStyleSheet.deleteRule()"
166 self.s.cssText = u'@charset "ascii"; @import "x"; @x; a {\n x: 1\n }@y;'
167 self.assertEqual(5, self.s.cssRules.length)
168
169 self.assertRaises(xml.dom.IndexSizeErr, self.s.deleteRule, 5)
170
171
172
173 r = self.s.cssRules[-1]
174 self.assertEqual(self.s, r.parentStyleSheet)
175 self.s.deleteRule(-1)
176 self.assertEqual(None, r.parentStyleSheet)
177
178 self.assertEqual(4, self.s.cssRules.length)
179 self.assertEqual(
180 u'@charset "ascii";\n@import "x";\n@x;\na {\n x: 1\n }', self.s.cssText)
181
182 self.s.deleteRule(0)
183 self.assertEqual(3, self.s.cssRules.length)
184 self.assertEqual(u'@import "x";\n@x;\na {\n x: 1\n }', self.s.cssText)
185
186 self.s.deleteRule(1)
187 self.assertEqual(2, self.s.cssRules.length)
188 self.assertEqual(u'@import "x";\na {\n x: 1\n }', self.s.cssText)
189
190 self.s.deleteRule(1)
191 self.assertEqual(1, self.s.cssRules.length)
192 self.assertEqual(u'@import "x";', self.s.cssText)
193
219
221 "CSSStyleSheet.insertRule()"
222 s, L = self._gets()
223
224
225 self.assertRaises(xml.dom.IndexSizeErr,
226 s.insertRule, self.sr, -1)
227 self.assertRaises(xml.dom.IndexSizeErr,
228 s.insertRule, self.sr, s.cssRules.length + 1)
229
230 self.assertEqual(L, s.cssRules.length)
231
232 - def _insertRule(self, rules, notbefore, notafter, anywhere):
256
258 "CSSStyleSheet.insertRule(@charset)"
259 s, L = self._gets()
260 notbefore = (self.cr,)
261 notafter = (self.cr, self.ir, self.nr, self.mr, self.pr, self.sr,
262 self.c, self.ur)
263 anywhere = ()
264 self._insertRule((self.cr,),
265 notbefore, notafter, anywhere)
266
268 "CSSStyleSheet.insertRule(@import)"
269 s, L = self._gets()
270 notbefore = (self.cr,)
271 notafter = (self.nr, self.pr, self.mr, self.sr)
272 anywhere = (self.c, self.ur, self.ir)
273 self._insertRule((self.ir,),
274 notbefore, notafter, anywhere)
275
277 "CSSStyleSheet.insertRule(@namespace)"
278 s, L = self._gets()
279 notbefore = (self.cr, self.ir)
280 notafter = (self.pr, self.mr, self.sr)
281 anywhere = (self.c, self.ur, self.nr)
282 self._insertRule((self.nr,), notbefore, notafter, anywhere)
283
285 "CSSStyleSheet.insertRule(@media, @page, stylerule)"
286 s, L = self._gets()
287 notbefore = (self.cr, self.ir, self.nr)
288 notafter = ()
289 anywhere = (self.c, self.ur, self.mr, self.pr, self.sr)
290 self._insertRule((self.pr, self.mr, self.sr),
291 notbefore, notafter, anywhere)
292
302
304 cssutils.ser.prefs.keepAllProperties = True
305
306 css='''
307 @import "im1";
308 @import url(im2);
309 a {
310 background-image: url(c) !important;
311 background-\image: url(b);
312 background: url(a) no-repeat !important;
313 }'''
314 s = cssutils.parseString(css)
315 s.replaceUrls(lambda old: "NEW" + old)
316 self.assertEqual(u'@import "NEWim1";', s.cssRules[0].cssText)
317 self.assertEqual(u'NEWim2', s.cssRules[1].href)
318 self.assertEqual(u'''background-image: url(NEWc) !important;
319 background-\\image: url(NEWb);
320 background: url(NEWa) no-repeat !important''', s.cssRules[2].style.cssText)
321
322 cssutils.ser.prefs.keepAllProperties = False
323
325 "CSSStyleSheet.__repr__(), .__str__()"
326 href = 'file:foo.css'
327 title = 'title-of-css'
328
329 s = cssutils.css.CSSStyleSheet(href=href, title=title)
330
331 self.assert_(href in str(s))
332 self.assert_(title in str(s))
333
334 s2 = eval(repr(s))
335 self.assert_(isinstance(s2, s.__class__))
336 self.assert_(href == s2.href)
337 self.assert_(title == s2.title)
338
339
340 if __name__ == '__main__':
341 import unittest
342 unittest.main()
343