🐐 TEMPTA/CAPE
This commit is contained in:
122
tests.py
122
tests.py
@@ -15,8 +15,8 @@ from centvrion.ast_nodes import (
|
||||
Defini, Continva, Designa, DesignaDestructure, DesignaIndex, DumStatement,
|
||||
Erumpe, ExpressionStatement, Fvnctio, ID, InterpolatedString, Invoca,
|
||||
ModuleCall, Nullus, Numeral, PerStatement, Program, Redi, SiStatement,
|
||||
String, UnaryMinus, UnaryNot, Fractio, frac_to_fraction, fraction_to_frac,
|
||||
num_to_int, int_to_num, make_string,
|
||||
String, TemptaStatement, UnaryMinus, UnaryNot, Fractio, frac_to_fraction,
|
||||
fraction_to_frac, num_to_int, int_to_num, make_string,
|
||||
)
|
||||
from centvrion.compiler.emitter import compile_program
|
||||
from centvrion.errors import CentvrionError
|
||||
@@ -686,6 +686,7 @@ error_tests = [
|
||||
("CVM FRACTIO\n[I, II, III][IIIS VSQVE III]", CentvrionError), # slice with fractional lower bound
|
||||
("CVM FRACTIO\n[I, II, III][I VSQVE IIIS]", CentvrionError), # slice with fractional upper bound
|
||||
("CVM FRACTIO\n[I, II, III][I / II VSQVE III]", CentvrionError), # slice with division-fraction lower bound
|
||||
("TEMPTA {\nDESIGNA x VT I / NVLLVS\n} CAPE e {\nDESIGNA y VT I / NVLLVS\n}", CentvrionError), # uncaught error in catch block propagates
|
||||
]
|
||||
|
||||
class TestErrors(unittest.TestCase):
|
||||
@@ -2642,5 +2643,122 @@ class TestScripta(unittest.TestCase):
|
||||
os.unlink(path)
|
||||
|
||||
|
||||
# --- Tempta/Cape (try/catch) ---
|
||||
|
||||
tempta_tests = [
|
||||
# Try block succeeds — catch not entered
|
||||
(
|
||||
"TEMPTA {\nDESIGNA r VT I\n} CAPE e {\nDESIGNA r VT II\n}\nr",
|
||||
Program([], [
|
||||
TemptaStatement(
|
||||
[Designa(ID("r"), Numeral("I"))],
|
||||
ID("e"),
|
||||
[Designa(ID("r"), Numeral("II"))],
|
||||
),
|
||||
ExpressionStatement(ID("r")),
|
||||
]),
|
||||
ValInt(1),
|
||||
),
|
||||
# Try block errors — caught by catch
|
||||
(
|
||||
"TEMPTA {\nDESIGNA r VT I / NVLLVS\n} CAPE e {\nDESIGNA r VT II\n}\nr",
|
||||
Program([], [
|
||||
TemptaStatement(
|
||||
[Designa(ID("r"), BinOp(Numeral("I"), Nullus(), "SYMBOL_DIVIDE"))],
|
||||
ID("e"),
|
||||
[Designa(ID("r"), Numeral("II"))],
|
||||
),
|
||||
ExpressionStatement(ID("r")),
|
||||
]),
|
||||
ValInt(2),
|
||||
),
|
||||
# Error variable contains the error message
|
||||
(
|
||||
'DESIGNA e VT NVLLVS\nTEMPTA {\nDESIGNA r VT I / NVLLVS\n} CAPE e {\nNVLLVS\n}\ne',
|
||||
Program([], [
|
||||
Designa(ID("e"), Nullus()),
|
||||
TemptaStatement(
|
||||
[Designa(ID("r"), BinOp(Numeral("I"), Nullus(), "SYMBOL_DIVIDE"))],
|
||||
ID("e"),
|
||||
[ExpressionStatement(Nullus())],
|
||||
),
|
||||
ExpressionStatement(ID("e")),
|
||||
]),
|
||||
ValStr("Division by zero"),
|
||||
),
|
||||
# Nested tempta — inner catches, outer unaffected
|
||||
(
|
||||
"DESIGNA r VT NVLLVS\nTEMPTA {\nTEMPTA {\nDESIGNA r VT I / NVLLVS\n} CAPE e {\nDESIGNA r VT I\n}\n} CAPE e {\nDESIGNA r VT II\n}\nr",
|
||||
Program([], [
|
||||
Designa(ID("r"), Nullus()),
|
||||
TemptaStatement(
|
||||
[TemptaStatement(
|
||||
[Designa(ID("r"), BinOp(Numeral("I"), Nullus(), "SYMBOL_DIVIDE"))],
|
||||
ID("e"),
|
||||
[Designa(ID("r"), Numeral("I"))],
|
||||
)],
|
||||
ID("e"),
|
||||
[Designa(ID("r"), Numeral("II"))],
|
||||
),
|
||||
ExpressionStatement(ID("r")),
|
||||
]),
|
||||
ValInt(1),
|
||||
),
|
||||
# REDI inside catch block
|
||||
(
|
||||
"DEFINI f () VT {\nTEMPTA {\nDESIGNA x VT I / NVLLVS\n} CAPE e {\nREDI (III)\n}\nREDI (IV)\n}\nINVOCA f ()",
|
||||
Program([], [
|
||||
Defini(ID("f"), [], [
|
||||
TemptaStatement(
|
||||
[Designa(ID("x"), BinOp(Numeral("I"), Nullus(), "SYMBOL_DIVIDE"))],
|
||||
ID("e"),
|
||||
[Redi([Numeral("III")])],
|
||||
),
|
||||
Redi([Numeral("IV")]),
|
||||
]),
|
||||
ExpressionStatement(Invoca(ID("f"), [])),
|
||||
]),
|
||||
ValInt(3),
|
||||
),
|
||||
# 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",
|
||||
Program([], [
|
||||
Designa(ID("r"), Nullus()),
|
||||
DumStatement(
|
||||
BinOp(ID("r"), Numeral("I"), "KEYWORD_EST"),
|
||||
[TemptaStatement(
|
||||
[Designa(ID("x"), BinOp(Numeral("I"), Nullus(), "SYMBOL_DIVIDE"))],
|
||||
ID("e"),
|
||||
[Designa(ID("r"), Numeral("I")), Erumpe()],
|
||||
)],
|
||||
),
|
||||
ExpressionStatement(ID("r")),
|
||||
]),
|
||||
ValInt(1),
|
||||
),
|
||||
# Statement after error in try block is not executed
|
||||
(
|
||||
"DESIGNA r VT NVLLVS\nTEMPTA {\nDESIGNA x VT I / NVLLVS\nDESIGNA r VT III\n} CAPE e {\nDESIGNA r VT II\n}\nr",
|
||||
Program([], [
|
||||
Designa(ID("r"), Nullus()),
|
||||
TemptaStatement(
|
||||
[Designa(ID("x"), BinOp(Numeral("I"), Nullus(), "SYMBOL_DIVIDE")),
|
||||
Designa(ID("r"), Numeral("III"))],
|
||||
ID("e"),
|
||||
[Designa(ID("r"), Numeral("II"))],
|
||||
),
|
||||
ExpressionStatement(ID("r")),
|
||||
]),
|
||||
ValInt(2),
|
||||
),
|
||||
]
|
||||
|
||||
class TestTempta(unittest.TestCase):
|
||||
@parameterized.expand(tempta_tests)
|
||||
def test_tempta(self, source, nodes, value, output=""):
|
||||
run_test(self, source, nodes, value, output)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user