Make MessageContent::Choose() return an optional

And propagate this through the File, Message and PluginCleaningData APIs
that call it.
This commit is contained in:
Oliver Hamlet
2021-05-22 22:15:32 +01:00
parent caee647d86
commit 4faab46069
13 changed files with 76 additions and 59 deletions
+1 -1
View File
@@ -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);
}
+12 -5
View File
@@ -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;
+10 -5
View File
@@ -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;
}
}
+1 -1
View File
@@ -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);
}
+8 -7
View File
@@ -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;
}
+3 -3
View File
@@ -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) {