Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1763)

Unified Diff: third_party/libaddressinput/chromium/cpp/test/rule_test.cc

Issue 106763007: [rac] Parse postal code formats and required fields in libaddressinput. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Test that parsing empty data does not overwrite a rule. Created 6 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/libaddressinput/chromium/cpp/test/rule_test.cc
diff --git a/third_party/libaddressinput/chromium/cpp/test/rule_test.cc b/third_party/libaddressinput/chromium/cpp/test/rule_test.cc
index 7f7609f11b20f27baccc201b337345f5953d3659..b484555bcdb94364b721db134eb1ab21ecf9620b 100644
--- a/third_party/libaddressinput/chromium/cpp/test/rule_test.cc
+++ b/third_party/libaddressinput/chromium/cpp/test/rule_test.cc
@@ -22,7 +22,6 @@
#include <gtest/gtest.h>
-#include "address_field_util.h"
#include "messages.h"
#include "region_data_constants.h"
@@ -30,8 +29,8 @@ namespace {
using i18n::addressinput::AddressField;
using i18n::addressinput::ADMIN_AREA;
+using i18n::addressinput::COUNTRY;
using i18n::addressinput::LOCALITY;
-using i18n::addressinput::NEWLINE;
using i18n::addressinput::ORGANIZATION;
using i18n::addressinput::POSTAL_CODE;
using i18n::addressinput::RECIPIENT;
@@ -39,22 +38,37 @@ using i18n::addressinput::RegionDataConstants;
using i18n::addressinput::Rule;
using i18n::addressinput::STREET_ADDRESS;
+bool IsFormatEmpty(const std::vector<std::vector<AddressField> >& format) {
+ for (std::vector<std::vector<AddressField> >::const_iterator
+ it = format.begin(); it != format.end(); ++it) {
+ if (!it->empty()) {
+ return false;
+ }
+ }
+ return true;
+}
+
TEST(RuleTest, CopyOverwritesRule) {
Rule rule;
- ASSERT_TRUE(rule.ParseSerializedRule("{"
- "\"fmt\":\"%S%Z\","
- "\"state_name_type\":\"area\","
- "\"zip_name_type\":\"postal\","
- "\"sub_keys\":\"CA~NY~TX\","
- "\"lang\":\"en\","
- "\"languages\":\"en~fr\""
- "}"));
+ ASSERT_TRUE(rule.ParseSerializedRule(
+ "{"
+ "\"fmt\":\"%S%Z\","
+ "\"require\":\"SZ\","
+ "\"state_name_type\":\"area\","
+ "\"zip_name_type\":\"postal\","
+ "\"sub_keys\":\"CA~NY~TX\","
+ "\"lang\":\"en\","
+ "\"languages\":\"en~fr\","
+ "\"zip\":\"\\\\d{5}([ \\\\-]\\\\d{4})?\""
+ "}"));
Rule copy;
EXPECT_NE(rule.GetFormat(), copy.GetFormat());
+ EXPECT_NE(rule.GetRequired(), copy.GetRequired());
EXPECT_NE(rule.GetSubKeys(), copy.GetSubKeys());
EXPECT_NE(rule.GetLanguages(), copy.GetLanguages());
EXPECT_NE(rule.GetLanguage(), copy.GetLanguage());
+ EXPECT_NE(rule.GetPostalCodeFormat(), copy.GetPostalCodeFormat());
EXPECT_NE(rule.GetAdminAreaNameMessageId(),
copy.GetAdminAreaNameMessageId());
EXPECT_NE(rule.GetPostalCodeNameMessageId(),
@@ -62,9 +76,11 @@ TEST(RuleTest, CopyOverwritesRule) {
copy.CopyFrom(rule);
EXPECT_EQ(rule.GetFormat(), copy.GetFormat());
+ EXPECT_EQ(rule.GetRequired(), copy.GetRequired());
EXPECT_EQ(rule.GetSubKeys(), copy.GetSubKeys());
EXPECT_EQ(rule.GetLanguages(), copy.GetLanguages());
EXPECT_EQ(rule.GetLanguage(), copy.GetLanguage());
+ EXPECT_EQ(rule.GetPostalCodeFormat(), copy.GetPostalCodeFormat());
EXPECT_EQ(rule.GetAdminAreaNameMessageId(),
copy.GetAdminAreaNameMessageId());
EXPECT_EQ(rule.GetPostalCodeNameMessageId(),
@@ -73,46 +89,158 @@ TEST(RuleTest, CopyOverwritesRule) {
TEST(RuleTest, ParseOverwritesRule) {
Rule rule;
- ASSERT_TRUE(rule.ParseSerializedRule("{"
- "\"fmt\":\"%S%Z\","
- "\"state_name_type\":\"area\","
- "\"zip_name_type\":\"postal\","
- "\"sub_keys\":\"CA~NY~TX\","
- "\"lang\":\"en\","
- "\"languages\":\"en~fr\""
- "}"));
- EXPECT_FALSE(rule.GetFormat().empty());
+ ASSERT_TRUE(rule.ParseSerializedRule(
+ "{"
+ "\"fmt\":\"%S%Z\","
+ "\"require\":\"SZ\","
+ "\"state_name_type\":\"area\","
+ "\"zip_name_type\":\"postal\","
+ "\"sub_keys\":\"CA~NY~TX\","
+ "\"lang\":\"en\","
+ "\"languages\":\"en~fr\","
+ "\"zip\":\"\\\\d{5}([ \\\\-]\\\\d{4})?\""
+ "}"));
+ EXPECT_FALSE(IsFormatEmpty(rule.GetFormat()));
+ EXPECT_FALSE(rule.GetRequired().empty());
EXPECT_FALSE(rule.GetSubKeys().empty());
EXPECT_FALSE(rule.GetLanguages().empty());
EXPECT_FALSE(rule.GetLanguage().empty());
+ EXPECT_FALSE(rule.GetPostalCodeFormat().empty());
EXPECT_EQ(IDS_LIBADDRESSINPUT_I18N_AREA,
rule.GetAdminAreaNameMessageId());
EXPECT_EQ(IDS_LIBADDRESSINPUT_I18N_POSTAL_CODE_LABEL,
rule.GetPostalCodeNameMessageId());
- ASSERT_TRUE(rule.ParseSerializedRule("{"
- "\"fmt\":\"\","
- "\"state_name_type\":\"do_si\","
- "\"zip_name_type\":\"zip\","
- "\"sub_keys\":\"\","
- "\"lang\":\"\","
- "\"languages\":\"\""
- "}"));
- EXPECT_TRUE(rule.GetFormat().empty());
+ ASSERT_TRUE(rule.ParseSerializedRule(
+ "{"
+ "\"fmt\":\"\","
+ "\"require\":\"\","
+ "\"state_name_type\":\"do_si\","
+ "\"zip_name_type\":\"zip\","
+ "\"sub_keys\":\"\","
+ "\"lang\":\"\","
+ "\"languages\":\"\","
+ "\"zip\":\"\""
+ "}"));
+ EXPECT_TRUE(IsFormatEmpty(rule.GetFormat()));
+ EXPECT_TRUE(rule.GetRequired().empty());
EXPECT_TRUE(rule.GetSubKeys().empty());
EXPECT_TRUE(rule.GetLanguages().empty());
EXPECT_TRUE(rule.GetLanguage().empty());
+ EXPECT_TRUE(rule.GetPostalCodeFormat().empty());
EXPECT_EQ(IDS_LIBADDRESSINPUT_I18N_DO_SI,
rule.GetAdminAreaNameMessageId());
EXPECT_EQ(IDS_LIBADDRESSINPUT_I18N_ZIP_CODE_LABEL,
rule.GetPostalCodeNameMessageId());
}
-TEST(RuleTest, ParsesFormatCorrectly) {
+TEST(RuleTest, ParseEmptyDataDoesNotOverwriteRule) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule(
+ "{"
+ "\"fmt\":\"%S%Z\","
+ "\"require\":\"SZ\","
+ "\"state_name_type\":\"area\","
+ "\"zip_name_type\":\"postal\","
+ "\"sub_keys\":\"CA~NY~TX\","
+ "\"lang\":\"en\","
+ "\"languages\":\"en~fr\","
+ "\"zip\":\"\\\\d{5}([ \\\\-]\\\\d{4})?\""
+ "}"));
+
+ Rule copy;
+ copy.CopyFrom(rule);
+ ASSERT_TRUE(copy.ParseSerializedRule("{}"));
+
+ EXPECT_EQ(rule.GetFormat(), copy.GetFormat());
+ EXPECT_EQ(rule.GetRequired(), copy.GetRequired());
+ EXPECT_EQ(rule.GetSubKeys(), copy.GetSubKeys());
+ EXPECT_EQ(rule.GetLanguages(), copy.GetLanguages());
+ EXPECT_EQ(rule.GetLanguage(), copy.GetLanguage());
+ EXPECT_EQ(rule.GetPostalCodeFormat(), copy.GetPostalCodeFormat());
+ EXPECT_EQ(rule.GetAdminAreaNameMessageId(),
+ copy.GetAdminAreaNameMessageId());
+ EXPECT_EQ(rule.GetPostalCodeNameMessageId(),
+ copy.GetPostalCodeNameMessageId());
+}
+
+TEST(RuleTest, ParseFormatWithNewLines) {
+ Rule rule;
+ ASSERT_TRUE(
+ rule.ParseSerializedRule("{\"fmt\":\"%O%n%N%n%A%nAX-%Z %C%nĂ…LAND\"}"));
+ std::vector<std::vector<AddressField> > expected_format;
+ expected_format.push_back(std::vector<AddressField>(1, ORGANIZATION));
+ expected_format.push_back(std::vector<AddressField>(1, RECIPIENT));
+ expected_format.push_back(std::vector<AddressField>(1, STREET_ADDRESS));
+ expected_format.push_back(std::vector<AddressField>(1, POSTAL_CODE));
+ expected_format.back().push_back(LOCALITY);
+ expected_format.push_back(std::vector<AddressField>());
+ EXPECT_EQ(expected_format, rule.GetFormat());
+}
+
+TEST(RuleTest, DoubleTokenPrefixDoesNotCrash) {
+ Rule rule;
+ EXPECT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%%R\"}"));
+}
+
+TEST(RuleTest, DoubleNewlineFormatDoesNotCrash) {
+ Rule rule;
+ EXPECT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%n%n\"}"));
+}
+
+TEST(RuleTest, FormatTokenWithoutPrefixDoesNotCrash) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"R\"}"));
+}
+
+TEST(RuleTest, ParseDuplicateTokenInFormatDoesNotCrash) {
+ Rule rule;
+ EXPECT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%R%R\"}"));
+}
+
+TEST(RuleTest, ParseInvalidFormatFieldsDoesNotCrash) {
+ Rule rule;
+ EXPECT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%K%L\"}"));
+}
+
+TEST(RuleTest, PrefixWithoutTokenFormatDoesNotCrash) {
+ Rule rule;
+ EXPECT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%\"}"));
+}
+
+TEST(RuleTest, EmptyStringFormatDoesNotCrash) {
+ Rule rule;
+ EXPECT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"\"}"));
+}
+
+TEST(RuleTest, ParseRequiredFields) {
Rule rule;
- ASSERT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%S\"}"));
- ASSERT_EQ(1, rule.GetFormat().size());
- EXPECT_EQ(ADMIN_AREA, rule.GetFormat()[0]);
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"require\":\"ONAZC\"}"));
+ std::vector<AddressField> expected;
+ expected.push_back(ORGANIZATION);
+ expected.push_back(RECIPIENT);
+ expected.push_back(STREET_ADDRESS);
+ expected.push_back(POSTAL_CODE);
+ expected.push_back(LOCALITY);
+ EXPECT_EQ(expected, rule.GetRequired());
+}
+
+TEST(RuleTest, ParseEmptyStringRequiredFields) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"require\":\"\"}"));
+ EXPECT_TRUE(rule.GetRequired().empty());
+}
+
+TEST(RuleTest, ParseInvalidRequiredFields) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"require\":\"garbage\"}"));
+ EXPECT_TRUE(rule.GetRequired().empty());
+}
+
+TEST(RuleTest, ParseDuplicateRequiredFields) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"require\":\"SSS\"}"));
+ EXPECT_EQ(std::vector<AddressField>(3, ADMIN_AREA), rule.GetRequired());
}
TEST(RuleTest, ParsesSubKeysCorrectly) {
@@ -141,6 +269,15 @@ TEST(RuleTest, ParsesLanguagesCorrectly) {
EXPECT_EQ(expected, rule.GetLanguages());
}
+TEST(RuleTest, ParsesPostalCodeFormatCorrectly) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule(
+ "{"
+ "\"zip\":\"\\\\d{5}([ \\\\-]\\\\d{4})?\""
+ "}"));
+ EXPECT_EQ("\\d{5}([ \\-]\\d{4})?", rule.GetPostalCodeFormat());
+}
+
TEST(RuleTest, EmptyStringIsNotValid) {
Rule rule;
EXPECT_FALSE(rule.ParseSerializedRule(std::string()));
@@ -216,13 +353,31 @@ INSTANTIATE_TEST_CASE_P(
// Tests for rule parsing.
class RuleParseTest : public testing::TestWithParam<std::string> {
protected:
+ const std::string& GetData() const {
+ return RegionDataConstants::GetRegionData(GetParam());
+ }
+
Rule rule_;
};
-// Verifies that a region data can be parsed successfully.
-TEST_P(RuleParseTest, RegionDataParsedSuccessfully) {
- EXPECT_TRUE(rule_.ParseSerializedRule(
- RegionDataConstants::GetRegionData(GetParam())));
+// Verifies that an address format does not contain consecutive lines with
+// multiple fields each. Such address format (e.g. {{ELEMENT, ELEMENT},
+// {ELEMENT, ELEMENT}}) will result in incorrect behavior of BuildComponents()
+// public API.
+TEST_P(RuleParseTest, ConsecutiveLinesWithMultipleFields) {
+ ASSERT_TRUE(rule_.ParseSerializedRule(GetData()));
+ bool previous_line_has_single_field = true;
+ for (std::vector<std::vector<AddressField> >::const_iterator
+ line_it = rule_.GetFormat().begin();
+ line_it != rule_.GetFormat().end();
+ ++line_it) {
+ if (line_it->empty()) {
+ continue;
+ }
+ ASSERT_TRUE(line_it->size() == 1 || previous_line_has_single_field)
+ << GetParam() << ": " << GetData();
+ previous_line_has_single_field = line_it->size() == 1;
+ }
}
// Test parsing all region data.

Powered by Google App Engine
This is Rietveld 408576698