File: //usr/local/bin/python37_/lib/python3.7/site-packages/cssutils/tests/test_cssrule.py
"""Testcases for cssutils.css.CSSRule"""
import xml.dom
from . import basetest
import cssutils.css
import pytest
class TestCSSRule(basetest.BaseTestCase):
"""
base class for all CSSRule subclass tests
overwrite setUp with the appriopriate values, will be used in
test_init and test_readonly
overwrite all tests as you please, use::
super(CLASSNAME, self).test_TESTNAME(params)
to use the base class tests too
"""
def setup(self):
"""
self.r is the rule
self.rRO the readonly rule
relf.r_type the type as defined in CSSRule
"""
self._setup_rule()
self.sheet = cssutils.css.CSSStyleSheet()
def _setup_rule(self):
self.r = cssutils.css.CSSRule()
self.rRO = cssutils.css.CSSRule()
self.rRO._readonly = True # must be set here!
self.r_type = cssutils.css.CSSRule.UNKNOWN_RULE
self.r_typeString = 'UNKNOWN_RULE'
def teardown(self):
cssutils.ser.prefs.useDefaults()
def test_init(self):
"CSSRule.type and init"
assert self.r_type == self.r.type
assert self.r_typeString == self.r.typeString
assert '' == self.r.cssText
assert self.r.parentRule is None
assert self.r.parentStyleSheet is None
def test_parentRule_parentStyleSheet_type(self): # noqa: C901
"CSSRule.parentRule .parentStyleSheet .type"
rules = [
('@charset "ascii";', cssutils.css.CSSRule.CHARSET_RULE),
('@import "x";', cssutils.css.CSSRule.IMPORT_RULE),
('@namespace "x";', cssutils.css.CSSRule.NAMESPACE_RULE),
('@font-face { src: url(x) }', cssutils.css.CSSRule.FONT_FACE_RULE),
(
'''@media all {
@x;
a { color: red }
/* c */
}''',
cssutils.css.CSSRule.MEDIA_RULE,
),
('@page :left { color: red }', cssutils.css.CSSRule.PAGE_RULE),
('@unknown;', cssutils.css.CSSRule.UNKNOWN_RULE),
('b { left: 0 }', cssutils.css.CSSRule.STYLE_RULE),
('/*1*/', cssutils.css.CSSRule.COMMENT), # must be last for add test
]
mrt = [
cssutils.css.CSSRule.UNKNOWN_RULE,
cssutils.css.CSSRule.STYLE_RULE,
cssutils.css.CSSRule.COMMENT,
]
def test(s):
for i, rule in enumerate(s):
assert rule.parentRule is None
assert rule.parentStyleSheet == s
# self.assertEqual(rule.type, rules[i][1])
if rule.MEDIA_RULE == rule.type:
for j, r in enumerate(rule):
assert r.parentRule == rule
assert r.parentStyleSheet == s
assert r.type == mrt[j]
if i == 0: # check encoding
assert 'ascii' == s.encoding
elif i == 2: # check namespaces
assert 'x' == s.namespaces['']
cssText = ''.join(r[0] for r in rules)
# parsing
s = cssutils.parseString(cssText)
test(s)
# sheet.cssText
s = cssutils.css.CSSStyleSheet()
s.cssText = cssText
test(s)
# sheet.add CSS
s = cssutils.css.CSSStyleSheet()
for css, type_ in rules:
s.add(css)
test(s)
# sheet.insertRule CSS
s = cssutils.css.CSSStyleSheet()
for css, type_ in rules:
s.insertRule(css)
test(s)
types = [
cssutils.css.CSSCharsetRule,
cssutils.css.CSSImportRule,
cssutils.css.CSSNamespaceRule,
cssutils.css.CSSFontFaceRule,
cssutils.css.CSSMediaRule,
cssutils.css.CSSPageRule,
cssutils.css.CSSUnknownRule,
cssutils.css.CSSStyleRule,
cssutils.css.CSSComment,
]
# sheet.add CSSRule
s = cssutils.css.CSSStyleSheet()
for i, (css, type_) in enumerate(rules):
rule = types[i]()
rule.cssText = css
s.add(rule)
test(s)
# sheet.insertRule CSSRule
s = cssutils.css.CSSStyleSheet()
for i, (css, type_) in enumerate(rules):
rule = types[i]()
rule.cssText = css
s.insertRule(rule)
test(s)
def test_CSSMediaRule_cssRules_parentRule_parentStyleSheet_type(self):
"CSSMediaRule.cssRules.parentRule .parentStyleSheet .type"
rules = [
('b { left: 0 }', cssutils.css.CSSRule.STYLE_RULE),
('/*1*/', cssutils.css.CSSRule.COMMENT),
('@x;', cssutils.css.CSSRule.UNKNOWN_RULE),
]
def test(s):
mr = s.cssRules[0]
for i, rule in enumerate(mr):
assert rule.parentRule == mr
assert rule.parentStyleSheet == s
assert rule.parentStyleSheet == mr.parentStyleSheet
assert rule.type == rules[i][1]
cssText = '@media all { %s }' % ''.join(r[0] for r in rules)
# parsing
s = cssutils.parseString(cssText)
test(s)
# sheet.cssText
s = cssutils.css.CSSStyleSheet()
s.cssText = cssText
test(s)
def getMediaSheet():
s = cssutils.css.CSSStyleSheet()
s.cssText = '@media all {}'
return s, s.cssRules[0]
# sheet.add CSS
s, mr = getMediaSheet()
for css, type_ in rules:
mr.add(css)
test(s)
# sheet.insertRule CSS
s, mr = getMediaSheet()
for css, type_ in rules:
mr.insertRule(css)
test(s)
types = [
cssutils.css.CSSStyleRule,
cssutils.css.CSSComment,
cssutils.css.CSSUnknownRule,
]
# sheet.add CSSRule
s, mr = getMediaSheet()
for i, (css, type_) in enumerate(rules):
rule = types[i]()
rule.cssText = css
mr.add(rule)
test(s)
# sheet.insertRule CSSRule
s, mr = getMediaSheet()
for i, (css, type_) in enumerate(rules):
rule = types[i]()
rule.cssText = css
mr.insertRule(rule)
test(s)
def test_readonly(self):
"CSSRule readonly"
self.rRO = cssutils.css.CSSRule()
self.rRO._readonly = True
assert self.rRO._readonly
assert '' == self.rRO.cssText
with pytest.raises(xml.dom.NoModificationAllowedErr):
self.rRO._setCssText('x')
assert '' == self.rRO.cssText
def _test_InvalidModificationErr(self, startwithspace):
"""
CSSRule.cssText InvalidModificationErr
called by subclasses
startwithspace
for test starting with this not the test but " test" is tested
e.g. " @page {}"
exception is the style rule test
"""
tests = (
'',
'/* comment */',
'@charset "utf-8";',
'@font-face {}',
'@import url(x);',
'@media all {}',
'@namespace "x";' '@page {}',
'@unknown;',
'@variables;',
# TODO:
# u'@top-left {}'
'a style rule {}',
)
for test in tests:
if startwithspace in ('a style rule',) and test in (
'/* comment */',
'a style rule {}',
):
continue
if test.startswith(startwithspace):
test = ' %s' % test
with pytest.raises(xml.dom.InvalidModificationErr):
self.r._setCssText(test)
# check that type is readonly
with pytest.raises(AttributeError):
self.r.__setattr__('parentRule', None)
with pytest.raises(AttributeError):
self.r.__setattr__('parentStyleSheet', None)
with pytest.raises(AttributeError):
self.r.__setattr__('type', 1)
with pytest.raises(AttributeError):
self.r.__setattr__('typeString', "")