Currently job artifacts in CI/CD pipelines on LRZ GitLab never expire. Starting from Wed 26.1.2022 the default expiration time will be 30 days (GitLab default). Currently existing artifacts in already completed jobs will not be affected by the change. The latest artifacts for all jobs in the latest successful pipelines will be kept. More information: https://gitlab.lrz.de/help/user/admin_area/settings/continuous_integration.html#default-artifacts-expiration

Commit a7ea5970 authored by Eckhart Arnold's avatar Eckhart Arnold
Browse files

- refactor RootNode.errors()-Method

parent af64dde3
......@@ -246,7 +246,7 @@ def compile_source(source: str,
# messages.extend(syntax_tree.errors())
# syntax_tree.error_flag = max(syntax_tree.error_flag, efl)
messages = syntax_tree.errors()
messages = syntax_tree.errors_sorted
adjust_error_locations(messages, original_text, source_mapping)
return result, messages, ast
......
......@@ -193,7 +193,7 @@ class Node: # (collections.abc.Sized): Base class omitted for cython-compatibil
def __str__(self):
if isinstance(self, RootNode):
root = cast(RootNode, self)
errors = root.errors()
errors = root.errors_sorted
if errors:
e_pos = errors[0].pos
return self.content[:e_pos] + \
......@@ -743,7 +743,7 @@ PLACEHOLDER = Node('__PLACEHOLDER__', '')
class RootNode(Node):
"""TODO: Add Documentation!!!
all_errors (list): A list of all errors that have occured so far during
errors (list): A list of all errors that have occured so far during
processing (i.e. parsing, AST-transformation, compiling)
of this tree.
......@@ -753,7 +753,7 @@ class RootNode(Node):
def __init__(self, node: Optional[Node] = None):
super().__init__('__not_yet_ready__', '')
self.all_errors = [] # type: List[Error]
self.errors = [] # type: List[Error]
self.error_nodes = dict() # type: Dict[int, List[Error]] # id(node) -> error list
self.error_positions = dict() # type: Dict[int, Set[int]] # pos -> set of id(node)
self.error_flag = 0
......@@ -777,7 +777,7 @@ class RootNode(Node):
if self.attr_active():
duplicate.attr.update(copy.deepcopy(self._xml_attr))
# duplicate._xml_attr = copy.deepcopy(self._xml_attr) # this is blocked by cython
duplicate.all_errors = copy.copy(self.all_errors)
duplicate.errors = copy.copy(self.errors)
duplicate.error_nodes = copy.copy(self.error_nodes)
duplicate.error_positions = copy.deepcopy(self.error_positions)
duplicate.error_flag = self.error_flag
......@@ -818,11 +818,7 @@ class RootNode(Node):
"""
assert not isinstance(node, FrozenNode)
assert node.pos == error.pos
# self.all_errors.append(error)
for i in range(len(self.all_errors)):
if node.pos < self.all_errors[i].pos:
break
self.all_errors.insert(i, error)
self.errors.append(error)
self.error_flag = max(self.error_flag, error.code)
self.error_nodes.setdefault(id(node), []).append(error)
self.error_positions.setdefault(node.pos, set()).add(id(node))
......@@ -863,12 +859,12 @@ class RootNode(Node):
return errors
@property
def errors(self) -> List[Error]:
def errors_sorted(self) -> List[Error]:
"""
Returns the list of errors, ordered bv their position.
"""
# self.all_errors.sort(key=lambda e: e.pos)
return self.all_errors
self.errors.sort(key=lambda e: e.pos)
return self.errors
def customized_XML(self):
"""
......
......@@ -410,7 +410,7 @@ def grammar_unit(test_unit, parser_factory, transformer_factory, report=True, ve
transform(ast)
tests.setdefault('__ast__', {})[test_name] = ast
# log_ST(ast, "match_%s_%s.ast" % (parser_name, clean_test_name))
raw_errors = cst.errors()
raw_errors = cst.errors_sorted
if is_error(cst.error_flag) and not lookahead_artifact(parser, raw_errors):
errors = adjust_error_locations(raw_errors, test_code)
errata.append('Match test "%s" for parser "%s" failed:\n\tExpr.: %s\n\n\t%s\n\n' %
......@@ -454,7 +454,7 @@ def grammar_unit(test_unit, parser_factory, transformer_factory, report=True, ve
cst = RootNode(node).new_error(node, str(upe))
errata.append('Unknown parser "{}" in fail test "{}"!'.format(parser_name, test_name))
tests.setdefault('__err__', {})[test_name] = errata[-1]
if not is_error(cst.error_flag) and not lookahead_artifact(parser, cst.errors()):
if not is_error(cst.error_flag) and not lookahead_artifact(parser, cst.errors_sorted):
errata.append('Fail test "%s" for parser "%s" yields match instead of '
'expected failure!' % (test_name, parser_name))
tests.setdefault('__err__', {})[test_name] = errata[-1]
......@@ -463,7 +463,7 @@ def grammar_unit(test_unit, parser_factory, transformer_factory, report=True, ve
log_parsing_history(parser, "fail_%s_%s.log" % (parser_name, test_name))
if cst.error_flag:
tests.setdefault('__msg__', {})[test_name] = \
"\n".join(str(e) for e in cst.errors())
"\n".join(str(e) for e in cst.errors_sorted)
if verbose:
write(infostr + ("OK" if len(errata) == errflag else "FAIL"))
......
......@@ -207,4 +207,4 @@ syntax_tree = parser(markdown_text)
ASTTransform(syntax_tree, MDTransTable)
print(syntax_tree.as_sxpr())
print(error_messages(markdown_text, syntax_tree.errors()))
print(error_messages(markdown_text, syntax_tree.errors_sorted))
......@@ -283,4 +283,4 @@ syntax_tree = parse(markdown_text, parser)
ASTTransform(syntax_tree, MDTransTable)
print(syntax_tree.as_sxpr())
print(error_messages(markdown_text, syntax_tree.errors()))
print(error_messages(markdown_text, syntax_tree.errors_sorted()))
......@@ -50,7 +50,7 @@ compiler = get_compiler()
def fail_on_error(src, result):
if result.error_flag:
print(result.as_sxpr())
for e in result.errors():
for e in result.errors_sorted:
print(str(e))
sys.exit(1)
......
......@@ -52,7 +52,7 @@ class TestCompileFunctions:
assert callable(factory)
parser = factory()
result = parser("5 + 3 * 4")
assert not result.error_flag, str(result.errors())
assert not result.error_flag, str(result.errors_sorted)
result = parser("5A + 4B ** 4C")
assert is_error(result.error_flag)
......
......@@ -52,36 +52,36 @@ class TestDirectives:
assert parser
syntax_tree = parser("3 + 4 * 12")
# parser.log_parsing_history("WSP")
assert not syntax_tree.errors()
assert not syntax_tree.errors_sorted
syntax_tree = parser("3 + 4 \n * 12")
# parser.log_parsing_history("WSPLF")
assert not syntax_tree.errors()
assert not syntax_tree.errors_sorted
syntax_tree = parser("3 + 4 \n \n * 12")
assert syntax_tree.errors()
assert syntax_tree.errors_sorted
syntax_tree = parser("3 + 4 \n\n * 12")
assert syntax_tree.errors()
assert syntax_tree.errors_sorted
def test_whitespace_vertical(self):
lang = "@ whitespace = vertical\n" + self.mini_language
parser = grammar_provider(lang)()
assert parser
syntax_tree = parser("3 + 4 * 12")
assert not syntax_tree.errors()
assert not syntax_tree.errors_sorted
syntax_tree = parser("3 + 4 \n * 12")
assert not syntax_tree.errors()
assert not syntax_tree.errors_sorted
syntax_tree = parser("3 + 4 \n \n * 12")
assert not syntax_tree.errors()
assert not syntax_tree.errors_sorted
syntax_tree = parser("3 + 4 \n\n * 12")
assert not syntax_tree.errors()
assert not syntax_tree.errors_sorted
def test_whitespace_horizontal(self):
lang = "@ whitespace = horizontal\n" + self.mini_language
parser = grammar_provider(lang)()
assert parser
syntax_tree = parser("3 + 4 * 12")
assert not syntax_tree.errors()
assert not syntax_tree.errors_sorted
syntax_tree = parser("3 + 4 \n * 12")
assert syntax_tree.errors()
assert syntax_tree.errors_sorted
class TestReservedSymbols:
......@@ -176,7 +176,7 @@ class TestParserNameOverwriteBug:
get_ebnf_transformer()(st)
# print(st.as_sxpr())
result = get_ebnf_compiler()(st)
messages = st.errors()
messages = st.errors_sorted
assert not has_errors(messages), str(messages)
def test_single_mandatory_bug(self):
......@@ -194,9 +194,9 @@ class TestSemanticValidation:
def check(self, minilang, bool_filter=lambda x: x):
grammar = get_ebnf_grammar()
st = grammar(minilang)
assert not st.errors()
assert not st.errors_sorted
EBNFTransform()(st)
assert bool_filter(st.errors())
assert bool_filter(st.errors_sorted)
def test_illegal_nesting(self):
self.check('impossible = { [ "an optional requirement" ] }')
......@@ -477,12 +477,12 @@ class TestErrorCustomization:
st = parser("ABCD"); assert not st.error_flag
st = parser("A_CD"); assert not st.error_flag
st = parser("AB_D"); assert st.error_flag
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors()[0].message == "a user defined error message"
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].message == "a user defined error message"
# transitivity of mandatory-operator
st = parser("ABC_"); assert st.error_flag
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors()[0].message == "a user defined error message"
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].message == "a user defined error message"
def test_customized_error_case_sensitive(self):
lang = """
......@@ -493,8 +493,8 @@ class TestErrorCustomization:
"""
parser = grammar_provider(lang)()
st = parser("ABC_"); assert st.error_flag
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors()[0].message == "a user defined error message"
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].message == "a user defined error message"
def test_multiple_error_messages(self):
lang = """
......@@ -509,21 +509,21 @@ class TestErrorCustomization:
"""
parser = grammar_provider(lang)()
st = parser("AB*D"); assert st.error_flag
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors()[0].message == "the asterix is wrong in this place"
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].message == "the asterix is wrong in this place"
# transitivity of mandatory-operator
st = parser("ABC_"); assert st.error_flag
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors()[0].message == "the underscore is wrong in this place"
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].message == "the underscore is wrong in this place"
st = parser("ABiD"); assert st.error_flag
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors()[0].message.startswith('wrong letter')
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].message.startswith('wrong letter')
st = parser("AB+D"); assert st.error_flag
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors()[0].message == "fallback error message"
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].message == "fallback error message"
st = parser("ABCi"); assert st.error_flag
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors()[0].message.startswith('C cannot be followed by')
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].message.startswith('C cannot be followed by')
class TestErrorCustomizationErrors:
......@@ -600,7 +600,7 @@ class TestCustomizedResumeParsing:
assert cst.content == content
assert cst.pick('alpha').content.startswith('ALPHA')
# because of resuming, there should be only on error message
assert len(cst.errors()) == 1
assert len(cst.errors_sorted) == 1
content = 'ALPHA acb BETA bad GAMMA cab .'
cst = gr(content)
......@@ -609,7 +609,7 @@ class TestCustomizedResumeParsing:
assert cst.content == content
assert cst.pick('alpha').content.startswith('ALPHA')
# because of resuming, there should be only on error message
assert len(cst.errors()) == 2
assert len(cst.errors_sorted) == 2
content = 'ALPHA acb GAMMA cab .'
cst = gr(content)
......@@ -618,7 +618,7 @@ class TestCustomizedResumeParsing:
assert cst.content == content
assert cst.pick('alpha').content.startswith('ALPHA')
# because of resuming, there should be only on error message
assert len(cst.errors()) == 1
assert len(cst.errors_sorted) == 1
class TestInSeriesResume:
......@@ -634,29 +634,29 @@ class TestInSeriesResume:
st = self.gr('ABCDEFG')
assert not st.error_flag
st = self.gr('AB XYZ CDEFG')
errors = st.errors()
errors = st.errors_sorted
assert len(errors) == 1 and errors[0].code == Error.MANDATORY_CONTINUATION
st = self.gr('AB XYZ CDE XYZ FG')
errors = st.errors()
errors = st.errors_sorted
assert len(errors) == 2 and all(err.code == Error.MANDATORY_CONTINUATION for err in errors)
st = self.gr('AB XYZ CDE XNZ FG') # fails to resume parsing
errors = st.errors()
errors = st.errors_sorted
assert len(errors) >= 1 and errors[0].code == Error.MANDATORY_CONTINUATION
def test_series_gap(self):
st = self.gr('ABDEFG')
errors = st.errors()
errors = st.errors_sorted
assert len(errors) == 1 and errors[0].code == Error.MANDATORY_CONTINUATION
st = self.gr('ABXEFG') # two missing, one wrong element added
errors = st.errors()
errors = st.errors_sorted
assert len(errors) == 2 and all(err.code == Error.MANDATORY_CONTINUATION for err in errors)
st = self.gr('AB_DE_G')
errors = st.errors()
errors = st.errors_sorted
assert len(errors) == 2 and all(err.code == Error.MANDATORY_CONTINUATION for err in errors)
def test_series_permutation(self):
st = self.gr('ABEDFG')
errors = st.errors()
errors = st.errors_sorted
assert len(errors) >= 1 # cannot really recover from permutation errors
......@@ -674,7 +674,7 @@ class TestAllOfResume:
st = self.gr('GFCBAED')
assert not st.error_flag
st = self.gr('GFCB XYZ AED')
errors = st.errors()
errors = st.errors_sorted
assert errors[0].code == Error.MANDATORY_CONTINUATION
assert str(errors[0]).find(':-(') >= 0
......@@ -697,9 +697,9 @@ class TestAllOfResume:
assert not st.error_flag
st = gr('EDXYZ.')
assert st.error_flag
assert len(st.errors()) == 1
assert len(st.errors_sorted) == 1
st = gr('FCB_GAED.')
assert len(st.errors()) == 1
assert len(st.errors_sorted) == 1
def test_complex_resume_task(self):
......@@ -722,11 +722,11 @@ class TestAllOfResume:
assert not st.error_flag
st = gr('EDXYZ.')
assert st.error_flag
assert len(st.errors()) == 1
assert len(st.errors_sorted) == 1
st = gr('FCB_GAED.')
assert len(st.errors()) == 2
assert len(st.errors_sorted) == 2
st = gr('EXY EXYZ.')
assert len(st.errors()) == 1
assert len(st.errors_sorted) == 1
......
......@@ -69,7 +69,7 @@ class TestInfiLoopsAndRecursion:
parser = grammar_provider(minilang)()
assert parser
syntax_tree = parser(snippet)
assert not syntax_tree.error_flag, str(syntax_tree.errors())
assert not syntax_tree.error_flag, str(syntax_tree.errors_sorted)
assert snippet == str(syntax_tree)
if is_logging():
log_ST(syntax_tree, "test_LeftRecursion_direct.cst")
......@@ -86,7 +86,7 @@ class TestInfiLoopsAndRecursion:
parser = grammar_provider(minilang)()
assert parser
syntax_tree = parser(snippet)
assert not syntax_tree.error_flag, syntax_tree.errors()
assert not syntax_tree.error_flag, syntax_tree.errors_sorted
assert snippet == str(syntax_tree)
def test_indirect_left_recursion1(self):
......@@ -100,13 +100,13 @@ class TestInfiLoopsAndRecursion:
assert parser
snippet = "8 * 4"
syntax_tree = parser(snippet)
assert not syntax_tree.error_flag, syntax_tree.errors()
assert not syntax_tree.error_flag, syntax_tree.errors_sorted
snippet = "7 + 8 * 4"
syntax_tree = parser(snippet)
assert not syntax_tree.error_flag, syntax_tree.errors()
assert not syntax_tree.error_flag, syntax_tree.errors_sorted
snippet = "9 + 8 * (4 + 3)"
syntax_tree = parser(snippet)
assert not syntax_tree.error_flag, syntax_tree.errors()
assert not syntax_tree.error_flag, syntax_tree.errors_sorted
assert snippet == str(syntax_tree)
if is_logging():
log_ST(syntax_tree, "test_LeftRecursion_indirect.cst")
......@@ -325,10 +325,10 @@ class TestSeries:
st = parser("A_CD"); assert not st.error_flag
st = parser("AB_D"); assert st.error_flag
# print(st.errors())
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
# transitivity of mandatory-operator
st = parser("ABC_"); assert st.error_flag
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
def test_series_composition(self):
TA, TB, TC, TD, TE = (TKN(b) for b in "ABCDE")
......@@ -340,9 +340,9 @@ class TestSeries:
st = parser("ABCDE"); assert not st.error_flag
st = parser("A_CDE"); assert not st.error_flag
st = parser("AB_DE"); assert st.error_flag
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
st = parser("ABC_E"); assert st.error_flag
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
combined = Alternative(s2 + s1, RegExp('.*'))
parser = Grammar(combined)
......@@ -352,7 +352,7 @@ class TestSeries:
st = parser("DE_BC"); assert not st.error_flag
st = parser("DEA_C"); assert not st.error_flag
st = parser("DEAB_"); assert st.error_flag
assert st.errors()[0].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].code == Error.MANDATORY_CONTINUATION
# def test_boundary_cases(self):
# lang = """
......@@ -463,23 +463,23 @@ class TestPopRetrieve:
def test_stackhandling(self):
ambigous_opening = "<ABCnormal> normal tag <ABCnormal*>"
syntax_tree = self.minilang_parser3(ambigous_opening)
assert not syntax_tree.error_flag, str(syntax_tree.errors())
assert not syntax_tree.error_flag, str(syntax_tree.errors_sorted)
ambigous_opening = "<ABCnormal> normal tag <ABCnormal/>"
syntax_tree = self.minilang_parser3(ambigous_opening)
assert not syntax_tree.error_flag, str(syntax_tree.errors())
assert not syntax_tree.error_flag, str(syntax_tree.errors_sorted)
forgot_closing_tag = "<em> where is the closing tag?"
syntax_tree = self.minilang_parser3(forgot_closing_tag)
assert syntax_tree.error_flag, str(syntax_tree.errors())
assert syntax_tree.error_flag, str(syntax_tree.errors_sorted)
proper = "<em> has closing tag <em/>"
syntax_tree = self.minilang_parser3(proper)
assert not syntax_tree.error_flag, str(syntax_tree.errors())
assert not syntax_tree.error_flag, str(syntax_tree.errors_sorted)
proper = "<em> has closing tag <em*>"
syntax_tree = self.minilang_parser3(proper)
assert not syntax_tree.error_flag, str(syntax_tree.errors())
assert not syntax_tree.error_flag, str(syntax_tree.errors_sorted)
def test_cache_neutrality(self):
"""Test that packrat-caching does not interfere with the variable-
......@@ -496,12 +496,12 @@ class TestPopRetrieve:
case = "(secret)*. secret"
gr = grammar_provider(lang)()
st = gr(case)
assert not st.error_flag, str(st.errors())
assert not st.error_flag, str(st.errors_sorted)
def test_single_line(self):
teststr = "Anfang ```code block `` <- keine Ende-Zeichen ! ``` Ende"
syntax_tree = self.minilang_parser(teststr)
assert not syntax_tree.errors()
assert not syntax_tree.errors_sorted
delim = str(next(syntax_tree.select(partial(self.opening_delimiter, name="delimiter"))))
pop = str(next(syntax_tree.select(self.closing_delimiter)))
assert delim == pop
......@@ -518,7 +518,7 @@ class TestPopRetrieve:
Mehrzeliger ```code block
"""
syntax_tree = self.minilang_parser(teststr)
assert not syntax_tree.errors()
assert not syntax_tree.errors_sorted
delim = str(next(syntax_tree.select(partial(self.opening_delimiter, name="delimiter"))))
pop = str(next(syntax_tree.select(self.closing_delimiter)))
assert delim == pop
......@@ -528,7 +528,7 @@ class TestPopRetrieve:
def test_single_line_complement(self):
teststr = "Anfang {{{code block }} <- keine Ende-Zeichen ! }}} Ende"
syntax_tree = self.minilang_parser2(teststr)
assert not syntax_tree.errors()
assert not syntax_tree.errors_sorted
delim = str(next(syntax_tree.select(partial(self.opening_delimiter, name="braces"))))
pop = str(next(syntax_tree.select(self.closing_delimiter)))
assert len(delim) == len(pop) and delim != pop
......@@ -545,7 +545,7 @@ class TestPopRetrieve:
Mehrzeliger }}}code block
"""
syntax_tree = self.minilang_parser2(teststr)
assert not syntax_tree.errors()
assert not syntax_tree.errors_sorted
delim = str(next(syntax_tree.select(partial(self.opening_delimiter, name="braces"))))
pop = str(next(syntax_tree.select(self.closing_delimiter)))
assert len(delim) == len(pop) and delim != pop
......@@ -597,7 +597,7 @@ class TestErrorReporting:
testcode2 = "XYZ"
testcode3 = "hallo "
cst = self.parser(testcode1)
assert not cst.error_flag, str(cst.errors())
assert not cst.error_flag, str(cst.errors_sorted)
cst = self.parser(testcode2)
assert not cst.error_flag
cst = self.parser(testcode3)
......@@ -611,9 +611,9 @@ class TestBorderlineCases:
cst = gr('X', 'parser')
assert not cst.error_flag
cst = gr(' ', 'parser')
assert cst.error_flag and cst.errors()[0].code == Error.PARSER_DID_NOT_MATCH
assert cst.error_flag and cst.errors_sorted[0].code == Error.PARSER_DID_NOT_MATCH
cst = gr('', 'parser')
assert cst.error_flag and cst.errors()[0].code == Error.PARSER_DID_NOT_MATCH
assert cst.error_flag and cst.errors_sorted[0].code == Error.PARSER_DID_NOT_MATCH
def test_matching(self):
minilang = """parser = /.?/"""
......@@ -621,7 +621,7 @@ class TestBorderlineCases:
cst = gr(' ', 'parser')
assert not cst.error_flag
cst = gr(' ', 'parser')
assert cst.error_flag and cst.errors()[0].code == Error.PARSER_STOPPED_BEFORE_END
assert cst.error_flag and cst.errors_sorted[0].code == Error.PARSER_STOPPED_BEFORE_END
cst = gr('', 'parser')
assert not cst.error_flag
......@@ -669,7 +669,7 @@ class TestReentryAfterError:
assert cst.content == content
assert cst.pick('alpha').content.startswith('ALPHA')
# because of resuming, there should be only on error message
assert len(cst.errors()) == 1
assert len(cst.errors_sorted) == 1
def test_failing_resume_rule(self):
gr = self.gr; gr.resume_rules = dict()
......@@ -692,7 +692,7 @@ class TestReentryAfterError:
assert cst.content == content
assert cst.pick('alpha').content.startswith('ALPHA')
# because of resuming, there should be only on error message
assert len(cst.errors()) == 1
assert len(cst.errors_sorted) == 1
def test_several_reentry_points_second_point_matching(self):
gr = self.gr; gr.resume_rules = dict()
......@@ -704,7 +704,7 @@ class TestReentryAfterError:
assert cst.content == content
assert cst.pick('alpha').content.startswith('ALPHA')
# because of resuming, there should be only on error message
assert len(cst.errors()) == 1
assert len(cst.errors_sorted) == 1
def test_several_resume_rules_innermost_rule_matching(self):
gr = self.gr; gr.resume_rules = dict()
......@@ -718,7 +718,7 @@ class TestReentryAfterError:
assert cst.content == content
assert cst.pick('alpha').content.startswith('ALPHA')
# because of resuming, there should be only on error message
assert len(cst.errors()) == 1
assert len(cst.errors_sorted) == 1
# multiple failures
content = 'ALPHA acb BETA bad GAMMA cab .'
cst = gr(content)
......@@ -727,7 +727,7 @@ class TestReentryAfterError:
assert cst.content == content
assert cst.pick('alpha').content.startswith('ALPHA')
# because of resuming, there should be only on error message
assert len(cst.errors()) == 2
assert len(cst.errors_sorted) == 2
class TestConfiguredErrorMessages:
......@@ -740,8 +740,8 @@ class TestConfiguredErrorMessages:
"""
parser = grammar_provider(lang)()
st = parser("AB_D"); assert st.error_flag
assert st.errors()[0].code == Error.MALFORMED_ERROR_STRING
assert st.errors()[1].code == Error.MANDATORY_CONTINUATION
assert st.errors_sorted[0].code == Error.MALFORMED_ERROR_STRING
assert st.errors_sorted[1].code == Error.MANDATORY_CONTINUATION
# print(st.errors())
......
......@@ -91,7 +91,7 @@ class TestNode:
assert tree_copy.as_sxpr() == parse_sxpr('(a (b c) (d (e f) (h i)))').as_sxpr()
tree.add_error(tree, Error('Test Error', 0))
assert not tree_copy.all_errors
assert not tree_copy.errors
assert tree.as_sxpr() != parse_sxpr('(a (b c) (d (e f) (h i)))').as_sxpr()
assert tree_copy.as_sxpr() == parse_sxpr('(a (b c) (d (e f) (h i)))').as_sxpr()
......@@ -198,7 +198,7 @@ class TestRootNode:
root.new_error(tree.children[0], "error B")
root.swallow(tree)
assert root.error_flag
errors = root.errors()
errors = root.errors_sorted
assert root.error_flag
# assert errors == root.errors(True)
# assert not root.error_flag and not root.errors()
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment