Add more tests. Test both the Python and C implem ... (quixote/test/test_html.py)

Neil Schemenauer <nascheme-fVcApmY9cLvQ3/1i3zOLAti2O/[email protected]> Wed, 08 Jan 2003 14:46:09 -0500
Newsgroups gmane.comp.web.quixote.cvs
Message-ID <[email protected]>
Update of /home/cvs/quixote/test
In directory hewson:/tmp/cvs-serv20173/test

Modified Files:
	test_html.py 
Log Message:
Add more tests.  Test both the Python and C implementation.


Index: test_html.py
===================================================================
RCS file: /home/cvs/quixote/test/test_html.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- test_html.py	20 Nov 2002 19:43:23 -0000	1.2
+++ test_html.py	8 Jan 2003 19:46:07 -0000	1.3
@@ -1,5 +1,6 @@
 from sancho.unittest import TestScenario, parse_args, run_scenarios
-from quixote.html import htmltext, htmlescape
+from quixote import _py_htmltext
+from quixote import _c_htmltext
 
 tested_modules = [ "quixote.html" ]
 
@@ -13,13 +14,23 @@
     def __str__ (self):
         return self.s
 
+class Broken:
+    def __str__(self):
+        raise RuntimeError, 'eieee'
+
+    def __repr__(self):
+        raise RuntimeError, 'eieee'
+
 markupchars = '<>&"'
 quotedchars = '&lt;&gt;&amp;&quot;'
 
 class HTMLTest (TestScenario):
 
     def setup (self):
-        pass
+        global htmltext, escape, htmlescape
+        htmltext = _py_htmltext.htmltext
+        escape = _py_htmltext._escape_string
+        htmlescape = _py_htmltext.htmlescape
 
     def shutdown (self):
         pass
@@ -30,16 +41,24 @@
         self.test_val("str(htmltext(markupchars))", markupchars)
         self.test_val("str(htmltext(None))", 'None')
         self.test_val("str(htmltext(1))", '1')
+        self.test_exc("htmltext(Broken())", RuntimeError)
 
-    def check_quote (self):
+    def check_escape (self):
         self.test_val("htmlescape(markupchars)", quotedchars)
-        self.test_val("htmltext.quote(markupchars)", quotedchars)
+        self.test_bool("isinstance(htmlescape(markupchars), htmltext)")
+        self.test_val("escape(markupchars)", quotedchars)
+        self.test_bool("isinstance(escape(markupchars), str)")
         self.test_val("htmlescape(htmlescape(markupchars))", quotedchars)
+        self.test_exc("escape(1)", TypeError)
 
     def check_cmp (self):
         s = htmltext("foo")
         self.test_bool("s == 'foo'")
         self.test_bool("s != 'bar'")
+        self.test_bool("s == htmltext('foo')")
+        self.test_bool("s != htmltext('bar')")
+        self.test_bool("htmltext('1') != 1")
+        self.test_bool("1 != s")
 
     def check_len (self):
         self.test_val("len(htmltext('foo'))", 3)
@@ -57,25 +76,44 @@
         self.test_val("'bar' + s", "barfoo")
         self.test_val("s + htmltext('bar')", "foobar")
         self.test_val("s + markupchars", "foo" + quotedchars)
+        self.test_bool("isinstance(s + markupchars, htmltext)")
         self.test_val("markupchars + s", quotedchars + "foo")
+        self.test_bool("isinstance(markupchars + s, htmltext)")
+        self.test_exc("s + 1", TypeError)
+        self.test_exc("1 + s", TypeError)
 
     def check_repeat (self):
-        self.test_val("htmltext('a') * 3", "aaa")
+        s = htmltext('a')
+        self.test_val("s * 3", "aaa")
+        self.test_bool("isinstance(s * 3, htmltext)")
         self.test_val("htmlescape(markupchars) * 3", quotedchars * 3)
+        self.test_exc("s * 'a'", TypeError)
+        self.test_exc("'a' * s", TypeError)
+        self.test_exc("s * s", TypeError)
 
     def check_format (self):
