roza/tests/Compiler.cpp

62 lines
1.3 KiB
C++
Raw Permalink Normal View History

2023-08-30 18:06:26 +00:00
#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};
2023-09-01 20:38:12 +00:00
auto sym = std::make_shared<roza::SymTable>();
2023-08-30 18:06:26 +00:00
lexer.scan(source);
auto node = parser.parse();
2023-09-01 20:38:12 +00:00
return compiler.compile(node, sym);
2023-08-30 18:06:26 +00:00
}
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 ");
2023-08-30 22:31:19 +00:00
REQUIRE(1 == prog->size());
2023-08-30 18:06:26 +00:00
test_prog(prog, 0, roza::OP_PUSH_CONST, 0);
}