Package cssutils :: Package tests :: Module test_cssstylesheet
[hide private]
[frames] | no frames]

Source Code for Module cssutils.tests.test_cssstylesheet

  1  """ 
  2  tests for css.CSSStyleSheet 
  3  """ 
  4  __author__ = '$LastChangedBy: doerwalter $' 
  5  __date__ = '$LastChangedDate: 2007-08-02 22:58:23 +0200 (Do, 02 Aug 2007) $' 
  6  __version__ = '0.9.2a2, $LastChangedRevision: 160 $' 
  7   
  8  import xml.dom 
  9   
 10  import basetest 
 11   
 12  import cssutils.css 
 13   
 14   
15 -class CSSStyleSheetTestCase(basetest.BaseTestCase):
16
17 - def setUp(self):
18 super(CSSStyleSheetTestCase, self).setUp() 19 20 self.r = cssutils.css.CSSStyleSheet() # used by basetest 21 self.s = self.r # used here 22 23 self.rule = cssutils.css.CSSStyleRule()
24 25
26 - def test_init(self):
27 "CSSStyleSheet.__init__()" 28 self.assertEqual(False, self.s._readonly) 29 self.assertEqual([], self.s.cssRules) 30 self.assertEqual('text/css', self.s.type) 31 32 self.assertEqual(False, self.s.disabled) 33 self.assertEqual(None, self.s.href) 34 self.assertEqual(None, self.s.media) 35 self.assertEqual(None, self.s.ownerNode) 36 self.assertEqual(None, self.s.parentStyleSheet) 37 self.assertEqual(u'', self.s.title)
38 39
41 "CSSStyleSheet NoModificationAllowedErr" 42 css = cssutils.css.CSSStyleSheet(readonly=True) 43 44 self.assertEqual(True, css._readonly) # internal... 45 46 self.assertRaises(xml.dom.NoModificationAllowedErr, 47 css._setCssText, u'@x;') 48 self.assertRaises(xml.dom.NoModificationAllowedErr, 49 css.insertRule, self.rule) 50 self.assertRaises(xml.dom.NoModificationAllowedErr, 51 css.insertRule, self.rule, 0) 52 self.assertRaises(xml.dom.NoModificationAllowedErr, 53 css.deleteRule, 0)
54 55
57 "CSSStyleSheet.cssText HierarchyRequestErr" 58 tests = { 59 # @charset: only one and always 1st 60 u' @charset "utf-8";': xml.dom.HierarchyRequestErr, 61 u'@charset "ascii";@charset "ascii";': xml.dom.HierarchyRequestErr, 62 u'/*c*/@charset "ascii";': xml.dom.HierarchyRequestErr, 63 u'@import "x"; @charset "ascii";': xml.dom.HierarchyRequestErr, 64 u'@namespace a "x"; @charset "ascii";': xml.dom.HierarchyRequestErr, 65 u'@media all {} @charset "ascii";': xml.dom.HierarchyRequestErr, 66 u'@page {} @charset "ascii";': xml.dom.HierarchyRequestErr, 67 u'a {} @charset "ascii";': xml.dom.HierarchyRequestErr, 68 69 # @import: before @namespace, @media, @page, sr 70 u'@namespace a "x"; @import "x";': xml.dom.HierarchyRequestErr, 71 u'@media all {} @import "x";': xml.dom.HierarchyRequestErr, 72 u'@page {} @import "x";': xml.dom.HierarchyRequestErr, 73 u'a {} @import "x";': xml.dom.HierarchyRequestErr, 74 75 # @namespace: before @media, @page, sr 76 u'@media all {} @namespace a "x";': xml.dom.HierarchyRequestErr, 77 u'@page {} @namespace a "x";': xml.dom.HierarchyRequestErr, 78 u'a {} @namespace a "x";': xml.dom.HierarchyRequestErr, 79 } 80 self.do_raise_r(tests) 81 self.do_raise_p(tests)
82 83
84 - def test_cssText_SyntaxErr(self):
85 """CSSStyleSheet.cssText SyntaxErr 86 87 for single {, } or ; 88 """ 89 tests = { 90 u'{': xml.dom.SyntaxErr, 91 u'}': xml.dom.SyntaxErr, 92 u';': xml.dom.SyntaxErr, 93 u'@charset "ascii";{': xml.dom.SyntaxErr, 94 u'@charset "ascii";}': xml.dom.SyntaxErr, 95 u'@charset "ascii";;': xml.dom.SyntaxErr, 96 } 97 self.do_raise_r(tests) 98 self.do_raise_p(tests)
99 100
101 - def test_cssText(self):
102 "CSSStyleSheet.cssText" 103 tests = { 104 u'': None, 105 # @charset 106 u'@charset "ascii";\n@import "x";': None, 107 u'@charset "ascii";\n@media all {}': u'@charset "ascii";', 108 u'@charset "ascii";\n@x;': None, 109 u'@charset "ascii";\na {}': None, 110 # @import 111 u'@x;\n@import "x";': None, 112 u'@import "x";\n@import "y";': None, 113 u'@import "x";\n@media all {}': u'@import "x";', 114 u'@import "x";\n@x;': None, 115 u'@import "x";\na {}': None, 116 # @namespace 117 u'@x;\n@namespace a "x";': None, 118 u'@namespace a "x";\n@namespace b "y";': None, 119 u'@import "x";\n@namespace a "x";\n@media all {}': u'@import "x";\n@namespace a "x";', 120 u'@namespace a "x";\n@x;': None, 121 u'@namespace a "x";\na {}': None, 122 } 123 self.do_equal_r(tests) 124 self.do_equal_p(tests) 125 126 s = cssutils.css.CSSStyleSheet() 127 s.cssText = u'''@charset "ascii";@import "x";@namespace a "x"; 128 @media all {/*1*/}@page {margin: 0}a {}@unknown;/*comment*/''' 129 for r in s.cssRules: 130 self.assertEqual(s, r.parentStyleSheet)
131 132
133 - def test_deleteRule(self):
134 "CSSStyleSheet.deleteRule()" 135 self.s.cssText = u'@charset "ascii"; @import "x"; @x; a {}@y;' 136 self.assertEqual(5, self.s.cssRules.length) 137 138 self.assertRaises(xml.dom.IndexSizeErr, self.s.deleteRule, 5) 139 140 # end -1 141 # check parentStyleSheet 142 r = self.s.cssRules[-1] 143 self.assertEqual(self.s, r.parentStyleSheet) 144 self.s.deleteRule(-1) 145 self.assertEqual(None, r.parentStyleSheet) 146 147 self.assertEqual(4, self.s.cssRules.length) 148 self.assertEqual( 149 u'@charset "ascii";\n@import "x";\n@x;\na {}', self.s.cssText) 150 # beginning 151 self.s.deleteRule(0) 152 self.assertEqual(3, self.s.cssRules.length) 153 self.assertEqual(u'@import "x";\n@x;\na {}', self.s.cssText) 154 # middle 155 self.s.deleteRule(1) 156 self.assertEqual(2, self.s.cssRules.length) 157 self.assertEqual(u'@import "x";\na {}', self.s.cssText) 158 # end 159 self.s.deleteRule(1) 160 self.assertEqual(1, self.s.cssRules.length) 161 self.assertEqual(u'@import "x";', self.s.cssText)
162 163
164 - def _gets(self):
165 # complete 166 self.cr = cssutils.css.CSSCharsetRule('ascii') 167 self.c = cssutils.css.CSSComment(u'/*c*/') 168 self.ur = cssutils.css.CSSUnknownRule('@x;') 169 self.ir = cssutils.css.CSSImportRule('x') 170 self.nr = cssutils.css.CSSNamespaceRule('uri') 171 self.mr = cssutils.css.CSSMediaRule() 172 self.pr = cssutils.css.CSSPageRule() 173 self.pr.style = u'margin: 0;' 174 self.sr = cssutils.css.CSSStyleRule('a') 175 self.mr.cssText = u'@media all { m {} }' 176 177 s = cssutils.css.CSSStyleSheet() 178 s.insertRule(self.cr) # 0 179 s.insertRule(self.ir) # 1 180 s.insertRule(self.nr) # 2 181 s.insertRule(self.mr) # 3 182 s.insertRule(self.sr) # 4 183 s.insertRule(self.mr) # 5 184 s.insertRule(self.pr) # 6 185 s.insertRule(self.sr) # 7 186 self.assertEqual(u'@charset "ascii";\n@import url(x);\n@namespace "uri";\n@media all {\n m {}\n }\na {}\n@media all {\n m {}\n }\n@page {\n margin: 0\n }\na {}', s.cssText) 187 return s, s.cssRules.length
188 189
190 - def test_insertRule(self):
191 "CSSStyleSheet.insertRule()" 192 s, L = self._gets() 193 194 # INVALID index 195 self.assertRaises(xml.dom.IndexSizeErr, 196 s.insertRule, self.sr, -1) 197 self.assertRaises(xml.dom.IndexSizeErr, 198 s.insertRule, self.sr, s.cssRules.length + 1) 199 # check if rule is really not in 200 self.assertEqual(L, s.cssRules.length)
201 202
203 - def _insertRule(self, rules, notbefore, notafter, anywhere):
204 """ 205 helper 206 test if any rule in rules cannot be inserted before rules in before 207 or after rules in after but before and after rules in anywhere 208 """ 209 for rule in rules: 210 for r in notbefore: 211 s = cssutils.css.CSSStyleSheet() 212 s.insertRule(r) 213 self.assertRaises(xml.dom.HierarchyRequestErr, 214 s.insertRule, rule, 0) 215 for r in notafter: 216 s = cssutils.css.CSSStyleSheet() 217 s.insertRule(r) 218 self.assertRaises(xml.dom.HierarchyRequestErr, 219 s.insertRule, rule, 1) 220 for r in anywhere: 221 s = cssutils.css.CSSStyleSheet() 222 s.insertRule(r) 223 s.insertRule(rule, 0) # before 224 s.insertRule(rule) # after 225 self.assertEqual(s.cssRules.length, 3) 226 self.assertEqual(s, r.parentStyleSheet)
227
228 - def test_insertRule_charset(self):
229 "CSSStyleSheet.insertRule(@charset)" 230 s, L = self._gets() 231 notbefore = (self.cr,) 232 notafter = (self.cr, self.ir, self.nr, self.mr, self.pr, self.sr, 233 self.c, self.ur) 234 anywhere = () 235 self._insertRule((self.cr,), 236 notbefore, notafter, anywhere)
237
238 - def test_insertRule_import(self):
239 "CSSStyleSheet.insertRule(@import)" 240 s, L = self._gets() 241 notbefore = (self.cr,) 242 notafter = (self.nr, self.pr, self.mr, self.sr) 243 anywhere = (self.c, self.ur, self.ir) 244 self._insertRule((self.ir,), 245 notbefore, notafter, anywhere)
246
248 "CSSStyleSheet.insertRule(@namespace)" 249 s, L = self._gets() 250 notbefore = (self.cr, self.ir) 251 notafter = (self.pr, self.mr, self.sr) 252 anywhere = (self.c, self.ur, self.nr) 253 self._insertRule((self.nr,), notbefore, notafter, anywhere)
254
256 "CSSStyleSheet.insertRule(@media, @page, stylerule)" 257 s, L = self._gets() 258 notbefore = (self.cr, self.ir, self.nr) 259 notafter = () 260 anywhere = (self.c, self.ur, self.mr, self.pr, self.sr) 261 self._insertRule((self.pr, self.mr, self.sr), 262 notbefore, notafter, anywhere)
263
265 "CSSStyleSheet.insertRule(@ unknown, comment)" 266 s, L = self._gets() 267 notbefore = (self.cr,) 268 notafter = () 269 anywhere = (self.c, self.ur, self.ir, self.nr, self.mr, self.pr, 270 self.sr) 271 self._insertRule((self.ur,), 272 notbefore, notafter, anywhere)
273 274 275 if __name__ == '__main__': 276 import unittest 277 unittest.main() 278