1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
import logging
from contextlib import contextmanager
from lark import Lark, logger
from unittest import TestCase, main, skipIf
from io import StringIO
try:
import interegular
except ImportError:
interegular = None
@contextmanager
def capture_log():
stream = StringIO()
orig_handler = logger.handlers[0]
del logger.handlers[:]
logger.addHandler(logging.StreamHandler(stream))
yield stream
del logger.handlers[:]
logger.addHandler(orig_handler)
class Testlogger(TestCase):
def test_debug(self):
logger.setLevel(logging.DEBUG)
collision_grammar = '''
start: as as
as: a*
a: "a"
'''
with capture_log() as log:
Lark(collision_grammar, parser='lalr', debug=True)
log = log.getvalue()
# since there are conflicts about A
# symbol A should appear in the log message for hint
self.assertIn("A", log)
def test_non_debug(self):
logger.setLevel(logging.WARNING)
collision_grammar = '''
start: as as
as: a*
a: "a"
'''
with capture_log() as log:
Lark(collision_grammar, parser='lalr', debug=False)
log = log.getvalue()
# no log message
self.assertEqual(log, "")
def test_loglevel_higher(self):
logger.setLevel(logging.ERROR)
collision_grammar = '''
start: as as
as: a*
a: "a"
'''
with capture_log() as log:
Lark(collision_grammar, parser='lalr', debug=True)
log = log.getvalue()
# no log message
self.assertEqual(len(log), 0)
@skipIf(interegular is None, "interegular is not installed, can't test regex collisions")
def test_regex_collision(self):
logger.setLevel(logging.WARNING)
collision_grammar = '''
start: A | B
A: /a+/
B: /(a|b)+/
'''
with capture_log() as log:
Lark(collision_grammar, parser='lalr')
log = log.getvalue()
# since there are conflicts between A and B
# symbols A and B should appear in the log message
self.assertIn("A", log)
self.assertIn("B", log)
@skipIf(interegular is None, "interegular is not installed, can't test regex collisions")
def test_no_regex_collision(self):
logger.setLevel(logging.WARNING)
collision_grammar = '''
start: A " " B
A: /a+/
B: /(a|b)+/
'''
with capture_log() as log:
Lark(collision_grammar, parser='lalr')
log = log.getvalue()
self.assertEqual(log, "")
if __name__ == '__main__':
main()
|