%PDF- %PDF-
| Direktori : /lib/python3/dist-packages/cssutils/tests/ |
| Current File : //lib/python3/dist-packages/cssutils/tests/test_profiles.py |
"""Testcases for cssutils.css.CSSValue and CSSPrimitiveValue."""
__version__ = '$Id: test_cssvalue.py 1443 2008-08-31 13:54:39Z cthedot $'
import sys
import platform
from . import basetest
import cssutils
CSS2 = (cssutils.profile.CSS_LEVEL_2,)
C3BUI = (cssutils.profile.CSS3_BASIC_USER_INTERFACE,)
C3BB = (cssutils.profile.CSS3_BACKGROUNDS_AND_BORDERS,)
CM3 = (cssutils.profile.CSS3_COLOR,)
FM3 = (cssutils.profile.CSS3_FONTS,)
C3PM = (cssutils.profile.CSS3_PAGED_MEDIA,)
C3T = (cssutils.profile.CSS3_TEXT,)
FM3FF = (cssutils.profile.CSS3_FONT_FACE,)
CSS2_CM3 = (CM3[0], CSS2[0])
CSS2_FM3 = (FM3[0], CSS2[0])
class ProfilesTestCase(basetest.BaseTestCase):
M1 = {
'testvalue': 'x'
}
P1 = {
'-test-tokenmacro': '({num}{w}){1,2}',
'-test-macro': '{ident}|{percentage}',
'-test-custommacro': '{testvalue}',
# custom validation function
'-test-funcval': lambda v: int(v) > 0
}
def test_knownNames(self):
"Profiles.knownNames"
p = cssutils.profiles.Profiles()
p.removeProfile(all=True)
p.addProfile('test', self.P1, self.M1)
self.assertEqual(p.knownNames, list(self.P1.keys()))
p.removeProfile(all=True)
self.assertEqual(p.knownNames, [])
def test_profiles(self):
"Profiles.profiles"
p = cssutils.profiles.Profiles()
p.removeProfile(all=True)
p.addProfile('test', self.P1, self.M1)
self.assertEqual(p.profiles, ['test'])
p.removeProfile(all=True)
self.assertEqual(p.profiles, [])
def test_validate2(self):
"Profiles.validate()"
#save
saved = cssutils.profile
# test
p = cssutils.profiles.Profiles()
cssutils.profile = p
pvs = [('color', 'red'),
('color', 'rgba(0,0,0,0)'),
('color', 'XXX')
]
def check(*results):
for i, pv in enumerate(pvs):
self.assertEqual(p.validate(*pv), results[i])
check(True, True, False)
p.removeProfile(p.CSS3_COLOR)
check(True, False, False)
cssutils.profile.addProfile('test', {}, {'color': 'XXX'})
check(False, False, True)
p.removeProfile(all=True)
check(False, False, False)
# TODO: validateWithProfile
# restore
cssutils.profile = saved
def test_addProfile(self):
"Profiles.addProfile with custom validation function"
# unknown profile
self.assertRaises(cssutils.profiles.NoSuchProfileException,
lambda: list(cssutils.profile.propertiesByProfile('NOTSET')) )
# new profile
cssutils.profile.addProfile('test', self.P1, self.M1)
props = list(self.P1.keys())
props.sort()
self.assertEqual(props, list(cssutils.profile.propertiesByProfile('test')))
cssutils.log.raiseExceptions = False
tests = {
('-test-tokenmacro', '1'): True,
('-test-tokenmacro', '1 -2'): True,
('-test-tokenmacro', '1 2 3'): False,
('-test-tokenmacro', 'a'): False,
('-test-macro', 'a'): True,
('-test-macro', '0.1%'): True,
('-test-custommacro', 'x'): True,
('-test-custommacro', '1'): False,
('-test-custommacro', 'y'): False,
('-test-funcval', '1'): True,
('-test-funcval', '-1'): False,
('-test-funcval', 'x'): False
}
for test, v in list(tests.items()):
self.assertEqual(v, cssutils.profile.validate(*test))
self.assertEqual((v, v, ['test']),
cssutils.profile.validateWithProfile(*test))
cssutils.log.raiseExceptions = True
# raises:
expmsg = "invalid literal for int() with base 10: 'x'"
# Python upto 2.4 and Jython have different msg format...
if sys.version_info[0:2] == (2,4):
expmsg = "invalid literal for int(): x"
elif sys.platform.startswith('java'):
expmsg = "invalid literal for int() with base 10: x"
# PyPy adds the u prefix, but only in versions lower than Python 3
elif (platform.python_implementation() == "PyPy" and
sys.version_info < (3, 0)):
expmsg = "invalid literal for int() with base 10: u'x'"
self.assertRaisesMsg(Exception, expmsg,
cssutils.profile.validate, '-test-funcval', 'x')
def test_removeProfile(self):
"Profiles.removeProfile()"
p = cssutils.profiles.Profiles()
self.assertEqual(9, len(p.profiles))
p.removeProfile(p.CSS_LEVEL_2)
self.assertEqual(8, len(p.profiles))
p.removeProfile(all=True)
self.assertEqual(0, len(p.profiles))
# TODO: FIX
# def test_validateWithProfile(self):
# "Profiles.validate(), Profiles.validateWithProfile()"
# p = cssutils.profiles.Profiles()
# tests = {
# ('color', 'red', None): (True, True, [p.CSS_LEVEL_2]),
# ('color', 'red', p.CSS_LEVEL_2): (True, True,[p.CSS_LEVEL_2]),
# ('color', 'red', p.CSS3_COLOR): (True, False, [p.CSS_LEVEL_2]),
# ('color', 'rgba(0,0,0,0)', None): (True, True, [p.CSS3_COLOR]),
# ('color', 'rgba(0,0,0,0)', p.CSS_LEVEL_2): (True, False, [p.CSS3_COLOR]),
# ('color', 'rgba(0,0,0,0)', p.CSS3_COLOR): (True, True, [p.CSS3_COLOR]),
# ('color', '1px', None): (False, False, [p.CSS3_COLOR, p.CSS_LEVEL_2]),
# ('color', '1px', p.CSS_LEVEL_2): (False, False, [p.CSS3_COLOR, p.CSS_LEVEL_2]),
# ('color', '1px', p.CSS3_COLOR): (False, False, [p.CSS3_COLOR, p.CSS_LEVEL_2]),
# ('color', 'aliceblue', None): (True, True, [p.CSS_LEVEL_2]),
#
# ('opacity', '1', None): (True, True, [p.CSS3_COLOR]),
# ('opacity', '1', p.CSS_LEVEL_2): (True, False, [p.CSS3_COLOR]),
# ('opacity', '1', p.CSS3_COLOR): (True, True, [p.CSS3_COLOR]),
# ('opacity', '1px', None): (False, False, [p.CSS3_COLOR]),
# ('opacity', '1px', p.CSS_LEVEL_2): (False, False, [p.CSS3_COLOR]),
# ('opacity', '1px', p.CSS3_COLOR): (False, False, [p.CSS3_COLOR]),
#
# ('-x', '1', None): (False, False, []),
# ('-x', '1', p.CSS_LEVEL_2): (False, False, []),
# ('-x', '1', p.CSS3_COLOR): (False, False, []),
# }
# for test, r in tests.items():
# self.assertEqual(p.validate(test[0], test[1]), r[0])
# self.assertEqual(p.validateWithProfile(*test), r)
def test_propertiesByProfile(self):
"Profiles.propertiesByProfile"
self.assertEqual(['opacity'], #'color',
list(cssutils.profile.propertiesByProfile(
cssutils.profile.CSS3_COLOR)))
def test_csscolorlevel3(self):
"CSS Color Module Level 3"
# (propname, propvalue): (valid, validprofile)
namedcolors = '''transparent, orange,
aqua, black, blue, fuchsia, gray, green, lime, maroon,
navy, olive, purple, red, silver, teal, white, yellow'''
for color in namedcolors.split(','):
color = color.strip()
self.assertEqual(True, cssutils.profile.validate('color', color))
self.assertEqual((True, True, list(CSS2)),
cssutils.profile.validateWithProfile('color', color))
# CSS2 only:
uicolor = 'ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText'
for color in uicolor.split('|'):
self.assertEqual(False, cssutils.profile.validate('color', color))
# TODO: Fix
#self.assertEqual((True, True, list(CSS2)),
# cssutils.profile.validateWithProfile('color', color))
def test_validate(self):
"Profiles.validate()"
tests = {
# name, values: valid, matching, profile
# background-position
('background-position', ('inherit',
'0',
'1%',
'1px',
'0 0',
'1% 1%',
'1px 1px',
'1px 1%',
'top', 'bottom',
'left', 'right',
'center center',
'center',
'top left', 'top center', 'top right',
'bottom left', 'bottom center', 'bottom right',
'center left', 'center center', 'center right',
'0 center', 'center 0',
'0 top', '10% bottom',
'left 0', 'right 10%',
'1% center', 'center 1%'
)): (True, True, CSS2),
('background-position', ('0 left',
'top 0'
)): (False, False, CSS2),
('border-top-right-radius', ('1px',
'1%',
'1% -1px',
'1% 0',
)): (True, True, C3BB),
('border-top-right-radius', ('1px 2px 2px',
'/ 1px',
'black')): (False, False, C3BB),
('border-radius', ('1px',
'1%',
'0',
'1px 1px',
'1px/ 1px',
'1px /1px',
'1px / 1px',
'1px 1px 1px 1px',
'1px 1px 1px 1px / 1px 1px 1px 1px',
)): (True, True, C3BB),
('border-radius', ('1px /',
'/ 1px',
'1px / 1px / 1px',
'1px 1px 1px 1px 1px',
'1px / 1px 1px 1px 1px 1px',
'black')): (False, False, C3BB),
('border', ('1px',
'solid',
'red',
'1px solid red',
'1px red solid',
'red 1px solid',
'red solid 1px',
'solid 1px red',
'solid red 1px',
)): (True, True, C3BB),
('border', ('1px 1px',
'red red 1px',
)): (False, False, C3BB),
('box-shadow', ('none',
'1px 1px',
'1px 1px 1px',
'1px 1px 1px 1px',
'1px 1px 1px 1px red',
'inset 1px 1px',
'inset 1px 1px 1px 1px black')): (True, True, C3BB),
('box-shadow', ('1px',
'1px 1px 1px 1px 1px',
'x 1px 1px',
'inset',
'1px black',
'black')): (False, False, C3BB),
# color
('color', ('x',
'#',
'#0',
'#00',
'#0000',
'#00000',
'#0000000',
'#00j',
'#j00000',
'rgb(0.0,1,1)',
'rgb(0)',
'rgb(0, 1)',
'rgb(0, 1, 1, 1)',
'rgb(0, 1, 0%)',
'rgba(0)',
'rgba(0, 1, 1.0, 1)',
'rgba(0, 1)',
'rgba(0, 1, 1, 1, 1)',
'rgba(100%, 0%, 0%, 1%)',
'rgba(100%, 0%, 0, 1)',
'hsl(1.5,1%,1%)',
'hsl(1,1,1%)',
'hsl(1,1%,1)',
'hsla(1.5,1%,1%, 1)',
'hsla(1,1,1%, 1)',
'hsla(1,1%,1, 1)',
'hsla(1,1%,1%, 1%)'
)): (False,False, CSS2_CM3),
('color', ('inherit',
'black',
'#000',
'#000000',
'rgb(0,1,1)',
'rgb( 0 , 1 , 1 )',
'rgb(-10,555,1)',
'rgb(100%, 1.5%, 0%)',
'rgb(150%, -20%, 0%)',
)): (True, True, CSS2),
('color', ('currentcolor',
'aliceblue',
'rgba(1,1,1,1)',
'rgba( 1 , 1 , 1 , 1 )',
'rgba(100%, 0%, 0%, 1)',
'hsl(1,1%,1%)',
'hsl( 1 , 1% , 1% )',
'hsl(-1000,555.5%,-61.5%)',
'hsla(1,1%,1%,1)',
'hsla( 1, 1% , 1% , 1 )',
'hsla(-1000,555.5%,-61.5%, 0.5)'
)): (True, True, CM3),
# TODO?:
#('color', 'rgb(/**/ 0 /**/ , /**/ 1 /**/ , /**/ 1 /**/ )'): (True, True, CSS2),
# content
('content', ('none',
'normal',
'""',
"'x'",
)): (True, True, CSS2),
('cursor', ('url(1), auto',
'url(1) 2 3, help',
'wait',
'inherit',
'none')): (True, True, C3BUI),
('cursor', ('url(1), auto, wait',
'url(1) 2, help',
'1')): (False, False, C3BUI),
# FONTS
('font-family', ('serif, x',
)): (True, True, CSS2), #CSS2_FM3),
('font-family', ('inherit',
'a, b',
'a,b,c',
'a, "b", c',
'"a", b, "c"',
'"a", "b", "c"',
'"x y"',
'serif',
'"serif"', # valid but CSS2: font with name serif, CSS3: same as `serif`
'a b', # should use quotes but valid
'a, b b, d',
)): (True, True, CSS2),
('font-weight', ('normal', 'bold', 'bolder', 'lighter', 'inherit',
'100', '200', '300', '400', '500', '600', '700', '800', '900'
)): (True, True, CSS2),
('font-stretch', ('normal', 'wider', 'narrower', 'ultra-condensed',
'extra-condensed', 'condensed', 'semi-condensed',
'semi-expanded', 'expanded', 'extra-expanded',
'ultra-expanded', 'inherit'
)): (True, True, FM3),
('font-style', ('normal', 'italic', 'oblique', 'inherit'
)): (True, True, CSS2),
('font-variant', ('normal', 'small-caps', 'inherit'
)): (True, True, CSS2),
('font-size', ('-1em',
)): (False, False, CSS2),
('font-size', ('xx-small', 'x-small', 'small', 'medium', 'large',
'x-large', 'xx-large', 'larger', 'smaller',
'1em', '1%', 'inherit'
)): (True, True, CSS2),
('font-size-adjust', ('1.0',
'none', 'inherit'
)): (True, True, FM3),
('font', ('italic small-caps bold 1px/3 a, "b", serif',
'12pt/14pt sans-serif',
'80% sans-serif',
'x-large/110% "new century schoolbook", serif',
'bold italic large Palatino, serif',
'normal small-caps 120%/120% fantasy',
'oblique 12pt "Helvetica Nue", serif',
'caption', 'icon', 'menu', 'message-box', 'small-caption',
'status-bar', 'inherit'
)): (True, True, CSS2),
('nav-index', ('1', 'auto', 'inherit')): (True, True, C3BUI),
('nav-index', ('x', '1 2', '1px')): (False, False, C3BUI),
('opacity', ('inherit',
'0', '0.0', '0.42342', '1', '1.0',
# should be clipped but valid
'-0', '-0.1', '-10', '2'
)): (True, True, CM3),
('opacity', ('a', '#000', '+1')): (False, False, CM3),
('outline', ('red dotted 1px',
'dotted 1px red',
'1px red dotted',
'red', '1px', 'dotted',
'red 1px', '1px dotted', 'red dotted',
'inherit'
)): (True, True, C3BUI),
('outline', ('red #fff', 'solid dotted', 'Url(x)', '1px 1px'
)): (False, False, C3BUI),
('outline-color', ('red', '#fff', 'inherit'
)): (True, True, C3BUI),
('outline-color', ('0', '1em'
)): (False, False, C3BUI),
('outline-offset', ('0', '1em', 'inherit'
)): (True, True, C3BUI),
('outline-offset', ('1%', 'red'
)): (False, False, C3BUI),
('outline-style', ('auto', 'dotted', 'inherit'
)): (True, True, C3BUI),
('outline-style', ('0', '1em', 'red'
)): (False, False, C3BUI),
('outline-width', ('0', '1em', 'inherit'
)): (True, True, C3BUI),
('outline-width', ('auto', 'red', 'dotted'
)): (False, False, C3BUI),
('resize', ('none',
'both',
'horizontal',
'vertical',
'inherit')): (True, True, C3BUI),
('resize', ('1',
'auto',
'1px',
'2%')): (False, False, C3BUI),
('size', ('1cm',
'1mm 20cm',
'auto',
'landscape letter',
'a4 portrait',
'landscape',
'a5',
#'inherit'
)): (True, True, C3PM),
('size', (
'portrait landscape',
'a5 letter',
'2%')): (False, False, C3PM),
('src', ('url( a )',
'local( x )',
'local("x")',
'local( "x" )',
'url(../fonts/LateefRegAAT.ttf) format( "truetype-aat" )',
'url(a) format( "123x" , "a" )',
'url(a) format( "123x" , "a" ), url(a) format( "123x" , "a" )',
'local(HiraKakuPro-W3), local(Meiryo), local(IPAPGothic)',
'local(Gentium), url(/fonts/Gentium.ttf)',
'local("Gentium"), url("/fonts/Gentium.ttf")',
'local(Futura-Medium), url(fonts.svg#MyGeometricModern) format("svg")',
)): (True, True, FM3FF),
('text-shadow', ('none',
'1px 1px',
'1px 1px 1px',
'1px 1px 1px 1px',
'1px 1px 1px 1px red',
'inset 1px 1px',
'inset 1px 1px 1px 1px black')): (True, True, C3T),
('text-shadow', ('1px',
'1px 1px 1px 1px 1px',
'x 1px 1px',
'inset',
'1px black',
'black')): (False, False, C3T),
('unicode-range', ('u+1', 'U+111111-ffffff',
'u+123456 , U+1-f'
)): (True, True, FM3FF),
}
# TODO!!!
for (name, values), (valid, matching, profile) in list(tests.items()):
for value in values:
self.assertEqual(valid, cssutils.profile.validate(name, value))
# if (valid, matching, list(profile)) != cssutils.profile.validateWithProfile(name, value):
# print
# print '###############', name, value
# print (valid, matching, list(profile)), cssutils.profile.validateWithProfile(name, value)
# TODO: fix
# self.assertEqual((valid, matching, list(profile)),
# cssutils.profile.validateWithProfile(name, value))
# TODO: fix
# def test_validateByProfile(self):
# "Profiles.validateByProfile()"
# # testing for valid values overwritten in a profile
# tests = {
# (FM3FF, 'font-family', ('y', '"y"' # => name should be "y"!!!
# )): (True, True, FM3FF),
# (FM3FF, 'font-family', ('"y", "a"', 'a, b', 'a a'
# )): (True, False, CSS2),
# (FM3FF, 'font-stretch', ('normal', 'wider', 'narrower', 'inherit'
# )): (True, False, FM3),
# (FM3FF, 'font-style', ('inherit',
# )): (True, False, CSS2),
# (FM3FF, 'font-weight', ('bolder', 'lighter', 'inherit',
# )): (True, False, CSS2),
# }
# for (profiles, name, values), (v, m, p) in tests.items():
# for value in values:
# self.assertEqual((v, m, list(p)),
# cssutils.profile.validateWithProfile(name,
# value,
# profiles))
if __name__ == '__main__':
import unittest
unittest.main()