353 lines
9.7 KiB
Python
353 lines
9.7 KiB
Python
|
|
"""Testcases for cssutils.css.cssvariablesdelaration.CSSVariablesDeclaration."""
|
||
|
|
|
||
|
|
import xml.dom
|
||
|
|
|
||
|
|
from . import basetest
|
||
|
|
import cssutils
|
||
|
|
|
||
|
|
|
||
|
|
class TestCSSVariablesDeclaration(basetest.BaseTestCase):
|
||
|
|
def setup_method(self):
|
||
|
|
self.r = cssutils.css.CSSVariablesDeclaration()
|
||
|
|
|
||
|
|
def test_init(self):
|
||
|
|
"CSSVariablesDeclaration.__init__()"
|
||
|
|
v = cssutils.css.CSSVariablesDeclaration()
|
||
|
|
assert '' == v.cssText
|
||
|
|
assert 0 == v.length
|
||
|
|
assert v.parentRule is None
|
||
|
|
|
||
|
|
v = cssutils.css.CSSVariablesDeclaration(cssText='x: 0')
|
||
|
|
assert 'x: 0' == v.cssText
|
||
|
|
assert '0' == v.getVariableValue('x')
|
||
|
|
|
||
|
|
rule = cssutils.css.CSSVariablesRule()
|
||
|
|
v = cssutils.css.CSSVariablesDeclaration(cssText='x: 0', parentRule=rule)
|
||
|
|
assert rule == v.parentRule
|
||
|
|
|
||
|
|
def test__contains__(self):
|
||
|
|
"CSSVariablesDeclaration.__contains__(name)"
|
||
|
|
v = cssutils.css.CSSVariablesDeclaration(cssText='x: 0; y: 2')
|
||
|
|
for test in ('x', 'y'):
|
||
|
|
assert test in v
|
||
|
|
assert test.upper() in v
|
||
|
|
|
||
|
|
assert 'z' not in v
|
||
|
|
|
||
|
|
def test_items(self):
|
||
|
|
"CSSVariablesDeclaration[variableName]"
|
||
|
|
v = cssutils.css.CSSVariablesDeclaration()
|
||
|
|
|
||
|
|
value = '0'
|
||
|
|
v['X'] = value
|
||
|
|
assert value == v['X']
|
||
|
|
assert value == v.getVariableValue('X')
|
||
|
|
assert value == v['x']
|
||
|
|
assert value == v.getVariableValue('x')
|
||
|
|
|
||
|
|
assert '' == v['y']
|
||
|
|
assert '' == v.getVariableValue('y')
|
||
|
|
|
||
|
|
v['z'] = '1'
|
||
|
|
assert 2 == v.length
|
||
|
|
|
||
|
|
# unsorted!
|
||
|
|
assert sorted(v) == ['x', 'z']
|
||
|
|
|
||
|
|
del v['z']
|
||
|
|
assert 1 == v.length
|
||
|
|
assert 1 == v.length
|
||
|
|
|
||
|
|
assert '0' == v.removeVariable('x')
|
||
|
|
assert '' == v.removeVariable('z')
|
||
|
|
assert 0 == v.length
|
||
|
|
|
||
|
|
v.cssText = 'x:0; y:1'
|
||
|
|
keys = []
|
||
|
|
# unsorted!
|
||
|
|
for i in range(0, v.length):
|
||
|
|
keys.append(v.item(i))
|
||
|
|
assert sorted(keys) == ['x', 'y']
|
||
|
|
|
||
|
|
def test_keys(self):
|
||
|
|
"CSSVariablesDeclaration.keys()"
|
||
|
|
v = cssutils.css.CSSVariablesDeclaration(cssText='x: 0; Y: 2')
|
||
|
|
assert ['x', 'y'] == sorted(v.keys())
|
||
|
|
|
||
|
|
def test_cssText(self):
|
||
|
|
"CSSVariablesDeclaration.cssText"
|
||
|
|
# empty
|
||
|
|
tests = {
|
||
|
|
'': '',
|
||
|
|
' ': '',
|
||
|
|
' \t \n ': '',
|
||
|
|
'x: 1': None,
|
||
|
|
'x: "a"': None,
|
||
|
|
'x: rgb(1, 2, 3)': None,
|
||
|
|
'x: 1px 2px 3px': None,
|
||
|
|
'x:1': 'x: 1',
|
||
|
|
'x:1;': 'x: 1',
|
||
|
|
'x : 1 ': 'x: 1',
|
||
|
|
'x : 1 ; ': 'x: 1',
|
||
|
|
'x:1;y:2': 'x: 1;\ny: 2',
|
||
|
|
'x:1;y:2;': 'x: 1;\ny: 2',
|
||
|
|
'x : 1 ; y : 2 ': 'x: 1;\ny: 2',
|
||
|
|
'x : 1 ; y : 2 ; ': 'x: 1;\ny: 2',
|
||
|
|
'/*x*/': '/*x*/',
|
||
|
|
'x555: 5': None,
|
||
|
|
'xxx:1;yyy:2': 'xxx: 1;\nyyy: 2',
|
||
|
|
'xxx : 1; yyy : 2': 'xxx: 1;\nyyy: 2',
|
||
|
|
'x:1;x:2;X:2': 'x: 2',
|
||
|
|
'same:1;SAME:2;': 'same: 2',
|
||
|
|
'/**/x/**/:/**/1/**/;/**/y/**/:/**/2/**/': '/**/ \n /**/ \n /**/ \n x: 1 /**/;\n/**/ \n /**/ \n /**/ \n y: 2 /**/',
|
||
|
|
}
|
||
|
|
self.do_equal_r(tests)
|
||
|
|
|
||
|
|
def test_cssText2(self):
|
||
|
|
"CSSVariablesDeclaration.cssText"
|
||
|
|
|
||
|
|
tests = {
|
||
|
|
'top': xml.dom.SyntaxErr,
|
||
|
|
'top:': xml.dom.SyntaxErr,
|
||
|
|
'top : ': 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,
|
||
|
|
':;': xml.dom.SyntaxErr,
|
||
|
|
': ;': xml.dom.SyntaxErr,
|
||
|
|
'0': xml.dom.SyntaxErr,
|
||
|
|
'0;': xml.dom.SyntaxErr,
|
||
|
|
';': xml.dom.SyntaxErr,
|
||
|
|
}
|
||
|
|
self.do_raise_r(tests)
|
||
|
|
|
||
|
|
def test_xVariable(self):
|
||
|
|
"CSSVariablesDeclaration.xVariable()"
|
||
|
|
v = cssutils.css.CSSVariablesDeclaration()
|
||
|
|
# unset
|
||
|
|
assert '' == v.getVariableValue('x')
|
||
|
|
# set
|
||
|
|
v.setVariable('x', '0')
|
||
|
|
assert '0' == v.getVariableValue('x')
|
||
|
|
assert '0' == v.getVariableValue('X')
|
||
|
|
assert 'x: 0' == v.cssText
|
||
|
|
v.setVariable('X', '0')
|
||
|
|
assert '0' == v.getVariableValue('x')
|
||
|
|
assert '0' == v.getVariableValue('X')
|
||
|
|
assert 'x: 0' == v.cssText
|
||
|
|
# remove
|
||
|
|
assert '0' == v.removeVariable('x')
|
||
|
|
assert '' == v.removeVariable('x')
|
||
|
|
assert '' == v.getVariableValue('x')
|
||
|
|
assert '' == v.cssText
|
||
|
|
|
||
|
|
def test_imports(self):
|
||
|
|
"CSSVariables imports"
|
||
|
|
|
||
|
|
def fetcher(url):
|
||
|
|
url = url.replace('\\', '/')
|
||
|
|
url = url[url.rfind('/') + 1 :]
|
||
|
|
return (
|
||
|
|
None,
|
||
|
|
{
|
||
|
|
'3.css': '''
|
||
|
|
@variables {
|
||
|
|
over3-2-1-0: 3;
|
||
|
|
over3-2-1: 3;
|
||
|
|
over3-2: 3;
|
||
|
|
over3-2-0: 3;
|
||
|
|
over3-1: 3;
|
||
|
|
over3-1-0: 3;
|
||
|
|
over3-0: 3;
|
||
|
|
local3: 3;
|
||
|
|
}
|
||
|
|
|
||
|
|
''',
|
||
|
|
'2.css': '''
|
||
|
|
@variables {
|
||
|
|
over3-2-1-0: 2;
|
||
|
|
over3-2-1: 2;
|
||
|
|
over3-2-0: 2;
|
||
|
|
over3-2: 2;
|
||
|
|
over2-1: 2;
|
||
|
|
over2-1-0: 2;
|
||
|
|
over2-0: 2;
|
||
|
|
local2: 2;
|
||
|
|
}
|
||
|
|
|
||
|
|
''',
|
||
|
|
'1.css': '''
|
||
|
|
@import "3.css";
|
||
|
|
@import "2.css";
|
||
|
|
@variables {
|
||
|
|
over3-2-1-0: 1;
|
||
|
|
over3-2-1: 1;
|
||
|
|
over3-1: 1;
|
||
|
|
over3-1-0: 1;
|
||
|
|
over2-1: 1;
|
||
|
|
over2-1-0: 1;
|
||
|
|
over1-0: 1;
|
||
|
|
local1: 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
''',
|
||
|
|
}[url],
|
||
|
|
)
|
||
|
|
|
||
|
|
css = '''
|
||
|
|
@import "1.css";
|
||
|
|
@variables {
|
||
|
|
over3-2-1-0: 0;
|
||
|
|
over3-2-0: 0;
|
||
|
|
over3-1-0: 0;
|
||
|
|
over2-1-0: 0;
|
||
|
|
over3-0: 0;
|
||
|
|
over2-0: 0;
|
||
|
|
over1-0: 0;
|
||
|
|
local0: 0;
|
||
|
|
}
|
||
|
|
a {
|
||
|
|
local0: var(local0);
|
||
|
|
local1: var(local1);
|
||
|
|
local2: var(local2);
|
||
|
|
local3: var(local3);
|
||
|
|
over1-0: var(over1-0);
|
||
|
|
over2-0: var(over2-0);
|
||
|
|
over3-0: var(over3-0);
|
||
|
|
over2-1: var(over2-1);
|
||
|
|
over3-1: var(over3-1);
|
||
|
|
over3-2: var(over3-2);
|
||
|
|
over2-1-0: var(over2-1-0);
|
||
|
|
over3-2-0: var(over3-2-0);
|
||
|
|
over3-2-1: var(over3-2-1);
|
||
|
|
over3-2-1-0: var(over3-2-1-0);
|
||
|
|
}
|
||
|
|
'''
|
||
|
|
p = cssutils.CSSParser(fetcher=fetcher)
|
||
|
|
s = p.parseString(css)
|
||
|
|
|
||
|
|
# only these in rule of this sheet
|
||
|
|
assert s.cssRules[1].variables.length == 8
|
||
|
|
# but all vars in s available!
|
||
|
|
assert s.variables.length == 15
|
||
|
|
assert [
|
||
|
|
'local0',
|
||
|
|
'local1',
|
||
|
|
'local2',
|
||
|
|
'local3',
|
||
|
|
'over1-0',
|
||
|
|
'over2-0',
|
||
|
|
'over2-1',
|
||
|
|
'over2-1-0',
|
||
|
|
'over3-0',
|
||
|
|
'over3-1',
|
||
|
|
'over3-1-0',
|
||
|
|
'over3-2',
|
||
|
|
'over3-2-0',
|
||
|
|
'over3-2-1',
|
||
|
|
'over3-2-1-0',
|
||
|
|
] == sorted(s.variables.keys())
|
||
|
|
|
||
|
|
# test with variables rule
|
||
|
|
cssutils.ser.prefs.resolveVariables = False
|
||
|
|
assert (
|
||
|
|
s.cssText
|
||
|
|
== b'''@import "1.css";
|
||
|
|
@variables {
|
||
|
|
over3-2-1-0: 0;
|
||
|
|
over3-2-0: 0;
|
||
|
|
over3-1-0: 0;
|
||
|
|
over2-1-0: 0;
|
||
|
|
over3-0: 0;
|
||
|
|
over2-0: 0;
|
||
|
|
over1-0: 0;
|
||
|
|
local0: 0
|
||
|
|
}
|
||
|
|
a {
|
||
|
|
local0: var(local0);
|
||
|
|
local1: var(local1);
|
||
|
|
local2: var(local2);
|
||
|
|
local3: var(local3);
|
||
|
|
over1-0: var(over1-0);
|
||
|
|
over2-0: var(over2-0);
|
||
|
|
over3-0: var(over3-0);
|
||
|
|
over2-1: var(over2-1);
|
||
|
|
over3-1: var(over3-1);
|
||
|
|
over3-2: var(over3-2);
|
||
|
|
over2-1-0: var(over2-1-0);
|
||
|
|
over3-2-0: var(over3-2-0);
|
||
|
|
over3-2-1: var(over3-2-1);
|
||
|
|
over3-2-1-0: var(over3-2-1-0)
|
||
|
|
}'''
|
||
|
|
)
|
||
|
|
|
||
|
|
# test with resolved vars
|
||
|
|
cssutils.ser.prefs.resolveVariables = True
|
||
|
|
assert (
|
||
|
|
s.cssText
|
||
|
|
== b'''@import "1.css";
|
||
|
|
a {
|
||
|
|
local0: 0;
|
||
|
|
local1: 1;
|
||
|
|
local2: 2;
|
||
|
|
local3: 3;
|
||
|
|
over1-0: 0;
|
||
|
|
over2-0: 0;
|
||
|
|
over3-0: 0;
|
||
|
|
over2-1: 1;
|
||
|
|
over3-1: 1;
|
||
|
|
over3-2: 2;
|
||
|
|
over2-1-0: 0;
|
||
|
|
over3-2-0: 0;
|
||
|
|
over3-2-1: 1;
|
||
|
|
over3-2-1-0: 0
|
||
|
|
}'''
|
||
|
|
)
|
||
|
|
|
||
|
|
s = cssutils.resolveImports(s)
|
||
|
|
assert (
|
||
|
|
s.cssText
|
||
|
|
== b'''/* START @import "1.css" */
|
||
|
|
/* START @import "3.css" */
|
||
|
|
/* START @import "2.css" */
|
||
|
|
a {
|
||
|
|
local0: 0;
|
||
|
|
local1: 1;
|
||
|
|
local2: 2;
|
||
|
|
local3: 3;
|
||
|
|
over1-0: 0;
|
||
|
|
over2-0: 0;
|
||
|
|
over3-0: 0;
|
||
|
|
over2-1: 1;
|
||
|
|
over3-1: 1;
|
||
|
|
over3-2: 2;
|
||
|
|
over2-1-0: 0;
|
||
|
|
over3-2-0: 0;
|
||
|
|
over3-2-1: 1;
|
||
|
|
over3-2-1-0: 0
|
||
|
|
}'''
|
||
|
|
)
|
||
|
|
|
||
|
|
def test_parentRule(self):
|
||
|
|
"CSSVariablesDeclaration.parentRule"
|
||
|
|
s = cssutils.parseString('@variables { a:1}')
|
||
|
|
r = s.cssRules[0]
|
||
|
|
d = r.variables
|
||
|
|
assert r == d.parentRule
|
||
|
|
|
||
|
|
d2 = cssutils.css.CSSVariablesDeclaration('b: 2')
|
||
|
|
r.variables = d2
|
||
|
|
assert r == d2.parentRule
|
||
|
|
|
||
|
|
def test_reprANDstr(self):
|
||
|
|
"CSSVariablesDeclaration.__repr__(), .__str__()"
|
||
|
|
s = cssutils.css.CSSVariablesDeclaration(cssText='a:1;b:2')
|
||
|
|
|
||
|
|
assert "2" in str(s) # length
|
||
|
|
|
||
|
|
s2 = eval(repr(s))
|
||
|
|
assert isinstance(s2, s.__class__)
|