#include #include "../lib/Lexer.hpp" #include "../lib/Parser.hpp" #include "../lib/Compiler.hpp" #include "lib/Program.hpp" #include "lib/opcodes.hpp" class CompilerTest { public: explicit CompilerTest() {} virtual ~CompilerTest() {} std::shared_ptr get_prog(std::string const& source) { roza::SrcLoc loc {"compiler_tests"}; roza::StatusLog log; roza::Lexer lexer {log, loc}; roza::Parser parser {lexer, log}; roza::Compiler compiler {log}; lexer.scan(source); auto node = parser.parse(); return compiler.compile(node); } void compile_err(std::string const& source) { REQUIRE_THROWS(get_prog(source)); } void test_prog(std::shared_ptr prog, size_t index, roza::Opcode op, std::optional param = std::nullopt) { REQUIRE(index < prog->size()); REQUIRE(op == prog->opcode(index)); if (param) { REQUIRE(param == prog->param(index)); } else { REQUIRE(!param); REQUIRE(!prog->param(index)); } } protected: }; TEST_CASE_METHOD(CompilerTest, "Compiler_int") { auto prog = get_prog(" 43 "); REQUIRE(1 == prog->size()); test_prog(prog, 0, roza::OP_PUSH_CONST, 0); }