roza/tests/Compiler.cpp

62 lines
1.3 KiB
C++

#include <catch2/catch.hpp>
#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<roza::Program> 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<roza::Program> prog,
size_t index,
roza::Opcode op,
std::optional<roza::param_t> 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(2 == prog->size());
test_prog(prog, 0, roza::OP_PUSH_CONST, 0);
test_prog(prog, 1, roza::OP_POP);
}