mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
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:
@@ -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_;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user