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