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

Source Code for Module cssutils.tests.test_serialize

  1  # -*- coding: utf-8 -*- 
  2  """testcases for cssutils.CSSSerializer 
  3  """ 
  4  __author__ = '$LastChangedBy: cthedot $' 
  5  __date__ = '$LastChangedDate: 2008-02-02 23:53:54 +0100 (Sa, 02 Feb 2008) $' 
  6  __version__ = '$LastChangedRevision: 975 $' 
  7   
  8  import basetest 
  9  import cssutils 
 10   
11 -class CSSSerializerTestCase(basetest.BaseTestCase):
12 """ 13 testcases for cssutils.CSSSerializer 14 """ 15 # def test_init(self): 16 # "CSSSerializer.__init__()" 17
18 - def test_useDefaults(self):
19 "Preferences.useDefaults()" 20 cssutils.ser.prefs.useMinified() 21 cssutils.ser.prefs.useDefaults() 22 self.assertEqual(cssutils.ser.prefs.defaultAtKeyword, True) 23 self.assertEqual(cssutils.ser.prefs.defaultPropertyName, True) 24 self.assertEqual(cssutils.ser.prefs.defaultPropertyPriority, True) 25 self.assertEqual(cssutils.ser.prefs.importHrefFormat, None) 26 self.assertEqual(cssutils.ser.prefs.indent, 4 * u' ') 27 self.assertEqual(cssutils.ser.prefs.keepAllProperties, True) 28 self.assertEqual(cssutils.ser.prefs.keepComments, True) 29 self.assertEqual(cssutils.ser.prefs.keepEmptyRules, False) 30 self.assertEqual(cssutils.ser.prefs.keepUsedNamespaceRulesOnly, False) 31 self.assertEqual(cssutils.ser.prefs.lineNumbers, False) 32 self.assertEqual(cssutils.ser.prefs.lineSeparator, u'\n') 33 self.assertEqual(cssutils.ser.prefs.listItemSpacer, u' ') 34 self.assertEqual(cssutils.ser.prefs.omitLastSemicolon, True) 35 self.assertEqual(cssutils.ser.prefs.paranthesisSpacer, u' ') 36 self.assertEqual(cssutils.ser.prefs.propertyNameSpacer, u' ') 37 self.assertEqual(cssutils.ser.prefs.selectorCombinatorSpacer, u' ') 38 self.assertEqual(cssutils.ser.prefs.validOnly, False) 39 self.assertEqual(cssutils.ser.prefs.wellformedOnly, True) 40 # DEPRECATED 41 self.assertEqual(cssutils.ser.prefs.removeInvalid, True) 42 css = u''' 43 /*1*/ 44 @import url(x) tv , print; 45 @namespace prefix "uri"; 46 @namespace unused "unused"; 47 @media all {} 48 @media all { 49 a {} 50 } 51 @media all { 52 a { color: red; } 53 } 54 @page { left: 0; } 55 a {} 56 prefix|x, a + b > c ~ d , b { top : 1px ; 57 font-family : arial ,'some' 58 } 59 ''' 60 parsedcss = u'''/*1*/ 61 @import url(x) tv, print; 62 @namespace prefix "uri"; 63 @namespace unused "unused"; 64 @media all { 65 a { 66 color: red 67 } 68 } 69 @page { 70 left: 0 71 } 72 prefix|x, a + b > c ~ d, b { 73 top: 1px; 74 font-family: arial, 'some' 75 }''' 76 s = cssutils.parseString(css) 77 self.assertEqual(s.cssText, parsedcss)
78
79 - def test_useMinified(self):
80 "Preferences.useMinified()" 81 cssutils.ser.prefs.useDefaults() 82 cssutils.ser.prefs.useMinified() 83 self.assertEqual(cssutils.ser.prefs.defaultAtKeyword, True) 84 self.assertEqual(cssutils.ser.prefs.defaultPropertyName, True) 85 self.assertEqual(cssutils.ser.prefs.importHrefFormat, 'string') 86 self.assertEqual(cssutils.ser.prefs.indent, u'') 87 self.assertEqual(cssutils.ser.prefs.keepAllProperties, True) 88 self.assertEqual(cssutils.ser.prefs.keepComments, False) 89 self.assertEqual(cssutils.ser.prefs.keepEmptyRules, False) 90 self.assertEqual(cssutils.ser.prefs.keepUsedNamespaceRulesOnly, True) 91 self.assertEqual(cssutils.ser.prefs.lineNumbers, False) 92 self.assertEqual(cssutils.ser.prefs.lineSeparator, u'') 93 self.assertEqual(cssutils.ser.prefs.listItemSpacer, u'') 94 self.assertEqual(cssutils.ser.prefs.omitLastSemicolon, True) 95 self.assertEqual(cssutils.ser.prefs.paranthesisSpacer, u'') 96 self.assertEqual(cssutils.ser.prefs.propertyNameSpacer, u'') 97 self.assertEqual(cssutils.ser.prefs.selectorCombinatorSpacer, u'') 98 self.assertEqual(cssutils.ser.prefs.validOnly, False) 99 self.assertEqual(cssutils.ser.prefs.wellformedOnly, True) 100 # DEPRECATED 101 self.assertEqual(cssutils.ser.prefs.removeInvalid, True) 102 103 css = u''' 104 /*1*/ 105 @import url(x) tv , print; 106 @namespace prefix "uri"; 107 @namespace unused "unused"; 108 @media all {} 109 @media all { 110 a {} 111 } 112 @media all { 113 a { color: red; } 114 } 115 @page {} 116 a {} 117 prefix|x, a + b > c ~ d , b { top : 1px ; 118 font-family : arial , 'some' 119 } 120 ''' 121 s = cssutils.parseString(css) 122 self.assertEqual(s.cssText, 123 u'''@import "x" tv,print;@namespace prefix "uri";@media all{a{color:red}}prefix|x,a+b>c~d,b{top:1px;font-family:arial,'some'}''' 124 )
125
126 - def test_defaultAtKeyword(self):
127 "Preferences.defaultAtKeyword" 128 cssutils.ser.prefs.useDefaults() 129 130 s = cssutils.parseString(u'@im\\port "x";') 131 self.assertEqual(u'@import "x";', s.cssText) 132 cssutils.ser.prefs.defaultAtKeyword = True 133 self.assertEqual(u'@import "x";', s.cssText) 134 cssutils.ser.prefs.defaultAtKeyword = False 135 self.assertEqual(u'@im\\port "x";', s.cssText)
136
137 - def test_defaultPropertyName(self):
138 "Preferences.defaultPropertyName" 139 cssutils.ser.prefs.useDefaults() 140 cssutils.ser.prefs.keepAllProperties = False 141 142 # does not actually work as once the name is set it is used also 143 # if used with a backslash in it later... 144 145 s = cssutils.parseString(ur'a { c\olor: green; }') 146 self.assertEqual(u'a {\n color: green\n }', s.cssText) 147 cssutils.ser.prefs.defaultPropertyName = True 148 self.assertEqual(u'a {\n color: green\n }', s.cssText) 149 cssutils.ser.prefs.defaultPropertyName = False 150 self.assertEqual(u'a {\n c\\olor: green\n }', s.cssText) 151 152 s = cssutils.parseString(u'a { color: red; c\olor: green; }') 153 self.assertEqual(u'a {\n c\\olor: green\n }', s.cssText) 154 cssutils.ser.prefs.defaultPropertyName = False 155 self.assertEqual(u'a {\n c\\olor: green\n }', s.cssText) 156 cssutils.ser.prefs.defaultPropertyName = True 157 self.assertEqual(u'a {\n color: green\n }', s.cssText)
158
160 "Preferences.defaultPropertyPriority" 161 cssutils.ser.prefs.useDefaults() 162 css = u'''a {\n color: green !IM\\portant\n }''' 163 s = cssutils.parseString(css) 164 self.assertEqual(s.cssText, 165 u'''a {\n color: green !important\n }''') 166 cssutils.ser.prefs.defaultPropertyPriority = False 167 self.assertEqual(s.cssText, css)
168
169 - def test_importHrefFormat(self):
170 "Preferences.importHrefFormat" 171 cssutils.ser.prefs.useDefaults() 172 173 r0 = cssutils.css.CSSImportRule(u'not') 174 r1 = cssutils.css.CSSImportRule(u'str', hreftype="string") 175 r2 = cssutils.css.CSSImportRule(u'uri', hreftype="uri") 176 self.assertEqual(u'@import url(not);', r0.cssText) 177 self.assertEqual(u'@import "str";', r1.cssText) 178 self.assertEqual(u'@import url(uri);', r2.cssText) 179 180 cssutils.ser.prefs.importHrefFormat = 'string' 181 self.assertEqual(u'@import "not";', r0.cssText) 182 self.assertEqual(u'@import "str";', r1.cssText) 183 self.assertEqual(u'@import "uri";', r2.cssText) 184 185 cssutils.ser.prefs.importHrefFormat = 'uri' 186 self.assertEqual(u'@import url(not);', r0.cssText) 187 self.assertEqual(u'@import url(str);', r1.cssText) 188 self.assertEqual(u'@import url(uri);', r2.cssText) 189 190 cssutils.ser.prefs.importHrefFormat = 'not defined' 191 self.assertEqual(u'@import url(not);', r0.cssText) 192 self.assertEqual(u'@import "str";', r1.cssText) 193 self.assertEqual(u'@import url(uri);', r2.cssText)
194
195 - def test_indent(self):
196 "Preferences.ident" 197 cssutils.ser.prefs.useDefaults() 198 199 s = cssutils.parseString(u'a { left: 0 }') 200 exp4 = u'''a { 201 left: 0 202 }''' 203 exp1 = u'''a { 204 left: 0 205 }''' 206 cssutils.ser.prefs.indent = ' ' 207 self.assertEqual(exp1, s.cssText) 208 cssutils.ser.prefs.indent = 4* ' ' 209 self.assertEqual(exp4, s.cssText)
210
211 - def test_keepAllProperties(self):
212 "Preferences.keepAllProperties" 213 cssutils.ser.prefs.useDefaults() 214 215 css = '''a { 216 color: pink; 217 color: red; 218 c\olor: blue; 219 c\olor: green; 220 }''' 221 s = cssutils.parseString(css) 222 # keep only last 223 cssutils.ser.prefs.keepAllProperties = False 224 self.assertEqual(u'a {\n color: green\n }', s.cssText) 225 # keep all 226 cssutils.ser.prefs.keepAllProperties = True 227 self.assertEqual(u'a {\n color: pink;\n color: red;\n c\olor: blue;\n c\olor: green\n }', s.cssText)
228
229 - def test_keepComments(self):
230 "Preferences.keepComments" 231 cssutils.ser.prefs.useDefaults() 232 233 s = cssutils.parseString('/*1*/ a { /*2*/ }') 234 cssutils.ser.prefs.keepComments = False 235 self.assertEqual('', s.cssText) 236 cssutils.ser.prefs.keepEmptyRules = True 237 self.assertEqual('a {}', s.cssText)
238
239 - def test_keepEmptyRules(self):
240 "Preferences.keepEmptyRules" 241 # CSSStyleRule 242 css = u'''a {} 243 a { 244 /*1*/ 245 } 246 a { 247 color: red 248 }''' 249 s = cssutils.parseString(css) 250 cssutils.ser.prefs.useDefaults() 251 cssutils.ser.prefs.keepEmptyRules = True 252 self.assertEqual(css, s.cssText) 253 cssutils.ser.prefs.keepEmptyRules = False 254 self.assertEqual(u'a {\n /*1*/\n }\na {\n color: red\n }', 255 s.cssText) 256 cssutils.ser.prefs.keepComments = False 257 self.assertEqual(u'a {\n color: red\n }', 258 s.cssText) 259 260 # CSSMediaRule 261 css = u'''@media tv { 262 } 263 @media all { 264 /*1*/ 265 } 266 @media print { 267 a {} 268 } 269 @media print { 270 a { 271 /*1*/ 272 } 273 } 274 @media all { 275 a { 276 color: red 277 } 278 }''' 279 s = cssutils.parseString(css) 280 cssutils.ser.prefs.useDefaults() 281 cssutils.ser.prefs.keepEmptyRules = True 282 # self.assertEqual(css, s.cssText) 283 cssutils.ser.prefs.keepEmptyRules = False 284 self.assertEqual('''@media all { 285 /*1*/ 286 } 287 @media print { 288 a { 289 /*1*/ 290 } 291 } 292 @media all { 293 a { 294 color: red 295 } 296 }''', s.cssText) 297 cssutils.ser.prefs.keepComments = False 298 self.assertEqual('''@media all { 299 a { 300 color: red 301 } 302 }''', s.cssText)
303
305 "Preferences.keepUsedNamespaceRulesOnly" 306 cssutils.ser.prefs.useDefaults() 307 tests = { 308 # default == prefix => both are combined 309 '@namespace p "u"; @namespace "u"; p|a, a {top: 0}': 310 ('@namespace "u";\n|a, |a {\n top: 0\n }', 311 '@namespace "u";\n|a, |a {\n top: 0\n }'), 312 '@namespace "u"; @namespace p "u"; p|a, a {top: 0}': 313 ('@namespace p "u";\np|a, p|a {\n top: 0\n }', 314 '@namespace p "u";\np|a, p|a {\n top: 0\n }'), 315 # default and prefix 316 '@namespace p "u"; @namespace "d"; p|a, a {top: 0}': 317 ('@namespace p "u";\n@namespace "d";\np|a, |a {\n top: 0\n }', 318 '@namespace p "u";\n@namespace "d";\np|a, |a {\n top: 0\n }'), 319 # prefix only 320 '@namespace p "u"; @namespace "d"; p|a {top: 0}': 321 ('@namespace p "u";\n@namespace "d";\np|a {\n top: 0\n }', 322 '@namespace p "u";\np|a {\n top: 0\n }'), 323 # default only 324 '@namespace p "u"; @namespace "d"; a {top: 0}': 325 ('@namespace p "u";\n@namespace "d";\n|a {\n top: 0\n }', 326 '@namespace "d";\n|a {\n top: 0\n }'), 327 # prefix-ns only 328 '@namespace p "u"; @namespace d "d"; p|a {top: 0}': 329 ('@namespace p "u";\n@namespace d "d";\np|a {\n top: 0\n }', 330 '@namespace p "u";\np|a {\n top: 0\n }'), 331 } 332 for test in tests: 333 s = cssutils.parseString(test) 334 expwith, expwithout = tests[test] 335 cssutils.ser.prefs.keepUsedNamespaceRulesOnly = False 336 self.assertEqual(s.cssText, expwith) 337 cssutils.ser.prefs.keepUsedNamespaceRulesOnly = True 338 self.assertEqual(s.cssText, expwithout)
339 340
341 - def test_lineNumbers(self):
342 "Preferences.lineNumbers" 343 cssutils.ser.prefs.useDefaults() 344 345 s = cssutils.parseString('a {top: 1; left: 2}') 346 exp0 = '''a { 347 top: 1; 348 left: 2 349 }''' 350 exp1 = '''1: a { 351 2: top: 1; 352 3: left: 2 353 4: }''' 354 self.assertEqual(False, cssutils.ser.prefs.lineNumbers) 355 self.assertEqual(exp0, s.cssText) 356 cssutils.ser.prefs.lineNumbers = True 357 self.assertEqual(True, cssutils.ser.prefs.lineNumbers) 358 self.assertEqual(exp1, s.cssText)
359
360 - def test_lineSeparator(self):
361 "Preferences.lineSeparator" 362 cssutils.ser.prefs.useDefaults() 363 364 s = cssutils.parseString('a { x:1;y:2}') 365 self.assertEqual('a {\n x: 1;\n y: 2\n }', s.cssText) 366 # cannot be indented as no split possible 367 cssutils.ser.prefs.lineSeparator = u'' 368 self.assertEqual('a {x: 1;y: 2 }', s.cssText) 369 # no valid css but should work 370 cssutils.ser.prefs.lineSeparator = u'XXX' 371 self.assertEqual('a {XXX x: 1;XXX y: 2XXX }', s.cssText)
372
373 - def test_listItemSpacer(self):
374 "Preferences.listItemSpacer" 375 cssutils.ser.prefs.useDefaults() 376 cssutils.ser.prefs.keepEmptyRules = True 377 378 css = ''' 379 @import "x" print, tv; 380 a, b {}''' 381 s = cssutils.parseString(css) 382 self.assertEqual(u'@import "x" print, tv;\na, b {}', s.cssText) 383 cssutils.ser.prefs.listItemSpacer = u'' 384 self.assertEqual(u'@import "x" print,tv;\na,b {}', s.cssText)
385
386 - def test_omitLastSemicolon(self):
387 "Preferences.omitLastSemicolon" 388 cssutils.ser.prefs.useDefaults() 389 390 css = 'a { x: 1; y: 2 }' 391 s = cssutils.parseString(css) 392 self.assertEqual(u'a {\n x: 1;\n y: 2\n }', s.cssText) 393 cssutils.ser.prefs.omitLastSemicolon = False 394 self.assertEqual(u'a {\n x: 1;\n y: 2;\n }', s.cssText)
395
396 - def test_paranthesisSpacer(self):
397 "Preferences.paranthesisSpacer" 398 cssutils.ser.prefs.useDefaults() 399 css = 'a { x: 1; y: 2 }' 400 s = cssutils.parseString(css) 401 self.assertEqual(u'a {\n x: 1;\n y: 2\n }', s.cssText) 402 cssutils.ser.prefs.paranthesisSpacer = u'' 403 self.assertEqual(u'a{\n x: 1;\n y: 2\n }', s.cssText)
404
405 - def test_propertyNameSpacer(self):
406 "Preferences.propertyNameSpacer" 407 cssutils.ser.prefs.useDefaults() 408 css = 'a { x: 1; y: 2 }' 409 s = cssutils.parseString(css) 410 self.assertEqual(u'a {\n x: 1;\n y: 2\n }', s.cssText) 411 cssutils.ser.prefs.propertyNameSpacer = u'' 412 self.assertEqual(u'a {\n x:1;\n y:2\n }', s.cssText)
413
415 "Preferences.selectorCombinatorSpacer" 416 cssutils.ser.prefs.useDefaults() 417 s = cssutils.css.Selector(selectorText='a+b>c~d e') 418 self.assertEqual(u'a + b > c ~ d e', s.selectorText) 419 cssutils.ser.prefs.selectorCombinatorSpacer = u'' 420 self.assertEqual(u'a+b>c~d e', s.selectorText)
421
422 - def test_CSSStyleSheet(self):
423 "CSSSerializer.do_CSSStyleSheet" 424 css = u'/* κουρος */' 425 sheet = cssutils.parseString(css) 426 self.assertEqual(css, unicode(sheet.cssText, 'utf-8')) 427 428 css = u'@charset "utf-8";\n/* κουρος */' 429 sheet = cssutils.parseString(css) 430 self.assertEqual(css, unicode(sheet.cssText, 'utf-8')) 431 sheet.cssRules[0].encoding = 'ascii' 432 self.assertEqual('@charset "ascii";\n/* \\3BA \\3BF \\3C5 \\3C1 \\3BF \\3C2 */', 433 sheet.cssText)
434
435 - def test_Property(self):
436 "CSSSerializer.do_Property" 437 cssutils.ser.prefs.useDefaults() 438 439 name="color" 440 value="red" 441 priority="!important" 442 443 s = cssutils.css.property.Property( 444 name=name, value=value, priority=priority) 445 self.assertEqual(u'color: red !important', 446 cssutils.ser.do_Property(s)) 447 448 s = cssutils.css.property.Property( 449 name=name, value=value) 450 self.assertEqual(u'color: red', 451 cssutils.ser.do_Property(s))
452
453 - def test_escapeSTRINGtype(self):
454 "CSSSerializer._escapeSTRINGtype" 455 css = ur'''@import url("ABC\a"); 456 @import "ABC\a"; 457 @import 'ABC\a'; 458 a[href='"\a\22\27"'] { 459 a: "\a\d\c"; 460 b: "\a \d \c "; 461 c: "\""; 462 d: "\22"; 463 e: '\''; 464 content: '\27'; 465 }''' 466 exp = ur'''@import url("ABC\a "); 467 @import "ABC\a "; 468 @import "ABC\a "; 469 a[href='"\a "\'"'] { 470 a: "\a \d \c "; 471 b: "\a \d \c "; 472 c: "\""; 473 d: "\""; 474 e: '\''; 475 content: '\'' 476 }''' 477 sheet = cssutils.parseString(css) 478 self.assertEqual(sheet.cssText, exp)
479 480 481 if __name__ == '__main__': 482 import unittest 483 unittest.main() 484