62 lines
1.3 KiB
C++
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};
|
|
auto sym = std::make_shared<roza::SymTable>();
|
|
|
|
lexer.scan(source);
|
|
auto node = parser.parse();
|
|
return compiler.compile(node, sym);
|
|
}
|
|
|
|
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(1 == prog->size());
|
|
|
|
test_prog(prog, 0, roza::OP_PUSH_CONST, 0);
|
|
}
|