summaryrefslogtreecommitdiffstats
path: root/Lib/test/autotest.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/autotest.py')
-rw-r--r--Lib/test/autotest.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/Lib/test/autotest.py b/Lib/test/autotest.py
new file mode 100644
index 0000000..57e3674
--- /dev/null
+++ b/Lib/test/autotest.py
@@ -0,0 +1,68 @@
+# Automatic Python regression test.
+#
+# Some essential parts of the Python interpreter are tested by the module
+# 'testall'. (Despite its name, it doesn't test everything -- that would
+# be a truly Herculean task!) When a test fails, 'testall' raises an
+# exception. When all tests succeed, it produces quite a lot of output.
+#
+# For a normal regression test, this output is never looked at unless
+# something goes wrong. Thus, it would be wise to suppress the output
+# normally. This module does that, but it doesn't just throw the output
+# from 'testall' away -- it compares it with the output from a previous
+# run. If a difference is noticed it raises an exception; if all is well,
+# it prints nothing except 'All tests OK.' at the very end.
+#
+# The output from a previous run is supposed to be in a file 'testall.out'
+# somewhere on the search path for modules (sys.path, initialized from
+# $PYTHONPATH plus some default places).
+#
+# Of course, if the normal output of the tests is changed because the
+# tests have been changed (rather than a test producing the wrong output),
+# 'autotest' will fail as well. In this case, run 'testall' manually
+# and direct its output to 'testall.out'.
+#
+# The comparison uses (and demonstrates!) a rather new Python feature:
+# program output that normally goes to stdout (by 'print' statements
+# or by writing directly to sys.stdout) can be redirected to an
+# arbitrary class instance as long as it has a 'write' method.
+
+import os
+import sys
+
+# Function to find a file somewhere on sys.path
+def findfile(filename):
+ for dirname in sys.path:
+ fullname = os.path.join(dirname, filename)
+ if os.path.exists(fullname):
+ return fullname
+ return filename # Will cause exception later
+
+# Exception raised when the test failed (not the same as in test_support)
+TestFailed = 'autotest.TestFailed'
+
+# Class substituted for sys.stdout, to compare it with the given file
+class Compare:
+ def init(self, filename):
+ self.fp = open(filename, 'r')
+ return self
+ def write(self, data):
+ expected = self.fp.read(len(data))
+ if data <> expected:
+ raise TestFailed, \
+ 'Writing: '+`data`+', expected: '+`expected`
+ def close(self):
+ self.fp.close()
+
+# The main program
+def main():
+ import sys
+ filename = findfile('testall.out')
+ real_stdout = sys.stdout
+ try:
+ sys.stdout = Compare().init(filename)
+ import testall
+ finally:
+ sys.stdout = real_stdout
+ print 'All tests OK.'
+
+main()