mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-19 15:52:53 +00:00
Add Tests for ZCG cpp
This commit is contained in:
parent
31497d804c
commit
f9ef7cc35b
@ -106,6 +106,7 @@ workspace "OpenAssetTools"
|
|||||||
-- ========================
|
-- ========================
|
||||||
-- ThirdParty
|
-- ThirdParty
|
||||||
-- ========================
|
-- ========================
|
||||||
|
include "thirdparty/catch2.lua"
|
||||||
include "thirdparty/libtomcrypt.lua"
|
include "thirdparty/libtomcrypt.lua"
|
||||||
include "thirdparty/libtommath.lua"
|
include "thirdparty/libtommath.lua"
|
||||||
include "thirdparty/minilzo.lua"
|
include "thirdparty/minilzo.lua"
|
||||||
@ -115,6 +116,7 @@ include "thirdparty/zlib.lua"
|
|||||||
|
|
||||||
-- ThirdParty group: All projects that are external dependencies
|
-- ThirdParty group: All projects that are external dependencies
|
||||||
group "ThirdParty"
|
group "ThirdParty"
|
||||||
|
catch2:project()
|
||||||
libtommath:project()
|
libtommath:project()
|
||||||
libtomcrypt:project()
|
libtomcrypt:project()
|
||||||
minilzo:project()
|
minilzo:project()
|
||||||
@ -132,6 +134,7 @@ include "src/Unlinker.lua"
|
|||||||
include "src/Utils.lua"
|
include "src/Utils.lua"
|
||||||
include "src/ZoneCode.lua"
|
include "src/ZoneCode.lua"
|
||||||
include "src/ZoneCodeGenerator.lua"
|
include "src/ZoneCodeGenerator.lua"
|
||||||
|
include "src/ZoneCodeGeneratorLib.lua"
|
||||||
include "src/ZoneCodeGeneratorNew.lua"
|
include "src/ZoneCodeGeneratorNew.lua"
|
||||||
include "src/ZoneCommon.lua"
|
include "src/ZoneCommon.lua"
|
||||||
include "src/ZoneLoading.lua"
|
include "src/ZoneLoading.lua"
|
||||||
@ -147,7 +150,7 @@ group "Components"
|
|||||||
Utils:project()
|
Utils:project()
|
||||||
ZoneCode:project()
|
ZoneCode:project()
|
||||||
ZoneCodeGenerator:project()
|
ZoneCodeGenerator:project()
|
||||||
ZoneCodeGeneratorNew:project()
|
ZoneCodeGeneratorLib:project()
|
||||||
ZoneCommon:project()
|
ZoneCommon:project()
|
||||||
ZoneLoading:project()
|
ZoneLoading:project()
|
||||||
ZoneWriting:project()
|
ZoneWriting:project()
|
||||||
@ -160,6 +163,7 @@ group ""
|
|||||||
group "Tools"
|
group "Tools"
|
||||||
Linker:project()
|
Linker:project()
|
||||||
Unlinker:project()
|
Unlinker:project()
|
||||||
|
ZoneCodeGeneratorNew:project()
|
||||||
group ""
|
group ""
|
||||||
|
|
||||||
-- ========================
|
-- ========================
|
||||||
@ -167,11 +171,13 @@ group ""
|
|||||||
-- ========================
|
-- ========================
|
||||||
include "test/ObjCommonTests.lua"
|
include "test/ObjCommonTests.lua"
|
||||||
include "test/ZoneCodeGeneratorTests.lua"
|
include "test/ZoneCodeGeneratorTests.lua"
|
||||||
|
include "test/ZoneCodeGeneratorLibTests.lua"
|
||||||
include "test/ZoneCommonTests.lua"
|
include "test/ZoneCommonTests.lua"
|
||||||
|
|
||||||
-- Tests group: Unit test and other tests projects
|
-- Tests group: Unit test and other tests projects
|
||||||
group "Tests"
|
group "Tests"
|
||||||
ObjCommonTests:project()
|
ObjCommonTests:project()
|
||||||
ZoneCodeGeneratorTests:project()
|
ZoneCodeGeneratorTests:project()
|
||||||
|
ZoneCodeGeneratorLibTests:project()
|
||||||
ZoneCommonTests:project()
|
ZoneCommonTests:project()
|
||||||
group ""
|
group ""
|
43
src/ZoneCodeGeneratorLib.lua
Normal file
43
src/ZoneCodeGeneratorLib.lua
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
ZoneCodeGeneratorLib = {}
|
||||||
|
|
||||||
|
function ZoneCodeGeneratorLib:include()
|
||||||
|
if References:include(self:name()) then
|
||||||
|
includedirs {
|
||||||
|
path.join(ProjectFolder(), "ZoneCodeGeneratorLib")
|
||||||
|
}
|
||||||
|
end
|
||||||
|
Utils:include()
|
||||||
|
end
|
||||||
|
|
||||||
|
function ZoneCodeGeneratorLib:link()
|
||||||
|
if References:link(self:name()) then
|
||||||
|
links(self:name())
|
||||||
|
Utils:link()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ZoneCodeGeneratorLib:use()
|
||||||
|
dependson(self:name())
|
||||||
|
end
|
||||||
|
|
||||||
|
function ZoneCodeGeneratorLib:name()
|
||||||
|
return "ZoneCodeGeneratorLib"
|
||||||
|
end
|
||||||
|
|
||||||
|
function ZoneCodeGeneratorLib:project()
|
||||||
|
References:reset()
|
||||||
|
local folder = ProjectFolder();
|
||||||
|
|
||||||
|
project(self:name())
|
||||||
|
targetdir(TargetDirectoryLib)
|
||||||
|
location "%{wks.location}/src/%{prj.name}"
|
||||||
|
kind "StaticLib"
|
||||||
|
language "C++"
|
||||||
|
|
||||||
|
files {
|
||||||
|
path.join(folder, "ZoneCodeGeneratorLib/**.h"),
|
||||||
|
path.join(folder, "ZoneCodeGeneratorLib/**.cpp")
|
||||||
|
}
|
||||||
|
|
||||||
|
self:include()
|
||||||
|
end
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "Parsing/Impl/CommentRemovingStreamProxy.h"
|
||||||
#include "Parsing/Impl/IncludingStreamProxy.h"
|
#include "Parsing/Impl/IncludingStreamProxy.h"
|
||||||
#include "Parsing/Impl/ParserFilesystemStream.h"
|
#include "Parsing/Impl/ParserFilesystemStream.h"
|
||||||
|
|
||||||
@ -23,8 +23,14 @@ bool HeaderFileReader::ReadHeaderFile(IDataRepository* repository) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
IncludingStreamProxy includeProxy(&stream);
|
IParserLineStream* lineStream = &stream;
|
||||||
IParserLineStream* lineStream = &includeProxy;
|
|
||||||
|
IncludingStreamProxy includeProxy(lineStream);
|
||||||
|
lineStream = &includeProxy;
|
||||||
|
|
||||||
|
CommentRemovingStreamProxy commentProxy(lineStream);
|
||||||
|
lineStream = &commentProxy;
|
||||||
|
|
||||||
|
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
@ -0,0 +1,74 @@
|
|||||||
|
#include "CommentRemovingStreamProxy.h"
|
||||||
|
|
||||||
|
CommentRemovingStreamProxy::CommentRemovingStreamProxy(IParserLineStream* stream)
|
||||||
|
: m_stream(stream),
|
||||||
|
m_inside_multi_line_comment(false),
|
||||||
|
m_next_line_is_comment(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ParserLine CommentRemovingStreamProxy::NextLine()
|
||||||
|
{
|
||||||
|
auto line = m_stream->NextLine();
|
||||||
|
|
||||||
|
if (m_next_line_is_comment)
|
||||||
|
{
|
||||||
|
m_next_line_is_comment = !line.m_line.empty() && line.m_line[line.m_line.size() - 1] == '\\';
|
||||||
|
return ParserLine(line.m_filename, line.m_line_number, std::string());
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned multiLineCommentStart = 0;
|
||||||
|
for (auto i = 0u; i < line.m_line.size(); i++)
|
||||||
|
{
|
||||||
|
const auto c = line.m_line[i];
|
||||||
|
|
||||||
|
if (m_inside_multi_line_comment)
|
||||||
|
{
|
||||||
|
if (c == '*' && i + 1 < line.m_line.size() && line.m_line[i + 1] == '/')
|
||||||
|
{
|
||||||
|
line.m_line.erase(multiLineCommentStart, i + 2 - multiLineCommentStart);
|
||||||
|
multiLineCommentStart = 0;
|
||||||
|
m_inside_multi_line_comment = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(c == '/' && i + 1 < line.m_line.size())
|
||||||
|
{
|
||||||
|
const auto c1 = line.m_line[i + 1];
|
||||||
|
|
||||||
|
if (c1 == '*')
|
||||||
|
{
|
||||||
|
multiLineCommentStart = i;
|
||||||
|
m_inside_multi_line_comment = true;
|
||||||
|
}
|
||||||
|
else if(c1 == '/')
|
||||||
|
{
|
||||||
|
m_next_line_is_comment = line.m_line[line.m_line.size() - 1] == '\\';
|
||||||
|
line.m_line.erase(i);
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(m_inside_multi_line_comment)
|
||||||
|
line.m_line.erase(multiLineCommentStart);
|
||||||
|
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CommentRemovingStreamProxy::IncludeFile(const std::string& filename)
|
||||||
|
{
|
||||||
|
return m_stream->IncludeFile(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CommentRemovingStreamProxy::IsOpen() const
|
||||||
|
{
|
||||||
|
return m_stream->IsOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CommentRemovingStreamProxy::Eof() const
|
||||||
|
{
|
||||||
|
return m_stream->Eof();
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Parsing/IParserLineStream.h"
|
||||||
|
|
||||||
|
class CommentRemovingStreamProxy final : public IParserLineStream
|
||||||
|
{
|
||||||
|
IParserLineStream* const m_stream;
|
||||||
|
bool m_inside_multi_line_comment;
|
||||||
|
bool m_next_line_is_comment;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit CommentRemovingStreamProxy(IParserLineStream* stream);
|
||||||
|
|
||||||
|
ParserLine NextLine() override;
|
||||||
|
bool IncludeFile(const std::string& filename) override;
|
||||||
|
_NODISCARD bool IsOpen() const override;
|
||||||
|
_NODISCARD bool Eof() const override;
|
||||||
|
};
|
@ -1,6 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Utils/ClassUtils.h"
|
|
||||||
#include "Parsing/IParserLineStream.h"
|
#include "Parsing/IParserLineStream.h"
|
||||||
|
|
||||||
class IncludingStreamProxy final : public IParserLineStream
|
class IncludingStreamProxy final : public IParserLineStream
|
||||||
@ -10,7 +9,7 @@ class IncludingStreamProxy final : public IParserLineStream
|
|||||||
static constexpr int INCLUDE_DIRECTIVE_LENGTH = std::char_traits<char>::length(INCLUDE_DIRECTIVE);
|
static constexpr int INCLUDE_DIRECTIVE_LENGTH = std::char_traits<char>::length(INCLUDE_DIRECTIVE);
|
||||||
static constexpr int INCLUDE_DIRECTIVE_MINIMUM_TOTAL_LENGTH = INCLUDE_DIRECTIVE_LENGTH + 1 + 2; // #=+1 ""=+2
|
static constexpr int INCLUDE_DIRECTIVE_MINIMUM_TOTAL_LENGTH = INCLUDE_DIRECTIVE_LENGTH + 1 + 2; // #=+1 ""=+2
|
||||||
|
|
||||||
IParserLineStream* m_stream;
|
IParserLineStream* const m_stream;
|
||||||
|
|
||||||
_NODISCARD static bool FindIncludeDirective(const ParserLine& line, unsigned& includeDirectivePosition);
|
_NODISCARD static bool FindIncludeDirective(const ParserLine& line, unsigned& includeDirectivePosition);
|
||||||
_NODISCARD static bool ExtractIncludeFilename(const ParserLine& line, unsigned includeDirectivePosition, unsigned& filenameStartPosition, unsigned& filenameEndPosition);
|
_NODISCARD static bool ExtractIncludeFilename(const ParserLine& line, unsigned includeDirectivePosition, unsigned& filenameStartPosition, unsigned& filenameEndPosition);
|
@ -6,10 +6,13 @@ function ZoneCodeGeneratorNew:include()
|
|||||||
path.join(ProjectFolder(), "ZoneCodeGeneratorNew")
|
path.join(ProjectFolder(), "ZoneCodeGeneratorNew")
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
Utils:include()
|
||||||
end
|
end
|
||||||
|
|
||||||
function ZoneCodeGeneratorNew:link()
|
function ZoneCodeGeneratorNew:link()
|
||||||
|
if References:link(self:name()) then
|
||||||
|
links(self:name())
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function ZoneCodeGeneratorNew:use()
|
function ZoneCodeGeneratorNew:use()
|
||||||
@ -25,7 +28,7 @@ function ZoneCodeGeneratorNew:project()
|
|||||||
local folder = ProjectFolder();
|
local folder = ProjectFolder();
|
||||||
|
|
||||||
project(self:name())
|
project(self:name())
|
||||||
targetdir(TargetDirectoryLib)
|
targetdir(TargetDirectoryBin)
|
||||||
location "%{wks.location}/src/%{prj.name}"
|
location "%{wks.location}/src/%{prj.name}"
|
||||||
kind "ConsoleApp"
|
kind "ConsoleApp"
|
||||||
language "C++"
|
language "C++"
|
||||||
@ -34,9 +37,15 @@ function ZoneCodeGeneratorNew:project()
|
|||||||
path.join(folder, "ZoneCodeGeneratorNew/**.h"),
|
path.join(folder, "ZoneCodeGeneratorNew/**.h"),
|
||||||
path.join(folder, "ZoneCodeGeneratorNew/**.cpp")
|
path.join(folder, "ZoneCodeGeneratorNew/**.cpp")
|
||||||
}
|
}
|
||||||
|
vpaths {
|
||||||
|
["*"] = {
|
||||||
|
path.join(folder, "ZoneCodeGeneratorNew"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self:include()
|
self:include()
|
||||||
Utils:include()
|
ZoneCodeGeneratorLib:include()
|
||||||
|
|
||||||
Utils:link()
|
Utils:link()
|
||||||
|
ZoneCodeGeneratorLib:link()
|
||||||
end
|
end
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Parsing/IParserLineStream.h"
|
|
||||||
|
|
||||||
class CommentRemovingStreamProxy final : IParserLineStream
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
std::string NextLine() override;
|
|
||||||
bool IncludeFile(const std::string& filename) override;
|
|
||||||
bool IsOpen() const override;
|
|
||||||
_NODISCARD bool Eof() const override;
|
|
||||||
};
|
|
51
test/ZoneCodeGeneratorLibTests.lua
Normal file
51
test/ZoneCodeGeneratorLibTests.lua
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
ZoneCodeGeneratorLibTests = {}
|
||||||
|
|
||||||
|
function ZoneCodeGeneratorLibTests:include()
|
||||||
|
if References:include(self:name()) then
|
||||||
|
includedirs {
|
||||||
|
path.join(TestFolder(), "ZoneCodeGeneratorLibTests")
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ZoneCodeGeneratorLibTests:link()
|
||||||
|
if References:link(self:name()) then
|
||||||
|
links(self:name())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ZoneCodeGeneratorLibTests:use()
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function ZoneCodeGeneratorLibTests:name()
|
||||||
|
return "ZoneCodeGeneratorLibTests"
|
||||||
|
end
|
||||||
|
|
||||||
|
function ZoneCodeGeneratorLibTests:project()
|
||||||
|
References:reset()
|
||||||
|
local folder = TestFolder();
|
||||||
|
|
||||||
|
project(self:name())
|
||||||
|
targetdir(TargetDirectoryTest)
|
||||||
|
location "%{wks.location}/test/%{prj.name}"
|
||||||
|
kind "ConsoleApp"
|
||||||
|
language "C++"
|
||||||
|
|
||||||
|
files {
|
||||||
|
path.join(folder, "ZoneCodeGeneratorLibTests/**.h"),
|
||||||
|
path.join(folder, "ZoneCodeGeneratorLibTests/**.cpp")
|
||||||
|
}
|
||||||
|
|
||||||
|
vpaths {
|
||||||
|
["*"] = {
|
||||||
|
path.join(folder, "ZoneCodeGeneratorLibTests"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self:include()
|
||||||
|
ZoneCodeGeneratorLib:include()
|
||||||
|
catch2:include()
|
||||||
|
|
||||||
|
ZoneCodeGeneratorLib:link()
|
||||||
|
end
|
@ -0,0 +1,227 @@
|
|||||||
|
#include <catch2/catch.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
#include "Parsing/Impl/CommentRemovingStreamProxy.h"
|
||||||
|
#include "Parsing/Mock/MockParserLineStream.h"
|
||||||
|
|
||||||
|
namespace test::parsing
|
||||||
|
{
|
||||||
|
TEST_CASE("CommentRemovingStreamProxy: Ensure simple single line comment is working", "[parsing][parsingstream]")
|
||||||
|
{
|
||||||
|
const std::vector<std::string> lines
|
||||||
|
{
|
||||||
|
"// hello",
|
||||||
|
"prefix // test",
|
||||||
|
"t//est"
|
||||||
|
};
|
||||||
|
|
||||||
|
MockParserLineStream mockStream(lines);
|
||||||
|
CommentRemovingStreamProxy proxy(&mockStream);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 1);
|
||||||
|
REQUIRE(line.m_line.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 2);
|
||||||
|
REQUIRE(line.m_line == "prefix ");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 3);
|
||||||
|
REQUIRE(line.m_line == "t");
|
||||||
|
}
|
||||||
|
|
||||||
|
REQUIRE(proxy.Eof());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("CommentRemovingStreamProxy: Ensure single line comment expands to next line on backslash", "[parsing][parsingstream]")
|
||||||
|
{
|
||||||
|
const std::vector<std::string> lines
|
||||||
|
{
|
||||||
|
"// hello\\",
|
||||||
|
"this should still be a comment",
|
||||||
|
"this should not be a comment anymore"
|
||||||
|
};
|
||||||
|
|
||||||
|
MockParserLineStream mockStream(lines);
|
||||||
|
CommentRemovingStreamProxy proxy(&mockStream);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 1);
|
||||||
|
REQUIRE(line.m_line.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 2);
|
||||||
|
REQUIRE(line.m_line.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 3);
|
||||||
|
REQUIRE(line.m_line == "this should not be a comment anymore");
|
||||||
|
}
|
||||||
|
|
||||||
|
REQUIRE(proxy.Eof());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("CommentRemovingStreamProxy: Ensure single line comment expands to next line on backslash and is repeatable", "[parsing][parsingstream]")
|
||||||
|
{
|
||||||
|
const std::vector<std::string> lines
|
||||||
|
{
|
||||||
|
"// hello\\",
|
||||||
|
"this should still be a comment \\",
|
||||||
|
"this as well",
|
||||||
|
"this not anymore"
|
||||||
|
};
|
||||||
|
|
||||||
|
MockParserLineStream mockStream(lines);
|
||||||
|
CommentRemovingStreamProxy proxy(&mockStream);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 1);
|
||||||
|
REQUIRE(line.m_line.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 2);
|
||||||
|
REQUIRE(line.m_line.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 3);
|
||||||
|
REQUIRE(line.m_line.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 4);
|
||||||
|
REQUIRE(line.m_line == "this not anymore");
|
||||||
|
}
|
||||||
|
|
||||||
|
REQUIRE(proxy.Eof());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("CommentRemovingStreamProxy: Ensure backslash must be last character to expand single line comment to next line", "[parsing][parsingstream]")
|
||||||
|
{
|
||||||
|
const std::vector<std::string> lines
|
||||||
|
{
|
||||||
|
"// hello\\",
|
||||||
|
"this should still be a comment \\ ",
|
||||||
|
"this not anymore"
|
||||||
|
};
|
||||||
|
|
||||||
|
MockParserLineStream mockStream(lines);
|
||||||
|
CommentRemovingStreamProxy proxy(&mockStream);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 1);
|
||||||
|
REQUIRE(line.m_line.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 2);
|
||||||
|
REQUIRE(line.m_line.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 3);
|
||||||
|
REQUIRE(line.m_line == "this not anymore");
|
||||||
|
}
|
||||||
|
|
||||||
|
REQUIRE(proxy.Eof());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("CommentRemovingStreamProxy: Ensure simple multiline comment works on one line", "[parsing][parsingstream]")
|
||||||
|
{
|
||||||
|
const std::vector<std::string> lines
|
||||||
|
{
|
||||||
|
"hello/* hell*/ world",
|
||||||
|
"/*this should be a comment*/",
|
||||||
|
"Hello /*asdf*/",
|
||||||
|
"/*asdf*/World"
|
||||||
|
};
|
||||||
|
|
||||||
|
MockParserLineStream mockStream(lines);
|
||||||
|
CommentRemovingStreamProxy proxy(&mockStream);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 1);
|
||||||
|
REQUIRE(line.m_line == "hello world");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 2);
|
||||||
|
REQUIRE(line.m_line.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 3);
|
||||||
|
REQUIRE(line.m_line == "Hello ");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 4);
|
||||||
|
REQUIRE(line.m_line == "World");
|
||||||
|
}
|
||||||
|
|
||||||
|
REQUIRE(proxy.Eof());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("CommentRemovingStreamProxy: Ensure simple multiline comment works over multiple lines", "[parsing][parsingstream]")
|
||||||
|
{
|
||||||
|
const std::vector<std::string> lines
|
||||||
|
{
|
||||||
|
"hello/* hell",
|
||||||
|
" hell*/ world/*nope",
|
||||||
|
"notatall",
|
||||||
|
"hehe*/xd"
|
||||||
|
};
|
||||||
|
|
||||||
|
MockParserLineStream mockStream(lines);
|
||||||
|
CommentRemovingStreamProxy proxy(&mockStream);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 1);
|
||||||
|
REQUIRE(line.m_line == "hello");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 2);
|
||||||
|
REQUIRE(line.m_line == " world");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 3);
|
||||||
|
REQUIRE(line.m_line.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto line = proxy.NextLine();
|
||||||
|
REQUIRE(line.m_line_number == 4);
|
||||||
|
REQUIRE(line.m_line == "xd");
|
||||||
|
}
|
||||||
|
|
||||||
|
REQUIRE(proxy.Eof());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
#include "MockParserLineStream.h"
|
||||||
|
|
||||||
|
const std::string MockParserLineStream::MOCK_FILENAME;
|
||||||
|
|
||||||
|
MockParserLineStream::MockParserLineStream(const std::vector<std::string>& lines)
|
||||||
|
: m_lines(lines),
|
||||||
|
m_line(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ParserLine MockParserLineStream::NextLine()
|
||||||
|
{
|
||||||
|
if(m_line < m_lines.size())
|
||||||
|
{
|
||||||
|
const auto line = m_line++;
|
||||||
|
return ParserLine(MOCK_FILENAME, line + 1, m_lines[line]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ParserLine(MOCK_FILENAME, 0, std::string());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MockParserLineStream::IncludeFile(const std::string& filename)
|
||||||
|
{
|
||||||
|
m_includes.push_back(filename);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MockParserLineStream::IsOpen() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MockParserLineStream::Eof() const
|
||||||
|
{
|
||||||
|
return m_line >= m_lines.size();
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user