mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
Make MessageContent::Choose() return an optional
And propagate this through the File, Message and PluginCleaningData APIs that call it.
This commit is contained in:
@@ -84,7 +84,7 @@ std::string File::GetDisplayName() const {
|
||||
|
||||
std::vector<MessageContent> File::GetDetail() const { return detail_; }
|
||||
|
||||
MessageContent File::ChooseDetail(const std::string& language) const {
|
||||
std::optional<MessageContent> File::ChooseDetail(const std::string& language) const {
|
||||
return MessageContent::Choose(detail_, language);
|
||||
}
|
||||
|
||||
|
||||
@@ -86,16 +86,23 @@ bool Message::operator==(const Message& rhs) const {
|
||||
MessageType Message::GetType() const { return type_; }
|
||||
|
||||
std::vector<MessageContent> Message::GetContent() const { return content_; }
|
||||
MessageContent Message::GetContent(const std::string& language) const {
|
||||
|
||||
std::optional<MessageContent> Message::GetContent(
|
||||
const std::string& language) const {
|
||||
return MessageContent::Choose(content_, language);
|
||||
}
|
||||
SimpleMessage Message::ToSimpleMessage(const std::string& language) const {
|
||||
MessageContent content = GetContent(language);
|
||||
std::optional<SimpleMessage> Message::ToSimpleMessage(
|
||||
const std::string& language) const {
|
||||
auto content = GetContent(language);
|
||||
if (!content.has_value()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
SimpleMessage simpleMessage;
|
||||
|
||||
simpleMessage.type = GetType();
|
||||
simpleMessage.language = content.GetLanguage();
|
||||
simpleMessage.text = content.GetText();
|
||||
simpleMessage.language = content.value().GetLanguage();
|
||||
simpleMessage.text = content.value().GetText();
|
||||
simpleMessage.condition = GetCondition();
|
||||
|
||||
return simpleMessage;
|
||||
|
||||
@@ -57,10 +57,11 @@ bool MessageContent::operator==(const MessageContent& rhs) const {
|
||||
return text_ == rhs.text_ && language_ == rhs.language_;
|
||||
}
|
||||
|
||||
MessageContent MessageContent::Choose(const std::vector<MessageContent> content,
|
||||
std::optional<MessageContent> MessageContent::Choose(
|
||||
const std::vector<MessageContent> content,
|
||||
const std::string& language) {
|
||||
if (content.empty())
|
||||
return MessageContent();
|
||||
return std::nullopt;
|
||||
else if (content.size() == 1)
|
||||
return content[0];
|
||||
else {
|
||||
@@ -68,7 +69,7 @@ MessageContent MessageContent::Choose(const std::vector<MessageContent> content,
|
||||
auto isCountryCodeGiven = languageCode.length() != language.length();
|
||||
|
||||
std::optional<MessageContent> matchedLanguage;
|
||||
MessageContent english;
|
||||
std::optional<MessageContent> english;
|
||||
for (const auto& mc : content) {
|
||||
auto contentLanguage = mc.GetLanguage();
|
||||
|
||||
@@ -94,10 +95,14 @@ MessageContent MessageContent::Choose(const std::vector<MessageContent> content,
|
||||
}
|
||||
|
||||
if (matchedLanguage.has_value()) {
|
||||
return matchedLanguage.value();
|
||||
return matchedLanguage;
|
||||
}
|
||||
|
||||
return english;
|
||||
if (english.has_value()) {
|
||||
return english;
|
||||
}
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ std::vector<MessageContent> PluginCleaningData::GetDetail() const {
|
||||
return detail_;
|
||||
}
|
||||
|
||||
MessageContent PluginCleaningData::ChooseDetail(
|
||||
std::optional<MessageContent> PluginCleaningData::ChooseDetail(
|
||||
const std::string& language) const {
|
||||
return MessageContent::Choose(detail_, language);
|
||||
}
|
||||
|
||||
@@ -140,13 +140,14 @@ std::vector<Location> PluginMetadata::GetLocations() const {
|
||||
|
||||
std::vector<SimpleMessage> PluginMetadata::GetSimpleMessages(
|
||||
const std::string& language) const {
|
||||
std::vector<SimpleMessage> simpleMessages(messages_.size());
|
||||
std::transform(begin(messages_),
|
||||
end(messages_),
|
||||
begin(simpleMessages),
|
||||
[&](const Message& message) {
|
||||
return message.ToSimpleMessage(language);
|
||||
});
|
||||
std::vector<SimpleMessage> simpleMessages;
|
||||
|
||||
for (auto message : messages_) {
|
||||
auto simpleMessage = message.ToSimpleMessage(language);
|
||||
if (simpleMessage.has_value()) {
|
||||
simpleMessages.push_back(simpleMessage.value());
|
||||
}
|
||||
}
|
||||
|
||||
return simpleMessages;
|
||||
}
|
||||
|
||||
@@ -373,7 +373,7 @@ TEST(File, chooseDetailShouldReturnTheGivenLanguageMessageContentIfItExists) {
|
||||
MessageContent("french", "fr")};
|
||||
File file("", "", "", content);
|
||||
|
||||
EXPECT_EQ(content[1], file.ChooseDetail("fr"));
|
||||
EXPECT_EQ(content[1], file.ChooseDetail("fr").value());
|
||||
}
|
||||
|
||||
TEST(
|
||||
@@ -383,7 +383,7 @@ TEST(
|
||||
MessageContent("french", "fr")};
|
||||
File file("", "", "", content);
|
||||
|
||||
EXPECT_EQ(content[0], file.ChooseDetail("de"));
|
||||
EXPECT_EQ(content[0], file.ChooseDetail("de").value());
|
||||
}
|
||||
|
||||
TEST(
|
||||
@@ -393,7 +393,7 @@ TEST(
|
||||
MessageContent("french", "fr")};
|
||||
File file("", "", "", content);
|
||||
|
||||
EXPECT_EQ(MessageContent(), file.ChooseDetail("es"));
|
||||
EXPECT_FALSE(file.ChooseDetail("es").has_value());
|
||||
}
|
||||
|
||||
TEST(File, emittingAsYamlShouldSingleQuoteValues) {
|
||||
|
||||
@@ -240,11 +240,10 @@ TEST(
|
||||
}
|
||||
|
||||
TEST(MessageContent,
|
||||
chooseShouldReturnAnEmptyEnglishMessageIfTheVectorIsEmpty) {
|
||||
chooseShouldReturnANulloptIfTheVectorIsEmpty) {
|
||||
auto content = MessageContent::Choose(std::vector<MessageContent>(), "fr");
|
||||
|
||||
EXPECT_EQ("en", content.GetLanguage());
|
||||
EXPECT_EQ("", content.GetText());
|
||||
EXPECT_FALSE(content.has_value());
|
||||
}
|
||||
|
||||
TEST(MessageContent, chooseShouldReturnTheOnlyElementOfASingleElementVector) {
|
||||
@@ -261,8 +260,7 @@ TEST(
|
||||
MessageContent("test2", "fr")};
|
||||
auto content = MessageContent::Choose(contents, "pt");
|
||||
|
||||
EXPECT_EQ("en", content.GetLanguage());
|
||||
EXPECT_EQ("", content.GetText());
|
||||
EXPECT_FALSE(content.has_value());
|
||||
}
|
||||
|
||||
TEST(MessageContent,
|
||||
@@ -274,8 +272,9 @@ TEST(MessageContent,
|
||||
MessageContent("test5", "pt_BR")};
|
||||
auto content = MessageContent::Choose(contents, "pt_BR");
|
||||
|
||||
EXPECT_EQ("pt_BR", content.GetLanguage());
|
||||
EXPECT_EQ("test5", content.GetText());
|
||||
EXPECT_TRUE(content.has_value());
|
||||
EXPECT_EQ("pt_BR", content.value().GetLanguage());
|
||||
EXPECT_EQ("test5", content.value().GetText());
|
||||
}
|
||||
|
||||
TEST(
|
||||
@@ -287,8 +286,9 @@ TEST(
|
||||
MessageContent("test4", "pt")};
|
||||
auto content = MessageContent::Choose(contents, "pt_BR");
|
||||
|
||||
EXPECT_EQ("pt", content.GetLanguage());
|
||||
EXPECT_EQ("test4", content.GetText());
|
||||
EXPECT_TRUE(content.has_value());
|
||||
EXPECT_EQ("pt", content.value().GetLanguage());
|
||||
EXPECT_EQ("test4", content.value().GetText());
|
||||
}
|
||||
|
||||
TEST(
|
||||
@@ -299,8 +299,9 @@ TEST(
|
||||
MessageContent("test3", "pt_PT")};
|
||||
auto content = MessageContent::Choose(contents, "pt_BR");
|
||||
|
||||
EXPECT_EQ("en", content.GetLanguage());
|
||||
EXPECT_EQ("test1", content.GetText());
|
||||
EXPECT_TRUE(content.has_value());
|
||||
EXPECT_EQ("en", content.value().GetLanguage());
|
||||
EXPECT_EQ("test1", content.value().GetText());
|
||||
}
|
||||
|
||||
TEST(
|
||||
@@ -314,8 +315,9 @@ TEST(
|
||||
};
|
||||
auto content = MessageContent::Choose(contents, "pt");
|
||||
|
||||
EXPECT_EQ("pt", content.GetLanguage());
|
||||
EXPECT_EQ("test4", content.GetText());
|
||||
EXPECT_TRUE(content.has_value());
|
||||
EXPECT_EQ("pt", content.value().GetLanguage());
|
||||
EXPECT_EQ("test4", content.value().GetText());
|
||||
}
|
||||
|
||||
TEST(
|
||||
@@ -327,8 +329,9 @@ TEST(
|
||||
MessageContent("test4", "pt_BR")};
|
||||
auto content = MessageContent::Choose(contents, "pt");
|
||||
|
||||
EXPECT_EQ("pt_PT", content.GetLanguage());
|
||||
EXPECT_EQ("test3", content.GetText());
|
||||
EXPECT_TRUE(content.has_value());
|
||||
EXPECT_EQ("pt_PT", content.value().GetLanguage());
|
||||
EXPECT_EQ("test3", content.value().GetText());
|
||||
}
|
||||
|
||||
TEST(MessageContent, emittingAsYamlShouldOutputDataCorrectly) {
|
||||
|
||||
@@ -348,10 +348,9 @@ TEST_P(
|
||||
EXPECT_TRUE(message2 >= message1);
|
||||
}
|
||||
|
||||
TEST_P(MessageTest, getContentShouldReturnADefaultContentObjectIfNoneExists) {
|
||||
TEST_P(MessageTest, getContentShouldReturnANulloptIfNoneExists) {
|
||||
Message message;
|
||||
EXPECT_EQ(MessageContent(),
|
||||
message.GetContent(MessageContent::defaultLanguage));
|
||||
EXPECT_FALSE(message.GetContent(MessageContent::defaultLanguage).has_value());
|
||||
}
|
||||
|
||||
TEST_P(
|
||||
@@ -363,7 +362,7 @@ TEST_P(
|
||||
MessageContent("content2"),
|
||||
}));
|
||||
|
||||
EXPECT_EQ("content2", message.GetContent(french).GetText());
|
||||
EXPECT_EQ("content2", message.GetContent(french).value().GetText());
|
||||
}
|
||||
|
||||
TEST_P(MessageTest, getContentShouldSelectTheGivenLanguageStringIfItExists) {
|
||||
@@ -374,7 +373,7 @@ TEST_P(MessageTest, getContentShouldSelectTheGivenLanguageStringIfItExists) {
|
||||
MessageContent("content3", french),
|
||||
}));
|
||||
|
||||
EXPECT_EQ("content3", message.GetContent(french).GetText());
|
||||
EXPECT_EQ("content3", message.GetContent(french).value().GetText());
|
||||
}
|
||||
|
||||
TEST_P(MessageTest, getContentShouldSelectTheContentStringIfOnlyOneExists) {
|
||||
@@ -384,7 +383,7 @@ TEST_P(MessageTest, getContentShouldSelectTheContentStringIfOnlyOneExists) {
|
||||
}));
|
||||
|
||||
EXPECT_EQ("content1",
|
||||
message.GetContent(MessageContent::defaultLanguage).GetText());
|
||||
message.GetContent(MessageContent::defaultLanguage).value().GetText());
|
||||
}
|
||||
|
||||
TEST_P(MessageTest, toSimpleMessageShouldSelectTextAndLanguageUsingGetContent) {
|
||||
@@ -396,7 +395,7 @@ TEST_P(MessageTest, toSimpleMessageShouldSelectTextAndLanguageUsingGetContent) {
|
||||
}),
|
||||
"condition1");
|
||||
|
||||
SimpleMessage simpleMessage = message.ToSimpleMessage(french);
|
||||
SimpleMessage simpleMessage = message.ToSimpleMessage(french).value();
|
||||
|
||||
EXPECT_EQ(MessageType::warn, simpleMessage.type);
|
||||
EXPECT_EQ("content3", simpleMessage.text);
|
||||
|
||||
@@ -322,16 +322,16 @@ TEST_P(PluginCleaningDataTest,
|
||||
chooseDetailShouldCreateADefaultContentObjectIfNoneExists) {
|
||||
PluginCleaningData dirtyInfo(
|
||||
0xDEADBEEF, "cleaner", std::vector<MessageContent>(), 2, 10, 30);
|
||||
EXPECT_EQ(MessageContent(),
|
||||
dirtyInfo.ChooseDetail(MessageContent::defaultLanguage));
|
||||
EXPECT_FALSE(dirtyInfo.ChooseDetail(MessageContent::defaultLanguage).has_value());
|
||||
}
|
||||
|
||||
TEST_P(PluginCleaningDataTest,
|
||||
chooseDetailShouldLeaveTheContentUnchangedIfOnlyOneStringExists) {
|
||||
PluginCleaningData dirtyInfo(0xDEADBEEF, "cleaner", info_, 2, 10, 30);
|
||||
|
||||
EXPECT_EQ(info_[0], dirtyInfo.ChooseDetail(french));
|
||||
EXPECT_EQ(info_[0], dirtyInfo.ChooseDetail(MessageContent::defaultLanguage));
|
||||
EXPECT_EQ(info_[0], dirtyInfo.ChooseDetail(french).value());
|
||||
EXPECT_EQ(info_[0],
|
||||
dirtyInfo.ChooseDetail(MessageContent::defaultLanguage).value());
|
||||
}
|
||||
|
||||
TEST_P(
|
||||
@@ -344,7 +344,7 @@ TEST_P(
|
||||
});
|
||||
PluginCleaningData dirtyInfo(0xDEADBEEF, "cleaner", info, 2, 10, 30);
|
||||
|
||||
EXPECT_EQ(content, dirtyInfo.ChooseDetail(french));
|
||||
EXPECT_EQ(content, dirtyInfo.ChooseDetail(french).value());
|
||||
}
|
||||
|
||||
TEST_P(PluginCleaningDataTest,
|
||||
@@ -357,7 +357,7 @@ TEST_P(PluginCleaningDataTest,
|
||||
});
|
||||
PluginCleaningData dirtyInfo(0xDEADBEEF, "cleaner", info, 2, 10, 30);
|
||||
|
||||
EXPECT_EQ(frenchContent, dirtyInfo.ChooseDetail(french));
|
||||
EXPECT_EQ(frenchContent, dirtyInfo.ChooseDetail(french).value());
|
||||
}
|
||||
|
||||
TEST_P(PluginCleaningDataTest, emittingAsYamlShouldOutputAllNonZeroCounts) {
|
||||
|
||||
Reference in New Issue
Block a user