diff --git a/CMakeLists.txt b/CMakeLists.txt index 579f328d..ba05b741 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -173,6 +173,7 @@ set (LOOT_TESTS_HEADERS "${CMAKE_SOURCE_DIR}/src/tests/fixtures.h" "${CMAKE_SOURCE_DIR}/src/tests/backend/metadata/test_message.h" "${CMAKE_SOURCE_DIR}/src/tests/backend/metadata/test_message_content.h" "${CMAKE_SOURCE_DIR}/src/tests/backend/metadata/test_plugin_dirty_info.h" + "${CMAKE_SOURCE_DIR}/src/tests/backend/metadata/test_plugin_metadata.h" "${CMAKE_SOURCE_DIR}/src/tests/backend/metadata/test_tag.h") source_group("Header Files" FILES ${LOOT_HEADERS} ${LOOT_GUI_HEADERS} ${LOOT_API_HEADERS} ${LOOT_TESTS_HEADERS}) diff --git a/src/tests/backend/metadata/test_plugin_metadata.h b/src/tests/backend/metadata/test_plugin_metadata.h new file mode 100644 index 00000000..d9af35e9 --- /dev/null +++ b/src/tests/backend/metadata/test_plugin_metadata.h @@ -0,0 +1,487 @@ +/* LOOT + +A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and +Fallout: New Vegas. + +Copyright (C) 2014-2015 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 +. +*/ + +#ifndef LOOT_TEST_BACKEND_METADATA_PLUGIN_METADATA +#define LOOT_TEST_BACKEND_METADATA_PLUGIN_METADATA + +#include "backend/metadata/plugin_metadata.h" +#include "tests/fixtures.h" + +using loot::PluginMetadata; + +TEST(PluginMetadata, Constructors) { + PluginMetadata pm; + EXPECT_TRUE(pm.Enabled()); + EXPECT_FALSE(pm.IsPriorityExplicit()); + EXPECT_EQ(0, pm.Priority()); + + pm = PluginMetadata("Blank.esm"); + EXPECT_EQ("Blank.esm", pm.Name()); + EXPECT_TRUE(pm.Enabled()); + EXPECT_FALSE(pm.IsPriorityExplicit()); + EXPECT_EQ(0, pm.Priority()); +} + +TEST(PluginMetadata, EqualityOperator) { + PluginMetadata pm1, pm2; + EXPECT_TRUE(pm1 == pm2); + + pm1 = PluginMetadata("Blank.esm"); + pm2 = PluginMetadata("blank.esm"); + EXPECT_TRUE(pm1 == pm2); + + pm1 = PluginMetadata("Blank.esm"); + pm2 = PluginMetadata("Blan.\\.esm"); + EXPECT_TRUE(pm1 == pm2); + EXPECT_TRUE(pm2 == pm1); +} + +TEST(PluginMetadata, Name) { + PluginMetadata pm; + ASSERT_NE("Blank.esm", pm.Name()); + pm.Name("Blank.esm"); + EXPECT_EQ("Blank.esm", pm.Name()); +} + +TEST(PluginMetadata, Enabled) { + PluginMetadata pm; + ASSERT_TRUE(pm.Enabled()); + pm.Enabled(false); + EXPECT_FALSE(pm.Enabled()); +} + +TEST(PluginMetadata, SetPriorityExplicit) { + PluginMetadata pm; + ASSERT_FALSE(pm.IsPriorityExplicit()); + pm.SetPriorityExplicit(true); + EXPECT_TRUE(pm.IsPriorityExplicit()); +} + +TEST(PluginMetadata, Priority) { + PluginMetadata pm; + ASSERT_NE(10, pm.Priority()); + pm.Priority(10); + EXPECT_EQ(10, pm.Priority()); +} + +TEST(PluginMetadata, LoadAfter) { + PluginMetadata pm; + ASSERT_TRUE(pm.LoadAfter().empty()); + pm.LoadAfter({ + loot::File("Blank.esm") + }); + EXPECT_EQ(std::set({ + loot::File("Blank.esm") + }), pm.LoadAfter()); +} + +TEST(PluginMetadata, Reqs) { + PluginMetadata pm; + ASSERT_TRUE(pm.Reqs().empty()); + pm.Reqs({ + loot::File("Blank.esm") + }); + EXPECT_EQ(std::set({ + loot::File("Blank.esm") + }), pm.Reqs()); +} + +TEST(PluginMetadata, Incs) { + PluginMetadata pm; + ASSERT_TRUE(pm.Incs().empty()); + pm.Incs({ + loot::File("Blank.esm") + }); + EXPECT_EQ(std::set({ + loot::File("Blank.esm") + }), pm.Incs()); +} + +TEST(PluginMetadata, Messages) { + PluginMetadata pm; + ASSERT_TRUE(pm.Messages().empty()); + pm.Messages({ + loot::Message(loot::Message::say, "content") + }); + EXPECT_EQ(std::list({ + loot::Message(loot::Message::say, "content") + }), pm.Messages()); +} + +TEST(PluginMetadata, Tags) { + PluginMetadata pm; + ASSERT_TRUE(pm.Tags().empty()); + pm.Tags({ + loot::Tag("Relev") + }); + EXPECT_EQ(std::set({ + loot::Tag("Relev") + }), pm.Tags()); +} + +TEST(PluginMetadata, DirtyInfo) { + PluginMetadata pm; + ASSERT_TRUE(pm.DirtyInfo().empty()); + pm.DirtyInfo({ + loot::PluginDirtyInfo(5, 0, 1, 2, "utility") + }); + EXPECT_EQ(std::set({ + loot::PluginDirtyInfo(5, 0, 1, 2, "utility") + }), pm.DirtyInfo()); +} + +TEST(PluginMetadata, Locations) { + PluginMetadata pm; + ASSERT_TRUE(pm.Locations().empty()); + pm.Locations({ + loot::Location("http://www.example.com") + }); + EXPECT_EQ(std::set({ + loot::Location("http://www.example.com") + }), pm.Locations()); +} + +TEST(PluginMetadata, HasNameOnly) { + PluginMetadata pm; + EXPECT_TRUE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + EXPECT_TRUE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.Enabled(false); + EXPECT_TRUE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.SetPriorityExplicit(true); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.LoadAfter({loot::File("Blank.esm")}); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.Reqs({loot::File("Blank.esm")}); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.Incs({loot::File("Blank.esm")}); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.Messages({loot::Message(loot::Message::say, "content")}); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.Tags({loot::Tag("Relev")}); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.DirtyInfo({loot::PluginDirtyInfo(5, 0, 1, 2, "utility")}); + EXPECT_FALSE(pm.HasNameOnly()); + + pm = PluginMetadata("Blank.esp"); + pm.Locations({loot::Location("http://www.example.com")}); + EXPECT_FALSE(pm.HasNameOnly()); +} + +TEST(PluginMetadata, IsRegexPlugin) { + PluginMetadata pm; + EXPECT_FALSE(pm.IsRegexPlugin()); + + pm.Name("Blank.esm"); + EXPECT_FALSE(pm.IsRegexPlugin()); + + pm.Name("Blank[[:blank:]]- Different.esm"); + EXPECT_FALSE(pm.IsRegexPlugin()); + + pm.Name("Blank\\.esm"); + EXPECT_TRUE(pm.IsRegexPlugin()); + + pm.Name("Blank - (Different )*Master Dependent.esm"); + EXPECT_FALSE(pm.IsRegexPlugin()); + + pm.Name("Blank - (Different )?Master Dependent.esm"); + EXPECT_FALSE(pm.IsRegexPlugin()); + + pm.Name("Blank.es(p|m)"); + EXPECT_FALSE(pm.IsRegexPlugin()); +} + +TEST(PluginMetadata, YamlEmitter) { + PluginMetadata pm("Blank.esp"); + YAML::Emitter e1; + e1 << pm; + EXPECT_STREQ("", e1.c_str()); + + pm.SetPriorityExplicit(true); + YAML::Emitter e2; + e2 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0", e2.c_str()); + + pm.Enabled(false); + YAML::Emitter e3; + e3 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false", e3.c_str()); + + pm.LoadAfter({loot::File("Blank.esm")}); + YAML::Emitter e4; + e4 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'", e4.c_str()); + + pm.Reqs({loot::File("Blank.esm")}); + YAML::Emitter e5; + e5 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'", e5.c_str()); + + pm.Incs({loot::File("Blank.esm")}); + YAML::Emitter e6; + e6 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'", e6.c_str()); + + pm.Messages({loot::Message(loot::Message::say, "content")}); + YAML::Emitter e7; + e7 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'", e7.c_str()); + + pm.Tags({loot::Tag("Relev")}); + YAML::Emitter e8; + e8 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + "tag:\n" + " - Relev", e8.c_str()); + + pm.DirtyInfo({loot::PluginDirtyInfo(5, 0, 1, 2, "utility")}); + YAML::Emitter e9; + e9 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + "tag:\n" + " - Relev\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2", e9.c_str()); + + pm.Locations({loot::Location("http://www.example.com")}); + YAML::Emitter e10; + e10 << pm; + EXPECT_STREQ("name: 'Blank.esp'\n" + "priority: 0\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + "tag:\n" + " - Relev\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + "url:\n" + " - 'http://www.example.com'", e10.c_str()); +} + +TEST(PluginMetadata, YamlEncode) { + YAML::Node node; + + PluginMetadata pm("Blank.esp"); + node = pm; + EXPECT_EQ("Blank.esp", node["name"].as()); + EXPECT_FALSE(node["enabled"]); + EXPECT_FALSE(node["priority"]); + EXPECT_FALSE(node["after"]); + EXPECT_FALSE(node["req"]); + EXPECT_FALSE(node["inc"]); + EXPECT_FALSE(node["msg"]); + EXPECT_FALSE(node["tag"]); + EXPECT_FALSE(node["dirty"]); + EXPECT_FALSE(node["url"]); + + pm.SetPriorityExplicit(true); + node = pm; + EXPECT_EQ(0, node["priority"].as()); + + pm.Enabled(false); + node = pm; + EXPECT_FALSE(node["enabled"].as()); + + pm.LoadAfter({loot::File("Blank.esm")}); + node = pm; + EXPECT_EQ(pm.LoadAfter(), node["after"].as>()); + + pm.Reqs({loot::File("Blank.esm")}); + node = pm; + EXPECT_EQ(pm.Reqs(), node["req"].as>()); + + pm.Incs({loot::File("Blank.esm")}); + node = pm; + EXPECT_EQ(pm.Incs(), node["inc"].as>()); + + pm.Messages({loot::Message(loot::Message::say, "content")}); + node = pm; + EXPECT_EQ(pm.Messages(), node["msg"].as>()); + + pm.Tags({loot::Tag("Relev")}); + node = pm; + EXPECT_EQ(pm.Tags(), node["tag"].as>()); + + pm.DirtyInfo({loot::PluginDirtyInfo(5, 0, 1, 2, "utility")}); + node = pm; + EXPECT_EQ(pm.DirtyInfo(), node["dirty"].as>()); + + pm.Locations({loot::Location("http://www.example.com")}); + node = pm; + EXPECT_EQ(pm.Locations(), node["url"].as>()); +} + +TEST(PluginMetadata, YamlDecode) { + YAML::Node node; + PluginMetadata pm; + + node = YAML::Load("Blank.esp"); + EXPECT_ANY_THROW(node.as()); + + node = YAML::Load("name: Blank.esp"); + pm = node.as(); + EXPECT_EQ("Blank.esp", pm.Name()); + + node = YAML::Load("name: 'Blank.esp'\n" + "priority: 5\n" + "enabled: false\n" + "after:\n" + " - 'Blank.esm'\n" + "req:\n" + " - 'Blank.esm'\n" + "inc:\n" + " - 'Blank.esm'\n" + "msg:\n" + " - type: say\n" + " content: 'content'\n" + "tag:\n" + " - Relev\n" + "dirty:\n" + " - crc: 0x5\n" + " util: 'utility'\n" + " udr: 1\n" + " nav: 2\n" + "url:\n" + " - 'http://www.example.com'"); + pm = node.as(); + EXPECT_EQ("Blank.esp", pm.Name()); + EXPECT_EQ(5, pm.Priority()); + EXPECT_TRUE(pm.IsPriorityExplicit()); + EXPECT_FALSE(pm.Enabled()); + EXPECT_EQ(std::set({ + loot::File("Blank.esm") + }), pm.LoadAfter()); + EXPECT_EQ(std::set({ + loot::File("Blank.esm") + }), pm.Reqs()); + EXPECT_EQ(std::set({ + loot::File("Blank.esm") + }), pm.Incs()); + EXPECT_EQ(std::list({ + loot::Message(loot::Message::say, "content") + }), pm.Messages()); + EXPECT_EQ(std::set({ + loot::Tag("Relev") + }), pm.Tags()); + EXPECT_EQ(std::set({ + loot::PluginDirtyInfo(5, 0, 1, 2, "utility") + }), pm.DirtyInfo()); + EXPECT_EQ(std::set({ + loot::Location("http://www.example.com") + }), pm.Locations()); + + node = YAML::Load("scalar"); + EXPECT_ANY_THROW(node.as()); + + node = YAML::Load("[0, 1, 2]"); + EXPECT_ANY_THROW(node.as()); +} + +#endif + diff --git a/src/tests/main.cpp b/src/tests/main.cpp index 2688fd15..61107099 100644 --- a/src/tests/main.cpp +++ b/src/tests/main.cpp @@ -39,6 +39,7 @@ #include "backend/metadata/test_message.h" #include "backend/metadata/test_message_content.h" #include "backend/metadata/test_plugin_dirty_info.h" +#include "backend/metadata/test_plugin_metadata.h" #include "backend/metadata/test_tag.h" #include "backend/helpers/test_git_helper.h" #include "backend/helpers/test_helpers.h"