comparison tests/test_algpseudo.py @ 105:cec52d83869a

Handle much more characters from the Unicode codeset in expressions. While there: FIX: Add forgotten Punctuation characters `?' and `@'. While there: Allow the escaping of single and double quotes that normally start a string (e.g. for expressions like f' is the first derivation of f).
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 04 May 2026 16:30:36 +0200
parents aae16e3624e2
children 6cebd3e7bc97
comparison
equal deleted inserted replaced
104:ffe6ea2cf69b 105:cec52d83869a
150 ("Name.Entity", "the name"), 150 ("Name.Entity", "the name"),
151 ("Text.Whitespace", "\n"), 151 ("Text.Whitespace", "\n"),
152 ], 152 ],
153 pygments.lex("\\PROC {the name}", self.lexer)) 153 pygments.lex("\\PROC {the name}", self.lexer))
154 154
155 def test_proc_with_symbols_in_name(self):
156 self.assertTokenStreamEqualComplete(
157 [("Keyword", "PROCEDURE"),
158 ("Text.Whitespace", " "),
159 ("Name.Entity", "the name sqrt ! <="),
160 ("Text.Whitespace", "\n"),
161 ],
162 pygments.lex("\\PROC {the name sqrt ! <=}", self.lexer))
163
155 def test_proc_with_escape_in_name(self): 164 def test_proc_with_escape_in_name(self):
156 self.assertTokenStreamEqualComplete( 165 self.assertTokenStreamEqualComplete(
157 [("Keyword", "PROCEDURE"), 166 [("Keyword", "PROCEDURE"),
158 ("Text.Whitespace", " "), 167 ("Text.Whitespace", " "),
159 ("Name.Entity", "t"), 168 ("Name.Entity", "t"),
188 ("Text.Whitespace", " "), 197 ("Text.Whitespace", " "),
189 ("Name.Entity", "the procedure name"), 198 ("Name.Entity", "the procedure name"),
190 ("Text.Whitespace", "\n"), 199 ("Text.Whitespace", "\n"),
191 ], 200 ],
192 pygments.lex("\\END-PROC {the procedure name}", self.lexer)) 201 pygments.lex("\\END-PROC {the procedure name}", self.lexer))
202
203 def test_endproc_with_entityname_3(self):
204 self.assertTokenStreamEqualComplete(
205 [("Keyword", "END OF PROCEDURE"),
206 ("Text.Whitespace", " "),
207 ("Name.Entity", "the procedure name with pow and symbols ! <= "),
208 ("Name.Entity", "}"),
209 ("Name.Entity", "<-"),
210 ("Text.Whitespace", "\n"),
211 ],
212 pygments.lex(
213 "\\END-PROC"
214 " {the procedure name with pow and symbols ! <= \\}<-}",
215 self.lexer))
193 216
194 def test_proc_de(self): 217 def test_proc_de(self):
195 lexer = pygments.lexers.load_lexer_from_file( 218 lexer = pygments.lexers.load_lexer_from_file(
196 ALGLEXERFILENAME, "AlgPseudocodeLexer_DE") 219 ALGLEXERFILENAME, "AlgPseudocodeLexer_DE")
197 self.assertTokenStreamEqualComplete( 220 self.assertTokenStreamEqualComplete(
377 ("Punctuation", ")"), 400 ("Punctuation", ")"),
378 ("Punctuation", ","), 401 ("Punctuation", ","),
379 ("Punctuation", ";"), 402 ("Punctuation", ";"),
380 ("Punctuation", "["), 403 ("Punctuation", "["),
381 ("Punctuation", "]"), 404 ("Punctuation", "]"),
382 ("Text.Whitespace", "\n"), 405 ("Punctuation", "?"),
383 ], 406 ("Punctuation", "@"),
384 pygments.lex(r"{}:(),;[]", self.lexer)) 407 ("Text.Whitespace", "\n"),
408 ],
409 pygments.lex(r"{}:(),;[]?@", self.lexer))
385 410
386 def test_block_empty(self): 411 def test_block_empty(self):
387 self.assertTokenStreamEqualComplete( 412 self.assertTokenStreamEqualComplete(
388 [("Text", "◆"), 413 [("Text", "◆"),
389 ("Text.Whitespace", " "), 414 ("Text.Whitespace", " "),
562 ("Text", " "), 587 ("Text", " "),
563 ("Text.Whitespace", "\n"), 588 ("Text.Whitespace", "\n"),
564 ], 589 ],
565 pygments.lex("\\tt-o/\n\\tt-o// ", self.lexer)) 590 pygments.lex("\\tt-o/\n\\tt-o// ", self.lexer))
566 591
567 @unittest.skipIf(sys.version_info[0] <= 2, "Unicode issue on Python 2")
568 def test_explicit_tokentype_with_remark(self): 592 def test_explicit_tokentype_with_remark(self):
569 self.assertTokenStreamEqualComplete( 593 self.assertTokenStreamEqualComplete(
570 [("Operator", "∈ ∌"), 594 [("Operator", u"∈ ∌"),
571 ("Text", " "), 595 ("Text", " "),
572 ("Comment.Single", "▷"), 596 ("Comment.Single", "▷"),
573 ("Comment.Single", " ∈ ∌ as (ordinary) operators"), 597 ("Comment.Single", u" ∈ ∌ as (ordinary) operators"),
574 ("Text.Whitespace", "\n"), 598 ("Text.Whitespace", "\n"),
575 ], 599 ],
576 pygments.lex( 600 pygments.lex(
577 r"""\ttx-o<∈ ∌> \rem ∈ ∌ as (ordinary) operators""", 601 u"""\\ttx-o<∈ ∌> \\rem ∈ ∌ as (ordinary) operators""",
578 self.lexer)) 602 self.lexer))
579 603
580 def test_explicit_tokentype_with_remark_2(self): 604 def test_explicit_tokentype_with_remark_2(self):
581 self.assertTokenStreamEqualComplete( 605 self.assertTokenStreamEqualComplete(
582 [("Operator", "new_operator"), 606 [("Operator", "new_operator"),
587 ], 611 ],
588 pygments.lex( 612 pygments.lex(
589 r"""\ttx-o<new_operator> \rem a (synthesized) operator""", 613 r"""\ttx-o<new_operator> \rem a (synthesized) operator""",
590 self.lexer)) 614 self.lexer))
591 615
592 @unittest.skipIf(sys.version_info[0] <= 2, "Unicode issue on Python 2")
593 def test_explicit_tokentype_with_possibly_conflicting_parens(self): 616 def test_explicit_tokentype_with_possibly_conflicting_parens(self):
594 self.assertTokenStreamEqualComplete( 617 self.assertTokenStreamEqualComplete(
595 [("Name.Function", "∈_∌"), 618 [("Name.Function", u"∈_∌"),
596 ("Punctuation", "("), 619 ("Punctuation", "("),
597 ("Name.Entity", "p1"), 620 ("Name.Entity", "p1"),
598 ("Punctuation", ","), 621 ("Punctuation", ","),
599 ("Text", " "), 622 ("Text", " "),
600 ("Name.Entity", "p2"), 623 ("Name.Entity", "p2"),
601 ("Punctuation", ")"), 624 ("Punctuation", ")"),
602 ("Text.Whitespace", "\n"), 625 ("Text.Whitespace", "\n"),
603 ], 626 ],
604 pygments.lex( 627 pygments.lex(
605 r"""\ttx-nf<∈_∌>(p1, p2)""", 628 u"""\\ttx-nf<∈_∌>(p1, p2)""",
606 self.lexer)) 629 self.lexer))
607 630
608 def test_explicit_tokentype_with_possibly_conflicting_parens_2(self): 631 def test_explicit_tokentype_with_possibly_conflicting_parens_2(self):
609 self.assertTokenStreamEqualComplete( 632 self.assertTokenStreamEqualComplete(
610 [("Name.Decorator", "a_Decorator"), 633 [("Name.Decorator", "a_Decorator"),
670 ], 693 ],
671 pygments.lex( 694 pygments.lex(
672 r"""\begin \end \end-fn \end-fn {An End of a Function}""" 695 r"""\begin \end \end-fn \end-fn {An End of a Function}"""
673 r""" \end fn {The End of the Next Function} """, 696 r""" \end fn {The End of the Next Function} """,
674 self.lexer)) 697 self.lexer))
698
699 def test_unicode_math_operator(self):
700 self.assertTokenStreamEqualComplete(
701 [("Operator", u"∈"),
702 ("Text.Whitespace", "\n"),
703 ],
704 pygments.lex(u"∈", self.lexer))
705
706 def test_ascii_math_operator(self):
707 self.assertTokenStreamEqualComplete(
708 [("Operator", "="),
709 ("Operator", "!"),
710 ("Operator", "&"),
711 ("Operator", "<"),
712 ("Text", " "),
713 ("Operator", ">"),
714 ("Operator", "+"),
715 ("Operator", "-"),
716 ("Operator", "*"),
717 ("Operator", "/"),
718 ("Operator", "%"),
719 ("Operator", "|"),
720 ("Operator", "~"),
721 ("Text.Whitespace", "\n"),
722 ],
723 pygments.lex("=!&< >+-*/%|~", self.lexer))
724
725 @unittest.skipIf(sys.version_info[0] <= 2, "Unicode issues on Python 2")
726 def test_ascii_math_operator_with_replacements(self):
727 self.assertTokenStreamEqualComplete(
728 [("Operator", u"⇔"),
729 ("Text", " "),
730 ("Operator", u"↔"),
731 ("Text", " "),
732 ("Operator", u"←"),
733 ("Text", " "),
734 ("Operator", u"→"),
735 ("Text", " "),
736 ("Operator", u"⇒"),
737 ("Text", " "),
738 ("Operator", u"≤"),
739 ("Text", " "),
740 ("Operator", u"≥"),
741 ("Text", " "),
742 ("Operator", u"≠"),
743 ("Text", " "),
744 ("Operator", u"≠"),
745 ("Text", " "),
746 ("Operator", u"∶="), # u"≔"),
747 ("Text", " "),
748 ("Operator", u"=∶"), # u"≕"),
749 ("Text", " "),
750 ("Operator", u"≟"),
751 ("Text.Whitespace", "\n"),
752 ],
753 pygments.lex(u"<=> <-> <- -> => <= >= <> != := =: ?=", self.lexer))
754
755 def test_word_operators(self):
756 self.assertTokenStreamEqualComplete(
757 [("Operator.Word", "IN"),
758 ("Text", " "),
759 ("Operator.Word", "is"),
760 ("Text", " "),
761 ("Operator.Word", "And"),
762 ("Text", " "),
763 ("Operator.Word", "Or"),
764 ("Text", " "),
765 ("Operator.Word", "XOR"),
766 ("Text", " "),
767 ("Operator.Word", "not"),
768 ("Text.Whitespace", "\n"),
769 ],
770 pygments.lex("IN is And Or XOR not", self.lexer))
771
772 def test_keyword_constants(self):
773 self.assertTokenStreamEqualComplete(
774 [("Keyword.Constant", "true"),
775 ("Text", " "),
776 ("Keyword.Constant", "FALSE"),
777 ("Text", " "),
778 ("Keyword.Constant", "None"),
779 ("Text", " "),
780 ("Keyword.Constant", "nil"),
781 ("Text", " "),
782 ("Keyword.Constant", "NULL"),
783 ("Text", " "),
784 ("Keyword.Constant", "Empty"),
785 ("Text.Whitespace", "\n"),
786 ],
787 pygments.lex("true FALSE None nil NULL Empty", self.lexer))
788
789 def test_math_builtins(self):
790 self.assertTokenStreamEqualComplete(
791 [("Name.Builtin", "sqrt"),
792 ("Punctuation", "("),
793 ("Name.Entity", "Foo"),
794 ("Punctuation", ")"),
795 ("Punctuation", ";"),
796 ("Text.Whitespace", "\n"),
797 ],
798 pygments.lex("sqrt(Foo);", self.lexer))
799
800 def test_math_builtins_nested(self):
801 self.assertTokenStreamEqualComplete(
802 [("Name.Builtin", "pow"),
803 ("Punctuation", "("),
804 ("Number.Integer", "2"),
805 ("Punctuation", ","),
806 ("Text", " "),
807 ("Number.Integer", "8"),
808 ("Punctuation", ")"),
809 ("Punctuation", ";"),
810 ("Text.Whitespace", "\n"),
811 ],
812 pygments.lex("\\text{\\expr{pow(2, 8);}}", self.lexer))
813
814 def test_math_letters(self):
815 self.assertTokenStreamEqualComplete(
816 [("Name.Entity", "a"),
817 ("Text", " "),
818 ("Operator.Word", "in"),
819 ("Text", " "),
820 ("Name.Entity", u"ℂ"),
821 ("Text.Whitespace", "\n"),
822 ],
823 pygments.lex(u"a in ℂ", self.lexer))
824
825 def test_other_symbols(self):
826 self.assertTokenStreamEqualComplete(
827 [("Name.Entity", "b"),
828 ("Text", " "),
829 ("Operator.Word", "in"),
830 ("Text", " "),
831 ("Text", u"℀"),
832 ("Text.Whitespace", "\n"),
833 ],
834 pygments.lex(u"b in ℀", self.lexer))
835
836 def test_escaped_string_start_1(self):
837 self.assertTokenStreamEqualComplete(
838 [("Text", "flow "),
839 ("Name.Entity", "f"),
840 ("Punctuation", "'"),
841 ("Text.Whitespace", "\n"),
842 ],
843 pygments.lex(r"\TEXT{flow \expr{f\'}}", self.lexer))
844
845 def test_escaped_string_start_2(self):
846 self.assertTokenStreamEqualComplete(
847 [("Text", "flow "),
848 ("Name.Entity", "f"),
849 ("Punctuation", '"'),
850 ("Text.Whitespace", "\n"),
851 ],
852 pygments.lex(r'\TEXT{flow \expr{f\"}}', self.lexer))
675 853
676 854
677 class PygmentizeCompletely(unittest.TestCase): 855 class PygmentizeCompletely(unittest.TestCase):
678 856
679 def setUp(self): 857 def setUp(self):