summaryrefslogtreecommitdiff
path: root/src/zope/tal/runtest.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/zope/tal/runtest.py')
-rw-r--r--src/zope/tal/runtest.py154
1 files changed, 154 insertions, 0 deletions
diff --git a/src/zope/tal/runtest.py b/src/zope/tal/runtest.py
new file mode 100644
index 0000000..1cb75c8
--- /dev/null
+++ b/src/zope/tal/runtest.py
@@ -0,0 +1,154 @@
+#! /usr/bin/env python
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Driver program to run METAL and TAL regression tests.
+
+$Id$
+"""
+import glob
+import os
+import sys
+import traceback
+
+from cStringIO import StringIO
+
+if __name__ == "__main__":
+ import setpath # Local hack to tweak sys.path etc.
+
+import zope.tal.driver
+import zope.tal.tests.utils
+
+def showdiff(a, b):
+ import ndiff
+ cruncher = ndiff.SequenceMatcher(ndiff.IS_LINE_JUNK, a, b)
+ for tag, alo, ahi, blo, bhi in cruncher.get_opcodes():
+ if tag == "equal":
+ continue
+ print nicerange(alo, ahi) + tag[0] + nicerange(blo, bhi)
+ ndiff.dump('<', a, alo, ahi)
+ if a and b:
+ print '---'
+ ndiff.dump('>', b, blo, bhi)
+
+def nicerange(lo, hi):
+ if hi <= lo+1:
+ return str(lo+1)
+ else:
+ return "%d,%d" % (lo+1, hi)
+
+def main():
+ opts = []
+ args = sys.argv[1:]
+ quiet = 0
+ unittesting = 0
+ if args and args[0] == "-q":
+ quiet = 1
+ del args[0]
+ if args and args[0] == "-Q":
+ unittesting = 1
+ del args[0]
+ while args and args[0].startswith('-'):
+ opts.append(args[0])
+ del args[0]
+ if not args:
+ prefix = os.path.join("tests", "input", "test*.")
+ if zope.tal.tests.utils.skipxml:
+ xmlargs = []
+ else:
+ xmlargs = glob.glob(prefix + "xml")
+ xmlargs.sort()
+ htmlargs = glob.glob(prefix + "html")
+ htmlargs.sort()
+ args = xmlargs + htmlargs
+ if not args:
+ sys.stderr.write("No tests found -- please supply filenames\n")
+ sys.exit(1)
+ errors = 0
+ for arg in args:
+ locopts = []
+ if arg.find("metal") >= 0 and "-m" not in opts:
+ locopts.append("-m")
+ if arg.find("_sa") >= 0 and "-a" not in opts:
+ locopts.append("-a")
+ if not unittesting:
+ print arg,
+ sys.stdout.flush()
+ if zope.tal.tests.utils.skipxml and arg.endswith(".xml"):
+ print "SKIPPED (XML parser not available)"
+ continue
+ save = sys.stdout, sys.argv
+ try:
+ try:
+ sys.stdout = stdout = StringIO()
+ sys.argv = [""] + opts + locopts + [arg]
+ zope.tal.driver.main()
+ finally:
+ sys.stdout, sys.argv = save
+ except SystemExit:
+ raise
+ except:
+ errors = 1
+ if quiet:
+ print sys.exc_type
+ sys.stdout.flush()
+ else:
+ if unittesting:
+ print
+ else:
+ print "Failed:"
+ sys.stdout.flush()
+ traceback.print_exc()
+ continue
+ head, tail = os.path.split(arg)
+ outfile = os.path.join(
+ head.replace("input", "output"),
+ tail)
+ try:
+ f = open(outfile)
+ except IOError:
+ expected = None
+ print "(missing file %s)" % outfile,
+ else:
+ expected = f.readlines()
+ f.close()
+ stdout.seek(0)
+ if hasattr(stdout, "readlines"):
+ actual = stdout.readlines()
+ else:
+ actual = readlines(stdout)
+ if actual == expected:
+ if not unittesting:
+ print "OK"
+ else:
+ if unittesting:
+ print
+ else:
+ print "not OK"
+ errors = 1
+ if not quiet and expected is not None:
+ showdiff(expected, actual)
+ if errors:
+ sys.exit(1)
+
+def readlines(f):
+ L = []
+ while 1:
+ line = f.readline()
+ if not line:
+ break
+ L.append(line)
+ return L
+
+if __name__ == "__main__":
+ main()