using smart pointers instead of normal ones for

easier setup of tests (to call setup() multiple
times without leaks)
This commit is contained in:
Karma Riuk
2025-07-11 11:16:16 +02:00
parent 826f4de77a
commit 2174781b77
7 changed files with 14 additions and 18 deletions

View File

@@ -7,6 +7,8 @@
#include <iostream> #include <iostream>
namespace lexer { namespace lexer {
lexer::lexer(std::istream& input): input(input) {}
token::token lexer::next_token() { token::token lexer::next_token() {
if (!(input >> c)) if (!(input >> c))
return {token::type::END_OF_FILE, ""}; return {token::type::END_OF_FILE, ""};

View File

@@ -6,6 +6,7 @@
namespace lexer { namespace lexer {
struct lexer { struct lexer {
lexer(std::istream&);
std::istream& input; std::istream& input;
char c = 0; char c = 0;
token::token next_token(); token::token next_token();

View File

@@ -84,8 +84,8 @@ namespace parser {
next_token()) {}; next_token()) {};
} }
ast::program* parser::parse_program() { std::unique_ptr<ast::program> parser::parse_program() {
ast::program* p = new ast::program(); std::unique_ptr<ast::program> p = std::make_unique<ast::program>();
for (; current.type != token::type::END_OF_FILE; next_token()) { for (; current.type != token::type::END_OF_FILE; next_token()) {
ast::statement* stmt = parse_statement(); ast::statement* stmt = parse_statement();

View File

@@ -11,6 +11,7 @@
#include "token/token.hpp" #include "token/token.hpp"
#include <functional> #include <functional>
#include <memory>
#include <vector> #include <vector>
namespace parser { namespace parser {
@@ -23,7 +24,7 @@ namespace parser {
~parser(); ~parser();
std::vector<ast::error::error*> errors; std::vector<ast::error::error*> errors;
ast::program* parse_program(); std::unique_ptr<ast::program> parse_program();
private: private:
lexer::lexer& lexer; lexer::lexer& lexer;

View File

@@ -7,6 +7,7 @@
#include "utils.hpp" #include "utils.hpp"
#include <doctest.h> #include <doctest.h>
#include <memory>
#include <sstream> #include <sstream>
void test_let_statement(ast::statement* stmt, const std::string name) { void test_let_statement(ast::statement* stmt, const std::string name) {
@@ -27,7 +28,7 @@ void test_failing_let_parsing(
lexer::lexer l{input}; lexer::lexer l{input};
parser::parser p{l}; parser::parser p{l};
ast::program* program = p.parse_program(); std::unique_ptr<ast::program> program = p.parse_program();
// Check for errors // Check for errors
REQUIRE(p.errors.size() == expected_types.size()); REQUIRE(p.errors.size() == expected_types.size());
@@ -45,7 +46,6 @@ void test_failing_let_parsing(
"parse_program() returned a null pointer" "parse_program() returned a null pointer"
); );
REQUIRE(program->statements.size() == n_good_statements); REQUIRE(program->statements.size() == n_good_statements);
delete program;
} }
TEST_SUITE("Parser: let") { TEST_SUITE("Parser: let") {

View File

@@ -18,8 +18,8 @@ void check_parser_errors(const std::vector<ast::error::error*>& errors) {
void ParserFixture::setup(std::string source) { void ParserFixture::setup(std::string source) {
input << source; input << source;
lexer = new lexer::lexer{input}; lexer = std::make_unique<lexer::lexer>(input);
parser = new parser::parser(*lexer); parser = std::make_unique<parser::parser>(*lexer);
program = parser->parse_program(); program = parser->parse_program();
check_parser_errors(parser->errors); check_parser_errors(parser->errors);
@@ -30,9 +30,3 @@ void ParserFixture::setup(std::string source) {
"parse_program() returned a null pointer" "parse_program() returned a null pointer"
); );
} }
ParserFixture::~ParserFixture() {
delete lexer;
delete parser;
delete program;
}

View File

@@ -52,13 +52,11 @@ T* cast(ast::error::error* err) {
struct ParserFixture { struct ParserFixture {
std::stringstream input; std::stringstream input;
lexer::lexer* lexer = nullptr; std::unique_ptr<lexer::lexer> lexer;
parser::parser* parser = nullptr; std::unique_ptr<parser::parser> parser;
ast::program* program = nullptr; std::unique_ptr<ast::program> program;
ParserFixture() = default; ParserFixture() = default;
void setup(std::string); void setup(std::string);
~ParserFixture();
}; };