diff --git a/src/libprojectM/MilkdropPreset/PresetFileParser.cpp b/src/libprojectM/MilkdropPreset/PresetFileParser.cpp index 1d7e29da4..7978ca0d3 100644 --- a/src/libprojectM/MilkdropPreset/PresetFileParser.cpp +++ b/src/libprojectM/MilkdropPreset/PresetFileParser.cpp @@ -23,7 +23,7 @@ auto PresetFileParser::Read(std::istream& presetStream) -> bool auto fileSize = presetStream.tellg(); presetStream.seekg(0, presetStream.beg); - if (fileSize > maxFileSize) + if (static_cast(fileSize) > maxFileSize) { return false; } @@ -89,20 +89,12 @@ auto PresetFileParser::GetCode(const std::string& keyPrefix) const -> std::strin auto line = m_presetValues.at(key); - if (!line.empty()) + // Remove backtick char in shader code + if (!line.empty() && line.at(0) == '`') { - if (line.at(0) == '`') - { - // Append newline in shader code - line.erase(0, 1); - code << line << std::endl; - } - else - { - // Append a space in equation code - code << line << " "; - } + line.erase(0, 1); } + code << line << std::endl; } auto codeStr = code.str(); @@ -157,9 +149,9 @@ void PresetFileParser::ParseLine(const std::string& line) // Search for first delimiter, either space or equal auto varNameDelimiterPos = line.find_first_of(" ="); - if (varNameDelimiterPos >= line.length() || varNameDelimiterPos == 0) + if (varNameDelimiterPos == std::string::npos || varNameDelimiterPos == 0) { - // Empty line, delimiter at end of line or no delimiter found, skip. + // Empty line, delimiter at start of line or no delimiter found, skip. return; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2ee70688c..4ab1e85ed 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,2 +1,2 @@ add_subdirectory(libprojectM) -add_subdirectory(playlist) \ No newline at end of file +add_subdirectory(playlist) diff --git a/tests/FileParserTest.cpp b/tests/FileParserTest.cpp deleted file mode 100644 index e54e72429..000000000 --- a/tests/FileParserTest.cpp +++ /dev/null @@ -1,333 +0,0 @@ -#include - -#include - -static constexpr auto fileParserTestDataPath{ PROJECTM_TEST_DATA_DIR "/FileParser/" }; - -/** - * Class to make protected function accessible to tests. - */ -class FileParserMock : public FileParser -{ -public: - static void StripComment(std::string& line) - { - FileParser::StripComment(line); - } - - static void StripMultilineComment(std::string& code) - { - FileParser::StripMultilineComment(code); - } - - static void Trim(std::string& line) - { - FileParser::Trim(line); - } -}; - -TEST(FileParser, ReadEmptyFile) -{ - FileParser parser; - ASSERT_FALSE(parser.Read(std::string(fileParserTestDataPath) + "parser-empty.milk")); -} - -TEST(FileParser, ReadFileWithNullByte) -{ - FileParser parser; - ASSERT_FALSE(parser.Read(std::string(fileParserTestDataPath) + "parser-nullbyte.milk")); -} - -TEST(FileParser, ReadSimpleFile) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-simple.milk")); -} - -TEST(FileParser, GetRawPresetValues) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-simple.milk")); - - const auto& values = parser.PresetValues(); - - EXPECT_FALSE(values.empty()); -} - -TEST(FileParser, EmptyValue) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-simple.milk")); - - const auto& values = parser.PresetValues(); - - // Lines with empty values should be stored as such - ASSERT_FALSE(values.find("empty_value") == values.end()); - EXPECT_EQ(values.at("empty_value"), ""); -} - -TEST(FileParser, EmptyKey) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-simple.milk")); - - const auto& values = parser.PresetValues(); - - // Lines with empty key should be ignored - ASSERT_TRUE(values.find("value_with_space") != values.end()); - EXPECT_EQ(values.at("value_with_space"), "123"); -} - -TEST(FileParser, ValueWithSpaceDelimiter) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-simple.milk")); - - const auto& values = parser.PresetValues(); - - // Lines with empty key should be ignored - EXPECT_TRUE(values.find("empty_key") == values.end()); -} - -TEST(FileParser, ReadFileWithRepeatedKey) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-repeatedkey.milk")); - - const auto& values = parser.PresetValues(); - - ASSERT_TRUE(values.find("warp") != values.end()); - EXPECT_EQ(values.at("warp"), "0"); -} - -TEST(FileParser, GetCode) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-code.milk")); - - auto code = parser.GetCode("per_frame_"); - EXPECT_EQ(code, "r=1.0; g=1.0; b=1.0; "); -} - -TEST(FileParser, GetCodeWithGap) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-code.milk")); - - auto code = parser.GetCode("per_frame_gap_"); - EXPECT_EQ(code, "r=1.0; g=1.0; "); -} - -TEST(FileParser, GetCodeWithRepeatedLine) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-code.milk")); - - auto code = parser.GetCode("per_frame_repeat_"); - EXPECT_EQ(code, "r=1.0; g=1.0; b=1.0; "); -} - -TEST(FileParser, GetCodeTrimmed) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-code.milk")); - - auto code = parser.GetCode("per_frame_trim_"); - EXPECT_EQ(code, "r = 1.0; g = 1.0; b = 1.0; "); -} - -TEST(FileParser, GetCodeMultilineComment) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-code.milk")); - - auto code = parser.GetCode("multiline_comment_"); - EXPECT_EQ(code, "r = 1.0; b = 1.0; "); -} - -TEST(FileParser, GetCodeShaderSyntax) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-code.milk")); - - auto code = parser.GetCode("warp_"); - EXPECT_EQ(code, "r=1.0;\ng=1.0;\nb=1.0;\n"); -} - -TEST(FileParser, GetIntValid) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); - - EXPECT_EQ(parser.GetInt("nVideoEchoOrientation", 0), 3); -} - -TEST(FileParser, GetIntInvalid) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); - - EXPECT_EQ(parser.GetInt("nSomeWeirdStuff", 123), 123); -} - -TEST(FileParser, GetIntDefault) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); - - EXPECT_EQ(parser.GetInt("RandomKey", 123), 123); -} - -TEST(FileParser, GetFloatValid) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); - - EXPECT_FLOAT_EQ(parser.GetFloat("fVideoEchoAlpha", 0), 0.5f); -} - -TEST(FileParser, GetFloatInvalid) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); - - EXPECT_FLOAT_EQ(parser.GetFloat("fSomeWeirdStuff", 123.0f), 123.0f); -} - -TEST(FileParser, GetFloatDefault) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); - - EXPECT_FLOAT_EQ(parser.GetFloat("RandomKey", 123.0f), 123.0f); -} - -TEST(FileParser, GetBooleanValid) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); - - EXPECT_EQ(parser.GetBool("bAdditiveWaves", false), true); -} - -TEST(FileParser, GetBooleanInvalid) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); - - EXPECT_EQ(parser.GetBool("bSomeWeirdStuff", true), true); -} - -TEST(FileParser, GetBooleanDefault) -{ - FileParser parser; - ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); - - EXPECT_EQ(parser.GetBool("RandomKey", true), true); -} - -TEST(FileParser, StripCommentBegin) -{ - std::string line{ "// Full line comment" }; - FileParserMock::StripComment(line); - ASSERT_EQ(line, ""); -} - -TEST(FileParser, StripCommentLeadingWhitespace) -{ - std::string line{ " // Full line comment" }; - FileParserMock::StripComment(line); - ASSERT_EQ(line, " "); -} - -TEST(FileParser, StripCommentLeadingText) -{ - std::string line{ "1.005// Some value" }; - FileParserMock::StripComment(line); - ASSERT_EQ(line, "1.005"); -} - -TEST(FileParser, StripCommentEmptyComment) -{ - std::string line{ "1.005//" }; - FileParserMock::StripComment(line); - ASSERT_EQ(line, "1.005"); -} - -TEST(FileParser, StripMultiLineCommentOnlyComment) -{ - std::string code{ "/* Full line comment */" }; - FileParserMock::StripMultilineComment(code); - ASSERT_EQ(code, ""); -} - -TEST(FileParser, StripMultiLineCommentMiddleComment) -{ - std::string code{ "Some /* Middle line comment */ Text" }; - FileParserMock::StripMultilineComment(code); - ASSERT_EQ(code, "Some Text"); -} - -TEST(FileParser, StripMultiLineCommentMultipleComments) -{ - std::string code{ "Some /* Middle */ More /* line */ Nice /* comment */ Text" }; - FileParserMock::StripMultilineComment(code); - ASSERT_EQ(code, "Some More Nice Text"); -} - -TEST(FileParser, StripMultiLineCommentWithLinebreak) -{ - // Mot really a usecase as newlines are stripped, but should work. - std::string code{ "/* Multi\nline\ncomment */" }; - FileParserMock::StripMultilineComment(code); - ASSERT_EQ(code, ""); -} - -TEST(FileParser, StripMultiLineCommentWithWrongTerminatorBeginning) -{ - std::string code{ "*/ Text /* Comment with termination in front" }; - FileParserMock::StripMultilineComment(code); - ASSERT_EQ(code, "*/ Text "); -} - -TEST(FileParser, StripMultiLineCommentWithWrongTerminatorEnd) -{ - std::string code{ "Text /* Comment with two terminators */ */" }; - FileParserMock::StripMultilineComment(code); - ASSERT_EQ(code, "Text */"); -} - -TEST(FileParser, StripMultiLineCommentWithoutTerminator) -{ - std::string code{ "Text /* Comment without termination" }; - FileParserMock::StripMultilineComment(code); - ASSERT_EQ(code, "Text "); -} - -TEST(FileParser, TrimFront) -{ - std::string line{ " TEXT TEXT" }; - FileParserMock::Trim(line); - ASSERT_EQ(line, "TEXT TEXT"); -} - -TEST(FileParser, TrimBack) -{ - std::string line{ "TEXT TEXT " }; - FileParserMock::Trim(line); - ASSERT_EQ(line, "TEXT TEXT"); -} - -TEST(FileParser, TrimBoth) -{ - std::string line{ " TEXT TEXT " }; - FileParserMock::Trim(line); - ASSERT_EQ(line, "TEXT TEXT"); -} - -TEST(FileParser, TrimOtherWhitespace) -{ - std::string line{ "\t \v TEXT TEXT \r \n \f" }; - FileParserMock::Trim(line); - ASSERT_EQ(line, "TEXT TEXT"); -} diff --git a/tests/data/FileParser/parser-nullbyte.milk b/tests/data/FileParser/parser-nullbyte.milk deleted file mode 100644 index a8f388867..000000000 Binary files a/tests/data/FileParser/parser-nullbyte.milk and /dev/null differ diff --git a/tests/libprojectM/CMakeLists.txt b/tests/libprojectM/CMakeLists.txt index 78100cb88..fc4768df6 100644 --- a/tests/libprojectM/CMakeLists.txt +++ b/tests/libprojectM/CMakeLists.txt @@ -2,6 +2,7 @@ find_package(GTest 1.10 REQUIRED NO_MODULE) add_executable(projectM-unittest PCMTest.cpp + PresetFileParserTest.cpp $ $ diff --git a/tests/libprojectM/PresetFileParserTest.cpp b/tests/libprojectM/PresetFileParserTest.cpp new file mode 100644 index 000000000..15d7e76d5 --- /dev/null +++ b/tests/libprojectM/PresetFileParserTest.cpp @@ -0,0 +1,204 @@ +#include + +#include + +static constexpr auto fileParserTestDataPath{ PROJECTM_TEST_DATA_DIR "/PresetFileParser/" }; + +/** + * Class to make protected function accessible to tests. + */ +class PresetFileParserMock : public PresetFileParser +{ +public: +}; + +TEST(PresetFileParser, ReadEmptyFile) +{ + PresetFileParser parser; + ASSERT_FALSE(parser.Read(std::string(fileParserTestDataPath) + "parser-empty.milk")); +} + +TEST(PresetFileParser, ReadFileWithNullByte) +{ + PresetFileParser parser; + ASSERT_FALSE(parser.Read(std::string(fileParserTestDataPath) + "parser-nullbyte.milk")); +} + +TEST(PresetFileParser, ReadSimpleFile) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-simple.milk")); +} + +TEST(PresetFileParser, GetRawPresetValues) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-simple.milk")); + + const auto& values = parser.PresetValues(); + + EXPECT_FALSE(values.empty()); +} + +TEST(PresetFileParser, EmptyValue) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-simple.milk")); + + const auto& values = parser.PresetValues(); + + // Lines with empty values should be stored as such + ASSERT_FALSE(values.find("empty_value") == values.end()); + EXPECT_EQ(values.at("empty_value"), ""); +} + +TEST(PresetFileParser, EmptyKey) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-simple.milk")); + + const auto& values = parser.PresetValues(); + + // Lines with empty key should be ignored + ASSERT_TRUE(values.find("value_with_space") != values.end()); + EXPECT_EQ(values.at("value_with_space"), "123"); +} + +TEST(PresetFileParser, ValueWithSpaceDelimiter) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-simple.milk")); + + const auto& values = parser.PresetValues(); + + // Lines with empty key should be ignored + EXPECT_TRUE(values.find("empty_key") == values.end()); +} + +TEST(PresetFileParser, ReadFileWithRepeatedKey) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-repeatedkey.milk")); + + const auto& values = parser.PresetValues(); + + ASSERT_TRUE(values.find("warp") != values.end()); + EXPECT_EQ(values.at("warp"), "0"); +} + +TEST(PresetFileParser, GetCode) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-code.milk")); + + auto code = parser.GetCode("per_frame_"); + EXPECT_EQ(code, "r=1.0;\ng=1.0;\n\nb=1.0;\n"); +} + +TEST(PresetFileParser, GetCodeWithGap) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-code.milk")); + + auto code = parser.GetCode("per_frame_gap_"); + EXPECT_EQ(code, "r=1.0;\ng=1.0;\n"); +} + +TEST(PresetFileParser, GetCodeWithRepeatedLine) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-code.milk")); + + auto code = parser.GetCode("per_frame_repeat_"); + EXPECT_EQ(code, "r=1.0;\ng=1.0;\nb=1.0;\n"); +} + +TEST(PresetFileParser, GetCodeMultilineComment) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-code.milk")); + + auto code = parser.GetCode("multiline_comment_"); + EXPECT_EQ(code, "r = 1.0; /* Comment...\ng = 1.0;\n... ends here */b = 1.0;\n"); +} + +TEST(PresetFileParser, GetCodeShaderSyntax) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-code.milk")); + + auto code = parser.GetCode("warp_"); + EXPECT_EQ(code, "r=1.0;\ng=1.0;\nb=1.0;\n"); +} + +TEST(PresetFileParser, GetIntValid) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); + + EXPECT_EQ(parser.GetInt("nVideoEchoOrientation", 0), 3); +} + +TEST(PresetFileParser, GetIntInvalid) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); + + EXPECT_EQ(parser.GetInt("nSomeWeirdStuff", 123), 123); +} + +TEST(PresetFileParser, GetIntDefault) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); + + EXPECT_EQ(parser.GetInt("RandomKey", 123), 123); +} + +TEST(PresetFileParser, GetFloatValid) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); + + EXPECT_FLOAT_EQ(parser.GetFloat("fVideoEchoAlpha", 0), 0.5f); +} + +TEST(PresetFileParser, GetFloatInvalid) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); + + EXPECT_FLOAT_EQ(parser.GetFloat("fSomeWeirdStuff", 123.0f), 123.0f); +} + +TEST(PresetFileParser, GetFloatDefault) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); + + EXPECT_FLOAT_EQ(parser.GetFloat("RandomKey", 123.0f), 123.0f); +} + +TEST(PresetFileParser, GetBooleanValid) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); + + EXPECT_EQ(parser.GetBool("bAdditiveWaves", false), true); +} + +TEST(PresetFileParser, GetBooleanInvalid) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); + + EXPECT_EQ(parser.GetBool("bSomeWeirdStuff", true), true); +} + +TEST(PresetFileParser, GetBooleanDefault) +{ + PresetFileParser parser; + ASSERT_TRUE(parser.Read(std::string(fileParserTestDataPath) + "parser-valueconversion.milk")); + + EXPECT_EQ(parser.GetBool("RandomKey", true), true); +} diff --git a/tests/data/FileParser/parser-code.milk b/tests/libprojectM/data/PresetFileParser/parser-code.milk similarity index 100% rename from tests/data/FileParser/parser-code.milk rename to tests/libprojectM/data/PresetFileParser/parser-code.milk diff --git a/tests/data/FileParser/parser-empty.milk b/tests/libprojectM/data/PresetFileParser/parser-empty.milk similarity index 100% rename from tests/data/FileParser/parser-empty.milk rename to tests/libprojectM/data/PresetFileParser/parser-empty.milk diff --git a/tests/libprojectM/data/PresetFileParser/parser-nullbyte.milk b/tests/libprojectM/data/PresetFileParser/parser-nullbyte.milk new file mode 100644 index 000000000..23f5e8559 Binary files /dev/null and b/tests/libprojectM/data/PresetFileParser/parser-nullbyte.milk differ diff --git a/tests/data/FileParser/parser-repeatedkey.milk b/tests/libprojectM/data/PresetFileParser/parser-repeatedkey.milk similarity index 100% rename from tests/data/FileParser/parser-repeatedkey.milk rename to tests/libprojectM/data/PresetFileParser/parser-repeatedkey.milk diff --git a/tests/data/FileParser/parser-simple.milk b/tests/libprojectM/data/PresetFileParser/parser-simple.milk similarity index 96% rename from tests/data/FileParser/parser-simple.milk rename to tests/libprojectM/data/PresetFileParser/parser-simple.milk index e42868b1e..cda8d0a81 100644 --- a/tests/data/FileParser/parser-simple.milk +++ b/tests/libprojectM/data/PresetFileParser/parser-simple.milk @@ -1,7 +1,7 @@ -// Some simple assignments, with empty key or value and a space instead of an equal sign. -[preset00] -warp=0 -empty_value= -=empty_key -value_with_space 123 +// Some simple assignments, with empty key or value and a space instead of an equal sign. +[preset00] +warp=0 +empty_value= +=empty_key +value_with_space 123 // No newline at end of file! \ No newline at end of file diff --git a/tests/data/FileParser/parser-valueconversion.milk b/tests/libprojectM/data/PresetFileParser/parser-valueconversion.milk similarity index 100% rename from tests/data/FileParser/parser-valueconversion.milk rename to tests/libprojectM/data/PresetFileParser/parser-valueconversion.milk