summaryrefslogtreecommitdiff
path: root/tests/test_unit.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_unit.py')
-rw-r--r--tests/test_unit.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/test_unit.py b/tests/test_unit.py
index 0d6db31..1ec0417 100644
--- a/tests/test_unit.py
+++ b/tests/test_unit.py
@@ -3275,6 +3275,67 @@ class Test2_WithoutPackrat(ppt.TestParseResultsAsserts, TestCase):
r, expected_list=[[5, 7], [0, 1, 2, 3, 4, 5], [], [5, 4, 3]]
)
+ def testCountedArrayTest4(self):
+ import pyparsing as pp
+
+ ppc = pp.pyparsing_common
+
+ # array counter contains several fields - first field *must* be the number of
+ # items in the array
+ # - number of elements
+ # - type of elements
+ # - source of elements
+ counter_with_metadata = (
+ ppc.integer("count") + ppc.identifier("type") + ppc.identifier("source")
+ )
+
+ countedField = pp.countedArray(
+ pp.Word(pp.alphanums), intExpr=counter_with_metadata
+ )
+
+ testString = (
+ "5 string input item1 item2 item3 item4 item5 0 int user 2 int file 3 8"
+ )
+ r = pp.Group(countedField("items"))[...].parseString(testString, parseAll=True)
+
+ print(testString)
+ print(r.dump())
+ print("type = {!r}".format(r.type))
+ print("source = {!r}".format(r.source))
+
+ self.assertParseResultsEquals(
+ r,
+ expected_list=[
+ ["item1", "item2", "item3", "item4", "item5"],
+ [],
+ ["3", "8"],
+ ],
+ )
+
+ self.assertParseResultsEquals(
+ r[0],
+ expected_dict={
+ "count": 5,
+ "source": "input",
+ "type": "string",
+ "items": ["item1", "item2", "item3", "item4", "item5"],
+ },
+ )
+
+ # parse with additional fields between the count and the actual list items
+ count_with_metadata = ppc.integer + pp.Word(pp.alphas)("type")
+ typed_array = pp.countedArray(
+ pp.Word(pp.alphanums), intExpr=count_with_metadata
+ )("items")
+ result = typed_array.parseString("3 bool True True False")
+ print(result.dump())
+
+ self.assertParseResultsEquals(
+ result,
+ expected_list=["True", "True", "False"],
+ expected_dict={"type": "bool", "items": ["True", "True", "False"]},
+ )
+
def testLineStart(self):
pass_tests = [