[ZPT] CVS: Packages/TAL - test_htmltalparser.py:1.7

guido@digicool.com guido@digicool.com
Wed, 28 Mar 2001 17:48:13 -0500 (EST)


Update of /cvs-repository/Packages/TAL/test
In directory korak:/tmp/cvs-serv3780

Modified Files:
	test_htmltalparser.py 
Log Message:
Added TAL testcases.  Still to do METAL testcases.



--- Updated File test_htmltalparser.py in package Packages/TAL --
--- test_htmltalparser.py	2001/03/26 22:29:01	1.6
+++ test_htmltalparser.py	2001/03/28 22:48:12	1.7
@@ -11,12 +11,25 @@
 from TAL.TALDefs import TAL_VERSION
 
 
-class HTMLTALParserTestCases(unittest.TestCase):
+class TestCaseBase(unittest.TestCase):
 
+    prologue = ""
+    epilogue = ""
+    initial_program = [('version', TAL_VERSION), ('mode', 'html')]
+    final_program = []
+
+    def _merge(self, p1, p2):
+        if p1 and p2 and p1[-1][0] == 'rawtext' and p2[0][0] == 'rawtext':
+            return p1[:-1] + [('rawtext', p1[-1][1] + p2[0][1])] + p2[1:]
+        else:
+            return p1+p2
+
     def _run_check(self, source, program, macros={}):
         parser = HTMLTALParser.HTMLTALParser()
-        parser.parseString(source)
+        parser.parseString(self.prologue + source + self.epilogue)
         got_program, got_macros = parser.getCode()
+        program = self._merge(self.initial_program, program)
+        program = self._merge(program, self.final_program)
         self.assert_(got_program == program, got_program)
         self.assert_(got_macros == macros, got_macros)
 
@@ -27,23 +40,20 @@
         pprint.pprint(got_program)
         pprint.pprint(got_macros)
 
