216 lines
8.2 KiB
Python
216 lines
8.2 KiB
Python
|
|
"""Testcases for cssutils.css.CSSImportRule"""
|
||
|
|
|
||
|
|
import xml.dom
|
||
|
|
from . import test_cssrule
|
||
|
|
import cssutils
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
|
||
|
|
class TestCSSNamespaceRule(test_cssrule.TestCSSRule):
|
||
|
|
def _setup_rule(self):
|
||
|
|
self.r = cssutils.css.CSSNamespaceRule(namespaceURI='x')
|
||
|
|
# self.rRO = cssutils.css.CSSNamespaceRule(namespaceURI='x',
|
||
|
|
# readonly=True)
|
||
|
|
self.r_type = cssutils.css.CSSRule.NAMESPACE_RULE
|
||
|
|
self.r_typeString = 'NAMESPACE_RULE'
|
||
|
|
|
||
|
|
def test_init(self):
|
||
|
|
"CSSNamespaceRule.__init__()"
|
||
|
|
tests = [
|
||
|
|
(None, None),
|
||
|
|
('', ''),
|
||
|
|
(None, ''),
|
||
|
|
('', None),
|
||
|
|
('', 'no-uri'),
|
||
|
|
]
|
||
|
|
for uri, p in tests:
|
||
|
|
r = cssutils.css.CSSNamespaceRule(namespaceURI=uri, prefix=p)
|
||
|
|
assert r.namespaceURI is None
|
||
|
|
assert '' == r.prefix
|
||
|
|
assert '' == r.cssText
|
||
|
|
assert r.parentStyleSheet is None
|
||
|
|
assert r.parentRule is None
|
||
|
|
|
||
|
|
r = cssutils.css.CSSNamespaceRule(namespaceURI='example')
|
||
|
|
assert 'example' == r.namespaceURI
|
||
|
|
assert '' == r.prefix
|
||
|
|
assert '@namespace "example";' == r.cssText
|
||
|
|
self.sheet.add(r)
|
||
|
|
assert self.sheet == r.parentStyleSheet
|
||
|
|
|
||
|
|
r = cssutils.css.CSSNamespaceRule(namespaceURI='example', prefix='p')
|
||
|
|
assert 'example' == r.namespaceURI
|
||
|
|
assert 'p' == r.prefix
|
||
|
|
assert '@namespace p "example";' == r.cssText
|
||
|
|
|
||
|
|
css = '@namespace p "u";'
|
||
|
|
r = cssutils.css.CSSNamespaceRule(cssText=css)
|
||
|
|
assert r.cssText == css
|
||
|
|
|
||
|
|
# only possible to set @... similar name
|
||
|
|
with pytest.raises(xml.dom.InvalidModificationErr):
|
||
|
|
self.r._setAtkeyword('x')
|
||
|
|
|
||
|
|
def test_cssText(self):
|
||
|
|
"CSSNamespaceRule.cssText"
|
||
|
|
# cssText may only be set initalially
|
||
|
|
r = cssutils.css.CSSNamespaceRule()
|
||
|
|
css = '@namespace p "u";'
|
||
|
|
r.cssText = css
|
||
|
|
assert r.cssText == css
|
||
|
|
with pytest.raises(xml.dom.NoModificationAllowedErr):
|
||
|
|
r._setCssText('@namespace p "OTHER";')
|
||
|
|
|
||
|
|
tests = {
|
||
|
|
'@namespace "";': None,
|
||
|
|
'@namespace "u";': None,
|
||
|
|
'@namespace empty "";': None,
|
||
|
|
'@namespace p "p";': None,
|
||
|
|
"@namespace p 'u';": '@namespace p "u";',
|
||
|
|
'@\\namespace p "u";': '@namespace p "u";',
|
||
|
|
'@NAMESPACE p "u";': '@namespace p "u";',
|
||
|
|
'@namespace p "u" ;': '@namespace p "u";',
|
||
|
|
'@namespace p"u";': '@namespace p "u";',
|
||
|
|
'@namespace p "u";': '@namespace p "u";',
|
||
|
|
'@namespace/*1*/"u"/*2*/;': '@namespace /*1*/ "u" /*2*/;',
|
||
|
|
'@namespace/*1*/p/*2*/"u"/*3*/;': '@namespace /*1*/ p /*2*/ "u" /*3*/;',
|
||
|
|
'@namespace p url(u);': '@namespace p "u";',
|
||
|
|
'@namespace p url(\'u\');': '@namespace p "u";',
|
||
|
|
'@namespace p url(\"u\");': '@namespace p "u";',
|
||
|
|
'@namespace p url( \"u\" );': '@namespace p "u";',
|
||
|
|
# comments
|
||
|
|
'@namespace/*1*//*2*/p/*3*//*4*/url(u)/*5*//*6*/;': '@namespace /*1*/ /*2*/ p /*3*/ /*4*/ "u" /*5*/ /*6*/;',
|
||
|
|
'@namespace/*1*//*2*/p/*3*//*4*/"u"/*5*//*6*/;': '@namespace /*1*/ /*2*/ p /*3*/ /*4*/ "u" /*5*/ /*6*/;',
|
||
|
|
'@namespace/*1*//*2*/p/*3*//*4*/url("u")/*5*//*6*/;': '@namespace /*1*/ /*2*/ p /*3*/ /*4*/ "u" /*5*/ /*6*/;',
|
||
|
|
'@namespace/*1*//*2*/url(u)/*5*//*6*/;': '@namespace /*1*/ /*2*/ "u" /*5*/ /*6*/;',
|
||
|
|
# WS
|
||
|
|
'@namespace\n\r\t\f p\n\r\t\f url(\n\r\t\f u\n\r\t\f )\n\r\t\f ;': '@namespace p "u";',
|
||
|
|
'@namespace\n\r\t\f p\n\r\t\f url(\n\r\t\f "u"\n\r\t\f )\n\r\t\f ;': '@namespace p "u";',
|
||
|
|
'@namespace\n\r\t\f p\n\r\t\f "str"\n\r\t\f ;': '@namespace p "str";',
|
||
|
|
'@namespace\n\r\t\f "str"\n\r\t\f ;': '@namespace "str";',
|
||
|
|
}
|
||
|
|
self.do_equal_p(tests)
|
||
|
|
# self.do_equal_r(tests) # cannot use here as always new r is needed
|
||
|
|
for test, expected in list(tests.items()):
|
||
|
|
r = cssutils.css.CSSNamespaceRule(cssText=test)
|
||
|
|
if expected is None:
|
||
|
|
expected = test
|
||
|
|
assert expected == r.cssText
|
||
|
|
|
||
|
|
tests = {
|
||
|
|
'@namespace;': xml.dom.SyntaxErr, # nothing
|
||
|
|
'@namespace p;': xml.dom.SyntaxErr, # no namespaceURI
|
||
|
|
'@namespace "u" p;': xml.dom.SyntaxErr, # order
|
||
|
|
'@namespace "u";EXTRA': xml.dom.SyntaxErr,
|
||
|
|
'@namespace p "u";EXTRA': xml.dom.SyntaxErr,
|
||
|
|
}
|
||
|
|
self.do_raise_p(tests) # parse
|
||
|
|
tests.update(
|
||
|
|
{
|
||
|
|
'@namespace p url(x)': xml.dom.SyntaxErr, # missing ;
|
||
|
|
'@namespace p "u"': xml.dom.SyntaxErr, # missing ;
|
||
|
|
# trailing
|
||
|
|
'@namespace "u"; ': xml.dom.SyntaxErr,
|
||
|
|
'@namespace "u";/**/': xml.dom.SyntaxErr,
|
||
|
|
'@namespace p "u"; ': xml.dom.SyntaxErr,
|
||
|
|
'@namespace p "u";/**/': xml.dom.SyntaxErr,
|
||
|
|
}
|
||
|
|
)
|
||
|
|
|
||
|
|
def _do(test):
|
||
|
|
cssutils.css.CSSNamespaceRule(cssText=test)
|
||
|
|
|
||
|
|
for test, expected in list(tests.items()):
|
||
|
|
with pytest.raises(expected):
|
||
|
|
_do(test)
|
||
|
|
|
||
|
|
def test_namespaceURI(self):
|
||
|
|
"CSSNamespaceRule.namespaceURI"
|
||
|
|
# set only initially
|
||
|
|
r = cssutils.css.CSSNamespaceRule(namespaceURI='x')
|
||
|
|
assert 'x' == r.namespaceURI
|
||
|
|
assert '@namespace "x";' == r.cssText
|
||
|
|
|
||
|
|
r = cssutils.css.CSSNamespaceRule(namespaceURI='"')
|
||
|
|
assert '@namespace "\\"";' == r.cssText
|
||
|
|
|
||
|
|
with pytest.raises(xml.dom.NoModificationAllowedErr):
|
||
|
|
r._setNamespaceURI('x')
|
||
|
|
|
||
|
|
with pytest.raises(xml.dom.NoModificationAllowedErr):
|
||
|
|
r._setCssText('@namespace "u";')
|
||
|
|
|
||
|
|
r._replaceNamespaceURI('http://example.com/new')
|
||
|
|
assert 'http://example.com/new' == r.namespaceURI
|
||
|
|
|
||
|
|
def test_prefix(self):
|
||
|
|
"CSSNamespaceRule.prefix"
|
||
|
|
r = cssutils.css.CSSNamespaceRule(namespaceURI='u')
|
||
|
|
r.prefix = 'p'
|
||
|
|
assert 'p' == r.prefix
|
||
|
|
assert '@namespace p "u";' == r.cssText
|
||
|
|
|
||
|
|
r = cssutils.css.CSSNamespaceRule(cssText='@namespace x "u";')
|
||
|
|
r.prefix = 'p'
|
||
|
|
assert 'p' == r.prefix
|
||
|
|
assert '@namespace p "u";' == r.cssText
|
||
|
|
|
||
|
|
valid = (None, '')
|
||
|
|
for prefix in valid:
|
||
|
|
r.prefix = prefix
|
||
|
|
assert r.prefix == ''
|
||
|
|
assert '@namespace "u";' == r.cssText
|
||
|
|
|
||
|
|
valid = ('a', '_x', 'a1', 'a-1')
|
||
|
|
for prefix in valid:
|
||
|
|
r.prefix = prefix
|
||
|
|
assert r.prefix == prefix
|
||
|
|
assert '@namespace %s "u";' % prefix == r.cssText
|
||
|
|
|
||
|
|
invalid = ('1', ' x', ' ', ',')
|
||
|
|
for prefix in invalid:
|
||
|
|
with pytest.raises(xml.dom.SyntaxErr):
|
||
|
|
r._setPrefix(prefix)
|
||
|
|
|
||
|
|
def test_InvalidModificationErr(self):
|
||
|
|
"CSSNamespaceRule.cssText InvalidModificationErr"
|
||
|
|
self._test_InvalidModificationErr('@namespace')
|
||
|
|
|
||
|
|
def test_incomplete(self):
|
||
|
|
"CSSNamespaceRule (incomplete)"
|
||
|
|
tests = {
|
||
|
|
'@namespace "uri': '@namespace "uri";',
|
||
|
|
"@namespace url(x": '@namespace "x";',
|
||
|
|
"@namespace url('x": '@namespace "x";',
|
||
|
|
'@namespace url("x;': '@namespace "x;";',
|
||
|
|
'@namespace url( "x;': '@namespace "x;";',
|
||
|
|
'@namespace url("x ': '@namespace "x ";',
|
||
|
|
'@namespace url(x ': '@namespace "x";',
|
||
|
|
}
|
||
|
|
self.do_equal_p(tests) # parse
|
||
|
|
tests = {
|
||
|
|
'@namespace "uri': xml.dom.SyntaxErr,
|
||
|
|
"@namespace url(x": xml.dom.SyntaxErr,
|
||
|
|
"@namespace url('x": xml.dom.SyntaxErr,
|
||
|
|
'@namespace url("x;': xml.dom.SyntaxErr,
|
||
|
|
'@namespace url( "x;': xml.dom.SyntaxErr,
|
||
|
|
'@namespace url("x ': xml.dom.SyntaxErr,
|
||
|
|
'@namespace url(x ': xml.dom.SyntaxErr,
|
||
|
|
}
|
||
|
|
self.do_raise_r(tests) # set cssText
|
||
|
|
|
||
|
|
def test_reprANDstr(self):
|
||
|
|
"CSSNamespaceRule.__repr__(), .__str__()"
|
||
|
|
namespaceURI = 'http://example.com'
|
||
|
|
prefix = 'prefix'
|
||
|
|
|
||
|
|
s = cssutils.css.CSSNamespaceRule(namespaceURI=namespaceURI, prefix=prefix)
|
||
|
|
|
||
|
|
assert namespaceURI in str(s)
|
||
|
|
assert prefix in str(s)
|
||
|
|
|
||
|
|
s2 = eval(repr(s))
|
||
|
|
assert isinstance(s2, s.__class__)
|
||
|
|
assert namespaceURI == s2.namespaceURI
|
||
|
|
assert prefix == s2.prefix
|