Matcher and sequence testing stuffs

This commit is contained in:
Jan
2021-02-13 14:54:34 +01:00
parent 0f70f9586c
commit 37232e3176
36 changed files with 1070 additions and 62 deletions

View File

@ -0,0 +1,61 @@
#pragma once
#include <vector>
#include <iterator>
#include "Utils/ClassUtils.h"
#include "Parsing/ILexer.h"
template <typename TokenType>
class MockLexer final : public ILexer<TokenType>
{
// TokenType must inherit IParserValue
static_assert(std::is_base_of<IParserValue, TokenType>::value);
std::vector<TokenType> m_tokens;
//std::vector<HeaderParserValue> m_tokens;
TokenType m_eof;
int m_pop_count;
public:
MockLexer(std::initializer_list<Movable<TokenType>> tokens, TokenType eof)
: m_tokens(std::make_move_iterator(tokens.begin()), std::make_move_iterator(tokens.end())),
m_eof(std::move(eof)),
m_pop_count(0)
{
}
~MockLexer() override = default;
MockLexer(const MockLexer& other) = delete;
MockLexer(MockLexer&& other) noexcept = default;
MockLexer& operator=(const MockLexer& other) = delete;
MockLexer& operator=(MockLexer&& other) noexcept = default;
const TokenType& GetToken(const unsigned index) override
{
if (index < m_tokens.size())
return m_tokens[index];
return m_eof;
}
void PopTokens(const int amount) override
{
m_pop_count += amount;
}
bool IsEof() override
{
return !m_tokens.empty();
}
const TokenPos& GetPos() override
{
return !m_tokens.empty() ? m_tokens[0].GetPos() : m_eof.GetPos();
}
_NODISCARD int GetPopCount() const
{
return m_pop_count;
}
};

View File

@ -0,0 +1,49 @@
#pragma once
#include "Parsing/Sequence/AbstractSequence.h"
struct MockSequenceState
{
char m_dummy;
};
template<typename TokenType>
class MockSequence final : public AbstractSequence<TokenType, MockSequenceState>
{
public:
typedef AbstractSequence<TokenType, MockSequenceState> parent_t;
private:
using parent_t::AddMatchers;
using parent_t::AddLabeledMatchers;
std::function<void(SequenceResult<TokenType>&)> m_handler;
protected:
void ProcessMatch(MockSequenceState* state, SequenceResult<TokenType>& result) const override
{
if (m_handler)
m_handler(result);
}
public:
void AddMockMatchers(std::initializer_list<Movable<std::unique_ptr<typename parent_t::matcher_t>>> matchers)
{
AddMatchers(matchers);
}
void AddMockLabeledMatchers(std::initializer_list<Movable<std::unique_ptr<typename parent_t::matcher_t>>> matchers, const int label)
{
AddLabeledMatchers(matchers, label);
}
void Handle(std::function<void(SequenceResult<TokenType>&)> handler)
{
m_handler = std::move(handler);
}
IMatcherForLabelSupplier<TokenType>* GetLabelSupplier()
{
return this;
}
};