+
+class HTMLTALParserTestCases(TestCaseBase):
+
     def check_code_simple_identity(self):
         self._run_check("""<html a='b' b="c" c=d><title>My Title</html>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '<html a="b" b="c" c="d">'
                         '<title>My Title</title></html>'),
             ])
 
     def check_code_implied_list_closings(self):
         self._run_check("""<ul><li><p><p><li></ul>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '<ul><li><p></p><p></p></li><li></li></ul>'),
             ])
         self._run_check("""<dl><dt><dt><dd><dd><ol><li><li></ol></dl>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '<dl><dt></dt><dt></dt><dd></dd>'
                         '<dd><ol><li></li><li></li></ol></dd></dl>'),
             ])
@@ -51,16 +61,12 @@
     def check_code_implied_table_closings(self):
         self._run_check("""<p>text <table><tr><th>head\t<tr><td>cell\t"""
                         """<table><tr><td>cell \n \t \n<tr>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '<p>text</p> <table><tr><th>head</th>'
                         '</tr>\t<tr><td>cell\t<table><tr><td>cell</td>'
                         '</tr> \n \t \n<tr></tr></table></td></tr></table>'),
             ])
         self._run_check("""<table><tr><td>cell """
                         """<table><tr><td>cell </table></table>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '<table><tr><td>cell <table><tr><td>cell</td></tr>'
                         ' </table></td></tr></table>'),
             ])
@@ -72,8 +78,6 @@
 
     def check_code_attr_syntax(self):
         output = [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '<a b="v" c="v" d="v" e></a>'),
             ]
         self._run_check("""<a b='v' c="v" d=v e>""", output)
@@ -84,68 +88,220 @@
     def check_code_attr_values(self):
         self._run_check(
             """<a b='xxx\n\txxx' c="yyy\t\nyyy" d='\txyz\n'>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext',
              '<a b="xxx\n\txxx" c="yyy\t\nyyy" d="\txyz\n"></a>')])
         self._run_check("""<a b='' c="" d=>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '<a b="" c="" d=""></a>'),
             ])
 
     def check_code_attr_entity_replacement(self):
         # we expect entities *not* to be replaced by HTLMParser!
         self._run_check("""<a b='&amp;&gt;&lt;&quot;&apos;'>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '<a b="&amp;&gt;&lt;&quot;\'"></a>'),
             ])
         self._run_check("""<a b='\"'>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', "<a b='\"'></a>"),
             ])
         self._run_check("""<a b='&'>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '<a b="&amp;"></a>'),
             ])
         self._run_check("""<a b='<'>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '<a b="&lt;"></a>'),
             ])
 
     def check_code_attr_funky_names(self):
         self._run_check("""<a a.b='v' c:d=v e-f=v>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '<a a.b="v" c:d="v" e-f="v"></a>'),
             ])
 
     def check_code_pcdata_entityref(self):
         self._run_check("""&nbsp;""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '&nbsp;'),
             ])
 
     def check_code_short_endtags(self):
         self._run_check("""<html><img/></html>""", [
-            ('version', TAL_VERSION),
-            ('mode', 'html'),
             ('rawtext', '<html><img/></html>'),
             ])
 
 
+class TALGeneratorTestCases(TestCaseBase):
+
+    def check_null(self):
+        self._run_check("", [])
+
+    def check_define(self):
+        self._run_check("<p tal:define='xyzzy string:spam'></p>", [
+            ('setPosition', (1, 0)),
+            ('beginScope',),
+            ('setLocal', 'xyzzy', '$string:spam$'),
+            ('rawtext', '<p tal:define="xyzzy string:spam"></p>'),
+            ('endScope',),
+            ])
+        self._run_check("<p tal:define='local xyzzy string:spam'></p>", [
+            ('setPosition', (1, 0)),
+            ('beginScope',),
+            ('setLocal', 'xyzzy', '$string:spam$'),
+            ('rawtext', '<p tal:define="local xyzzy string:spam"></p>'),
+            ('endScope',),
+            ])
+        self._run_check("<p tal:define='global xyzzy string:spam'></p>", [
+            ('setPosition', (1, 0)),
+            ('beginScope',),
+            ('setGlobal', 'xyzzy', '$string:spam$'),
+            ('rawtext', '<p tal:define="global xyzzy string:spam"></p>'),
+            ('endScope',),
+            ])
+        self._run_check("<p tal:define='x string:spam; y x'></p>", [
+            ('setPosition', (1, 0)),
+            ('beginScope',),
+            ('setLocal', 'x', '$string:spam$'),
+            ('setLocal', 'y', '$x$'),
+            ('rawtext', '<p tal:define="x string:spam; y x"></p>'),
+            ('endScope',),
+            ])
+        self._run_check("<p tal:define='x string:;;;;; y x'></p>", [
+            ('setPosition', (1, 0)),
+            ('beginScope',),
+            ('setLocal', 'x', '$string:;;$'),
+            ('setLocal', 'y', '$x$'),
+            ('rawtext', '<p tal:define="x string:;;;;; y x"></p>'),
+            ('endScope',),
+            ])
+        self._run_check(
+            "<p tal:define='x string:spam; global y x; local z y'></p>", [
+            ('setPosition', (1, 0)),
+            ('beginScope',),
+            ('setLocal', 'x', '$string:spam$'),
+            ('setGlobal', 'y', '$x$'),
+            ('setLocal', 'z', '$y$'),
+            ('rawtext',
+             '<p tal:define="x string:spam; global y x; local z y"></p>'),
+            ('endScope',),
+            ])
+
+    def check_condition(self):
+        self._run_check(
+            "<p><span tal:condition='python:1'><b>foo</b></span></p>", [
+            ('rawtext', '<p>'),
+            ('setPosition', (1, 3)),
+            ('condition', '$python:1$',
+             [('rawtext',
+               '<span tal:condition="python:1"><b>foo</b></span>')]),
+            ('rawtext', '</p>'),
+            ])
+
+    def check_content(self):
+        self._run_check("<p tal:content='string:foo'>bar</p>", [
+             ('setPosition', (1, 0)),
+             ('rawtext', '<p tal:content="string:foo">'),
+             ('insertText', '$string:foo$', [('rawtext', 'bar')]),
+             ('rawtext', '</p>'),
+             ])
+        self._run_check("<p tal:content='text string:foo'>bar</p>", [
+             ('setPosition', (1, 0)),
+             ('rawtext', '<p tal:content="text string:foo">'),
+             ('insertText', '$string:foo$', [('rawtext', 'bar')]),
+             ('rawtext', '</p>'),
+             ])
+        self._run_check("<p tal:content='structure string:<br>'>bar</p>", [
+             ('setPosition', (1, 0)),
+             ('rawtext', '<p tal:content="structure string:&lt;br&gt;">'),
+             ('insertStructure', '$string:<br>$', {}, [('rawtext', 'bar')]),
+             ('rawtext', '</p>'),
+             ])
+
+    def check_replace(self):
+        self._run_check("<p tal:replace='string:foo'>bar</p>", [
+             ('setPosition', (1, 0)),
+             ('insertText', '$string:foo$',
+              [('rawtext', '<p tal:replace="string:foo">bar</p>')]),
+             ])
+        self._run_check("<p tal:replace='text string:foo'>bar</p>", [
+             ('setPosition', (1, 0)),
+             ('insertText', '$string:foo$',
+              [('rawtext', '<p tal:replace="text string:foo">bar</p>')]),
+             ])
+        self._run_check("<p tal:replace='structure string:<br>'>bar</p>", [
+             ('setPosition', (1, 0)),
+             ('insertStructure', '$string:<br>$', {},
+              [('rawtext',
+                '<p tal:replace="structure string:&lt;br&gt;">bar</p>')]),
+             ])
+
+    def check_repeat(self):
+        self._run_check("<p tal:repeat='x python:(1,2,3)'>"
+                        "<span tal:replace='x'>dummy</span></p>", [
+             ('setPosition', (1, 0)),
+             ('beginScope',),
+             ('loop', 'x', '$python:(1,2,3)$',
+              [('rawtext', '<p tal:repeat="x python:(1,2,3)">'),
+               ('setPosition', (1, 33)),
+               ('insertText', '$x$',
+                [('rawtext', '<span tal:replace="x">dummy</span>')]),
+               ('rawtext', '</p>')]),
+             ('endScope',),
+             ])
+
+    def check_attributes(self):
+        self._run_check("<a href='foo' name='bar' tal:attributes="
+                        "'href string:http://www.zope.org; x string:y'>"
+                        "link</a>", [
+            ('setPosition', (1, 0)),
+            ('startTag', 'a',
+             [('href', 'foo', 'replace', '$string:http://www.zope.org$'),
+              ('name', 'bar'),
+              ('tal:attributes',
+               'href string:http://www.zope.org; x string:y'),
+              ('x', '', 'replace', '$string:y$')]),
+            ('rawtext', 'link</a>'),
+            ])
+        self._run_check("<p tal:replace='structure string:<img>' "
+                        "tal:attributes='src string:foo.png'>duh</p>", [
+            ('setPosition', (1, 0)),
+            ('insertStructure', '$string:<img>$',
+             {'src': '$string:foo.png$'},
+             [('rawtext',
+               '<p tal:replace="structure string:&lt;img&gt;" '
+               'tal:attributes="src string:foo.png">duh</p>')]),
+            ])
+
+    def check_on_error(self):
+        self._run_check("<p tal:on-error='string:error' "
+                        "tal:content='notHere'>okay</p>", [
+            ('setPosition', (1, 0)),
+            ('onError',
+             [('rawtext',
+               '<p tal:on-error="string:error" tal:content="notHere">'),
+              ('insertText', '$notHere$', [('rawtext', 'okay')]),
+              ('rawtext', '</p>')],
+             [('rawtext',
+               '<p tal:on-error="string:error" tal:content="notHere">'),
+              ('insertText', '$string:error$', []),
+              ('rawtext', '</p>')]),
+            ])
+        self._run_check("<p tal:on-error='string:error' "
+                        "tal:replace='notHere'>okay</p>", [
+            ('setPosition', (1, 0)),
+            ('onError',
+             [('insertText', '$notHere$',
+               [('rawtext',
+                 '<p tal:on-error="string:error" '
+                 'tal:replace="notHere">okay</p>')])],
+             [('rawtext',
+               '<p tal:on-error="string:error" tal:replace="notHere">'),
+              ('insertText', '$string:error$', []),
+              ('rawtext', '</p>')]),
+            ])
+
+
 def test_suite():
     suite = unittest.TestSuite()
     suite.addTest(unittest.makeSuite(HTMLTALParserTestCases, "check_"))
+    suite.addTest(unittest.makeSuite(TALGeneratorTestCases, "check_"))
     return suite
 
 
 if __name__ == "__main__":
     errs = utils.run_suite(test_suite())
     sys.exit(errs and 1 or 0)
-