diff --git a/CMakeLists.txt b/CMakeLists.txt
index c7429a29..579f328d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -170,6 +170,7 @@ set (LOOT_TESTS_HEADERS "${CMAKE_SOURCE_DIR}/src/tests/fixtures.h"
"${CMAKE_SOURCE_DIR}/src/tests/backend/metadata/test_file.h"
"${CMAKE_SOURCE_DIR}/src/tests/backend/metadata/test_formid.h"
"${CMAKE_SOURCE_DIR}/src/tests/backend/metadata/test_location.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_tag.h")
diff --git a/src/tests/backend/metadata/test_message.h b/src/tests/backend/metadata/test_message.h
new file mode 100644
index 00000000..0e25cf30
--- /dev/null
+++ b/src/tests/backend/metadata/test_message.h
@@ -0,0 +1,382 @@
+/* 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_MESSAGE
+#define LOOT_TEST_BACKEND_METADATA_MESSAGE
+
+#include "backend/metadata/message.h"
+#include "tests/fixtures.h"
+
+class Message : public SkyrimTest {};
+
+using loot::MessageContent;
+using loot::Language;
+
+typedef std::vector MessageContents;
+
+TEST_F(Message, ConstructorsAndDataAccess) {
+ loot::Message message;
+ EXPECT_EQ(loot::Message::say, message.Type());
+ EXPECT_EQ(MessageContents(), message.Content());
+
+ message = loot::Message(loot::Message::say, "content1", "condition1");
+ EXPECT_EQ(loot::Message::say, message.Type());
+ EXPECT_EQ(MessageContents({
+ MessageContent("content1", Language::english)
+ }), message.Content());
+ EXPECT_EQ("condition1", message.Condition());
+
+ MessageContents mc({MessageContent("content1", Language::english)});
+ message = loot::Message(loot::Message::say, mc, "condition1");
+ EXPECT_EQ(loot::Message::say, message.Type());
+ EXPECT_EQ(mc, message.Content());
+ EXPECT_EQ("condition1", message.Condition());
+}
+
+TEST_F(Message, EqualityOperator) {
+ loot::Message message1, message2;
+ EXPECT_TRUE(message1 == message2);
+
+ message1 = loot::Message(loot::Message::say, "content1", "condition1");
+ message2 = loot::Message(loot::Message::say, "content1", "condition2");
+ EXPECT_TRUE(message1 == message2);
+
+ message1 = loot::Message(loot::Message::say, "content1", "condition1");
+ message2 = loot::Message(loot::Message::say, "content2", "condition1");
+ EXPECT_FALSE(message1 == message2);
+
+ message1 = loot::Message(loot::Message::say, "content1", "condition1");
+ message2 = loot::Message(loot::Message::warn, "content1", "condition1");
+ EXPECT_TRUE(message1 == message2);
+
+ message1 = loot::Message(loot::Message::say, "content1", "condition1");
+ message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1");
+ EXPECT_TRUE(message1 == message2);
+
+ message1 = loot::Message(loot::Message::say, "content1", "condition1");
+ message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content2", Language::english)}), "condition1");
+ EXPECT_FALSE(message1 == message2);
+
+ message1 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1");
+ message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1");
+ EXPECT_TRUE(message1 == message2);
+
+ message1 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1");
+ message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content2", Language::english)}), "condition1");
+ EXPECT_FALSE(message1 == message2);
+
+ message1 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1");
+ message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::french)}), "condition1");
+ EXPECT_TRUE(message1 == message2);
+}
+
+TEST_F(Message, LessThanOperator) {
+ loot::Message message1, message2;
+ EXPECT_FALSE(message1 < message2);
+ EXPECT_FALSE(message2 < message1);
+
+ message1 = loot::Message(loot::Message::say, "content1", "condition1");
+ message2 = loot::Message(loot::Message::say, "content1", "condition1");
+ EXPECT_FALSE(message1 < message2);
+ EXPECT_FALSE(message2 < message1);
+
+ message1 = loot::Message(loot::Message::say, "content1", "condition1");
+ message2 = loot::Message(loot::Message::say, "content1", "condition2");
+ EXPECT_FALSE(message1 < message2);
+ EXPECT_FALSE(message2 < message1);
+
+ message1 = loot::Message(loot::Message::say, "content1", "condition1");
+ message2 = loot::Message(loot::Message::warn, "content1", "condition1");
+ EXPECT_FALSE(message1 < message2);
+ EXPECT_FALSE(message2 < message1);
+
+ message1 = loot::Message(loot::Message::say, "", "condition1");
+ message2 = loot::Message(loot::Message::say, "content1", "condition1");
+ EXPECT_TRUE(message1 < message2);
+ EXPECT_FALSE(message2 < message1);
+
+ message1 = loot::Message(loot::Message::say, "content1", "condition1");
+ message2 = loot::Message(loot::Message::say, "", "condition1");
+ EXPECT_FALSE(message1 < message2);
+ EXPECT_TRUE(message2 < message1);
+
+ message1 = loot::Message(loot::Message::say, "content1", "condition1");
+ message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1");
+ EXPECT_FALSE(message1 < message2);
+ EXPECT_FALSE(message2 < message1);
+
+ message1 = loot::Message(loot::Message::say, "content1", "condition1");
+ message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content2", Language::english)}), "condition1");
+ EXPECT_TRUE(message1 < message2);
+ EXPECT_FALSE(message2 < message1);
+
+ message1 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1");
+ message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1");
+ EXPECT_FALSE(message1 < message2);
+ EXPECT_FALSE(message2 < message1);
+
+ message1 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1");
+ message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content2", Language::english)}), "condition1");
+ EXPECT_TRUE(message1 < message2);
+ EXPECT_FALSE(message2 < message1);
+
+ message1 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::english)}), "condition1");
+ message2 = loot::Message(loot::Message::say, MessageContents({MessageContent("content1", Language::french)}), "condition1");
+ EXPECT_FALSE(message1 < message2);
+ EXPECT_FALSE(message2 < message1);
+}
+
+TEST_F(Message, EvalCondition) {
+ loot::Game game(loot::Game::tes5);
+ game.SetGamePath(dataPath.parent_path());
+ ASSERT_NO_THROW(game.Init(false, localPath));
+
+ loot::Message message;
+ EXPECT_TRUE(message.EvalCondition(game, Language::any));
+ EXPECT_EQ(1, message.Content().size());
+
+ message = loot::Message(loot::Message::say, MessageContents({
+ MessageContent("content1", Language::german),
+ MessageContent("content1", Language::english),
+ MessageContent("content1", Language::french),
+ }));
+ EXPECT_TRUE(message.EvalCondition(game, Language::french));
+ EXPECT_EQ(1, message.Content().size());
+}
+
+TEST_F(Message, ChooseContent) {
+ MessageContent mc;
+ loot::Message message;
+ EXPECT_EQ(mc, message.ChooseContent(Language::any));
+ EXPECT_EQ(mc, message.ChooseContent(Language::french));
+ EXPECT_EQ(mc, message.ChooseContent(Language::english));
+
+ mc = MessageContent("content1", Language::english);
+ message = loot::Message(loot::Message::say, "content1");
+ EXPECT_EQ(mc, message.ChooseContent(Language::any));
+ EXPECT_EQ(mc, message.ChooseContent(Language::french));
+ EXPECT_EQ(mc, message.ChooseContent(Language::english));
+
+ mc = MessageContent("content1", Language::english);
+ message = loot::Message(loot::Message::say, MessageContents({mc}));
+ EXPECT_EQ(mc, message.ChooseContent(Language::any));
+ EXPECT_EQ(mc, message.ChooseContent(Language::french));
+ EXPECT_EQ(mc, message.ChooseContent(Language::english));
+
+ mc = MessageContent("content1", Language::english);
+ message = loot::Message(loot::Message::say, MessageContents({
+ MessageContent("content1", Language::english),
+ MessageContent("content1", Language::german),
+ }));
+ EXPECT_EQ(mc, message.ChooseContent(Language::any));
+ EXPECT_EQ(mc, message.ChooseContent(Language::french));
+ EXPECT_EQ(mc, message.ChooseContent(Language::english));
+
+ message = loot::Message(loot::Message::say, MessageContents({
+ MessageContent("content1", Language::german),
+ MessageContent("content1", Language::english),
+ MessageContent("content1", Language::french),
+ }));
+ EXPECT_EQ(MessageContent("content1", Language::german), message.ChooseContent(Language::any));
+ EXPECT_EQ(MessageContent("content1", Language::french), message.ChooseContent(Language::french));
+ EXPECT_EQ(MessageContent("content1", Language::english), message.ChooseContent(Language::english));
+
+ mc = MessageContent("content1", Language::german);
+ message = loot::Message(loot::Message::say, MessageContents({mc}));
+ EXPECT_EQ(mc, message.ChooseContent(Language::any));
+ EXPECT_EQ(mc, message.ChooseContent(Language::french));
+}
+
+TEST_F(Message, YamlEmitter) {
+ loot::Message message(loot::Message::say, "content1");
+ YAML::Emitter e1;
+ e1 << message;
+ EXPECT_STREQ("type: say\n"
+ "content: 'content1'", e1.c_str());
+
+ message = loot::Message(loot::Message::warn, "content1");
+ YAML::Emitter e2;
+ e2 << message;
+ EXPECT_STREQ("type: warn\n"
+ "content: 'content1'", e2.c_str());
+
+ message = loot::Message(loot::Message::error, "content1");
+ YAML::Emitter e3;
+ e3 << message;
+ EXPECT_STREQ("type: error\n"
+ "content: 'content1'", e3.c_str());
+
+ message = loot::Message(loot::Message::say, "content1", "condition1");
+ YAML::Emitter e4;
+ e4 << message;
+ EXPECT_STREQ("type: say\n"
+ "content: 'content1'\n"
+ "condition: 'condition1'", e4.c_str());
+
+ message = loot::Message(loot::Message::say, MessageContents({
+ MessageContent("content1", Language::english),
+ }));
+ YAML::Emitter e5;
+ e5 << message;
+ EXPECT_STREQ("type: say\n"
+ "content: 'content1'", e5.c_str());
+
+ message = loot::Message(loot::Message::say, MessageContents({
+ MessageContent("content1", Language::english),
+ MessageContent("content2", Language::german)
+ }));
+ YAML::Emitter e6;
+ e6 << message;
+ EXPECT_STREQ("type: say\n"
+ "content:\n"
+ " - lang: en\n"
+ " str: 'content1'\n"
+ " - lang: de\n"
+ " str: 'content2'", e6.c_str());
+}
+
+TEST_F(Message, YamlEncode) {
+ YAML::Node node;
+
+ MessageContents mcs({MessageContent("content1", Language::english)});
+ loot::Message message(loot::Message::say, "content1");
+ node = message;
+ EXPECT_EQ("say", node["type"].as());
+ EXPECT_EQ(mcs, node["content"].as());
+ EXPECT_FALSE(node["condition"]);
+
+ message = loot::Message(loot::Message::warn, "content1");
+ node = message;
+ EXPECT_EQ("warn", node["type"].as());
+ EXPECT_EQ(mcs, node["content"].as());
+ EXPECT_FALSE(node["condition"]);
+
+ message = loot::Message(loot::Message::error, "content1");
+ node = message;
+ EXPECT_EQ("error", node["type"].as());
+ EXPECT_EQ(mcs, node["content"].as());
+ EXPECT_FALSE(node["condition"]);
+
+ message = loot::Message(loot::Message::say, "content1", "condition1");
+ node = message;
+ EXPECT_EQ("say", node["type"].as());
+ EXPECT_EQ(mcs, node["content"].as());
+ EXPECT_EQ("condition1", node["condition"].as());
+
+ mcs = MessageContents({
+ MessageContent("content1", Language::english),
+ MessageContent("content2", Language::french),
+ });
+ message = loot::Message(loot::Message::say, mcs);
+ node = message;
+ EXPECT_EQ("say", node["type"].as());
+ EXPECT_EQ(mcs, node["content"].as());
+ EXPECT_FALSE(node["condition"]);
+}
+
+TEST_F(Message, YamlDecode) {
+ YAML::Node node = YAML::Load("type: say\n"
+ "content: content1");
+ loot::Message message = node.as();
+ EXPECT_EQ(loot::Message::say, message.Type());
+ EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content());
+ EXPECT_EQ("", message.Condition());
+
+ node = YAML::Load("type: warn\n"
+ "content: content1");
+ message = node.as();
+ EXPECT_EQ(loot::Message::warn, message.Type());
+ EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content());
+ EXPECT_EQ("", message.Condition());
+
+ node = YAML::Load("type: error\n"
+ "content: content1");
+ message = node.as();
+ EXPECT_EQ(loot::Message::error, message.Type());
+ EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content());
+ EXPECT_EQ("", message.Condition());
+
+ node = YAML::Load("type: invalid\n"
+ "content: content1");
+ message = node.as();
+ EXPECT_EQ(loot::Message::say, message.Type());
+ EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content());
+ EXPECT_EQ("", message.Condition());
+
+ node = YAML::Load("type: say\n"
+ "content: content1\n"
+ "condition: condition1");
+ message = node.as();
+ EXPECT_EQ(loot::Message::say, message.Type());
+ EXPECT_EQ(MessageContents({MessageContent("content1", Language::english)}), message.Content());
+ EXPECT_EQ("condition1", message.Condition());
+
+ node = YAML::Load("type: say\n"
+ "content:\n"
+ " - lang: en\n"
+ " str: content1\n"
+ " - lang: de\n"
+ " str: content2");
+ message = node.as();
+ EXPECT_EQ(loot::Message::say, message.Type());
+ EXPECT_EQ(MessageContents({
+ MessageContent("content1", Language::english),
+ MessageContent("content2", Language::german),
+ }), message.Content());
+ EXPECT_EQ("", message.Condition());
+
+ node = YAML::Load("type: say\n"
+ "content:\n"
+ " - lang: fr\n"
+ " str: content1");
+ message = node.as();
+ EXPECT_EQ(loot::Message::say, message.Type());
+ EXPECT_EQ(MessageContents({MessageContent("content1", Language::french)}), message.Content());
+ EXPECT_EQ("", message.Condition());
+
+ node = YAML::Load("type: say\n"
+ "content:\n"
+ " - lang: de\n"
+ " str: content1\n"
+ " - lang: fr\n"
+ " str: content2");
+ EXPECT_ANY_THROW(message = node.as());
+
+ node = YAML::Load("type: say\n"
+ "content: con%1%tent1\n"
+ "subs:\n"
+ " - sub1");
+ message = node.as();
+ EXPECT_EQ(loot::Message::say, message.Type());
+ EXPECT_EQ(MessageContents({MessageContent("consub1tent1", Language::english)}), message.Content());
+ EXPECT_EQ("", message.Condition());
+
+ 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/backend/metadata/test_plugin_dirty_info.h b/src/tests/backend/metadata/test_plugin_dirty_info.h
index 46d953c3..ee9a693d 100644
--- a/src/tests/backend/metadata/test_plugin_dirty_info.h
+++ b/src/tests/backend/metadata/test_plugin_dirty_info.h
@@ -29,7 +29,6 @@ along with LOOT. If not, see
#include "tests/fixtures.h"
using loot::PluginDirtyInfo;
-using loot::Message;
TEST(PluginDirtyInfo, ConstructorsAndDataAccess) {
PluginDirtyInfo info;
@@ -48,38 +47,38 @@ TEST(PluginDirtyInfo, ConstructorsAndDataAccess) {
}
TEST(PluginDirtyInfo, MessageOutput) {
- Message message;
+ loot::Message message;
message = PluginDirtyInfo(0x12345678, 2, 10, 30, "cleaner").AsMessage();
- EXPECT_EQ(Message::warn, message.Type());
+ EXPECT_EQ(loot::Message::warn, message.Type());
EXPECT_EQ("Contains 2 ITM records, 10 deleted references and 30 deleted navmeshes. Clean with cleaner.", message.ChooseContent(Language::any).Str());
message = PluginDirtyInfo(0x12345678, 0, 0, 0, "cleaner").AsMessage();
- EXPECT_EQ(Message::warn, message.Type());
+ EXPECT_EQ(loot::Message::warn, message.Type());
EXPECT_EQ("Clean with cleaner.", message.ChooseContent(Language::any).Str());
message = PluginDirtyInfo(0x12345678, 0, 10, 30, "cleaner").AsMessage();
- EXPECT_EQ(Message::warn, message.Type());
+ EXPECT_EQ(loot::Message::warn, message.Type());
EXPECT_EQ("Contains 10 deleted references and 30 deleted navmeshes. Clean with cleaner.", message.ChooseContent(Language::any).Str());
message = PluginDirtyInfo(0x12345678, 0, 0, 30, "cleaner").AsMessage();
- EXPECT_EQ(Message::warn, message.Type());
+ EXPECT_EQ(loot::Message::warn, message.Type());
EXPECT_EQ("Contains 30 deleted navmeshes. Clean with cleaner.", message.ChooseContent(Language::any).Str());
message = PluginDirtyInfo(0x12345678, 0, 10, 0, "cleaner").AsMessage();
- EXPECT_EQ(Message::warn, message.Type());
+ EXPECT_EQ(loot::Message::warn, message.Type());
EXPECT_EQ("Contains 10 deleted references. Clean with cleaner.", message.ChooseContent(Language::any).Str());
message = PluginDirtyInfo(0x12345678, 2, 0, 30, "cleaner").AsMessage();
- EXPECT_EQ(Message::warn, message.Type());
+ EXPECT_EQ(loot::Message::warn, message.Type());
EXPECT_EQ("Contains 2 ITM records and 30 deleted navmeshes. Clean with cleaner.", message.ChooseContent(Language::any).Str());
message = PluginDirtyInfo(0x12345678, 2, 0, 0, "cleaner").AsMessage();
- EXPECT_EQ(Message::warn, message.Type());
+ EXPECT_EQ(loot::Message::warn, message.Type());
EXPECT_EQ("Contains 2 ITM records. Clean with cleaner.", message.ChooseContent(Language::any).Str());
message = PluginDirtyInfo(0x12345678, 2, 10, 0, "cleaner").AsMessage();
- EXPECT_EQ(Message::warn, message.Type());
+ EXPECT_EQ(loot::Message::warn, message.Type());
EXPECT_EQ("Contains 2 ITM records and 10 deleted references. Clean with cleaner.", message.ChooseContent(Language::any).Str());
}
diff --git a/src/tests/main.cpp b/src/tests/main.cpp
index cfbcdd11..2688fd15 100644
--- a/src/tests/main.cpp
+++ b/src/tests/main.cpp
@@ -36,6 +36,7 @@
#include "backend/metadata/test_file.h"
#include "backend/metadata/test_formid.h"
#include "backend/metadata/test_location.h"
+#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_tag.h"