Move and rename MessageContent::Choose()

Also remove the File::ChooseDetail(), Message::GetContent() and
PluginCleaningData::ChooseDetail() functions that just call it.
This commit is contained in:
Oliver Hamlet
2022-02-19 13:45:51 +00:00
parent ad197d89ff
commit fb147ec787
12 changed files with 65 additions and 222 deletions
-10
View File
@@ -102,16 +102,6 @@ public:
*/
LOOT_API std::vector<MessageContent> 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<MessageContent> ChooseDetail(
const std::string& language) const;
private:
Filename name_;
std::string display_;
-10
View File
@@ -110,16 +110,6 @@ public:
*/
LOOT_API std::vector<MessageContent> 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<MessageContent> GetContent(
const std::string& language) const;
/**
* Get the message as a SimpleMessage given a language.
* @param language
+25 -25
View File
@@ -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<MessageContent> Choose(
const std::vector<MessageContent> 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<MessageContent> SelectMessageContent(
const std::vector<MessageContent> content,
const std::string& language);
}
#endif
@@ -138,16 +138,6 @@ public:
*/
LOOT_API std::vector<MessageContent> 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<MessageContent> ChooseDetail(
const std::string& language) const;
private:
uint32_t crc_{0};
unsigned int itm_{0};
-5
View File
@@ -82,11 +82,6 @@ std::string File::GetDisplayName() const {
std::vector<MessageContent> File::GetDetail() const { return detail_; }
std::optional<MessageContent> 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; }
+1 -5
View File
@@ -87,13 +87,9 @@ MessageType Message::GetType() const { return type_; }
std::vector<MessageContent> Message::GetContent() const { return content_; }
std::optional<MessageContent> Message::GetContent(
const std::string& language) const {
return MessageContent::Choose(content_, language);
}
std::optional<SimpleMessage> Message::ToSimpleMessage(
const std::string& language) const {
auto content = GetContent(language);
auto content = SelectMessageContent(content_, language);
if (!content.has_value()) {
return std::nullopt;
}
+17 -17
View File
@@ -52,7 +52,23 @@ bool MessageContent::operator==(const MessageContent& rhs) const {
return text_ == rhs.text_ && language_ == rhs.language_;
}
std::optional<MessageContent> 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<MessageContent> SelectMessageContent(
const std::vector<MessageContent> content,
const std::string& language) {
if (content.empty())
@@ -100,20 +116,4 @@ std::optional<MessageContent> 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);
}
}
@@ -113,11 +113,6 @@ std::vector<MessageContent> PluginCleaningData::GetDetail() const {
return detail_;
}
std::optional<MessageContent> PluginCleaningData::ChooseDetail(
const std::string& language) const {
return MessageContent::Choose(detail_, language);
}
bool operator!=(const PluginCleaningData& lhs, const PluginCleaningData& rhs) {
return !(lhs == rhs);
}
@@ -368,34 +368,6 @@ TEST(File, getDisplayNameShouldEscapeASCIIPunctuationInNameString) {
file.GetDisplayName());
}
TEST(File, chooseDetailShouldReturnTheGivenLanguageMessageContentIfItExists) {
std::vector<MessageContent> content = {MessageContent("english", "en"),
MessageContent("french", "fr")};
File file("", "", "", content);
EXPECT_EQ(content[1], file.ChooseDetail("fr").value());
}
TEST(
File,
chooseDetailShouldReturnTheEnglishMessageContentIfTheGivenLanguageDoesNotHaveContent) {
std::vector<MessageContent> content = {MessageContent("english", "en"),
MessageContent("french", "fr")};
File file("", "", "", content);
EXPECT_EQ(content[0], file.ChooseDetail("de").value());
}
TEST(
File,
chooseDetailShouldReturnEmptyMessageContentIfTheGivenLanguageAndEnglishDoNotHaveContent) {
std::vector<MessageContent> 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")});
@@ -239,37 +239,37 @@ TEST(
EXPECT_TRUE(content1 >= content2);
}
TEST(MessageContent, chooseShouldReturnANulloptIfTheVectorIsEmpty) {
auto content = MessageContent::Choose(std::vector<MessageContent>(), "fr");
TEST(SelectMessageContent, shouldReturnANulloptIfTheVectorIsEmpty) {
auto content = SelectMessageContent(std::vector<MessageContent>(), "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());
@@ -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({
@@ -317,49 +317,6 @@ TEST_P(
EXPECT_TRUE(info2 > info1);
}
TEST_P(PluginCleaningDataTest,
chooseDetailShouldCreateADefaultContentObjectIfNoneExists) {
PluginCleaningData dirtyInfo(
0xDEADBEEF, "cleaner", std::vector<MessageContent>(), 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<MessageContent> 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<MessageContent> 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;