-        self.test_val("htmltext('%s') % 'foo'", "foo")
-        self.test_val("htmltext('%s') % markupchars", quotedchars)
-        self.test_val("htmltext('%s') % None", "None")
+        s_fmt = htmltext('%s')
+        self.test_val("s_fmt % 'foo'", "foo")
+        self.test_bool("isinstance(s_fmt % 'foo', htmltext)")
+        self.test_val("s_fmt % markupchars", quotedchars)
+        self.test_val("s_fmt % None", "None")
         self.test_val("htmltext('%r') % Wrapper(markupchars)", quotedchars)
         self.test_val("htmltext('%s%s') % ('foo', htmltext(markupchars))",
                       "foo" + markupchars)
         self.test_val("htmltext('%d') % 10", "10")
         self.test_val("htmltext('%.1f') % 10", "10.0")
+        self.test_exc("s_fmt % Broken()", RuntimeError)
+        self.test_exc("s_fmt % (1, 2)", TypeError)
 
     def check_dict_format (self):
         self.test_val("htmltext('%(a)s %(a)r %(b)s') % "
-                      " {'a': 'foo', 'b': htmltext('bar')}", "foo 'foo' bar")
+                      " {'a': 'foo&', 'b': htmltext('bar&')}",
+                      "foo&amp; 'foo&amp;' bar&")
+        self.test_val("htmltext('%(a)s') % {'a': 'foo&'}", "foo&amp;")
+        self.test_bool("isinstance(htmltext('%(a)s') % {'a': 'a'}, htmltext)")
+        self.test_val("htmltext('%s') % {'a': 'foo&'}", "{'a': 'foo&amp;'}")
+        self.test_exc("htmltext('%(a)s') % 1", TypeError)
+        self.test_exc("htmltext('%(a)s') % {}", KeyError)
 
     def check_join (self):
         self.test_val("htmltext(' ').join(['foo', 'bar'])", "foo bar")
@@ -85,27 +123,53 @@
                       "foo" + quotedchars + "bar")
         self.test_val("htmltext(' ').join([htmltext(markupchars), 'bar'])",
                       markupchars + " bar")
+        self.test_bool("isinstance(htmltext('').join([]), htmltext)")
+        self.test_exc("htmltext('').join(1)", TypeError)
+        self.test_exc("htmltext('').join([1])", TypeError)
 
     def check_startswith (self):
         self.test_bool("htmltext('foo').startswith('fo')")
         self.test_bool("htmlescape(markupchars).startswith(markupchars[:3])")
         self.test_bool("htmltext(markupchars).startswith("
                        "  htmltext(markupchars[:3]))")
+        self.test_exc("htmltext('').startswith(1)", TypeError)
 
     def check_endswith (self):
         self.test_bool("htmltext('foo').endswith('oo')")
         self.test_bool("htmlescape(markupchars).endswith(markupchars[-3:])")
         self.test_bool("htmltext(markupchars).endswith("
                        "  htmltext(markupchars[-3:]))")
+        self.test_exc("htmltext('').endswith(1)", TypeError)
 
     def check_replace (self):
         self.test_val("htmlescape('&').replace('&', 'foo')", "foo")
         self.test_val("htmltext('&').replace(htmltext('&'), 'foo')", "foo")
         self.test_val("htmltext('foo').replace('foo', htmltext('&'))", "&")
+        self.test_bool("isinstance(htmltext('a').replace('a', 'b'), htmltext)")
+        self.test_exc("htmltext('').replace(1, 'a')", TypeError)
 
+    def check_lower (self):
+        self.test_val("htmltext('aB').lower()", "ab")
+        self.test_bool("isinstance(htmltext('a').lower(), htmltext)")
+
+    def check_upper (self):
+        self.test_val("htmltext('aB').upper()", "AB")
+        self.test_bool("isinstance(htmltext('a').upper(), htmltext)")
+
+    def check_capitalize (self):
+        self.test_val("htmltext('aB').capitalize()", "Ab")
+        self.test_bool("isinstance(htmltext('a').capitalize(), htmltext)")
 
 
+class CHTMLTest(HTMLTest):
+    def setup (self):
+        # using globals like this is a bit of a hack since it assumes
+        # Sancho tests each class individually, oh well
+        global htmltext, escape, htmlescape
+        htmltext = _c_htmltext.htmltext
+        escape = _c_htmltext._escape_string
+        htmlescape = _c_htmltext.htmlescape
+
 if __name__ == "__main__":
     (scenarios, options) = parse_args()
     run_scenarios (scenarios, options)
-