🐐 SVBNVLLA implementation
This commit is contained in:
31
tests.py
31
tests.py
@@ -106,10 +106,10 @@ arithmetic_tests = [
|
||||
("X / III", Program([], [ExpressionStatement(BinOp(Numeral("X"), Numeral("III"), "SYMBOL_DIVIDE"))]), ValInt(3)), # integer division: 10 // 3 = 3
|
||||
("II + III * IV", Program([], [ExpressionStatement(BinOp(Numeral("II"), BinOp(Numeral("III"), Numeral("IV"), "SYMBOL_TIMES"), "SYMBOL_PLUS"))]), ValInt(14)), # precedence: 2 + (3*4) = 14
|
||||
("(II + III) * IV", Program([], [ExpressionStatement(BinOp(BinOp(Numeral("II"), Numeral("III"), "SYMBOL_PLUS"), Numeral("IV"), "SYMBOL_TIMES"))]), ValInt(20)), # parens: (2+3)*4 = 20
|
||||
("- III", Program([], [ExpressionStatement(UnaryMinus(Numeral("III")))]), ValInt(-3)), # unary negation
|
||||
("- (II + III)", Program([], [ExpressionStatement(UnaryMinus(BinOp(Numeral("II"), Numeral("III"), "SYMBOL_PLUS")))]), ValInt(-5)), # unary negation of expression
|
||||
("- - II", Program([], [ExpressionStatement(UnaryMinus(UnaryMinus(Numeral("II"))))]), ValInt(2)), # double negation
|
||||
("III + - II", Program([], [ExpressionStatement(BinOp(Numeral("III"), UnaryMinus(Numeral("II")), "SYMBOL_PLUS"))]), ValInt(1)), # unary in binary context
|
||||
("CVM SVBNVLLA\n- III", Program([ModuleCall("SVBNVLLA")], [ExpressionStatement(UnaryMinus(Numeral("III")))]), ValInt(-3)), # unary negation
|
||||
("CVM SVBNVLLA\n- (II + III)", Program([ModuleCall("SVBNVLLA")], [ExpressionStatement(UnaryMinus(BinOp(Numeral("II"), Numeral("III"), "SYMBOL_PLUS")))]), ValInt(-5)), # unary negation of expression
|
||||
("CVM SVBNVLLA\n- - II", Program([ModuleCall("SVBNVLLA")], [ExpressionStatement(UnaryMinus(UnaryMinus(Numeral("II"))))]), ValInt(2)), # double negation
|
||||
("CVM SVBNVLLA\nIII + - II", Program([ModuleCall("SVBNVLLA")], [ExpressionStatement(BinOp(Numeral("III"), UnaryMinus(Numeral("II")), "SYMBOL_PLUS"))]), ValInt(1)), # unary in binary context
|
||||
]
|
||||
|
||||
class TestArithmetic(unittest.TestCase):
|
||||
@@ -149,16 +149,16 @@ precedence_tests = [
|
||||
Program([], [ExpressionStatement(BinOp(Bool(True), BinOp(Bool(False), Bool(False), "KEYWORD_ET"), "KEYWORD_AVT"))]),
|
||||
ValBool(True)),
|
||||
# UMINUS binds tighter than *: (-2)*3 = -6, not -(2*3) = -6 (same value, different tree)
|
||||
("- II * III",
|
||||
Program([], [ExpressionStatement(BinOp(UnaryMinus(Numeral("II")), Numeral("III"), "SYMBOL_TIMES"))]),
|
||||
("CVM SVBNVLLA\n- II * III",
|
||||
Program([ModuleCall("SVBNVLLA")], [ExpressionStatement(BinOp(UnaryMinus(Numeral("II")), Numeral("III"), "SYMBOL_TIMES"))]),
|
||||
ValInt(-6)),
|
||||
# UMINUS binds tighter than +: (-2)+3 = 1, not -(2+3) = -5
|
||||
("- II + III",
|
||||
Program([], [ExpressionStatement(BinOp(UnaryMinus(Numeral("II")), Numeral("III"), "SYMBOL_PLUS"))]),
|
||||
("CVM SVBNVLLA\n- II + III",
|
||||
Program([ModuleCall("SVBNVLLA")], [ExpressionStatement(BinOp(UnaryMinus(Numeral("II")), Numeral("III"), "SYMBOL_PLUS"))]),
|
||||
ValInt(1)),
|
||||
# INDEX binds tighter than UMINUS: -(arr[I]) = -1
|
||||
("- [I, II, III][I]",
|
||||
Program([], [ExpressionStatement(UnaryMinus(ArrayIndex(DataArray([Numeral("I"), Numeral("II"), Numeral("III")]), Numeral("I"))))]),
|
||||
("CVM SVBNVLLA\n- [I, II, III][I]",
|
||||
Program([ModuleCall("SVBNVLLA")], [ExpressionStatement(UnaryMinus(ArrayIndex(DataArray([Numeral("I"), Numeral("II"), Numeral("III")]), Numeral("I"))))]),
|
||||
ValInt(-1)),
|
||||
# INDEX binds tighter than +: (arr[II]) + X = 2 + 10 = 12
|
||||
("[I, II, III][II] + X",
|
||||
@@ -376,7 +376,8 @@ error_tests = [
|
||||
("DEFINI f () VT { REDI(I) }\nINVOCA f (I)", TypeError), # args to zero-param function
|
||||
("SI NVLLVS TVNC { DESIGNA r VT I }", TypeError), # NVLLVS cannot be used as boolean
|
||||
("[I, II][III]", IndexError), # index too high
|
||||
("[I, II][-I]", IndexError), # negative index
|
||||
("CVM SVBNVLLA\n[I, II][-I]", IndexError), # negative index
|
||||
("[I, II][-I]", ValueError), # negative value
|
||||
]
|
||||
|
||||
class TestErrors(unittest.TestCase):
|
||||
@@ -455,6 +456,14 @@ class TestNumerals(unittest.TestCase):
|
||||
with self.assertRaises(Exception):
|
||||
num_to_int("IM", False)
|
||||
|
||||
def test_negative_without_svbnvlla_raises(self):
|
||||
with self.assertRaises(ValueError):
|
||||
num_to_int("-IV", False)
|
||||
|
||||
def test_negative_with_svbnvlla(self):
|
||||
self.assertEqual(num_to_int("-IV", False, True), -4)
|
||||
self.assertEqual(num_to_int("-XLII", False, True), -42)
|
||||
|
||||
# int_to_num: valid cases
|
||||
def test_int_to_num(self):
|
||||
for n, s in [(1,"I"),(4,"IV"),(9,"IX"),(40,"XL"),(42,"XLII"),(3999,"MMMCMXCIX")]:
|
||||
|
||||
Reference in New Issue
Block a user