[Anygui-checkins] CVS: nondist/sandbox/magnus/tester2 runme.py,NONE,1.1
Brought to you by:
mlh
|
From: Magnus L. H. <ml...@us...> - 2003-02-08 02:14:22
|
Update of /cvsroot/anygui/nondist/sandbox/magnus/tester2
In directory sc8-pr-cvs1:/tmp/cvs-serv18738
Added Files:
runme.py
Log Message:
--- NEW FILE: runme.py ---
#!/usr/bin/env python
# FIXME: Currently resets all results; should keep results from other
# back-ends. Rewrite to create a single table of successes/failures for all
# back-ends, parse in existing test results from the result file, and
# display the test descriptions only once, below the table.
import os, sys
from time import *
from glob import glob
from anygui import *
from anygui.Utils import topologicalSort
TEST_DIR = 'tests'
TEST_PAT = 'test_*.py'
RESULT_FILE = 'results.html'
HEAD = """\
<html>
<head>
<title>Anygui Test Results</title>
<style>
body { color: #000000;
background-color: #ffffff; }
a:active { color: #ff0000; }
a:visited { color: #551a8b; }
a:link { color: #0000bb; }
h1, h2, h3, h4, h5, h6 { font-family: avantgarde, sans-serif;
font-weight: bold; }
h1 { font-size: 180%%; }
h2 { font-size: 150%%; }
h3, h4 { font-size: 120%%; }
code, tt { font-family: lucida typewriter, lucidatypewriter,
monospace; }
var { font-family: times, serif;
font-style: italic;
font-weight: normal; }
.typelabel { font-family: lucida, sans-serif; }
.navigation td { background-color: #99ccff;
font-weight: bold;
font-family: avantgarde, sans-serif;
font-size: 110%%; }
.release-info { font-style: italic; }
.titlegraphic { vertical-align: top; }
.verbatim { color: #00008b;
font-family: lucida typewriter, lucidatypewriter,
monospace; }
.grammar { background-color: #99ccff;
margin-right: 0.5in;
padding: 0.05in; }
.productions { background-color: #bbeeff; }
.productions table { vertical-align: baseline; }
.grammar-footer { padding: 0.05in;
font-size: 85%%; }
.email { font-family: avantgarde, sans-serif; }
.mailheader { font-family: avantgarde, sans-serif; }
.mimetype { font-family: avantgarde, sans-serif; }
.newsgroup { font-family: avantgarde, sans-serif; }
.url { font-family: avantgarde, sans-serif; }
.file { font-family: avantgarde, sans-serif; }
.tableheader { background-color: #99ccff;
font-family: avantgarde, sans-serif; }
</style>
</head>
<body>
<div class="navigation">
<table align="center" width="100%%" cellpadding="0" cellspacing="2">
<tr>
<td><img src="icons/blank.gif"
border="0" height="32"
alt="" width="32"></td>
<td><img src="icons/blank.gif"
border="0" height="32"
alt="Up One Level" width="32"></td>
<td><img src="icons/up.gif"
border="0" height="32"
alt="Next Page" width="32"></td>
<td align="center" width="100%%">Anygui Test Results</td>
<td><img src="icons/blank.gif"
border="0" height="32"
alt="Contents" width="32"></td>
<td><img src="icons/blank.gif"
border="0" height="32"
alt="Module Index" width="32"></td>
<td><img src="icons/blank.gif"
border="0" height="32"
alt="Index" width="32"></td>
</tr></table>
<b class="navlabel">Up:</b> <a class="sectref" HREF="http://www.anygui.org">Anygui home</a>
<br /><hr />
</div>
<div class="titlepage">
<center>
<h1>Anygui Test Results</h1>
<strong>%s</strong></p>
<p>
</center>
</div>
<br />
<hr />
<h2>Test Results for <code>%sgui</code></h2>
""" % (strftime('%Y-%m-%d %H:%M:%S', localtime()), backend())
FOOT = """\
<div class="navigation">
<hr />
<table align="center" width="100%" cellpadding="0" cellspacing="2">
<tr>
<td><img src="icons/blank.gif"
border="0" height="32"
alt="" width="32"></td>
<td><img src="icons/blank.gif"
border="0" height="32"
alt="Up One Level" width="32"></td>
<td><img src="icons/up.gif"
border="0" height="32"
alt="Next Page" width="32"></td>
<td align="center" width="100%">Anygui Test Results</td>
<td><img src="icons/blank.gif"
border="0" height="32"
alt="Contents" width="32"></td>
<td><img src="icons/blank.gif"
border="0" height="32"
alt="Module Index" width="32"></td>
<td><img src="icons/blank.gif"
border="0" height="32"
alt="Index" width="32"></td>
</tr></table>
<b class="navlabel">Up:</b> <a class="sectref" HREF="http://www.anygui.org">Anygui home</a>
<br><hr />
</div>
</body>
</html>"""
def testFiles():
return glob(os.path.join(TEST_DIR, TEST_PAT))
class TestResult:
status = 'Failed'
def __init__(self, name, scope):
self.name = name
self.scope = scope
def __str__(self):
docs = self.scope.get('__doc__', '(No description available)')
docs = '<p>' + docs.replace('\n\n', '\n</p>\n<p>') + '\n</p>'
return '''<h3>%s: %s</h3>
%s
''' % (self.name, self.status, docs)
class TestWizard(Application):
def __init__(self, files, resultFile, *args, **kwds):
Application.__init__(self, *args, **kwds)
self.files = files
self.resultFile = resultFile
self.results = []
self.setupGUI()
def setupGUI(self):
self.win = Window(text='The Anygui Test Program')
self.passButton = Button(text='Pass')
self.win.add(self.passButton, right=10, bottom=10,
hmove=1, vmove=1)
link(self.passButton, self.passTest)
self.failButton = Button(text='Fail')
self.win.add(self.failButton, right=(self.passButton,10),
bottom=10,
hmove=1, vmove=1)
link(self.failButton, self.failTest)
self.setupTests()
self.nextTest()
self.add(self.win)
def setupTests(self):
testScopes = []
testNames = []
constraints = []
for fname in self.files:
scope = {}
exec open(fname) in scope
testScopes.append(scope)
name = os.path.basename(fname)
testNames.append(name)
for other in eval('after', scope):
constraints.append((other, name))
topologicalSort(testNames, testScopes, constraints)
testScopes.reverse()
testNames.reverse()
self.testScopes = testScopes
self.testNames = testNames
def nextTest(self):
if not self.testScopes:
self.writeResults()
sys.exit()
scope = self.testScopes.pop()
name = self.testNames.pop()
try: self.win.remove(self.frame)
except AttributeError: pass
self.frame = Frame()
assert not hasattr(scope, '__supplied_frame')
scope['__supplied_frame'] = self.frame
exec 'setup(__supplied_frame)' in scope
self.win.add(self.frame, top=0, left=0, right=0,
bottom=(self.passButton, 10),
hstretch=1, vstretch=1)
self.results.append(TestResult(name, scope))
def writeResults(self):
out = open(self.resultFile, 'w')
print >> out, HEAD
for result in self.results:
print >> out, result
print >> out, FOOT
out.close()
def passTest(self, event):
self.results[-1].status = 'Passed'
self.nextTest()
def failTest(self, event):
self.nextTest()
def main(args=[]):
tw = TestWizard(testFiles(), RESULT_FILE)
tw.run()
if __name__ == '__main__':
main(sys.argv)
|