🐐 Step in for loop

This commit is contained in:
2026-04-24 18:33:48 +02:00
parent dbaf01b6a3
commit f197c2c3d5
12 changed files with 167 additions and 14 deletions

View File

@@ -894,6 +894,8 @@ error_tests = [
('CVM RETE\nAVSCVLTA(LXXX)', CentvrionError), # AVSCVLTA: no routes registered
('AVSCVLTA(LXXX)', CentvrionError), # RETE required for AVSCVLTA
('CVM RETE\nPETITVR("/", FVNCTIO (r) VT {\nREDI("hi")\n})\nAVSCVLTA("text")', CentvrionError), # AVSCVLTA port must be integer
("DONICVM i VT I VSQVE X GRADV I - I FAC { DIC(i) }", CentvrionError), # GRADV zero step
('DONICVM i VT I VSQVE X GRADV "foo" FAC { DIC(i) }', CentvrionError), # GRADV non-integer step
]
class TestErrors(unittest.TestCase):
@@ -1705,6 +1707,90 @@ loop_edge_tests = [
ExpressionStatement(Invoca(ID("f"), [])),
]),
ValInt(4)), # returns b=IV when a=III
# DONICVM GRADV II, endpoint hit exactly: [I, III, V]
("DONICVM i VT I VSQVE V GRADV II FAC { DIC(i) }",
Program([], [PerStatement(
DataRangeArray(Numeral("I"), Numeral("V"), Numeral("II")),
ID("i"),
[ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
ValStr("V"), "I\nIII\nV\n"),
# DONICVM GRADV II, endpoint overshot: VI excluded, stops at V
("DONICVM i VT I VSQVE VI GRADV II FAC { DIC(i) }",
Program([], [PerStatement(
DataRangeArray(Numeral("I"), Numeral("VI"), Numeral("II")),
ID("i"),
[ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
ValStr("V"), "I\nIII\nV\n"),
# DONICVM GRADV I is equivalent to default step
("DONICVM i VT I VSQVE III GRADV I FAC { DIC(i) }",
Program([], [PerStatement(
DataRangeArray(Numeral("I"), Numeral("III"), Numeral("I")),
ID("i"),
[ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
ValStr("III"), "I\nII\nIII\n"),
# DONICVM descending by I
("CVM SVBNVLLA\nDONICVM i VT V VSQVE I GRADV - I FAC { DIC(i) }",
Program([ModuleCall("SVBNVLLA")], [PerStatement(
DataRangeArray(Numeral("V"), Numeral("I"), UnaryMinus(Numeral("I"))),
ID("i"),
[ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
ValStr("I"), "V\nIV\nIII\nII\nI\n"),
# DONICVM descending by II, endpoint overshot
("CVM SVBNVLLA\nDONICVM i VT X VSQVE I GRADV - II FAC { DIC(i) }",
Program([ModuleCall("SVBNVLLA")], [PerStatement(
DataRangeArray(Numeral("X"), Numeral("I"), UnaryMinus(Numeral("II"))),
ID("i"),
[ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
ValStr("II"), "X\nVIII\nVI\nIV\nII\n"),
# DONICVM with step bound to a variable
("DESIGNA s VT II\nDONICVM i VT I VSQVE V GRADV s FAC { DIC(i) }",
Program([], [
Designa(ID("s"), Numeral("II")),
PerStatement(
DataRangeArray(Numeral("I"), Numeral("V"), ID("s")),
ID("i"),
[ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
ValStr("V"), "I\nIII\nV\n"),
# DONICVM from == to with nonzero step: single iteration
("DONICVM i VT III VSQVE III GRADV II FAC { DIC(i) }",
Program([], [PerStatement(
DataRangeArray(Numeral("III"), Numeral("III"), Numeral("II")),
ID("i"),
[ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
ValStr("III"), "III\n"),
# DONICVM direction mismatch — negative step with ascending bounds: body never runs
("CVM SVBNVLLA\nDESIGNA x VT NVLLVS\nDONICVM i VT I VSQVE X GRADV - I FAC { DESIGNA x VT x + i }\nx",
Program([ModuleCall("SVBNVLLA")], [
Designa(ID("x"), Nullus()),
PerStatement(
DataRangeArray(Numeral("I"), Numeral("X"), UnaryMinus(Numeral("I"))),
ID("i"),
[Designa(ID("x"), BinOp(ID("x"), ID("i"), "SYMBOL_PLUS"))]),
ExpressionStatement(ID("x"))]),
ValNul(), ""),
# Range-array literal with GRADV used via PER
("PER i IN [I VSQVE V GRADV II] FAC { DIC(i) }",
Program([], [PerStatement(
DataRangeArray(Numeral("I"), Numeral("V"), Numeral("II")),
ID("i"),
[ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
ValStr("V"), "I\nIII\nV\n"),
# DONICVM GRADV II with CONTINVA: skip value V, print the others
("DONICVM i VT I VSQVE IX GRADV II FAC {\nSI i EST V TVNC { CONTINVA }\nDIC(i)\n}",
Program([], [PerStatement(
DataRangeArray(Numeral("I"), Numeral("IX"), Numeral("II")),
ID("i"),
[SiStatement(BinOp(ID("i"), Numeral("V"), "KEYWORD_EST"), [Continva()], None),
ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
ValStr("IX"), "I\nIII\nVII\nIX\n"),
# DONICVM GRADV II with ERVMPE: stop at V (last successful DIC was III)
("DONICVM i VT I VSQVE IX GRADV II FAC {\nSI i EST V TVNC { ERVMPE }\nDIC(i)\n}",
Program([], [PerStatement(
DataRangeArray(Numeral("I"), Numeral("IX"), Numeral("II")),
ID("i"),
[SiStatement(BinOp(ID("i"), Numeral("V"), "KEYWORD_EST"), [Erumpe()], None),
ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
ValStr("III"), "I\nIII\n"),
]
class TestLoopEdge(unittest.TestCase):