summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/run.py130
-rw-r--r--tests/support.py15
-rw-r--r--tests/test_basic_api.py10
-rw-r--r--tests/test_cmdline.py14
-rw-r--r--tests/test_examplefiles.py53
-rw-r--r--tests/test_html_formatter.py19
-rw-r--r--tests/test_latex_formatter.py7
7 files changed, 76 insertions, 172 deletions
diff --git a/tests/run.py b/tests/run.py
index b0244d60..eee7d4d6 100644
--- a/tests/run.py
+++ b/tests/run.py
@@ -12,132 +12,12 @@
:license: GNU GPL, see LICENSE for more details.
"""
-import sys, os, new
-import unittest
-import __builtin__
-
-from os.path import dirname, basename, join, abspath
-
-import pygments
+import sys
try:
- import coverage
+ import nose
except ImportError:
- coverage = None
-
-testdir = abspath(dirname(__file__))
-
-# useful for all tests
-__builtin__.testdir = testdir
-
-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 = {}
- try:
- __builtin__.testfile = testfile
- 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
-
+ print >> sys.stderr, "nose is required to run the test suites"
+ sys.exit(1)
-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))
+nose.main()
diff --git a/tests/support.py b/tests/support.py
new file mode 100644
index 00000000..67cf69d7
--- /dev/null
+++ b/tests/support.py
@@ -0,0 +1,15 @@
+# coding: utf-8
+"""
+Support for Pygments tests
+"""
+
+import os
+
+
+def location(mod_name):
+ """
+ Return the file and directory that the code for *mod_name* is in.
+ """
+ source = mod_name[:-1] if mod_name.endswith("pyc") else mod_name
+ source = os.path.abspath(source)
+ return source, os.path.dirname(source)
diff --git a/tests/test_basic_api.py b/tests/test_basic_api.py
index 760dda63..1168c7ad 100644
--- a/tests/test_basic_api.py
+++ b/tests/test_basic_api.py
@@ -17,6 +17,10 @@ from pygments.token import _TokenType, Text
from pygments.lexer import RegexLexer
from pygments.formatters.img import FontNotFound
+import support
+
+TESTFILE, TESTDIR = support.location(__file__)
+
test_content = [chr(i) for i in xrange(33, 128)] * 5
random.shuffle(test_content)
test_content = ''.join(test_content) + '\n'
@@ -90,7 +94,7 @@ class FiltersTest(unittest.TestCase):
for x in filters.FILTERS.keys():
lx = lexers.PythonLexer()
lx.add_filter(x, **filter_args.get(x, {}))
- text = file(os.path.join(testdir, testfile)).read().decode('utf-8')
+ text = file(TESTFILE).read().decode('utf-8')
tokens = list(lx.get_tokens(text))
roundtext = ''.join([t[1] for t in tokens])
if x not in ('whitespace', 'keywordcase'):
@@ -106,14 +110,14 @@ class FiltersTest(unittest.TestCase):
def test_whitespace(self):
lx = lexers.PythonLexer()
lx.add_filter('whitespace', spaces='%')
- text = file(os.path.join(testdir, testfile)).read().decode('utf-8')
+ text = file(TESTFILE).read().decode('utf-8')
lxtext = ''.join([t[1] for t in list(lx.get_tokens(text))])
self.failIf(' ' in lxtext)
def test_keywordcase(self):
lx = lexers.PythonLexer()
lx.add_filter('keywordcase', case='capitalize')
- text = file(os.path.join(testdir, testfile)).read().decode('utf-8')
+ text = file(TESTFILE).read().decode('utf-8')
lxtext = ''.join([t[1] for t in list(lx.get_tokens(text))])
self.assert_('Def' in lxtext and 'Class' in lxtext)
diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py
index 46868cf1..eaf1cbfc 100644
--- a/tests/test_cmdline.py
+++ b/tests/test_cmdline.py
@@ -16,6 +16,10 @@ import StringIO
from pygments import highlight
from pygments.cmdline import main as cmdline_main
+import support
+
+TESTFILE, TESTDIR = support.location(__file__)
+
def run_cmdline(*args):
saved_stdout = sys.stdout
@@ -44,21 +48,21 @@ class CmdLineTest(unittest.TestCase):
self.assertEquals(c, 0)
def test_O_opt(self):
- filename = os.path.join(testdir, testfile)
+ filename = TESTFILE
c, o, e = run_cmdline("-Ofull=1,linenos=true,foo=bar", "-fhtml", filename)
self.assertEquals(c, 0)
self.assert_("<html" in o)
self.assert_('class="linenos"' in o)
def test_P_opt(self):
- filename = os.path.join(testdir, testfile)
+ filename = TESTFILE
c, o, e = run_cmdline("-Pfull", "-Ptitle=foo, bar=baz=,", "-fhtml", filename)
self.assertEquals(c, 0)
self.assert_("<title>foo, bar=baz=,</title>" in o)
def test_F_opt(self):
- filename = os.path.join(testdir, testfile)
- c, o, e = run_cmdline("-Fhighlight:tokentype=Name.Blubb,names=testfile testdir",
+ filename = TESTFILE
+ c, o, e = run_cmdline("-Fhighlight:tokentype=Name.Blubb,names=TESTFILE filename",
"-fhtml", filename)
self.assertEquals(c, 0)
self.assert_('<span class="n-Blubb' in o)
@@ -82,7 +86,7 @@ class CmdLineTest(unittest.TestCase):
# test that cmdline gives the same output as library api
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter
- filename = os.path.join(testdir, testfile)
+ filename = TESTFILE
code = file(filename).read()
output = highlight(code, PythonLexer(), HtmlFormatter())
diff --git a/tests/test_examplefiles.py b/tests/test_examplefiles.py
index ee9af608..2ebb2101 100644
--- a/tests/test_examplefiles.py
+++ b/tests/test_examplefiles.py
@@ -16,36 +16,31 @@ from pygments.token import Error
from pygments.util import ClassNotFound
-class ExampleFileTest(unittest.TestCase):
- pass
-
-lfd = 0
-
# generate methods
-for fn in os.listdir(os.path.join(testdir, 'examplefiles')):
- absfn = os.path.join(testdir, 'examplefiles', fn)
- if not os.path.isfile(absfn):
- continue
+def test_example_files():
+ testdir = os.path.dirname(__file__)
+ for fn in os.listdir(os.path.join(testdir, 'examplefiles')):
+ absfn = os.path.join(testdir, 'examplefiles', fn)
+ if not os.path.isfile(absfn):
+ continue
- try:
- lx = get_lexer_for_filename(absfn)
- except ClassNotFound:
try:
- name, rest = fn.split("_", 1)
- lx = get_lexer_by_name(name)
+ lx = get_lexer_for_filename(absfn)
except ClassNotFound:
- raise AssertionError('no lexer found for file %r' % fn)
-
- def test(self, lx=lx, absfn=absfn):
- text = file(absfn, 'U').read()
- text = text.strip('\n') + '\n'
- text = text.decode('latin1')
- ntext = []
- for type, val in lx.get_tokens(text):
- ntext.append(val)
- self.failIf(type == Error, 'lexer generated error token for '+absfn)
- if u''.join(ntext) != text:
- self.fail('round trip failed for '+absfn)
-
- setattr(ExampleFileTest, 'test_%i' % lfd, test)
- lfd += 1
+ try:
+ name, rest = fn.split("_", 1)
+ lx = get_lexer_by_name(name)
+ except ClassNotFound:
+ raise AssertionError('no lexer found for file %r' % fn)
+ yield check_lexer, lx, absfn
+
+def check_lexer(lx, absfn):
+ text = file(absfn, 'U').read()
+ text = text.strip('\n') + '\n'
+ text = text.decode('latin1')
+ ntext = []
+ for type, val in lx.get_tokens(text):
+ ntext.append(val)
+ assert type != Error, 'lexer generated error token for ' + absfn
+ if u''.join(ntext) != text:
+ raise AssertionError('round trip failed for ' + absfn)
diff --git a/tests/test_html_formatter.py b/tests/test_html_formatter.py
index ed949a88..d4ac1bf2 100644
--- a/tests/test_html_formatter.py
+++ b/tests/test_html_formatter.py
@@ -12,14 +12,17 @@ import re
import unittest
import StringIO
import tempfile
-from os.path import join, dirname, isfile
+from os.path import join, dirname, isfile, abspath
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter, NullFormatter
from pygments.formatters.html import escape_html
-tokensource = list(PythonLexer().get_tokens(file(
- os.path.join(testdir, testfile)).read()))
+import support
+
+TESTFILE, TESTDIR = support.location(__file__)
+
+tokensource = list(PythonLexer().get_tokens(file(TESTFILE).read()))
class HtmlFormatterTest(unittest.TestCase):
def test_correct_output(self):
@@ -39,13 +42,13 @@ class HtmlFormatterTest(unittest.TestCase):
# test correct behavior
# CSS should be in /tmp directory
fmt1 = HtmlFormatter(full=True, cssfile='fmt1.css')
- # CSS should be in testdir (testdir is absolute)
- fmt2 = HtmlFormatter(full=True, cssfile=join(testdir, 'fmt2.css'))
+ # CSS should be in TESTDIR (TESTDIR is absolute)
+ fmt2 = HtmlFormatter(full=True, cssfile=join(TESTDIR, 'fmt2.css'))
tfile = tempfile.NamedTemporaryFile(suffix='.html')
fmt1.format(tokensource, tfile)
try:
fmt2.format(tokensource, tfile)
- self.assert_(isfile(join(testdir, 'fmt2.css')))
+ self.assert_(isfile(join(TESTDIR, 'fmt2.css')))
except IOError:
# test directory not writable
pass
@@ -54,7 +57,7 @@ class HtmlFormatterTest(unittest.TestCase):
self.assert_(isfile(join(dirname(tfile.name), 'fmt1.css')))
os.unlink(join(dirname(tfile.name), 'fmt1.css'))
try:
- os.unlink(join(testdir, 'fmt2.css'))
+ os.unlink(join(TESTDIR, 'fmt2.css'))
except OSError:
pass
@@ -76,7 +79,7 @@ class HtmlFormatterTest(unittest.TestCase):
tfile = os.fdopen(handle, 'w+b')
fmt.format(tokensource, tfile)
tfile.close()
- catname = os.path.join(testdir, 'dtds', 'HTML4.soc')
+ catname = os.path.join(TESTDIR, 'dtds', 'HTML4.soc')
try:
try:
import subprocess
diff --git a/tests/test_latex_formatter.py b/tests/test_latex_formatter.py
index 45f48638..033f5a55 100644
--- a/tests/test_latex_formatter.py
+++ b/tests/test_latex_formatter.py
@@ -14,12 +14,15 @@ import tempfile
from pygments.formatters import LatexFormatter
from pygments.lexers import PythonLexer
+import support
+
+TESTFILE, TESTDIR = support.location(__file__)
+
class LatexFormatterTest(unittest.TestCase):
def test_valid_output(self):
- tokensource = list(PythonLexer().get_tokens(file(
- os.path.join(testdir, testfile)).read()))
+ tokensource = list(PythonLexer().get_tokens(file(TESTFILE).read()))
fmt = LatexFormatter(full=True)
handle, pathname = tempfile.mkstemp('.tex')