From 7d3080c948f0f28ebbf97a365f0d25fc4676ab54 Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Sat, 26 Mar 2016 10:10:22 +0000 Subject: [PATCH] Throw if constructing a non-English multilingual message This matches the behaviour for when converting from YAML, ensuring that a non-English multilingual message can never be created. --- src/backend/metadata/message.cpp | 13 ++++++++++++- src/tests/backend/metadata/message_test.h | 8 ++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/backend/metadata/message.cpp b/src/backend/metadata/message.cpp index 92f6fb8f..a5d0eb8e 100644 --- a/src/backend/metadata/message.cpp +++ b/src/backend/metadata/message.cpp @@ -24,6 +24,7 @@ #include "message.h" #include "../helpers/language.h" +#include "../error.h" #include @@ -42,7 +43,17 @@ namespace loot { } Message::Message(const unsigned int type, const std::vector& content, - const std::string& condition) : _type(type), _content(content), ConditionalMetadata(condition) {} + const std::string& condition) : _type(type), _content(content), ConditionalMetadata(condition) { + if (content.size() > 1) { + bool englishStringExists = false; + for (const auto &mc : content) { + if (mc.Language() == loot::Language::english) + englishStringExists = true; + } + if (!englishStringExists) + throw loot::error(error::invalid_args, "bad conversion: multilingual messages must contain an English content string"); + } + } bool Message::operator < (const Message& rhs) const { if (!_content.empty() && !rhs.Content().empty()) diff --git a/src/tests/backend/metadata/message_test.h b/src/tests/backend/metadata/message_test.h index 8a375de4..1c6e2c3a 100644 --- a/src/tests/backend/metadata/message_test.h +++ b/src/tests/backend/metadata/message_test.h @@ -71,6 +71,14 @@ namespace loot { EXPECT_EQ("condition1", message.Condition()); } + TEST_P(MessageTest, vectorContentConstructorShouldThrowIfMultipleContentStringsAreGivenAndNoneAreEnglish) { + MessageContents contents({ + MessageContent("content1", Language::german), + MessageContent("content2", Language::french), + }); + EXPECT_ANY_THROW(Message(Message::error, contents, "condition1")); + } + TEST_P(MessageTest, messagesWithDifferentContentStringsShouldBeUnequal) { Message message1(Message::say, "content1", "condition1"); Message message2(Message::say, "content2", "condition1");