Specify language in DatabaseInterface::GetPluginMessages

This can be useful if getting messages before metadata evaluation and a
non-English string is wanted.
This commit is contained in:
Oliver Hamlet
2016-08-24 08:08:22 +01:00
parent 4028f1cebb
commit 8a7862dbab
8 changed files with 51 additions and 37 deletions
+7 -1
View File
@@ -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<PluginMessage> GetPluginMessages(const std::string& plugin) = 0;
virtual std::vector<PluginMessage> GetPluginMessages(const std::string& plugin,
const LanguageCode language) = 0;
/**
* @brief Determines the database's knowledge of a plugin's cleanliness.
+6 -5
View File
@@ -163,14 +163,15 @@ PluginTags ApiDatabase::GetPluginTags(const std::string& plugin) {
return tags;
}
std::vector<PluginMessage> ApiDatabase::GetPluginMessages(const std::string& plugin) {
std::vector<PluginMessage> ApiDatabase::GetPluginMessages(const std::string& plugin,
const LanguageCode language) {
std::vector<PluginMessage> 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<PluginMessage> 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<Message> 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;
}
}
+2 -1
View File
@@ -54,7 +54,8 @@ struct ApiDatabase : public DatabaseInterface {
PluginTags GetPluginTags(const std::string& plugin);
std::vector<PluginMessage> GetPluginMessages(const std::string& plugin);
std::vector<PluginMessage> GetPluginMessages(const std::string& plugin,
const LanguageCode language);
PluginCleanliness GetPluginCleanliness(const std::string& plugin);
+5 -11
View File
@@ -53,7 +53,7 @@ Message::Message(const MessageType type, const std::vector<MessageContent>& 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<MessageContent> Message::GetContent() const {
return content_;
}
MessageContent Message::GetContent(const LanguageCode language) const {
return MessageContent::Choose(content_, language);
}
}
namespace YAML {
+1 -3
View File
@@ -53,11 +53,9 @@ public:
bool EvalCondition(Game& game, const LanguageCode language);
MessageType GetType() const;
std::string GetText() const;
std::vector<MessageContent> GetContent() const;
MessageContent GetContent(const LanguageCode language) const;
private:
MessageContent ChooseContent(const LanguageCode language) const;
MessageType type_;
std::vector<MessageContent> content_;
};
+5 -5
View File
@@ -350,7 +350,7 @@ TEST_P(DatabaseInterfaceTest, getPluginTagsShouldOutputTheCorrectBashTagsForPlug
TEST_P(DatabaseInterfaceTest, getPluginMessagesShouldReturnOkAndOutputANullArrayIfAPluginWithNoMessagesIsQueried) {
std::vector<PluginMessage> 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<PluginMessage> 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<PluginMessage> 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<PluginMessage> 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<PluginMessage> 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);
+17 -3
View File
@@ -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) {
@@ -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) {