1 """Testcases for cssutils.css.CSSValue and CSSPrimitiveValue."""
2 __author__ = '$LastChangedBy: cthedot $'
3 __date__ = '$LastChangedDate: 2007-10-27 22:27:14 +0200 (Sa, 27 Okt 2007) $'
4 __version__ = '$LastChangedRevision: 588 $'
5
6
7 import xml.dom
8 import basetest
9 import cssutils
10 import types
11
13
20
21 - def test_cssText(self):
22 "CSSValue.cssText"
23 v = cssutils.css.CSSValue()
24 v.cssText = u'1px'
25 self.assert_(v.CSS_PRIMITIVE_VALUE == v.cssValueType)
26 self.assert_(v.CSS_PX == v.primitiveType)
27 self.assert_(u'1px' == v.cssText)
28 self.assert_(False is v.valid)
29
30 v = cssutils.css.CSSValue(_propertyName="left")
31 v.cssText = u'1px'
32 self.assert_(v.CSS_PRIMITIVE_VALUE == v.cssValueType)
33 self.assert_(v.CSS_PX == v.primitiveType)
34 self.assert_(u'1px' == v.cssText)
35 self.assert_(True is v.valid)
36
37 v = cssutils.css.CSSValue(_propertyName="font-family")
38 v.cssText = u'a ,b, c ,"d or d", "e, " '
39 self.assertEqual(v.CSS_PRIMITIVE_VALUE, v.cssValueType)
40 self.assertEqual(v.CSS_STRING, v.primitiveType)
41 self.assertEqual(u'a, b, c, "d or d", "e, "', v.cssText)
42 self.assert_(True is v.valid)
43
44 v.cssText = u' 1 px '
45 self.assert_(v.CSS_VALUE_LIST == v.cssValueType)
46 self.assert_('1 px' == v._value)
47 self.assert_('1 px' == v.cssText)
48 self.assert_(False is v.valid)
49
50 v.cssText = u' normal 1px a, b, "c" end '
51 self.assert_(v.CSS_VALUE_LIST == v.cssValueType)
52 self.assert_('normal 1px a, b, "c" end' == v._value)
53 self.assert_('normal 1px a, b, "c" end' == v.cssText)
54 self.assert_(False is v.valid)
55 for i, x in enumerate(v):
56 self.assertEqual(x.CSS_PRIMITIVE_VALUE, x.cssValueType)
57 if x == 0:
58 self.assertEqual(x.CSS_IDENT, x.primitiveType)
59 self.assertEqual(u'normal', x.cssText)
60 elif x == 1:
61 self.assertEqual(x.CSS_PX, x.primitiveType)
62 self.assertEqual(u'1px', x.cssText)
63 if x == 2:
64 self.assertEqual(x.CSS_STRING, x.primitiveType)
65 self.assertEqual(u'a, b, "c"', x.cssText)
66 if x == 3:
67 self.assertEqual(x.CSS_IDENT, x.primitiveType)
68 self.assertEqual(u'end', x.cssText)
69
70
71 v = cssutils.css.CSSValue(_propertyName="left")
72 v.cssText = u' 1 px '
73 self.assert_(v.CSS_VALUE_LIST == v.cssValueType)
74 self.assert_(u'1 px' == v.cssText)
75 self.assert_(False is v.valid)
76
77 v.cssText = u'expression(document.body.clientWidth > 972 ? "1014px": "100%" )'
78 self.assert_(v.CSS_PRIMITIVE_VALUE == v.cssValueType)
79 self.assert_(v.CSS_UNKNOWN == v.primitiveType)
80 self.assertEqual('expression(document.body.clientWidth>972?"1014px":"100%")',
81 v._value)
82 self.assertEqual('expression(document.body.clientWidth>972?"1014px":"100%")',
83 v.cssText)
84 self.assert_(False is v.valid)
85
96
98 "CSSValue.valid"
99
100 tests = [
101 ('color', '1', False),
102 ('color', 'red', True),
103 ('left', '1', False),
104 ('left', '1px', True),
105 ('font', 'normal 1em/1.5 serif', True)
106 ]
107 for n, v, exp in tests:
108 v = cssutils.css.CSSValue(cssText=v, _propertyName=n)
109 self.assertEqual(v.valid, exp)
110 self.assert_(v.wellformed, True)
111
113 "CSSValue.cssValueType .cssValueTypeString"
114 tests = [
115 ([u'inherit'], 'CSS_INHERIT'),
116 (['1', '1%', '1em', '1ex', '1px', '1cm', '1mm', '1in', '1pt', '1pc',
117 '1deg', '1rad', '1grad', '1ms', '1s', '1hz', '1khz', '1other',
118 '"string"', "'str ing'", 'url(x)', 'red',
119 'attr(a)', 'counter()', 'rect(1px,2px,3px,4px)',
120 'rgb(0,0,0)', '#000', '#000000', 'rgba(0,0,0,0)'],
121 'CSS_PRIMITIVE_VALUE'),
122 ([u'1px 1px', 'red blue green x'], 'CSS_VALUE_LIST'),
123 ([], 'CSS_CUSTOM')
124 ]
125 for values, name in tests:
126 for value in values:
127 v = cssutils.css.CSSValue(cssText=value)
128 self.assertEqual(value, v.cssText)
129 self.assertEqual(name, v.cssValueTypeString)
130 self.assertEqual(getattr(v, name), v.cssValueType)
131
142
154
155
157
169
170
171
172
173
174
175
176
177
184
186 "CSSPrimitiveValue.CSS_NUMBER .. CSS_DIMENSION"
187 defs = [
188 ('', 'CSS_NUMBER'),
189 ('%', 'CSS_PERCENTAGE'),
190 ('em', 'CSS_EMS'),
191 ('ex', 'CSS_EXS'),
192 ('px', 'CSS_PX'),
193 ('cm', 'CSS_CM'),
194 ('mm', 'CSS_MM'),
195 ('in', 'CSS_IN'),
196 ('pt', 'CSS_PT'),
197 ('pc', 'CSS_PC'),
198 ('deg', 'CSS_DEG'),
199 ('rad', 'CSS_RAD'),
200 ('grad', 'CSS_GRAD'),
201 ('ms', 'CSS_MS'),
202 ('s', 'CSS_S'),
203 ('hz', 'CSS_HZ'),
204 ('khz', 'CSS_KHZ'),
205 ('other_dimension', 'CSS_DIMENSION')]
206 for dim, name in defs:
207 for n in (0, 1, 1.1, -1, -1.1, -0):
208 v = cssutils.css.CSSPrimitiveValue('%i%s' % (n, dim))
209 self.assert_(getattr(v, name) == v.primitiveType)
210 self.assert_(name == v.primitiveTypeString)
211
213 "CSSPrimitiveValue.CSS_STRING .. CSS_RGBCOLOR"
214 defs = [
215 (('""', "''", '"some thing"', "' A\\ND '"), 'CSS_STRING'),
216 (('url(a)', 'url("a b")', "url(' ')"), 'CSS_URI'),
217 (('some', 'or_anth-er'), 'CSS_IDENT'),
218 (('attr(a)', 'attr(b)'), 'CSS_ATTR'),
219 (('counter(1)', 'counter(2)'), 'CSS_COUNTER'),
220 (('rect(1,2,3,4)',), 'CSS_RECT'),
221 (('rgb(1,2,3)', 'rgb(10%, 20%, 30%)', '#123', '#123456'),
222 'CSS_RGBCOLOR'),
223 (('rgba(1,2,3,4)','rgba(10%, 20%, 30%, 40%)', ),
224 'CSS_RGBACOLOR')
225 ]
226 for examples, name in defs:
227 for x in examples:
228 v = cssutils.css.CSSPrimitiveValue(x)
229
230 self.assertEqual(name, v.primitiveTypeString)
231
233 "CSSPrimitiveValue.getFloatValue()"
234
235
236
237 v = cssutils.css.CSSPrimitiveValue(u'1px')
238 tests = {
239 '0': (v.CSS_NUMBER, 0),
240 '-1.1': (v.CSS_NUMBER, -1.1),
241 '1%': (v.CSS_PERCENTAGE, 1),
242 '-1%': (v.CSS_PERCENTAGE, -1),
243 '1em': (v.CSS_EMS, 1),
244 '-1.1em': (v.CSS_EMS, -1.1),
245 '1ex': (v.CSS_EXS, 1),
246 '1px': (v.CSS_PX, 1),
247
248 '1cm': (v.CSS_CM, 1),
249 '1cm': (v.CSS_MM, 10),
250 '254cm': (v.CSS_IN, 100),
251 '1mm': (v.CSS_MM, 1),
252 '10mm': (v.CSS_CM, 1),
253 '254mm': (v.CSS_IN, 10),
254 '1in': (v.CSS_IN, 1),
255 '100in': (v.CSS_CM, 254),
256 '10in': (v.CSS_MM, 254),
257
258 '1pt': (v.CSS_PT, 1),
259 '1pc': (v.CSS_PC, 1),
260
261 '1deg': (v.CSS_DEG, 1),
262 '1rad': (v.CSS_RAD, 1),
263 '1grad': (v.CSS_GRAD, 1),
264
265 '1ms': (v.CSS_MS, 1),
266 '1000ms': (v.CSS_S, 1),
267 '1s': (v.CSS_S, 1),
268 '1s': (v.CSS_MS, 1000),
269
270 '1hz': (v.CSS_HZ, 1),
271 '1000hz': (v.CSS_KHZ, 1),
272 '1khz': (v.CSS_KHZ, 1),
273 '1khz': (v.CSS_HZ, 1000),
274
275 '1DIMENSION': (v.CSS_DIMENSION, 1)
276 }
277 for cssText in tests:
278 v.cssText = cssText
279 unitType, exp = tests[cssText]
280 val = v.getFloatValue(unitType)
281 if unitType in (v.CSS_IN, v.CSS_CM):
282 val = round(val)
283 self.assertEqual(val , exp)
284
286 "CSSPrimitiveValue.setFloatValue()"
287 V = cssutils.css.CSSPrimitiveValue
288
289 tests = {
290
291 (V.CSS_NUMBER, 1): [
292
293
294 (V.CSS_NUMBER, 0, 0, '0'),
295 (V.CSS_NUMBER, 0.1, 0.1, '0.1'),
296 (V.CSS_NUMBER, -0, 0, '0'),
297 (V.CSS_NUMBER, 2, 2, '2'),
298 (V.CSS_NUMBER, 2.0, 2, '2'),
299 (V.CSS_NUMBER, 2.1, 2.1, '2.1'),
300 (V.CSS_NUMBER, -2.1, -2.1, '-2.1'),
301
302 (V.CSS_NUMBER, '1', 1, '1'),
303 (V.CSS_NUMBER, '1.1', 1.1, '1.1'),
304 (V.CSS_PX, 1, xml.dom.InvalidAccessErr, None),
305 (V.CSS_DEG, 1, xml.dom.InvalidAccessErr, None),
306 (V.CSS_RAD, 1, xml.dom.InvalidAccessErr, None),
307 (V.CSS_GRAD, 1, xml.dom.InvalidAccessErr, None),
308 (V.CSS_S, 1, xml.dom.InvalidAccessErr, None),
309 (V.CSS_MS, 1, xml.dom.InvalidAccessErr, None),
310 (V.CSS_KHZ, 1, xml.dom.InvalidAccessErr, None),
311 (V.CSS_HZ, 1, xml.dom.InvalidAccessErr, None),
312 (V.CSS_DIMENSION, 1, xml.dom.InvalidAccessErr, None),
313 (V.CSS_MM, 2, xml.dom.InvalidAccessErr, None),
314
315 (V.CSS_NUMBER, 'x', xml.dom.InvalidAccessErr,
316 'CSSPrimitiveValue: floatValue "x" is not a float'),
317 (V.CSS_NUMBER, '1x', xml.dom.InvalidAccessErr,
318 'CSSPrimitiveValue: floatValue "1x" is not a float'),
319
320 (V.CSS_STRING, 'x', xml.dom.InvalidAccessErr,
321 'CSSPrimitiveValue: unitType CSS_STRING is not a float type'),
322 (V.CSS_URI, 'x', xml.dom.InvalidAccessErr,
323 'CSSPrimitiveValue: unitType CSS_URI is not a float type'),
324 (V.CSS_ATTR, 'x', xml.dom.InvalidAccessErr,
325 'CSSPrimitiveValue: unitType CSS_ATTR is not a float type'),
326 (V.CSS_IDENT, 'x', xml.dom.InvalidAccessErr,
327 'CSSPrimitiveValue: unitType CSS_IDENT is not a float type'),
328 (V.CSS_RGBCOLOR, 'x', xml.dom.InvalidAccessErr,
329 'CSSPrimitiveValue: unitType CSS_RGBCOLOR is not a float type'),
330 (V.CSS_RGBACOLOR, 'x', xml.dom.InvalidAccessErr,
331 'CSSPrimitiveValue: unitType CSS_RGBACOLOR is not a float type'),
332 (V.CSS_RECT, 'x', xml.dom.InvalidAccessErr,
333 'CSSPrimitiveValue: unitType CSS_RECT is not a float type'),
334 (V.CSS_COUNTER, 'x', xml.dom.InvalidAccessErr,
335 'CSSPrimitiveValue: unitType CSS_COUNTER is not a float type'),
336 (V.CSS_EMS, 1, xml.dom.InvalidAccessErr,
337 'CSSPrimitiveValue: Cannot coerce primitiveType CSS_NUMBER to CSS_EMS'),
338 (V.CSS_EXS, 1, xml.dom.InvalidAccessErr,
339 'CSSPrimitiveValue: Cannot coerce primitiveType CSS_NUMBER to CSS_EXS')
340 ],
341 (V.CSS_MM, '1mm'): [
342 (V.CSS_MM, 2, 2, '2mm'),
343 (V.CSS_MM, 0, 0, '0mm'),
344 (V.CSS_MM, 0.1, 0.1, '0.1mm'),
345 (V.CSS_MM, -0, -0, '0mm'),
346 (V.CSS_MM, 3.0, 3, '3mm'),
347 (V.CSS_MM, 3.1, 3.1, '3.1mm'),
348 (V.CSS_MM, -3.1, -3.1, '-3.1mm'),
349 (V.CSS_CM, 1, 10, '10mm'),
350 (V.CSS_IN, 10, 254, '254mm'),
351 (V.CSS_PT, 1, 1828.8, '1828.8mm'),
352 (V.CSS_PX, 1, xml.dom.InvalidAccessErr, None),
353 (V.CSS_NUMBER, 2, xml.dom.InvalidAccessErr, None)
354 ],
355 (V.CSS_PT, '1pt'): [
356 (V.CSS_PT, 2, 2, '2pt'),
357 (V.CSS_PC, 12, 1, '1pt'),
358 (V.CSS_NUMBER, 1, xml.dom.InvalidAccessErr, None),
359 (V.CSS_DEG, 1, xml.dom.InvalidAccessErr, None),
360 (V.CSS_PX, 1, xml.dom.InvalidAccessErr, None)
361 ],
362 (V.CSS_KHZ, '1khz'): [
363 (V.CSS_HZ, 2000, 2, '2khz'),
364 (V.CSS_NUMBER, 1, xml.dom.InvalidAccessErr, None),
365 (V.CSS_DEG, 1, xml.dom.InvalidAccessErr, None),
366 (V.CSS_PX, 1, xml.dom.InvalidAccessErr, None)
367 ]
368 }
369 for test in tests:
370 initialType, initialValue = test
371 pv = cssutils.css.CSSPrimitiveValue(initialValue)
372 for setType, setValue, exp, msg in tests[test]:
373 if type(exp) == types.TypeType or\
374 type(exp) == types.ClassType:
375 if msg:
376 self.assertRaisesMsg(
377 exp, msg, pv.setFloatValue, setType, setValue)
378 else:
379 self.assertRaises(
380 exp, pv.setFloatValue, setType, setValue)
381 else:
382 pv.setFloatValue(setType, setValue)
383 self.assertEqual(pv.cssText, msg)
384 self.assertEqual(pv.getFloatValue(initialType), exp)
385 self.assertEqual(pv._value, msg)
386
388 "CSSPrimitiveValue.getStringValue()"
389 v = cssutils.css.CSSPrimitiveValue(u'1px')
390 self.assert_(v.primitiveType == v.CSS_PX)
391 self.assertRaises(xml.dom.InvalidAccessErr,
392 v.getStringValue)
393
394 pv = cssutils.css.CSSPrimitiveValue
395 tests = {
396 pv.CSS_STRING: ("'red'", 'red'),
397 pv.CSS_STRING: ('"red"', 'red'),
398 pv.CSS_URI: ('url(http://example.com)', None),
399 pv.CSS_URI: ("url('http://example.com')",
400 u"http://example.com"),
401 pv.CSS_URI: ('url("http://example.com")',
402 u'http://example.com'),
403 pv.CSS_URI: ('url("http://example.com?)")',
404 u'http://example.com?)'),
405 pv.CSS_IDENT: ('red', None),
406 pv.CSS_ATTR: ('attr(att-name)',
407 u'att-name'),
408 }
409 for t in tests:
410 val, exp = tests[t]
411 if not exp:
412 exp = val
413
414 v = cssutils.css.CSSPrimitiveValue(val)
415 self.assertEqual(v.primitiveType, t)
416 self.assertEqual(v.getStringValue(), exp)
417
419 "CSSPrimitiveValue.setStringValue()"
420
421 v = cssutils.css.CSSPrimitiveValue(u'"a"')
422 self.assert_(v.CSS_STRING == v.primitiveType)
423 v.setStringValue(v.CSS_STRING, 'b')
424 self.assert_('"b"' == v._value)
425 self.assert_('b' == v.getStringValue())
426 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
427 u'CSSPrimitiveValue: Cannot coerce primitiveType CSS_STRING to CSS_URI',
428 v.setStringValue, *(v.CSS_URI, 'x'))
429 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
430 u'CSSPrimitiveValue: Cannot coerce primitiveType CSS_STRING to CSS_IDENT',
431 v.setStringValue, *(v.CSS_IDENT, 'x'))
432 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
433 u'CSSPrimitiveValue: Cannot coerce primitiveType CSS_STRING to CSS_ATTR',
434 v.setStringValue, *(v.CSS_ATTR, 'x'))
435
436
437 v = cssutils.css.CSSPrimitiveValue('new')
438 v.setStringValue(v.CSS_IDENT, 'ident')
439 self.assert_(v.CSS_IDENT == v.primitiveType)
440 self.assert_('ident' == v._value)
441 self.assert_('ident' == v.getStringValue())
442 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
443 u'CSSPrimitiveValue: Cannot coerce primitiveType CSS_IDENT to CSS_URI',
444 v.setStringValue, *(v.CSS_URI, 'x'))
445 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
446 u'CSSPrimitiveValue: Cannot coerce primitiveType CSS_IDENT to CSS_STRING',
447 v.setStringValue, *(v.CSS_STRING, '"x"'))
448 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
449 u'CSSPrimitiveValue: Cannot coerce primitiveType CSS_IDENT to CSS_ATTR',
450 v.setStringValue, *(v.CSS_ATTR, 'x'))
451
452
453 v = cssutils.css.CSSPrimitiveValue('url(old)')
454 v.setStringValue(v.CSS_URI, '(')
455 self.assertEqual(u'url("(")', v._value)
456 self.assertEqual(u'(', v.getStringValue())
457
458 v.setStringValue(v.CSS_URI, ')')
459 self.assertEqual(u'url(")")', v._value)
460 self.assertEqual(u')', v.getStringValue())
461 self.assertEqual(u'url(")")', v._value)
462
463 v.setStringValue(v.CSS_URI, '""')
464 self.assertEqual(ur'\"\"', v.getStringValue())
465 self.assertEqual(ur'url("\"\"")', v._value)
466
467 v.setStringValue(v.CSS_URI, ',')
468 self.assertEqual(u'url(",")', v._value)
469 self.assertEqual(u',', v.getStringValue())
470
471 v.setStringValue(v.CSS_URI, ' ')
472 self.assertEqual(u'url(" ")', v._value)
473 self.assertEqual(u' ', v.getStringValue())
474
475 v.setStringValue(v.CSS_URI, 'a)')
476 self.assertEqual(u'url("a)")', v._value)
477 self.assertEqual(u'a)', v.getStringValue())
478
479 v.setStringValue(v.CSS_URI, 'a')
480 self.assert_(v.CSS_URI == v.primitiveType)
481 self.assert_('url(a)' == v._value)
482 self.assert_('a' == v.getStringValue())
483 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
484 u'CSSPrimitiveValue: Cannot coerce primitiveType CSS_URI to CSS_IDENT',
485 v.setStringValue, *(v.CSS_IDENT, 'x'))
486 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
487 u'CSSPrimitiveValue: Cannot coerce primitiveType CSS_URI to CSS_STRING',
488 v.setStringValue, *(v.CSS_STRING, '"x"'))
489 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
490 u'CSSPrimitiveValue: Cannot coerce primitiveType CSS_URI to CSS_ATTR',
491 v.setStringValue, *(v.CSS_ATTR, 'x'))
492
493
494 v = cssutils.css.CSSPrimitiveValue('attr(old)')
495 v.setStringValue(v.CSS_ATTR, 'a')
496 self.assert_(v.CSS_ATTR == v.primitiveType)
497 self.assert_('attr(a)' == v._value)
498 self.assert_('a' == v.getStringValue())
499 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
500 u'CSSPrimitiveValue: Cannot coerce primitiveType CSS_ATTR to CSS_IDENT',
501 v.setStringValue, *(v.CSS_IDENT, 'x'))
502 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
503 u'CSSPrimitiveValue: Cannot coerce primitiveType CSS_ATTR to CSS_STRING',
504 v.setStringValue, *(v.CSS_STRING, '"x"'))
505 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
506 u'CSSPrimitiveValue: Cannot coerce primitiveType CSS_ATTR to CSS_URI',
507 v.setStringValue, *(v.CSS_URI, 'x'))
508
509
510 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
511 u"CSSPrimitiveValue: stringType 'x' (UNKNOWN TYPE) is not a string type",
512 v.setStringValue, *('x', 'brown'))
513
514 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
515 u"CSSPrimitiveValue: stringType 111 (UNKNOWN TYPE) is not a string type",
516 v.setStringValue, *(111, 'brown'))
517
518 self.assertRaisesMsg(xml.dom.InvalidAccessErr,
519 u"CSSPrimitiveValue: stringType CSS_PX is not a string type",
520 v.setStringValue, *(v.CSS_PX, 'brown'))
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
543 "CSSPrimitiveValue.__repr__(), .__str__()"
544 v='111'
545
546 s = cssutils.css.CSSPrimitiveValue(v)
547
548 self.assert_(v in str(s))
549 self.assert_('CSS_NUMBER' in str(s))
550
551 s2 = eval(repr(s))
552 self.assert_(isinstance(s2, s.__class__))
553 self.assert_(v == s2.cssText)
554
555
597
598
599
600
601
602 if __name__ == '__main__':
603 import unittest
604 unittest.main()
605