🐐 Fixing latin
This commit is contained in:
264
tests.py
264
tests.py
@@ -110,17 +110,17 @@ def run_test(self, source, target_nodes, target_value, target_output="", input_l
|
||||
# --- Output ---
|
||||
|
||||
output_tests = [
|
||||
("DICE(\"hello\")", Program([], [ExpressionStatement(BuiltIn("DICE", [String("hello")]))]), ValStr("hello"), "hello\n"),
|
||||
("DICE(\"world\")", Program([], [ExpressionStatement(BuiltIn("DICE", [String("world")]))]), ValStr("world"), "world\n"),
|
||||
("DICE(III)", Program([], [ExpressionStatement(BuiltIn("DICE", [Numeral("III")]))]), ValStr("III"), "III\n"),
|
||||
("DICE(X)", Program([], [ExpressionStatement(BuiltIn("DICE", [Numeral("X")]))]), ValStr("X"), "X\n"),
|
||||
("DICE(MMXXV)", Program([], [ExpressionStatement(BuiltIn("DICE", [Numeral("MMXXV")]))]), ValStr("MMXXV"), "MMXXV\n"),
|
||||
("DICE('hello')", Program([], [ExpressionStatement(BuiltIn("DICE", [String("hello")]))]), ValStr("hello"), "hello\n"),
|
||||
("DICE('world')", Program([], [ExpressionStatement(BuiltIn("DICE", [String("world")]))]), ValStr("world"), "world\n"),
|
||||
("DICE(\"a\", \"b\")", Program([], [ExpressionStatement(BuiltIn("DICE", [String("a"), String("b")]))]), ValStr("a b"), "a b\n"),
|
||||
("DICE(\"line one\")\nDICE(\"line two\")", Program([], [ExpressionStatement(BuiltIn("DICE", [String("line one")])), ExpressionStatement(BuiltIn("DICE", [String("line two")]))]), ValStr("line two"), "line one\nline two\n"),
|
||||
("DICE(DICE(II))", Program([], [ExpressionStatement(BuiltIn("DICE", [BuiltIn("DICE", [Numeral("II")])]))]), ValStr("II"), "II\nII\n"),
|
||||
("EVERRO()", Program([], [ExpressionStatement(BuiltIn("EVERRO", []))]), ValNul(), "\033[2J\033[H"),
|
||||
("DIC(\"hello\")", Program([], [ExpressionStatement(BuiltIn("DIC", [String("hello")]))]), ValStr("hello"), "hello\n"),
|
||||
("DIC(\"world\")", Program([], [ExpressionStatement(BuiltIn("DIC", [String("world")]))]), ValStr("world"), "world\n"),
|
||||
("DIC(III)", Program([], [ExpressionStatement(BuiltIn("DIC", [Numeral("III")]))]), ValStr("III"), "III\n"),
|
||||
("DIC(X)", Program([], [ExpressionStatement(BuiltIn("DIC", [Numeral("X")]))]), ValStr("X"), "X\n"),
|
||||
("DIC(MMXXV)", Program([], [ExpressionStatement(BuiltIn("DIC", [Numeral("MMXXV")]))]), ValStr("MMXXV"), "MMXXV\n"),
|
||||
("DIC('hello')", Program([], [ExpressionStatement(BuiltIn("DIC", [String("hello")]))]), ValStr("hello"), "hello\n"),
|
||||
("DIC('world')", Program([], [ExpressionStatement(BuiltIn("DIC", [String("world")]))]), ValStr("world"), "world\n"),
|
||||
("DIC(\"a\", \"b\")", Program([], [ExpressionStatement(BuiltIn("DIC", [String("a"), String("b")]))]), ValStr("a b"), "a b\n"),
|
||||
("DIC(\"line one\")\nDIC(\"line two\")", Program([], [ExpressionStatement(BuiltIn("DIC", [String("line one")])), ExpressionStatement(BuiltIn("DIC", [String("line two")]))]), ValStr("line two"), "line one\nline two\n"),
|
||||
("DIC(DIC(II))", Program([], [ExpressionStatement(BuiltIn("DIC", [BuiltIn("DIC", [Numeral("II")])]))]), ValStr("II"), "II\nII\n"),
|
||||
("EVERRE()", Program([], [ExpressionStatement(BuiltIn("EVERRE", []))]), ValNul(), "\033[2J\033[H"),
|
||||
]
|
||||
|
||||
class TestOutput(unittest.TestCase):
|
||||
@@ -285,7 +285,7 @@ assignment_tests = [
|
||||
ExpressionStatement(ID("x"))]),
|
||||
ValInt(6)),
|
||||
# AVGE inside a loop (DONICVM range is inclusive: I VSQVE III = [1, 2, 3])
|
||||
("DESIGNA s VT NVLLVS\nDONICVM i VT I VSQVE III FACE {\ns AVGE i\n}\ns",
|
||||
("DESIGNA s VT NVLLVS\nDONICVM i VT I VSQVE III FAC {\ns AVGE i\n}\ns",
|
||||
Program([], [Designa(ID("s"), Nullus()),
|
||||
PerStatement(DataRangeArray(Numeral("I"), Numeral("III")), ID("i"),
|
||||
[Designa(ID("s"), BinOp(ID("s"), ID("i"), "SYMBOL_PLUS"))]),
|
||||
@@ -332,12 +332,12 @@ destructuring_tests = [
|
||||
),
|
||||
# destructure into individual use
|
||||
(
|
||||
"DEFINI pair (a, b) VT { REDI (a, b) }\nDESIGNA x, y VT INVOCA pair (V, II)\nDICE(x)\nDICE(y)",
|
||||
"DEFINI pair (a, b) VT { REDI (a, b) }\nDESIGNA x, y VT INVOCA pair (V, II)\nDIC(x)\nDIC(y)",
|
||||
Program([], [
|
||||
Defini(ID("pair"), [ID("a"), ID("b")], [Redi([ID("a"), ID("b")])]),
|
||||
DesignaDestructure([ID("x"), ID("y")], Invoca(ID("pair"), [Numeral("V"), Numeral("II")])),
|
||||
ExpressionStatement(BuiltIn("DICE", [ID("x")])),
|
||||
ExpressionStatement(BuiltIn("DICE", [ID("y")])),
|
||||
ExpressionStatement(BuiltIn("DIC", [ID("x")])),
|
||||
ExpressionStatement(BuiltIn("DIC", [ID("y")])),
|
||||
]),
|
||||
ValStr("II"),
|
||||
"V\nII\n",
|
||||
@@ -353,41 +353,41 @@ class TestDestructuring(unittest.TestCase):
|
||||
# --- Control flow ---
|
||||
|
||||
control_tests = [
|
||||
# SI without ALVID — true branch
|
||||
# SI without ALIVD — true branch
|
||||
("SI VERITAS TVNC { DESIGNA r VT I }\nr",
|
||||
Program([], [SiStatement(Bool(True), [Designa(ID("r"), Numeral("I"))], None), ExpressionStatement(ID("r"))]),
|
||||
ValInt(1)),
|
||||
# SI without ALVID — false branch
|
||||
# SI without ALIVD — false branch
|
||||
("SI FALSITAS TVNC { DESIGNA r VT I }",
|
||||
Program([], [SiStatement(Bool(False), [Designa(ID("r"), Numeral("I"))], None)]),
|
||||
ValNul()),
|
||||
# SI with ALVID — true branch
|
||||
("SI VERITAS TVNC { DESIGNA r VT I } ALVID { DESIGNA r VT II }\nr",
|
||||
# SI with ALIVD — true branch
|
||||
("SI VERITAS TVNC { DESIGNA r VT I } ALIVD { DESIGNA r VT II }\nr",
|
||||
Program([], [SiStatement(Bool(True), [Designa(ID("r"), Numeral("I"))], [Designa(ID("r"), Numeral("II"))]), ExpressionStatement(ID("r"))]),
|
||||
ValInt(1)),
|
||||
# SI with ALVID — false branch
|
||||
("SI FALSITAS TVNC { DESIGNA r VT I } ALVID { DESIGNA r VT II }\nr",
|
||||
# SI with ALIVD — false branch
|
||||
("SI FALSITAS TVNC { DESIGNA r VT I } ALIVD { DESIGNA r VT II }\nr",
|
||||
Program([], [SiStatement(Bool(False), [Designa(ID("r"), Numeral("I"))], [Designa(ID("r"), Numeral("II"))]), ExpressionStatement(ID("r"))]),
|
||||
ValInt(2)),
|
||||
# SI with comparison — equal
|
||||
("SI I EST I TVNC { DESIGNA r VT I } ALVID { DESIGNA r VT II }\nr",
|
||||
("SI I EST I TVNC { DESIGNA r VT I } ALIVD { DESIGNA r VT II }\nr",
|
||||
Program([], [SiStatement(BinOp(Numeral("I"), Numeral("I"), "KEYWORD_EST"), [Designa(ID("r"), Numeral("I"))], [Designa(ID("r"), Numeral("II"))]), ExpressionStatement(ID("r"))]),
|
||||
ValInt(1)),
|
||||
# SI with comparison — unequal
|
||||
("SI I EST II TVNC { DESIGNA r VT I } ALVID { DESIGNA r VT II }\nr",
|
||||
("SI I EST II TVNC { DESIGNA r VT I } ALIVD { DESIGNA r VT II }\nr",
|
||||
Program([], [SiStatement(BinOp(Numeral("I"), Numeral("II"), "KEYWORD_EST"), [Designa(ID("r"), Numeral("I"))], [Designa(ID("r"), Numeral("II"))]), ExpressionStatement(ID("r"))]),
|
||||
ValInt(2)),
|
||||
# SI MINVS
|
||||
("SI I MINVS II TVNC { DESIGNA r VT I } ALVID { DESIGNA r VT II }\nr",
|
||||
("SI I MINVS II TVNC { DESIGNA r VT I } ALIVD { DESIGNA r VT II }\nr",
|
||||
Program([], [SiStatement(BinOp(Numeral("I"), Numeral("II"), "KEYWORD_MINVS"), [Designa(ID("r"), Numeral("I"))], [Designa(ID("r"), Numeral("II"))]), ExpressionStatement(ID("r"))]),
|
||||
ValInt(1)),
|
||||
# SI PLVS
|
||||
("SI II PLVS I TVNC { DESIGNA r VT I } ALVID { DESIGNA r VT II }\nr",
|
||||
("SI II PLVS I TVNC { DESIGNA r VT I } ALIVD { DESIGNA r VT II }\nr",
|
||||
Program([], [SiStatement(BinOp(Numeral("II"), Numeral("I"), "KEYWORD_PLVS"), [Designa(ID("r"), Numeral("I"))], [Designa(ID("r"), Numeral("II"))]), ExpressionStatement(ID("r"))]),
|
||||
ValInt(1)),
|
||||
# ALVID SI chain
|
||||
# ALIVD SI chain
|
||||
(
|
||||
"SI I EST II TVNC { DESIGNA r VT I } ALVID SI I EST I TVNC { DESIGNA r VT II } ALVID { DESIGNA r VT III }\nr",
|
||||
"SI I EST II TVNC { DESIGNA r VT I } ALIVD SI I EST I TVNC { DESIGNA r VT II } ALIVD { DESIGNA r VT III }\nr",
|
||||
Program([], [
|
||||
SiStatement(
|
||||
BinOp(Numeral("I"), Numeral("II"), "KEYWORD_EST"),
|
||||
@@ -404,7 +404,7 @@ control_tests = [
|
||||
),
|
||||
# DVM (while not): loops until condition is true
|
||||
(
|
||||
"DESIGNA x VT I\nDVM x EST III FACE {\nDESIGNA x VT x + I\n}\nx",
|
||||
"DESIGNA x VT I\nDVM x EST III FAC {\nDESIGNA x VT x + I\n}\nx",
|
||||
Program([], [
|
||||
Designa(ID("x"), Numeral("I")),
|
||||
DumStatement(BinOp(ID("x"), Numeral("III"), "KEYWORD_EST"), [Designa(ID("x"), BinOp(ID("x"), Numeral("I"), "SYMBOL_PLUS"))]),
|
||||
@@ -412,22 +412,22 @@ control_tests = [
|
||||
]),
|
||||
ValInt(3),
|
||||
),
|
||||
# DVM with ERVMPE — loop body prints (testing DICE + ERVMPE together)
|
||||
("DESIGNA x VT I\nDVM FALSITAS FACE {\nDICE(x)\nERVMPE\n}",
|
||||
# DVM with ERVMPE — loop body prints (testing DIC + ERVMPE together)
|
||||
("DESIGNA x VT I\nDVM FALSITAS FAC {\nDIC(x)\nERVMPE\n}",
|
||||
Program([], [
|
||||
Designa(ID("x"), Numeral("I")),
|
||||
DumStatement(Bool(False), [ExpressionStatement(BuiltIn("DICE", [ID("x")])), Erumpe()]),
|
||||
DumStatement(Bool(False), [ExpressionStatement(BuiltIn("DIC", [ID("x")])), Erumpe()]),
|
||||
]),
|
||||
ValStr("I"), "I\n"),
|
||||
# AETERNVM is sugar for DVM FALSITAS — must produce the same AST.
|
||||
("DESIGNA x VT I\nAETERNVM FACE {\nDICE(x)\nERVMPE\n}",
|
||||
("DESIGNA x VT I\nAETERNVM FAC {\nDIC(x)\nERVMPE\n}",
|
||||
Program([], [
|
||||
Designa(ID("x"), Numeral("I")),
|
||||
DumStatement(Bool(False), [ExpressionStatement(BuiltIn("DICE", [ID("x")])), Erumpe()]),
|
||||
DumStatement(Bool(False), [ExpressionStatement(BuiltIn("DIC", [ID("x")])), Erumpe()]),
|
||||
]),
|
||||
ValStr("I"), "I\n"),
|
||||
# AETERNVM with counter + ERVMPE on condition
|
||||
("DESIGNA x VT I\nAETERNVM FACE {\nSI x EST III TVNC { ERVMPE }\nDESIGNA x VT x + I\n}\nx",
|
||||
("DESIGNA x VT I\nAETERNVM FAC {\nSI x EST III TVNC { ERVMPE }\nDESIGNA x VT x + I\n}\nx",
|
||||
Program([], [
|
||||
Designa(ID("x"), Numeral("I")),
|
||||
DumStatement(Bool(False), [
|
||||
@@ -440,20 +440,20 @@ control_tests = [
|
||||
# AETERNVM with CONTINVA — skip printing III; ERVMPE after V.
|
||||
# Return value is ValNul because the iteration that triggers ERVMPE runs
|
||||
# Designa first (resetting last_val); we test on output, which is the point.
|
||||
("DESIGNA x VT NVLLVS\nAETERNVM FACE {\nDESIGNA x VT x + I\nSI x PLVS V TVNC { ERVMPE }\nSI x EST III TVNC { CONTINVA }\nDICE(x)\n}",
|
||||
("DESIGNA x VT NVLLVS\nAETERNVM FAC {\nDESIGNA x VT x + I\nSI x PLVS V TVNC { ERVMPE }\nSI x EST III TVNC { CONTINVA }\nDIC(x)\n}",
|
||||
Program([], [
|
||||
Designa(ID("x"), Nullus()),
|
||||
DumStatement(Bool(False), [
|
||||
Designa(ID("x"), BinOp(ID("x"), Numeral("I"), "SYMBOL_PLUS")),
|
||||
SiStatement(BinOp(ID("x"), Numeral("V"), "KEYWORD_PLVS"), [Erumpe()], None),
|
||||
SiStatement(BinOp(ID("x"), Numeral("III"), "KEYWORD_EST"), [Continva()], None),
|
||||
ExpressionStatement(BuiltIn("DICE", [ID("x")])),
|
||||
ExpressionStatement(BuiltIn("DIC", [ID("x")])),
|
||||
]),
|
||||
]),
|
||||
ValNul(), "I\nII\nIV\nV\n"),
|
||||
# REDI inside AETERNVM (inside DEFINI) — exits both loop and function
|
||||
(
|
||||
"DEFINI f () VT {\nDESIGNA x VT I\nAETERNVM FACE {\nREDI (x)\n}\n}\nINVOCA f ()",
|
||||
"DEFINI f () VT {\nDESIGNA x VT I\nAETERNVM FAC {\nREDI (x)\n}\n}\nINVOCA f ()",
|
||||
Program([], [
|
||||
Defini(ID("f"), [], [
|
||||
Designa(ID("x"), Numeral("I")),
|
||||
@@ -464,12 +464,12 @@ control_tests = [
|
||||
ValInt(1),
|
||||
),
|
||||
# PER foreach
|
||||
("PER i IN [I, II, III] FACE { DICE(i) }",
|
||||
Program([], [PerStatement(DataArray([Numeral("I"), Numeral("II"), Numeral("III")]), ID("i"), [ExpressionStatement(BuiltIn("DICE", [ID("i")]))])]),
|
||||
("PER i IN [I, II, III] FAC { DIC(i) }",
|
||||
Program([], [PerStatement(DataArray([Numeral("I"), Numeral("II"), Numeral("III")]), ID("i"), [ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
|
||||
ValStr("III"), "I\nII\nIII\n"),
|
||||
# DONICVM range loop
|
||||
("DONICVM i VT I VSQVE V FACE { DICE(i) }",
|
||||
Program([], [PerStatement(DataRangeArray(Numeral("I"), Numeral("V")), ID("i"), [ExpressionStatement(BuiltIn("DICE", [ID("i")]))])]),
|
||||
("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"),
|
||||
]
|
||||
|
||||
@@ -500,7 +500,7 @@ function_tests = [
|
||||
),
|
||||
# Fibonacci: fib(n<3)=1, fib(n)=fib(n-1)+fib(n-2)
|
||||
(
|
||||
"DEFINI fib (n) VT {\nSI n MINVS III TVNC { REDI (I) } ALVID { REDI (INVOCA fib (n - I) + INVOCA fib (n - II)) }\n}\nINVOCA fib (VII)",
|
||||
"DEFINI fib (n) VT {\nSI n MINVS III TVNC { REDI (I) } ALIVD { REDI (INVOCA fib (n - I) + INVOCA fib (n - II)) }\n}\nINVOCA fib (VII)",
|
||||
Program([], [
|
||||
Defini(ID("fib"), [ID("n")], [
|
||||
SiStatement(
|
||||
@@ -530,14 +530,14 @@ class TestFunctions(unittest.TestCase):
|
||||
builtin_tests = [
|
||||
("AVDI_NVMERVS()", Program([], [ExpressionStatement(BuiltIn("AVDI_NVMERVS", []))]), ValInt(3), "", ["III"]),
|
||||
("AVDI_NVMERVS()", Program([], [ExpressionStatement(BuiltIn("AVDI_NVMERVS", []))]), ValInt(10), "", ["X"]),
|
||||
("CVM FORS\nFORTIS_NVMERVS(I, X)", Program([ModuleCall("FORS")], [ExpressionStatement(BuiltIn("FORTIS_NVMERVS", [Numeral("I"), Numeral("X")]))]), ValInt(3)),
|
||||
("CVM FORS\nFORTVITVS_NVMERVS(I, X)", Program([ModuleCall("FORS")], [ExpressionStatement(BuiltIn("FORTVITVS_NVMERVS", [Numeral("I"), Numeral("X")]))]), ValInt(3)),
|
||||
("AVDI()", Program([], [ExpressionStatement(BuiltIn("AVDI", []))]), ValStr("hello"), "", ["hello"]),
|
||||
("LONGITVDO([I, II, III])", Program([], [ExpressionStatement(BuiltIn("LONGITVDO", [DataArray([Numeral("I"), Numeral("II"), Numeral("III")])]))]), ValInt(3)),
|
||||
("LONGITVDO([])", Program([], [ExpressionStatement(BuiltIn("LONGITVDO", [DataArray([])]))]), ValInt(0)),
|
||||
('LONGITVDO("salve")', Program([], [ExpressionStatement(BuiltIn("LONGITVDO", [String("salve")]))]), ValInt(5)),
|
||||
('LONGITVDO("")', Program([], [ExpressionStatement(BuiltIn("LONGITVDO", [String("")]))]), ValInt(0)),
|
||||
("CVM FORS\nFORTIS_ELECTIONIS([I, II, III])", Program([ModuleCall("FORS")], [ExpressionStatement(BuiltIn("FORTIS_ELECTIONIS", [DataArray([Numeral("I"), Numeral("II"), Numeral("III")])]))]), ValInt(1)),
|
||||
("CVM FORS\nSEMEN(XLII)\nFORTIS_NVMERVS(I, C)", Program([ModuleCall("FORS")], [ExpressionStatement(BuiltIn("SEMEN", [Numeral("XLII")])), ExpressionStatement(BuiltIn("FORTIS_NVMERVS", [Numeral("I"), Numeral("C")]))]), ValInt(82)),
|
||||
("CVM FORS\nFORTVITA_ELECTIO([I, II, III])", Program([ModuleCall("FORS")], [ExpressionStatement(BuiltIn("FORTVITA_ELECTIO", [DataArray([Numeral("I"), Numeral("II"), Numeral("III")])]))]), ValInt(1)),
|
||||
("CVM FORS\nSEMEN(XLII)\nFORTVITVS_NVMERVS(I, C)", Program([ModuleCall("FORS")], [ExpressionStatement(BuiltIn("SEMEN", [Numeral("XLII")])), ExpressionStatement(BuiltIn("FORTVITVS_NVMERVS", [Numeral("I"), Numeral("C")]))]), ValInt(82)),
|
||||
# DECIMATIO: seed 42, 10 elements → removes 1 (element II)
|
||||
("CVM FORS\nSEMEN(XLII)\nDECIMATIO([I, II, III, IV, V, VI, VII, VIII, IX, X])", Program([ModuleCall("FORS")], [ExpressionStatement(BuiltIn("SEMEN", [Numeral("XLII")])), ExpressionStatement(BuiltIn("DECIMATIO", [DataArray([Numeral("I"), Numeral("II"), Numeral("III"), Numeral("IV"), Numeral("V"), Numeral("VI"), Numeral("VII"), Numeral("VIII"), Numeral("IX"), Numeral("X")])]))]), ValList([ValInt(1), ValInt(3), ValInt(4), ValInt(5), ValInt(6), ValInt(7), ValInt(8), ValInt(9), ValInt(10)])),
|
||||
# DECIMATIO: seed 1, 3 elements → 3//10=0, nothing removed
|
||||
@@ -621,9 +621,9 @@ error_tests = [
|
||||
("INVOCA f ()", CentvrionError), # undefined function
|
||||
("DESIGNA VT III", SyntaxError), # parse error: missing id after DESIGNA
|
||||
("DESIGNA x III", SyntaxError), # parse error: missing VT
|
||||
("DICE(M + M + M + M)", CentvrionError), # output > 3999 without MAGNVM
|
||||
("DIC(M + M + M + M)", CentvrionError), # output > 3999 without MAGNVM
|
||||
("IIII", CentvrionError), # invalid Roman numeral in source
|
||||
("FORTIS_NVMERVS(I, X)", CentvrionError), # requires FORS module
|
||||
("FORTVITVS_NVMERVS(I, X)", CentvrionError), # requires FORS module
|
||||
("DEFINI f (x) VT { REDI(x) }\nINVOCA f (I, II)", CentvrionError), # too many args
|
||||
("DEFINI f (x, y) VT { REDI(x) }\nINVOCA f (I)", CentvrionError), # too few args
|
||||
("DEFINI f () VT { REDI(I) }\nINVOCA f (I)", CentvrionError), # args to zero-param function
|
||||
@@ -646,10 +646,10 @@ error_tests = [
|
||||
("DESIGNA x VT I\nDESIGNA x[I] VT II", CentvrionError), # index-assign to non-array
|
||||
("SEMEN(I)", CentvrionError), # requires FORS module
|
||||
('CVM FORS\nSEMEN("abc")', CentvrionError), # SEMEN requires integer seed
|
||||
("FORTIS_ELECTIONIS([])", CentvrionError), # FORS required for FORTIS_ELECTIONIS
|
||||
("CVM FORS\nFORTIS_ELECTIONIS([])", CentvrionError), # FORTIS_ELECTIONIS on empty array
|
||||
("CVM FORS\nFORTIS_NVMERVS(X, I)", CentvrionError), # FORTIS_NVMERVS a > b
|
||||
("PER i IN I FACE { DICE(i) }", CentvrionError), # PER over non-array
|
||||
("FORTVITA_ELECTIO([])", CentvrionError), # FORS required for FORTVITA_ELECTIO
|
||||
("CVM FORS\nFORTVITA_ELECTIO([])", CentvrionError), # FORTVITA_ELECTIO on empty array
|
||||
("CVM FORS\nFORTVITVS_NVMERVS(X, I)", CentvrionError), # FORTVITVS_NVMERVS a > b
|
||||
("PER i IN I FAC { DIC(i) }", CentvrionError), # PER over non-array
|
||||
("DECIMATIO([I, II, III])", CentvrionError), # FORS required for DECIMATIO
|
||||
("CVM FORS\nDECIMATIO(I)", CentvrionError), # DECIMATIO requires an array
|
||||
("LONGITVDO(I)", CentvrionError), # LONGITVDO on non-array
|
||||
@@ -670,7 +670,7 @@ error_tests = [
|
||||
("DESIGNA z VT I - I\nSI z TVNC { DESIGNA r VT I }", CentvrionError), # non-bool SI condition: zero int
|
||||
("SI [I] TVNC { DESIGNA r VT I }", CentvrionError), # non-bool SI condition: non-empty list
|
||||
("SI [] TVNC { DESIGNA r VT I }", CentvrionError), # non-bool SI condition: empty list
|
||||
("DESIGNA x VT I\nDVM x FACE {\nDESIGNA x VT x + I\n}", CentvrionError), # non-bool DVM condition: int
|
||||
("DESIGNA x VT I\nDVM x FAC {\nDESIGNA x VT x + I\n}", CentvrionError), # non-bool DVM condition: int
|
||||
("NON I", CentvrionError), # NON on integer
|
||||
("DESIGNA z VT I - I\nNON z", CentvrionError), # NON on zero integer
|
||||
('NON "hello"', CentvrionError), # NON on string
|
||||
@@ -752,7 +752,7 @@ repr_tests = [
|
||||
("dum", DumStatement(Bool(False), [ExpressionStatement(Erumpe())]), "Dum(\n Bool(False),\n statements([\n ExpressionStatement(\n Erumpe()\n )\n ])\n)"),
|
||||
("per", PerStatement(DataArray([Numeral("I")]), ID("i"), [ExpressionStatement(Erumpe())]), "Per(\n Array([\n Numeral(I)\n ]),\n ID(i),\n statements([\n ExpressionStatement(\n Erumpe()\n )\n ])\n)"),
|
||||
("invoca", Invoca(ID("f"), [Numeral("I")]), "Invoca(\n ID(f),\n parameters([\n Numeral(I)\n ])\n)"),
|
||||
("builtin", BuiltIn("DICE", [String("hi")]), "Builtin(\n DICE,\n parameters([\n String(hi)\n ])\n)"),
|
||||
("builtin", BuiltIn("DIC", [String("hi")]), "Builtin(\n DIC,\n parameters([\n String(hi)\n ])\n)"),
|
||||
("defini", Defini(ID("f"), [ID("n")], [ExpressionStatement(Redi([Numeral("I")]))]), "Defini(\n ID(f),\n parameters([\n ID(n)\n ]),\n statements([\n ExpressionStatement(\n Redi([\n Numeral(I)\n ])\n )\n ])\n)"),
|
||||
("program_no_modules", Program([], [ExpressionStatement(Numeral("I"))]), "modules([]),\nstatements([\n ExpressionStatement(\n Numeral(I)\n )\n])"),
|
||||
("program_with_module", Program([ModuleCall("FORS")], [ExpressionStatement(Numeral("I"))]), "modules([\n FORS\n]),\nstatements([\n ExpressionStatement(\n Numeral(I)\n )\n])"),
|
||||
@@ -857,23 +857,23 @@ class TestMakeString(unittest.TestCase):
|
||||
)
|
||||
|
||||
|
||||
# --- DICE with non-integer types ---
|
||||
# --- DIC with non-integer types ---
|
||||
|
||||
dice_type_tests = [
|
||||
("DICE(VERITAS)", Program([], [ExpressionStatement(BuiltIn("DICE", [Bool(True)]))]), ValStr("VERITAS"), "VERITAS\n"),
|
||||
("DICE(FALSITAS)", Program([], [ExpressionStatement(BuiltIn("DICE", [Bool(False)]))]), ValStr("FALSITAS"), "FALSITAS\n"),
|
||||
("DICE(NVLLVS)", Program([], [ExpressionStatement(BuiltIn("DICE", [Nullus()]))]), ValStr("NVLLVS"), "NVLLVS\n"),
|
||||
('DICE([I, II])', Program([], [ExpressionStatement(BuiltIn("DICE", [DataArray([Numeral("I"), Numeral("II")])]))]), ValStr("[I II]"), "[I II]\n"),
|
||||
('DICE("")', Program([], [ExpressionStatement(BuiltIn("DICE", [String("")]))]), ValStr(""), "\n"),
|
||||
dic_type_tests = [
|
||||
("DIC(VERITAS)", Program([], [ExpressionStatement(BuiltIn("DIC", [Bool(True)]))]), ValStr("VERITAS"), "VERITAS\n"),
|
||||
("DIC(FALSITAS)", Program([], [ExpressionStatement(BuiltIn("DIC", [Bool(False)]))]), ValStr("FALSITAS"), "FALSITAS\n"),
|
||||
("DIC(NVLLVS)", Program([], [ExpressionStatement(BuiltIn("DIC", [Nullus()]))]), ValStr("NVLLVS"), "NVLLVS\n"),
|
||||
('DIC([I, II])', Program([], [ExpressionStatement(BuiltIn("DIC", [DataArray([Numeral("I"), Numeral("II")])]))]), ValStr("[I II]"), "[I II]\n"),
|
||||
('DIC("")', Program([], [ExpressionStatement(BuiltIn("DIC", [String("")]))]), ValStr(""), "\n"),
|
||||
# arithmetic result printed as numeral
|
||||
("DICE(II + III)", Program([], [ExpressionStatement(BuiltIn("DICE", [BinOp(Numeral("II"), Numeral("III"), "SYMBOL_PLUS")]))]), ValStr("V"), "V\n"),
|
||||
("DIC(II + III)", Program([], [ExpressionStatement(BuiltIn("DIC", [BinOp(Numeral("II"), Numeral("III"), "SYMBOL_PLUS")]))]), ValStr("V"), "V\n"),
|
||||
# multiple args of mixed types
|
||||
('DICE("x", VERITAS)', Program([], [ExpressionStatement(BuiltIn("DICE", [String("x"), Bool(True)]))]), ValStr("x VERITAS"), "x VERITAS\n"),
|
||||
('DIC("x", VERITAS)', Program([], [ExpressionStatement(BuiltIn("DIC", [String("x"), Bool(True)]))]), ValStr("x VERITAS"), "x VERITAS\n"),
|
||||
]
|
||||
|
||||
class TestDiceTypes(unittest.TestCase):
|
||||
@parameterized.expand(dice_type_tests)
|
||||
def test_dice_types(self, source, nodes, value, output):
|
||||
class TestDicTypes(unittest.TestCase):
|
||||
@parameterized.expand(dic_type_tests)
|
||||
def test_dic_types(self, source, nodes, value, output):
|
||||
run_test(self, source, nodes, value, output)
|
||||
|
||||
|
||||
@@ -882,7 +882,7 @@ class TestDiceTypes(unittest.TestCase):
|
||||
dvm_bool_condition_tests = [
|
||||
# DVM exits when condition becomes true (boolean comparison)
|
||||
(
|
||||
"DESIGNA x VT I\nDVM x PLVS III FACE {\nDESIGNA x VT x + I\n}\nx",
|
||||
"DESIGNA x VT I\nDVM x PLVS III FAC {\nDESIGNA x VT x + I\n}\nx",
|
||||
Program([], [
|
||||
Designa(ID("x"), Numeral("I")),
|
||||
DumStatement(BinOp(ID("x"), Numeral("III"), "KEYWORD_PLVS"), [Designa(ID("x"), BinOp(ID("x"), Numeral("I"), "SYMBOL_PLUS"))]),
|
||||
@@ -1019,11 +1019,11 @@ interpolation_tests = [
|
||||
('"hello world"',
|
||||
Program([], [ExpressionStatement(String("hello world"))]),
|
||||
ValStr("hello world")),
|
||||
# interpolation in DICE output
|
||||
('DESIGNA name VT "Roma"\nDICE("Salve, {name}!")',
|
||||
# interpolation in DIC output
|
||||
('DESIGNA name VT "Roma"\nDIC("Salve, {name}!")',
|
||||
Program([], [
|
||||
Designa(ID("name"), String("Roma")),
|
||||
ExpressionStatement(BuiltIn("DICE", [InterpolatedString([String("Salve, "), ID("name"), String("!")])]))
|
||||
ExpressionStatement(BuiltIn("DIC", [InterpolatedString([String("Salve, "), ID("name"), String("!")])]))
|
||||
]), ValStr("Salve, Roma!"), "Salve, Roma!\n"),
|
||||
]
|
||||
|
||||
@@ -1043,7 +1043,7 @@ comparison_tests = [
|
||||
("SI III PLVS II TVNC { DESIGNA r VT I }\nr",
|
||||
Program([], [SiStatement(BinOp(Numeral("III"), Numeral("II"), "KEYWORD_PLVS"), [Designa(ID("r"), Numeral("I"))], None), ExpressionStatement(ID("r"))]),
|
||||
ValInt(1)),
|
||||
("SI II PLVS III TVNC { DESIGNA r VT I } ALVID { DESIGNA r VT II }\nr",
|
||||
("SI II PLVS III TVNC { DESIGNA r VT I } ALIVD { DESIGNA r VT II }\nr",
|
||||
Program([], [SiStatement(BinOp(Numeral("II"), Numeral("III"), "KEYWORD_PLVS"), [Designa(ID("r"), Numeral("I"))], [Designa(ID("r"), Numeral("II"))]), ExpressionStatement(ID("r"))]),
|
||||
ValInt(2)),
|
||||
# result of comparison is ValBool
|
||||
@@ -1153,7 +1153,7 @@ function_edge_tests = [
|
||||
),
|
||||
# REDI inside DVM exits loop and function
|
||||
(
|
||||
"DEFINI f () VT {\nDESIGNA x VT I\nDVM FALSITAS FACE {\nREDI (x)\n}\n}\nINVOCA f ()",
|
||||
"DEFINI f () VT {\nDESIGNA x VT I\nDVM FALSITAS FAC {\nREDI (x)\n}\n}\nINVOCA f ()",
|
||||
Program([],[
|
||||
Defini(ID("f"), [], [
|
||||
Designa(ID("x"), Numeral("I")),
|
||||
@@ -1165,7 +1165,7 @@ function_edge_tests = [
|
||||
),
|
||||
# REDI inside PER exits loop and function
|
||||
(
|
||||
"DEFINI f () VT {\nPER x IN [I, II, III] FACE {\nSI x EST II TVNC {\nREDI (x)\n}\n}\n}\nINVOCA f ()",
|
||||
"DEFINI f () VT {\nPER x IN [I, II, III] FAC {\nSI x EST II TVNC {\nREDI (x)\n}\n}\n}\nINVOCA f ()",
|
||||
Program([],[
|
||||
Defini(ID("f"), [], [
|
||||
PerStatement(DataArray([Numeral("I"), Numeral("II"), Numeral("III")]), ID("x"), [
|
||||
@@ -1180,7 +1180,7 @@ function_edge_tests = [
|
||||
),
|
||||
# REDI inside nested loops exits all loops and function
|
||||
(
|
||||
"DEFINI f () VT {\nDESIGNA x VT I\nDVM FALSITAS FACE {\nDVM FALSITAS FACE {\nREDI (x)\n}\n}\n}\nINVOCA f ()",
|
||||
"DEFINI f () VT {\nDESIGNA x VT I\nDVM FALSITAS FAC {\nDVM FALSITAS FAC {\nREDI (x)\n}\n}\n}\nINVOCA f ()",
|
||||
Program([],[
|
||||
Defini(ID("f"), [], [
|
||||
Designa(ID("x"), Numeral("I")),
|
||||
@@ -1206,15 +1206,15 @@ class TestFunctionEdge(unittest.TestCase):
|
||||
|
||||
loop_edge_tests = [
|
||||
# [III VSQVE III] = [3] — single iteration
|
||||
("DONICVM i VT III VSQVE III FACE { DICE(i) }",
|
||||
Program([], [PerStatement(DataRangeArray(Numeral("III"), Numeral("III")), ID("i"), [ExpressionStatement(BuiltIn("DICE", [ID("i")]))])]),
|
||||
("DONICVM i VT III VSQVE III FAC { DIC(i) }",
|
||||
Program([], [PerStatement(DataRangeArray(Numeral("III"), Numeral("III")), ID("i"), [ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
|
||||
ValStr("III"), "III\n"),
|
||||
# empty array — body never runs
|
||||
("PER i IN [] FACE { DICE(i) }",
|
||||
Program([], [PerStatement(DataArray([]), ID("i"), [ExpressionStatement(BuiltIn("DICE", [ID("i")]))])]),
|
||||
("PER i IN [] FAC { DIC(i) }",
|
||||
Program([], [PerStatement(DataArray([]), ID("i"), [ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
|
||||
ValNul(), ""),
|
||||
# PER breaks on element 2 — last assigned i is 2
|
||||
("PER i IN [I, II, III] FACE { SI i EST II TVNC { ERVMPE } }\ni",
|
||||
("PER i IN [I, II, III] FAC { SI i EST II TVNC { ERVMPE } }\ni",
|
||||
Program([], [
|
||||
PerStatement(
|
||||
DataArray([Numeral("I"), Numeral("II"), Numeral("III")]),
|
||||
@@ -1225,7 +1225,7 @@ loop_edge_tests = [
|
||||
]),
|
||||
ValInt(2), ""),
|
||||
# nested DVM: inner always breaks; outer runs until btr==3
|
||||
("DESIGNA btr VT I\nDVM btr EST III FACE {\nDVM FALSITAS FACE {\nERVMPE\n}\nDESIGNA btr VT btr + I\n}\nbtr",
|
||||
("DESIGNA btr VT I\nDVM btr EST III FAC {\nDVM FALSITAS FAC {\nERVMPE\n}\nDESIGNA btr VT btr + I\n}\nbtr",
|
||||
Program([], [
|
||||
Designa(ID("btr"), Numeral("I")),
|
||||
DumStatement(
|
||||
@@ -1237,7 +1237,7 @@ loop_edge_tests = [
|
||||
ValInt(3), ""),
|
||||
# nested PER: inner always breaks on first element; outer completes both iterations
|
||||
# cnt starts at 1, increments twice → 3
|
||||
("DESIGNA cnt VT I\nPER i IN [I, II] FACE {\nPER k IN [I, II] FACE {\nERVMPE\n}\nDESIGNA cnt VT cnt + I\n}\ncnt",
|
||||
("DESIGNA cnt VT I\nPER i IN [I, II] FAC {\nPER k IN [I, II] FAC {\nERVMPE\n}\nDESIGNA cnt VT cnt + I\n}\ncnt",
|
||||
Program([], [
|
||||
Designa(ID("cnt"), Numeral("I")),
|
||||
PerStatement(
|
||||
@@ -1251,7 +1251,7 @@ loop_edge_tests = [
|
||||
ValInt(3), ""),
|
||||
# PER with CONTINVA: skip odd numbers, sum evens
|
||||
# [I,II,III,IV] → skip I and III; cnt increments on II and IV → cnt = III
|
||||
("DESIGNA cnt VT I\nPER i IN [I, II, III, IV] FACE {\nSI i EST I AVT i EST III TVNC { CONTINVA }\nDESIGNA cnt VT cnt + I\n}\ncnt",
|
||||
("DESIGNA cnt VT I\nPER i IN [I, II, III, IV] FAC {\nSI i EST I AVT i EST III TVNC { CONTINVA }\nDESIGNA cnt VT cnt + I\n}\ncnt",
|
||||
Program([], [
|
||||
Designa(ID("cnt"), Numeral("I")),
|
||||
PerStatement(
|
||||
@@ -1264,22 +1264,22 @@ loop_edge_tests = [
|
||||
]),
|
||||
ValInt(3), ""),
|
||||
# DVM with CONTINVA: skip body when x is II, increment regardless
|
||||
# x goes 1→2→3; on x=2 we continue (no DICE); DICE fires for x=1 and x=3
|
||||
("DESIGNA x VT I\nDVM x EST IV FACE {\nSI x EST II TVNC { DESIGNA x VT x + I\nCONTINVA }\nDICE(x)\nDESIGNA x VT x + I\n}\nx",
|
||||
# x goes 1→2→3; on x=2 we continue (no DIC); DIC fires for x=1 and x=3
|
||||
("DESIGNA x VT I\nDVM x EST IV FAC {\nSI x EST II TVNC { DESIGNA x VT x + I\nCONTINVA }\nDIC(x)\nDESIGNA x VT x + I\n}\nx",
|
||||
Program([], [
|
||||
Designa(ID("x"), Numeral("I")),
|
||||
DumStatement(
|
||||
BinOp(ID("x"), Numeral("IV"), "KEYWORD_EST"),
|
||||
[SiStatement(BinOp(ID("x"), Numeral("II"), "KEYWORD_EST"),
|
||||
[Designa(ID("x"), BinOp(ID("x"), Numeral("I"), "SYMBOL_PLUS")), Continva()], None),
|
||||
ExpressionStatement(BuiltIn("DICE", [ID("x")])),
|
||||
ExpressionStatement(BuiltIn("DIC", [ID("x")])),
|
||||
Designa(ID("x"), BinOp(ID("x"), Numeral("I"), "SYMBOL_PLUS"))],
|
||||
),
|
||||
ExpressionStatement(ID("x")),
|
||||
]),
|
||||
ValInt(4), "I\nIII\n"),
|
||||
# nested PER: CONTINVA in inner only skips rest of inner body; outer still increments
|
||||
("DESIGNA cnt VT I\nPER i IN [I, II] FACE {\nPER k IN [I, II] FACE {\nCONTINVA\nDESIGNA cnt VT cnt + I\n}\nDESIGNA cnt VT cnt + I\n}\ncnt",
|
||||
("DESIGNA cnt VT I\nPER i IN [I, II] FAC {\nPER k IN [I, II] FAC {\nCONTINVA\nDESIGNA cnt VT cnt + I\n}\nDESIGNA cnt VT cnt + I\n}\ncnt",
|
||||
Program([], [
|
||||
Designa(ID("cnt"), Numeral("I")),
|
||||
PerStatement(
|
||||
@@ -1293,7 +1293,7 @@ loop_edge_tests = [
|
||||
]),
|
||||
ValInt(3), ""),
|
||||
# DONICVM with CONTINVA: skip value III, count remaining (I VSQVE IV = [1,2,3,4], skip 3 → 3 increments)
|
||||
("DESIGNA cnt VT I\nDONICVM i VT I VSQVE IV FACE {\nSI i EST III TVNC { CONTINVA }\nDESIGNA cnt VT cnt + I\n}\ncnt",
|
||||
("DESIGNA cnt VT I\nDONICVM i VT I VSQVE IV FAC {\nSI i EST III TVNC { CONTINVA }\nDESIGNA cnt VT cnt + I\n}\ncnt",
|
||||
Program([], [
|
||||
Designa(ID("cnt"), Numeral("I")),
|
||||
PerStatement(
|
||||
@@ -1306,7 +1306,7 @@ loop_edge_tests = [
|
||||
]),
|
||||
ValInt(4)),
|
||||
# DVM condition true from start — body never runs
|
||||
("DESIGNA x VT I\nDVM VERITAS FACE {\nDESIGNA x VT x + I\n}\nx",
|
||||
("DESIGNA x VT I\nDVM VERITAS FAC {\nDESIGNA x VT x + I\n}\nx",
|
||||
Program([], [
|
||||
Designa(ID("x"), Numeral("I")),
|
||||
DumStatement(Bool(True), [Designa(ID("x"), BinOp(ID("x"), Numeral("I"), "SYMBOL_PLUS"))]),
|
||||
@@ -1314,15 +1314,15 @@ loop_edge_tests = [
|
||||
]),
|
||||
ValInt(1), ""),
|
||||
# two iterations: [I VSQVE II] = [1, 2]
|
||||
("DONICVM i VT I VSQVE II FACE { DICE(i) }",
|
||||
Program([], [PerStatement(DataRangeArray(Numeral("I"), Numeral("II")), ID("i"), [ExpressionStatement(BuiltIn("DICE", [ID("i")]))])]),
|
||||
("DONICVM i VT I VSQVE II FAC { DIC(i) }",
|
||||
Program([], [PerStatement(DataRangeArray(Numeral("I"), Numeral("II")), ID("i"), [ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
|
||||
ValStr("II"), "I\nII\n"),
|
||||
# single iteration: [I VSQVE I] = [1]
|
||||
("DONICVM i VT I VSQVE I FACE { DICE(i) }",
|
||||
Program([], [PerStatement(DataRangeArray(Numeral("I"), Numeral("I")), ID("i"), [ExpressionStatement(BuiltIn("DICE", [ID("i")]))])]),
|
||||
("DONICVM i VT I VSQVE I FAC { DIC(i) }",
|
||||
Program([], [PerStatement(DataRangeArray(Numeral("I"), Numeral("I")), ID("i"), [ExpressionStatement(BuiltIn("DIC", [ID("i")]))])]),
|
||||
ValStr("I"), "I\n"),
|
||||
# empty range: [V VSQVE I] = []
|
||||
("DESIGNA x VT NVLLVS\nDONICVM i VT V VSQVE I FACE { DESIGNA x VT x + i }\nx",
|
||||
("DESIGNA x VT NVLLVS\nDONICVM i VT V VSQVE I FAC { DESIGNA x VT x + i }\nx",
|
||||
Program([], [Designa(ID("x"), Nullus()),
|
||||
PerStatement(DataRangeArray(Numeral("V"), Numeral("I")), ID("i"),
|
||||
[Designa(ID("x"), BinOp(ID("x"), ID("i"), "SYMBOL_PLUS"))]),
|
||||
@@ -1387,16 +1387,16 @@ class TestValues(unittest.TestCase):
|
||||
|
||||
magnvm_tests = [
|
||||
# M+M+M+M = 4000; MAGNVM allows display as "MV_"
|
||||
("CVM MAGNVM\nDICE(M + M + M + M)",
|
||||
Program([ModuleCall("MAGNVM")], [ExpressionStatement(BuiltIn("DICE", [BinOp(BinOp(BinOp(Numeral("M"), Numeral("M"), "SYMBOL_PLUS"), Numeral("M"), "SYMBOL_PLUS"), Numeral("M"), "SYMBOL_PLUS")]))]),
|
||||
("CVM MAGNVM\nDIC(M + M + M + M)",
|
||||
Program([ModuleCall("MAGNVM")], [ExpressionStatement(BuiltIn("DIC", [BinOp(BinOp(BinOp(Numeral("M"), Numeral("M"), "SYMBOL_PLUS"), Numeral("M"), "SYMBOL_PLUS"), Numeral("M"), "SYMBOL_PLUS")]))]),
|
||||
ValStr("MV_"), "MV_\n"),
|
||||
# I_ = 1000 with MAGNVM (same value as M, but written with thousands operator)
|
||||
("CVM MAGNVM\nI_",
|
||||
Program([ModuleCall("MAGNVM")], [ExpressionStatement(Numeral("I_"))]),
|
||||
ValInt(1000), ""),
|
||||
# I_ + I_ = 2000; displayed as MM with MAGNVM
|
||||
("CVM MAGNVM\nDICE(I_ + I_)",
|
||||
Program([ModuleCall("MAGNVM")], [ExpressionStatement(BuiltIn("DICE", [BinOp(Numeral("I_"), Numeral("I_"), "SYMBOL_PLUS")]))]),
|
||||
("CVM MAGNVM\nDIC(I_ + I_)",
|
||||
Program([ModuleCall("MAGNVM")], [ExpressionStatement(BuiltIn("DIC", [BinOp(Numeral("I_"), Numeral("I_"), "SYMBOL_PLUS")]))]),
|
||||
ValStr("MM"), "MM\n"),
|
||||
]
|
||||
|
||||
@@ -1425,10 +1425,10 @@ et_avt_tests = [
|
||||
Program([], [ExpressionStatement(BinOp(BinOp(Numeral("I"), Numeral("II"), "KEYWORD_EST"), BinOp(Numeral("II"), Numeral("II"), "KEYWORD_EST"), "KEYWORD_AVT"))]),
|
||||
ValBool(True)),
|
||||
# used as SI condition
|
||||
("SI VERITAS ET VERITAS TVNC { DESIGNA r VT I } ALVID { DESIGNA r VT II }\nr",
|
||||
("SI VERITAS ET VERITAS TVNC { DESIGNA r VT I } ALIVD { DESIGNA r VT II }\nr",
|
||||
Program([], [SiStatement(BinOp(Bool(True), Bool(True), "KEYWORD_ET"), [Designa(ID("r"), Numeral("I"))], [Designa(ID("r"), Numeral("II"))]), ExpressionStatement(ID("r"))]),
|
||||
ValInt(1)),
|
||||
("SI FALSITAS AVT FALSITAS TVNC { DESIGNA r VT I } ALVID { DESIGNA r VT II }\nr",
|
||||
("SI FALSITAS AVT FALSITAS TVNC { DESIGNA r VT I } ALIVD { DESIGNA r VT II }\nr",
|
||||
Program([], [SiStatement(BinOp(Bool(False), Bool(False), "KEYWORD_AVT"), [Designa(ID("r"), Numeral("I"))], [Designa(ID("r"), Numeral("II"))]), ExpressionStatement(ID("r"))]),
|
||||
ValInt(2)),
|
||||
]
|
||||
@@ -1674,13 +1674,13 @@ class TestStringSlice(unittest.TestCase):
|
||||
|
||||
comment_tests = [
|
||||
# trailing line comment
|
||||
('DICE("hello") // this is ignored', Program([], [ExpressionStatement(BuiltIn("DICE", [String("hello")]))]), ValStr("hello"), "hello\n"),
|
||||
('DIC("hello") // this is ignored', Program([], [ExpressionStatement(BuiltIn("DIC", [String("hello")]))]), ValStr("hello"), "hello\n"),
|
||||
# line comment on its own line before code
|
||||
('// ignored\nDICE("hi")', Program([], [ExpressionStatement(BuiltIn("DICE", [String("hi")]))]), ValStr("hi"), "hi\n"),
|
||||
('// ignored\nDIC("hi")', Program([], [ExpressionStatement(BuiltIn("DIC", [String("hi")]))]), ValStr("hi"), "hi\n"),
|
||||
# inline block comment
|
||||
('DICE(/* ignored */ "hi")', Program([], [ExpressionStatement(BuiltIn("DICE", [String("hi")]))]), ValStr("hi"), "hi\n"),
|
||||
('DIC(/* ignored */ "hi")', Program([], [ExpressionStatement(BuiltIn("DIC", [String("hi")]))]), ValStr("hi"), "hi\n"),
|
||||
# block comment spanning multiple lines
|
||||
('/* line one\nline two */\nDICE("hi")', Program([], [ExpressionStatement(BuiltIn("DICE", [String("hi")]))]), ValStr("hi"), "hi\n"),
|
||||
('/* line one\nline two */\nDIC("hi")', Program([], [ExpressionStatement(BuiltIn("DIC", [String("hi")]))]), ValStr("hi"), "hi\n"),
|
||||
# block comment mid-expression
|
||||
("II /* ignored */ + III", Program([], [ExpressionStatement(BinOp(Numeral("II"), Numeral("III"), "SYMBOL_PLUS"))]), ValInt(5)),
|
||||
# line comment after expression (no output)
|
||||
@@ -1688,7 +1688,7 @@ comment_tests = [
|
||||
# division still works (/ token not confused with //)
|
||||
("X / II", Program([], [ExpressionStatement(BinOp(Numeral("X"), Numeral("II"), "SYMBOL_DIVIDE"))]), ValInt(5)),
|
||||
# multiple line comments
|
||||
('// first\n// second\nDICE("ok")', Program([], [ExpressionStatement(BuiltIn("DICE", [String("ok")]))]), ValStr("ok"), "ok\n"),
|
||||
('// first\n// second\nDIC("ok")', Program([], [ExpressionStatement(BuiltIn("DIC", [String("ok")]))]), ValStr("ok"), "ok\n"),
|
||||
# comment-only line between two statements
|
||||
('DESIGNA x VT I\n// set y\nDESIGNA y VT II\nx + y',
|
||||
Program([], [Designa(ID("x"), Numeral("I")), Designa(ID("y"), Numeral("II")), ExpressionStatement(BinOp(ID("x"), ID("y"), "SYMBOL_PLUS"))]),
|
||||
@@ -1716,13 +1716,13 @@ scope_tests = [
|
||||
("SI VERITAS TVNC { DESIGNA r VT X }\nr",
|
||||
Program([], [SiStatement(Bool(True), [Designa(ID("r"), Numeral("X"))], None), ExpressionStatement(ID("r"))]),
|
||||
ValInt(10)),
|
||||
# SI: variable assigned in ALVID branch persists in outer scope
|
||||
("SI FALSITAS TVNC { DESIGNA r VT X } ALVID { DESIGNA r VT V }\nr",
|
||||
# SI: variable assigned in ALIVD branch persists in outer scope
|
||||
("SI FALSITAS TVNC { DESIGNA r VT X } ALIVD { DESIGNA r VT V }\nr",
|
||||
Program([], [SiStatement(Bool(False), [Designa(ID("r"), Numeral("X"))], [Designa(ID("r"), Numeral("V"))]), ExpressionStatement(ID("r"))]),
|
||||
ValInt(5)),
|
||||
# DVM: variable assigned in body persists after loop exits
|
||||
# x goes 1→2→3→4→5; r tracks x each iteration; loop exits when x==5
|
||||
("DESIGNA x VT I\nDVM x EST V FACE { DESIGNA x VT x + I\nDESIGNA r VT x }\nr",
|
||||
("DESIGNA x VT I\nDVM x EST V FAC { DESIGNA x VT x + I\nDESIGNA r VT x }\nr",
|
||||
Program([], [
|
||||
Designa(ID("x"), Numeral("I")),
|
||||
DumStatement(BinOp(ID("x"), Numeral("V"), "KEYWORD_EST"), [
|
||||
@@ -1733,7 +1733,7 @@ scope_tests = [
|
||||
]),
|
||||
ValInt(5)),
|
||||
# PER: loop variable holds last array element after loop (no ERVMPE)
|
||||
("PER i IN [I, II, III] FACE { DESIGNA nop VT I }\ni",
|
||||
("PER i IN [I, II, III] FAC { DESIGNA nop VT I }\ni",
|
||||
Program([], [
|
||||
PerStatement(DataArray([Numeral("I"), Numeral("II"), Numeral("III")]), ID("i"), [Designa(ID("nop"), Numeral("I"))]),
|
||||
ExpressionStatement(ID("i")),
|
||||
@@ -1741,7 +1741,7 @@ scope_tests = [
|
||||
ValInt(3)),
|
||||
# PER: reassigning loop var in body doesn't prevent remaining iterations from running
|
||||
# cnt increments once per iteration (all 3); C=100 doesn't replace next element assignment
|
||||
("DESIGNA cnt VT I\nPER i IN [I, II, III] FACE { DESIGNA i VT C\nDESIGNA cnt VT cnt + I }\ncnt",
|
||||
("DESIGNA cnt VT I\nPER i IN [I, II, III] FAC { DESIGNA i VT C\nDESIGNA cnt VT cnt + I }\ncnt",
|
||||
Program([], [
|
||||
Designa(ID("cnt"), Numeral("I")),
|
||||
PerStatement(DataArray([Numeral("I"), Numeral("II"), Numeral("III")]), ID("i"), [
|
||||
@@ -1753,7 +1753,7 @@ scope_tests = [
|
||||
ValInt(4)),
|
||||
# PER: loop var after loop reflects the last body assignment, not the last array element
|
||||
# body sets i=C=100 on every iteration; after loop ends, i stays at 100
|
||||
("PER i IN [I, II, III] FACE { DESIGNA i VT C }\ni",
|
||||
("PER i IN [I, II, III] FAC { DESIGNA i VT C }\ni",
|
||||
Program([], [
|
||||
PerStatement(DataArray([Numeral("I"), Numeral("II"), Numeral("III")]), ID("i"), [Designa(ID("i"), Numeral("C"))]),
|
||||
ExpressionStatement(ID("i")),
|
||||
@@ -1761,7 +1761,7 @@ scope_tests = [
|
||||
ValInt(100)),
|
||||
# DONICVM: counter holds last range value after loop ends
|
||||
# [I VSQVE IV] = [1,2,3,4]; last value assigned by loop is IV=4
|
||||
("DONICVM i VT I VSQVE IV FACE { DESIGNA nop VT I }\ni",
|
||||
("DONICVM i VT I VSQVE IV FAC { DESIGNA nop VT I }\ni",
|
||||
Program([], [
|
||||
PerStatement(DataRangeArray(Numeral("I"), Numeral("IV")), ID("i"), [Designa(ID("nop"), Numeral("I"))]),
|
||||
ExpressionStatement(ID("i")),
|
||||
@@ -1769,7 +1769,7 @@ scope_tests = [
|
||||
ValInt(4)),
|
||||
# DONICVM: reassigning counter inside body doesn't reduce the number of iterations
|
||||
# range [I VSQVE IV] evaluated once; i reset each time; cnt still increments 4 times → 5
|
||||
("DESIGNA cnt VT I\nDONICVM i VT I VSQVE IV FACE { DESIGNA cnt VT cnt + I\nDESIGNA i VT C }\ncnt",
|
||||
("DESIGNA cnt VT I\nDONICVM i VT I VSQVE IV FAC { DESIGNA cnt VT cnt + I\nDESIGNA i VT C }\ncnt",
|
||||
Program([], [
|
||||
Designa(ID("cnt"), Numeral("I")),
|
||||
PerStatement(DataRangeArray(Numeral("I"), Numeral("IV")), ID("i"), [
|
||||
@@ -1780,7 +1780,7 @@ scope_tests = [
|
||||
]),
|
||||
ValInt(5)),
|
||||
# DONICVM: ERVMPE exits loop early; counter persists at break value
|
||||
("DONICVM i VT I VSQVE X FACE {\nSI i EST III TVNC { ERVMPE }\n}\ni",
|
||||
("DONICVM i VT I VSQVE X FAC {\nSI i EST III TVNC { ERVMPE }\n}\ni",
|
||||
Program([], [
|
||||
PerStatement(DataRangeArray(Numeral("I"), Numeral("X")), ID("i"), [
|
||||
SiStatement(BinOp(ID("i"), Numeral("III"), "KEYWORD_EST"), [Erumpe()], None),
|
||||
@@ -1956,9 +1956,9 @@ fractio_tests = [
|
||||
ValFrac(Fraction(0))
|
||||
),
|
||||
# String concatenation with fraction
|
||||
("CVM FRACTIO\nDICE(IIIS & \"!\")",
|
||||
("CVM FRACTIO\nDIC(IIIS & \"!\")",
|
||||
Program([ModuleCall("FRACTIO")], [
|
||||
ExpressionStatement(BuiltIn("DICE", [BinOp(Fractio("IIIS"), String("!"), "SYMBOL_AMPERSAND")]))
|
||||
ExpressionStatement(BuiltIn("DIC", [BinOp(Fractio("IIIS"), String("!"), "SYMBOL_AMPERSAND")]))
|
||||
]),
|
||||
ValStr("IIIS!"), "IIIS!\n"
|
||||
),
|
||||
@@ -2216,7 +2216,7 @@ class TestDictBuiltins(unittest.TestCase):
|
||||
|
||||
dict_iteration_tests = [
|
||||
# PER iterates over keys
|
||||
('DESIGNA r VT ""\nPER k IN TABVLA {"a" VT I, "b" VT II} FACE {\nDESIGNA r VT r & k\n}\nr',
|
||||
('DESIGNA r VT ""\nPER k IN TABVLA {"a" VT I, "b" VT II} FAC {\nDESIGNA r VT r & k\n}\nr',
|
||||
Program([], [
|
||||
Designa(ID("r"), String("")),
|
||||
PerStatement(
|
||||
@@ -2236,17 +2236,17 @@ class TestDictIteration(unittest.TestCase):
|
||||
|
||||
|
||||
dict_display_tests = [
|
||||
# DICE on dict
|
||||
('DICE(TABVLA {"a" VT I})',
|
||||
Program([], [ExpressionStatement(BuiltIn("DICE", [DataDict([(String("a"), Numeral("I"))])]))]),
|
||||
# DIC on dict
|
||||
('DIC(TABVLA {"a" VT I})',
|
||||
Program([], [ExpressionStatement(BuiltIn("DIC", [DataDict([(String("a"), Numeral("I"))])]))]),
|
||||
ValStr("{a VT I}"), "{a VT I}\n"),
|
||||
# DICE on multi-entry dict
|
||||
('DICE(TABVLA {"a" VT I, "b" VT II})',
|
||||
Program([], [ExpressionStatement(BuiltIn("DICE", [DataDict([(String("a"), Numeral("I")), (String("b"), Numeral("II"))])]))]),
|
||||
# DIC on multi-entry dict
|
||||
('DIC(TABVLA {"a" VT I, "b" VT II})',
|
||||
Program([], [ExpressionStatement(BuiltIn("DIC", [DataDict([(String("a"), Numeral("I")), (String("b"), Numeral("II"))])]))]),
|
||||
ValStr("{a VT I, b VT II}"), "{a VT I, b VT II}\n"),
|
||||
# DICE on empty dict
|
||||
('DICE(TABVLA {})',
|
||||
Program([], [ExpressionStatement(BuiltIn("DICE", [DataDict([])]))]),
|
||||
# DIC on empty dict
|
||||
('DIC(TABVLA {})',
|
||||
Program([], [ExpressionStatement(BuiltIn("DIC", [DataDict([])]))]),
|
||||
ValStr("{}"), "{}\n"),
|
||||
]
|
||||
|
||||
@@ -2348,12 +2348,12 @@ fvnctio_tests = [
|
||||
]),
|
||||
ValInt(6),
|
||||
),
|
||||
# DICE on a function value
|
||||
# DIC on a function value
|
||||
(
|
||||
"DESIGNA f VT FVNCTIO (x) VT { REDI (x) }\nDICE(f)",
|
||||
"DESIGNA f VT FVNCTIO (x) VT { REDI (x) }\nDIC(f)",
|
||||
Program([], [
|
||||
Designa(ID("f"), Fvnctio([ID("x")], [Redi([ID("x")])])),
|
||||
ExpressionStatement(BuiltIn("DICE", [ID("f")])),
|
||||
ExpressionStatement(BuiltIn("DIC", [ID("f")])),
|
||||
]),
|
||||
ValStr("FVNCTIO"),
|
||||
"FVNCTIO\n",
|
||||
@@ -2531,7 +2531,7 @@ class TestScripta(unittest.TestCase):
|
||||
with tempfile.NamedTemporaryFile(suffix=".txt", delete=False) as f:
|
||||
path = f.name
|
||||
try:
|
||||
source = f'CVM SCRIPTA\nSCRIBE("{path}", "SALVE MVNDE")\nDICE(LEGE("{path}"))'
|
||||
source = f'CVM SCRIPTA\nSCRIBE("{path}", "SALVE MVNDE")\nDIC(LEGE("{path}"))'
|
||||
program = self._run_scripta(source)
|
||||
captured = StringIO()
|
||||
with patch("sys.stdout", captured):
|
||||
@@ -2547,7 +2547,7 @@ class TestScripta(unittest.TestCase):
|
||||
with tempfile.NamedTemporaryFile(suffix=".txt", delete=False) as f:
|
||||
path = f.name
|
||||
try:
|
||||
source = f'CVM SCRIPTA\nSCRIBE("{path}", "SALVE MVNDE")\nDICE(LEGE("{path}"))'
|
||||
source = f'CVM SCRIPTA\nSCRIBE("{path}", "SALVE MVNDE")\nDIC(LEGE("{path}"))'
|
||||
program = self._run_scripta(source)
|
||||
output = self._compile_and_run(program)
|
||||
self.assertEqual(output, "SALVE MVNDE\n")
|
||||
@@ -2561,7 +2561,7 @@ class TestScripta(unittest.TestCase):
|
||||
with tempfile.NamedTemporaryFile(suffix=".txt", delete=False) as f:
|
||||
path = f.name
|
||||
try:
|
||||
source = f'CVM SCRIPTA\nSCRIBE("{path}", "SALVE")\nADIVNGE("{path}", " MVNDE")\nDICE(LEGE("{path}"))'
|
||||
source = f'CVM SCRIPTA\nSCRIBE("{path}", "SALVE")\nADIVNGE("{path}", " MVNDE")\nDIC(LEGE("{path}"))'
|
||||
program = self._run_scripta(source)
|
||||
captured = StringIO()
|
||||
with patch("sys.stdout", captured):
|
||||
@@ -2575,7 +2575,7 @@ class TestScripta(unittest.TestCase):
|
||||
with tempfile.NamedTemporaryFile(suffix=".txt", delete=False) as f:
|
||||
path = f.name
|
||||
try:
|
||||
source = f'CVM SCRIPTA\nSCRIBE("{path}", "SALVE")\nADIVNGE("{path}", " MVNDE")\nDICE(LEGE("{path}"))'
|
||||
source = f'CVM SCRIPTA\nSCRIBE("{path}", "SALVE")\nADIVNGE("{path}", " MVNDE")\nDIC(LEGE("{path}"))'
|
||||
program = self._run_scripta(source)
|
||||
output = self._compile_and_run(program)
|
||||
self.assertEqual(output, "SALVE MVNDE\n")
|
||||
@@ -2722,7 +2722,7 @@ tempta_tests = [
|
||||
),
|
||||
# ERVMPE inside catch block (inside a loop)
|
||||
(
|
||||
"DESIGNA r VT NVLLVS\nDVM r EST I FACE {\nTEMPTA {\nDESIGNA x VT I / NVLLVS\n} CAPE e {\nDESIGNA r VT I\nERVMPE\n}\n}\nr",
|
||||
"DESIGNA r VT NVLLVS\nDVM r EST I FAC {\nTEMPTA {\nDESIGNA x VT I / NVLLVS\n} CAPE e {\nDESIGNA r VT I\nERVMPE\n}\n}\nr",
|
||||
Program([], [
|
||||
Designa(ID("r"), Nullus()),
|
||||
DumStatement(
|
||||
|
||||
Reference in New Issue
Block a user