| # 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') | 
 | 	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(filename) | 
 | 		import testall | 
 | 	finally: | 
 | 		sys.stdout = real_stdout | 
 | 	print 'All tests OK.' | 
 |  | 
 | main() |