%PDF- %PDF-
| Direktori : /lib/python3/dist-packages/cssutils/tests/ |
| Current File : //lib/python3/dist-packages/cssutils/tests/test_cssmediarule.py |
"""Testcases for cssutils.css.CSSMediaRule"""
import xml.dom
from . import test_cssrule
import cssutils
class CSSMediaRuleTestCase(test_cssrule.CSSRuleTestCase):
def setUp(self):
super(CSSMediaRuleTestCase, self).setUp()
self.r = cssutils.css.CSSMediaRule()
self.rRO = cssutils.css.CSSMediaRule(readonly=True)
self.r_type = cssutils.css.CSSMediaRule.MEDIA_RULE
self.r_typeString = 'MEDIA_RULE'
# for tests
self.stylerule = cssutils.css.CSSStyleRule()
self.stylerule.cssText = 'a {}'
def test_init(self):
"CSSMediaRule.__init__()"
super(CSSMediaRuleTestCase, self).test_init()
r = cssutils.css.CSSMediaRule()
self.assertEqual(cssutils.css.CSSRuleList, type(r.cssRules))
self.assertEqual([], r.cssRules)
self.assertEqual('', r.cssText)
self.assertEqual(cssutils.stylesheets.MediaList, type(r.media))
self.assertEqual('all', r.media.mediaText)
self.assertEqual(None, r.name)
r = cssutils.css.CSSMediaRule(mediaText='print', name='name')
self.assertEqual(cssutils.css.CSSRuleList, type(r.cssRules))
self.assertEqual([], r.cssRules)
self.assertEqual('', r.cssText)
self.assertEqual(cssutils.stylesheets.MediaList, type(r.media))
self.assertEqual('print', r.media.mediaText)
self.assertEqual('name', r.name)
# only possible to set @... similar name
self.assertRaises(xml.dom.InvalidModificationErr, self.r._setAtkeyword, 'x')
def test_iter(self):
"CSSMediaRule.__iter__()"
m = cssutils.css.CSSMediaRule()
m.cssText = '''@media all { /*1*/a { left: 0} b{ top:0} }'''
types = [cssutils.css.CSSRule.COMMENT,
cssutils.css.CSSRule.STYLE_RULE,
cssutils.css.CSSRule.STYLE_RULE]
for i, rule in enumerate(m):
self.assertEqual(rule, m.cssRules[i])
self.assertEqual(rule.type, types[i])
self.assertEqual(rule.parentRule, m)
def test_refs(self):
"""CSSStylesheet references"""
s = cssutils.parseString('@media all {a {color: red}}')
r = s.cssRules[0]
rules = r.cssRules
self.assertEqual(r.cssRules[0].parentStyleSheet, s)
self.assertEqual(rules[0].parentStyleSheet, s)
# set cssText
r.cssText = '@media all {a {color: blue}}'
# not anymore: self.assertEqual(rules, r.cssRules)
# set cssRules
r.cssRules = cssutils.parseString('''
/**/
@x;
b {}').cssRules''').cssRules
# new object
self.assertNotEqual(rules, r.cssRules)
for i, sr in enumerate(r.cssRules):
self.assertEqual(sr.parentStyleSheet, s)
self.assertEqual(sr.parentRule, r)
def test_cssRules(self):
"CSSMediaRule.cssRules"
r = cssutils.css.CSSMediaRule()
self.assertEqual([], r.cssRules)
sr = cssutils.css.CSSStyleRule()
r.cssRules.append(sr)
self.assertEqual([sr], r.cssRules)
ir = cssutils.css.CSSImportRule()
self.assertRaises(xml.dom.HierarchyRequestErr, r.cssRules.append, ir)
s = cssutils.parseString('@media all { /*1*/a {x:1} }')
m = s.cssRules[0]
self.assertEqual(2, m.cssRules.length)
del m.cssRules[0]
self.assertEqual(1, m.cssRules.length)
m.cssRules.append('/*2*/')
self.assertEqual(2, m.cssRules.length)
m.cssRules.extend(cssutils.parseString('/*3*/x {y:2}').cssRules)
self.assertEqual(4, m.cssRules.length)
self.assertEqual('@media all {\n a {\n x: 1\n }\n /*2*/\n /*3*/\n x {\n y: 2\n }\n }',
m.cssText)
for rule in m.cssRules:
self.assertEqual(rule.parentStyleSheet, s)
self.assertEqual(rule.parentRule, m)
def test_cssText(self):
"CSSMediaRule.cssText"
style = '''{
a {
color: red
}
}'''
mls = {
' (min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx) ': None,
' tv ': None,
' only tv ': None,
' not tv ': None,
' only tv and (color) ': None,
' only tv and(color)': ' only tv and (color) ',
' only tv and (color: red) ': None,
' only tv and (color: red) and (width: 100px) ': None,
' only tv and (color: red) and (width: 100px), tv ': None,
' only tv and (color: red) and (width: 100px), tv and (width: 20px) ': None,
' only tv and(color :red)and( width :100px ) ,tv and(width: 20px) ':
' only tv and (color: red) and (width: 100px), tv and (width: 20px) ',
' (color: red) and (width: 100px), (width: 20px) ': None,
' /*1*/ only /*2*/ tv /*3*/ and /*4*/ (/*5*/ width) /*5*/ /*6*/, (color) and (height) ': None,
'(color)and(width),(height)': ' (color) and (width), (height) '
}
tests = {}
for b, a in list(mls.items()):
if a is None:
a = b
tests['@media%s%s' % (b, style)] = '@media%s%s' % (a, style)
self.do_equal_p(tests)
self.do_equal_r(tests)
tests = {
'@media only tv{}': '',
'@media not tv{}': '',
'@media only tv and (color){}': '',
'@media only tv and (color: red){}': '',
'@media only tv and (color: red) and (width: 100px){}': '',
'@media only tv and (color: red) and (width: 100px), tv{}': '',
'@media only tv and (color: red) and (width: 100px), tv and (width: 20px){}': '',
'@media (color: red) and (width: 100px), (width: 20px){}': '',
'@media (width){}': '',
'@media (width:10px){}': '',
'@media (width), (color){}': '',
'@media (width) , (color),(height){}': '',
'@media (width) , (color) and (height){}': '',
'@media (width) and (color){}': '',
'@media all and (width){}': '',
'@media all and (width:10px){}': '',
'@media all and (width), (color){}': '',
'@media all and (width) , (color),(height){}': '',
'@media all and (width) , (color) and (height){}': '',
'@media all and (width) and (color){}': '',
'@media only tv and (width){}': '',
'@media only tv and (width:10px){}': '',
'@media only tv and (width), (color){}': '',
'@media only tv and (width) , (color),(height){}': '',
'@media only tv and (width) , (color) and (height){}': '',
'@media only tv and (width) and (color){}': '',
'@media only tv and (width) "name" {}': '',
'@media only tv and (width:10px) "name" {}': '',
'@media only tv and (width), (color){}': '',
'@media only tv and (width) , (color),(height){}': '',
'@media only tv and (width) , (color) and (height){}': '',
'@media only tv and (width) and (color){}': '',
'@media all "name"{}': '',
'@media all {}': '',
'@media/*x*/all{}': '',
'@media all { a{ x: 1} }': '@media all {\n a {\n x: 1\n }\n }',
'@media all "name" { a{ x: 1} }': '@media all "name" {\n a {\n x: 1\n }\n }',
'@MEDIA all { a{x:1} }': '@media all {\n a {\n x: 1\n }\n }',
'@\\media all { a{x:1} }': '@media all {\n a {\n x: 1\n }\n }',
'@media all {@x some;a{color: red;}b{color: green;}}':
'''@media all {
@x some;
a {
color: red
}
b {
color: green
}
}''',
'@media all { @x{}}': '@media all {\n @x {\n }\n }',
'@media all "n" /**/ { @x{}}':
'@media all "n" /**/ {\n @x {\n }\n }',
# comments
'@media/*1*//*2*/all/*3*//*4*/{/*5*/a{x:1}}':
'@media /*1*/ /*2*/ all /*3*/ /*4*/ {\n /*5*/\n a {\n x: 1\n }\n }',
'@media /*1*/ /*2*/ all /*3*/ /*4*/ { /*5*/ a{ x: 1} }':
'@media /*1*/ /*2*/ all /*3*/ /*4*/ {\n /*5*/\n a {\n x: 1\n }\n }',
# WS
'@media\n\t\f all\n\t\f {\n\t\f a{ x: 1}\n\t\f }':
'@media all {\n a {\n x: 1\n }\n }',
# @page rule inside @media
'@media all { @page { margin: 0; } }':
'@media all {\n @page {\n margin: 0\n }\n }',
# nested media rules
'@media all { @media all { p { color: red; } } }':
'@media all {\n @media all {\n p {\n '
'color: red\n }\n }\n }',
}
self.do_equal_p(tests)
self.do_equal_r(tests)
tests = {
'@media {}': xml.dom.SyntaxErr,
'@media;': xml.dom.SyntaxErr,
'@media/*only comment*/{}': xml.dom.SyntaxErr,
'@media all;': xml.dom.SyntaxErr,
'@media all "n";': xml.dom.SyntaxErr,
'@media all; @x{}': xml.dom.SyntaxErr,
'@media { a{ x: 1} }': xml.dom.SyntaxErr,
'@media "name" { a{ x: 1} }': xml.dom.SyntaxErr,
'@media "name" all { a{ x: 1} }': xml.dom.SyntaxErr,
'@media all { @charset "x"; a{}}': xml.dom.HierarchyRequestErr,
'@media all { @import "x"; a{}}': xml.dom.HierarchyRequestErr,
'@media all { , }': xml.dom.SyntaxErr,
'@media all {}EXTRA': xml.dom.SyntaxErr,
'@media ({}': xml.dom.SyntaxErr,
'@media (color{}': xml.dom.SyntaxErr,
'@media (color:{}': xml.dom.SyntaxErr,
'@media (color:red{}': xml.dom.SyntaxErr,
'@media (:red){}': xml.dom.SyntaxErr,
'@media (:){}': xml.dom.SyntaxErr,
'@media color:red){}': xml.dom.SyntaxErr,
}
self.do_raise_p(tests)
self.do_raise_r(tests)
tests = {
# extra stuff
'@media all { x{} } a{}': xml.dom.SyntaxErr,
}
self.do_raise_r(tests)
m = cssutils.css.CSSMediaRule()
m.cssText = '''@media all {@x; /*1*/a{color: red;}}'''
for r in m.cssRules:
self.assertEqual(m, r.parentRule)
self.assertEqual(m.parentStyleSheet, r.parentStyleSheet)
cssutils.ser.prefs.useDefaults()
def test_media(self):
"CSSMediaRule.media"
# see CSSImportRule.media
# setting not allowed
self.assertRaises(AttributeError,
self.r.__setattr__, 'media', None)
self.assertRaises(AttributeError,
self.r.__setattr__, 'media', 0)
# set mediaText instead
self.r.media.mediaText = 'print'
self.r.insertRule(self.stylerule)
self.assertEqual('', self.r.cssText)
cssutils.ser.prefs.keepEmptyRules = True
self.assertEqual('@media print {\n a {}\n }', self.r.cssText)
cssutils.ser.prefs.useDefaults()
def test_name(self):
"CSSMediaRule.name"
r = cssutils.css.CSSMediaRule()
r.cssText = '@media all "\\n\\"ame" {a{left: 0}}'
self.assertEqual('\\n"ame', r.name)
r.name = "n"
self.assertEqual('n', r.name)
self.assertEqual('@media all "n" {\n a {\n left: 0\n }\n }',
r.cssText)
r.name = '"'
self.assertEqual('"', r.name)
self.assertEqual('@media all "\\"" {\n a {\n left: 0\n }\n }',
r.cssText)
r.name = ''
self.assertEqual(None, r.name)
self.assertEqual('@media all {\n a {\n left: 0\n }\n }',
r.cssText)
r.name = None
self.assertEqual(None, r.name)
self.assertEqual('@media all {\n a {\n left: 0\n }\n }',
r.cssText)
self.assertRaises(xml.dom.SyntaxErr, r._setName, 0)
self.assertRaises(xml.dom.SyntaxErr, r._setName, 123)
def test_deleteRuleIndex(self):
"CSSMediaRule.deleteRule(index)"
# see CSSStyleSheet.deleteRule
m = cssutils.css.CSSMediaRule()
m.cssText = '''@media all {
@a;
/* x */
@b;
@c;
@d;
}'''
self.assertEqual(5, m.cssRules.length)
self.assertRaises(xml.dom.IndexSizeErr, m.deleteRule, 5)
# end -1
# check parentRule
r = m.cssRules[-1]
self.assertEqual(m, r.parentRule)
m.deleteRule(-1)
self.assertEqual(None, r.parentRule)
self.assertEqual(4, m.cssRules.length)
self.assertEqual(
'@media all {\n @a;\n /* x */\n @b;\n @c;\n }', m.cssText)
# beginning
m.deleteRule(0)
self.assertEqual(3, m.cssRules.length)
self.assertEqual('@media all {\n /* x */\n @b;\n @c;\n }', m.cssText)
# middle
m.deleteRule(1)
self.assertEqual(2, m.cssRules.length)
self.assertEqual('@media all {\n /* x */\n @c;\n }', m.cssText)
# end
m.deleteRule(1)
self.assertEqual(1, m.cssRules.length)
self.assertEqual('@media all {\n /* x */\n }', m.cssText)
def test_deleteRule(self):
"CSSMediaRule.deleteRule(rule)"
m = cssutils.css.CSSMediaRule()
m.cssText='''@media all {
a { color: red; }
b { color: blue; }
c { color: green; }
}'''
s1, s2, s3 = m.cssRules
r = cssutils.css.CSSStyleRule()
self.assertRaises(xml.dom.IndexSizeErr, m.deleteRule, r)
self.assertEqual(3, m.cssRules.length)
m.deleteRule(s2)
self.assertEqual(2, m.cssRules.length)
self.assertEqual(m.cssText, '@media all {\n a {\n color: red\n }\n c {\n color: green\n }\n }')
self.assertRaises(xml.dom.IndexSizeErr, m.deleteRule, s2)
def test_add(self):
"CSSMediaRule.add()"
# see CSSStyleSheet.add
r = cssutils.css.CSSMediaRule()
stylerule1 = cssutils.css.CSSStyleRule()
stylerule2 = cssutils.css.CSSStyleRule()
r.add(stylerule1)
r.add(stylerule2)
self.assertEqual(r.cssRules[0], stylerule1)
self.assertEqual(r.cssRules[1], stylerule2)
def test_insertRule(self):
"CSSMediaRule.insertRule"
# see CSSStyleSheet.insertRule
r = cssutils.css.CSSMediaRule()
charsetrule = cssutils.css.CSSCharsetRule('ascii')
importrule = cssutils.css.CSSImportRule('x')
namespacerule = cssutils.css.CSSNamespaceRule()
pagerule = cssutils.css.CSSPageRule()
unknownrule = cssutils.css.CSSUnknownRule('@x;')
stylerule = cssutils.css.CSSStyleRule('a')
stylerule.cssText = 'a { x: 1}'
comment1 = cssutils.css.CSSComment('/*1*/')
comment2 = cssutils.css.CSSComment('/*2*/')
# hierarchy
self.assertRaises(xml.dom.HierarchyRequestErr,
r.insertRule, charsetrule, 0)
self.assertRaises(xml.dom.HierarchyRequestErr,
r.insertRule, importrule, 0)
self.assertRaises(xml.dom.HierarchyRequestErr,
r.insertRule, namespacerule, 0)
# start insert
r.insertRule(stylerule, 0)
self.assertEqual(r, stylerule.parentRule)
self.assertEqual(r.parentStyleSheet, stylerule.parentStyleSheet)
# before
r.insertRule(comment1, 0)
self.assertEqual(r, comment1.parentRule)
self.assertEqual(r.parentStyleSheet, stylerule.parentStyleSheet)
# end explicit
r.insertRule(unknownrule, 2)
self.assertEqual(r, unknownrule.parentRule)
self.assertEqual(r.parentStyleSheet, stylerule.parentStyleSheet)
# end implicit
r.insertRule(comment2)
self.assertEqual(r, comment2.parentRule)
self.assertEqual(r.parentStyleSheet, stylerule.parentStyleSheet)
self.assertEqual(
'@media all {\n /*1*/\n a {\n x: 1\n }\n @x;\n /*2*/\n }',
r.cssText)
# index
self.assertRaises(xml.dom.IndexSizeErr,
r.insertRule, stylerule, -1)
self.assertRaises(xml.dom.IndexSizeErr,
r.insertRule, stylerule, r.cssRules.length + 1)
def test_InvalidModificationErr(self):
"CSSMediaRule.cssText InvalidModificationErr"
self._test_InvalidModificationErr('@media')
def test_incomplete(self):
"CSSMediaRule (incomplete)"
tests = {
'@media all { @unknown;': # no }
'@media all {\n @unknown;\n }',
'@media all { a {x:"1"}': # no }
'@media all {\n a {\n x: "1"\n }\n }',
'@media all { a {x:"1"': # no }}
'@media all {\n a {\n x: "1"\n }\n }',
'@media all { a {x:"1': # no "}}
'@media all {\n a {\n x: "1"\n }\n }',
}
self.do_equal_p(tests) # parse
def test_reprANDstr(self):
"CSSMediaRule.__repr__(), .__str__()"
mediaText='tv, print'
s = cssutils.css.CSSMediaRule(mediaText=mediaText)
self.assertTrue(mediaText in str(s))
s2 = eval(repr(s))
self.assertTrue(isinstance(s2, s.__class__))
self.assertTrue(mediaText == s2.media.mediaText)
if __name__ == '__main__':
import unittest
unittest.main()