From 32bb95b6b2aca264e88099b09654fba64b11c192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= <hugo@lysator.liu.se> Date: Tue, 19 Sep 2023 15:45:44 +0200 Subject: [PATCH] Cleanup in parser tests. --- tests/test_parse_elsif.py | 179 ++++++++++++++------------------------ 1 file changed, 64 insertions(+), 115 deletions(-) diff --git a/tests/test_parse_elsif.py b/tests/test_parse_elsif.py index 88eb69e..8afa037 100644 --- a/tests/test_parse_elsif.py +++ b/tests/test_parse_elsif.py @@ -1,4 +1,31 @@ -"""Tests for Parser combinator re-parsers.""" +""" +Tests for Parser combinator re-parsers. + +Many of these have first a test_thingy, and then test_thingy_nested. + +This is due to to trailing data being ignored. For example + + +.. code-block:: puppet + + Exec <| title=='apt_update' |> { + refreshonly => false, + } + +Could be parsed as ``Exec <| title=='apt_update' |>`` with the +remaining string ``{ refreshonly => false, }``, while + +.. code-block:: puppet + + if $_update['frequency'] == 'always' { + Exec <| title=='apt_update' |> { + refreshonly => false, + } + } + +MUST parse the entire collect block, since there is otherwise a syntax +error with the if block. +""" import pytest from muppet.puppet.format.parser import ParserFormatter @@ -8,8 +35,17 @@ from muppet.parser_combinator import ParserCombinator from pprint import pprint +def parse_string(s: str): + ast = build_ast(puppet_parser(s)) + pprint(ast) + parser = ParserFormatter(s, "s").serialize(ast) + pprint(parser) + match_objects = ParserCombinator(s, "s").get(parser) + pprint(match_objects) + + def test_parse_else_if(): - s = """ + parse_string(""" if x { 1 } else { @@ -19,11 +55,7 @@ def test_parse_else_if(): 3 } } - """ - ast = build_ast(puppet_parser(s)) - parser = ParserFormatter(s, "s").serialize(ast) - match_objects = ParserCombinator(s, "s").get(parser) - print(match_objects) + """) # [`ws(['\n '])`, `keyword(['if'])`, `ws([' '])`, # `qn([`ws([])`, 'x'])`, `ws([' '])`, '{', `ws(['\n '])`, # `ws([])`, `ws([])`, '1', `ws(['\n '])`, '}', `ws([' '])`, @@ -36,7 +68,7 @@ def test_parse_else_if(): def test_parse_elsif(): - s = """ + parse_string(""" if x { 1 } elsif y { @@ -44,11 +76,7 @@ def test_parse_elsif(): } else { 3 } - """ - ast = build_ast(puppet_parser(s)) - parser = ParserFormatter(s, "s").serialize(ast) - match_objects = ParserCombinator(s, "s").get(parser) - print(match_objects) + """) # [`ws(['\n '])`, `keyword(['if'])`, `ws([' '])`, # `qn([`ws([])`, 'x'])`, `ws([' '])`, '{', `ws(['\n '])`, # `ws([])`, `ws([])`, '1', `ws(['\n '])`, '}', `ws([' '])`, @@ -60,173 +88,94 @@ def test_parse_elsif(): def test_chained(): - s = "x.filter().join()" - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - pprint(parser) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) + parse_string("x.filter().join()") def test_lambda(): - s = "x.filter |$x, $y| { $x + 1 }" - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - pprint(parser) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) + parse_string("x.filter |$x, $y| { $x + 1 }") def test_chained_and_lambda(): - s = "x.filter |$x, $y| { $x + 1 }.join()" - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - print("parser:\n" + str(parser)) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) + parse_string("x.filter |$x, $y| { $x + 1 }.join()") def test_invoke(): - s = """ + parse_string(""" assert_type( Enum['always','daily','weekly','reluctantly'], $update['frequency'], ) - """ - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - print("parser:\n" + str(parser)) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) + """) def test_invoke_inside_if(): # This previously failed due to invoke not handling trailing # commas. The above example (test_invoke) apparently worked, # because reasons. - s = """ + parse_string(""" if $update['frequency'] { assert_type( Enum['always','daily','weekly','reluctantly'], $update['frequency'], ) } - """ - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - print("parser:\n" + str(parser)) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) - + """) def test_funcall_with_block(): - s = """ + parse_string(""" assert_type(A::B, $name) |$_expected, $actual | { fail("msg") } - """ - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - print("parser:\n" + str(parser)) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) + """) def test_funcall_with_block_inner(): - s = """ + parse_string(""" if $facts['package_provider'] == 'pkg' and $version =~ Undef { assert_type(A::B, $name) |$_expected, $actual | { fail("msg") } } - """ - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - print("parser:\n" + str(parser)) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) + """) def test_string_interpolation_1(): # This one is parsed as 'qn' - s = """ + parse_string(""" "${x}" - """ - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - print("parser:\n" + str(parser)) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) + """) def test_string_interpolation_2(): # This one is parsed as 'var', but also looks like one - s = """ + parse_string(""" "${$x}" - """ - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - print("parser:\n" + str(parser)) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) + """) def test_string_interpolation_3(): # qn - s = """ + parse_string(""" "${x + 1}" - """ - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - print("parser:\n" + str(parser)) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) + """) def test_string_interpolation_4(): # var - s = """ + parse_string(""" "${x + 1}" - """ - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - print("parser:\n" + str(parser)) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) + """) def test_string_interpolation_access(): # var, but looks like qn - s = """ + parse_string(""" "${x['y']}" - """ - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - print("parser:\n" + str(parser)) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) + """) def test_string_interpolation_deep_access(): # var, but looks like qn - s = """ + parse_string(""" "${x['y']['z']}" - """ - ast = build_ast(puppet_parser(s)) - pprint(ast) - parser = ParserFormatter(s, "s").serialize(ast) - print("parser:\n" + str(parser)) - match_objects = ParserCombinator(s, "s").get(parser) - pprint(match_objects) + """) -- GitLab