From 28caf01c8082dbed3a5ca87b070ffe5657514f01 Mon Sep 17 00:00:00 2001 From: Waylan Limberg Date: Fri, 12 Feb 2010 16:24:15 -0500 Subject: Moved test dir back out of markdown lib. We don't need to install the tests in everyones site-packages. We just need to distrubute them in the tarball for people to run before installing etc. --- tests/plugins.py | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 tests/plugins.py (limited to 'tests/plugins.py') diff --git a/tests/plugins.py b/tests/plugins.py new file mode 100644 index 0000000..acd1eaf --- /dev/null +++ b/tests/plugins.py @@ -0,0 +1,115 @@ +import traceback +from util import MarkdownSyntaxError +from nose.plugins import Plugin +from nose.plugins.errorclass import ErrorClass, ErrorClassPlugin + +class Markdown(ErrorClassPlugin): + """ Add MarkdownSyntaxError and ensure proper formatting. """ + mdsyntax = ErrorClass(MarkdownSyntaxError, + label='MarkdownSyntaxError', + 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__ == 'MarkdownSyntaxError': + return et, ev, '' + return err + + +def escape(html): + """ Escape HTML for display as source within HTML. """ + html = html.replace('&', '&') + html = html.replace('<', '<') + html = html.replace('>', '>') + 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 = [ '', + 'Test output', + '' ] + + def configure(self, options, conf): + self.conf = conf + + def addSuccess(self, test): + self.html.append('ok') + + def addError(self, test, err): + err = self.formatErr(err) + self.html.append('ERROR') + self.html.append('
%s
' % escape(err)) + + def addFailure(self, test, err): + err = self.formatErr(err) + self.html.append('FAIL') + self.html.append('
%s
' % escape(err)) + + def finalize(self, result): + self.html.append('
') + self.html.append("Ran %d test%s" % + (result.testsRun, result.testsRun != 1 and "s" +or "")) + self.html.append('
') + self.html.append('
') + if not result.wasSuccessful(): + self.html.extend(['FAILED (', + 'failures=%d ' % len(result.failures), + 'errors=%d' % len(result.errors)]) + for cls in result.errorClasses.keys(): + storage, label, isfail = result.errorClasses[cls] + if len(storage): + self.html.append(' %ss=%d' % (label, len(storage))) + self.html.append(')') + else: + self.html.append('OK') + self.html.append('
') + 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(['
', '', n, '']) + try: + path = ctx.__file__.replace('.pyc', '.py') + self.html.extend(['
', path, '
']) + except AttributeError: + pass + + def stopContext(self, ctx): + self.html.append('
') + + def startTest(self, test): + self.html.extend([ '
', + test.shortDescription() or str(test), + '' ]) + + def stopTest(self, test): + self.html.append('
') + -- cgit v1.2.3