From 8a7862dbabf0481f38e0f0508581d853cd75ddc5 Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Fri, 19 Aug 2016 23:09:30 +0100 Subject: [PATCH] Specify language in DatabaseInterface::GetPluginMessages This can be useful if getting messages before metadata evaluation and a non-English string is wanted. --- include/loot/database_interface.h | 8 +++++++- src/api/api_database.cpp | 11 +++++----- src/api/api_database.h | 3 ++- src/backend/metadata/message.cpp | 16 +++++---------- src/backend/metadata/message.h | 4 +--- src/tests/api/database_interface_test.h | 10 +++++----- src/tests/backend/metadata/message_test.h | 20 ++++++++++++++++--- .../metadata/plugin_cleaning_data_test.h | 16 +++++++-------- 8 files changed, 51 insertions(+), 37 deletions(-) diff --git a/include/loot/database_interface.h b/include/loot/database_interface.h index 76b835d5..e29aa6c8 100644 --- a/include/loot/database_interface.h +++ b/include/loot/database_interface.h @@ -170,10 +170,16 @@ public: * database. * @param plugin * The filename of the plugin to look up messages for. + * @param language + * The language to use when choosing which message content strings + * to return. This has no effect if `EvalLists` has been called, + * as it selects content strings, discarding non-selected strings, + * during its operation. * @returns A vector of messages associated with the specified plugin. Empty * if the plugin has no messages associated with it. */ - virtual std::vector GetPluginMessages(const std::string& plugin) = 0; + virtual std::vector GetPluginMessages(const std::string& plugin, + const LanguageCode language) = 0; /** * @brief Determines the database's knowledge of a plugin's cleanliness. diff --git a/src/api/api_database.cpp b/src/api/api_database.cpp index 343c1ca6..70c7ec20 100644 --- a/src/api/api_database.cpp +++ b/src/api/api_database.cpp @@ -163,14 +163,15 @@ PluginTags ApiDatabase::GetPluginTags(const std::string& plugin) { return tags; } -std::vector ApiDatabase::GetPluginMessages(const std::string& plugin) { +std::vector ApiDatabase::GetPluginMessages(const std::string& plugin, + const LanguageCode language) { std::vector messages; PluginMetadata pluginMetadata = game_.GetMasterlist().FindPlugin(PluginMetadata(plugin)); for (const auto& message : pluginMetadata.Messages()) { PluginMessage pluginMessage; pluginMessage.type = message.GetType(); - pluginMessage.text = message.GetText(); + pluginMessage.text = message.GetContent(language).GetText(); messages.push_back(pluginMessage); } @@ -178,7 +179,7 @@ std::vector ApiDatabase::GetPluginMessages(const std::string& plu for (const auto& message : pluginMetadata.Messages()) { PluginMessage pluginMessage; pluginMessage.type = message.GetType(); - pluginMessage.text = message.GetText(); + pluginMessage.text = message.GetContent(language).GetText(); messages.push_back(pluginMessage); } @@ -199,7 +200,7 @@ PluginCleanliness ApiDatabase::GetPluginCleanliness(const std::string& plugin) { std::list messages(game_.GetMasterlist().FindPlugin(PluginMetadata(plugin)).Messages()); for (const auto& message : messages) { - if (boost::starts_with(message.GetText(), "Do not clean")) { + if (boost::starts_with(message.GetContent(LanguageCode::english).GetText(), "Do not clean")) { return PluginCleanliness::do_not_clean; } } @@ -207,7 +208,7 @@ PluginCleanliness ApiDatabase::GetPluginCleanliness(const std::string& plugin) { messages = game_.GetUserlist().FindPlugin(PluginMetadata(plugin)).Messages(); for (const auto& message : messages) { - if (boost::starts_with(message.GetText(), "Do not clean")) { + if (boost::starts_with(message.GetContent(LanguageCode::english).GetText(), "Do not clean")) { return PluginCleanliness::do_not_clean; } } diff --git a/src/api/api_database.h b/src/api/api_database.h index e7c932cb..5445268d 100644 --- a/src/api/api_database.h +++ b/src/api/api_database.h @@ -54,7 +54,8 @@ struct ApiDatabase : public DatabaseInterface { PluginTags GetPluginTags(const std::string& plugin); - std::vector GetPluginMessages(const std::string& plugin); + std::vector GetPluginMessages(const std::string& plugin, + const LanguageCode language); PluginCleanliness GetPluginCleanliness(const std::string& plugin); diff --git a/src/backend/metadata/message.cpp b/src/backend/metadata/message.cpp index 9a114049..4c1a1f3a 100644 --- a/src/backend/metadata/message.cpp +++ b/src/backend/metadata/message.cpp @@ -53,7 +53,7 @@ Message::Message(const MessageType type, const std::vector& cont bool Message::operator < (const Message& rhs) const { if (!content_.empty() && !rhs.GetContent().empty()) - return boost::ilexicographical_compare(ChooseContent(LanguageCode::english).GetText(), rhs.ChooseContent(LanguageCode::english).GetText()); + return boost::ilexicographical_compare(GetContent(LanguageCode::english).GetText(), rhs.GetContent(LanguageCode::english).GetText()); else if (content_.empty() && !rhs.GetContent().empty()) return true; else @@ -66,27 +66,21 @@ bool Message::operator == (const Message& rhs) const { bool Message::EvalCondition(loot::Game& game, const LanguageCode language) { BOOST_LOG_TRIVIAL(trace) << "Choosing message content for language: " << Language(language).GetName(); - content_.assign({ChooseContent(language)}); + content_.assign({GetContent(language)}); return ConditionalMetadata::EvalCondition(game); } -MessageContent Message::ChooseContent(const LanguageCode language) const { - BOOST_LOG_TRIVIAL(trace) << "Choosing message content."; - return MessageContent::Choose(content_, language); -} - MessageType Message::GetType() const { return type_; } -std::string Message::GetText() const { - return ChooseContent(LanguageCode::english).GetText(); -} - std::vector Message::GetContent() const { return content_; } +MessageContent Message::GetContent(const LanguageCode language) const { + return MessageContent::Choose(content_, language); +} } namespace YAML { diff --git a/src/backend/metadata/message.h b/src/backend/metadata/message.h index 3494554d..159bfba0 100644 --- a/src/backend/metadata/message.h +++ b/src/backend/metadata/message.h @@ -53,11 +53,9 @@ public: bool EvalCondition(Game& game, const LanguageCode language); MessageType GetType() const; - std::string GetText() const; std::vector GetContent() const; + MessageContent GetContent(const LanguageCode language) const; private: - MessageContent ChooseContent(const LanguageCode language) const; - MessageType type_; std::vector content_; }; diff --git a/src/tests/api/database_interface_test.h b/src/tests/api/database_interface_test.h index f7d4950d..09c08828 100644 --- a/src/tests/api/database_interface_test.h +++ b/src/tests/api/database_interface_test.h @@ -350,7 +350,7 @@ TEST_P(DatabaseInterfaceTest, getPluginTagsShouldOutputTheCorrectBashTagsForPlug TEST_P(DatabaseInterfaceTest, getPluginMessagesShouldReturnOkAndOutputANullArrayIfAPluginWithNoMessagesIsQueried) { std::vector messages; - EXPECT_NO_THROW(messages = db_->GetPluginMessages(blankEsp)); + EXPECT_NO_THROW(messages = db_->GetPluginMessages(blankEsp, LanguageCode::english)); EXPECT_TRUE(messages.empty()); } @@ -359,7 +359,7 @@ TEST_P(DatabaseInterfaceTest, getPluginMessagesShouldReturnOkAndOutputANoteIfAPl ASSERT_NO_THROW(db_->LoadLists(masterlistPath.string(), "")); std::vector messages; - EXPECT_NO_THROW(messages = db_->GetPluginMessages(blankEsm)); + EXPECT_NO_THROW(messages = db_->GetPluginMessages(blankEsm, LanguageCode::english)); ASSERT_EQ(1, messages.size()); EXPECT_EQ(MessageType::say, messages[0].type); EXPECT_EQ(noteMessage, messages[0].text); @@ -370,7 +370,7 @@ TEST_P(DatabaseInterfaceTest, getPluginMessagesShouldReturnOkAndOutputAWarningIf ASSERT_NO_THROW(db_->LoadLists(masterlistPath.string(), "")); std::vector messages; - EXPECT_NO_THROW(messages = db_->GetPluginMessages(blankDifferentEsm)); + EXPECT_NO_THROW(messages = db_->GetPluginMessages(blankDifferentEsm, LanguageCode::english)); ASSERT_EQ(1, messages.size()); EXPECT_EQ(MessageType::warn, messages[0].type); EXPECT_EQ(warningMessage, messages[0].text); @@ -381,7 +381,7 @@ TEST_P(DatabaseInterfaceTest, getPluginMessagesShouldReturnOkAndOutputAnErrorIfA ASSERT_NO_THROW(db_->LoadLists(masterlistPath.string(), "")); std::vector messages; - EXPECT_NO_THROW(messages = db_->GetPluginMessages(blankDifferentEsp)); + EXPECT_NO_THROW(messages = db_->GetPluginMessages(blankDifferentEsp, LanguageCode::english)); ASSERT_EQ(1, messages.size()); EXPECT_EQ(MessageType::error, messages[0].type); EXPECT_EQ(errorMessage, messages[0].text); @@ -392,7 +392,7 @@ TEST_P(DatabaseInterfaceTest, getPluginMessagesShouldReturnOkAndOutputMultipleMe ASSERT_NO_THROW(db_->LoadLists(masterlistPath.string(), "")); std::vector messages; - EXPECT_NO_THROW(messages = db_->GetPluginMessages(blankDifferentMasterDependentEsp)); + EXPECT_NO_THROW(messages = db_->GetPluginMessages(blankDifferentMasterDependentEsp, LanguageCode::english)); ASSERT_EQ(3, messages.size()); EXPECT_EQ(MessageType::say, messages[0].type); EXPECT_EQ(noteMessage, messages[0].text); diff --git a/src/tests/backend/metadata/message_test.h b/src/tests/backend/metadata/message_test.h index 47cb3245..3eee8fac 100644 --- a/src/tests/backend/metadata/message_test.h +++ b/src/tests/backend/metadata/message_test.h @@ -158,7 +158,7 @@ TEST_P(MessageTest, evalConditionShouldSelectTheEnglishStringIfNoStringExistsFor EXPECT_EQ(MessageContents({content}), message.GetContent()); } -TEST_P(MessageTest, getTextShouldSelectTheEnglishStringIfThereAreMultipleContentStrings) { +TEST_P(MessageTest, getContentShouldSelectTheEnglishStringIfThereIsNoStringForTheGivenLanguage) { Game game(GetParam()); game.SetGamePath(dataPath.parent_path()); ASSERT_NO_THROW(game.Init(false, localPath)); @@ -169,7 +169,21 @@ TEST_P(MessageTest, getTextShouldSelectTheEnglishStringIfThereAreMultipleContent MessageContent("content3", LanguageCode::french), })); - EXPECT_EQ("content2", message.GetText()); + EXPECT_EQ("content2", message.GetContent(LanguageCode::korean).GetText()); +} + +TEST_P(MessageTest, getContentShouldSelectTheGivenLanguageStringIfItExists) { + Game game(GetParam()); + game.SetGamePath(dataPath.parent_path()); + ASSERT_NO_THROW(game.Init(false, localPath)); + + Message message(MessageType::say, MessageContents({ + MessageContent("content1", LanguageCode::german), + MessageContent("content2", LanguageCode::english), + MessageContent("content3", LanguageCode::french), + })); + + EXPECT_EQ("content3", message.GetContent(LanguageCode::french).GetText()); } TEST_P(MessageTest, getTextShouldSelectTheContentStringIfOnlyOneExists) { @@ -181,7 +195,7 @@ TEST_P(MessageTest, getTextShouldSelectTheContentStringIfOnlyOneExists) { MessageContent("content1", LanguageCode::german), })); - EXPECT_EQ("content1", message.GetText()); + EXPECT_EQ("content1", message.GetContent(LanguageCode::english).GetText()); } TEST_P(MessageTest, emittingAsYamlShouldOutputNoteMessageTypeCorrectly) { diff --git a/src/tests/backend/metadata/plugin_cleaning_data_test.h b/src/tests/backend/metadata/plugin_cleaning_data_test.h index 551699dc..1cb00441 100644 --- a/src/tests/backend/metadata/plugin_cleaning_data_test.h +++ b/src/tests/backend/metadata/plugin_cleaning_data_test.h @@ -71,35 +71,35 @@ TEST_P(PluginCleaningDataTest, contentConstructorShouldStoreAllGivenData) { TEST_P(PluginCleaningDataTest, asMessageShouldOutputAllNonZeroCounts) { Message message = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 30).AsMessage(); EXPECT_EQ(MessageType::warn, message.GetType()); - EXPECT_EQ("cleaner found 2 ITM records, 10 deleted references and 30 deleted navmeshes. info", message.GetText()); + EXPECT_EQ("cleaner found 2 ITM records, 10 deleted references and 30 deleted navmeshes. info", message.GetContent(LanguageCode::english).GetText()); message = PluginCleaningData(0x12345678, "cleaner", info_, 0, 0, 0).AsMessage(); EXPECT_EQ(MessageType::warn, message.GetType()); - EXPECT_EQ("cleaner found dirty edits. info", message.GetText()); + EXPECT_EQ("cleaner found dirty edits. info", message.GetContent(LanguageCode::english).GetText()); message = PluginCleaningData(0x12345678, "cleaner", info_, 0, 10, 30).AsMessage(); EXPECT_EQ(MessageType::warn, message.GetType()); - EXPECT_EQ("cleaner found 10 deleted references and 30 deleted navmeshes. info", message.GetText()); + EXPECT_EQ("cleaner found 10 deleted references and 30 deleted navmeshes. info", message.GetContent(LanguageCode::english).GetText()); message = PluginCleaningData(0x12345678, "cleaner", info_, 0, 0, 30).AsMessage(); EXPECT_EQ(MessageType::warn, message.GetType()); - EXPECT_EQ("cleaner found 30 deleted navmeshes. info", message.GetText()); + EXPECT_EQ("cleaner found 30 deleted navmeshes. info", message.GetContent(LanguageCode::english).GetText()); message = PluginCleaningData(0x12345678, "cleaner", info_, 0, 10, 0).AsMessage(); EXPECT_EQ(MessageType::warn, message.GetType()); - EXPECT_EQ("cleaner found 10 deleted references. info", message.GetText()); + EXPECT_EQ("cleaner found 10 deleted references. info", message.GetContent(LanguageCode::english).GetText()); message = PluginCleaningData(0x12345678, "cleaner", info_, 2, 0, 30).AsMessage(); EXPECT_EQ(MessageType::warn, message.GetType()); - EXPECT_EQ("cleaner found 2 ITM records and 30 deleted navmeshes. info", message.GetText()); + EXPECT_EQ("cleaner found 2 ITM records and 30 deleted navmeshes. info", message.GetContent(LanguageCode::english).GetText()); message = PluginCleaningData(0x12345678, "cleaner", info_, 2, 0, 0).AsMessage(); EXPECT_EQ(MessageType::warn, message.GetType()); - EXPECT_EQ("cleaner found 2 ITM records. info", message.GetText()); + EXPECT_EQ("cleaner found 2 ITM records. info", message.GetContent(LanguageCode::english).GetText()); message = PluginCleaningData(0x12345678, "cleaner", info_, 2, 10, 0).AsMessage(); EXPECT_EQ(MessageType::warn, message.GetType()); - EXPECT_EQ("cleaner found 2 ITM records and 10 deleted references. info", message.GetText()); + EXPECT_EQ("cleaner found 2 ITM records and 10 deleted references. info", message.GetContent(LanguageCode::english).GetText()); } TEST_P(PluginCleaningDataTest, dirtyInfoShouldBeEqualIfCrcValuesAreEqual) {