🐐 PER deconstructing
This commit is contained in:
41
tests.py
41
tests.py
@@ -473,6 +473,20 @@ control_tests = [
|
||||
("DONICVM i VT I VSQVE V FAC { DIC(i) }",
|
||||
Program([], [PerStatement(DataRangeArray(Numeral("I"), Numeral("V")), ID("i"), [ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
|
||||
ValStr("V"), "I\nII\nIII\nIV\nV\n"),
|
||||
# PER destructuring
|
||||
("PER a, b IN [[I, II], [III, IV]] FAC { DIC(a + b) }",
|
||||
Program([], [PerStatement(
|
||||
DataArray([DataArray([Numeral("I"), Numeral("II")]), DataArray([Numeral("III"), Numeral("IV")])]),
|
||||
[ID("a"), ID("b")],
|
||||
[ExpressionStatement(BuiltIn("DIC", [BinOp(ID("a"), ID("b"), "SYMBOL_PLUS")]))])]),
|
||||
ValStr("VII"), "III\nVII\n"),
|
||||
# PER destructuring: three variables
|
||||
("PER a, b, c IN [[I, II, III]] FAC { DIC(a + b + c) }",
|
||||
Program([], [PerStatement(
|
||||
DataArray([DataArray([Numeral("I"), Numeral("II"), Numeral("III")])]),
|
||||
[ID("a"), ID("b"), ID("c")],
|
||||
[ExpressionStatement(BuiltIn("DIC", [BinOp(BinOp(ID("a"), ID("b"), "SYMBOL_PLUS"), ID("c"), "SYMBOL_PLUS")]))])]),
|
||||
ValStr("VI"), "VI\n"),
|
||||
]
|
||||
|
||||
class TestControl(unittest.TestCase):
|
||||
@@ -754,6 +768,8 @@ error_tests = [
|
||||
("DESIGNA a, b VT III", CentvrionError), # destructure non-array
|
||||
("DESIGNA a, b VT [I]", CentvrionError), # destructure length mismatch: too many targets
|
||||
("DESIGNA a, b VT [I, II, III]", CentvrionError), # destructure length mismatch: too few targets
|
||||
("PER a, b IN [I, II, III] FAC { DIC(a) }", CentvrionError), # PER destructure: element is not an array
|
||||
("PER a, b IN [[I], [II]] FAC { DIC(a) }", CentvrionError), # PER destructure: wrong number of elements
|
||||
("[I, II, III][II VSQVE IV]", CentvrionError), # slice upper bound out of range
|
||||
("[I, II, III][NVLLVS VSQVE II]", CentvrionError), # slice with non-integer bound
|
||||
("I[I VSQVE II]", CentvrionError), # slice on non-array
|
||||
@@ -1549,6 +1565,31 @@ loop_edge_tests = [
|
||||
[Designa(ID("x"), BinOp(ID("x"), ID("i"), "SYMBOL_PLUS"))]),
|
||||
ExpressionStatement(ID("x"))]),
|
||||
ValNul(), ""),
|
||||
# PER destructuring with ERVMPE
|
||||
("DESIGNA r VT I\nPER a, b IN [[I, II], [III, IV], [V, VI]] FAC {\nSI a EST III TVNC { ERVMPE }\nDESIGNA r VT r + a + b\n}\nr",
|
||||
Program([], [
|
||||
Designa(ID("r"), Numeral("I")),
|
||||
PerStatement(
|
||||
DataArray([DataArray([Numeral("I"), Numeral("II")]), DataArray([Numeral("III"), Numeral("IV")]), DataArray([Numeral("V"), Numeral("VI")])]),
|
||||
[ID("a"), ID("b")],
|
||||
[SiStatement(BinOp(ID("a"), Numeral("III"), "KEYWORD_EST"), [Erumpe()], None),
|
||||
Designa(ID("r"), BinOp(BinOp(ID("r"), ID("a"), "SYMBOL_PLUS"), ID("b"), "SYMBOL_PLUS"))],
|
||||
),
|
||||
ExpressionStatement(ID("r")),
|
||||
]),
|
||||
ValInt(4)), # 1 + 1 + 2 = 4, breaks before [III, IV]
|
||||
# PER destructuring with REDI
|
||||
("DEFINI f () VT {\nPER a, b IN [[I, II], [III, IV]] FAC {\nSI a EST III TVNC { REDI (b) }\n}\n}\nINVOCA f ()",
|
||||
Program([], [
|
||||
Defini(ID("f"), [],
|
||||
[PerStatement(
|
||||
DataArray([DataArray([Numeral("I"), Numeral("II")]), DataArray([Numeral("III"), Numeral("IV")])]),
|
||||
[ID("a"), ID("b")],
|
||||
[SiStatement(BinOp(ID("a"), Numeral("III"), "KEYWORD_EST"), [Redi([ID("b")])], None)],
|
||||
)]),
|
||||
ExpressionStatement(Invoca(ID("f"), [])),
|
||||
]),
|
||||
ValInt(4)), # returns b=IV when a=III
|
||||
]
|
||||
|
||||
class TestLoopEdge(unittest.TestCase):
|
||||
|
||||
Reference in New Issue
Block a user