%PDF- %PDF-
Direktori : /lib/python3/dist-packages/cssutils/tests/ |
Current File : //lib/python3/dist-packages/cssutils/tests/test_cssstyledeclaration.py |
"""Testcases for cssutils.css.cssstyledelaration.CSSStyleDeclaration.""" import xml.dom from . import basetest import cssutils class CSSStyleDeclarationTestCase(basetest.BaseTestCase): def setUp(self): self.r = cssutils.css.CSSStyleDeclaration() def test_init(self): "CSSStyleDeclaration.__init__()" s = cssutils.css.CSSStyleDeclaration() self.assertEqual('', s.cssText) self.assertEqual(0, s.length) self.assertEqual(None, s.parentRule) s = cssutils.css.CSSStyleDeclaration(cssText='left: 0') self.assertEqual('left: 0', s.cssText) self.assertEqual('0', s.getPropertyValue('left')) sheet = cssutils.css.CSSStyleRule() s = cssutils.css.CSSStyleDeclaration(parentRule=sheet) self.assertEqual(sheet, s.parentRule) # should not be used but ordered parameter test s = cssutils.css.CSSStyleDeclaration('top: 0', sheet) self.assertEqual('top: 0', s.cssText) self.assertEqual(sheet, s.parentRule) def test_items(self): "CSSStyleDeclaration[CSSName]" s = cssutils.css.CSSStyleDeclaration() name, value, priority = 'color', 'name', '' s[name] = value self.assertEqual(value, s[name]) self.assertEqual(value, s.__getattribute__(name)) self.assertEqual(value, s.getProperty(name).value) self.assertEqual(priority, s.getProperty(name).priority) name, value, priority = 'UnKnown-ProPERTY', 'unknown value', 'important' s[name] = (value, priority) self.assertEqual(value, s[name]) self.assertEqual(value, s[name.lower()]) # will be normalized self.assertRaises(AttributeError, s.__getattribute__, name) self.assertEqual(value, s.getProperty(name).value) self.assertEqual(priority, s.getProperty(name).priority) name, value, priority = 'item', '1', '' s[name] = value self.assertEqual(value, s[name]) self.assertEqual(value, s.getProperty(name).value) self.assertEqual(priority, s.getProperty(name).priority) del s[name] self.assertEqual('', s[name]) self.assertEqual('', s['never set']) def test__contains__(self): "CSSStyleDeclaration.__contains__(nameOrProperty)" s = cssutils.css.CSSStyleDeclaration(cssText=r'x: 1;\y: 2') for test in ('x', r'x', 'y', r'y'): self.assertTrue(test in s) self.assertTrue(test.upper() in s) self.assertTrue(cssutils.css.Property(test, '1') in s) self.assertTrue('z' not in s) self.assertTrue(cssutils.css.Property('z', '1') not in s) def test__iter__item(self): "CSSStyleDeclaration.__iter__ and .item" s = cssutils.css.CSSStyleDeclaration() s.cssText = r''' color: red; c\olor: blue; CO\lor: green; left: 1px !important; left: 0; border: 0; ''' # __iter__ ps = [] for p in s: ps.append((p.literalname, p.value, p.priority)) self.assertEqual(len(ps), 3) self.assertEqual(ps[0], (r'co\lor', 'green', '')) self.assertEqual(ps[1], (r'left', '1px', 'important')) self.assertEqual(ps[2], (r'border', '0', '')) # item self.assertEqual(s.length, 3) self.assertEqual(s.item(0), 'color') self.assertEqual(s.item(1), 'left') self.assertEqual(s.item(2), 'border') self.assertEqual(s.item(10), '') def test_keys(self): "CSSStyleDeclaration.keys()" s = cssutils.parseStyle('x:1; x:2; y:1') self.assertEqual(['x', 'y'], list(s.keys())) self.assertEqual(s['x'], '2') self.assertEqual(s['y'], '1') def test_parse(self): "CSSStyleDeclaration parse" # error but parse tests = { # property names are caseinsensitive 'TOP:0': 'top: 0', 'top:0': 'top: 0', # simple escape 'c\\olor: red; color:green': 'color: green', 'color:g\\reen': 'color: g\\reen', # http://www.w3.org/TR/2009/CR-CSS2-20090423/syndata.html#illegalvalues 'color:green': 'color: green', 'color:green; color': 'color: green', 'color:red; color; color:green': 'color: green', 'color:green; color:': 'color: green', 'color:red; color:; color:green': 'color: green', 'color:green; color{;color:maroon}': 'color: green', 'color:red; color{;color:maroon}; color:green': 'color: green', # tantek hack r'''color: red; voice-family: "\"}\""; voice-family:inherit; color: green;''': 'voice-family: inherit;\ncolor: green', r'''col\or: blue; font-family: 'Courier New Times color: red; color: green;''': 'color: green', # special IE hacks are not preserved anymore (>=0.9.5b3) '/color: red; color: green': 'color: green', '/ color: red; color: green': 'color: green', '1px: red; color: green': 'color: green', '0: red; color: green': 'color: green', '1px:: red; color: green': 'color: green', r'$top: 0': '', r'$: 0': '', # really invalid! # unknown rule but valid '@x;\ncolor: red': None, '@x {\n }\ncolor: red': None, '/**/\ncolor: red': None, '/**/\ncolor: red;\n/**/': None, #issue #28 ';color: red': 'color: red', ';;color: red;;': 'color: red' } cssutils.ser.prefs.keepAllProperties = False for test, exp in list(tests.items()): sh = cssutils.parseString('a { %s }' % test) if exp is None: exp = '%s' % test elif exp != '': exp = '%s' % exp self.assertEqual(exp, sh.cssRules[0].style.cssText) cssutils.ser.prefs.useDefaults() def test_serialize(self): "CSSStyleDeclaration serialize" s = cssutils.css.CSSStyleDeclaration() tests = { 'a:1 !important; a:2;b:1': ('a: 1 !important;\nb: 1', 'a: 1 !important;\na: 2;\nb: 1') } for test, exp in list(tests.items()): s.cssText = test cssutils.ser.prefs.keepAllProperties = False self.assertEqual(exp[0], s.cssText) cssutils.ser.prefs.keepAllProperties = True self.assertEqual(exp[1], s.cssText) cssutils.ser.prefs.useDefaults() def test_children(self): "CSSStyleDeclaration.children()" style = '/*1*/color: red; color: green; @x;' types = [ cssutils.css.CSSComment, cssutils.css.Property, cssutils.css.Property, cssutils.css.CSSUnknownRule ] def t(s): for i, x in enumerate(s.children()): self.assertEqual(types[i], type(x)) self.assertEqual(x.parent, s) t(cssutils.parseStyle(style)) t(cssutils.parseString('a {'+style+'}').cssRules[0].style) t(cssutils.parseString('@media all {a {'+style+'}}').cssRules[0].cssRules[0].style) s = cssutils.parseStyle(style) s['x'] = '0' self.assertEqual(s, s.getProperty('x').parent) s.setProperty('y', '1') self.assertEqual(s, s.getProperty('y').parent) def test_cssText(self): "CSSStyleDeclaration.cssText" # empty s = cssutils.css.CSSStyleDeclaration() tests = { '': '', ' ': '', ' \t \n ': '', '/*x*/': '/*x*/' } for test, exp in list(tests.items()): s.cssText = 'left: 0;' # dummy to reset s s.cssText = test self.assertEqual(exp, s.cssText) # normal s = cssutils.css.CSSStyleDeclaration() tests = { ';': '', 'left: 0': 'left: 0', 'left:0': 'left: 0', ' left : 0 ': 'left: 0', 'left: 0;': 'left: 0', 'left: 0 !important ': 'left: 0 !important', 'left:0!important': 'left: 0 !important', 'left: 0; top: 1': 'left: 0;\ntop: 1', # comments # TODO: spaces? '/*1*//*2*/left/*3*//*4*/:/*5*//*6*/0/*7*//*8*/!/*9*//*a*/important/*b*//*c*/;': '/*1*/\n/*2*/\nleft/*3*//*4*/: /*5*/ /*6*/ 0 /*7*/ /*8*/ !/*9*//*a*/important/*b*//*c*/', '/*1*/left: 0;/*2*/ top: 1/*3*/': '/*1*/\nleft: 0;\n/*2*/\ntop: 1 /*3*/', 'left:0; top:1;': 'left: 0;\ntop: 1', '/*1*/left: 0;/*2*/ top: 1;/*3*/': '/*1*/\nleft: 0;\n/*2*/\ntop: 1;\n/*3*/', # WS 'left:0!important;margin:1px 2px 3px 4px!important;': 'left: 0 !important;\nmargin: 1px 2px 3px 4px !important', '\n\r\f\t left\n\r\f\t :\n\r\f\t 0\n\r\f\t !\n\r\f\t important\n\r\f\t ;\n\r\f\t margin\n\r\f\t :\n\r\f\t 1px\n\r\f\t 2px\n\r\f\t 3px\n\r\f\t 4px;': 'left: 0 !important;\nmargin: 1px 2px 3px 4px', } for test, exp in list(tests.items()): s.cssText = test self.assertEqual(exp, s.cssText) # exception tests = { 'color: #xyz': xml.dom.SyntaxErr, 'top': xml.dom.SyntaxErr, 'top:': xml.dom.SyntaxErr, 'top : ': xml.dom.SyntaxErr, 'top:!important': xml.dom.SyntaxErr, 'top:!important;': xml.dom.SyntaxErr, 'top:;': xml.dom.SyntaxErr, 'top 0': xml.dom.SyntaxErr, 'top 0;': xml.dom.SyntaxErr, ':': xml.dom.SyntaxErr, ':0': xml.dom.SyntaxErr, ':0;': xml.dom.SyntaxErr, ':0!important': xml.dom.SyntaxErr, ':;': xml.dom.SyntaxErr, ': ;': xml.dom.SyntaxErr, ':!important;': xml.dom.SyntaxErr, ': !important;': xml.dom.SyntaxErr, '0': xml.dom.SyntaxErr, '0!important': xml.dom.SyntaxErr, '0!important;': xml.dom.SyntaxErr, '0;': xml.dom.SyntaxErr, '!important': xml.dom.SyntaxErr, '!important;': xml.dom.SyntaxErr, } self.do_raise_r(tests) def test_getCssText(self): "CSSStyleDeclaration.getCssText(separator)" s = cssutils.css.CSSStyleDeclaration(cssText='a:1;b:2') self.assertEqual('a: 1;\nb: 2', s.getCssText()) self.assertEqual('a: 1;b: 2', s.getCssText(separator='')) self.assertEqual('a: 1;/*x*/b: 2', s.getCssText(separator='/*x*/')) def test_parentRule(self): "CSSStyleDeclaration.parentRule" s = cssutils.css.CSSStyleDeclaration() sheet = cssutils.css.CSSStyleRule() s.parentRule = sheet self.assertEqual(sheet, s.parentRule) sheet = cssutils.parseString('a{x:1}') s = sheet.cssRules[0] d = s.style self.assertEqual(s, d.parentRule) s = cssutils.parseString(''' @font-face { font-weight: bold; } a { font-weight: bolder; } @page { font-weight: bolder; } ''') for r in s: self.assertEqual(r.style.parentRule, r) def test_getProperty(self): "CSSStyleDeclaration.getProperty" s = cssutils.css.CSSStyleDeclaration() P = cssutils.css.Property s.cssText = r''' color: red; c\olor: blue; CO\lor: green; left: 1px !important; left: 0; border: 0; ''' self.assertEqual(s.getProperty('color').cssText, r'co\lor: green') self.assertEqual(s.getProperty(r'COLO\r').cssText, r'co\lor: green') self.assertEqual(s.getProperty('left').cssText, r'left: 1px !important') self.assertEqual(s.getProperty('border').cssText, r'border: 0') def test_getProperties(self): "CSSStyleDeclaration.getProperties()" s = cssutils.css.CSSStyleDeclaration(cssText= '/*1*/y:0;x:a !important;y:1; \\x:b;') tests = { # name, all (None, False): [('y', '1', ''), ('x', 'a', 'important')], (None, True): [('y', '0', ''), ('x', 'a', 'important'), ('y', '1', ''), ('\\x', 'b', '') ], ('x', False): [('x', 'a', 'important')], ('\\x', False): [('x', 'a', 'important')], ('x', True): [('x', 'a', 'important'), ('\\x', 'b', '')], ('\\x', True): [('x', 'a', 'important'), ('\\x', 'b', '')], } for test in tests: name, all = test expected = tests[test] actual = s.getProperties(name, all) self.assertEqual(len(expected), len(actual)) for i, ex in enumerate(expected): a = actual[i] self.assertEqual(ex, (a.literalname, a.value, a.priority)) # order is be effective properties set s = cssutils.css.CSSStyleDeclaration(cssText= 'a:0;b:1;a:1') self.assertEqual('ba', ''.join([p.name for p in s])) def test_getPropertyCSSValue(self): "CSSStyleDeclaration.getPropertyCSSValue()" s = cssutils.css.CSSStyleDeclaration(cssText='color: red;c\\olor: green') self.assertEqual('green', s.getPropertyCSSValue('color').cssText) self.assertEqual('green', s.getPropertyCSSValue('c\\olor').cssText) self.assertEqual('red', s.getPropertyCSSValue('color', False).cssText) self.assertEqual('green', s.getPropertyCSSValue('c\\olor', False).cssText) # # shorthand CSSValue should be None # SHORTHAND = [ # u'background', # u'border', # u'border-left', u'border-right', # u'border-top', u'border-bottom', # u'border-color', u'border-style', u'border-width', # u'cue', # u'font', # u'list-style', # u'margin', # u'outline', # u'padding', # u'pause'] # for short in SHORTHAND: # s.setProperty(short, u'inherit') # self.assertEqual(None, s.getPropertyCSSValue(short)) def test_getPropertyValue(self): "CSSStyleDeclaration.getPropertyValue()" s = cssutils.css.CSSStyleDeclaration() self.assertEqual('', s.getPropertyValue('unset')) s.setProperty('left', '0') self.assertEqual('0', s.getPropertyValue('left')) s.setProperty('border', '1px solid green') self.assertEqual('1px solid green', s.getPropertyValue('border')) s = cssutils.css.CSSStyleDeclaration(cssText='color: red;c\\olor: green') self.assertEqual('green', s.getPropertyValue('color')) self.assertEqual('green', s.getPropertyValue('c\\olor')) self.assertEqual('red', s.getPropertyValue('color', False)) self.assertEqual('green', s.getPropertyValue('c\\olor', False)) tests = { r'color: red; color: green': 'green', r'c\olor: red; c\olor: green': 'green', r'color: red; c\olor: green': 'green', r'color: red !important; color: green !important': 'green', r'color: green !important; color: red': 'green', } for test in tests: s = cssutils.css.CSSStyleDeclaration(cssText=test) self.assertEqual(tests[test], s.getPropertyValue('color')) def test_getPropertyPriority(self): "CSSStyleDeclaration.getPropertyPriority()" s = cssutils.css.CSSStyleDeclaration() self.assertEqual('', s.getPropertyPriority('unset')) s.setProperty('left', '0', '!important') self.assertEqual('important', s.getPropertyPriority('left')) s = cssutils.css.CSSStyleDeclaration(cssText= 'x: 1 !important;\\x: 2;x: 3 !important;\\x: 4') self.assertEqual('important', s.getPropertyPriority('x')) self.assertEqual('important', s.getPropertyPriority('\\x')) self.assertEqual('important', s.getPropertyPriority('x', True)) self.assertEqual('', s.getPropertyPriority('\\x', False)) def test_removeProperty(self): "CSSStyleDeclaration.removeProperty()" cssutils.ser.prefs.useDefaults() s = cssutils.css.CSSStyleDeclaration() css = r'\x:0 !important; x:1; \x:2; x:3' # normalize=True DEFAULT s.cssText = css self.assertEqual('0', s.removeProperty('x')) self.assertEqual('', s.cssText) # normalize=False s.cssText = css self.assertEqual('3', s.removeProperty('x', normalize=False)) self.assertEqual(r'\x: 0 !important;\x: 2', s.getCssText(separator='')) self.assertEqual('0', s.removeProperty(r'\x', normalize=False)) self.assertEqual('', s.cssText) s.cssText = css self.assertEqual('0', s.removeProperty(r'\x', normalize=False)) self.assertEqual(r'x: 1;x: 3', s.getCssText(separator='')) self.assertEqual('3', s.removeProperty('x', normalize=False)) self.assertEqual('', s.cssText) def test_setProperty(self): "CSSStyleDeclaration.setProperty()" s = cssutils.css.CSSStyleDeclaration() s.setProperty('top', '0', '!important') self.assertEqual('0', s.getPropertyValue('top')) self.assertEqual('important', s.getPropertyPriority('top')) s.setProperty('top', '1px') self.assertEqual('1px', s.getPropertyValue('top')) self.assertEqual('', s.getPropertyPriority('top')) s.setProperty('top', '2px') self.assertEqual('2px', s.getPropertyValue('top')) s.setProperty('\\top', '3px') self.assertEqual('3px', s.getPropertyValue('top')) s.setProperty('\\top', '4px', normalize=False) self.assertEqual('4px', s.getPropertyValue('top')) self.assertEqual('4px', s.getPropertyValue('\\top', False)) self.assertEqual('3px', s.getPropertyValue('top', False)) # case insensitive s.setProperty('TOP', '0', '!IMPORTANT') self.assertEqual('0', s.getPropertyValue('top')) self.assertEqual('important', s.getPropertyPriority('top')) tests = { ('left', '0', ''): 'left: 0', ('left', '0', 'important'): 'left: 0 !important', ('LEFT', '0', 'important'): 'left: 0 !important', ('left', '0', 'important'): 'left: 0 !important', } for test, exp in list(tests.items()): s = cssutils.css.CSSStyleDeclaration() n, v, p = test s.setProperty(n, v, p) self.assertEqual(exp, s.cssText) self.assertEqual(v, s.getPropertyValue(n)) self.assertEqual(p, s.getPropertyPriority(n)) # empty s = cssutils.css.CSSStyleDeclaration() self.assertEqual('', s.top) s.top = '0' self.assertEqual('0', s.top) s.top = '' self.assertEqual('', s.top) s.top = None self.assertEqual('', s.top) def test_setProperty(self): "CSSStyleDeclaration.setProperty(replace=)" s = cssutils.css.CSSStyleDeclaration() s.setProperty('top', '1px') self.assertEqual(len(s.getProperties('top', all=True)), 1) s.setProperty('top', '2px') self.assertEqual(len(s.getProperties('top', all=True)), 1) self.assertEqual(s.getPropertyValue('top'), '2px') s.setProperty('top', '3px', replace=False) self.assertEqual(len(s.getProperties('top', all=True)), 2) self.assertEqual(s.getPropertyValue('top'), '3px') def test_length(self): "CSSStyleDeclaration.length" s = cssutils.css.CSSStyleDeclaration() # cssText s.cssText = 'left: 0' self.assertEqual(1, s.length) self.assertEqual(1, len(s.seq)) s.cssText = '/*1*/left/*x*/:/*x*/0/*x*/;/*2*/ top: 1;/*3*/' self.assertEqual(2, s.length) self.assertEqual(5, len(s.seq)) # set s = cssutils.css.CSSStyleDeclaration() s.setProperty('top', '0', '!important') self.assertEqual(1, s.length) s.setProperty('top', '1px') self.assertEqual(1, s.length) s.setProperty('left', '1px') def test_nameParameter(self): "CSSStyleDeclaration.XXX(name)" s = cssutils.css.CSSStyleDeclaration() s.setProperty('top', '1px', '!important') self.assertEqual('1px', s.getPropertyValue('top')) self.assertEqual('1px', s.getPropertyValue('TOP')) self.assertEqual('1px', s.getPropertyValue('T\op')) self.assertEqual('important', s.getPropertyPriority('top')) self.assertEqual('important', s.getPropertyPriority('TOP')) self.assertEqual('important', s.getPropertyPriority('T\op')) s.setProperty('top', '2px', '!important') self.assertEqual('2px', s.removeProperty('top')) s.setProperty('top', '2px', '!important') self.assertEqual('2px', s.removeProperty('TOP')) s.setProperty('top', '2px', '!important') self.assertEqual('2px', s.removeProperty('T\op')) def test_css2properties(self): "CSSStyleDeclaration.$css2property get set del" s = cssutils.css.CSSStyleDeclaration( cssText='left: 1px;color: red; font-style: italic') s.color = 'green' s.fontStyle = 'normal' self.assertEqual('green', s.color) self.assertEqual('normal', s.fontStyle) self.assertEqual('green', s.getPropertyValue('color')) self.assertEqual('normal', s.getPropertyValue('font-style')) self.assertEqual( '''left: 1px;\ncolor: green;\nfont-style: normal''', s.cssText) del s.color self.assertEqual( '''left: 1px;\nfont-style: normal''', s.cssText) del s.fontStyle self.assertEqual('left: 1px', s.cssText) self.assertRaises(AttributeError, s.__setattr__, 'UNKNOWN', 'red') # unknown properties must be set with setProperty! s.setProperty('UNKNOWN', 'red') # but are still not usable as property! self.assertRaises(AttributeError, s.__getattribute__, 'UNKNOWN') self.assertRaises(AttributeError, s.__delattr__, 'UNKNOWN') # but are kept self.assertEqual('red', s.getPropertyValue('UNKNOWN')) self.assertEqual( '''left: 1px;\nunknown: red''', s.cssText) def test_reprANDstr(self): "CSSStyleDeclaration.__repr__(), .__str__()" s = cssutils.css.CSSStyleDeclaration(cssText='a:1;b:2') self.assertTrue("2" in str(s)) # length s2 = eval(repr(s)) self.assertTrue(isinstance(s2, s.__class__)) def test_valid(self): "CSSStyleDeclaration.valid" cases = [ ('color: red;', True), ('color: asd;', False), ('foo: red;', False), ('color: red; foo: red;', False), ] for case, expected in cases: s = cssutils.css.CSSStyleDeclaration(cssText=case) msg = '%r should be %s' % (case, 'valid' if expected else 'invalid') self.assertEqual(s.valid, expected, msg) if __name__ == '__main__': import unittest unittest.main()