Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2
Revisão | a27eaba4f3343db2216d02709b6e143ff2cc1f3a (tree) |
---|---|
Hora | 2022-02-12 04:19:22 |
Autor | Albert Mietus < albert AT mietus DOT nl > |
Commiter | Albert Mietus < albert AT mietus DOT nl > |
Refactored Test: XML-serialization
@@ -0,0 +1,57 @@ | ||
1 | +import logging; logger = logging.getLogger(__name__) | |
2 | +from xml.etree import ElementTree as ET | |
3 | + | |
4 | +from castle.ast import peg | |
5 | + | |
6 | + | |
7 | +class StdSequence_withAsserts: | |
8 | + """A class with some terminals and a sequence, and assert-statements | |
9 | + """ | |
10 | + def __init__(self): | |
11 | + self.n1, self.v2, self.v3 = 'ID_1', 'str_2', 'regexp_3' | |
12 | + e1 = peg.ID(name=self.n1) | |
13 | + e2 = peg.StrTerm(value=self.v2) | |
14 | + e3 = peg.RegExpTerm(value=self.v3) | |
15 | + self.seq = peg.Sequence(value=[e1, e2, e3]) | |
16 | + def assert_xml_Element(self, txt): | |
17 | + assert_xml_Element(txt, tag='.//Sequence') | |
18 | + assert_xml_Element(txt, tag='.//ID', name=self.n1) | |
19 | + assert_xml_Element(txt, tag='.//StrTerm',value=self.v2) | |
20 | + assert_xml_Element(txt, tag='.//RegExpTerm', value=self.v3) | |
21 | + | |
22 | + | |
23 | +def assert_xml_Element(txt, tag, | |
24 | + version="0.0", | |
25 | + **attribs,): | |
26 | + """Partially verify an xml-string; focusing on 'tag' -- a real tag, or a (limited) XPATH-expression. | |
27 | + | |
28 | + This `tag` (expression) should result in a single hit!. *Use e.g `[0]` as suffix to select one from a list*. | |
29 | + Pass ``key=value`` **attribs** to verify the found tag has those attribs and values | |
30 | + """ | |
31 | + | |
32 | + tree = ET.fromstring(txt) | |
33 | + if version: | |
34 | + assert tree.attrib['version'] == version | |
35 | + founds = tree.findall(tag) | |
36 | + assert len(founds) == 1, f"Expected only one element; got: {len(founds)} :{founds}" | |
37 | + found = founds[0] | |
38 | + logger.debug(f'XXX1 tag={tag}:: found={found}') | |
39 | + for attrib, value in attribs.items(): | |
40 | + logger.debug(f'XXX2 tag={tag}:: attrib={attrib}, value={value}') | |
41 | + assert found.attrib[attrib] == value | |
42 | + | |
43 | + | |
44 | +def assert_QuantityGroup(xml_serialize, pegGrp, tagName): | |
45 | + seq = StdSequence_withAsserts() | |
46 | + txt = xml_serialize(pegGrp(expr=seq.seq)) | |
47 | + logger.debug(f'XML:: {txt}') | |
48 | + | |
49 | + assert_xml_Element(txt, tagName) | |
50 | + seq.assert_xml_Element(txt) | |
51 | + | |
52 | +def assert_QuantityID(xml_serialize, pegGrp, tagName, id_name='JustAName'): | |
53 | + txt = xml_serialize(pegGrp(expr=peg.ID(name=id_name))) | |
54 | + logger.debug(f'XML:: {txt}') | |
55 | + | |
56 | + assert_xml_Element(txt, tagName) | |
57 | + assert_xml_Element(txt, tag='.//ID', name=id_name) |
@@ -4,41 +4,7 @@ | ||
4 | 4 | |
5 | 5 | from castle.ast import peg, serialization |
6 | 6 | |
7 | - | |
8 | -class StdSequence_withAsserts: | |
9 | - def __init__(self): | |
10 | - self.n1, self.v2, self.v3 = 'ID_1', 'str_2', 'regexp_3' | |
11 | - e1 = peg.ID(name=self.n1) | |
12 | - e2 = peg.StrTerm(value=self.v2) | |
13 | - e3 = peg.RegExpTerm(value=self.v3) | |
14 | - self.seq = peg.Sequence(value=[e1, e2, e3]) | |
15 | - def assert_xml_Element(self, txt): | |
16 | - assert_xml_Element(txt, tag='.//Sequence') | |
17 | - assert_xml_Element(txt, tag='.//ID', name=self.n1) | |
18 | - assert_xml_Element(txt, tag='.//StrTerm',value=self.v2) | |
19 | - assert_xml_Element(txt, tag='.//RegExpTerm', value=self.v3) | |
20 | - | |
21 | - | |
22 | -def assert_xml_Element(txt, tag, | |
23 | - version="0.0", | |
24 | - **attribs,): | |
25 | - """Partially verify an xml-string; focusing on 'tag' -- a real tag, or a (limited) XPATH-expression. | |
26 | - | |
27 | - This `tag` (expression) should result in a single hit!. *Use e.g `[0]` as suffix to select one from a list*. | |
28 | - Pass ``key=value`` **attribs** to verify the found tag has those attribs and values | |
29 | - """ | |
30 | - | |
31 | - tree = ET.fromstring(txt) | |
32 | - if version: | |
33 | - assert tree.attrib['version'] == version | |
34 | - founds = tree.findall(tag) | |
35 | - assert len(founds) == 1, f"Expected only one element; got: {len(founds)} :{founds}" | |
36 | - found = founds[0] | |
37 | - logger.debug(f'XXX1 tag={tag}:: found={found}') | |
38 | - for attrib, value in attribs.items(): | |
39 | - logger.debug(f'XXX2 tag={tag}:: attrib={attrib}, value={value}') | |
40 | - assert found.attrib[attrib] == value | |
41 | - | |
7 | +from . import StdSequence_withAsserts, assert_xml_Element, assert_QuantityGroup, assert_QuantityID | |
42 | 8 | |
43 | 9 | |
44 | 10 | @pytest.fixture |
@@ -117,14 +83,6 @@ | ||
117 | 83 | assert tree.findall('.//Rule[1]')[0].attrib['name'] == 'rule_1' |
118 | 84 | assert tree.findall('.//Rule[2]//StrTerm')[0].attrib['value'] == 'str2' |
119 | 85 | |
120 | -def assert_QuantityGroup(xml_serialize, pegGrp, tagName): | |
121 | - seq = StdSequence_withAsserts() | |
122 | - txt = xml_serialize(pegGrp(expr=seq.seq)) | |
123 | - logger.debug(f'XML:: {txt}') | |
124 | - | |
125 | - assert_xml_Element(txt, tagName) | |
126 | - seq.assert_xml_Element(txt) | |
127 | - | |
128 | 86 | |
129 | 87 | def test_OptionalSeq(xml_serialize): assert_QuantityGroup(xml_serialize, peg.Optional, 'Optional') ## ` ( ...)? ` |
130 | 88 | def test_ZeroOrMoreSeq(xml_serialize): assert_QuantityGroup(xml_serialize, peg.ZeroOrMore, 'ZeroOrMore') ## ` ( ...)* ` |
@@ -132,23 +90,18 @@ | ||
132 | 90 | def test_UnorderedGroup(xml_serialize): assert_QuantityGroup(xml_serialize, peg.UnorderedGroup, 'UnorderedGroup') ## ` ( ...)# ` # Only useful for a group/sequence!! |
133 | 91 | |
134 | 92 | |
135 | -def assert_QuantityID(xml_serialize, pegGrp, tagName, id_name='JustAName'): | |
136 | - txt = xml_serialize(pegGrp(expr=peg.ID(name=id_name))) | |
137 | - logger.debug(f'XML:: {txt}') | |
138 | - | |
139 | - assert_xml_Element(txt, tagName) | |
140 | - assert_xml_Element(txt, tag='.//ID', name=id_name) | |
141 | - | |
142 | 93 | def test_OptionalID(xml_serialize): assert_QuantityID(xml_serialize, peg.Optional, 'Optional') |
143 | 94 | def test_ZeroOrMoreID(xml_serialize): assert_QuantityID(xml_serialize, peg.ZeroOrMore, 'ZeroOrMore') |
144 | 95 | def test_OneOrMoreID(xml_serialize): assert_QuantityID(xml_serialize, peg.OneOrMore, 'OneOrMore') |
145 | 96 | ## A bit uncommon: unordered group of ONE :`` Always#`` but it should work |
146 | 97 | def test_UnorderedID(xml_serialize): assert_QuantityID(xml_serialize, peg.UnorderedGroup, 'UnorderedGroup', 'strange') |
147 | 98 | |
99 | + | |
148 | 100 | @pytest.mark.xfail(reason="Can't test as peg.OrderedChoice() isn't implemented") |
149 | 101 | def test_OrderedChoice(xml_serialize): # e1 | e2 | e2 |
150 | 102 | e1 = peg.ID(name='ID_1') |
151 | 103 | e2 = peg.StrTerm(value='str_2') |
152 | 104 | e3 = peg.RegExpTerm(value='regexp_3') |
153 | 105 | txt = xml_serialize(peg.OrderedChoice()) # not implemented; never peg.OrderedChoice is never called |
106 | + | |
154 | 107 | assert False |