Mercurial > genshi > mirror
comparison markup/tests/template.py @ 149:537f819c547b trunk
`Template.generate()` now accepts the context data as keyword arguments, so that you don't have to import the `Context` class every time you want to pass data into a template.
author | cmlenz |
---|---|
date | Tue, 15 Aug 2006 21:59:07 +0000 |
parents | 47bbd9d2a5af |
children | cdb2a1f930e2 |
comparison
equal
deleted
inserted
replaced
148:dcc9dc25bc59 | 149:537f819c547b |
---|---|
14 import doctest | 14 import doctest |
15 import unittest | 15 import unittest |
16 import sys | 16 import sys |
17 | 17 |
18 from markup.core import Markup, Stream | 18 from markup.core import Markup, Stream |
19 from markup.template import BadDirectiveError, Context, Template, \ | 19 from markup.template import BadDirectiveError, Template, TemplateSyntaxError |
20 TemplateSyntaxError | |
21 | 20 |
22 | 21 |
23 class AttrsDirectiveTestCase(unittest.TestCase): | 22 class AttrsDirectiveTestCase(unittest.TestCase): |
24 """Tests for the `py:attrs` template directive.""" | 23 """Tests for the `py:attrs` template directive.""" |
25 | 24 |
31 <elem py:for="item in items" py:attrs="item"/> | 30 <elem py:for="item in items" py:attrs="item"/> |
32 </doc>""") | 31 </doc>""") |
33 items = [{'id': 1, 'class': 'foo'}, {'id': 2, 'class': 'bar'}] | 32 items = [{'id': 1, 'class': 'foo'}, {'id': 2, 'class': 'bar'}] |
34 self.assertEqual("""<doc> | 33 self.assertEqual("""<doc> |
35 <elem id="1" class="foo"/><elem id="2" class="bar"/> | 34 <elem id="1" class="foo"/><elem id="2" class="bar"/> |
36 </doc>""", str(tmpl.generate(Context(items=items)))) | 35 </doc>""", str(tmpl.generate(items=items))) |
37 | 36 |
38 def test_update_existing_attr(self): | 37 def test_update_existing_attr(self): |
39 """ | 38 """ |
40 Verify that an attribute value that evaluates to `None` removes an | 39 Verify that an attribute value that evaluates to `None` removes an |
41 existing attribute of that name. | 40 existing attribute of that name. |
200 <b>1</b> | 199 <b>1</b> |
201 <b>2</b> | 200 <b>2</b> |
202 <b>3</b> | 201 <b>3</b> |
203 <b>4</b> | 202 <b>4</b> |
204 <b>5</b> | 203 <b>5</b> |
205 </doc>""", str(tmpl.generate(Context(items=range(1, 6))))) | 204 </doc>""", str(tmpl.generate(items=range(1, 6)))) |
206 | 205 |
207 def test_as_element(self): | 206 def test_as_element(self): |
208 """ | 207 """ |
209 Verify that the directive can also be used as an element. | 208 Verify that the directive can also be used as an element. |
210 """ | 209 """ |
217 <b>1</b> | 216 <b>1</b> |
218 <b>2</b> | 217 <b>2</b> |
219 <b>3</b> | 218 <b>3</b> |
220 <b>4</b> | 219 <b>4</b> |
221 <b>5</b> | 220 <b>5</b> |
222 </doc>""", str(tmpl.generate(Context(items=range(1, 6))))) | 221 </doc>""", str(tmpl.generate(items=range(1, 6)))) |
223 | 222 |
224 | 223 |
225 class IfDirectiveTestCase(unittest.TestCase): | 224 class IfDirectiveTestCase(unittest.TestCase): |
226 """Tests for the `py:if` template directive.""" | 225 """Tests for the `py:if` template directive.""" |
227 | 226 |
233 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> | 232 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
234 <b py:if="foo" py:strip="">${bar}</b> | 233 <b py:if="foo" py:strip="">${bar}</b> |
235 </doc>""") | 234 </doc>""") |
236 self.assertEqual("""<doc> | 235 self.assertEqual("""<doc> |
237 Hello | 236 Hello |
238 </doc>""", str(tmpl.generate(Context(foo=True, bar='Hello')))) | 237 </doc>""", str(tmpl.generate(foo=True, bar='Hello'))) |
239 | 238 |
240 def test_as_element(self): | 239 def test_as_element(self): |
241 """ | 240 """ |
242 Verify that the directive can also be used as an element. | 241 Verify that the directive can also be used as an element. |
243 """ | 242 """ |
244 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> | 243 tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> |
245 <py:if test="foo">${bar}</py:if> | 244 <py:if test="foo">${bar}</py:if> |
246 </doc>""") | 245 </doc>""") |
247 self.assertEqual("""<doc> | 246 self.assertEqual("""<doc> |
248 Hello | 247 Hello |
249 </doc>""", str(tmpl.generate(Context(foo=True, bar='Hello')))) | 248 </doc>""", str(tmpl.generate(foo=True, bar='Hello'))) |
250 | 249 |
251 | 250 |
252 class MatchDirectiveTestCase(unittest.TestCase): | 251 class MatchDirectiveTestCase(unittest.TestCase): |
253 """Tests for the `py:match` template directive.""" | 252 """Tests for the `py:match` template directive.""" |
254 | 253 |
425 </div>""") | 424 </div>""") |
426 self.assertEqual("""<div> | 425 self.assertEqual("""<div> |
427 42 | 426 42 |
428 84 | 427 84 |
429 42 | 428 42 |
430 </div>""", str(tmpl.generate(Context(x=42)))) | 429 </div>""", str(tmpl.generate(x=42))) |
431 | 430 |
432 def test_as_element(self): | 431 def test_as_element(self): |
433 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | 432 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
434 <py:with vars="x = x * 2">${x}</py:with> | 433 <py:with vars="x = x * 2">${x}</py:with> |
435 </div>""") | 434 </div>""") |
436 self.assertEqual("""<div> | 435 self.assertEqual("""<div> |
437 84 | 436 84 |
438 </div>""", str(tmpl.generate(Context(x=42)))) | 437 </div>""", str(tmpl.generate(x=42))) |
439 | 438 |
440 | 439 |
441 class TemplateTestCase(unittest.TestCase): | 440 class TemplateTestCase(unittest.TestCase): |
442 """Tests for basic template processing, expression evaluation and error | 441 """Tests for basic template processing, expression evaluation and error |
443 reporting. | 442 reporting. |
486 self.assertEqual('bar', parts[1][1].source) | 485 self.assertEqual('bar', parts[1][1].source) |
487 self.assertEqual(Stream.TEXT, parts[2][0]) | 486 self.assertEqual(Stream.TEXT, parts[2][0]) |
488 self.assertEqual(' baz', parts[2][1]) | 487 self.assertEqual(' baz', parts[2][1]) |
489 | 488 |
490 def test_interpolate_mixed3(self): | 489 def test_interpolate_mixed3(self): |
491 ctxt = Context(var=42) | |
492 tmpl = Template('<root> ${var} $var</root>') | 490 tmpl = Template('<root> ${var} $var</root>') |
493 self.assertEqual('<root> 42 42</root>', str(tmpl.generate(ctxt))) | 491 self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42))) |
494 | 492 |
495 def test_interpolate_non_string_attrs(self): | 493 def test_interpolate_non_string_attrs(self): |
496 tmpl = Template('<root attr="${1}"/>') | 494 tmpl = Template('<root attr="${1}"/>') |
497 self.assertEqual('<root attr="1"/>', str(tmpl.generate())) | 495 self.assertEqual('<root attr="1"/>', str(tmpl.generate())) |
498 | 496 |
499 def test_interpolate_list_result(self): | 497 def test_interpolate_list_result(self): |
500 tmpl = Template('<root>$foo</root>') | 498 tmpl = Template('<root>$foo</root>') |
501 ctxt = Context(foo=('buzz',)) | 499 self.assertEqual('<root>buzz</root>', str(tmpl.generate(foo=('buzz',)))) |
502 self.assertEqual('<root>buzz</root>', str(tmpl.generate(ctxt))) | |
503 | 500 |
504 def test_empty_attr(self): | 501 def test_empty_attr(self): |
505 tmpl = Template('<root attr=""/>') | 502 tmpl = Template('<root attr=""/>') |
506 self.assertEqual('<root attr=""/>', str(tmpl.generate())) | 503 self.assertEqual('<root attr=""/>', str(tmpl.generate())) |
507 | 504 |
558 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | 555 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
559 $myvar | 556 $myvar |
560 </div>""") | 557 </div>""") |
561 self.assertEqual("""<div> | 558 self.assertEqual("""<div> |
562 <b>foo</b> | 559 <b>foo</b> |
563 </div>""", str(tmpl.generate(Context(myvar=Markup('<b>foo</b>'))))) | 560 </div>""", str(tmpl.generate(myvar=Markup('<b>foo</b>')))) |
564 | 561 |
565 def test_text_noescape_quotes(self): | 562 def test_text_noescape_quotes(self): |
566 """ | 563 """ |
567 Verify that outputting context data in text nodes doesn't escape quotes. | 564 Verify that outputting context data in text nodes doesn't escape quotes. |
568 """ | 565 """ |
569 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | 566 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
570 $myvar | 567 $myvar |
571 </div>""") | 568 </div>""") |
572 self.assertEqual("""<div> | 569 self.assertEqual("""<div> |
573 "foo" | 570 "foo" |
574 </div>""", str(tmpl.generate(Context(myvar='"foo"')))) | 571 </div>""", str(tmpl.generate(myvar='"foo"'))) |
575 | 572 |
576 def test_attr_escape_quotes(self): | 573 def test_attr_escape_quotes(self): |
577 """ | 574 """ |
578 Verify that outputting context data in attribtes escapes quotes. | 575 Verify that outputting context data in attribtes escapes quotes. |
579 """ | 576 """ |
580 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | 577 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
581 <elem class="$myvar"/> | 578 <elem class="$myvar"/> |
582 </div>""") | 579 </div>""") |
583 self.assertEqual("""<div> | 580 self.assertEqual("""<div> |
584 <elem class=""foo""/> | 581 <elem class=""foo""/> |
585 </div>""", str(tmpl.generate(Context(myvar='"foo"')))) | 582 </div>""", str(tmpl.generate(myvar='"foo"'))) |
586 | 583 |
587 def test_directive_element(self): | 584 def test_directive_element(self): |
588 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | 585 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
589 <py:if test="myvar">bar</py:if> | 586 <py:if test="myvar">bar</py:if> |
590 </div>""") | 587 </div>""") |
591 self.assertEqual("""<div> | 588 self.assertEqual("""<div> |
592 bar | 589 bar |
593 </div>""", str(tmpl.generate(Context(myvar='"foo"')))) | 590 </div>""", str(tmpl.generate(myvar='"foo"'))) |
594 | 591 |
595 def test_normal_comment(self): | 592 def test_normal_comment(self): |
596 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> | 593 tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> |
597 <!-- foo bar --> | 594 <!-- foo bar --> |
598 </div>""") | 595 </div>""") |