diff options
Diffstat (limited to 'tests/test_regexopt.py')
-rw-r--r-- | tests/test_regexopt.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/tests/test_regexopt.py b/tests/test_regexopt.py new file mode 100644 index 0000000..2116467 --- /dev/null +++ b/tests/test_regexopt.py @@ -0,0 +1,102 @@ +""" + Tests for pygments.regexopt + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re +import random +from itertools import combinations_with_replacement + +from pygments.regexopt import regex_opt + +ALPHABET = ['a', 'b', 'c', 'd', 'e'] + +N_TRIES = 15 + + +def generate_keywordlist(length): + return [''.join(p) for p in + combinations_with_replacement(ALPHABET, length)] + + +def test_randomly(): + # generate a list of all possible keywords of a certain length using + # a restricted alphabet, then choose some to match and make sure only + # those do + for n in range(3, N_TRIES): + kwlist = generate_keywordlist(n) + to_match = random.sample(kwlist, + random.randint(1, len(kwlist) - 1)) + no_match = set(kwlist) - set(to_match) + rex = re.compile(regex_opt(to_match)) + assert rex.groups == 1 + for w in to_match: + assert rex.match(w) + for w in no_match: + assert not rex.match(w) + + +def test_prefix(): + opt = regex_opt(('a', 'b'), prefix=r':{1,2}') + print(opt) + rex = re.compile(opt) + assert not rex.match('a') + assert rex.match('::a') + assert not rex.match(':::') # fullmatch + + +def test_suffix(): + opt = regex_opt(('a', 'b'), suffix=r':{1,2}') + print(opt) + rex = re.compile(opt) + assert not rex.match('a') + assert rex.match('a::') + assert not rex.match(':::') # fullmatch + + +def test_suffix_opt(): + # test that detected suffixes remain sorted. + opt = regex_opt(('afoo', 'abfoo')) + print(opt) + rex = re.compile(opt) + m = rex.match('abfoo') + assert m.end() == 5 + + +def test_different_length_grouping(): + opt = regex_opt(('a', 'xyz')) + print(opt) + rex = re.compile(opt) + assert rex.match('a') + assert rex.match('xyz') + assert not rex.match('b') + assert rex.groups == 1 + + +def test_same_length_grouping(): + opt = regex_opt(('a', 'b')) + print(opt) + rex = re.compile(opt) + assert rex.match('a') + assert rex.match('b') + assert not rex.match('x') + + assert rex.groups == 1 + groups = rex.match('a').groups() + assert groups == ('a',) + + +def test_same_length_suffix_grouping(): + opt = regex_opt(('a', 'b'), suffix='(m)') + print(opt) + rex = re.compile(opt) + assert rex.match('am') + assert rex.match('bm') + assert not rex.match('xm') + assert not rex.match('ax') + assert rex.groups == 2 + groups = rex.match('am').groups() + assert groups == ('a', 'm') |