aboutsummaryrefslogtreecommitdiffstats
path: root/tests/plugins.py
diff options
context:
space:
mode:
authorWaylan Limberg <waylan@gmail.com>2009-05-30 22:29:56 -0400
committerWaylan Limberg <waylan@gmail.com>2009-06-05 22:25:51 -0400
commitcc452998dc1af441cf3f9c5d0c7287cb5de48c4a (patch)
treef138bb00542b47bf382d4ba8f10f0d2a9470ccfe /tests/plugins.py
parent0ae9951f49eb75c8a9fb9f841673b889763c1811 (diff)
downloadmarkdown-cc452998dc1af441cf3f9c5d0c7287cb5de48c4a.tar.gz
markdown-cc452998dc1af441cf3f9c5d0c7287cb5de48c4a.tar.bz2
markdown-cc452998dc1af441cf3f9c5d0c7287cb5de48c4a.zip
Initial implementation of nose testing. Still some cleanup to do, but this shows the differances between the old and the new. Also left one test failing (unsignificant white space only) to demonstrate what a failing test looks like.
Diffstat (limited to 'tests/plugins.py')
-rw-r--r--tests/plugins.py113
1 files changed, 113 insertions, 0 deletions
diff --git a/tests/plugins.py b/tests/plugins.py
new file mode 100644
index 0000000..d0cb7f8
--- /dev/null
+++ b/tests/plugins.py
@@ -0,0 +1,113 @@
+import traceback
+from util import MdSyntaxError
+from nose.plugins import Plugin
+from nose.plugins.errorclass import ErrorClass, ErrorClassPlugin
+
+class MdSyntaxErrorPlugin(ErrorClassPlugin):
+ """ Add MdSyntaxError and ensure proper formatting. """
+ mdsyntax = ErrorClass(MdSyntaxError, label='MdSyntaxError', isfailure=True)
+ enabled = True
+
+ def configure(self, options, conf):
+ self.conf = conf
+
+ def addError(self, test, err):
+ """ Ensure other plugins see the error by returning nothing here. """
+ pass
+
+ def formatError(self, test, err):
+ """ Remove unnessecary and unhelpful traceback from error report. """
+ et, ev, tb = err
+ if et.__name__ == 'MdSyntaxError':
+ return et, ev, ''
+ return err
+
+
+def escape(html):
+ """ Escape HTML for display as source within HTML. """
+ html = html.replace('&', '&amp;')
+ html = html.replace('<', '&lt;')
+ html = html.replace('>', '&gt;')
+ return html
+
+
+class HtmlOutput(Plugin):
+ """Output test results as ugly, unstyled html. """
+
+ name = 'html-output'
+ score = 2 # run late
+ enabled = True
+
+ def __init__(self):
+ super(HtmlOutput, self).__init__()
+ self.html = [ '<html><head>',
+ '<title>Test output</title>',
+ '</head><body>' ]
+
+ def configure(self, options, conf):
+ self.conf = conf
+
+ def addSuccess(self, test):
+ self.html.append('<span>ok</span>')
+
+ def addError(self, test, err):
+ err = self.formatErr(err)
+ self.html.append('<span>ERROR</span>')
+ self.html.append('<pre>%s</pre>' % escape(err))
+
+ def addFailure(self, test, err):
+ err = self.formatErr(err)
+ self.html.append('<span>FAIL</span>')
+ self.html.append('<pre>%s</pre>' % escape(err))
+
+ def finalize(self, result):
+ self.html.append('<div>')
+ self.html.append("Ran %d test%s" %
+ (result.testsRun, result.testsRun != 1 and "s"
+or ""))
+ self.html.append('</div>')
+ self.html.append('<div>')
+ if not result.wasSuccessful():
+ self.html.extend(['<span>FAILED (',
+ 'failures=%d ' % len(result.failures),
+ 'errors=%d' % len(result.errors)])
+ for cls in result.errorClasses.keys():
+ storage, label, isfail = result.errorClasses[cls]
+ if isfail:
+ self.html.append(' %ss=%d' % (label, len(storage)))
+ self.html.append(')</span>')
+ else:
+ self.html.append('OK')
+ self.html.append('</div></body></html>')
+ f = open('tmp/test-output.html', 'w')
+ for l in self.html:
+ f.write(l)
+ f.close()
+
+ def formatErr(self, err):
+ exctype, value, tb = err
+ return ''.join(traceback.format_exception(exctype, value, tb))
+
+ def startContext(self, ctx):
+ try:
+ n = ctx.__name__
+ except AttributeError:
+ n = str(ctx).replace('<', '').replace('>', '')
+ self.html.extend(['<fieldset>', '<legend>', n, '</legend>'])
+ try:
+ path = ctx.__file__.replace('.pyc', '.py')
+ self.html.extend(['<div>', path, '</div>'])
+ except AttributeError:
+ pass
+
+ def stopContext(self, ctx):
+ self.html.append('</fieldset>')
+
+ def startTest(self, test):
+ self.html.extend([ '<div><span>',
+ test.shortDescription() or str(test),
+ '</span>' ])
+
+ def stopTest(self, test):
+ self.html.append('</div>')
+