Two attachments: one to convert the existing test_parser.py to use unittset (this patch also includes some minor cleanup to test_tokenizer); and the other is a master script to run all tests (place this script in the tests directory).

As more tests are created, much of this code can be refactored further.

- Sam Ruby
Index: tests/test_tokenizer.py
===================================================================
--- tests/test_tokenizer.py	(revision 215)
+++ tests/test_tokenizer.py	(working copy)
@@ -7,12 +7,6 @@
 
 import simplejson
 
-#Allow us to import the parent module
-os.chdir(os.path.split(os.path.abspath(__file__))[0])
-sys.path.insert(0, os.path.abspath(os.pardir))
-
-import tokenizer
-
 class TokenizerTestParser(object):
     def parse(self, stream, innerHTML=False):
         """Stream should be a stream of unicode bytes. Character encoding
@@ -20,6 +14,7 @@
 
         self.outputTokens = []        
 
+        import tokenizer
         self.tokenizer = tokenizer.HTMLTokenizer(self)
         self.tokenizer.tokenize(stream)
         
@@ -100,8 +95,7 @@
             yield (TestCase.runTokenizerTest, test['description'],
                    test['input'], test['output'])
 
-def main():
-    failed = 0
+def buildTestSuite():
     tests = 0
     for func, desc, input, output in test_tokenizer():
         tests += 1
@@ -111,7 +105,15 @@
         testFunc.__doc__ = "\t".join([desc, str(input), str(output)]) 
         instanceMethod = new.instancemethod(testFunc, None, TestCase)
         setattr(TestCase, testName, instanceMethod)
+    return unittest.TestLoader().loadTestsFromTestCase(TestCase)
+
+def main():
+    buildTestSuite()
     unittest.main()
 
 if __name__ == "__main__":
+    #Allow us to import the parent module
+    os.chdir(os.path.split(os.path.abspath(__file__))[0])
+    sys.path.insert(0, os.path.abspath(os.pardir))
+
     main()
Index: tests/test_parser.py
===================================================================
--- tests/test_parser.py	(revision 215)
+++ tests/test_parser.py	(working copy)
@@ -4,14 +4,7 @@
 import StringIO
 import unittest
 import new
-import traceback
 
-#Allow us to import the parent module
-os.chdir(os.path.split(os.path.abspath(__file__))[0])
-sys.path.insert(0, os.path.abspath(os.pardir))
-
-import parser
-
 def parseTestcase(testString):
     testString = testString.split("\n")
     try:
@@ -48,68 +41,50 @@
             rv.append(line[3:])
     return "\n".join(rv)
 
+class TestCase(unittest.TestCase):
+    def runParserTest(self, input, output, errors):
+        import parser
+        #XXX - move this out into the setup function
+        #concatenate all consecutive character tokens into a single token
+        p = parser.HTMLParser()
+        document = p.parse(StringIO.StringIO(input))
+        self.assertEquals(output, convertTreeDump(document.printTree()))
+
 def test_parser():
     for filename in glob.glob('tree-construction/*.dat'):
         f = file(filename)
         test = []
         lastLine = ""
         for line in f:
-            #Assume tests are seperated by a blank line
+            #Assume tests are separated by a blank line
             if not (line == "\n" and lastLine[0] == "|"):
-                #Strip out newlinw characters from the end of the string
+                #Strip out newline characters from the end of the string
                 test.append(line[:-1])
             else:
                 input, output, errors = parseTestcase("\n".join(test))
-                yield runParserTest, input, output, errors
+                yield TestCase.runParserTest, input, output, errors
                 test = []
             lastLine = line
 
-def runParserTest(input, output, errors):
-    #XXX - move this out into the setup function
-    #concatenate all consecutive character tokens into a single token
-    p = parser.HTMLParser()
-    document = p.parse(StringIO.StringIO(input))
-    try:
-        #Need a check on the number of parse errors here
-        assert output == convertTreeDump(document.printTree())
-    except:
-        sys.stdout.write("input\n")
-        sys.stdout.write(input+"\n")
-        sys.stdout.write("expected output\n")
-        sys.stdout.write(output+"\n")
-        sys.stdout.write("received\n")
-        sys.stdout.write(convertTreeDump(document.printTree())+"\n")
-        sys.stdout.write("\n")
-        raise
-
-def main():
-    failed = 0
+def buildTestSuite():
     tests = 0
     for func, input, output, errors in test_parser():
         tests += 1
         testName = 'test%d' % tests
-        try:
-            runParserTest(input, output, errors)
-        except AssertionError:
-            failed += 1
-        except:
-            sys.stdout.write("ERROR\n")
-            sys.stdout.write(input+"\n")
-            sys.stderr = sys.stdout
-            traceback.print_exc()
-            sys.stderr = sys.__stderr__
-            sys.stdout.write("\n")
-            failed += 1
+        testFunc = lambda self, method=func, input=input, output=output, \
+            errors=errors: method(self, input, output, errors)
+        testFunc.__doc__ = 'Parser %s: %s' % (testName, input)
+        instanceMethod = new.instancemethod(testFunc, None, TestCase)
+        setattr(TestCase, testName, instanceMethod)
+    return unittest.TestLoader().loadTestsFromTestCase(TestCase)
 
-    print "Ran %i tests, failed %i"%(tests, failed)
+def main():
+    buildTestSuite()
+    unittest.main()
 
-#         def testFunc(self, method=func, input=input,
-#                      output=output, errors=errors):
-#             method(self, input, output, errors)
-#         testFunc.__doc__ = "\t".join([str(input)]) 
-#         instanceMethod = new
-#        setattr(TestCase, testName, instanceMethod)
-#   unittest.main()
-
 if __name__ == "__main__":
+    #Allow us to import the parent module
+    os.chdir(os.path.split(os.path.abspath(__file__))[0])
+    sys.path.insert(0, os.path.abspath(os.pardir))
+
     main()
import sys
import os
import glob
import unittest

def buildTestSuite():
    suite = unittest.TestSuite()
    for testcase in glob.glob('test_*.py'):
        module = os.path.splitext(testcase)[0]
        suite.addTest(__import__(module).buildTestSuite())
    return suite

def main():
    unittest.TextTestRunner().run(buildTestSuite())

if __name__ == "__main__":
    #Allow us to import the parent module
    os.chdir(os.path.split(os.path.abspath(__file__))[0])
    sys.path.insert(0, os.path.abspath(os.pardir))

    main()
_______________________________________________
implementors mailing list
[email protected]
http://lists.whatwg.org/listinfo.cgi/implementors-whatwg.org

Reply via email to