From 1d63645c32c56555ee287a2ef64adaffc33629ae Mon Sep 17 00:00:00 2001 From: Andre Wagner Date: Sat, 2 May 2026 10:04:18 -0500 Subject: [PATCH] . --- TODO.md | 2 +- src/vm/tests.cc | 69 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/TODO.md b/TODO.md index 5290a03..8afd260 100644 --- a/TODO.md +++ b/TODO.md @@ -37,7 +37,7 @@ After some additional development: - [x] String - [ ] Expressions - [x] Integer - - [ ] Float + - [x] Float - [ ] String - [ ] Local/global variables - [ ] Functions diff --git a/src/vm/tests.cc b/src/vm/tests.cc index 867a084..102c447 100644 --- a/src/vm/tests.cc +++ b/src/vm/tests.cc @@ -173,30 +173,53 @@ TEST(VM, IntegerFloatOperations) ASSERT_FLOAT_EQ(test_op(20, "3.5", "div").to_float(-1), 5.7142859); ASSERT_FLOAT_EQ(test_op(3, "3.5", "eq").to_integer(-1), 0); ASSERT_FLOAT_EQ(test_op(3, "3.0", "eq").to_integer(-1), 1); - /* - ASSERT_EQ(test_op(2, 3, "sub"), -1); - ASSERT_EQ(test_op(2, 3, "mul"), 6); - ASSERT_EQ(test_op(20, 3, "idiv"), 6); - ASSERT_EQ(test_op(2, 3, "eq"), 0); - ASSERT_EQ(test_op(2, 3, "neq"), 1); - ASSERT_EQ(test_op(2, 3, "lt"), 1); - ASSERT_EQ(test_op(2, 3, "lte"), 1); - ASSERT_EQ(test_op(3, 3, "lte"), 1); - ASSERT_EQ(test_op(4, 3, "lte"), 0); - ASSERT_EQ(test_op(2, 3, "gt"), 0); - ASSERT_EQ(test_op(2, 3, "gte"), 0); - ASSERT_EQ(test_op(3, 3, "gte"), 1); - ASSERT_EQ(test_op(4, 3, "gte"), 1); - ASSERT_EQ(test_op(2, 3, "and"), 2); - ASSERT_EQ(test_op(2, 3, "or"), 3); - ASSERT_EQ(test_op(2, 3, "xor"), 1); - ASSERT_EQ(test_op(2, 3, "pow"), 8); - ASSERT_EQ(test_op(2, 3, "shl"), 16); - ASSERT_EQ(test_op(30, 2, "shr"), 7); - ASSERT_EQ(test_op(8, 3, "mod"), 2); +} - ASSERT_FLOAT_EQ(run("pushi 3\n pushi 2\n div").to_float(-1), 1.5f); - */ +TEST(VM, FloatIntegerOperations) +{ + auto test_op = [](std::string const& op1, int op2, std::string oper) -> VM { + return VM().load_bytecode(as::Assembler(std::format(R"( + .const + 0: {} + .func 0 + pushc 0 + pushi {} + {} + ret + )", op1, op2, oper)).assemble()).call(0); + }; + + ASSERT_FLOAT_EQ(test_op("3.5", 2, "sum").to_float(-1), 5.5f); + ASSERT_FLOAT_EQ(test_op("3.5", 2, "sub").to_float(-1), 1.5f); + ASSERT_FLOAT_EQ(test_op("3.5", 2, "mul").to_float(-1), 7.f); + ASSERT_FLOAT_EQ(test_op("3.5", 2, "idiv").to_integer(-1), 1); + ASSERT_FLOAT_EQ(test_op("3.5", 2, "div").to_float(-1), 1.75f); + ASSERT_FLOAT_EQ(test_op("3.5", 3, "eq").to_integer(-1), 0); + ASSERT_FLOAT_EQ(test_op("3.0", 3, "eq").to_integer(-1), 1); +} + +TEST(VM, FloatFloatOperations) +{ + auto test_op = [](std::string const& op1, std::string const& op2, std::string oper) -> VM { + return VM().load_bytecode(as::Assembler(std::format(R"( + .const + 0: {} + 1: {} + .func 0 + pushc 0 + pushc 1 + {} + ret + )", op1, op2, oper)).assemble()).call(0); + }; + + ASSERT_FLOAT_EQ(test_op("3.5", "2.2", "sum").to_float(-1), 5.7f); + ASSERT_FLOAT_EQ(test_op("3.5", "2.2", "sub").to_float(-1), 1.3f); + ASSERT_FLOAT_EQ(test_op("3.5", "2.2", "mul").to_float(-1), 7.7f); + ASSERT_FLOAT_EQ(test_op("3.5", "2.2", "idiv").to_integer(-1), 1); + ASSERT_FLOAT_EQ(test_op("4.5", "2.5", "div").to_float(-1), 1.8f); + ASSERT_FLOAT_EQ(test_op("3.2005", "3.2", "eq").to_integer(-1), 0); + ASSERT_FLOAT_EQ(test_op("3.2", "3.2", "eq").to_integer(-1), 1); } int main(int argc, char** argv)