Mercurial > genshi > genshi-test
diff genshi/template/tests/directives.py @ 902:09cc3627654c experimental-inline
Sync `experimental/inline` branch with [source:trunk@1126].
author | cmlenz |
---|---|
date | Fri, 23 Apr 2010 21:08:26 +0000 |
parents | 1837f39efd6f |
children |
line wrap: on
line diff
--- a/genshi/template/tests/directives.py +++ b/genshi/template/tests/directives.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2006-2008 Edgewall Software +# Copyright (C) 2006-2010 Edgewall Software # All rights reserved. # # This software is licensed as described in the file COPYING, which @@ -12,6 +12,7 @@ # history and logs, available at http://genshi.edgewall.org/log/. import doctest +import re import sys import unittest @@ -32,7 +33,7 @@ items = [{'id': 1, 'class': 'foo'}, {'id': 2, 'class': 'bar'}] self.assertEqual("""<doc> <elem id="1" class="foo"/><elem id="2" class="bar"/> - </doc>""", str(tmpl.generate(items=items))) + </doc>""", tmpl.generate(items=items).render(encoding=None)) def test_update_existing_attr(self): """ @@ -44,7 +45,7 @@ </doc>""") self.assertEqual("""<doc> <elem class="bar"/> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_remove_existing_attr(self): """ @@ -56,7 +57,7 @@ </doc>""") self.assertEqual("""<doc> <elem/> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) class ChooseDirectiveTestCase(unittest.TestCase): @@ -75,7 +76,7 @@ </div>""") self.assertEqual("""<div> <span>1</span> - </div>""", str(tmpl.generate())) + </div>""", tmpl.generate().render(encoding=None)) def test_otherwise(self): tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/" py:choose=""> @@ -84,7 +85,7 @@ </div>""") self.assertEqual("""<div> <span>hello</span> - </div>""", str(tmpl.generate())) + </div>""", tmpl.generate().render(encoding=None)) def test_nesting(self): """ @@ -104,7 +105,7 @@ <span>3</span> </div> </div> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_complex_nesting(self): """ @@ -124,7 +125,7 @@ <span>OK</span> </div> </div> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_complex_nesting_otherwise(self): """ @@ -144,7 +145,7 @@ <span>OK</span> </div> </div> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_when_with_strip(self): """ @@ -158,7 +159,7 @@ </doc>""") self.assertEqual("""<doc> <span>foo</span> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_when_outside_choose(self): """ @@ -205,7 +206,7 @@ </doc>""") self.assertEqual("""<doc> foo - </doc>""", str(tmpl.generate(foo='Yeah'))) + </doc>""", tmpl.generate(foo='Yeah').render(encoding=None)) def test_otherwise_without_test(self): """ @@ -219,7 +220,7 @@ </doc>""") self.assertEqual("""<doc> foo - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_as_element(self): """ @@ -234,7 +235,7 @@ </doc>""") self.assertEqual("""<doc> 1 - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_in_text_template(self): """ @@ -251,7 +252,8 @@ 3 #end #end""") - self.assertEqual(""" 1\n""", str(tmpl.generate())) + self.assertEqual(""" 1\n""", + tmpl.generate().render(encoding=None)) class DefDirectiveTestCase(unittest.TestCase): @@ -270,7 +272,7 @@ </doc>""") self.assertEqual("""<doc> <b>foo</b> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_exec_in_replace(self): tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/"> @@ -283,7 +285,7 @@ <p class="message"> hello, world! </p> - </div>""", str(tmpl.generate())) + </div>""", tmpl.generate().render(encoding=None)) def test_as_element(self): """ @@ -297,7 +299,7 @@ </doc>""") self.assertEqual("""<doc> <b>foo</b> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_nested_defs(self): """ @@ -315,7 +317,7 @@ </doc>""") self.assertEqual("""<doc> <strong>foo</strong> - </doc>""", str(tmpl.generate(semantic=True))) + </doc>""", tmpl.generate(semantic=True).render(encoding=None)) def test_function_with_default_arg(self): """ @@ -327,7 +329,7 @@ </doc>""") self.assertEqual("""<doc> foo - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_invocation_in_attribute(self): tmpl = MarkupTemplate("""<doc xmlns:py="http://genshi.edgewall.org/"> @@ -336,7 +338,7 @@ </doc>""") self.assertEqual("""<doc> <p class="foo">bar</p> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_invocation_in_attribute_none(self): tmpl = MarkupTemplate("""<doc xmlns:py="http://genshi.edgewall.org/"> @@ -345,7 +347,7 @@ </doc>""") self.assertEqual("""<doc> <p>bar</p> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_function_raising_typeerror(self): def badfunc(): @@ -368,7 +370,7 @@ </doc>""") self.assertEqual("""<doc> <head><title>True</title></head> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_in_text_template(self): """ @@ -383,7 +385,7 @@ self.assertEqual(""" Hi, you! - """, str(tmpl.generate())) + """, tmpl.generate().render(encoding=None)) def test_function_with_star_args(self): """ @@ -402,7 +404,7 @@ [1, 2] {'a': 3, 'b': 4} </div> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) class ForDirectiveTestCase(unittest.TestCase): @@ -424,7 +426,7 @@ <b>3</b> <b>4</b> <b>5</b> - </doc>""", str(tmpl.generate(items=range(1, 6)))) + </doc>""", tmpl.generate(items=range(1, 6)).render(encoding=None)) def test_as_element(self): """ @@ -441,7 +443,7 @@ <b>3</b> <b>4</b> <b>5</b> - </doc>""", str(tmpl.generate(items=range(1, 6)))) + </doc>""", tmpl.generate(items=range(1, 6)).render(encoding=None)) def test_multi_assignment(self): """ @@ -455,7 +457,8 @@ self.assertEqual("""<doc> <p>key=a, value=1</p> <p>key=b, value=2</p> - </doc>""", str(tmpl.generate(items=dict(a=1, b=2).items()))) + </doc>""", tmpl.generate(items=dict(a=1, b=2).items()) + .render(encoding=None)) def test_nested_assignment(self): """ @@ -469,7 +472,8 @@ self.assertEqual("""<doc> <p>0: key=a, value=1</p> <p>1: key=b, value=2</p> - </doc>""", str(tmpl.generate(items=enumerate(dict(a=1, b=2).items())))) + </doc>""", tmpl.generate(items=enumerate(dict(a=1, b=2).items())) + .render(encoding=None)) def test_not_iterable(self): """ @@ -528,7 +532,7 @@ </doc>""") self.assertEqual("""<doc> Hello - </doc>""", str(tmpl.generate(foo=True, bar='Hello'))) + </doc>""", tmpl.generate(foo=True, bar='Hello').render(encoding=None)) def test_as_element(self): """ @@ -539,7 +543,7 @@ </doc>""") self.assertEqual("""<doc> Hello - </doc>""", str(tmpl.generate(foo=True, bar='Hello'))) + </doc>""", tmpl.generate(foo=True, bar='Hello').render(encoding=None)) class MatchDirectiveTestCase(unittest.TestCase): @@ -558,7 +562,7 @@ </doc>""") self.assertEqual("""<doc> <div class="elem">Hey Joe</div> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_without_strip(self): """ @@ -575,7 +579,7 @@ <elem> <div class="elem">Hey Joe</div> </elem> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_as_element(self): """ @@ -589,7 +593,7 @@ </doc>""") self.assertEqual("""<doc> <div class="elem">Hey Joe</div> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_recursive_match_1(self): """ @@ -619,7 +623,7 @@ </subelem> </div> </elem> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_recursive_match_2(self): """ @@ -645,7 +649,7 @@ <div id="header"/><h1>Foo</h1> <div id="footer"/> </body> - </html>""", str(tmpl.generate())) + </html>""", tmpl.generate().render(encoding=None)) def test_recursive_match_3(self): tmpl = MarkupTemplate("""<test xmlns:py="http://genshi.edgewall.org/"> @@ -671,7 +675,7 @@ <generic> <ul><bullet>1</bullet><bullet>2</bullet></ul> </generic> - </test>""", str(tmpl.generate())) + </test>""", tmpl.generate().render(encoding=None)) def test_not_match_self(self): """ @@ -693,7 +697,7 @@ Hello! Goodbye! </h1></body> - </html>""", str(tmpl.generate())) + </html>""", tmpl.generate().render(encoding=None)) def test_select_text_in_element(self): """ @@ -719,7 +723,7 @@ </text> Goodbye! </h1></body> - </html>""", str(tmpl.generate())) + </html>""", tmpl.generate().render(encoding=None)) def test_select_all_attrs(self): tmpl = MarkupTemplate("""<doc xmlns:py="http://genshi.edgewall.org/"> @@ -732,7 +736,7 @@ <div id="joe"> Hey Joe </div> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_select_all_attrs_empty(self): tmpl = MarkupTemplate("""<doc xmlns:py="http://genshi.edgewall.org/"> @@ -745,7 +749,7 @@ <div> Hey Joe </div> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_select_all_attrs_in_body(self): tmpl = MarkupTemplate("""<doc xmlns:py="http://genshi.edgewall.org/"> @@ -758,7 +762,7 @@ <div> Hey Joe Cool </div> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_def_in_match(self): tmpl = MarkupTemplate("""<doc xmlns:py="http://genshi.edgewall.org/"> @@ -768,7 +772,7 @@ </doc>""") self.assertEqual("""<doc> <head><title>True</title></head> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) def test_match_with_xpath_variable(self): tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/"> @@ -781,10 +785,10 @@ <span> Hello Dude </span> - </div>""", str(tmpl.generate(tagname='greeting'))) + </div>""", tmpl.generate(tagname='greeting').render(encoding=None)) self.assertEqual("""<div> <greeting name="Dude"/> - </div>""", str(tmpl.generate(tagname='sayhello'))) + </div>""", tmpl.generate(tagname='sayhello').render(encoding=None)) def test_content_directive_in_match(self): tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> @@ -793,7 +797,7 @@ </html>""") self.assertEqual("""<html> <div>I said <q>bar</q>.</div> - </html>""", str(tmpl.generate())) + </html>""", tmpl.generate().render(encoding=None)) def test_cascaded_matches(self): tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> @@ -806,7 +810,7 @@ self.assertEqual("""<html> <head><title>Welcome to Markup</title></head> <body><h2>Are you ready to mark up?</h2><hr/></body> - </html>""", str(tmpl.generate())) + </html>""", tmpl.generate().render(encoding=None)) def test_multiple_matches(self): tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> @@ -836,7 +840,8 @@ <label>Hello_4</label> <input value="4" type="text" name="hello_4"/> </p></form> - </html>""", str(tmpl.generate(fields=fields, values=values))) + </html>""", tmpl.generate(fields=fields, values=values) + .render(encoding=None)) def test_namespace_context(self): tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" @@ -848,7 +853,7 @@ # such as the "x" in this example self.assertEqual("""<html xmlns:x="http://www.example.org/"> <div>Foo</div> - </html>""", str(tmpl.generate())) + </html>""", tmpl.generate().render(encoding=None)) def test_match_with_position_predicate(self): tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> @@ -863,7 +868,7 @@ <p class="first">Foo</p> <p>Bar</p> </body> - </html>""", str(tmpl.generate())) + </html>""", tmpl.generate().render(encoding=None)) def test_match_with_closure(self): tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> @@ -878,7 +883,7 @@ <p class="para">Foo</p> <div><p class="para">Bar</p></div> </body> - </html>""", str(tmpl.generate())) + </html>""", tmpl.generate().render(encoding=None)) def test_match_without_closure(self): tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> @@ -893,7 +898,7 @@ <p class="para">Foo</p> <div><p>Bar</p></div> </body> - </html>""", str(tmpl.generate())) + </html>""", tmpl.generate().render(encoding=None)) def test_match_with_once_attribute(self): tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> @@ -918,7 +923,7 @@ <body> <p>Bar</p> </body> - </html>""", str(tmpl.generate())) + </html>""", tmpl.generate().render(encoding=None)) def test_match_with_recursive_attribute(self): tmpl = MarkupTemplate("""<doc xmlns:py="http://genshi.edgewall.org/"> @@ -941,7 +946,64 @@ </subelem> </div> </elem> - </doc>""", str(tmpl.generate())) + </doc>""", tmpl.generate().render(encoding=None)) + + # See http://genshi.edgewall.org/ticket/254/ + def test_triple_match_produces_no_duplicate_items(self): + tmpl = MarkupTemplate("""<doc xmlns:py="http://genshi.edgewall.org/"> + <div py:match="div[@id='content']" py:attrs="select('@*')" once="true"> + <ul id="tabbed_pane" /> + ${select('*')} + </div> + + <body py:match="body" once="true" buffer="false"> + ${select('*|text()')} + </body> + <body py:match="body" once="true" buffer="false"> + ${select('*|text()')} + </body> + + <body> + <div id="content"> + <h1>Ticket X</h1> + </div> + </body> + </doc>""") + output = tmpl.generate().render('xhtml', doctype='xhtml') + matches = re.findall("tabbed_pane", output) + self.assertNotEqual(None, matches) + self.assertEqual(1, len(matches)) + + def test_match_multiple_times1(self): + # See http://genshi.edgewall.org/ticket/370 + tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> + <py:match path="body[@id='content']/h2" /> + <head py:match="head" /> + <head py:match="head" /> + <head /> + <body /> + </html>""") + self.assertEqual("""<html> + <head/> + <body/> + </html>""", tmpl.generate().render()) + + def test_match_multiple_times2(self): + # See http://genshi.edgewall.org/ticket/370 + tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> + <py:match path="body/div[@id='properties']" /> + <head py:match="head" /> + <head py:match="head" /> + <head/> + <body> + <div id="properties">Foo</div> + </body> + </html>""") + self.assertEqual("""<html> + <head/> + <body> + </body> + </html>""", tmpl.generate().render()) # FIXME #def test_match_after_step(self): @@ -955,7 +1017,7 @@ # <span> # Hello Dude # </span> - # </div>""", str(tmpl.generate())) + # </div>""", tmpl.generate().render(encoding=None)) class ContentDirectiveTestCase(unittest.TestCase): @@ -995,7 +1057,7 @@ </div>""", filename='test.html') self.assertEqual("""<div> Test - </div>""", str(tmpl.generate(title='Test'))) + </div>""", tmpl.generate(title='Test').render(encoding=None)) class StripDirectiveTestCase(unittest.TestCase): @@ -1007,7 +1069,7 @@ </div>""") self.assertEqual("""<div> <div><b>foo</b></div> - </div>""", str(tmpl.generate())) + </div>""", tmpl.generate().render(encoding=None)) def test_strip_empty(self): tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/"> @@ -1015,7 +1077,7 @@ </div>""") self.assertEqual("""<div> <b>foo</b> - </div>""", str(tmpl.generate())) + </div>""", tmpl.generate().render(encoding=None)) class WithDirectiveTestCase(unittest.TestCase): @@ -1031,7 +1093,7 @@ 42 84 42 - </div>""", str(tmpl.generate(x=42))) + </div>""", tmpl.generate(x=42).render(encoding=None)) def test_as_element(self): tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/"> @@ -1039,7 +1101,7 @@ </div>""") self.assertEqual("""<div> 84 - </div>""", str(tmpl.generate(x=42))) + </div>""", tmpl.generate(x=42).render(encoding=None)) def test_multiple_vars_same_name(self): tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/"> @@ -1052,7 +1114,7 @@ </div>""") self.assertEqual("""<div> baz - </div>""", str(tmpl.generate(x=42))) + </div>""", tmpl.generate(x=42).render(encoding=None)) def test_multiple_vars_single_assignment(self): tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/"> @@ -1060,7 +1122,7 @@ </div>""") self.assertEqual("""<div> 1 1 1 - </div>""", str(tmpl.generate(x=42))) + </div>""", tmpl.generate(x=42).render(encoding=None)) def test_nested_vars_single_assignment(self): tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/"> @@ -1068,7 +1130,7 @@ </div>""") self.assertEqual("""<div> 1 2 3 - </div>""", str(tmpl.generate(x=42))) + </div>""", tmpl.generate(x=42).render(encoding=None)) def test_multiple_vars_trailing_semicolon(self): tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/"> @@ -1076,7 +1138,7 @@ </div>""") self.assertEqual("""<div> 84 42 - </div>""", str(tmpl.generate(x=42))) + </div>""", tmpl.generate(x=42).render(encoding=None)) def test_semicolon_escape(self): tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/"> @@ -1088,7 +1150,7 @@ self.assertEqual("""<div> here is a semicolon: ; here are two semicolons: ;; - </div>""", str(tmpl.generate())) + </div>""", tmpl.generate().render(encoding=None)) def test_ast_transformation(self): """ @@ -1104,19 +1166,19 @@ <span> 42 </span> - </div>""", str(tmpl.generate(foo={'bar': 42}))) + </div>""", tmpl.generate(foo={'bar': 42}).render(encoding=None)) def test_unicode_expr(self): - tmpl = MarkupTemplate("""<div xmlns:py="http://genshi.edgewall.org/"> + tmpl = MarkupTemplate(u"""<div xmlns:py="http://genshi.edgewall.org/"> <span py:with="weeks=(u'一', u'二', u'三', u'四', u'五', u'六', u'日')"> $weeks </span> </div>""") - self.assertEqual("""<div> + self.assertEqual(u"""<div> <span> 一二三四五六日 </span> - </div>""", str(tmpl.generate())) + </div>""", tmpl.generate().render(encoding=None)) def test_with_empty_value(self): """ @@ -1126,7 +1188,7 @@ <span py:with="">Text</span></div>""") self.assertEqual("""<div> - <span>Text</span></div>""", str(tmpl.generate())) + <span>Text</span></div>""", tmpl.generate().render(encoding=None)) def suite():