Mercurial > hgrepos > Python > libs > pygments-lexer-pseudocode2
view tests/test_algpseudo.py @ 87:d8ca835c74ea
FIX: Erroneous parsing of \tt-XXX and \ttx-XXX:
Need to restrict the tokentype group because otherwise it would match
too much if some sort of braces are mixed on a single line.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Sat, 02 May 2026 10:07:59 +0200 |
| parents | 3ac1c4502ad0 |
| children | 3f37832c405d |
line wrap: on
line source
# -*- coding: utf-8 -*- # :- # SPDX-FileCopyrightText: © 2026 Franz Glasner # SPDX-License-Identifier: MIT # :- from _tsetup import ALGLEXERFILENAME, ALGLEXERCLASS import sys import unittest import pygments import pygments.lexers import pygments.formatters import _testhelper class TestSnippets(unittest.TestCase, _testhelper.TokenAssertHelper): def setUp(self): self.lexer = pygments.lexers.load_lexer_from_file( ALGLEXERFILENAME, ALGLEXERCLASS) def test_lf(self): self.assertTokenStreamEqualComplete( [("Text.Whitespace", "\n")], pygments.lex("\n", self.lexer)) def test_protected_lf(self): self.assertTokenStreamEqualComplete( [("Text", "\\\n")], pygments.lex("\\\n", self.lexer)) def test_number_int(self): self.assertTokenStreamEqualComplete( [("Number.Integer", "10"), ("Text.Whitespace", "\n"), ], pygments.lex("10", self.lexer)) def test_number_float_1(self): self.assertTokenStreamEqualComplete( [("Number.Float", "3.1415926"), ("Text.Whitespace", "\n"), ], pygments.lex("3.1415926", self.lexer)) def test_number_float_2(self): self.assertTokenStreamEqualComplete( [("Number.Float", "3.14e-12"), ("Text.Whitespace", "\n"), ], pygments.lex("3.14e-12", self.lexer)) def test_string_s_1(self): self.assertTokenStreamEqualComplete( [("String.Single", "'"), ("String.Single", "HU"), ("String.Single", '"'), ("String.Single", "HE HA"), ("String.Escape", "\\'"), ("String.Single", "HO"), ("String.Single", "'"), ("Text.Whitespace", "\n"), ], pygments.lex("""'HU"HE HA\\'HO'""", self.lexer)) def test_string_s_2(self): self.assertTokenStreamEqual( [("String.Single", "'"), ("String.Single", "HUHU"), ("Error", "\n"), ], pygments.lex("'HUHU\nHEHE'", self.lexer)) def test_string_ts_1(self): self.assertTokenStreamEqualComplete( [("String.Single", "'''"), ("String.Single", "HUHU HEHE"), ("String.Single", "'''"), ("Text.Whitespace", "\n"), ], pygments.lex("'''HUHU HEHE'''", self.lexer)) def test_string_ts_2(self): self.assertTokenStreamEqualComplete( [("String.Single", "'''"), ("String.Single", "HI"), ("String.Single", "'"), ("String.Single", "HU"), ("String.Single", "\n"), ("String.Single", "HE"), ("String.Single", '"'), ("String.Single", "HA"), ("String.Single", "'''"), ("Text.Whitespace", "\n"), ], pygments.lex("""'''HI'HU\nHE"HA'''""", self.lexer)) def test_string_d_1(self): self.assertTokenStreamEqualComplete( [("String.Double", '"'), ("String.Double", 'HU'), ("String.Double", "'"), ("String.Double", 'HE HA'), ("String.Escape", '\\"'), ("String.Double", 'HO'), ("String.Double", '"'), ("Text.Whitespace", "\n"), ], pygments.lex('''"HU'HE HA\\"HO"''', self.lexer)) def test_string_d_2(self): self.assertTokenStreamEqual( [("String.Double", '"'), ("String.Double", "HUHU"), ("Error", "\n"), ], pygments.lex('"HUHU\nHEHE"', self.lexer)) def test_string_td_1(self): self.assertTokenStreamEqualComplete( [("String.Double", '"""'), ("String.Double", 'HUHU HAHA'), ("String.Double", '"""'), ("Text.Whitespace", "\n"), ], pygments.lex('"""HUHU HAHA"""', self.lexer)) def test_string_td_2(self): self.assertTokenStreamEqualComplete( [("String.Double", '"""'), ("String.Double", 'HU'), ("String.Double", '"'), ("String.Double", "HO"), ("String.Double", "\n"), ("String.Double", "HE"), ("String.Double", "'"), ("String.Double", "HA"), ("String.Double", '"""'), ("Text.Whitespace", "\n"), ], pygments.lex('''"""HU"HO\nHE'HA"""''', self.lexer)) def test_proc(self): self.assertTokenStreamEqualComplete( [("Keyword", "PROCEDURE"), ("Text.Whitespace", " "), ("Name.Entity", "the name"), ("Text.Whitespace", "\n"), ], pygments.lex("\\PROC {the name}", self.lexer)) def test_proc_with_escape_in_name(self): self.assertTokenStreamEqualComplete( [("Keyword", "PROCEDURE"), ("Text.Whitespace", " "), ("Name.Entity", "t"), ("Name.Entity", "\\"), ("Name.Entity", "he "), ("Name.Entity", "\\"), ("Name.Entity", "}"), ("Name.Entity", "name"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\PROC {t\he \\\}name}", self.lexer)) def test_endproc(self): self.assertTokenStreamEqualComplete( [("Keyword", "END OF PROCEDURE"), ("Text.Whitespace", "\n"), ], pygments.lex("\\END-PROCEDURE", self.lexer)) def test_endproc_with_entityname(self): self.assertTokenStreamEqualComplete( [("Keyword", "END OF PROCEDURE"), ("Text.Whitespace", " "), ("Name.Entity", "the procedure name"), ("Text.Whitespace", "\n"), ], pygments.lex("\\ENDPROCEDURE {the procedure name}", self.lexer)) def test_proc_de(self): lexer = pygments.lexers.load_lexer_from_file( ALGLEXERFILENAME, "AlgPseudocodeLexer_DE") self.assertTokenStreamEqualComplete( [("Keyword", "PROZEDUR"), ("Text.Whitespace", " "), ("Name.Entity", " also {nichtxs"), ("Name.Entity", "}"), ("Name.Entity", " hier"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\PROC { also {nichtxs\} hier}", lexer)) def test_function_1(self): self.assertTokenStreamEqualComplete( [("Keyword", "FUNCTION"), ("Text.Whitespace", " "), ("Name.Entity", "1"), ("Text.Whitespace", "\n"), ], pygments.lex("\\FUNC{1}", self.lexer)) def test_function_2(self): self.assertTokenStreamEqualComplete( [("Keyword", "FUNCTION"), ("Text.Whitespace", " "), ("Name.Entity", "line 1\nline 2\n"), ("Text.Whitespace", "\n"), ], pygments.lex("\\FUNCTION{line 1\nline 2\n}", self.lexer)) def test_function_3(self): self.assertTokenStreamEqualComplete( [("Keyword", "FUNCTION"), ("Text.Whitespace", " "), ("Name.Entity", "\\"), ("Name.Entity", "n"), ("Name.Entity", "}"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\FN {\n\}}", self.lexer)) def test_class(self): self.assertTokenStreamEqualComplete( [("Keyword", "CLASS"), ("Text.Whitespace", " "), ("Name.Entity", "\\"), ("Name.Entity", "n"), ("Name.Entity", "}"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\CLASS {\n\}}", self.lexer)) def test_class_fr(self): lexer = pygments.lexers.load_lexer_from_file( ALGLEXERFILENAME, "AlgPseudocodeLexer_FR") self.assertTokenStreamEqualComplete( [("Keyword", "CLASSE"), ("Text.Whitespace", " "), ("Name.Entity", "\\"), ("Name.Entity", "n"), ("Name.Entity", "}"), ("Text.Whitespace", "\n"), ], pygments.lex("\\CLASS {\\n\\}}", lexer)) def test_class_de_with_noend_option(self): lexer = pygments.lexers.load_lexer_from_file( ALGLEXERFILENAME, "AlgPseudocodeLexer_DE", no_end="True") self.assertTokenStreamEqualComplete( [("Keyword", "KLASSE"), ("Text.Whitespace", " "), ("Name.Entity", "\\"), ("Name.Entity", "n"), ("Name.Entity", "}"), ("Text.Whitespace", "\n"), ("Text.Whitespace", "\n"), ], pygments.lex("\\CLASS {\\n\\}}\n\\ENDCLASS", lexer)) def test_class_de_with_noend_option_and_name(self): lexer = pygments.lexers.load_lexer_from_file( ALGLEXERFILENAME, "AlgPseudocodeLexer_DE", no_end="True") self.assertTokenStreamEqualComplete( [("Keyword", "KLASSE"), ("Text.Whitespace", " "), ("Name.Entity", "\\"), ("Name.Entity", "n"), ("Name.Entity", "}"), ("Text.Whitespace", "\n"), ("Text.Whitespace", "\n"), ], pygments.lex("\\CLASS {\\n\\}}\n\\ENDCLASS {end class}", lexer)) def test_remark_1(self): self.assertTokenStreamEqualComplete( [("Comment.Single", "▷"), ("Comment.Single", " the remark"), ("Text.Whitespace", "\n"), ], pygments.lex("\\REMARK the remark\n", self.lexer)) def test_remark_2(self): self.assertTokenStreamEqualComplete( [("Comment.Single", "▷"), ("Comment.Single", " the remark 1"), ("Text.Whitespace", "\n"), ("Comment.Single", "▷"), ("Comment.Single", " the remark 2"), ("Text.Whitespace", "\n"), ], pygments.lex( """\\remArk the remark 1 \\Rem the remark 2 """, self.lexer)) def test_expr_and_text(self): self.assertTokenStreamEqualComplete( [("Name.Entity", "a"), ("Text", " "), ("Text", "multiplied by"), ("Text", " "), ("Name.Entity", "b"), ("Text", " "), ("Text", "is"), ("Text", " "), ("Number.Integer", "0"), ("Text", " "), ("Text", "mod"), ("Text", " "), ("Name.Entity", "p"), ("Text.Whitespace", "\n"), ], pygments.lex( r"""a \TEXT{multiplied by} b \text{is} 0 \text{mod} p""", self.lexer)) def test_expr_and_text_with_escaped_characters(self): self.assertTokenStreamEqualComplete( [("Name.Entity", "a"), ("Text", " "), ("Text", "multiplied by {escaped"), ("Text", "}"), ("Text", " "), ("Text", " "), ("Name.Entity", "b"), ("Text", " "), ("Text", "is "), ("Text", "\\"), ("Text", " not"), ("Text", " "), ("Number.Integer", "0"), ("Text", " "), ("Text", "mod"), ("Text", " "), ("Name.Entity", "p"), ("Text.Whitespace", "\n"), ], pygments.lex( r"""a \TEXT{multiplied by {escaped\} } b \text{is \ not} 0""" r" \text{mod} p""", self.lexer)) def test_punctuation(self): self.assertTokenStreamEqualComplete( [("Punctuation", "{"), ("Punctuation", "}"), ("Punctuation", ":"), ("Punctuation", "("), ("Punctuation", ")"), ("Punctuation", ","), ("Punctuation", ";"), ("Punctuation", "["), ("Punctuation", "]"), ("Text.Whitespace", "\n"), ], pygments.lex(r"{}:(),;[]", self.lexer)) def test_block_empty(self): self.assertTokenStreamEqualComplete( [("Text", "◆"), ("Text.Whitespace", " "), ("Text.Whitespace", "\n"), ], pygments.lex(r"\block{}", self.lexer)) def test_block_with_text(self): self.assertTokenStreamEqualComplete( [("Text", "◆"), ("Text.Whitespace", " "), ("Text", "a b c"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\block{\text{a b c}}", self.lexer)) def test_block_with_escaped_text(self): self.assertTokenStreamEqualComplete( [("Text", "◆"), ("Text.Whitespace", " "), ("Text", "\\"), ("Name.Entity", "text"), ("Punctuation", "{"), ("Name.Entity", "a"), ("Text", " "), ("Name.Entity", "b"), ("Text", " "), ("Name.Entity", "c"), ("Punctuation", "}"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\block{\\text{a b c\}}", self.lexer)) def test_block(self): self.assertTokenStreamEqualComplete( [("Text", "◆"), ("Text.Whitespace", " "), ("Name.Entity", "a"), ("Text", " "), ("Number.Float", "1.2"), ("Text", " "), ("Punctuation", "{"), ("Name.Entity", "x"), ("Text", " "), ("Operator.Word", "in"), ("Text", " "), ("Name.Entity", "X"), ("Punctuation", "}"), ("Text", " "), ("Name.Entity", "c"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\state{a 1.2 {x in X\} c}", self.lexer)) def test_tstate_empty(self): self.assertTokenStreamEqualComplete( [("Text", "▪"), ("Text.Whitespace", " "), ("Text.Whitespace", "\n"), ], pygments.lex(r"\tstate{}", self.lexer)) def test_tstate_with_expr(self): self.assertTokenStreamEqualComplete( [("Text", "▪"), ("Text.Whitespace", " "), ("Text", "a 1.2 "), ("Name.Entity", "x"), ("Text", " "), ("Operator.Word", "in"), ("Text", " "), ("Name.Entity", "X"), ("Punctuation", "}"), ("Text", " c"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\tstate{a 1.2 \expr{x in X\}} c}", self.lexer)) def test_tstate_with_escaped_expr(self): self.assertTokenStreamEqualComplete( [("Text", "▪"), ("Text.Whitespace", " "), ("Text", "a 1.2 "), ("Text", "\\"), ("Text", "expr{x in X"), ("Text", "}"), ("Text", " c"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\tstate{a 1.2 \\expr{x in X\} c}", self.lexer)) def test_explicit_extended_single_tokentype_1(self): self.assertTokenStreamEqualComplete( [("Operator", "%"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\ttx-o:%:", self.lexer)) def test_explicit_extended_single_tokentype_2(self): self.assertTokenStreamEqualComplete( [("Operator", "{"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\ttx-o{{}", self.lexer)) def test_explicit_extended_single_tokentype_3(self): self.assertTokenStreamEqualComplete( [("Operator", "<"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\ttx-o<<>", self.lexer)) def test_explicit_extended_single_tokentype_4(self): self.assertTokenStreamEqualComplete( [("Operator", "("), ("Text.Whitespace", "\n"), ], pygments.lex(r"\ttx-o(()", self.lexer)) def test_explicit_extended_multi_tokentype_1(self): self.assertTokenStreamEqualComplete( [("Operator", "xxx in A"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\ttx-o/xxx in A/", self.lexer)) def test_explicit_extended_multi_tokentype_2(self): self.assertTokenStreamEqualComplete( [("Operator", "xxx in B"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\ttx-o{xxx in B}", self.lexer)) def test_explicit_extended_multi_tokentype_3(self): self.assertTokenStreamEqualComplete( [("Operator", "xxx in C"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\ttx-o<xxx in C>", self.lexer)) def test_explicit_extended_multi_tokentype_4(self): self.assertTokenStreamEqualComplete( [("Operator", "xxx in D"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\ttx-o(xxx in D)", self.lexer)) def test_explicit_tokentype_simple_1(self): self.assertTokenStreamEqualComplete( [("Operator", "}"), ("Operator", "/"), ("Text.Whitespace", "\n"), ], pygments.lex(r"\tt-o/}\tt-o//", self.lexer)) def test_explicit_tokentype_simple_2(self): self.assertTokenStreamEqualComplete( [("Operator", "\n"), ("Operator", "/"), ("Text", " \n"), # because of r"\s+", Text for expressions ], pygments.lex("\\tt-o/\n\\tt-o// ", self.lexer)) @unittest.skipIf(sys.version_info[0] <= 2, "Unicode issue on Python 2") def test_explicit_tokentype_with_remark(self): self.assertTokenStreamEqualComplete( [("Operator", "∈ ∌"), ("Text", " "), ("Comment.Single", "▷"), ("Comment.Single", " ∈ ∌ as (ordinary) operators"), ("Text.Whitespace", "\n"), ], pygments.lex( r"""\ttx-o<∈ ∌> \rem ∈ ∌ as (ordinary) operators""", self.lexer)) def test_explicit_tokentype_with_remark_2(self): self.assertTokenStreamEqualComplete( [("Operator", "new_operator"), ("Text", " "), ("Comment.Single", "▷"), ("Comment.Single", " a (synthesized) operator"), ("Text.Whitespace", "\n"), ], pygments.lex( r"""\ttx-o<new_operator> \rem a (synthesized) operator""", self.lexer)) @unittest.skipIf(sys.version_info[0] <= 2, "Unicode issue on Python 2") def test_explicit_tokentype_with_possibly_conflicting_parens(self): self.assertTokenStreamEqualComplete( [("Name.Function", "∈_∌"), ("Punctuation", "("), ("Name.Entity", "p1"), ("Punctuation", ","), ("Text", " "), ("Name.Entity", "p2"), ("Punctuation", ")"), ("Text.Whitespace", "\n"), ], pygments.lex( r"""\ttx-nf<∈_∌>(p1, p2)""", self.lexer)) def test_explicit_tokentype_with_possibly_conflicting_parens_2(self): self.assertTokenStreamEqualComplete( [("Name.Decorator", "a_Decorator"), ("Punctuation", "("), ("Name.Entity", "p1"), ("Punctuation", ","), ("Text", " "), ("Name.Entity", "p2"), ("Punctuation", ")"), ("Text", " "), ("Comment.Single", "▷"), ("Comment.Single", " (Python) decorator"), ("Text.Whitespace", "\n"), ], pygments.lex( r"""\ttx-nd<a_Decorator>(p1, p2) \rem (Python) decorator""", self.lexer)) def test_explicit_tokentype_with_possibly_conflicting_parens_3(self): self.assertTokenStreamEqualComplete( [("Name.Decorator", "a_Decorator"), ("Punctuation", "("), ("Name.Entity", "p1"), ("Punctuation", ","), ("Text", " "), ("Name.Entity", "p2"), ("Punctuation", ")"), ("Text", " "), ("Comment.Single", "▷"), ("Comment.Single", " (Python) annotation"), ("Text.Whitespace", "\n"), ], pygments.lex( r"""\ttx-nd[a_Decorator](p1, p2) \rem (Python) annotation""", self.lexer)) def test_explicit_tokentype_error(self): self.assertTokenStreamEqualComplete( [("Generic.Error", r"""\ttx-non-existing[a_Decorator]"""), ("Text.Whitespace", "\n"), ], pygments.lex( r"""\ttx-non-existing[a_Decorator]""", self.lexer)) class PygmentizeCompletely(unittest.TestCase): def setUp(self): self.lexer = pygments.lexers.load_lexer_from_file( ALGLEXERFILENAME, ALGLEXERCLASS) def test_pygmentize_html(self): html_formatter = pygments.formatters.get_formatter_by_name("html") highlighted = pygments.highlight( '"""FOO"""', self.lexer, html_formatter, outfile=None) self.assertTrue(highlighted.startswith("""<div class="highlight">""")) def test_pygmentize_latex(self): latex_formatter = pygments.formatters.get_formatter_by_name("latex") highlighted = pygments.highlight( '"""FOO"""', self.lexer, latex_formatter, outfile=None) self.assertTrue(highlighted.startswith(r"""\begin{Verbatim}""")) if __name__ == "__main__": unittest.main()
