Add C++ tests for the C++ API metadata types

Taken from the same files in libloot v0.26.0, with the YAML tests removed.
This commit is contained in:
Oliver Hamlet
2025-04-20 16:00:22 +01:00
parent 2ce3a6db3a
commit ed77fa9fbf
12 changed files with 3031 additions and 5 deletions
+14 -5
View File
@@ -36,7 +36,16 @@ set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_INITIAL})
set(LIBLOOT_SRC_TESTS_INTERNALS_CPP_FILES
"${CMAKE_SOURCE_DIR}/src/tests/api/internals/main.cpp")
# set(LIBLOOT_SRC_TESTS_INTERNALS_H_FILES )
set(LIBLOOT_SRC_TESTS_INTERNALS_H_FILES
"${CMAKE_SOURCE_DIR}/src/tests/api/internals/metadata/conditional_metadata_test.h"
"${CMAKE_SOURCE_DIR}/src/tests/api/internals/metadata/file_test.h"
"${CMAKE_SOURCE_DIR}/src/tests/api/internals/metadata/group_test.h"
"${CMAKE_SOURCE_DIR}/src/tests/api/internals/metadata/location_test.h"
"${CMAKE_SOURCE_DIR}/src/tests/api/internals/metadata/message_test.h"
"${CMAKE_SOURCE_DIR}/src/tests/api/internals/metadata/message_content_test.h"
"${CMAKE_SOURCE_DIR}/src/tests/api/internals/metadata/plugin_cleaning_data_test.h"
"${CMAKE_SOURCE_DIR}/src/tests/api/internals/metadata/plugin_metadata_test.h"
"${CMAKE_SOURCE_DIR}/src/tests/api/internals/metadata/tag_test.h")
set(LIBLOOT_SRC_TESTS_INTERFACE_CPP_FILES
"${CMAKE_SOURCE_DIR}/src/tests/api/interface/main.cpp")
@@ -52,9 +61,9 @@ source_group(TREE "${CMAKE_SOURCE_DIR}/src/tests/api/internals"
PREFIX "Source Files"
FILES ${LIBLOOT_SRC_TESTS_INTERNALS_CPP_FILES})
# source_group(TREE "${CMAKE_SOURCE_DIR}/src/tests/api/internals"
# PREFIX "Header Files"
# FILES ${LIBLOOT_SRC_TESTS_INTERNALS_H_FILES})
source_group(TREE "${CMAKE_SOURCE_DIR}/src/tests/api/internals"
PREFIX "Header Files"
FILES ${LIBLOOT_SRC_TESTS_INTERNALS_H_FILES})
source_group(TREE "${CMAKE_SOURCE_DIR}/src/tests/api/interface"
PREFIX "Source Files"
@@ -68,7 +77,7 @@ source_group(TREE "${CMAKE_SOURCE_DIR}/src/tests/api/interface"
set(LIBLOOT_INTERNALS_TESTS_ALL_SOURCES
${LIBLOOT_ALL_SOURCES}
${LIBLOOT_SRC_TESTS_INTERNALS_CPP_FILES}
# ${LIBLOOT_SRC_TESTS_INTERNALS_H_FILES}
${LIBLOOT_SRC_TESTS_INTERNALS_H_FILES}
"${CMAKE_SOURCE_DIR}/src/tests/common_game_test_fixture.h"
"${CMAKE_SOURCE_DIR}/src/tests/test_helpers.h"
"${CMAKE_SOURCE_DIR}/src/tests/printers.h")
+10
View File
@@ -5,6 +5,16 @@
#include "libloot-cxx/src/lib.rs.h"
#include "rust/cxx.h"
#include "tests/api/internals/metadata/conditional_metadata_test.h"
#include "tests/api/internals/metadata/file_test.h"
#include "tests/api/internals/metadata/group_test.h"
#include "tests/api/internals/metadata/location_test.h"
#include "tests/api/internals/metadata/message_content_test.h"
#include "tests/api/internals/metadata/message_test.h"
#include "tests/api/internals/metadata/plugin_cleaning_data_test.h"
#include "tests/api/internals/metadata/plugin_metadata_test.h"
#include "tests/api/internals/metadata/tag_test.h"
namespace rust {
template<typename T>
bool operator==(const Vec<T>& lhs, const Vec<T>& rhs) {
@@ -0,0 +1,267 @@
/* LOOT
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
Fallout: New Vegas.
Copyright (C) 2014-2016 WrinklyNinja
This file is part of LOOT.
LOOT is free software: you can redistribute
it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
LOOT is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LOOT. If not, see
<https://www.gnu.org/licenses/>.
*/
#ifndef LOOT_TESTS_API_INTERNALS_METADATA_CONDITION_EVALUATOR_TEST
#define LOOT_TESTS_API_INTERNALS_METADATA_CONDITION_EVALUATOR_TEST
#include "api/metadata/condition_evaluator.h"
#include "loot/exception/condition_syntax_error.h"
#include "tests/common_game_test_fixture.h"
namespace loot {
namespace test {
class ConditionEvaluatorTest : public CommonGameTestFixture,
public testing::WithParamInterface<GameType> {
protected:
ConditionEvaluatorTest() :
CommonGameTestFixture(GetParam()),
info_(std::vector<MessageContent>({
MessageContent("info"),
})),
nonAsciiEsm(u8"non\u00C1scii.esm"),
nonAsciiNestedFile(u8"non\u00C1scii/test.txt"),
game_(GetParam(), gamePath, localPath),
evaluator_(game_.GetType(), game_.DataPath()) {
// Make sure the plugin with a non-ASCII filename exists.
std::filesystem::copy_file(dataPath / blankEsm,
dataPath / std::filesystem::u8path(nonAsciiEsm));
touch(dataPath / std::filesystem::u8path(nonAsciiNestedFile));
loadInstalledPlugins();
evaluator_.RefreshLoadedPluginsState(game_.GetLoadedPlugins());
evaluator_.RefreshActivePluginsState(
game_.GetLoadOrderHandler().GetActivePlugins());
}
std::string IntToHexString(const uint32_t value) {
std::stringstream stream;
stream << std::hex << value;
return stream.str();
}
void loadInstalledPlugins() {
auto plugins = GetInstalledPlugins();
plugins.push_back(std::filesystem::u8path(nonAsciiEsm));
game_.LoadCurrentLoadOrderState();
game_.LoadPlugins(plugins, true);
}
const std::vector<MessageContent> info_;
const std::string nonAsciiEsm;
const std::string nonAsciiNestedFile;
Game game_;
ConditionEvaluator evaluator_;
};
// Pass an empty first argument, as it's a prefix for the test instantation,
// but we only have the one so no prefix is necessary.
INSTANTIATE_TEST_SUITE_P(,
ConditionEvaluatorTest,
::testing::Values(GameType::tes3,
GameType::tes4,
GameType::tes5,
GameType::fo3,
GameType::fonv,
GameType::fo4,
GameType::tes5se,
GameType::openmw));
TEST_P(ConditionEvaluatorTest,
evaluateShouldReturnTrueForAnEmptyConditionString) {
EXPECT_TRUE(evaluator_.Evaluate(""));
}
TEST_P(ConditionEvaluatorTest, evaluateShouldThrowForAnInvalidConditionString) {
EXPECT_THROW(evaluator_.Evaluate("condition"), ConditionSyntaxError);
}
TEST_P(ConditionEvaluatorTest,
evaluateShouldReturnTrueForAConditionThatIsTrue) {
EXPECT_TRUE(evaluator_.Evaluate("file(\"" + blankEsm + "\")"));
}
TEST_P(ConditionEvaluatorTest, evaluateShouldUseAllGivenDataPaths) {
ASSERT_FALSE(
evaluator_.Evaluate("file(\"" + localPath.filename().u8string() + "\")"));
evaluator_.ClearConditionCache();
evaluator_.SetAdditionalDataPaths({localPath.parent_path()});
EXPECT_TRUE(
evaluator_.Evaluate("file(\"" + localPath.filename().u8string() + "\")"));
}
TEST_P(ConditionEvaluatorTest,
evaluateFileConditionShouldReturnTrueForANonAsciiFileThatExists) {
EXPECT_TRUE(evaluator_.Evaluate("file(\"" + nonAsciiEsm + "\")"));
}
TEST_P(ConditionEvaluatorTest,
evaluateChecksumConditionShouldBeAbleToGetTheCrcOfANonAsciiFile) {
std::string condition("checksum(\"" + nonAsciiEsm + "\", " +
IntToHexString(blankEsmCrc) + ")");
EXPECT_TRUE(evaluator_.Evaluate(condition));
}
TEST_P(ConditionEvaluatorTest,
evaluateVersionConditionShouldBeAbleToGetTheVersionOfANonAsciiFile) {
std::string condition("version(\"" + nonAsciiEsm + "\", \"5.0\", ==)");
EXPECT_TRUE(evaluator_.Evaluate(condition));
}
TEST_P(ConditionEvaluatorTest,
evaluateActiveConditionShouldReturnTrueForAnActivePlugin) {
std::string condition("active(\"" + blankEsm + "\")");
EXPECT_TRUE(evaluator_.Evaluate(condition));
}
TEST_P(ConditionEvaluatorTest,
evaluateRegexFileConditionShouldReturnTrueForANonAsciiFileThatExists) {
std::string condition(u8"file(\"non\u00C1scii.*\\.esm\")");
EXPECT_TRUE(evaluator_.Evaluate(condition));
}
TEST_P(
ConditionEvaluatorTest,
evaluateRegexFileConditionShouldReturnTrueForANonAsciiNestedFileThatExists) {
std::string condition(u8"file(\"non\u00C1scii/.+\\.txt\")");
EXPECT_TRUE(evaluator_.Evaluate(condition));
}
TEST_P(ConditionEvaluatorTest,
evaluateShouldReturnFalseForAConditionThatIsFalse) {
EXPECT_FALSE(evaluator_.Evaluate("file(\"" + missingEsp + "\")"));
}
TEST_P(ConditionEvaluatorTest, evaluateAllShouldEvaluateAllMetadataConditions) {
PluginMetadata plugin(nonAsciiEsm);
plugin.SetGroup("group1");
File file1(blankEsp);
File file2(blankDifferentEsm, "", "file(\"" + missingEsp + "\")");
plugin.SetLoadAfterFiles({file1, file2});
plugin.SetRequirements({file1, file2});
plugin.SetIncompatibilities({file1, file2});
Message message1(MessageType::say, "content");
Message message2(MessageType::say, "content", "file(\"" + missingEsp + "\")");
plugin.SetMessages({message1, message2});
Tag tag1("Relev");
Tag tag2("Relev", true, "file(\"" + missingEsp + "\")");
plugin.SetTags({tag1, tag2});
PluginCleaningData info1(blankEsmCrc, "utility", info_, 1, 2, 3);
PluginCleaningData info2(0xDEADBEEF, "utility", info_, 1, 2, 3);
plugin.SetDirtyInfo({info1, info2});
plugin.SetCleanInfo({info1, info2});
EXPECT_NO_THROW(plugin = evaluator_.EvaluateAll(plugin));
std::vector<File> expectedFiles({file1});
EXPECT_EQ("group1", plugin.GetGroup().value());
EXPECT_EQ(expectedFiles, plugin.GetLoadAfterFiles());
EXPECT_EQ(expectedFiles, plugin.GetRequirements());
EXPECT_EQ(expectedFiles, plugin.GetIncompatibilities());
EXPECT_EQ(std::vector<Message>({message1}), plugin.GetMessages());
EXPECT_EQ(std::vector<Tag>({tag1}), plugin.GetTags());
EXPECT_EQ(std::vector<PluginCleaningData>({info1}), plugin.GetDirtyInfo());
EXPECT_EQ(std::vector<PluginCleaningData>({info1}), plugin.GetCleanInfo());
}
TEST_P(ConditionEvaluatorTest, evaluateAllShouldPreserveGroupExplicitness) {
PluginMetadata plugin(blankEsm);
EXPECT_NO_THROW(plugin = evaluator_.EvaluateAll(plugin));
EXPECT_FALSE(plugin.GetGroup());
}
TEST_P(ConditionEvaluatorTest,
refreshActivePluginsStateShouldClearTheConditionCache) {
std::string condition("active(\"" + blankEsm + "\")");
ASSERT_TRUE(evaluator_.Evaluate(condition));
evaluator_.RefreshActivePluginsState({blankEsp});
EXPECT_FALSE(evaluator_.Evaluate(condition));
}
TEST_P(
ConditionEvaluatorTest,
refreshActivePluginsStateShouldClearTheActivePluginsCacheIfGivenAnEmptyVector) {
std::string condition("active(\"" + blankEsm + "\")");
ASSERT_TRUE(evaluator_.Evaluate(condition));
evaluator_.RefreshActivePluginsState({});
EXPECT_FALSE(evaluator_.Evaluate(condition));
}
TEST_P(ConditionEvaluatorTest,
refreshLoadedPluginsStateShouldClearTheConditionCache) {
std::string condition("version(\"" + blankEsm + "\", \"5.0\", ==)");
ASSERT_TRUE(evaluator_.Evaluate(condition));
auto plugins = game_.GetLoadedPlugins();
auto pluginsIt =
std::find_if(plugins.cbegin(), plugins.cend(), [&](auto plugin) {
return plugin->GetName() == blankEsm;
});
plugins.erase(pluginsIt);
evaluator_.RefreshLoadedPluginsState(plugins);
EXPECT_FALSE(evaluator_.Evaluate(condition));
}
TEST_P(
ConditionEvaluatorTest,
refreshLoadedPluginsStateShouldClearTheVersionsCacheIfGivenAnEmptyVector) {
std::string condition("version(\"" + blankEsm + "\", \"5.0\", ==)");
ASSERT_TRUE(evaluator_.Evaluate(condition));
evaluator_.RefreshLoadedPluginsState({});
EXPECT_FALSE(evaluator_.Evaluate(condition));
}
TEST_P(ConditionEvaluatorTest,
setAdditionalDataPathsShouldAcceptAnEmptyVector) {
EXPECT_NO_THROW(evaluator_.SetAdditionalDataPaths({}));
}
TEST_P(ConditionEvaluatorTest,
setAdditionalDataPathsShouldAcceptANonEmptyVector) {
EXPECT_NO_THROW(evaluator_.SetAdditionalDataPaths(
{std::filesystem::u8path("a"), std::filesystem::u8path("b")}));
}
}
}
#endif
@@ -0,0 +1,77 @@
/* LOOT
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
Fallout: New Vegas.
Copyright (C) 2014-2016 WrinklyNinja
This file is part of LOOT.
LOOT is free software: you can redistribute
it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
LOOT is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LOOT. If not, see
<https://www.gnu.org/licenses/>.
*/
#ifndef LOOT_TESTS_API_INTERNALS_METADATA_CONDITIONAL_METADATA_TEST
#define LOOT_TESTS_API_INTERNALS_METADATA_CONDITIONAL_METADATA_TEST
#include "loot/metadata/conditional_metadata.h"
#include "tests/common_game_test_fixture.h"
namespace loot {
namespace test {
class ConditionalMetadataTest : public CommonGameTestFixture,
public testing::WithParamInterface<GameType> {
protected:
ConditionalMetadataTest() : CommonGameTestFixture(GetParam()) {}
ConditionalMetadata conditionalMetadata_;
};
// Pass an empty first argument, as it's a prefix for the test instantation,
// but we only have the one so no prefix is necessary.
INSTANTIATE_TEST_SUITE_P(,
ConditionalMetadataTest,
::testing::Values(GameType::tes4,
GameType::tes5,
GameType::fo3,
GameType::fonv,
GameType::fo4,
GameType::tes5se));
TEST_P(ConditionalMetadataTest,
defaultConstructorShouldSetEmptyConditionString) {
EXPECT_TRUE(conditionalMetadata_.GetCondition().empty());
}
TEST_P(ConditionalMetadataTest,
stringConstructorShouldSetConditionToGivenString) {
std::string condition("condition");
conditionalMetadata_ = ConditionalMetadata(condition);
EXPECT_EQ(condition, conditionalMetadata_.GetCondition());
}
TEST_P(ConditionalMetadataTest,
isConditionalShouldBeFalseForAnEmptyConditionString) {
EXPECT_FALSE(conditionalMetadata_.IsConditional());
}
TEST_P(ConditionalMetadataTest,
isConditionalShouldBeTrueForANonEmptyConditionString) {
conditionalMetadata_ = ConditionalMetadata("condition");
EXPECT_TRUE(conditionalMetadata_.IsConditional());
}
}
}
#endif
@@ -0,0 +1,386 @@
/* LOOT
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
Fallout: New Vegas.
Copyright (C) 2014-2016 WrinklyNinja
This file is part of LOOT.
LOOT is free software: you can redistribute
it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
LOOT is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LOOT. If not, see
<https://www.gnu.org/licenses/>.
*/
#ifndef LOOT_TESTS_API_INTERNALS_METADATA_FILE_TEST
#define LOOT_TESTS_API_INTERNALS_METADATA_FILE_TEST
#include <gtest/gtest.h>
#include "loot/metadata/file.h"
namespace loot {
namespace test {
TEST(File, defaultConstructorShouldInitialiseEmptyStrings) {
File file;
EXPECT_EQ("", std::string(file.GetName()));
EXPECT_EQ("", file.GetDisplayName());
EXPECT_EQ("", file.GetCondition());
EXPECT_EQ("", file.GetConstraint());
}
TEST(File, stringsConstructorShouldStoreGivenStrings) {
std::vector<MessageContent> detail = {MessageContent("text", "en")};
File file("name", "display", "condition", detail, "constraint");
EXPECT_EQ("name", std::string(file.GetName()));
EXPECT_EQ("display", file.GetDisplayName());
EXPECT_EQ("condition", file.GetCondition());
EXPECT_EQ(detail, file.GetDetail());
EXPECT_EQ("constraint", file.GetConstraint());
}
TEST(File, equalityShouldBeCaseInsensitiveOnName) {
File file1("name", "display", "condition");
File file2("name", "display", "condition");
EXPECT_TRUE(file1 == file2);
file1 = File("name", "display", "condition");
file2 = File("Name", "display", "condition");
EXPECT_TRUE(file1 == file2);
file1 = File("name1", "display", "condition");
file2 = File("name2", "display", "condition");
EXPECT_FALSE(file1 == file2);
}
TEST(File, equalityShouldBeCaseSensitiveOnDisplayAndConditionAndConstraint) {
File file1("name", "display", "condition");
File file2("name", "display", "condition");
EXPECT_TRUE(file1 == file2);
file1 = File("name", "display", "condition");
file2 = File("name", "Display", "condition");
EXPECT_FALSE(file1 == file2);
file1 = File("name", "display", "condition");
file2 = File("name", "display", "Condition");
EXPECT_FALSE(file1 == file2);
file1 = File("name", "display", "condition", {}, "constraint");
file2 = File("name", "display", "condition", {}, "Constraint");
EXPECT_FALSE(file1 == file2);
file1 = File("name", "display1", "condition");
file2 = File("name", "display2", "condition");
EXPECT_FALSE(file1 == file2);
file1 = File("name", "display", "condition1");
file2 = File("name", "display", "condition2");
EXPECT_FALSE(file1 == file2);
file1 = File("name", "display", "condition", {}, "constraint1");
file2 = File("name", "display", "condition", {}, "constraint2");
EXPECT_FALSE(file1 == file2);
}
TEST(File, equalityShouldCompareTheDetailVectors) {
File file1("", "", "", {MessageContent("text", "en")});
File file2("", "", "", {MessageContent("text", "en")});
EXPECT_TRUE(file1 == file2);
file1 = File("", "", "", {MessageContent("text", "en")});
file2 = File("", "", "", {MessageContent("Text", "en")});
EXPECT_FALSE(file1 == file2);
file1 = File("", "", "", {MessageContent("text", "en")});
file2 = File("", "", "", {MessageContent("text", "En")});
EXPECT_FALSE(file1 == file2);
file1 = File(
"", "", "", {MessageContent("text", "en"), MessageContent("text", "en")});
file2 = File("", "", "", {MessageContent("text", "en")});
EXPECT_FALSE(file1 == file2);
}
TEST(File, inequalityShouldBeTheInverseOfEquality) {
File file1("name", "display", "condition", {MessageContent("text", "en")});
File file2("name", "display", "condition", {MessageContent("text", "en")});
EXPECT_FALSE(file1 != file2);
file1 = File("name", "display", "condition");
file2 = File("name", "Display", "condition");
EXPECT_TRUE(file1 != file2);
file1 = File("name", "display", "condition");
file2 = File("name", "display", "Condition");
EXPECT_TRUE(file1 != file2);
file1 = File("name", "display", "condition", {}, "constraint");
file2 = File("name", "display", "condition", {}, "Constraint");
EXPECT_TRUE(file1 != file2);
file1 = File("name", "display1", "condition");
file2 = File("name", "display2", "condition");
EXPECT_TRUE(file1 != file2);
file1 = File("name", "display", "condition1");
file2 = File("name", "display", "condition2");
EXPECT_TRUE(file1 != file2);
file1 = File("", "", "", {MessageContent("text", "en")});
file2 = File("", "", "", {MessageContent("Text", "en")});
EXPECT_TRUE(file1 != file2);
file1 = File("name", "display", "condition", {}, "constraint1");
file2 = File("name", "display", "condition", {}, "constraint2");
EXPECT_TRUE(file1 != file2);
}
TEST(File,
lessThanOperatorShouldUseCaseInsensitiveLexicographicalComparisonForName) {
File file1("name", "display", "condition");
File file2("name", "display", "condition");
EXPECT_FALSE(file1 < file2);
EXPECT_FALSE(file2 < file1);
file1 = File("name", "display", "condition");
file2 = File("Name", "display", "condition");
EXPECT_FALSE(file1 < file2);
EXPECT_FALSE(file2 < file1);
file1 = File("name1");
file2 = File("name2");
EXPECT_TRUE(file1 < file2);
EXPECT_FALSE(file2 < file1);
}
TEST(
File,
lessThanOperatorShouldUseCaseSensitiveLexicographicalComparisonForDisplayAndConditionAndConstraint) {
File file1("name", "display", "condition");
File file2("name", "display", "condition");
EXPECT_FALSE(file1 < file2);
EXPECT_FALSE(file2 < file1);
file1 = File("name", "display", "condition");
file2 = File("name", "Display", "condition");
EXPECT_TRUE(file2 < file1);
EXPECT_FALSE(file1 < file2);
file1 = File("name", "display", "condition");
file2 = File("name", "display", "Condition");
EXPECT_TRUE(file2 < file1);
EXPECT_FALSE(file1 < file2);
file1 = File("name", "display", "condition", {}, "constraint");
file2 = File("name", "display", "condition", {}, "Constraint");
EXPECT_TRUE(file2 < file1);
EXPECT_FALSE(file1 < file2);
file1 = File("name", "display1");
file2 = File("name", "display2");
EXPECT_TRUE(file1 < file2);
EXPECT_FALSE(file2 < file1);
file1 = File("name", "display", "condition1");
file2 = File("name", "display", "condition2");
EXPECT_TRUE(file1 < file2);
EXPECT_FALSE(file2 < file1);
file1 = File("name", "display", "condition", {}, "constraint1");
file2 = File("name", "display", "condition", {}, "constraint2");
EXPECT_TRUE(file1 < file2);
EXPECT_FALSE(file2 < file1);
}
TEST(File, lessThanOperatorShouldCompareTheDetailVectors) {
File file1("", "", "", {MessageContent("text", "en")});
File file2("", "", "", {MessageContent("text", "en")});
EXPECT_FALSE(file1 < file2);
file1 = File("", "", "", {MessageContent("text", "en")});
file2 = File("", "", "", {MessageContent("Text", "en")});
EXPECT_FALSE(file1 < file2);
file1 = File("", "", "", {MessageContent("text", "en")});
file2 = File("", "", "", {MessageContent("text", "En")});
EXPECT_FALSE(file1 < file2);
file1 = File(
"", "", "", {MessageContent("text", "en"), MessageContent("text", "en")});
file2 = File("", "", "", {MessageContent("text", "en")});
EXPECT_FALSE(file1 < file2);
}
TEST(File, shouldAllowComparisonUsingGreaterThanOperator) {
File file1("name", "display", "condition", {MessageContent("text", "en")});
File file2("name", "display", "condition", {MessageContent("text", "en")});
EXPECT_FALSE(file1 > file2);
EXPECT_FALSE(file2 > file1);
file1 = File("name", "display", "condition");
file2 = File("name", "Display", "condition");
EXPECT_FALSE(file2 > file1);
EXPECT_TRUE(file1 > file2);
file1 = File("name", "display", "condition");
file2 = File("name", "display", "Condition");
EXPECT_FALSE(file2 > file1);
EXPECT_TRUE(file1 > file2);
file1 = File("name", "display1");
file2 = File("name", "display2");
EXPECT_FALSE(file1 > file2);
EXPECT_TRUE(file2 > file1);
file1 = File("name", "display", "condition1");
file2 = File("name", "display", "condition2");
EXPECT_FALSE(file1 > file2);
EXPECT_TRUE(file2 > file1);
file1 = File("", "", "", {MessageContent("text", "en")});
file2 = File("", "", "", {MessageContent("Text", "en")});
EXPECT_TRUE(file1 > file2);
}
TEST(
File,
lessThanOrEqualToOperatorShouldReturnTrueIfFirstFileIsNotGreaterThanSecondFile) {
File file1("name", "display", "condition", {MessageContent("text", "en")});
File file2("name", "display", "condition", {MessageContent("text", "en")});
EXPECT_TRUE(file1 <= file2);
EXPECT_TRUE(file2 <= file1);
file1 = File("name", "display", "condition");
file2 = File("name", "Display", "condition");
EXPECT_TRUE(file2 <= file1);
EXPECT_FALSE(file1 <= file2);
file1 = File("name", "display", "condition");
file2 = File("name", "display", "Condition");
EXPECT_TRUE(file2 <= file1);
EXPECT_FALSE(file1 <= file2);
file1 = File("name", "display1");
file2 = File("name", "display2");
EXPECT_TRUE(file1 <= file2);
EXPECT_FALSE(file2 <= file1);
file1 = File("name", "display", "condition1");
file2 = File("name", "display", "condition2");
EXPECT_TRUE(file1 <= file2);
EXPECT_FALSE(file2 <= file1);
file1 = File("", "", "", {MessageContent("text", "en")});
file2 = File("", "", "", {MessageContent("Text", "en")});
EXPECT_FALSE(file1 <= file2);
}
TEST(
File,
greaterThanOrEqualToOperatorShouldReturnTrueIfFirstFileIsNotLessThanSecondFile) {
File file1("name", "display", "condition", {MessageContent("text", "en")});
File file2("name", "display", "condition", {MessageContent("text", "en")});
EXPECT_TRUE(file1 >= file2);
EXPECT_TRUE(file2 >= file1);
file1 = File("name", "display", "condition");
file2 = File("name", "Display", "condition");
EXPECT_FALSE(file2 >= file1);
EXPECT_TRUE(file1 >= file2);
file1 = File("name", "display", "condition");
file2 = File("name", "display", "Condition");
EXPECT_FALSE(file2 >= file1);
EXPECT_TRUE(file1 >= file2);
file1 = File("name", "display1");
file2 = File("name", "display2");
EXPECT_FALSE(file1 >= file2);
EXPECT_TRUE(file2 >= file1);
file1 = File("name", "display", "condition1");
file2 = File("name", "display", "condition2");
EXPECT_FALSE(file1 >= file2);
EXPECT_TRUE(file2 >= file1);
file1 = File("", "", "", {MessageContent("text", "en")});
file2 = File("", "", "", {MessageContent("Text", "en")});
EXPECT_TRUE(file1 >= file2);
}
TEST(File, getDisplayNameShouldReturnDisplayString) {
File file("name", "display");
EXPECT_EQ("display", file.GetDisplayName());
}
}
}
#endif
@@ -0,0 +1,355 @@
/* LOOT
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
Fallout: New Vegas.
Copyright (C) 2014-2016 WrinklyNinja
This file is part of LOOT.
LOOT is free software: you can redistribute
it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
LOOT is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LOOT. If not, see
<https://www.gnu.org/licenses/>.
*/
#ifndef LOOT_TESTS_API_INTERNALS_METADATA_GROUP_TEST
#define LOOT_TESTS_API_INTERNALS_METADATA_GROUP_TEST
#include <gtest/gtest.h>
#include "loot/metadata/group.h"
namespace loot {
namespace test {
TEST(Group, defaultConstructorShouldCreateDefaultGroup) {
Group group;
EXPECT_EQ("default", group.GetName());
EXPECT_TRUE(group.GetAfterGroups().empty());
}
TEST(Group,
allArgsConstructorShouldSetDescriptionAndAfterGroupsDefaultsAsEmpty) {
Group group("group1");
EXPECT_EQ("group1", group.GetName());
EXPECT_TRUE(group.GetDescription().empty());
EXPECT_TRUE(group.GetAfterGroups().empty());
}
TEST(Group, allArgsConstructorShouldStoreGivenValues) {
Group group("group1", {"other_group"}, "test");
EXPECT_EQ("group1", group.GetName());
EXPECT_EQ("test", group.GetDescription());
EXPECT_EQ(std::vector<std::string>({"other_group"}), group.GetAfterGroups());
}
TEST(Group, equalityShouldBeCaseSensitiveOnNameAndDescription) {
Group group1("name", {}, "description");
Group group2("name", {}, "description");
EXPECT_TRUE(group1 == group2);
group1 = Group("name");
group2 = Group("Name");
EXPECT_FALSE(group1 == group2);
group1 = Group("name", {}, "description");
group2 = Group("name", {}, "Description");
EXPECT_FALSE(group1 == group2);
group1 = Group("name1");
group2 = Group("name2");
EXPECT_FALSE(group1 == group2);
group1 = Group("name", {}, "description1");
group2 = Group("name", {}, "description2");
EXPECT_FALSE(group1 == group2);
}
TEST(Group, equalityShouldRequireEqualAfterGroups) {
Group group1("name", {}, "description");
Group group2("name", {}, "description");
EXPECT_TRUE(group1 == group2);
group1 = Group("name", {}, "description");
group2 = Group("name", {"after1"}, "Description");
EXPECT_FALSE(group1 == group2);
}
TEST(Group, inequalityShouldBeTheInverseOfEquality) {
Group group1("name", {}, "description");
Group group2("name", {}, "description");
EXPECT_FALSE(group1 != group2);
group1 = Group("name");
group2 = Group("Name");
EXPECT_TRUE(group1 != group2);
group1 = Group("name", {}, "description");
group2 = Group("name", {}, "Description");
EXPECT_TRUE(group1 != group2);
group1 = Group("name1");
group2 = Group("name2");
EXPECT_TRUE(group1 != group2);
group1 = Group("name", {}, "description1");
group2 = Group("name", {}, "description2");
EXPECT_TRUE(group1 != group2);
group1 = Group("name", {}, "description");
group2 = Group("name", {"after1"}, "Description");
EXPECT_TRUE(group1 != group2);
}
TEST(Group,
lessThanOperatorShouldUseCaseSensitiveLexicographicalComparisonForNames) {
Group group1("name", {}, "description");
Group group2("name", {}, "description");
EXPECT_FALSE(group1 < group2);
EXPECT_FALSE(group2 < group1);
group1 = Group("Name", {}, "description");
group2 = Group("name", {}, "description");
EXPECT_TRUE(group1 < group2);
EXPECT_FALSE(group2 < group1);
group1 = Group("name1", {}, "description");
group2 = Group("name2", {}, "description");
EXPECT_TRUE(group1 < group2);
EXPECT_FALSE(group2 < group1);
}
TEST(
Group,
lessThanOperatorShouldUseCaseSensitiveLexicographicalComparisonForDescriptions) {
Group group1("name", {}, "description");
Group group2("name", {}, "description");
EXPECT_FALSE(group1 < group2);
EXPECT_FALSE(group2 < group1);
group1 = Group("name", {}, "Description");
group2 = Group("name", {}, "description");
EXPECT_TRUE(group1 < group2);
EXPECT_FALSE(group2 < group1);
group1 = Group("name", {}, "description1");
group2 = Group("name", {}, "description2");
EXPECT_TRUE(group1 < group2);
EXPECT_FALSE(group2 < group1);
}
TEST(Group, lessThanOperatorShouldCompareAfterGroups) {
Group group1("name", {}, "description");
Group group2("name", {}, "description");
EXPECT_FALSE(group1 < group2);
EXPECT_FALSE(group2 < group1);
group1 = Group("name", {}, "description");
group2 = Group("name", {"group"}, "description");
EXPECT_TRUE(group1 < group2);
EXPECT_FALSE(group2 < group1);
group1 = Group("name", {"Group"}, "description");
group2 = Group("name", {"group"}, "description");
EXPECT_TRUE(group1 < group2);
EXPECT_FALSE(group2 < group1);
group1 = Group("name", {"group1"}, "description");
group2 = Group("name", {"group2"}, "description");
EXPECT_TRUE(group1 < group2);
EXPECT_FALSE(group2 < group1);
}
TEST(Group,
greaterThanOperatorShouldReturnTrueIfTheSecondGroupIsLessThanTheFirst) {
Group group1("name", {}, "description");
Group group2("name", {}, "description");
EXPECT_FALSE(group1 > group2);
EXPECT_FALSE(group2 > group1);
group1 = Group("Name", {}, "description");
group2 = Group("name", {}, "description");
EXPECT_FALSE(group1 > group2);
EXPECT_TRUE(group2 > group1);
group1 = Group("name1", {}, "description");
group2 = Group("name2", {}, "description");
EXPECT_FALSE(group1 > group2);
EXPECT_TRUE(group2 > group1);
group1 = Group("name", {}, "Description");
group2 = Group("name", {}, "description");
EXPECT_FALSE(group1 > group2);
EXPECT_TRUE(group2 > group1);
group1 = Group("name", {}, "description1");
group2 = Group("name", {}, "description2");
EXPECT_FALSE(group1 > group2);
EXPECT_TRUE(group2 > group1);
group1 = Group("name", {}, "description");
group2 = Group("name", {"group"}, "description");
EXPECT_FALSE(group1 > group2);
EXPECT_TRUE(group2 > group1);
group1 = Group("name", {"Group"}, "description");
group2 = Group("name", {"group"}, "description");
EXPECT_FALSE(group1 > group2);
EXPECT_TRUE(group2 > group1);
group1 = Group("name", {"group1"}, "description");
group2 = Group("name", {"group2"}, "description");
EXPECT_FALSE(group1 > group2);
EXPECT_TRUE(group2 > group1);
}
TEST(
Group,
lessThanOrEqualToOperatorShouldReturnTrueIfTheFirstGroupIsNotGreaterThanTheSecond) {
Group group1("name", {}, "description");
Group group2("name", {}, "description");
EXPECT_TRUE(group1 <= group2);
EXPECT_TRUE(group2 <= group1);
group1 = Group("Name", {}, "description");
group2 = Group("name", {}, "description");
EXPECT_TRUE(group1 <= group2);
EXPECT_FALSE(group2 <= group1);
group1 = Group("name1", {}, "description");
group2 = Group("name2", {}, "description");
EXPECT_TRUE(group1 <= group2);
EXPECT_FALSE(group2 <= group1);
group1 = Group("name", {}, "Description");
group2 = Group("name", {}, "description");
EXPECT_TRUE(group1 <= group2);
EXPECT_FALSE(group2 <= group1);
group1 = Group("name", {}, "description1");
group2 = Group("name", {}, "description2");
EXPECT_TRUE(group1 <= group2);
EXPECT_FALSE(group2 <= group1);
group1 = Group("name", {}, "description");
group2 = Group("name", {"group"}, "description");
EXPECT_TRUE(group1 <= group2);
EXPECT_FALSE(group2 <= group1);
group1 = Group("name", {"Group"}, "description");
group2 = Group("name", {"group"}, "description");
EXPECT_TRUE(group1 <= group2);
EXPECT_FALSE(group2 <= group1);
group1 = Group("name", {"group1"}, "description");
group2 = Group("name", {"group2"}, "description");
EXPECT_TRUE(group1 <= group2);
EXPECT_FALSE(group2 <= group1);
}
TEST(
Group,
greaterThanOrEqualToOperatorShouldReturnTrueIfTheFirstGroupIsNotLessThanTheSecond) {
Group group1("name", {}, "description");
Group group2("name", {}, "description");
EXPECT_TRUE(group1 >= group2);
EXPECT_TRUE(group2 >= group1);
group1 = Group("Name", {}, "description");
group2 = Group("name", {}, "description");
EXPECT_FALSE(group1 >= group2);
EXPECT_TRUE(group2 >= group1);
group1 = Group("name1", {}, "description");
group2 = Group("name2", {}, "description");
EXPECT_FALSE(group1 >= group2);
EXPECT_TRUE(group2 >= group1);
group1 = Group("name", {}, "Description");
group2 = Group("name", {}, "description");
EXPECT_FALSE(group1 >= group2);
EXPECT_TRUE(group2 >= group1);
group1 = Group("name", {}, "description1");
group2 = Group("name", {}, "description2");
EXPECT_FALSE(group1 >= group2);
EXPECT_TRUE(group2 >= group1);
group1 = Group("name", {}, "description");
group2 = Group("name", {"group"}, "description");
EXPECT_FALSE(group1 >= group2);
EXPECT_TRUE(group2 >= group1);
group1 = Group("name", {"Group"}, "description");
group2 = Group("name", {"group"}, "description");
EXPECT_FALSE(group1 >= group2);
EXPECT_TRUE(group2 >= group1);
group1 = Group("name", {"group1"}, "description");
group2 = Group("name", {"group2"}, "description");
EXPECT_FALSE(group1 >= group2);
EXPECT_TRUE(group2 >= group1);
}
}
}
#endif
@@ -0,0 +1,239 @@
/* LOOT
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
Fallout: New Vegas.
Copyright (C) 2014-2016 WrinklyNinja
This file is part of LOOT.
LOOT is free software: you can redistribute
it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
LOOT is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LOOT. If not, see
<https://www.gnu.org/licenses/>.
*/
#ifndef LOOT_TESTS_API_INTERNALS_METADATA_LOCATION_TEST
#define LOOT_TESTS_API_INTERNALS_METADATA_LOCATION_TEST
#include <gtest/gtest.h>
#include "loot/metadata/location.h"
namespace loot {
namespace test {
TEST(Location, defaultConstructorShouldInitialiseEmptyStrings) {
Location location;
EXPECT_EQ("", location.GetURL());
EXPECT_EQ("", location.GetName());
}
TEST(Location, stringsConstructorShouldStoreGivenStrings) {
Location location("http://www.example.com", "example");
EXPECT_EQ("http://www.example.com", location.GetURL());
EXPECT_EQ("example", location.GetName());
}
TEST(Location, equalityShouldBeCaseSensitiveOnUrlAndName) {
Location location1("http://www.example.com", "example");
Location location2("http://www.example.com", "example");
EXPECT_TRUE(location1 == location2);
location1 = Location("http://www.example.com", "example");
location2 = Location("HTTP://WWW.EXAMPLE.COM", "example");
EXPECT_FALSE(location1 == location2);
location1 = Location("http://www.example.com", "example");
location2 = Location("http://www.example.com", "Example");
EXPECT_FALSE(location1 == location2);
location1 = Location("http://www.example1.com", "example");
location2 = Location("http://www.example2.com", "example");
EXPECT_FALSE(location1 == location2);
location1 = Location("http://www.example.com", "example1");
location2 = Location("http://www.example.com", "example2");
EXPECT_FALSE(location1 == location2);
}
TEST(Location, inequalityShouldBeTheInverseOfEquality) {
Location location1("http://www.example.com", "example");
Location location2("http://www.example.com", "example");
EXPECT_FALSE(location1 != location2);
location1 = Location("http://www.example.com", "example");
location2 = Location("HTTP://WWW.EXAMPLE.COM", "example");
EXPECT_TRUE(location1 != location2);
location1 = Location("http://www.example.com", "example");
location2 = Location("http://www.example.com", "Example");
EXPECT_TRUE(location1 != location2);
location1 = Location("http://www.example1.com", "example");
location2 = Location("http://www.example2.com", "example");
EXPECT_TRUE(location1 != location2);
location1 = Location("http://www.example.com", "example1");
location2 = Location("http://www.example.com", "example2");
EXPECT_TRUE(location1 != location2);
}
TEST(
Location,
lessThanOperatorShouldUseCaseSensitiveLexicographicalComparisonForNameAndUrl) {
Location location1("http://www.example.com", "example");
Location location2("http://www.example.com", "example");
EXPECT_FALSE(location1 < location2);
EXPECT_FALSE(location2 < location1);
location1 = Location("http://www.example.com");
location2 = Location("HTTP://WWW.EXAMPLE.COM");
EXPECT_FALSE(location1 < location2);
EXPECT_TRUE(location2 < location1);
location1 = Location("http://www.example.com", "example");
location2 = Location("http://www.example.com", "Example");
EXPECT_FALSE(location1 < location2);
EXPECT_TRUE(location2 < location1);
location1 = Location("http://www.example1.com");
location2 = Location("http://www.example2.com");
EXPECT_TRUE(location1 < location2);
EXPECT_FALSE(location2 < location1);
location1 = Location("http://www.example.com", "example1");
location2 = Location("http://www.example.com", "example2");
EXPECT_FALSE(location2 < location1);
EXPECT_TRUE(location1 < location2);
}
TEST(Location,
greaterThanOperatorShouldReturnTrueIfTheSecondLocationIsLessThanTheFirst) {
Location location1("http://www.example.com", "example");
Location location2("http://www.example.com", "example");
EXPECT_FALSE(location1 > location2);
EXPECT_FALSE(location2 > location1);
location1 = Location("http://www.example.com");
location2 = Location("HTTP://WWW.EXAMPLE.COM");
EXPECT_TRUE(location1 > location2);
EXPECT_FALSE(location2 > location1);
location1 = Location("http://www.example.com", "example");
location2 = Location("http://www.example.com", "Example");
EXPECT_TRUE(location1 > location2);
EXPECT_FALSE(location2 > location1);
location1 = Location("http://www.example1.com");
location2 = Location("http://www.example2.com");
EXPECT_FALSE(location1 > location2);
EXPECT_TRUE(location2 > location1);
location1 = Location("http://www.example.com", "example1");
location2 = Location("http://www.example.com", "example2");
EXPECT_TRUE(location2 > location1);
EXPECT_FALSE(location1 > location2);
}
TEST(
Location,
lessThanOrEqualOperatorShouldReturnTrueIfTheFirstLocationIsNotGreaterThanTheSecond) {
Location location1("http://www.example.com", "example");
Location location2("http://www.example.com", "example");
EXPECT_TRUE(location1 <= location2);
EXPECT_TRUE(location2 <= location1);
location1 = Location("http://www.example.com");
location2 = Location("HTTP://WWW.EXAMPLE.COM");
EXPECT_FALSE(location1 <= location2);
EXPECT_TRUE(location2 <= location1);
location1 = Location("http://www.example.com", "example");
location2 = Location("http://www.example.com", "Example");
EXPECT_FALSE(location1 <= location2);
EXPECT_TRUE(location2 <= location1);
location1 = Location("http://www.example1.com");
location2 = Location("http://www.example2.com");
EXPECT_TRUE(location1 <= location2);
EXPECT_FALSE(location2 <= location1);
location1 = Location("http://www.example.com", "example1");
location2 = Location("http://www.example.com", "example2");
EXPECT_FALSE(location2 <= location1);
EXPECT_TRUE(location1 <= location2);
}
TEST(
Location,
greaterThanOrEqualToOperatorShouldReturnTrueIfTheFirstLocationIsNotLessThanTheSecond) {
Location location1("http://www.example.com", "example");
Location location2("http://www.example.com", "example");
EXPECT_TRUE(location1 >= location2);
EXPECT_TRUE(location2 >= location1);
location1 = Location("http://www.example.com");
location2 = Location("HTTP://WWW.EXAMPLE.COM");
EXPECT_TRUE(location1 >= location2);
EXPECT_FALSE(location2 >= location1);
location1 = Location("http://www.example.com", "example");
location2 = Location("http://www.example.com", "Example");
EXPECT_TRUE(location1 >= location2);
EXPECT_FALSE(location2 >= location1);
location1 = Location("http://www.example1.com");
location2 = Location("http://www.example2.com");
EXPECT_FALSE(location1 >= location2);
EXPECT_TRUE(location2 >= location1);
location1 = Location("http://www.example.com", "example1");
location2 = Location("http://www.example.com", "example2");
EXPECT_TRUE(location2 >= location1);
EXPECT_FALSE(location1 >= location2);
}
}
}
#endif
@@ -0,0 +1,335 @@
/* LOOT
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
Fallout: New Vegas.
Copyright (C) 2014-2016 WrinklyNinja
This file is part of LOOT.
LOOT is free software: you can redistribute
it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
LOOT is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LOOT. If not, see
<https://www.gnu.org/licenses/>.
*/
#ifndef LOOT_TESTS_API_INTERNALS_METADATA_MESSAGE_CONTENT_TEST
#define LOOT_TESTS_API_INTERNALS_METADATA_MESSAGE_CONTENT_TEST
#include <gtest/gtest.h>
#include "loot/metadata/message_content.h"
namespace loot {
namespace test {
const std::string french = "fr";
TEST(MessageContent, defaultConstructorShouldSetEmptyEnglishLanguageString) {
MessageContent content;
EXPECT_TRUE(content.GetText().empty());
EXPECT_EQ(MessageContent::DEFAULT_LANGUAGE, content.GetLanguage());
}
TEST(MessageContent, contentConstructorShouldStoreGivenStringAndLanguage) {
MessageContent content("content", french);
EXPECT_EQ("content", content.GetText());
EXPECT_EQ(french, content.GetLanguage());
}
TEST(MessageContent,
equalityShouldRequireCaseSensitiveEqualityOnTextAndLanguage) {
MessageContent content1("content", "fr");
MessageContent content2("content", "fr");
EXPECT_TRUE(content1 == content2);
content1 = MessageContent("content", "fr");
content2 = MessageContent("Content", "fr");
EXPECT_FALSE(content1 == content2);
content1 = MessageContent("content", "fr");
content2 = MessageContent("content", "Fr");
EXPECT_FALSE(content1 == content2);
content1 = MessageContent("content1", "fr");
content2 = MessageContent("content2", "fr");
EXPECT_FALSE(content1 == content2);
content1 = MessageContent("content", "fr");
content2 = MessageContent("content", "de");
EXPECT_FALSE(content1 == content2);
}
TEST(MessageContent, inequalityShouldBeTheInverseOfEquality) {
MessageContent content1("content", "fr");
MessageContent content2("content", "fr");
EXPECT_FALSE(content1 != content2);
content1 = MessageContent("content", "fr");
content2 = MessageContent("Content", "fr");
EXPECT_TRUE(content1 != content2);
content1 = MessageContent("content", "fr");
content2 = MessageContent("content", "Fr");
EXPECT_TRUE(content1 != content2);
content1 = MessageContent("content1", "fr");
content2 = MessageContent("content2", "fr");
EXPECT_TRUE(content1 != content2);
content1 = MessageContent("content", "fr");
content2 = MessageContent("content", "de");
EXPECT_TRUE(content1 != content2);
}
TEST(
MessageContent,
lessThanOperatorShouldUseCaseSensitiveLexicographicalComparisonForTextAndLanguage) {
MessageContent content1("content", "fr");
MessageContent content2("content", "fr");
EXPECT_FALSE(content1 < content2);
EXPECT_FALSE(content2 < content1);
content1 = MessageContent("content", "fr");
content2 = MessageContent("Content", "fr");
EXPECT_FALSE(content1 < content2);
EXPECT_TRUE(content2 < content1);
content1 = MessageContent("content", "fr");
content2 = MessageContent("content", "Fr");
EXPECT_TRUE(content2 < content1);
EXPECT_FALSE(content1 < content2);
content1 = MessageContent("content1", "fr");
content2 = MessageContent("content2", "fr");
EXPECT_TRUE(content1 < content2);
EXPECT_FALSE(content2 < content1);
content1 = MessageContent("content", "fr");
content2 = MessageContent("content", "de");
EXPECT_TRUE(content2 < content1);
EXPECT_FALSE(content1 < content2);
}
TEST(
MessageContent,
greaterThanOperatorShouldReturnTrueIfTheSecondMessageContentIsLessThanTheFirst) {
MessageContent content1("content", "fr");
MessageContent content2("content", "fr");
EXPECT_FALSE(content1 > content2);
EXPECT_FALSE(content2 > content1);
content1 = MessageContent("content", "fr");
content2 = MessageContent("Content", "fr");
EXPECT_TRUE(content1 > content2);
EXPECT_FALSE(content2 > content1);
content1 = MessageContent("content", "fr");
content2 = MessageContent("content", "Fr");
EXPECT_FALSE(content2 > content1);
EXPECT_TRUE(content1 > content2);
content1 = MessageContent("content1", "fr");
content2 = MessageContent("content2", "fr");
EXPECT_FALSE(content1 > content2);
EXPECT_TRUE(content2 > content1);
content1 = MessageContent("content", "fr");
content2 = MessageContent("content", "de");
EXPECT_FALSE(content2 > content1);
EXPECT_TRUE(content1 > content2);
}
TEST(
MessageContent,
lessThanOrEqualOperatorShouldReturnTrueIfTheFirstMessageContentIsNotGreaterThanTheSecond) {
MessageContent content1("content", "fr");
MessageContent content2("content", "fr");
EXPECT_TRUE(content1 <= content2);
EXPECT_TRUE(content2 <= content1);
content1 = MessageContent("content", "fr");
content2 = MessageContent("Content", "fr");
EXPECT_FALSE(content1 <= content2);
EXPECT_TRUE(content2 <= content1);
content1 = MessageContent("content", "fr");
content2 = MessageContent("content", "Fr");
EXPECT_TRUE(content2 <= content1);
EXPECT_FALSE(content1 <= content2);
content1 = MessageContent("content1", "fr");
content2 = MessageContent("content2", "fr");
EXPECT_TRUE(content1 <= content2);
EXPECT_FALSE(content2 <= content1);
content1 = MessageContent("content", "fr");
content2 = MessageContent("content", "de");
EXPECT_TRUE(content2 <= content1);
EXPECT_FALSE(content1 <= content2);
}
TEST(
MessageContent,
greaterThanOrEqualToOperatorShouldReturnTrueIfTheFirstMessageContentIsNotLessThanTheSecond) {
MessageContent content1("content", "fr");
MessageContent content2("content", "fr");
EXPECT_TRUE(content1 >= content2);
EXPECT_TRUE(content2 >= content1);
content1 = MessageContent("content", "fr");
content2 = MessageContent("Content", "fr");
EXPECT_TRUE(content1 >= content2);
EXPECT_FALSE(content2 >= content1);
content1 = MessageContent("content", "fr");
content2 = MessageContent("content", "Fr");
EXPECT_FALSE(content2 >= content1);
EXPECT_TRUE(content1 >= content2);
content1 = MessageContent("content1", "fr");
content2 = MessageContent("content2", "fr");
EXPECT_FALSE(content1 >= content2);
EXPECT_TRUE(content2 >= content1);
content1 = MessageContent("content", "fr");
content2 = MessageContent("content", "de");
EXPECT_FALSE(content2 >= content1);
EXPECT_TRUE(content1 >= content2);
}
TEST(SelectMessageContent, shouldReturnANulloptIfTheVectorIsEmpty) {
auto content = SelectMessageContent(std::vector<MessageContent>(), "fr");
EXPECT_FALSE(content.has_value());
}
TEST(SelectMessageContent, shouldReturnTheOnlyElementOfASingleElementVector) {
MessageContent content("test", "de");
auto chosen = SelectMessageContent({MessageContent("test", "de")}, "fr");
EXPECT_EQ(content, chosen);
}
TEST(
SelectMessageContent,
shouldReturnAnEmptyEnglishMessageIfTheVectorHasNoEnglishOrMatchingLanguageContentWithTwoOrMoreElements) {
auto contents = {MessageContent("test1", "de"),
MessageContent("test2", "fr")};
auto content = SelectMessageContent(contents, "pt");
EXPECT_FALSE(content.has_value());
}
TEST(SelectMessageContent,
shouldReturnElementWithExactlyMatchingLocaleCodeIfPresent) {
auto contents = {MessageContent("test1", "en"),
MessageContent("test2", "de"),
MessageContent("test3", "pt"),
MessageContent("test4", "pt_PT"),
MessageContent("test5", "pt_BR")};
auto content = SelectMessageContent(contents, "pt_BR");
EXPECT_TRUE(content.has_value());
EXPECT_EQ("pt_BR", content.value().GetLanguage());
EXPECT_EQ("test5", content.value().GetText());
}
TEST(
SelectMessageContent,
shouldReturnElementWithMatchingLanguageCodeIfExactlyMatchingLocaleCodeIsNotPresent) {
auto contents = {MessageContent("test1", "en"),
MessageContent("test2", "de"),
MessageContent("test3", "pt_PT"),
MessageContent("test4", "pt")};
auto content = SelectMessageContent(contents, "pt_BR");
EXPECT_TRUE(content.has_value());
EXPECT_EQ("pt", content.value().GetLanguage());
EXPECT_EQ("test4", content.value().GetText());
}
TEST(SelectMessageContent,
shouldReturnElementWithEnLanguageCodeIfNoMatchingLanguageCodeIsPresent) {
auto contents = {MessageContent("test1", "en"),
MessageContent("test2", "de"),
MessageContent("test3", "pt_PT")};
auto content = SelectMessageContent(contents, "pt_BR");
EXPECT_TRUE(content.has_value());
EXPECT_EQ("en", content.value().GetLanguage());
EXPECT_EQ("test1", content.value().GetText());
}
TEST(SelectMessageContent,
shouldReturnElementWithExactlyMatchingLanguageCodeIfLanguageCodeIsGiven) {
auto contents = {
MessageContent("test1", "en"),
MessageContent("test2", "de"),
MessageContent("test3", "pt_BR"),
MessageContent("test4", "pt"),
};
auto content = SelectMessageContent(contents, "pt");
EXPECT_TRUE(content.has_value());
EXPECT_EQ("pt", content.value().GetLanguage());
EXPECT_EQ("test4", content.value().GetText());
}
TEST(
SelectMessageContent,
shouldReturnFirstElementWithMatchingLanguageCodeIfLanguageCodeIsGivenAndNoExactMatchIsPresent) {
auto contents = {MessageContent("test1", "en"),
MessageContent("test2", "de"),
MessageContent("test3", "pt_PT"),
MessageContent("test4", "pt_BR")};
auto content = SelectMessageContent(contents, "pt");
EXPECT_TRUE(content.has_value());
EXPECT_EQ("pt_PT", content.value().GetLanguage());
EXPECT_EQ("test3", content.value().GetText());
}
}
}
#endif
@@ -0,0 +1,347 @@
/* LOOT
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
Fallout: New Vegas.
Copyright (C) 2014-2016 WrinklyNinja
This file is part of LOOT.
LOOT is free software: you can redistribute
it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
LOOT is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LOOT. If not, see
<https://www.gnu.org/licenses/>.
*/
#ifndef LOOT_TESTS_API_INTERNALS_METADATA_MESSAGE_TEST
#define LOOT_TESTS_API_INTERNALS_METADATA_MESSAGE_TEST
#include "loot/metadata/message.h"
#include "tests/common_game_test_fixture.h"
namespace loot {
namespace test {
class MessageTest : public CommonGameTestFixture {
protected:
MessageTest() : CommonGameTestFixture(GameType::tes4) {}
typedef std::vector<MessageContent> MessageContents;
};
TEST_F(MessageTest, defaultConstructorShouldCreateNoteWithNoContent) {
Message message;
EXPECT_EQ(MessageType::say, message.GetType());
EXPECT_EQ(MessageContents(), message.GetContent());
}
TEST_F(MessageTest,
scalarContentConstructorShouldCreateAMessageWithASingleContentString) {
MessageContent content = MessageContent("content1");
Message message(MessageType::warn, content.GetText(), "condition1");
EXPECT_EQ(MessageType::warn, message.GetType());
EXPECT_EQ(MessageContents({content}), message.GetContent());
EXPECT_EQ("condition1", message.GetCondition());
}
TEST_F(MessageTest,
vectorContentConstructorShouldCreateAMessageWithGivenContentStrings) {
MessageContents contents({
MessageContent("content1"),
MessageContent("content2", french),
});
Message message(MessageType::error, contents, "condition1");
EXPECT_EQ(MessageType::error, message.GetType());
EXPECT_EQ(contents, message.GetContent());
EXPECT_EQ("condition1", message.GetCondition());
}
TEST_F(
MessageTest,
vectorContentConstructorShouldThrowIfMultipleContentStringsAreGivenAndNoneAreEnglish) {
MessageContents contents({
MessageContent("content1", german),
MessageContent("content2", french),
});
EXPECT_THROW(Message(MessageType::error, contents, "condition1"),
std::invalid_argument);
}
TEST_F(MessageTest, equalityShouldRequireEqualMessageTypes) {
Message message1(MessageType::say, "content");
Message message2(MessageType::say, "content");
EXPECT_TRUE(message1 == message2);
message1 = Message(MessageType::say, "content");
message2 = Message(MessageType::warn, "content");
EXPECT_FALSE(message1 == message2);
}
TEST_F(MessageTest, equalityShouldRequireCaseSensitiveEqualityOnCondition) {
Message message1(MessageType::say, "content", "condition");
Message message2(MessageType::say, "content", "condition");
EXPECT_TRUE(message1 == message2);
message1 = Message(MessageType::say, "content", "condition");
message2 = Message(MessageType::say, "content", "Condition");
EXPECT_FALSE(message1 == message2);
message1 = Message(MessageType::say, "content", "condition1");
message2 = Message(MessageType::say, "content", "condition2");
EXPECT_FALSE(message1 == message2);
}
TEST_F(MessageTest, equalityShouldRequireEqualContent) {
Message message1(MessageType::say, "content");
Message message2(MessageType::say, "content");
EXPECT_TRUE(message1 == message2);
message1 = Message(MessageType::say, "content1");
message2 = Message(MessageType::say, "content2");
EXPECT_FALSE(message1 == message2);
}
TEST_F(MessageTest, inequalityShouldBeTheInverseOfEquality) {
Message message1(MessageType::say, "content");
Message message2(MessageType::say, "content");
EXPECT_FALSE(message1 != message2);
message1 = Message(MessageType::say, "content");
message2 = Message(MessageType::warn, "content");
EXPECT_TRUE(message1 != message2);
message1 = Message(MessageType::say, "content", "condition");
message2 = Message(MessageType::say, "content", "condition");
EXPECT_FALSE(message1 != message2);
message1 = Message(MessageType::say, "content", "condition");
message2 = Message(MessageType::say, "content", "Condition");
EXPECT_TRUE(message1 != message2);
message1 = Message(MessageType::say, "content", "condition1");
message2 = Message(MessageType::say, "content", "condition2");
EXPECT_TRUE(message1 != message2);
message1 = Message(MessageType::say, "content");
message2 = Message(MessageType::say, "content");
EXPECT_FALSE(message1 != message2);
message1 = Message(MessageType::say, "content1");
message2 = Message(MessageType::say, "content2");
EXPECT_TRUE(message1 != message2);
}
TEST_F(MessageTest, lessThanOperatorShouldCompareMessageTypes) {
Message message1(MessageType::say, "content");
Message message2(MessageType::say, "content");
EXPECT_FALSE(message1 < message2);
EXPECT_FALSE(message2 < message1);
message1 = Message(MessageType::say, "content");
message2 = Message(MessageType::warn, "content");
EXPECT_TRUE(message1 < message2);
EXPECT_FALSE(message2 < message1);
}
TEST_F(MessageTest, lessThanOperatorShouldCompareContent) {
Message message1(MessageType::say, "content");
Message message2(MessageType::say, "content");
EXPECT_FALSE(message1 < message2);
EXPECT_FALSE(message2 < message1);
message1 = Message(MessageType::say, "content1");
message2 = Message(MessageType::say, "content2");
EXPECT_TRUE(message1 < message2);
EXPECT_FALSE(message2 < message1);
}
TEST_F(
MessageTest,
lessThanOperatorShouldUseCaseSensitiveLexicographicalComparisonForConditions) {
Message message1(MessageType::say, "content", "condition");
Message message2(MessageType::say, "content", "condition");
EXPECT_FALSE(message1 < message2);
EXPECT_FALSE(message2 < message1);
message1 = Message(MessageType::say, "content", "condition");
message2 = Message(MessageType::say, "content", "Condition");
EXPECT_TRUE(message2 < message1);
EXPECT_FALSE(message1 < message2);
message1 = Message(MessageType::say, "content", "condition1");
message2 = Message(MessageType::say, "content", "condition2");
EXPECT_TRUE(message1 < message2);
EXPECT_FALSE(message2 < message1);
}
TEST_F(
MessageTest,
greaterThanOperatorShouldReturnTrueIfTheSecondMessageIsLessThanTheFirst) {
Message message1(MessageType::say, "content");
Message message2(MessageType::say, "content");
EXPECT_FALSE(message1 > message2);
EXPECT_FALSE(message2 > message1);
message1 = Message(MessageType::say, "content");
message2 = Message(MessageType::warn, "content");
EXPECT_FALSE(message1 > message2);
EXPECT_TRUE(message2 > message1);
message1 = Message(MessageType::say, "content");
message2 = Message(MessageType::say, "content");
EXPECT_FALSE(message1 > message2);
EXPECT_FALSE(message2 > message1);
message1 = Message(MessageType::say, "content1");
message2 = Message(MessageType::say, "content2");
EXPECT_FALSE(message1 > message2);
EXPECT_TRUE(message2 > message1);
message1 = Message(MessageType::say, "content", "condition");
message2 = Message(MessageType::say, "content", "condition");
EXPECT_FALSE(message1 > message2);
EXPECT_FALSE(message2 > message1);
message1 = Message(MessageType::say, "content", "condition");
message2 = Message(MessageType::say, "content", "Condition");
EXPECT_FALSE(message2 > message1);
EXPECT_TRUE(message1 > message2);
message1 = Message(MessageType::say, "content", "condition1");
message2 = Message(MessageType::say, "content", "condition2");
EXPECT_FALSE(message1 > message2);
EXPECT_TRUE(message2 > message1);
}
TEST_F(
MessageTest,
lessThanOrEqualOperatorShouldReturnTrueIfTheFirstMessageIsNotGreaterThanTheSecond) {
Message message1(MessageType::say, "content");
Message message2(MessageType::say, "content");
EXPECT_TRUE(message1 <= message2);
EXPECT_TRUE(message2 <= message1);
message1 = Message(MessageType::say, "content");
message2 = Message(MessageType::warn, "content");
EXPECT_TRUE(message1 <= message2);
EXPECT_FALSE(message2 <= message1);
message1 = Message(MessageType::say, "content");
message2 = Message(MessageType::say, "content");
EXPECT_TRUE(message1 <= message2);
EXPECT_TRUE(message2 <= message1);
message1 = Message(MessageType::say, "content1");
message2 = Message(MessageType::say, "content2");
EXPECT_TRUE(message1 <= message2);
EXPECT_FALSE(message2 <= message1);
message1 = Message(MessageType::say, "content", "condition");
message2 = Message(MessageType::say, "content", "condition");
EXPECT_TRUE(message1 <= message2);
EXPECT_TRUE(message2 <= message1);
message1 = Message(MessageType::say, "content", "condition");
message2 = Message(MessageType::say, "content", "Condition");
EXPECT_TRUE(message2 <= message1);
EXPECT_FALSE(message1 <= message2);
message1 = Message(MessageType::say, "content", "condition1");
message2 = Message(MessageType::say, "content", "condition2");
EXPECT_TRUE(message1 <= message2);
EXPECT_FALSE(message2 <= message1);
}
TEST_F(
MessageTest,
greaterThanOrEqualToOperatorShouldReturnTrueIfTheFirstMessageIsNotLessThanTheSecond) {
Message message1(MessageType::say, "content");
Message message2(MessageType::say, "content");
EXPECT_TRUE(message1 >= message2);
EXPECT_TRUE(message2 >= message1);
message1 = Message(MessageType::say, "content");
message2 = Message(MessageType::warn, "content");
EXPECT_FALSE(message1 >= message2);
EXPECT_TRUE(message2 >= message1);
message1 = Message(MessageType::say, "content");
message2 = Message(MessageType::say, "content");
EXPECT_TRUE(message1 >= message2);
EXPECT_TRUE(message2 >= message1);
message1 = Message(MessageType::say, "content1");
message2 = Message(MessageType::say, "content2");
EXPECT_FALSE(message1 >= message2);
EXPECT_TRUE(message2 >= message1);
message1 = Message(MessageType::say, "content", "condition");
message2 = Message(MessageType::say, "content", "condition");
EXPECT_TRUE(message1 >= message2);
EXPECT_TRUE(message2 >= message1);
message1 = Message(MessageType::say, "content", "condition");
message2 = Message(MessageType::say, "content", "Condition");
EXPECT_FALSE(message2 >= message1);
EXPECT_TRUE(message1 >= message2);
message1 = Message(MessageType::say, "content", "condition1");
message2 = Message(MessageType::say, "content", "condition2");
EXPECT_FALSE(message1 >= message2);
EXPECT_TRUE(message2 >= message1);
}
}
}
#endif
@@ -0,0 +1,315 @@
/* LOOT
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
Fallout: New Vegas.
Copyright (C) 2014-2016 WrinklyNinja
This file is part of LOOT.
LOOT is free software: you can redistribute
it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
LOOT is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LOOT. If not, see
<https://www.gnu.org/licenses/>.
*/
#ifndef LOOT_TESTS_API_INTERNALS_METADATA_PLUGIN_CLEANING_DATA
#define LOOT_TESTS_API_INTERNALS_METADATA_PLUGIN_CLEANING_DATA
#include "loot/metadata/plugin_cleaning_data.h"
#include "tests/common_game_test_fixture.h"
namespace loot {
namespace test {
class PluginCleaningDataTest : public CommonGameTestFixture {
protected:
PluginCleaningDataTest() :
CommonGameTestFixture(GameType::tes4),
info_(std::vector<MessageContent>({
MessageContent("info"),
})) {}
const std::vector<MessageContent> info_;
};
TEST_F(PluginCleaningDataTest,
defaultConstructorShouldLeaveAllCountsAtZeroAndTheUtilityStringEmpty) {
PluginCleaningData info;
EXPECT_EQ(0u, info.GetCRC());
EXPECT_EQ(0u, info.GetITMCount());
EXPECT_EQ(0u, info.GetDeletedReferenceCount());
EXPECT_EQ(0u, info.GetDeletedNavmeshCount());
EXPECT_TRUE(info.GetCleaningUtility().empty());
EXPECT_TRUE(info.GetDetail().empty());
}
TEST_F(PluginCleaningDataTest, contentConstructorShouldStoreAllGivenData) {
PluginCleaningData info(0x12345678, "cleaner", info_, 2, 10, 30);
EXPECT_EQ(0x12345678u, info.GetCRC());
EXPECT_EQ(2u, info.GetITMCount());
EXPECT_EQ(10u, info.GetDeletedReferenceCount());
EXPECT_EQ(30u, info.GetDeletedNavmeshCount());
EXPECT_EQ("cleaner", info.GetCleaningUtility());
EXPECT_EQ(info_, info.GetDetail());
}
TEST_F(PluginCleaningDataTest, equalityShouldCheckEqualityOfAllFields) {
PluginCleaningData info1(0x12345678, "cleaner", info_, 2, 10, 30);
PluginCleaningData info2(0x12345678, "cleaner", info_, 2, 10, 30);
EXPECT_TRUE(info1 == info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x87654321, "cleaner", info_, 2, 10, 30);
EXPECT_FALSE(info1 == info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "Cleaner", info_, 2, 10, 30);
EXPECT_FALSE(info1 == info2);
info1 = PluginCleaningData(0x12345678, "cleaner1", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner2", info_, 2, 10, 30);
EXPECT_FALSE(info1 == info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(
0x12345678, "cleaner", std::vector<MessageContent>(), 2, 10, 30);
EXPECT_FALSE(info1 == info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 4, 10, 30);
EXPECT_FALSE(info1 == info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 20, 30);
EXPECT_FALSE(info1 == info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 60);
EXPECT_FALSE(info1 == info2);
}
TEST_F(PluginCleaningDataTest, inequalityShouldBeTheInverseOfEquality) {
PluginCleaningData info1(0x12345678, "cleaner", info_, 2, 10, 30);
PluginCleaningData info2(0x12345678, "cleaner", info_, 2, 10, 30);
EXPECT_FALSE(info1 != info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x87654321, "cleaner", info_, 2, 10, 30);
EXPECT_TRUE(info1 != info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "Cleaner", info_, 2, 10, 30);
EXPECT_TRUE(info1 != info2);
info1 = PluginCleaningData(0x12345678, "cleaner1", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner2", info_, 2, 10, 30);
EXPECT_TRUE(info1 != info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(
0x12345678, "cleaner", std::vector<MessageContent>(), 2, 10, 30);
EXPECT_TRUE(info1 != info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 4, 10, 30);
EXPECT_TRUE(info1 != info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 20, 30);
EXPECT_TRUE(info1 != info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 60);
EXPECT_TRUE(info1 != info2);
}
TEST_F(PluginCleaningDataTest, lessThanOperatorShouldCompareAllFields) {
PluginCleaningData info1(0x12345678, "cleaner", info_, 2, 10, 30);
PluginCleaningData info2(0x12345678, "cleaner", info_, 2, 10, 30);
EXPECT_FALSE(info1 < info2);
EXPECT_FALSE(info2 < info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x87654321, "cleaner", info_, 2, 10, 30);
EXPECT_TRUE(info1 < info2);
EXPECT_FALSE(info2 < info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "Cleaner", info_, 2, 10, 30);
EXPECT_TRUE(info2 < info1);
EXPECT_FALSE(info1 < info2);
info1 = PluginCleaningData(0x12345678, "cleaner1", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner2", info_, 2, 10, 30);
EXPECT_TRUE(info1 < info2);
EXPECT_FALSE(info2 < info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(
0x12345678, "cleaner", std::vector<MessageContent>(), 2, 10, 30);
EXPECT_TRUE(info2 < info1);
EXPECT_FALSE(info1 < info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 4, 10, 30);
EXPECT_TRUE(info1 < info2);
EXPECT_FALSE(info2 < info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 20, 30);
EXPECT_TRUE(info1 < info2);
EXPECT_FALSE(info2 < info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 60);
EXPECT_TRUE(info1 < info2);
EXPECT_FALSE(info2 < info1);
}
TEST_F(
PluginCleaningDataTest,
greaterThanOperatorShouldReturnTrueIfTheSecondPluginCleaningDataIsLessThanTheFirst) {
PluginCleaningData info1(0x12345678, "cleaner", info_, 2, 10, 30);
PluginCleaningData info2(0x12345678, "cleaner", info_, 2, 10, 30);
EXPECT_FALSE(info1 > info2);
EXPECT_FALSE(info2 > info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x87654321, "cleaner", info_, 2, 10, 30);
EXPECT_FALSE(info1 > info2);
EXPECT_TRUE(info2 > info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "Cleaner", info_, 2, 10, 30);
EXPECT_FALSE(info2 > info1);
EXPECT_TRUE(info1 > info2);
info1 = PluginCleaningData(0x12345678, "cleaner1", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner2", info_, 2, 10, 30);
EXPECT_FALSE(info1 > info2);
EXPECT_TRUE(info2 > info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(
0x12345678, "cleaner", std::vector<MessageContent>(), 2, 10, 30);
EXPECT_FALSE(info2 > info1);
EXPECT_TRUE(info1 > info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 4, 10, 30);
EXPECT_FALSE(info1 > info2);
EXPECT_TRUE(info2 > info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 20, 30);
EXPECT_FALSE(info1 > info2);
EXPECT_TRUE(info2 > info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 60);
EXPECT_FALSE(info1 > info2);
EXPECT_TRUE(info2 > info1);
}
TEST_F(
PluginCleaningDataTest,
lessThanOrEqualOperatorShouldReturnTrueIfTheFirstPluginCleaningDataIsNotGreaterThanTheSecond) {
PluginCleaningData info1(0x12345678, "cleaner", info_, 2, 10, 30);
PluginCleaningData info2(0x12345678, "cleaner", info_, 2, 10, 30);
EXPECT_TRUE(info1 <= info2);
EXPECT_TRUE(info2 <= info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x87654321, "cleaner", info_, 2, 10, 30);
EXPECT_TRUE(info1 < info2);
EXPECT_FALSE(info2 < info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "Cleaner", info_, 2, 10, 30);
EXPECT_TRUE(info2 < info1);
EXPECT_FALSE(info1 < info2);
info1 = PluginCleaningData(0x12345678, "cleaner1", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner2", info_, 2, 10, 30);
EXPECT_TRUE(info1 < info2);
EXPECT_FALSE(info2 < info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(
0x12345678, "cleaner", std::vector<MessageContent>(), 2, 10, 30);
EXPECT_TRUE(info2 < info1);
EXPECT_FALSE(info1 < info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 4, 10, 30);
EXPECT_TRUE(info1 < info2);
EXPECT_FALSE(info2 < info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 20, 30);
EXPECT_TRUE(info1 < info2);
EXPECT_FALSE(info2 < info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 60);
EXPECT_TRUE(info1 < info2);
EXPECT_FALSE(info2 < info1);
}
TEST_F(
PluginCleaningDataTest,
greaterThanOrEqualToOperatorShouldReturnTrueIfTheFirstPluginCleaningDataIsNotLessThanTheSecond) {
PluginCleaningData info1(0x12345678, "cleaner", info_, 2, 10, 30);
PluginCleaningData info2(0x12345678, "cleaner", info_, 2, 10, 30);
EXPECT_TRUE(info1 >= info2);
EXPECT_TRUE(info2 >= info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x87654321, "cleaner", info_, 2, 10, 30);
EXPECT_FALSE(info1 > info2);
EXPECT_TRUE(info2 > info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "Cleaner", info_, 2, 10, 30);
EXPECT_FALSE(info2 > info1);
EXPECT_TRUE(info1 > info2);
info1 = PluginCleaningData(0x12345678, "cleaner1", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner2", info_, 2, 10, 30);
EXPECT_FALSE(info1 > info2);
EXPECT_TRUE(info2 > info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(
0x12345678, "cleaner", std::vector<MessageContent>(), 2, 10, 30);
EXPECT_FALSE(info2 > info1);
EXPECT_TRUE(info1 > info2);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 4, 10, 30);
EXPECT_FALSE(info1 > info2);
EXPECT_TRUE(info2 > info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 20, 30);
EXPECT_FALSE(info1 > info2);
EXPECT_TRUE(info2 > info1);
info1 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30);
info2 = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 60);
EXPECT_FALSE(info1 > info2);
EXPECT_TRUE(info2 > info1);
}
}
}
#endif
@@ -0,0 +1,397 @@
/* LOOT
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
Fallout: New Vegas.
Copyright (C) 2014-2016 WrinklyNinja
This file is part of LOOT.
LOOT is free software: you can redistribute
it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
LOOT is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LOOT. If not, see
<https://www.gnu.org/licenses/>.
*/
#ifndef LOOT_TESTS_API_INTERNALS_METADATA_PLUGIN_METADATA_TEST
#define LOOT_TESTS_API_INTERNALS_METADATA_PLUGIN_METADATA_TEST
#include "loot/metadata/plugin_metadata.h"
#include "tests/common_game_test_fixture.h"
namespace loot {
namespace test {
class PluginMetadataTest : public CommonGameTestFixture {
protected:
PluginMetadataTest() :
CommonGameTestFixture(GameType::tes5),
info_(std::vector<MessageContent>({
MessageContent("info"),
})) {}
const std::vector<MessageContent> info_;
};
TEST_F(
PluginMetadataTest,
defaultConstructorShouldLeaveNameEmptyAndEnableMetadataAndLeaveGroupUnset) {
PluginMetadata plugin;
EXPECT_TRUE(plugin.GetName().empty());
EXPECT_FALSE(plugin.GetGroup());
}
TEST_F(
PluginMetadataTest,
stringConstructorShouldSetNameToGivenStringAndEnableMetadataAndLeaveGroupUnset) {
PluginMetadata plugin(blankEsm);
EXPECT_EQ(blankEsm, plugin.GetName());
EXPECT_FALSE(plugin.GetGroup());
}
TEST_F(PluginMetadataTest,
nameMatchesShouldUseCaseInsensitiveNameComparisonForNonRegexNames) {
PluginMetadata plugin(blankEsm);
EXPECT_TRUE(plugin.NameMatches("blank.esm"));
EXPECT_FALSE(plugin.NameMatches(blankDifferentEsm));
}
TEST_F(PluginMetadataTest,
nameMatchesShouldTreatGivenPluginNameStringsAsLiterals) {
PluginMetadata plugin(blankEsm);
std::string regex = "blan.\\.esm";
EXPECT_FALSE(plugin.NameMatches(regex));
}
TEST_F(PluginMetadataTest,
nameMatchesShouldUseCaseInsensitiveRegexMatchingForARegexName) {
PluginMetadata plugin("Blan.\\.esm");
EXPECT_TRUE(plugin.NameMatches("blank.esm"));
EXPECT_FALSE(plugin.NameMatches(blankDifferentEsm));
}
TEST_F(PluginMetadataTest, mergeMetadataShouldNotChangeName) {
PluginMetadata plugin1(blankEsm);
PluginMetadata plugin2(blankDifferentEsm);
plugin1.MergeMetadata(plugin2);
EXPECT_EQ(blankEsm, plugin1.GetName());
}
TEST_F(PluginMetadataTest,
mergeMetadataShouldNotUseMergedGroupIfItAndCurrentGroupAreBothExplicit) {
PluginMetadata plugin1;
PluginMetadata plugin2;
plugin1.SetGroup("group1");
plugin2.SetGroup("group2");
plugin1.MergeMetadata(plugin2);
EXPECT_EQ("group1", plugin1.GetGroup());
}
TEST_F(PluginMetadataTest,
mergeMetadataShouldNotUseMergedGroupIfItAndCurrentGroupAreBothImplicit) {
PluginMetadata plugin1;
PluginMetadata plugin2;
plugin1.MergeMetadata(plugin2);
EXPECT_FALSE(plugin1.GetGroup().has_value());
}
TEST_F(
PluginMetadataTest,
mergeMetadataShouldNotUseMergedGroupIfItIsImplicitAndCurrentGroupIsExplicit) {
PluginMetadata plugin1;
PluginMetadata plugin2;
plugin1.SetGroup("group1");
plugin1.MergeMetadata(plugin2);
EXPECT_EQ("group1", plugin1.GetGroup());
}
TEST_F(
PluginMetadataTest,
mergeMetadataShouldUseMergedGroupIfItIsExplicitAndCurrentGroupIsImplicit) {
PluginMetadata plugin1;
PluginMetadata plugin2;
plugin2.SetGroup("group2");
plugin1.MergeMetadata(plugin2);
EXPECT_EQ("group2", plugin1.GetGroup());
}
TEST_F(PluginMetadataTest, mergeMetadataShouldMergeLoadAfterData) {
PluginMetadata plugin1;
PluginMetadata plugin2;
File file1(blankEsm);
File file2(blankDifferentEsm);
plugin1.SetLoadAfterFiles({file1});
plugin2.SetLoadAfterFiles({file1, file2});
plugin1.MergeMetadata(plugin2);
EXPECT_EQ(std::vector<File>({file1, file2}), plugin1.GetLoadAfterFiles());
}
TEST_F(PluginMetadataTest, mergeMetadataShouldMergeRequirementData) {
PluginMetadata plugin1;
PluginMetadata plugin2;
File file1(blankEsm);
File file2(blankDifferentEsm);
plugin1.SetRequirements({file1});
plugin2.SetRequirements({file1, file2});
plugin1.MergeMetadata(plugin2);
EXPECT_EQ(std::vector<File>({file1, file2}), plugin1.GetRequirements());
}
TEST_F(PluginMetadataTest, mergeMetadataShouldMergeIncompatibilityData) {
PluginMetadata plugin1;
PluginMetadata plugin2;
File file1(blankEsm);
File file2(blankDifferentEsm);
plugin1.SetIncompatibilities({file1});
plugin2.SetIncompatibilities({file1, file2});
plugin1.MergeMetadata(plugin2);
EXPECT_EQ(std::vector<File>({file1, file2}), plugin1.GetIncompatibilities());
}
TEST_F(PluginMetadataTest, mergeMetadataShouldMergeMessages) {
PluginMetadata plugin1;
PluginMetadata plugin2;
Message message(MessageType::say, "content");
plugin1.SetMessages({message});
plugin2.SetMessages({message});
plugin1.MergeMetadata(plugin2);
EXPECT_EQ(std::vector<Message>({message, message}), plugin1.GetMessages());
}
TEST_F(PluginMetadataTest, mergeMetadataShouldMergeTags) {
PluginMetadata plugin1;
PluginMetadata plugin2;
Tag tag1("Relev");
Tag tag2("Relev", false);
Tag tag3("Delev");
plugin1.SetTags({tag1});
plugin2.SetTags({tag1, tag2, tag3});
plugin1.MergeMetadata(plugin2);
EXPECT_EQ(std::vector<Tag>({tag1, tag2, tag3}), plugin1.GetTags());
}
TEST_F(PluginMetadataTest, mergeMetadataShouldMergeDirtyInfoData) {
PluginMetadata plugin1;
PluginMetadata plugin2;
PluginCleaningData info1(0x5, "utility", info_, 1, 2, 3);
PluginCleaningData info2(0xA, "utility", info_, 1, 2, 3);
plugin1.SetDirtyInfo({info1});
plugin2.SetDirtyInfo({info1, info2});
plugin1.MergeMetadata(plugin2);
EXPECT_EQ(std::vector<PluginCleaningData>({info1, info2}),
plugin1.GetDirtyInfo());
}
TEST_F(PluginMetadataTest, mergeMetadataShouldMergeCleanInfoData) {
PluginMetadata plugin1;
PluginMetadata plugin2;
PluginCleaningData info1(0x5, "utility");
PluginCleaningData info2(0xA, "utility");
plugin1.SetCleanInfo({info1});
plugin2.SetCleanInfo({info1, info2});
plugin1.MergeMetadata(plugin2);
EXPECT_EQ(std::vector<PluginCleaningData>({info1, info2}),
plugin1.GetCleanInfo());
}
TEST_F(PluginMetadataTest, mergeMetadataShouldMergeLocationData) {
PluginMetadata plugin1;
PluginMetadata plugin2;
Location location1("http://www.example.com/1");
Location location2("http://www.example.com/2");
plugin1.SetLocations({location1});
plugin2.SetLocations({location1, location2});
plugin1.MergeMetadata(plugin2);
EXPECT_EQ(std::vector<Location>({location1, location2}),
plugin1.GetLocations());
}
TEST_F(PluginMetadataTest, unsetGroupShouldLeaveNoGroupValueSet) {
PluginMetadata plugin;
EXPECT_FALSE(plugin.GetGroup().has_value());
plugin.SetGroup("test");
EXPECT_EQ("test", plugin.GetGroup().value());
plugin.UnsetGroup();
EXPECT_FALSE(plugin.GetGroup().has_value());
}
TEST_F(PluginMetadataTest,
hasNameOnlyShouldBeTrueForADefaultConstructedPluginMetadataObject) {
PluginMetadata plugin;
EXPECT_TRUE(plugin.HasNameOnly());
}
TEST_F(PluginMetadataTest,
hasNameOnlyShouldBeTrueForAPluginMetadataObjectConstructedWithAName) {
PluginMetadata plugin(blankEsp);
EXPECT_TRUE(plugin.HasNameOnly());
}
TEST_F(PluginMetadataTest, hasNameOnlyShouldBeFalseIfTheGroupIsExplicit) {
PluginMetadata plugin;
plugin.SetGroup("group");
EXPECT_FALSE(plugin.HasNameOnly());
}
TEST_F(PluginMetadataTest, hasNameOnlyShouldBeFalseIfLoadAfterMetadataExists) {
PluginMetadata plugin(blankEsp);
plugin.SetLoadAfterFiles({File(blankEsm)});
EXPECT_FALSE(plugin.HasNameOnly());
}
TEST_F(PluginMetadataTest,
hasNameOnlyShouldBeFalseIfRequirementMetadataExists) {
PluginMetadata plugin(blankEsp);
plugin.SetRequirements({File(blankEsm)});
EXPECT_FALSE(plugin.HasNameOnly());
}
TEST_F(PluginMetadataTest,
hasNameOnlyShouldBeFalseIfIncompatibilityMetadataExists) {
PluginMetadata plugin(blankEsp);
plugin.SetIncompatibilities({File(blankEsm)});
EXPECT_FALSE(plugin.HasNameOnly());
}
TEST_F(PluginMetadataTest, hasNameOnlyShouldBeFalseIfMessagesExist) {
PluginMetadata plugin(blankEsp);
plugin.SetMessages({Message(MessageType::say, "content")});
EXPECT_FALSE(plugin.HasNameOnly());
}
TEST_F(PluginMetadataTest, hasNameOnlyShouldBeFalseIfTagsExist) {
PluginMetadata plugin(blankEsp);
plugin.SetTags({Tag("Relev")});
EXPECT_FALSE(plugin.HasNameOnly());
}
TEST_F(PluginMetadataTest, hasNameOnlyShouldBeFalseIfDirtyInfoExists) {
PluginMetadata plugin(blankEsp);
plugin.SetDirtyInfo({PluginCleaningData(5, "utility", info_, 0, 1, 2)});
EXPECT_FALSE(plugin.HasNameOnly());
}
TEST_F(PluginMetadataTest, hasNameOnlyShouldBeFalseIfCleanInfoExists) {
PluginMetadata plugin(blankEsp);
plugin.SetCleanInfo({PluginCleaningData(5, "utility")});
EXPECT_FALSE(plugin.HasNameOnly());
}
TEST_F(PluginMetadataTest, hasNameOnlyShouldBeFalseIfLocationsExist) {
PluginMetadata plugin(blankEsp);
plugin.SetLocations({Location("http://www.example.com")});
EXPECT_FALSE(plugin.HasNameOnly());
}
TEST_F(PluginMetadataTest, isRegexPluginShouldBeFalseForAnEmptyPluginName) {
PluginMetadata plugin;
EXPECT_FALSE(plugin.IsRegexPlugin());
}
TEST_F(PluginMetadataTest, isRegexPluginShouldBeFalseForAnExactPluginFilename) {
PluginMetadata plugin(blankEsm);
EXPECT_FALSE(plugin.IsRegexPlugin());
}
TEST_F(PluginMetadataTest,
isRegexPluginShouldBeTrueIfThePluginNameContainsAColon) {
PluginMetadata plugin("Blank:.esm");
EXPECT_TRUE(plugin.IsRegexPlugin());
}
TEST_F(PluginMetadataTest,
isRegexPluginShouldBeTrueIfThePluginNameContainsABackslash) {
PluginMetadata plugin("Blank\\.esm");
EXPECT_TRUE(plugin.IsRegexPlugin());
}
TEST_F(PluginMetadataTest,
isRegexPluginShouldBeTrueIfThePluginNameContainsAnAsterisk) {
PluginMetadata plugin("Blank*.esm");
EXPECT_TRUE(plugin.IsRegexPlugin());
}
TEST_F(PluginMetadataTest,
isRegexPluginShouldBeTrueIfThePluginNameContainsAQuestionMark) {
PluginMetadata plugin("Blank?.esm");
EXPECT_TRUE(plugin.IsRegexPlugin());
}
TEST_F(PluginMetadataTest,
isRegexPluginShouldBeTrueIfThePluginNameContainsAVerticalBar) {
PluginMetadata plugin("Blank|.esm");
EXPECT_TRUE(plugin.IsRegexPlugin());
}
TEST_F(PluginMetadataTest,
asYamlShouldReturnAStringContainingTheMetadataEmittedAsYaml) {
PluginMetadata plugin(blankEsm);
plugin.SetLoadAfterFiles({File(blankEsm)});
EXPECT_EQ(
"name: 'Blank.esm'\n"
"after: ['Blank.esm']",
plugin.AsYaml());
}
}
}
#endif
@@ -0,0 +1,289 @@
/* LOOT
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
Fallout: New Vegas.
Copyright (C) 2014-2016 WrinklyNinja
This file is part of LOOT.
LOOT is free software: you can redistribute
it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
LOOT is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LOOT. If not, see
<https://www.gnu.org/licenses/>.
*/
#ifndef LOOT_TESTS_API_INTERNALS_METADATA_TAG_TEST
#define LOOT_TESTS_API_INTERNALS_METADATA_TAG_TEST
#include <gtest/gtest.h>
#include "loot/metadata/tag.h"
namespace loot {
namespace test {
TEST(Tag,
defaultConstructorShouldSetEmptyNameAndConditionStringsForATagAddition) {
Tag tag;
EXPECT_TRUE(tag.GetName().empty());
EXPECT_TRUE(tag.IsAddition());
EXPECT_TRUE(tag.GetCondition().empty());
}
TEST(Tag, dataConstructorShouldSetFieldsToGivenValues) {
Tag tag("name", false, "condition");
EXPECT_EQ("name", tag.GetName());
EXPECT_FALSE(tag.IsAddition());
EXPECT_EQ("condition", tag.GetCondition());
}
TEST(Tag, equalityShouldBeCaseSensitiveOnNameAndCondition) {
Tag tag1("name", true, "condition");
Tag tag2("name", true, "condition");
EXPECT_TRUE(tag1 == tag2);
tag1 = Tag("name");
tag2 = Tag("Name");
EXPECT_FALSE(tag1 == tag2);
tag1 = Tag("name", true, "condition");
tag2 = Tag("name", true, "Condition");
EXPECT_FALSE(tag1 == tag2);
tag1 = Tag("name1");
tag2 = Tag("name2");
EXPECT_FALSE(tag1 == tag2);
tag1 = Tag("name", true, "condition1");
tag2 = Tag("name", true, "condition2");
EXPECT_FALSE(tag1 == tag2);
}
TEST(Tag, equalityShouldRequireEqualAdditionStates) {
Tag tag1("name", true, "condition");
Tag tag2("name", true, "condition");
EXPECT_TRUE(tag1 == tag2);
tag1 = Tag("name", true);
tag2 = Tag("name", false);
EXPECT_FALSE(tag1 == tag2);
}
TEST(Tag, inequalityShouldBeTheInverseOfEquality) {
Tag tag1("name", true, "condition");
Tag tag2("name", true, "condition");
EXPECT_FALSE(tag1 != tag2);
tag1 = Tag("name");
tag2 = Tag("Name");
EXPECT_TRUE(tag1 != tag2);
tag1 = Tag("name", true, "condition");
tag2 = Tag("name", true, "Condition");
EXPECT_TRUE(tag1 != tag2);
tag1 = Tag("name1");
tag2 = Tag("name2");
EXPECT_TRUE(tag1 != tag2);
tag1 = Tag("name", true, "condition1");
tag2 = Tag("name", true, "condition2");
EXPECT_TRUE(tag1 != tag2);
tag1 = Tag("name", true, "condition");
tag2 = Tag("name", true, "condition");
EXPECT_FALSE(tag1 != tag2);
tag1 = Tag("name", true);
tag2 = Tag("name", false);
EXPECT_TRUE(tag1 != tag2);
}
TEST(
Tag,
lessThanOperatorShouldUseCaseSensitiveLexicographicalComparisonForNameAndCondition) {
Tag tag1("name", true, "condition");
Tag tag2("name", true, "condition");
EXPECT_FALSE(tag1 < tag2);
EXPECT_FALSE(tag2 < tag1);
tag1 = Tag("name");
tag2 = Tag("Name");
EXPECT_FALSE(tag1 < tag2);
EXPECT_TRUE(tag2 < tag1);
tag1 = Tag("name", true, "condition");
tag2 = Tag("name", true, "Condition");
EXPECT_FALSE(tag1 < tag2);
EXPECT_TRUE(tag2 < tag1);
tag1 = Tag("name1");
tag2 = Tag("name2");
EXPECT_TRUE(tag1 < tag2);
EXPECT_FALSE(tag2 < tag1);
tag1 = Tag("name", true, "condition1");
tag2 = Tag("name", true, "condition2");
EXPECT_TRUE(tag1 < tag2);
EXPECT_FALSE(tag2 < tag1);
}
TEST(Tag, lessThanOperatorShouldTreatTagAdditionsAsBeingLessThanRemovals) {
Tag tag1("name", true);
Tag tag2("name", false);
EXPECT_TRUE(tag1 < tag2);
EXPECT_FALSE(tag2 < tag1);
}
TEST(Tag, greaterThanOperatorShouldReturnTrueIfTheSecondTagIsLessThanTheFirst) {
Tag tag1("name", true, "condition");
Tag tag2("name", true, "condition");
EXPECT_FALSE(tag1 > tag2);
EXPECT_FALSE(tag2 > tag1);
tag1 = Tag("name");
tag2 = Tag("Name");
EXPECT_TRUE(tag1 > tag2);
EXPECT_FALSE(tag2 > tag1);
tag1 = Tag("name", true, "condition");
tag2 = Tag("name", true, "Condition");
EXPECT_TRUE(tag1 > tag2);
EXPECT_FALSE(tag2 > tag1);
tag1 = Tag("name1");
tag2 = Tag("name2");
EXPECT_FALSE(tag1 > tag2);
EXPECT_TRUE(tag2 > tag1);
tag1 = Tag("name", true, "condition1");
tag2 = Tag("name", true, "condition2");
EXPECT_FALSE(tag1 > tag2);
EXPECT_TRUE(tag2 > tag1);
tag1 = Tag("name", true);
tag2 = Tag("name", false);
EXPECT_FALSE(tag1 > tag2);
EXPECT_TRUE(tag2 > tag1);
}
TEST(
Tag,
lessThanOrEqualOperatorShouldReturnTrueIfTheFirstTagIsNotGreaterThanTheSecond) {
Tag tag1("name", true, "condition");
Tag tag2("name", true, "condition");
EXPECT_TRUE(tag1 <= tag2);
EXPECT_TRUE(tag2 <= tag1);
tag1 = Tag("name");
tag2 = Tag("Name");
EXPECT_FALSE(tag1 <= tag2);
EXPECT_TRUE(tag2 <= tag1);
tag1 = Tag("name", true, "condition");
tag2 = Tag("name", true, "Condition");
EXPECT_FALSE(tag1 <= tag2);
EXPECT_TRUE(tag2 <= tag1);
tag1 = Tag("name1");
tag2 = Tag("name2");
EXPECT_TRUE(tag1 <= tag2);
EXPECT_FALSE(tag2 <= tag1);
tag1 = Tag("name", true, "condition1");
tag2 = Tag("name", true, "condition2");
EXPECT_TRUE(tag1 <= tag2);
EXPECT_FALSE(tag2 <= tag1);
tag1 = Tag("name", true);
tag2 = Tag("name", false);
EXPECT_TRUE(tag1 <= tag2);
EXPECT_FALSE(tag2 <= tag1);
}
TEST(
Tag,
greaterThanOrEqualToOperatorShouldReturnTrueIfTheFirstTagIsNotLessThanTheSecond) {
Tag tag1("name", true, "condition");
Tag tag2("name", true, "condition");
EXPECT_TRUE(tag1 >= tag2);
EXPECT_TRUE(tag2 >= tag1);
tag1 = Tag("name");
tag2 = Tag("Name");
EXPECT_TRUE(tag1 >= tag2);
EXPECT_FALSE(tag2 >= tag1);
tag1 = Tag("name", true, "condition");
tag2 = Tag("name", true, "Condition");
EXPECT_TRUE(tag1 >= tag2);
EXPECT_FALSE(tag2 >= tag1);
tag1 = Tag("name1");
tag2 = Tag("name2");
EXPECT_FALSE(tag1 >= tag2);
EXPECT_TRUE(tag2 >= tag1);
tag1 = Tag("name", true, "condition1");
tag2 = Tag("name", true, "condition2");
EXPECT_FALSE(tag1 >= tag2);
EXPECT_TRUE(tag2 >= tag1);
tag1 = Tag("name", true);
tag2 = Tag("name", false);
EXPECT_FALSE(tag1 >= tag2);
EXPECT_TRUE(tag2 >= tag1);
}
}
}
#endif