Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2
Revision | 969863cb6c9532083ee4fa68253d425ea5a08cc3 (tree) |
---|---|
Zeit | 2022-02-26 01:04:14 |
Autor | Albert Mietus < albert AT mietus DOT nl > |
Commiter | Albert Mietus < albert AT mietus DOT nl > |
Refactored (AST2XML) tests: split into multiple files
@@ -1,8 +1,13 @@ | ||
1 | -import logging; logger = logging.getLogger(__name__) | |
1 | +import pytest | |
2 | + | |
3 | +#import logging; logger = logging.getLogger(__name__) | |
2 | 4 | from xml.etree import ElementTree as ET |
3 | 5 | |
4 | -from castle.ast import peg | |
6 | +from castle.ast import peg, serialization | |
5 | 7 | |
8 | +@pytest.fixture | |
9 | +def xml_serialize(): | |
10 | + return serialization.Serialize('xml').serialize | |
6 | 11 | |
7 | 12 | class StdSequence_withAsserts: |
8 | 13 | """A class with some terminals and a sequence, and assert-statements |
@@ -1,33 +1,24 @@ | ||
1 | 1 | import pytest |
2 | -from xml.etree import ElementTree as ET | |
3 | 2 | import logging; logger = logging.getLogger(__name__) |
4 | 3 | |
5 | -from castle.ast import peg, serialization | |
6 | - | |
7 | -from . import StdSequence_withAsserts, assert_xml_Element | |
4 | +from castle.ast import peg | |
8 | 5 | |
9 | - | |
10 | -@pytest.fixture | |
11 | -def xml_serialize(): | |
12 | - return serialization.Serialize('xml').serialize | |
13 | - | |
6 | +from . import xml_serialize #@pytest.fixture | |
7 | +from . import assert_xml_Element, StdSequence_withAsserts | |
14 | 8 | |
15 | 9 | |
16 | 10 | def test_ID(xml_serialize): |
17 | 11 | txt = xml_serialize(peg.ID(name='demo_ID')) |
18 | 12 | assert_xml_Element(txt, tag='ID', name='demo_ID') |
19 | 13 | |
20 | - | |
21 | 14 | def test_StrTerm(xml_serialize): |
22 | 15 | txt = xml_serialize(peg.StrTerm(value='demo string')) |
23 | 16 | assert_xml_Element(txt, tag='StrTerm', value='demo string') |
24 | 17 | |
25 | - | |
26 | 18 | def test_RegExpTerm(xml_serialize): |
27 | 19 | txt = xml_serialize(peg.RegExpTerm(value='demo RegExp')) |
28 | 20 | assert_xml_Element(txt, tag='RegExpTerm', value='demo RegExp') |
29 | 21 | |
30 | - | |
31 | 22 | def test_Sequence_1(xml_serialize): |
32 | 23 | e1 = peg.ID(name='ID_1') |
33 | 24 | txt = xml_serialize(peg.Sequence(children=[e1])) |
@@ -36,15 +27,6 @@ | ||
36 | 27 | assert_xml_Element(txt, tag='.//ID', name='ID_1') |
37 | 28 | |
38 | 29 | |
39 | -def test_Sequence_3(xml_serialize): | |
40 | - seq = StdSequence_withAsserts() | |
41 | - txt = xml_serialize(seq.seq) | |
42 | - logger.debug(f'XML:: {txt}') | |
43 | - | |
44 | - assert_xml_Element(txt, tag='Sequence') | |
45 | - seq.assert_xml_Element(txt) | |
46 | - | |
47 | - | |
48 | 30 | def test_Rule_1ID(xml_serialize): |
49 | 31 | rule_name = "RuleName" |
50 | 32 | xref = "cross_ref" |
@@ -57,70 +39,6 @@ | ||
57 | 39 | assert_xml_Element(txt, tag='.//ID', name=xref) |
58 | 40 | |
59 | 41 | |
60 | -def test_Rule_Sequence(xml_serialize): | |
61 | - rule_name = "Rule_Sequence" | |
62 | - seq = StdSequence_withAsserts() | |
63 | - | |
64 | - txt = xml_serialize(peg.Rule(name=peg.ID(name=rule_name), expr=seq.seq)) | |
65 | - logger.debug(f'XML:: {txt}') | |
66 | - | |
67 | - assert_xml_Element(txt, tag='Rule', name=rule_name) | |
68 | - seq.assert_xml_Element(txt) | |
69 | - | |
70 | - | |
71 | -def test_ParseRules(xml_serialize): | |
72 | - r1 = peg.Rule(name=peg.ID(name='rule_1'), expr=peg.Sequence(children=[peg.ID(name='id1')])) | |
73 | - r2 = peg.Rule(name=peg.ID(name='rule_2'), expr=peg.Sequence(children=[peg.StrTerm(value='str2')])) | |
74 | - | |
75 | - txt = xml_serialize(peg.Rules(children=[r1,r2])) # Use generic 'Rules' not ParseRules/Settings | |
76 | - logger.debug(f'XML:: {txt}') | |
77 | - | |
78 | - tree = ET.fromstring(txt) | |
79 | - assert len(tree.findall('.//Rule')) == 2 | |
80 | - assert len(tree.findall('.//ID')) == 1 | |
81 | - assert len(tree.findall('.//StrTerm')) == 1 | |
82 | - | |
83 | - assert tree.findall('.//Rule[1]')[0].attrib['name'] == 'rule_1' | |
84 | - assert tree.findall('.//Rule[2]//StrTerm')[0].attrib['value'] == 'str2' | |
85 | - | |
86 | - | |
87 | - | |
88 | -def verify_QuantityGroup(xml_serialize, pegGrp, tagName): | |
89 | - seq = StdSequence_withAsserts() | |
90 | - txt = xml_serialize(pegGrp(expr=seq.seq)) | |
91 | - logger.debug(f'XML:: {txt}') | |
92 | - | |
93 | - assert_xml_Element(txt, tagName) | |
94 | - seq.assert_xml_Element(txt) | |
95 | - | |
96 | -def test_OptionalSeq(xml_serialize): verify_QuantityGroup(xml_serialize, peg.Optional, 'Optional') ## ` ( ...)? ` | |
97 | -def test_ZeroOrMoreSeq(xml_serialize): verify_QuantityGroup(xml_serialize, peg.ZeroOrMore, 'ZeroOrMore') ## ` ( ...)* ` | |
98 | -def test_OneOrMoreSeq(xml_serialize): verify_QuantityGroup(xml_serialize, peg.OneOrMore, 'OneOrMore') ## ` ( ...)+ ` | |
99 | -def test_UnorderedGroup(xml_serialize): verify_QuantityGroup(xml_serialize, peg.UnorderedGroup, 'UnorderedGroup') ## ` ( ...)# ` # Only useful for a group/sequence!! | |
100 | - | |
101 | - | |
102 | -def verify_QuantityID(xml_serialize, pegGrp, tagName, id_name='JustAName'): | |
103 | - txt = xml_serialize(pegGrp(expr=peg.ID(name=id_name))) | |
104 | - logger.debug(f'XML:: {txt}') | |
105 | - | |
106 | - assert_xml_Element(txt, tagName) | |
107 | - assert_xml_Element(txt, tag='.//ID', name=id_name) | |
108 | - | |
109 | -def test_OptionalID(xml_serialize): verify_QuantityID(xml_serialize, peg.Optional, 'Optional') | |
110 | -def test_ZeroOrMoreID(xml_serialize): verify_QuantityID(xml_serialize, peg.ZeroOrMore, 'ZeroOrMore') | |
111 | -def test_OneOrMoreID(xml_serialize): verify_QuantityID(xml_serialize, peg.OneOrMore, 'OneOrMore') | |
112 | -def test_UnorderedID(xml_serialize): verify_QuantityID(xml_serialize, peg.UnorderedGroup, 'UnorderedGroup', 'strange') ## A bit uncommon: an unordered group of ONE! But it should work. | |
113 | - | |
114 | - | |
115 | - | |
116 | -def test_OC3(xml_serialize): # e1 | e2 | e2 | |
117 | - e1, e2, e3 = peg.ID(name='ID_1'), peg.StrTerm(value='str_2'), peg.RegExpTerm(value='regexp_3') | |
118 | - txt = xml_serialize(peg.OrderedChoice(children=[e1,e2,e3])) | |
119 | - logger.debug(f'XML:: {txt}') | |
120 | - | |
121 | - assert_xml_Element(txt, tag='OrderedChoice', child_count=3) | |
122 | - | |
123 | - | |
124 | 42 | def test_OC_long(xml_serialize): # e1 | e2a e2b e2c |
125 | 43 | e1, seq = peg.ID(name='single_ID'), StdSequence_withAsserts() |
126 | 44 | txt = xml_serialize(peg.OrderedChoice(children=[e1, seq.seq])) |
@@ -128,74 +46,20 @@ | ||
128 | 46 | |
129 | 47 | assert_xml_Element(txt, tag='OrderedChoice', child_count=2) |
130 | 48 | |
49 | + | |
50 | +def test_OC3(xml_serialize): # e1 | e2 | e2 | |
51 | + e1, e2, e3 = peg.ID(name='ID_1'), peg.StrTerm(value='str_2'), peg.RegExpTerm(value='regexp_3') | |
52 | + txt = xml_serialize(peg.OrderedChoice(children=[e1,e2,e3])) | |
53 | + logger.debug(f'XML:: {txt}') | |
54 | + assert_xml_Element(txt, tag='OrderedChoice', child_count=3) | |
55 | + | |
56 | + | |
131 | 57 | def verify_Predicate(xml_serialize, pegPredicate, tagName): |
132 | 58 | txt = xml_serialize(pegPredicate(expr=peg.ID(name="PartOfSomePredicate"))) |
133 | 59 | logger.debug(f'XML:: {txt}') |
134 | - | |
135 | 60 | assert_xml_Element(txt, tag=tagName, child_count=1) |
136 | 61 | |
137 | 62 | def test_AndPredicate(xml_serialize): verify_Predicate(xml_serialize, peg.AndPredicate, 'AndPredicate') |
138 | 63 | def test_NotPredicate(xml_serialize): verify_Predicate(xml_serialize, peg.NotPredicate, 'NotPredicate') |
139 | 64 | |
140 | 65 | |
141 | -def verify_setting_NumVal(xml_serialize, number): | |
142 | - txt = xml_serialize(peg.Number(value=number)) | |
143 | - logger.debug(f'XML:: {txt}') | |
144 | - assert_xml_Element(txt, tag='Number', text=number) | |
145 | - | |
146 | -def test_setting_NumVal_int(xml_serialize): verify_setting_NumVal(xml_serialize, '42') | |
147 | -def test_setting_NumVal_float(xml_serialize): verify_setting_NumVal(xml_serialize, '3.14') | |
148 | -def test_setting_NumVal_complex1(xml_serialize): verify_setting_NumVal(xml_serialize, '-1+j1') | |
149 | -def test_setting_NumVal_complex2(xml_serialize): verify_setting_NumVal(xml_serialize, '+1-i1') | |
150 | - | |
151 | - | |
152 | -def verify_Number_setting(xml_serialize, name, value, pegVal=peg.Number): | |
153 | - txt = xml_serialize(peg.Setting(name=peg.ID(name=name), value=pegVal(value=value))) | |
154 | - logger.debug(f'XML:: {txt}') | |
155 | - | |
156 | - assert_xml_Element(txt, tag='.//Setting/ID', name=name) | |
157 | - assert_xml_Element(txt, tag='.//Setting/Number', text=value) | |
158 | - | |
159 | -def test_setting_int(xml_serialize): verify_Number_setting(xml_serialize, name='anInt', value='42') | |
160 | -def test_setting_float(xml_serialize): verify_Number_setting(xml_serialize, name='anInt', value='3.14') | |
161 | -def test_setting_complex(xml_serialize): verify_Number_setting(xml_serialize, name='anInt', value='1+j1') | |
162 | - | |
163 | - | |
164 | -def verify_txt_setting(xml_serialize, name, pegTxt, value, tag): | |
165 | - txt = xml_serialize(peg.Setting(name=peg.ID(name=name), value=pegTxt(value=value))) | |
166 | - logger.debug(f'XML:: {txt}') | |
167 | - | |
168 | - assert_xml_Element(txt, tag='.//Setting/ID', name=name) | |
169 | - assert_xml_Element(txt, tag=f'.//Setting/{tag}', value=value) | |
170 | - | |
171 | -def test_setting_StrTerm(xml_serialize): verify_txt_setting(xml_serialize, name='string', pegTxt=peg.StrTerm, value='StrVal', tag='StrTerm') | |
172 | -def test_setting_RegExTerm(xml_serialize): verify_txt_setting(xml_serialize, name='regexp', pegTxt=peg.RegExpTerm, value='/RegExp/', tag='RegExpTerm') | |
173 | - | |
174 | - | |
175 | -def test_setting_XID(xml_serialize): | |
176 | - name, xref = 'SetTo', 'anOtherID' | |
177 | - txt = xml_serialize(peg.Setting(name=peg.ID(name=name), value=peg.ID(name=xref))) | |
178 | - logger.debug(f'XML:: {txt}') | |
179 | - | |
180 | - assert_xml_Element(txt, tag='.//Setting/ID[1]', name=name) | |
181 | - assert_xml_Element(txt, tag='.//Setting/ID[2]', name=xref) | |
182 | - | |
183 | -def test_Settings(xml_serialize): | |
184 | - name_1, val_1 = 's1', '42' | |
185 | - name_2, val_2 = 's2', '2.71828' | |
186 | - s1 = peg.Setting(name=peg.ID(name=name_1), value=peg.Number(value=val_1)) | |
187 | - s2 = peg.Setting(name=peg.ID(name=name_2), value=peg.Number(value=val_2)) | |
188 | - | |
189 | - txt = xml_serialize(peg.Rules(children=[s1,s2])) # Use generic 'Rules' not ParseRules/Settings | |
190 | - logger.debug(f'XML:: {txt}') | |
191 | - | |
192 | - assert_xml_Element(txt, tag=f".//Setting/ID[@name='{name_1}']/../Number", text=val_1) | |
193 | - assert_xml_Element(txt, tag=f".//Setting/ID[@name='{name_2}']/../Number", text=val_2) | |
194 | - | |
195 | - tree = ET.fromstring(txt) | |
196 | - assert len(tree.findall('.//Setting')) == 2 | |
197 | - assert len(tree.findall('.//ID')) == 2 | |
198 | - | |
199 | - | |
200 | - | |
201 | - |
@@ -0,0 +1,30 @@ | ||
1 | +import pytest | |
2 | +import logging; logger = logging.getLogger(__name__) | |
3 | + | |
4 | +from castle.ast import peg | |
5 | + | |
6 | +from . import xml_serialize #@pytest.fixture | |
7 | +from . import assert_xml_Element, StdSequence_withAsserts | |
8 | + | |
9 | + | |
10 | +def test_Sequence_3(xml_serialize): | |
11 | + seq = StdSequence_withAsserts() | |
12 | + txt = xml_serialize(seq.seq) | |
13 | + logger.debug(f'XML:: {txt}') | |
14 | + | |
15 | + assert_xml_Element(txt, tag='Sequence') | |
16 | + seq.assert_xml_Element(txt) | |
17 | + | |
18 | + | |
19 | +def test_Rule_Sequence(xml_serialize): | |
20 | + rule_name = "Rule_Sequence" | |
21 | + seq = StdSequence_withAsserts() | |
22 | + | |
23 | + txt = xml_serialize(peg.Rule(name=peg.ID(name=rule_name), expr=seq.seq)) | |
24 | + logger.debug(f'XML:: {txt}') | |
25 | + | |
26 | + assert_xml_Element(txt, tag='Rule', name=rule_name) | |
27 | + seq.assert_xml_Element(txt) | |
28 | + | |
29 | + | |
30 | + |
@@ -0,0 +1,42 @@ | ||
1 | +import pytest | |
2 | +import logging; logger = logging.getLogger(__name__) | |
3 | + | |
4 | +from xml.etree import ElementTree as ET | |
5 | +from castle.ast import peg | |
6 | + | |
7 | +from . import xml_serialize #@pytest.fixture | |
8 | +from . import assert_xml_Element | |
9 | + | |
10 | + | |
11 | +def test_ParseRules(xml_serialize): | |
12 | + r1 = peg.Rule(name=peg.ID(name='rule_1'), expr=peg.Sequence(children=[peg.ID(name='id1')])) | |
13 | + r2 = peg.Rule(name=peg.ID(name='rule_2'), expr=peg.Sequence(children=[peg.StrTerm(value='str2')])) | |
14 | + | |
15 | + txt = xml_serialize(peg.Rules(children=[r1,r2])) # Use generic 'Rules' not ParseRules/Settings | |
16 | + logger.debug(f'XML:: {txt}') | |
17 | + | |
18 | + tree = ET.fromstring(txt) | |
19 | + assert len(tree.findall('.//Rule')) == 2 | |
20 | + assert len(tree.findall('.//ID')) == 1 | |
21 | + assert len(tree.findall('.//StrTerm')) == 1 | |
22 | + | |
23 | + assert tree.findall('.//Rule[1]')[0].attrib['name'] == 'rule_1' | |
24 | + assert tree.findall('.//Rule[2]//StrTerm')[0].attrib['value'] == 'str2' | |
25 | + | |
26 | + | |
27 | + | |
28 | +def test_Settings(xml_serialize): | |
29 | + name_1, val_1 = 's1', '42' | |
30 | + name_2, val_2 = 's2', '2.71828' | |
31 | + s1 = peg.Setting(name=peg.ID(name=name_1), value=peg.Number(value=val_1)) | |
32 | + s2 = peg.Setting(name=peg.ID(name=name_2), value=peg.Number(value=val_2)) | |
33 | + | |
34 | + txt = xml_serialize(peg.Rules(children=[s1,s2])) # Use generic 'Rules' not ParseRules/Settings | |
35 | + logger.debug(f'XML:: {txt}') | |
36 | + | |
37 | + assert_xml_Element(txt, tag=f".//Setting/ID[@name='{name_1}']/../Number", text=val_1) | |
38 | + assert_xml_Element(txt, tag=f".//Setting/ID[@name='{name_2}']/../Number", text=val_2) | |
39 | + | |
40 | + tree = ET.fromstring(txt) | |
41 | + assert len(tree.findall('.//Setting')) == 2 | |
42 | + assert len(tree.findall('.//ID')) == 2 |
@@ -0,0 +1,35 @@ | ||
1 | +import pytest | |
2 | +import logging; logger = logging.getLogger(__name__) | |
3 | + | |
4 | +from castle.ast import peg | |
5 | + | |
6 | +from . import xml_serialize #@pytest.fixture | |
7 | +from . import assert_xml_Element, StdSequence_withAsserts | |
8 | + | |
9 | + | |
10 | +def verify_QuantityID(xml_serialize, pegGrp, tagName, id_name='JustAName'): | |
11 | + txt = xml_serialize(pegGrp(expr=peg.ID(name=id_name))) | |
12 | + logger.debug(f'XML:: {txt}') | |
13 | + assert_xml_Element(txt, tagName) | |
14 | + assert_xml_Element(txt, tag='.//ID', name=id_name) | |
15 | + | |
16 | +def test_OptionalID(xml_serialize): verify_QuantityID(xml_serialize, peg.Optional, 'Optional') | |
17 | +def test_ZeroOrMoreID(xml_serialize): verify_QuantityID(xml_serialize, peg.ZeroOrMore, 'ZeroOrMore') | |
18 | +def test_OneOrMoreID(xml_serialize): verify_QuantityID(xml_serialize, peg.OneOrMore, 'OneOrMore') | |
19 | +def test_UnorderedID(xml_serialize): verify_QuantityID(xml_serialize, peg.UnorderedGroup, 'UnorderedGroup', 'strange') ## A bit uncommon: an unordered group of ONE! But it should work. | |
20 | + | |
21 | + | |
22 | +def verify_QuantityGroup(xml_serialize, pegGrp, tagName): | |
23 | + seq = StdSequence_withAsserts() | |
24 | + txt = xml_serialize(pegGrp(expr=seq.seq)) | |
25 | + logger.debug(f'XML:: {txt}') | |
26 | + | |
27 | + assert_xml_Element(txt, tagName) | |
28 | + seq.assert_xml_Element(txt) | |
29 | + | |
30 | +def test_OptionalSeq(xml_serialize): verify_QuantityGroup(xml_serialize, peg.Optional, 'Optional') ## ` ( ...)? ` | |
31 | +def test_ZeroOrMoreSeq(xml_serialize): verify_QuantityGroup(xml_serialize, peg.ZeroOrMore, 'ZeroOrMore') ## ` ( ...)* ` | |
32 | +def test_OneOrMoreSeq(xml_serialize): verify_QuantityGroup(xml_serialize, peg.OneOrMore, 'OneOrMore') ## ` ( ...)+ ` | |
33 | +def test_UnorderedGroup(xml_serialize): verify_QuantityGroup(xml_serialize, peg.UnorderedGroup, 'UnorderedGroup') ## ` ( ...)# ` # Only useful for a group/sequence!! | |
34 | + | |
35 | + |
@@ -0,0 +1,49 @@ | ||
1 | +import pytest | |
2 | +import logging; logger = logging.getLogger(__name__) | |
3 | + | |
4 | +from castle.ast import peg | |
5 | + | |
6 | +from . import xml_serialize #@pytest.fixture | |
7 | +from . import assert_xml_Element, StdSequence_withAsserts | |
8 | + | |
9 | +def verify_setting_NumVal(xml_serialize, number): | |
10 | + txt = xml_serialize(peg.Number(value=number)) | |
11 | + logger.debug(f'XML:: {txt}') | |
12 | + assert_xml_Element(txt, tag='Number', text=number) | |
13 | + | |
14 | +def test_setting_NumVal_int(xml_serialize): verify_setting_NumVal(xml_serialize, '42') | |
15 | +def test_setting_NumVal_float(xml_serialize): verify_setting_NumVal(xml_serialize, '3.14') | |
16 | +def test_setting_NumVal_complex1(xml_serialize): verify_setting_NumVal(xml_serialize, '-1+j1') | |
17 | +def test_setting_NumVal_complex2(xml_serialize): verify_setting_NumVal(xml_serialize, '+1-i1') | |
18 | + | |
19 | + | |
20 | +def verify_Number_setting(xml_serialize, name, value, pegVal=peg.Number): | |
21 | + txt = xml_serialize(peg.Setting(name=peg.ID(name=name), value=pegVal(value=value))) | |
22 | + logger.debug(f'XML:: {txt}') | |
23 | + | |
24 | + assert_xml_Element(txt, tag='.//Setting/ID', name=name) | |
25 | + assert_xml_Element(txt, tag='.//Setting/Number', text=value) | |
26 | + | |
27 | +def test_setting_int(xml_serialize): verify_Number_setting(xml_serialize, name='anInt', value='42') | |
28 | +def test_setting_float(xml_serialize): verify_Number_setting(xml_serialize, name='anInt', value='3.14') | |
29 | +def test_setting_complex(xml_serialize): verify_Number_setting(xml_serialize, name='anInt', value='1+j1') | |
30 | + | |
31 | + | |
32 | +def verify_txt_setting(xml_serialize, name, pegTxt, value, tag): | |
33 | + txt = xml_serialize(peg.Setting(name=peg.ID(name=name), value=pegTxt(value=value))) | |
34 | + logger.debug(f'XML:: {txt}') | |
35 | + | |
36 | + assert_xml_Element(txt, tag='.//Setting/ID', name=name) | |
37 | + assert_xml_Element(txt, tag=f'.//Setting/{tag}', value=value) | |
38 | + | |
39 | +def test_setting_StrTerm(xml_serialize): verify_txt_setting(xml_serialize, name='string', pegTxt=peg.StrTerm, value='StrVal', tag='StrTerm') | |
40 | +def test_setting_RegExTerm(xml_serialize): verify_txt_setting(xml_serialize, name='regexp', pegTxt=peg.RegExpTerm, value='/RegExp/', tag='RegExpTerm') | |
41 | + | |
42 | + | |
43 | +def test_setting_XID(xml_serialize): | |
44 | + name, xref = 'SetTo', 'anOtherID' | |
45 | + txt = xml_serialize(peg.Setting(name=peg.ID(name=name), value=peg.ID(name=xref))) | |
46 | + logger.debug(f'XML:: {txt}') | |
47 | + | |
48 | + assert_xml_Element(txt, tag='.//Setting/ID[1]', name=name) | |
49 | + assert_xml_Element(txt, tag='.//Setting/ID[2]', name=xref) |