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():
Copyright (C) 2012-2017 Edgewall Software