From fb147ec7874b55f66e97e9297c436183606d32ec Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Sat, 19 Feb 2022 12:21:24 +0000 Subject: [PATCH] Move and rename MessageContent::Choose() Also remove the File::ChooseDetail(), Message::GetContent() and PluginCleaningData::ChooseDetail() functions that just call it. --- include/loot/metadata/file.h | 10 ---- include/loot/metadata/message.h | 10 ---- include/loot/metadata/message_content.h | 50 +++++++++---------- include/loot/metadata/plugin_cleaning_data.h | 10 ---- src/api/metadata/file.cpp | 5 -- src/api/metadata/message.cpp | 6 +-- src/api/metadata/message_content.cpp | 34 ++++++------- src/api/metadata/plugin_cleaning_data.cpp | 5 -- src/tests/api/internals/metadata/file_test.h | 28 ----------- .../internals/metadata/message_content_test.h | 46 ++++++++--------- .../api/internals/metadata/message_test.h | 40 --------------- .../metadata/plugin_cleaning_data_test.h | 43 ---------------- 12 files changed, 65 insertions(+), 222 deletions(-) diff --git a/include/loot/metadata/file.h b/include/loot/metadata/file.h index 75181c32..71d9b031 100644 --- a/include/loot/metadata/file.h +++ b/include/loot/metadata/file.h @@ -102,16 +102,6 @@ public: */ LOOT_API std::vector GetDetail() const; - /** - * Choose a detail MessageContent object given a preferred language. - * @param language - * The preferred language's code. - * @return The MessageContent object for the preferred language, or if one - * does not exist, the English-language MessageContent object. - */ - LOOT_API std::optional ChooseDetail( - const std::string& language) const; - private: Filename name_; std::string display_; diff --git a/include/loot/metadata/message.h b/include/loot/metadata/message.h index d61692e9..dfc284b9 100644 --- a/include/loot/metadata/message.h +++ b/include/loot/metadata/message.h @@ -110,16 +110,6 @@ public: */ LOOT_API std::vector GetContent() const; - /** - * Get the message content given a language. - * @param language - * The preferred language for the message content. - * @return A MessageContent object for the preferred language, or for English - * if a MessageContent object is not available for the given language. - */ - LOOT_API std::optional GetContent( - const std::string& language) const; - /** * Get the message as a SimpleMessage given a language. * @param language diff --git a/include/loot/metadata/message_content.h b/include/loot/metadata/message_content.h index 5dc9a049..fe990df5 100644 --- a/include/loot/metadata/message_content.h +++ b/include/loot/metadata/message_content.h @@ -86,31 +86,6 @@ public: */ LOOT_API bool operator==(const MessageContent& rhs) const; - /** - * Choose a MessageContent object from a vector given a language. - * @param content - * The MessageContent objects to choose between. - * @param language - * The locale or language code for the preferred language to select. - * Locale codes are of the form `[language code]_[country code]`. - * @return A MessageContent object. - * * If the vector only contains a single element, that element is - * returned. - * * If content with a language that exactly matches the given locale - * or language code is present, that content is returned. - * * If a locale code is given and there is no exact match but content - * for that locale's language is present, that content is returned. - * * If a language code is given and there is no exact match but - * content for a locale in that langauge is present, that content is - * returned. - * * If no locale or language code matches are found and content in - * the default language is present, that content is returned. - * * Otherwise, an empty optional is returned. - */ - LOOT_API static std::optional Choose( - const std::vector content, - const std::string& language); - private: std::string text_; std::string language_{DEFAULT_LANGUAGE}; @@ -145,6 +120,31 @@ LOOT_API bool operator<=(const MessageContent& lhs, const MessageContent& rhs); * MessageContent object, false otherwise. */ LOOT_API bool operator>=(const MessageContent& lhs, const MessageContent& rhs); + +/** + * Choose a MessageContent object from a vector given a language. + * @param content + * The MessageContent objects to choose between. + * @param language + * The locale or language code for the preferred language to select. + * Locale codes are of the form `[language code]_[country code]`. + * @return A MessageContent object. + * * If the vector only contains a single element, that element is + * returned. + * * If content with a language that exactly matches the given locale + * or language code is present, that content is returned. + * * If a locale code is given and there is no exact match but content + * for that locale's language is present, that content is returned. + * * If a language code is given and there is no exact match but + * content for a locale in that langauge is present, that content is + * returned. + * * If no locale or language code matches are found and content in + * the default language is present, that content is returned. + * * Otherwise, an empty optional is returned. + */ +LOOT_API std::optional SelectMessageContent( + const std::vector content, + const std::string& language); } #endif diff --git a/include/loot/metadata/plugin_cleaning_data.h b/include/loot/metadata/plugin_cleaning_data.h index 55852379..9c6f5a68 100644 --- a/include/loot/metadata/plugin_cleaning_data.h +++ b/include/loot/metadata/plugin_cleaning_data.h @@ -138,16 +138,6 @@ public: */ LOOT_API std::vector GetDetail() const; - /** - * Choose a detail MessageContent object given a preferred language. - * @param language - * The preferred language's code. - * @return The MessageContent object for the preferred language, or if one - * does not exist, the English-language MessageContent object. - */ - LOOT_API std::optional ChooseDetail( - const std::string& language) const; - private: uint32_t crc_{0}; unsigned int itm_{0}; diff --git a/src/api/metadata/file.cpp b/src/api/metadata/file.cpp index 4762de11..bde5b967 100644 --- a/src/api/metadata/file.cpp +++ b/src/api/metadata/file.cpp @@ -82,11 +82,6 @@ std::string File::GetDisplayName() const { std::vector File::GetDetail() const { return detail_; } -std::optional File::ChooseDetail( - const std::string& language) const { - return MessageContent::Choose(detail_, language); -} - bool operator!=(const File& lhs, const File& rhs) { return !(lhs == rhs); } bool operator>(const File& lhs, const File& rhs) { return rhs < lhs; } diff --git a/src/api/metadata/message.cpp b/src/api/metadata/message.cpp index 290cbfb3..1830b5cd 100644 --- a/src/api/metadata/message.cpp +++ b/src/api/metadata/message.cpp @@ -87,13 +87,9 @@ MessageType Message::GetType() const { return type_; } std::vector Message::GetContent() const { return content_; } -std::optional Message::GetContent( - const std::string& language) const { - return MessageContent::Choose(content_, language); -} std::optional Message::ToSimpleMessage( const std::string& language) const { - auto content = GetContent(language); + auto content = SelectMessageContent(content_, language); if (!content.has_value()) { return std::nullopt; } diff --git a/src/api/metadata/message_content.cpp b/src/api/metadata/message_content.cpp index 2fcba941..069070ec 100644 --- a/src/api/metadata/message_content.cpp +++ b/src/api/metadata/message_content.cpp @@ -52,7 +52,23 @@ bool MessageContent::operator==(const MessageContent& rhs) const { return text_ == rhs.text_ && language_ == rhs.language_; } -std::optional MessageContent::Choose( +bool operator!=(const MessageContent& lhs, const MessageContent& rhs) { + return !(lhs == rhs); +} + +bool operator>(const MessageContent& lhs, const MessageContent& rhs) { + return rhs < lhs; +} + +bool operator<=(const MessageContent& lhs, const MessageContent& rhs) { + return !(lhs > rhs); +} + +bool operator>=(const MessageContent& lhs, const MessageContent& rhs) { + return !(lhs < rhs); +} + +std::optional SelectMessageContent( const std::vector content, const std::string& language) { if (content.empty()) @@ -100,20 +116,4 @@ std::optional MessageContent::Choose( return std::nullopt; } } - -bool operator!=(const MessageContent& lhs, const MessageContent& rhs) { - return !(lhs == rhs); -} - -bool operator>(const MessageContent& lhs, const MessageContent& rhs) { - return rhs < lhs; -} - -bool operator<=(const MessageContent& lhs, const MessageContent& rhs) { - return !(lhs > rhs); -} - -bool operator>=(const MessageContent& lhs, const MessageContent& rhs) { - return !(lhs < rhs); -} } diff --git a/src/api/metadata/plugin_cleaning_data.cpp b/src/api/metadata/plugin_cleaning_data.cpp index eb40feef..ddf6b5db 100644 --- a/src/api/metadata/plugin_cleaning_data.cpp +++ b/src/api/metadata/plugin_cleaning_data.cpp @@ -113,11 +113,6 @@ std::vector PluginCleaningData::GetDetail() const { return detail_; } -std::optional PluginCleaningData::ChooseDetail( - const std::string& language) const { - return MessageContent::Choose(detail_, language); -} - bool operator!=(const PluginCleaningData& lhs, const PluginCleaningData& rhs) { return !(lhs == rhs); } diff --git a/src/tests/api/internals/metadata/file_test.h b/src/tests/api/internals/metadata/file_test.h index 48261ae3..aa7c24ec 100644 --- a/src/tests/api/internals/metadata/file_test.h +++ b/src/tests/api/internals/metadata/file_test.h @@ -368,34 +368,6 @@ TEST(File, getDisplayNameShouldEscapeASCIIPunctuationInNameString) { file.GetDisplayName()); } -TEST(File, chooseDetailShouldReturnTheGivenLanguageMessageContentIfItExists) { - std::vector content = {MessageContent("english", "en"), - MessageContent("french", "fr")}; - File file("", "", "", content); - - EXPECT_EQ(content[1], file.ChooseDetail("fr").value()); -} - -TEST( - File, - chooseDetailShouldReturnTheEnglishMessageContentIfTheGivenLanguageDoesNotHaveContent) { - std::vector content = {MessageContent("english", "en"), - MessageContent("french", "fr")}; - File file("", "", "", content); - - EXPECT_EQ(content[0], file.ChooseDetail("de").value()); -} - -TEST( - File, - chooseDetailShouldReturnEmptyMessageContentIfTheGivenLanguageAndEnglishDoNotHaveContent) { - std::vector content = {MessageContent("german", "de"), - MessageContent("french", "fr")}; - File file("", "", "", content); - - EXPECT_FALSE(file.ChooseDetail("es").has_value()); -} - TEST(File, emittingAsYamlShouldSingleQuoteValues) { File file( "name1", "display1", "condition1", {MessageContent("english", "en")}); diff --git a/src/tests/api/internals/metadata/message_content_test.h b/src/tests/api/internals/metadata/message_content_test.h index 6c24a37f..d17db0de 100644 --- a/src/tests/api/internals/metadata/message_content_test.h +++ b/src/tests/api/internals/metadata/message_content_test.h @@ -239,37 +239,37 @@ TEST( EXPECT_TRUE(content1 >= content2); } -TEST(MessageContent, chooseShouldReturnANulloptIfTheVectorIsEmpty) { - auto content = MessageContent::Choose(std::vector(), "fr"); +TEST(SelectMessageContent, shouldReturnANulloptIfTheVectorIsEmpty) { + auto content = SelectMessageContent(std::vector(), "fr"); EXPECT_FALSE(content.has_value()); } -TEST(MessageContent, chooseShouldReturnTheOnlyElementOfASingleElementVector) { +TEST(SelectMessageContent, shouldReturnTheOnlyElementOfASingleElementVector) { MessageContent content("test", "de"); - auto chosen = MessageContent::Choose({MessageContent("test", "de")}, "fr"); + auto chosen = SelectMessageContent({MessageContent("test", "de")}, "fr"); EXPECT_EQ(content, chosen); } TEST( - MessageContent, - chooseShouldReturnAnEmptyEnglishMessageIfTheVectorHasNoEnglishOrMatchingLanguageContentWithTwoOrMoreElements) { + SelectMessageContent, + shouldReturnAnEmptyEnglishMessageIfTheVectorHasNoEnglishOrMatchingLanguageContentWithTwoOrMoreElements) { auto contents = {MessageContent("test1", "de"), MessageContent("test2", "fr")}; - auto content = MessageContent::Choose(contents, "pt"); + auto content = SelectMessageContent(contents, "pt"); EXPECT_FALSE(content.has_value()); } -TEST(MessageContent, - chooseShouldReturnElementWithExactlyMatchingLocaleCodeIfPresent) { +TEST(SelectMessageContent, + shouldReturnElementWithExactlyMatchingLocaleCodeIfPresent) { auto contents = {MessageContent("test1", "en"), MessageContent("test2", "de"), MessageContent("test3", "pt"), MessageContent("test4", "pt_PT"), MessageContent("test5", "pt_BR")}; - auto content = MessageContent::Choose(contents, "pt_BR"); + auto content = SelectMessageContent(contents, "pt_BR"); EXPECT_TRUE(content.has_value()); EXPECT_EQ("pt_BR", content.value().GetLanguage()); @@ -277,42 +277,40 @@ TEST(MessageContent, } TEST( - MessageContent, - chooseShouldReturnElementWithMatchingLanguageCodeIfExactlyMatchingLocaleCodeIsNotPresent) { + SelectMessageContent, + shouldReturnElementWithMatchingLanguageCodeIfExactlyMatchingLocaleCodeIsNotPresent) { auto contents = {MessageContent("test1", "en"), MessageContent("test2", "de"), MessageContent("test3", "pt_PT"), MessageContent("test4", "pt")}; - auto content = MessageContent::Choose(contents, "pt_BR"); + auto content = SelectMessageContent(contents, "pt_BR"); EXPECT_TRUE(content.has_value()); EXPECT_EQ("pt", content.value().GetLanguage()); EXPECT_EQ("test4", content.value().GetText()); } -TEST( - MessageContent, - chooseShouldReturnElementWithEnLanguageCodeIfNoMatchingLanguageCodeIsPresent) { +TEST(SelectMessageContent, + shouldReturnElementWithEnLanguageCodeIfNoMatchingLanguageCodeIsPresent) { auto contents = {MessageContent("test1", "en"), MessageContent("test2", "de"), MessageContent("test3", "pt_PT")}; - auto content = MessageContent::Choose(contents, "pt_BR"); + auto content = SelectMessageContent(contents, "pt_BR"); EXPECT_TRUE(content.has_value()); EXPECT_EQ("en", content.value().GetLanguage()); EXPECT_EQ("test1", content.value().GetText()); } -TEST( - MessageContent, - chooseShouldReturnElementWithExactlyMatchingLanguageCodeIfLanguageCodeIsGiven) { +TEST(SelectMessageContent, + shouldReturnElementWithExactlyMatchingLanguageCodeIfLanguageCodeIsGiven) { auto contents = { MessageContent("test1", "en"), MessageContent("test2", "de"), MessageContent("test3", "pt_BR"), MessageContent("test4", "pt"), }; - auto content = MessageContent::Choose(contents, "pt"); + auto content = SelectMessageContent(contents, "pt"); EXPECT_TRUE(content.has_value()); EXPECT_EQ("pt", content.value().GetLanguage()); @@ -320,13 +318,13 @@ TEST( } TEST( - MessageContent, - chooseShouldReturnFirstElementWithMatchingLanguageCodeIfLanguageCodeIsGivenAndNoExactMatchIsPresent) { + SelectMessageContent, + shouldReturnFirstElementWithMatchingLanguageCodeIfLanguageCodeIsGivenAndNoExactMatchIsPresent) { auto contents = {MessageContent("test1", "en"), MessageContent("test2", "de"), MessageContent("test3", "pt_PT"), MessageContent("test4", "pt_BR")}; - auto content = MessageContent::Choose(contents, "pt"); + auto content = SelectMessageContent(contents, "pt"); EXPECT_TRUE(content.has_value()); EXPECT_EQ("pt_PT", content.value().GetLanguage()); diff --git a/src/tests/api/internals/metadata/message_test.h b/src/tests/api/internals/metadata/message_test.h index e41a5254..286bd007 100644 --- a/src/tests/api/internals/metadata/message_test.h +++ b/src/tests/api/internals/metadata/message_test.h @@ -363,46 +363,6 @@ TEST_P( EXPECT_TRUE(message2 >= message1); } -TEST_P(MessageTest, getContentShouldReturnANulloptIfNoneExists) { - Message message; - EXPECT_FALSE( - message.GetContent(MessageContent::DEFAULT_LANGUAGE).has_value()); -} - -TEST_P( - MessageTest, - getContentShouldSelectTheEnglishStringIfThereIsNoStringForTheGivenLanguage) { - Message message(MessageType::say, - MessageContents({ - MessageContent("content1", german), - MessageContent("content2"), - })); - - EXPECT_EQ("content2", message.GetContent(french).value().GetText()); -} - -TEST_P(MessageTest, getContentShouldSelectTheGivenLanguageStringIfItExists) { - Message message(MessageType::say, - MessageContents({ - MessageContent("content1", german), - MessageContent("content2"), - MessageContent("content3", french), - })); - - EXPECT_EQ("content3", message.GetContent(french).value().GetText()); -} - -TEST_P(MessageTest, getContentShouldSelectTheContentStringIfOnlyOneExists) { - Message message(MessageType::say, - MessageContents({ - MessageContent("content1", french), - })); - - EXPECT_EQ( - "content1", - message.GetContent(MessageContent::DEFAULT_LANGUAGE).value().GetText()); -} - TEST_P(MessageTest, toSimpleMessageShouldSelectTextAndLanguageUsingGetContent) { Message message(MessageType::warn, MessageContents({ diff --git a/src/tests/api/internals/metadata/plugin_cleaning_data_test.h b/src/tests/api/internals/metadata/plugin_cleaning_data_test.h index 1ac7846f..25c286b6 100644 --- a/src/tests/api/internals/metadata/plugin_cleaning_data_test.h +++ b/src/tests/api/internals/metadata/plugin_cleaning_data_test.h @@ -317,49 +317,6 @@ TEST_P( EXPECT_TRUE(info2 > info1); } -TEST_P(PluginCleaningDataTest, - chooseDetailShouldCreateADefaultContentObjectIfNoneExists) { - PluginCleaningData dirtyInfo( - 0xDEADBEEF, "cleaner", std::vector(), 2, 10, 30); - EXPECT_FALSE( - dirtyInfo.ChooseDetail(MessageContent::DEFAULT_LANGUAGE).has_value()); -} - -TEST_P(PluginCleaningDataTest, - chooseDetailShouldLeaveTheContentUnchangedIfOnlyOneStringExists) { - PluginCleaningData dirtyInfo(0xDEADBEEF, "cleaner", info_, 2, 10, 30); - - EXPECT_EQ(info_[0], dirtyInfo.ChooseDetail(french).value()); - EXPECT_EQ(info_[0], - dirtyInfo.ChooseDetail(MessageContent::DEFAULT_LANGUAGE).value()); -} - -TEST_P( - PluginCleaningDataTest, - chooseDetailShouldSelectTheEnglishStringIfNoStringExistsForTheGivenLanguage) { - MessageContent content("content1", MessageContent::DEFAULT_LANGUAGE); - std::vector info({ - content, - MessageContent("content1", german), - }); - PluginCleaningData dirtyInfo(0xDEADBEEF, "cleaner", info, 2, 10, 30); - - EXPECT_EQ(content, dirtyInfo.ChooseDetail(french).value()); -} - -TEST_P(PluginCleaningDataTest, - chooseDetailShouldSelectTheStringForTheGivenLanguageIfOneExists) { - MessageContent frenchContent("content3", french); - std::vector info({ - MessageContent("content1", german), - MessageContent("content2", MessageContent::DEFAULT_LANGUAGE), - frenchContent, - }); - PluginCleaningData dirtyInfo(0xDEADBEEF, "cleaner", info, 2, 10, 30); - - EXPECT_EQ(frenchContent, dirtyInfo.ChooseDetail(french).value()); -} - TEST_P(PluginCleaningDataTest, emittingAsYamlShouldOutputAllNonZeroCounts) { PluginCleaningData info(0x12345678, "cleaner", info_, 2, 10, 30); YAML::Emitter emitter;