139 lines
3.8 KiB
Python
139 lines
3.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Pygments unit tests
|
|
~~~~~~~~~~~~~~~~~~
|
|
|
|
Usage::
|
|
|
|
python run.py [testfile ...]
|
|
|
|
|
|
:copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
|
|
:license: BSD, see LICENSE for details.
|
|
"""
|
|
|
|
import sys, os
|
|
import unittest
|
|
|
|
from os.path import dirname, basename, join, abspath
|
|
|
|
import pygments
|
|
|
|
try:
|
|
import coverage
|
|
except ImportError:
|
|
coverage = None
|
|
|
|
testdir = abspath(dirname(__file__))
|
|
|
|
failed = []
|
|
total_test_count = 0
|
|
error_test_count = 0
|
|
|
|
|
|
def err(file, what, exc):
|
|
print >>sys.stderr, file, 'failed %s:' % what,
|
|
print >>sys.stderr, exc
|
|
failed.append(file[:-3])
|
|
|
|
|
|
class QuietTestRunner(object):
|
|
"""Customized test runner for relatively quiet output"""
|
|
|
|
def __init__(self, testname, stream=sys.stderr):
|
|
self.testname = testname
|
|
self.stream = unittest._WritelnDecorator(stream)
|
|
|
|
def run(self, test):
|
|
global total_test_count
|
|
global error_test_count
|
|
result = unittest._TextTestResult(self.stream, True, 1)
|
|
test(result)
|
|
if not result.wasSuccessful():
|
|
self.stream.write(' FAIL:')
|
|
result.printErrors()
|
|
failed.append(self.testname)
|
|
else:
|
|
self.stream.write(' ok\n')
|
|
total_test_count += result.testsRun
|
|
error_test_count += len(result.errors) + len(result.failures)
|
|
return result
|
|
|
|
|
|
def run_tests(with_coverage=False):
|
|
# needed to avoid confusion involving atexit handlers
|
|
import logging
|
|
|
|
if sys.argv[1:]:
|
|
# test only files given on cmdline
|
|
files = [entry + '.py' for entry in sys.argv[1:] if entry.startswith('test_')]
|
|
else:
|
|
files = [entry for entry in os.listdir(testdir)
|
|
if (entry.startswith('test_') and entry.endswith('.py'))]
|
|
files.sort()
|
|
|
|
WIDTH = 85
|
|
|
|
print >>sys.stderr, \
|
|
('Pygments %s Test Suite running%s, stand by...' %
|
|
(pygments.__version__,
|
|
with_coverage and " with coverage analysis" or "")).center(WIDTH)
|
|
print >>sys.stderr, ('(using Python %s)' % sys.version.split()[0]).center(WIDTH)
|
|
print >>sys.stderr, '='*WIDTH
|
|
|
|
if with_coverage:
|
|
coverage.erase()
|
|
coverage.start()
|
|
|
|
for testfile in files:
|
|
globs = {'__file__': join(testdir, testfile)}
|
|
try:
|
|
execfile(join(testdir, testfile), globs)
|
|
except Exception, exc:
|
|
raise
|
|
err(testfile, 'execfile', exc)
|
|
continue
|
|
sys.stderr.write(testfile[:-3] + ': ')
|
|
try:
|
|
runner = QuietTestRunner(testfile[:-3])
|
|
# make a test suite of all TestCases in the file
|
|
tests = []
|
|
for name, thing in globs.iteritems():
|
|
if name.endswith('Test'):
|
|
tests.append((name, unittest.makeSuite(thing)))
|
|
tests.sort()
|
|
suite = unittest.TestSuite()
|
|
suite.addTests([x[1] for x in tests])
|
|
runner.run(suite)
|
|
except Exception, exc:
|
|
err(testfile, 'running test', exc)
|
|
|
|
print >>sys.stderr, '='*WIDTH
|
|
if failed:
|
|
print >>sys.stderr, '%d of %d tests failed.' % \
|
|
(error_test_count, total_test_count)
|
|
print >>sys.stderr, 'Tests failed in:', ', '.join(failed)
|
|
ret = 1
|
|
else:
|
|
if total_test_count == 1:
|
|
print >>sys.stderr, '1 test happy.'
|
|
else:
|
|
print >>sys.stderr, 'All %d tests happy.' % total_test_count
|
|
ret = 0
|
|
|
|
if with_coverage:
|
|
coverage.stop()
|
|
modules = [mod for name, mod in sys.modules.iteritems()
|
|
if name.startswith('pygments.') and mod]
|
|
coverage.report(modules)
|
|
|
|
return ret
|
|
|
|
|
|
if __name__ == '__main__':
|
|
with_coverage = False
|
|
if sys.argv[1:2] == ['-C']:
|
|
with_coverage = bool(coverage)
|
|
del sys.argv[1]
|
|
sys.exit(run_tests(with_coverage))
|