diff options
Diffstat (limited to 'tests/test_basic_api.py')
-rw-r--r-- | tests/test_basic_api.py | 121 |
1 files changed, 66 insertions, 55 deletions
diff --git a/tests/test_basic_api.py b/tests/test_basic_api.py index 893fa90c..7485df1a 100644 --- a/tests/test_basic_api.py +++ b/tests/test_basic_api.py @@ -16,7 +16,7 @@ from pygments import lexers, formatters, filters, format from pygments.token import _TokenType, Text from pygments.lexer import RegexLexer from pygments.formatters.img import FontNotFound -from pygments.util import text_type, StringIO, xrange, ClassNotFound +from pygments.util import text_type, StringIO, BytesIO, xrange, ClassNotFound import support @@ -27,10 +27,12 @@ random.shuffle(test_content) test_content = ''.join(test_content) + '\n' -def test_lexer_import_all(): +def test_lexer_instantiate_all(): # instantiate every lexer, to see if the token type defs are correct + def verify(name): + getattr(lexers, name) for x in lexers.LEXERS: - c = getattr(lexers, x)() + yield verify, x def test_lexer_classes(): @@ -40,7 +42,7 @@ def test_lexer_classes(): for attr in 'aliases', 'filenames', 'alias_filenames', 'mimetypes': assert hasattr(cls, attr) assert type(getattr(cls, attr)) is list, \ - "%s: %s attribute wrong" % (cls, attr) + "%s: %s attribute wrong" % (cls, attr) result = cls.analyse_text("abc") assert isinstance(result, float) and 0.0 <= result <= 1.0 result = cls.analyse_text(".abc") @@ -66,19 +68,19 @@ def test_lexer_classes(): try: tokens = list(inst.get_tokens(test_content)) except KeyboardInterrupt: - raise KeyboardInterrupt('interrupted %s.get_tokens(): test_content=%r' % (cls.__name__, test_content)) + raise KeyboardInterrupt( + 'interrupted %s.get_tokens(): test_content=%r' % + (cls.__name__, test_content)) txt = "" for token in tokens: assert isinstance(token, tuple) assert isinstance(token[0], _TokenType) - if isinstance(token[1], str): - print(repr(token[1])) assert isinstance(token[1], text_type) txt += token[1] assert txt == test_content, "%s lexer roundtrip failed: %r != %r" % \ - (cls.name, test_content, txt) + (cls.name, test_content, txt) - for lexer in lexers._iter_lexerclasses(): + for lexer in lexers._iter_lexerclasses(plugins=False): yield verify, lexer @@ -87,7 +89,8 @@ def test_lexer_options(): def ensure(tokens, output): concatenated = ''.join(token[1] for token in tokens) assert concatenated == output, \ - '%s: %r != %r' % (lexer, concatenated, output) + '%s: %r != %r' % (lexer, concatenated, output) + def verify(cls): inst = cls(stripnl=False) ensure(inst.get_tokens('a\nb'), 'a\nb\n') @@ -96,18 +99,18 @@ def test_lexer_options(): ensure(inst.get_tokens(' \n b\n\n\n'), 'b\n') # some lexers require full lines in input if cls.__name__ not in ( - 'PythonConsoleLexer', 'RConsoleLexer', 'RubyConsoleLexer', - 'SqliteConsoleLexer', 'MatlabSessionLexer', 'ErlangShellLexer', - 'BashSessionLexer', 'LiterateHaskellLexer', 'LiterateAgdaLexer', - 'PostgresConsoleLexer', 'ElixirConsoleLexer', 'JuliaConsoleLexer', - 'RobotFrameworkLexer', 'DylanConsoleLexer', 'ShellSessionLexer', - 'LiterateIdrisLexer', 'LiterateCryptolLexer'): + 'PythonConsoleLexer', 'RConsoleLexer', 'RubyConsoleLexer', + 'SqliteConsoleLexer', 'MatlabSessionLexer', 'ErlangShellLexer', + 'BashSessionLexer', 'LiterateHaskellLexer', 'LiterateAgdaLexer', + 'PostgresConsoleLexer', 'ElixirConsoleLexer', 'JuliaConsoleLexer', + 'RobotFrameworkLexer', 'DylanConsoleLexer', 'ShellSessionLexer', + 'LiterateIdrisLexer', 'LiterateCryptolLexer'): inst = cls(ensurenl=False) ensure(inst.get_tokens('a\nb'), 'a\nb') inst = cls(ensurenl=False, stripall=True) ensure(inst.get_tokens('a\nb\n\n'), 'a\nb') - for lexer in lexers._iter_lexerclasses(): + for lexer in lexers._iter_lexerclasses(plugins=False): if lexer.__name__ == 'RawTokenLexer': # this one is special continue @@ -147,32 +150,38 @@ def test_get_lexers(): def test_formatter_public_api(): - ts = list(lexers.PythonLexer().get_tokens("def f(): pass")) - out = StringIO() # test that every formatter class has the correct public API - def verify(formatter, info): - assert len(info) == 4 - assert info[0], "missing formatter name" - assert info[1], "missing formatter aliases" - assert info[3], "missing formatter docstring" - - if formatter.name == 'Raw tokens': - # will not work with Unicode output file - return + ts = list(lexers.PythonLexer().get_tokens("def f(): pass")) + string_out = StringIO() + bytes_out = BytesIO() + + def verify(formatter): + info = formatters.FORMATTERS[formatter.__name__] + assert len(info) == 5 + assert info[1], "missing formatter name" + assert info[2], "missing formatter aliases" + assert info[4], "missing formatter docstring" try: inst = formatter(opt1="val1") except (ImportError, FontNotFound): - return + raise support.SkipTest + try: inst.get_style_defs() except NotImplementedError: # may be raised by formatters for which it doesn't make sense pass - inst.format(ts, out) - for formatter, info in formatters.FORMATTERS.items(): - yield verify, formatter, info + if formatter.unicodeoutput: + inst.format(ts, string_out) + else: + inst.format(ts, bytes_out) + + for name in formatters.FORMATTERS: + formatter = getattr(formatters, name) + yield verify, formatter + def test_formatter_encodings(): from pygments.formatters import HtmlFormatter @@ -205,12 +214,12 @@ def test_formatter_unicode_handling(): inst = formatter(encoding=None) except (ImportError, FontNotFound): # some dependency or font not installed - return + raise support.SkipTest if formatter.name != 'Raw tokens': out = format(tokens, inst) if formatter.unicodeoutput: - assert type(out) is text_type + assert type(out) is text_type, '%s: %r' % (formatter, out) inst = formatter(encoding='utf-8') out = format(tokens, inst) @@ -223,7 +232,9 @@ def test_formatter_unicode_handling(): assert type(out) is bytes, '%s: %r' % (formatter, out) for formatter, info in formatters.FORMATTERS.items(): - yield verify, formatter + # this tests the automatic importing as well + fmter = getattr(formatters, formatter) + yield verify, fmter def test_get_formatters(): @@ -240,27 +251,33 @@ def test_get_formatters(): def test_styles(): # minimal style test from pygments.formatters import HtmlFormatter - fmt = HtmlFormatter(style="pastie") + HtmlFormatter(style="pastie") class FiltersTest(unittest.TestCase): def test_basic(self): - filter_args = { - 'whitespace': {'spaces': True, 'tabs': True, 'newlines': True}, - 'highlight': {'names': ['isinstance', 'lexers', 'x']}, - } - for x in filters.FILTERS: + filters_args = [ + ('whitespace', {'spaces': True, 'tabs': True, 'newlines': True}), + ('whitespace', {'wstokentype': False, 'spaces': True}), + ('highlight', {'names': ['isinstance', 'lexers', 'x']}), + ('codetagify', {'codetags': 'API'}), + ('keywordcase', {'case': 'capitalize'}), + ('raiseonerror', {}), + ('gobble', {'n': 4}), + ('tokenmerge', {}), + ] + for x, args in filters_args: lx = lexers.PythonLexer() - lx.add_filter(x, **filter_args.get(x, {})) - fp = open(TESTFILE, 'rb') - try: + lx.add_filter(x, **args) + with open(TESTFILE, 'rb') as fp: text = fp.read().decode('utf-8') - finally: - fp.close() tokens = list(lx.get_tokens(text)) + self.assertTrue(all(isinstance(t[1], text_type) + for t in tokens), + '%s filter did not return Unicode' % x) roundtext = ''.join([t[1] for t in tokens]) - if x not in ('whitespace', 'keywordcase'): + if x not in ('whitespace', 'keywordcase', 'gobble'): # these filters change the text self.assertEqual(roundtext, text, "lexer roundtrip with %s filter failed" % x) @@ -273,22 +290,16 @@ class FiltersTest(unittest.TestCase): def test_whitespace(self): lx = lexers.PythonLexer() lx.add_filter('whitespace', spaces='%') - fp = open(TESTFILE, 'rb') - try: + with open(TESTFILE, 'rb') as fp: text = fp.read().decode('utf-8') - finally: - fp.close() lxtext = ''.join([t[1] for t in list(lx.get_tokens(text))]) self.assertFalse(' ' in lxtext) def test_keywordcase(self): lx = lexers.PythonLexer() lx.add_filter('keywordcase', case='capitalize') - fp = open(TESTFILE, 'rb') - try: + with open(TESTFILE, 'rb') as fp: text = fp.read().decode('utf-8') - finally: - fp.close() lxtext = ''.join([t[1] for t in list(lx.get_tokens(text))]) self.assertTrue('Def' in lxtext and 'Class' in lxtext) |