910 lines
32 KiB
Python
910 lines
32 KiB
Python
|
|
"""Testcases for cssutils.css.CSSValue and CSSPrimitiveValue."""
|
||
|
|
|
||
|
|
|
||
|
|
import xml.dom
|
||
|
|
from . import basetest
|
||
|
|
import cssutils
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
|
||
|
|
pytestmark = pytest.mark.xfail(reason="incomplete")
|
||
|
|
|
||
|
|
|
||
|
|
class TestCSSValue(basetest.BaseTestCase):
|
||
|
|
def setup(self):
|
||
|
|
self.r = cssutils.css.CSSValue() # needed for tests
|
||
|
|
|
||
|
|
def test_init(self):
|
||
|
|
"CSSValue.__init__()"
|
||
|
|
v = cssutils.css.CSSValue()
|
||
|
|
assert '' == v.cssText
|
||
|
|
assert None is v.cssValueType
|
||
|
|
assert None is v.cssValueTypeString
|
||
|
|
|
||
|
|
def test_escapes(self):
|
||
|
|
"CSSValue Escapes"
|
||
|
|
v = cssutils.css.CSSValue()
|
||
|
|
v.cssText = '1px'
|
||
|
|
assert v.CSS_PRIMITIVE_VALUE == v.cssValueType
|
||
|
|
assert v.CSS_PX == v.primitiveType
|
||
|
|
assert '1px' == v.cssText
|
||
|
|
|
||
|
|
v.cssText = '1PX'
|
||
|
|
assert v.CSS_PRIMITIVE_VALUE == v.cssValueType
|
||
|
|
assert v.CSS_PX == v.primitiveType
|
||
|
|
assert '1px' == v.cssText
|
||
|
|
|
||
|
|
v.cssText = '1p\\x'
|
||
|
|
assert v.CSS_PRIMITIVE_VALUE == v.cssValueType
|
||
|
|
assert v.CSS_PX == v.primitiveType
|
||
|
|
assert '1px' == v.cssText
|
||
|
|
|
||
|
|
def test_cssText(self):
|
||
|
|
"CSSValue.cssText"
|
||
|
|
v = cssutils.css.CSSValue()
|
||
|
|
v.cssText = '1px'
|
||
|
|
assert v.CSS_PRIMITIVE_VALUE == v.cssValueType
|
||
|
|
assert v.CSS_PX == v.primitiveType
|
||
|
|
assert '1px' == v.cssText
|
||
|
|
|
||
|
|
v = cssutils.css.CSSValue()
|
||
|
|
v.cssText = '1px'
|
||
|
|
assert v.CSS_PRIMITIVE_VALUE == v.cssValueType
|
||
|
|
assert v.CSS_PX == v.primitiveType
|
||
|
|
assert '1px' == v.cssText
|
||
|
|
|
||
|
|
v = cssutils.css.CSSValue()
|
||
|
|
v.cssText = 'a ,b, c ,"d or d", "e, " '
|
||
|
|
assert v.CSS_PRIMITIVE_VALUE == v.cssValueType
|
||
|
|
assert v.CSS_STRING == v.primitiveType
|
||
|
|
assert 'a, b, c, "d or d", "e, "' == v.cssText
|
||
|
|
|
||
|
|
v.cssText = ' 1 px '
|
||
|
|
assert v.CSS_VALUE_LIST == v.cssValueType
|
||
|
|
assert '1 px' == v.cssText
|
||
|
|
|
||
|
|
v.cssText = ' normal 1px a, b, "c" end '
|
||
|
|
assert v.CSS_VALUE_LIST == v.cssValueType
|
||
|
|
assert 'normal 1px a, b, "c" end' == v.cssText
|
||
|
|
|
||
|
|
for i, x in enumerate(v):
|
||
|
|
assert x.CSS_PRIMITIVE_VALUE == x.cssValueType
|
||
|
|
if x == 0:
|
||
|
|
assert x.CSS_IDENT == x.primitiveType
|
||
|
|
assert 'normal' == x.cssText
|
||
|
|
elif x == 1:
|
||
|
|
assert x.CSS_PX == x.primitiveType
|
||
|
|
assert '1px' == x.cssText
|
||
|
|
if x == 2:
|
||
|
|
assert x.CSS_STRING == x.primitiveType
|
||
|
|
assert 'a, b, "c"' == x.cssText
|
||
|
|
if x == 3:
|
||
|
|
assert x.CSS_IDENT == x.primitiveType
|
||
|
|
assert 'end' == x.cssText
|
||
|
|
|
||
|
|
v = cssutils.css.CSSValue()
|
||
|
|
v.cssText = ' 1 px '
|
||
|
|
assert v.CSS_VALUE_LIST == v.cssValueType
|
||
|
|
assert '1 px' == v.cssText
|
||
|
|
|
||
|
|
v.cssText = 'expression(document.body.clientWidth > 972 ? "1014px": "100%" )'
|
||
|
|
assert v.CSS_PRIMITIVE_VALUE == v.cssValueType
|
||
|
|
assert v.CSS_UNKNOWN == v.primitiveType
|
||
|
|
assert (
|
||
|
|
'expression(document.body.clientWidth > 972?"1014px": "100%")' == v.cssText
|
||
|
|
)
|
||
|
|
|
||
|
|
def test_cssText2(self):
|
||
|
|
"CSSValue.cssText 2"
|
||
|
|
tests = {
|
||
|
|
# mix
|
||
|
|
'a()1,-1,+1,1%,-1%,1px,-1px,"a",a,url(a),#aabb44': 'a() 1, -1, 1, 1%, -1%, 1px, -1px, "a", a, url(a), #ab4',
|
||
|
|
# S or COMMENT
|
||
|
|
'red': 'red',
|
||
|
|
'red ': 'red',
|
||
|
|
' red ': 'red',
|
||
|
|
'/**/red': '/**/ red',
|
||
|
|
'red/**/': 'red /**/',
|
||
|
|
'/**/red/**/': '/**/ red /**/',
|
||
|
|
'/**/ red': '/**/ red',
|
||
|
|
'red /**/': 'red /**/',
|
||
|
|
'/**/ red /**/': '/**/ red /**/',
|
||
|
|
'red-': 'red-',
|
||
|
|
# num / dimension
|
||
|
|
'.0': '0',
|
||
|
|
'0': '0',
|
||
|
|
'0.0': '0',
|
||
|
|
'00': '0',
|
||
|
|
'0%': '0%',
|
||
|
|
'0px': '0',
|
||
|
|
'-.0': '0',
|
||
|
|
'-0': '0',
|
||
|
|
'-0.0': '0',
|
||
|
|
'-00': '0',
|
||
|
|
'-0%': '0%',
|
||
|
|
'-0px': '0',
|
||
|
|
'+.0': '0',
|
||
|
|
'+0': '0',
|
||
|
|
'+0.0': '0',
|
||
|
|
'+00': '0',
|
||
|
|
'+0%': '0%',
|
||
|
|
'+0px': '0',
|
||
|
|
'1': '1',
|
||
|
|
'1.0': '1',
|
||
|
|
'1px': '1px',
|
||
|
|
'1%': '1%',
|
||
|
|
'1px1': '1px1',
|
||
|
|
'+1': '1',
|
||
|
|
'-1': '-1',
|
||
|
|
'+1.0': '1',
|
||
|
|
'-1.0': '-1',
|
||
|
|
# string, escaped nl is removed during tokenizing
|
||
|
|
'"x"': '"x"',
|
||
|
|
"'x'": '"x"',
|
||
|
|
# ur''' "1\'2" ''': u'''"1'2"''', #???
|
||
|
|
# ur"'x\"'": ur'"x\""', #???
|
||
|
|
r'''"x\
|
||
|
|
y"''': '''"xy"''',
|
||
|
|
# hash and rgb/a
|
||
|
|
'#112234': '#112234',
|
||
|
|
'#112233': '#123',
|
||
|
|
'rgb(1,2,3)': 'rgb(1, 2, 3)',
|
||
|
|
'rgb( 1 , 2 , 3 )': 'rgb(1, 2, 3)',
|
||
|
|
'rgb(-1,+2,0)': 'rgb(-1, 2, 0)',
|
||
|
|
'rgba(1,2,3,4)': 'rgba(1, 2, 3, 4)',
|
||
|
|
'rgba( 1 , 2 , 3 , 4 )': 'rgba(1, 2, 3, 4)',
|
||
|
|
'rgba(-1,+2,0, 0)': 'rgba(-1, 2, 0, 0)',
|
||
|
|
# FUNCTION
|
||
|
|
'f(1,2)': 'f(1, 2)',
|
||
|
|
'f( 1 , 2 )': 'f(1, 2)',
|
||
|
|
'f(-1,+2)': 'f(-1, 2)',
|
||
|
|
'f( -1 , +2 )': 'f(-1, 2)',
|
||
|
|
'fun( -1 , +2 )': 'fun(-1, 2)',
|
||
|
|
'local( x )': 'local(x)',
|
||
|
|
'test(1px, #111, y, 1, 1%, "1", y(), var(x))': 'test(1px, #111, y, 1, 1%, "1", y(), var(x))',
|
||
|
|
'test(-1px, #111, y, -1, -1%, "1", -y())': 'test(-1px, #111, y, -1, -1%, "1", -y())',
|
||
|
|
'url(y) format( "x" , "y" )': 'url(y) format("x", "y")',
|
||
|
|
'f(1 2,3 4)': 'f(1 2, 3 4)',
|
||
|
|
# IE expression
|
||
|
|
r'Expression()': 'Expression()',
|
||
|
|
r'expression(-1 < +2)': 'expression(-1< + 2)',
|
||
|
|
r'expression(document.width == "1")': 'expression(document.width=="1")',
|
||
|
|
'alpha(opacity=80)': 'alpha(opacity=80)',
|
||
|
|
'alpha( opacity = 80 , x=2 )': 'alpha(opacity=80, x=2)',
|
||
|
|
# unicode-range
|
||
|
|
'u+f': 'u+f',
|
||
|
|
'U+ABCdef': 'u+abcdef',
|
||
|
|
# url
|
||
|
|
'url(a)': 'url(a)',
|
||
|
|
'uRl(a)': 'url(a)',
|
||
|
|
'u\\rl(a)': 'url(a)',
|
||
|
|
'url("a")': 'url(a)',
|
||
|
|
'url( "a" )': 'url(a)',
|
||
|
|
'url(";")': 'url(";")',
|
||
|
|
'url(",")': 'url(",")',
|
||
|
|
'url(")")': 'url(")")',
|
||
|
|
'''url("'")''': '''url("'")''',
|
||
|
|
'''url('"')''': '''url("\\"")''',
|
||
|
|
'1 2': '1 2',
|
||
|
|
'1 2': '1 2',
|
||
|
|
'1,2': '1, 2',
|
||
|
|
'1, 2': '1, 2',
|
||
|
|
'1 ,2': '1, 2',
|
||
|
|
'1 , 2': '1, 2',
|
||
|
|
'1/2': '1/2',
|
||
|
|
'1/ 2': '1/2',
|
||
|
|
'1 /2': '1/2',
|
||
|
|
'1 / 2': '1/2',
|
||
|
|
# comment
|
||
|
|
'1/**/2': '1 /**/ 2',
|
||
|
|
'1 /**/2': '1 /**/ 2',
|
||
|
|
'1/**/ 2': '1 /**/ 2',
|
||
|
|
'1 /**/ 2': '1 /**/ 2',
|
||
|
|
'1 /*a*/ /*b*/ 2': '1 /*a*/ /*b*/ 2',
|
||
|
|
# , before
|
||
|
|
'1,/**/2': '1, /**/ 2',
|
||
|
|
'1 ,/**/2': '1, /**/ 2',
|
||
|
|
'1, /**/2': '1, /**/ 2',
|
||
|
|
'1 , /**/2': '1, /**/ 2',
|
||
|
|
# , after
|
||
|
|
'1/**/,2': '1 /**/, 2',
|
||
|
|
'1/**/ ,2': '1 /**/, 2',
|
||
|
|
'1/**/, 2': '1 /**/, 2',
|
||
|
|
'1/**/ , 2': '1 /**/, 2',
|
||
|
|
# all
|
||
|
|
'1/*a*/ ,/*b*/ 2': '1 /*a*/, /*b*/ 2',
|
||
|
|
'1 /*a*/, /*b*/2': '1 /*a*/, /*b*/ 2',
|
||
|
|
'1 /*a*/ , /*b*/ 2': '1 /*a*/, /*b*/ 2',
|
||
|
|
# list
|
||
|
|
'a b1,b2 b2,b3,b4': 'a b1, b2 b2, b3, b4',
|
||
|
|
'a b1 , b2 b2 , b3 , b4': 'a b1, b2 b2, b3, b4',
|
||
|
|
'u+1 , u+2-5': 'u+1, u+2-5',
|
||
|
|
'local( x ), url(y) format( "x" , "y" )': 'local(x), url(y) format("x", "y")',
|
||
|
|
# FUNCTION
|
||
|
|
'attr( href )': 'attr(href)',
|
||
|
|
# PrinceXML extende FUNC syntax with nested FUNC
|
||
|
|
'target-counter(attr(href),page)': 'target-counter(attr(href), page)',
|
||
|
|
}
|
||
|
|
|
||
|
|
self.do_equal_r(tests)
|
||
|
|
|
||
|
|
tests = {
|
||
|
|
'a+': xml.dom.SyntaxErr,
|
||
|
|
'-': xml.dom.SyntaxErr,
|
||
|
|
'+': xml.dom.SyntaxErr,
|
||
|
|
'-%': xml.dom.SyntaxErr,
|
||
|
|
'+a': xml.dom.SyntaxErr,
|
||
|
|
'--1px': xml.dom.SyntaxErr,
|
||
|
|
'++1px': xml.dom.SyntaxErr,
|
||
|
|
'#': xml.dom.SyntaxErr,
|
||
|
|
'#00': xml.dom.SyntaxErr,
|
||
|
|
'#0000': xml.dom.SyntaxErr,
|
||
|
|
'#00000': xml.dom.SyntaxErr,
|
||
|
|
'#0000000': xml.dom.SyntaxErr,
|
||
|
|
'-#0': xml.dom.SyntaxErr,
|
||
|
|
# operator
|
||
|
|
',': xml.dom.SyntaxErr,
|
||
|
|
'1,,2': xml.dom.SyntaxErr,
|
||
|
|
'1,/**/,2': xml.dom.SyntaxErr,
|
||
|
|
'1 , /**/ , 2': xml.dom.SyntaxErr,
|
||
|
|
'1,': xml.dom.SyntaxErr,
|
||
|
|
'1, ': xml.dom.SyntaxErr,
|
||
|
|
'1 ,': xml.dom.SyntaxErr,
|
||
|
|
'1 , ': xml.dom.SyntaxErr,
|
||
|
|
'1 , ': xml.dom.SyntaxErr,
|
||
|
|
'1//2': xml.dom.SyntaxErr,
|
||
|
|
# URL
|
||
|
|
'url(x))': xml.dom.SyntaxErr,
|
||
|
|
# string
|
||
|
|
'"': xml.dom.SyntaxErr,
|
||
|
|
"'": xml.dom.SyntaxErr,
|
||
|
|
# function
|
||
|
|
'f(-)': xml.dom.SyntaxErr,
|
||
|
|
'f(x))': xml.dom.SyntaxErr,
|
||
|
|
}
|
||
|
|
self.do_raise_r(tests)
|
||
|
|
|
||
|
|
def test_incomplete(self):
|
||
|
|
"CSSValue (incomplete)"
|
||
|
|
tests = {'url("a': 'url(a)', 'url(a': 'url(a)'}
|
||
|
|
for v, exp in list(tests.items()):
|
||
|
|
s = cssutils.parseString('a { background: %s' % v)
|
||
|
|
v = s.cssRules[0].style.background
|
||
|
|
assert v == exp
|
||
|
|
|
||
|
|
def test_cssValueType(self):
|
||
|
|
"CSSValue.cssValueType .cssValueTypeString"
|
||
|
|
tests = [
|
||
|
|
(['inherit', 'INhe\\rit'], 'CSS_INHERIT', cssutils.css.CSSValue),
|
||
|
|
(
|
||
|
|
[
|
||
|
|
'1',
|
||
|
|
'1%',
|
||
|
|
'1em',
|
||
|
|
'1ex',
|
||
|
|
'1px',
|
||
|
|
'1cm',
|
||
|
|
'1mm',
|
||
|
|
'1in',
|
||
|
|
'1pt',
|
||
|
|
'1pc',
|
||
|
|
'1deg',
|
||
|
|
'1rad',
|
||
|
|
'1grad',
|
||
|
|
'1ms',
|
||
|
|
'1s',
|
||
|
|
'1hz',
|
||
|
|
'1khz',
|
||
|
|
'1other',
|
||
|
|
'"string"',
|
||
|
|
"'string'",
|
||
|
|
'url(x)',
|
||
|
|
'red',
|
||
|
|
'attr(a)',
|
||
|
|
'counter(x)',
|
||
|
|
'rect(1px, 2px, 3px, 4px)',
|
||
|
|
'rgb(0, 0, 0)',
|
||
|
|
'#000',
|
||
|
|
'#123456',
|
||
|
|
'rgba(0, 0, 0, 0)',
|
||
|
|
'hsl(0, 0, 0)',
|
||
|
|
'hsla(0, 0, 0, 0)',
|
||
|
|
],
|
||
|
|
'CSS_PRIMITIVE_VALUE',
|
||
|
|
cssutils.css.CSSPrimitiveValue,
|
||
|
|
),
|
||
|
|
(
|
||
|
|
['1px 1px', 'red blue green x'],
|
||
|
|
'CSS_VALUE_LIST',
|
||
|
|
cssutils.css.CSSValueList,
|
||
|
|
),
|
||
|
|
# what is a custom value?
|
||
|
|
# ([], 'CSS_CUSTOM', cssutils.css.CSSValue)
|
||
|
|
]
|
||
|
|
for values, name, cls in tests:
|
||
|
|
for value in values:
|
||
|
|
v = cssutils.css.CSSValue(cssText=value)
|
||
|
|
if value == "'string'":
|
||
|
|
# will be changed to " always
|
||
|
|
value = '"string"'
|
||
|
|
assert value == v.cssText
|
||
|
|
assert name == v.cssValueTypeString
|
||
|
|
assert getattr(v, name) == v.cssValueType
|
||
|
|
assert cls == type(v)
|
||
|
|
|
||
|
|
def test_readonly(self):
|
||
|
|
"(CSSValue._readonly)"
|
||
|
|
v = cssutils.css.CSSValue(cssText='inherit')
|
||
|
|
assert False is v._readonly
|
||
|
|
|
||
|
|
v = cssutils.css.CSSValue(cssText='inherit', readonly=True)
|
||
|
|
assert True is v._readonly
|
||
|
|
assert 'inherit', v.cssText
|
||
|
|
with pytest.raises(xml.dom.NoModificationAllowedErr):
|
||
|
|
v._setCssText('x')
|
||
|
|
assert 'inherit', v.cssText
|
||
|
|
|
||
|
|
def test_reprANDstr(self):
|
||
|
|
"CSSValue.__repr__(), .__str__()"
|
||
|
|
cssText = 'inherit'
|
||
|
|
|
||
|
|
s = cssutils.css.CSSValue(cssText=cssText)
|
||
|
|
|
||
|
|
assert cssText in str(s)
|
||
|
|
|
||
|
|
s2 = eval(repr(s))
|
||
|
|
assert isinstance(s2, s.__class__)
|
||
|
|
assert cssText == s2.cssText
|
||
|
|
|
||
|
|
|
||
|
|
class TestCSSPrimitiveValue:
|
||
|
|
def test_init(self):
|
||
|
|
"CSSPrimitiveValue.__init__()"
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('1')
|
||
|
|
assert '1' == v.cssText
|
||
|
|
|
||
|
|
assert v.CSS_PRIMITIVE_VALUE == v.cssValueType
|
||
|
|
assert "CSS_PRIMITIVE_VALUE" == v.cssValueTypeString
|
||
|
|
|
||
|
|
assert v.CSS_NUMBER == v.primitiveType
|
||
|
|
assert "CSS_NUMBER" == v.primitiveTypeString
|
||
|
|
|
||
|
|
# DUMMY to be able to test empty constructor call
|
||
|
|
# self.assertRaises(xml.dom.SyntaxErr, v.__init__, None)
|
||
|
|
|
||
|
|
with pytest.raises(xml.dom.InvalidAccessErr):
|
||
|
|
v.getCounterValue()
|
||
|
|
with pytest.raises(xml.dom.InvalidAccessErr):
|
||
|
|
v.getRGBColorValue()
|
||
|
|
with pytest.raises(xml.dom.InvalidAccessErr):
|
||
|
|
v.getRectValue()
|
||
|
|
with pytest.raises(xml.dom.InvalidAccessErr):
|
||
|
|
v.getStringValue()
|
||
|
|
|
||
|
|
def test_CSS_UNKNOWN(self):
|
||
|
|
"CSSPrimitiveValue.CSS_UNKNOWN"
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('expression(false)')
|
||
|
|
assert v.CSS_UNKNOWN == v.primitiveType
|
||
|
|
assert 'CSS_UNKNOWN' == v.primitiveTypeString
|
||
|
|
|
||
|
|
def test_CSS_NUMBER_AND_OTHER_DIMENSIONS(self):
|
||
|
|
"CSSPrimitiveValue.CSS_NUMBER .. CSS_DIMENSION"
|
||
|
|
defs = [
|
||
|
|
('', 'CSS_NUMBER'),
|
||
|
|
('%', 'CSS_PERCENTAGE'),
|
||
|
|
('em', 'CSS_EMS'),
|
||
|
|
('ex', 'CSS_EXS'),
|
||
|
|
('px', 'CSS_PX'),
|
||
|
|
('cm', 'CSS_CM'),
|
||
|
|
('mm', 'CSS_MM'),
|
||
|
|
('in', 'CSS_IN'),
|
||
|
|
('pt', 'CSS_PT'),
|
||
|
|
('pc', 'CSS_PC'),
|
||
|
|
('deg', 'CSS_DEG'),
|
||
|
|
('rad', 'CSS_RAD'),
|
||
|
|
('grad', 'CSS_GRAD'),
|
||
|
|
('ms', 'CSS_MS'),
|
||
|
|
('s', 'CSS_S'),
|
||
|
|
('hz', 'CSS_HZ'),
|
||
|
|
('khz', 'CSS_KHZ'),
|
||
|
|
('other_dimension', 'CSS_DIMENSION'),
|
||
|
|
]
|
||
|
|
for dim, name in defs:
|
||
|
|
for n in (0, 1, 1.1, -1, -1.1, -0):
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('%i%s' % (n, dim))
|
||
|
|
assert name == v.primitiveTypeString
|
||
|
|
assert getattr(v, name) == v.primitiveType
|
||
|
|
|
||
|
|
def test_CSS_STRING_AND_OTHER(self):
|
||
|
|
"CSSPrimitiveValue.CSS_STRING .. CSS_RGBCOLOR"
|
||
|
|
defs = [
|
||
|
|
(
|
||
|
|
(
|
||
|
|
'""',
|
||
|
|
"''",
|
||
|
|
'"some thing"',
|
||
|
|
"' A\\ND '",
|
||
|
|
# comma separated lists are STRINGS FOR NOW!
|
||
|
|
'a, b',
|
||
|
|
'"a", "b"',
|
||
|
|
),
|
||
|
|
'CSS_STRING',
|
||
|
|
),
|
||
|
|
(('url(a)', 'url("a b")', "url(' ')"), 'CSS_URI'),
|
||
|
|
(('some', 'or_anth-er'), 'CSS_IDENT'),
|
||
|
|
(('attr(a)', 'attr(b)'), 'CSS_ATTR'),
|
||
|
|
(('counter(1)', 'counter(2)'), 'CSS_COUNTER'),
|
||
|
|
(('rect(1,2,3,4)',), 'CSS_RECT'),
|
||
|
|
(('rgb(1,2,3)', 'rgb(10%, 20%, 30%)', '#123', '#123456'), 'CSS_RGBCOLOR'),
|
||
|
|
(
|
||
|
|
(
|
||
|
|
'rgba(1,2,3,4)',
|
||
|
|
'rgba(10%, 20%, 30%, 40%)',
|
||
|
|
),
|
||
|
|
'CSS_RGBACOLOR',
|
||
|
|
),
|
||
|
|
(('U+0', 'u+ffffff', 'u+000000-f', 'u+0-f, U+ee-ff'), 'CSS_UNICODE_RANGE'),
|
||
|
|
]
|
||
|
|
|
||
|
|
for examples, name in defs:
|
||
|
|
for x in examples:
|
||
|
|
v = cssutils.css.CSSPrimitiveValue(x)
|
||
|
|
assert getattr(v, name) == v.primitiveType
|
||
|
|
assert name == v.primitiveTypeString
|
||
|
|
|
||
|
|
def test_getFloat(self):
|
||
|
|
"CSSPrimitiveValue.getFloatValue()"
|
||
|
|
# NOT TESTED are float values as it seems difficult to
|
||
|
|
# compare these. Maybe use decimal.Decimal?
|
||
|
|
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('1px')
|
||
|
|
tests = {
|
||
|
|
'0': (v.CSS_NUMBER, 0),
|
||
|
|
'-1.1': (v.CSS_NUMBER, -1.1),
|
||
|
|
'1%': (v.CSS_PERCENTAGE, 1),
|
||
|
|
'-1%': (v.CSS_PERCENTAGE, -1),
|
||
|
|
'1em': (v.CSS_EMS, 1),
|
||
|
|
'-1.1em': (v.CSS_EMS, -1.1),
|
||
|
|
'1ex': (v.CSS_EXS, 1),
|
||
|
|
'1px': (v.CSS_PX, 1),
|
||
|
|
'1cm': (v.CSS_CM, 1),
|
||
|
|
# '1cm': (v.CSS_MM, 10),
|
||
|
|
'254cm': (v.CSS_IN, 100),
|
||
|
|
'1mm': (v.CSS_MM, 1),
|
||
|
|
'10mm': (v.CSS_CM, 1),
|
||
|
|
'254mm': (v.CSS_IN, 10),
|
||
|
|
'1in': (v.CSS_IN, 1),
|
||
|
|
'100in': (v.CSS_CM, 254), # ROUNDED!!!
|
||
|
|
'10in': (v.CSS_MM, 254), # ROUNDED!!!
|
||
|
|
'1pt': (v.CSS_PT, 1),
|
||
|
|
'1pc': (v.CSS_PC, 1),
|
||
|
|
'1deg': (v.CSS_DEG, 1),
|
||
|
|
'1rad': (v.CSS_RAD, 1),
|
||
|
|
'1grad': (v.CSS_GRAD, 1),
|
||
|
|
'1ms': (v.CSS_MS, 1),
|
||
|
|
'1000ms': (v.CSS_S, 1),
|
||
|
|
'1s': (v.CSS_S, 1),
|
||
|
|
# '1s': (v.CSS_MS, 1000),
|
||
|
|
'1hz': (v.CSS_HZ, 1),
|
||
|
|
'1000hz': (v.CSS_KHZ, 1),
|
||
|
|
'1khz': (v.CSS_KHZ, 1),
|
||
|
|
# '1khz': (v.CSS_HZ, 1000),
|
||
|
|
'1DIMENSION': (v.CSS_DIMENSION, 1),
|
||
|
|
}
|
||
|
|
for cssText in tests:
|
||
|
|
v.cssText = cssText
|
||
|
|
unitType, exp = tests[cssText]
|
||
|
|
val = v.getFloatValue(unitType)
|
||
|
|
if unitType in (v.CSS_IN, v.CSS_CM):
|
||
|
|
val = round(val)
|
||
|
|
assert val == exp
|
||
|
|
|
||
|
|
def test_setFloat(self):
|
||
|
|
"CSSPrimitiveValue.setFloatValue()"
|
||
|
|
V = cssutils.css.CSSPrimitiveValue
|
||
|
|
|
||
|
|
tests = {
|
||
|
|
# unitType, value
|
||
|
|
(V.CSS_NUMBER, 1): [
|
||
|
|
# unitType, setvalue,
|
||
|
|
# getvalue or expected exception, msg or cssText
|
||
|
|
(V.CSS_NUMBER, 0, 0, '0'),
|
||
|
|
(V.CSS_NUMBER, 0.1, 0.1, '0.1'),
|
||
|
|
(V.CSS_NUMBER, -0, 0, '0'),
|
||
|
|
(V.CSS_NUMBER, 2, 2, '2'),
|
||
|
|
(V.CSS_NUMBER, 2.0, 2, '2'),
|
||
|
|
(V.CSS_NUMBER, 2.1, 2.1, '2.1'),
|
||
|
|
(V.CSS_NUMBER, -2.1, -2.1, '-2.1'),
|
||
|
|
# setting with string does work
|
||
|
|
(V.CSS_NUMBER, '1', 1, '1'),
|
||
|
|
(V.CSS_NUMBER, '1.1', 1.1, '1.1'),
|
||
|
|
(V.CSS_PX, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_DEG, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_RAD, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_GRAD, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_S, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_MS, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_KHZ, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_HZ, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_DIMENSION, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_MM, 2, xml.dom.InvalidAccessErr, None),
|
||
|
|
(
|
||
|
|
V.CSS_NUMBER,
|
||
|
|
'x',
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
"CSSPrimitiveValue: floatValue 'x' is not a float",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
V.CSS_NUMBER,
|
||
|
|
'1x',
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
"CSSPrimitiveValue: floatValue '1x' is not a float",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
V.CSS_STRING,
|
||
|
|
'x',
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
"CSSPrimitiveValue: unitType 'CSS_STRING' is not a float type",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
V.CSS_URI,
|
||
|
|
'x',
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
"CSSPrimitiveValue: unitType 'CSS_URI' is not a float type",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
V.CSS_ATTR,
|
||
|
|
'x',
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
"CSSPrimitiveValue: unitType 'CSS_ATTR' is not a float type",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
V.CSS_IDENT,
|
||
|
|
'x',
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
"CSSPrimitiveValue: unitType 'CSS_IDENT' is not a float type",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
V.CSS_RGBCOLOR,
|
||
|
|
'x',
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
"CSSPrimitiveValue: unitType 'CSS_RGBCOLOR' is not a float type",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
V.CSS_RGBACOLOR,
|
||
|
|
'x',
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
"CSSPrimitiveValue: unitType 'CSS_RGBACOLOR' is not a float type",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
V.CSS_RECT,
|
||
|
|
'x',
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
"CSSPrimitiveValue: unitType 'CSS_RECT' is not a float type",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
V.CSS_COUNTER,
|
||
|
|
'x',
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
"CSSPrimitiveValue: unitType 'CSS_COUNTER' is not a float type",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
V.CSS_EMS,
|
||
|
|
1,
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
"CSSPrimitiveValue: Cannot coerce "
|
||
|
|
"primitiveType 'CSS_NUMBER' to 'CSS_EMS'",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
V.CSS_EXS,
|
||
|
|
1,
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
"CSSPrimitiveValue: Cannot coerce primitiveType "
|
||
|
|
"'CSS_NUMBER' to 'CSS_EXS'",
|
||
|
|
),
|
||
|
|
],
|
||
|
|
(V.CSS_MM, '1mm'): [
|
||
|
|
(V.CSS_MM, 2, 2, '2mm'),
|
||
|
|
(V.CSS_MM, 0, 0, '0mm'),
|
||
|
|
(V.CSS_MM, 0.1, 0.1, '0.1mm'),
|
||
|
|
(V.CSS_MM, -0, -0, '0mm'),
|
||
|
|
(V.CSS_MM, 3.0, 3, '3mm'),
|
||
|
|
(V.CSS_MM, 3.1, 3.1, '3.1mm'),
|
||
|
|
(V.CSS_MM, -3.1, -3.1, '-3.1mm'),
|
||
|
|
(V.CSS_CM, 1, 10, '10mm'),
|
||
|
|
(V.CSS_IN, 10, 254, '254mm'),
|
||
|
|
(V.CSS_PT, 1, 1828.8, '1828.8mm'),
|
||
|
|
(V.CSS_PX, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_NUMBER, 2, xml.dom.InvalidAccessErr, None),
|
||
|
|
],
|
||
|
|
(V.CSS_PT, '1pt'): [
|
||
|
|
(V.CSS_PT, 2, 2, '2pt'),
|
||
|
|
(V.CSS_PC, 12, 1, '1pt'),
|
||
|
|
(V.CSS_NUMBER, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_DEG, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_PX, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
],
|
||
|
|
(V.CSS_KHZ, '1khz'): [
|
||
|
|
(V.CSS_HZ, 2000, 2, '2khz'),
|
||
|
|
(V.CSS_NUMBER, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_DEG, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
(V.CSS_PX, 1, xml.dom.InvalidAccessErr, None),
|
||
|
|
],
|
||
|
|
}
|
||
|
|
for test in tests:
|
||
|
|
initialType, initialValue = test
|
||
|
|
pv = cssutils.css.CSSPrimitiveValue(initialValue)
|
||
|
|
for setType, setValue, exp, cssText in tests[test]:
|
||
|
|
if type(exp) == type or type(exp) == type: # 2.4 compatibility
|
||
|
|
if cssText:
|
||
|
|
with pytest.raises(exp, match=cssText):
|
||
|
|
pv.setFloatValue(setType, setValue)
|
||
|
|
else:
|
||
|
|
with pytest.raises(exp):
|
||
|
|
pv.setFloatValue(setType, setValue)
|
||
|
|
else:
|
||
|
|
pv.setFloatValue(setType, setValue)
|
||
|
|
assert pv._value[0] == cssText
|
||
|
|
if cssText == '0mm':
|
||
|
|
cssText = '0'
|
||
|
|
assert pv.cssText == cssText
|
||
|
|
assert pv.getFloatValue(initialType) == exp
|
||
|
|
|
||
|
|
def test_getString(self):
|
||
|
|
"CSSPrimitiveValue.getStringValue()"
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('1px')
|
||
|
|
assert v.primitiveType == v.CSS_PX
|
||
|
|
with pytest.raises(xml.dom.InvalidAccessErr):
|
||
|
|
v.getStringValue()
|
||
|
|
|
||
|
|
pv = cssutils.css.CSSPrimitiveValue
|
||
|
|
tests = {
|
||
|
|
pv.CSS_STRING: ("'red'", 'red'),
|
||
|
|
pv.CSS_STRING: ('"red"', 'red'),
|
||
|
|
pv.CSS_URI: ('url(http://example.com)', None),
|
||
|
|
pv.CSS_URI: ("url('http://example.com')", "http://example.com"),
|
||
|
|
pv.CSS_URI: ('url("http://example.com")', 'http://example.com'),
|
||
|
|
pv.CSS_URI: ('url("http://example.com?)")', 'http://example.com?)'),
|
||
|
|
pv.CSS_IDENT: ('red', None),
|
||
|
|
pv.CSS_ATTR: ('attr(att-name)', 'att-name'), # the name of the attrr
|
||
|
|
}
|
||
|
|
for t in tests:
|
||
|
|
val, exp = tests[t]
|
||
|
|
if not exp:
|
||
|
|
exp = val
|
||
|
|
|
||
|
|
v = cssutils.css.CSSPrimitiveValue(val)
|
||
|
|
assert v.primitiveType == t
|
||
|
|
assert v.getStringValue() == exp
|
||
|
|
|
||
|
|
def test_setString(self):
|
||
|
|
"CSSPrimitiveValue.setStringValue()"
|
||
|
|
# CSS_STRING
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('"a"')
|
||
|
|
assert v.CSS_STRING == v.primitiveType
|
||
|
|
v.setStringValue(v.CSS_STRING, 'b')
|
||
|
|
assert ('b', 'STRING') == v._value
|
||
|
|
assert 'b' == v.getStringValue()
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_STRING' to 'CSS_URI'",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_URI, 'x')
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_STRING' to 'CSS_IDENT'",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_IDENT, 'x')
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_STRING' to 'CSS_ATTR'",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_ATTR, 'x')
|
||
|
|
|
||
|
|
# CSS_IDENT
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('new')
|
||
|
|
v.setStringValue(v.CSS_IDENT, 'ident')
|
||
|
|
assert v.CSS_IDENT == v.primitiveType
|
||
|
|
assert ('ident', 'IDENT') == v._value
|
||
|
|
assert 'ident' == v.getStringValue()
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_IDENT' to 'CSS_URI'",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_URI, 'x')
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_IDENT' to 'CSS_STRING'",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_STRING, '"x"')
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_IDENT' to 'CSS_ATTR'",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_ATTR, 'x')
|
||
|
|
|
||
|
|
# CSS_URI
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('url(old)')
|
||
|
|
v.setStringValue(v.CSS_URI, '(')
|
||
|
|
assert ('(', 'URI') == v._value
|
||
|
|
assert '(' == v.getStringValue()
|
||
|
|
|
||
|
|
v.setStringValue(v.CSS_URI, ')')
|
||
|
|
assert (')', 'URI') == v._value
|
||
|
|
assert ')' == v.getStringValue()
|
||
|
|
|
||
|
|
v.setStringValue(v.CSS_URI, '"')
|
||
|
|
assert r'"' == v.getStringValue()
|
||
|
|
assert (r'"', 'URI') == v._value
|
||
|
|
|
||
|
|
v.setStringValue(v.CSS_URI, "''")
|
||
|
|
assert r"''" == v.getStringValue()
|
||
|
|
assert (r"''", 'URI') == v._value
|
||
|
|
|
||
|
|
v.setStringValue(v.CSS_URI, ',')
|
||
|
|
assert r',' == v.getStringValue()
|
||
|
|
assert (r',', 'URI') == v._value
|
||
|
|
|
||
|
|
v.setStringValue(v.CSS_URI, ' ')
|
||
|
|
assert (' ', 'URI') == v._value
|
||
|
|
assert ' ' == v.getStringValue()
|
||
|
|
|
||
|
|
v.setStringValue(v.CSS_URI, 'a)')
|
||
|
|
assert ('a)', 'URI') == v._value
|
||
|
|
assert 'a)' == v.getStringValue()
|
||
|
|
|
||
|
|
v.setStringValue(v.CSS_URI, 'a')
|
||
|
|
assert v.CSS_URI == v.primitiveType
|
||
|
|
assert ('a', 'URI') == v._value
|
||
|
|
assert 'a' == v.getStringValue()
|
||
|
|
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_URI' to 'CSS_IDENT'",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_IDENT, 'x')
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_URI' to 'CSS_STRING'",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_STRING, '"x"')
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_URI' to 'CSS_ATTR'",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_ATTR, 'x')
|
||
|
|
|
||
|
|
# CSS_ATTR
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('attr(old)')
|
||
|
|
v.setStringValue(v.CSS_ATTR, 'a')
|
||
|
|
assert v.CSS_ATTR == v.primitiveType
|
||
|
|
assert 'a' == v.getStringValue()
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_ATTR' to 'CSS_IDENT'",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_IDENT, 'x')
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_ATTR' to 'CSS_STRING'",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_STRING, '"x"')
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: Cannot coerce primitiveType 'CSS_ATTR' to 'CSS_URI'",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_URI, 'x')
|
||
|
|
|
||
|
|
# TypeError as 'x' is no valid type
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: stringType 'x' (UNKNOWN TYPE) is not a string type",
|
||
|
|
):
|
||
|
|
v.setStringValue('x', 'brown')
|
||
|
|
# IndexError as 111 is no valid type
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: stringType 111 (UNKNOWN TYPE) is not a string type",
|
||
|
|
):
|
||
|
|
v.setStringValue(111, 'brown')
|
||
|
|
# CSS_PX is no string type
|
||
|
|
with pytest.raises(
|
||
|
|
xml.dom.InvalidAccessErr,
|
||
|
|
match="CSSPrimitiveValue: stringType CSS_PX is not a string type",
|
||
|
|
):
|
||
|
|
v.setStringValue(v.CSS_PX, 'brown')
|
||
|
|
|
||
|
|
def test_typeRGBColor(self):
|
||
|
|
"RGBColor"
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('RGB(1, 5, 10)')
|
||
|
|
assert v.CSS_RGBCOLOR == v.primitiveType
|
||
|
|
assert 'rgb(1, 5, 10)' == v.cssText
|
||
|
|
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('rgb(1, 5, 10)')
|
||
|
|
assert v.CSS_RGBCOLOR == v.primitiveType
|
||
|
|
assert 'rgb(1, 5, 10)' == v.cssText
|
||
|
|
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('rgb(1%, 5%, 10%)')
|
||
|
|
assert v.CSS_RGBCOLOR == v.primitiveType
|
||
|
|
assert 'rgb(1%, 5%, 10%)' == v.cssText
|
||
|
|
|
||
|
|
v = cssutils.css.CSSPrimitiveValue(' rgb( 1 ,5, 10 )')
|
||
|
|
assert v.CSS_RGBCOLOR == v.primitiveType
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('rgb(1,5,10)')
|
||
|
|
assert v.CSS_RGBCOLOR == v.primitiveType
|
||
|
|
v = cssutils.css.CSSPrimitiveValue('rgb(1%, .5%, 10.1%)')
|
||
|
|
assert v.CSS_RGBCOLOR == v.primitiveType
|
||
|
|
|
||
|
|
def test_reprANDstr(self):
|
||
|
|
"CSSPrimitiveValue.__repr__(), .__str__()"
|
||
|
|
v = '111'
|
||
|
|
|
||
|
|
s = cssutils.css.CSSPrimitiveValue(v)
|
||
|
|
|
||
|
|
assert v in str(s)
|
||
|
|
assert 'CSS_NUMBER' in str(s)
|
||
|
|
|
||
|
|
s2 = eval(repr(s))
|
||
|
|
assert isinstance(s2, s.__class__)
|
||
|
|
assert v == s2.cssText
|
||
|
|
|
||
|
|
|
||
|
|
class TestCSSValueList:
|
||
|
|
def test_init(self):
|
||
|
|
"CSSValueList.__init__()"
|
||
|
|
v = cssutils.css.CSSValue(cssText='red blue')
|
||
|
|
assert v.CSS_VALUE_LIST == v.cssValueType
|
||
|
|
assert 'red blue' == v.cssText
|
||
|
|
|
||
|
|
assert 2 == v.length
|
||
|
|
|
||
|
|
item = v.item(0)
|
||
|
|
item.setStringValue(item.CSS_IDENT, 'green')
|
||
|
|
assert 'green blue' == v.cssText
|
||
|
|
|
||
|
|
def test_numbers(self):
|
||
|
|
"CSSValueList.cssText"
|
||
|
|
tests = {
|
||
|
|
'0 0px -0px +0px': ('0 0 0 0', 4),
|
||
|
|
'1 2 3 4': (None, 4),
|
||
|
|
'-1 -2 -3 -4': (None, 4),
|
||
|
|
'-1 2': (None, 2),
|
||
|
|
'-1px red "x"': (None, 3),
|
||
|
|
'a, b c': (None, 2),
|
||
|
|
'1px1 2% 3': ('1px1 2% 3', 3),
|
||
|
|
'f(+1pX, -2, 5%) 1': ('f(1px, -2, 5%) 1', 2),
|
||
|
|
'0 f()0': ('0 f() 0', 3),
|
||
|
|
'f()0': ('f() 0', 2),
|
||
|
|
'f()1%': ('f() 1%', 2),
|
||
|
|
'f()1px': ('f() 1px', 2),
|
||
|
|
'f()"str"': ('f() "str"', 2),
|
||
|
|
'f()ident': ('f() ident', 2),
|
||
|
|
'f()#123': ('f() #123', 2),
|
||
|
|
'f()url()': ('f() url()', 2),
|
||
|
|
'f()f()': ('f() f()', 2),
|
||
|
|
'url(x.gif)0 0': ('url(x.gif) 0 0', 3),
|
||
|
|
'url(x.gif)no-repeat': ('url(x.gif) no-repeat', 2),
|
||
|
|
}
|
||
|
|
for test in tests:
|
||
|
|
exp, num = tests[test]
|
||
|
|
if not exp:
|
||
|
|
exp = test
|
||
|
|
v = cssutils.css.CSSValue(cssText=test)
|
||
|
|
assert v.CSS_VALUE_LIST == v.cssValueType
|
||
|
|
assert num == v.length
|
||
|
|
assert exp == v.cssText
|
||
|
|
|
||
|
|
def test_reprANDstr(self):
|
||
|
|
"CSSValueList.__repr__(), .__str__()"
|
||
|
|
v = '1px 2px'
|
||
|
|
|
||
|
|
s = cssutils.css.CSSValue(v)
|
||
|
|
assert isinstance(s, cssutils.css.CSSValueList)
|
||
|
|
|
||
|
|
assert 'length=2' in str(s)
|
||
|
|
assert v in str(s)
|
||
|
|
|
||
|
|
# not "eval()"able!
|
||
|
|
# s2 = eval(repr(s))
|