aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRouslan Solomakhin <rouslan@chromium.org>2014-04-03 17:37:55 +0000
committerFredrik Roubert <roubert@google.com>2014-09-01 19:20:42 +0200
commit44757b2af1ddb7b3710f7cb7b37d97d992720120 (patch)
tree3143d1e6b26ca4f372f45c53a2b4c522961215cd
parent85d4bb3d565e0490880194a4d3a049a6ba1d8d86 (diff)
downloadsrc-44757b2af1ddb7b3710f7cb7b37d97d992720120.tar.gz
BuildComponents() should return at most one component per field type.
Addresses in some regions display the same field multiple times on an envelope. For example, CI addresses display CEDEX twice. The BuildComponents() function should not return multiple UI components for the same field, because these components are used to display input fields. There should be exactly one input field per field type. R=lararennie@google.com, roubert@google.com Review URL: https://codereview.appspot.com/83790043
-rw-r--r--cpp/src/address_ui.cc10
-rw-r--r--cpp/test/address_ui_test.cc12
2 files changed, 21 insertions, 1 deletions
diff --git a/cpp/src/address_ui.cc b/cpp/src/address_ui.cc
index 0fac86f..15f3c61 100644
--- a/cpp/src/address_ui.cc
+++ b/cpp/src/address_ui.cc
@@ -18,6 +18,7 @@
#include <libaddressinput/address_ui_component.h>
#include <libaddressinput/localization.h>
+#include <set>
#include <string>
#include <vector>
@@ -76,10 +77,14 @@ std::vector<AddressUiComponent> BuildComponents(
Rule rule;
rule.CopyFrom(Rule::GetDefault());
if (!rule.ParseSerializedRule(
- RegionDataConstants::GetRegionData(region_code))) {
+ RegionDataConstants::GetRegionData(region_code))) {
return result;
}
+ // For avoiding showing an input field twice, when the field is displayed
+ // twice on an envelope.
+ std::set<AddressField> fields;
+
bool previous_field_is_newline = true;
bool next_field_is_newline = true;
for (std::vector<AddressField>::const_iterator field_it =
@@ -89,6 +94,9 @@ std::vector<AddressUiComponent> BuildComponents(
previous_field_is_newline = true;
continue;
}
+ if (!fields.insert(*field_it).second) {
+ continue;
+ }
AddressUiComponent component;
std::vector<AddressField>::const_iterator next_field_it = field_it + 1;
next_field_is_newline =
diff --git a/cpp/test/address_ui_test.cc b/cpp/test/address_ui_test.cc
index 8eb4130..b8cb834 100644
--- a/cpp/test/address_ui_test.cc
+++ b/cpp/test/address_ui_test.cc
@@ -18,6 +18,7 @@
#include <libaddressinput/address_ui_component.h>
#include <libaddressinput/localization.h>
+#include <set>
#include <string>
#include <vector>
@@ -78,6 +79,17 @@ TEST_P(AddressUiTest, ComponentsAreValid) {
EXPECT_TRUE(ComponentsAreValid(BuildComponents(GetParam(), localization_)));
}
+// Verifies that BuildComponents() returns at most one input field of each type.
+TEST_P(AddressUiTest, UniqueFieldTypes) {
+ std::set<AddressField> fields;
+ const std::vector<AddressUiComponent>& components =
+ BuildComponents(GetParam(), localization_);
+ for (std::vector<AddressUiComponent>::const_iterator it = components.begin();
+ it != components.end(); ++it) {
+ EXPECT_TRUE(fields.insert(it->field).second);
+ }
+}
+
// Test all regions codes.
INSTANTIATE_TEST_CASE_P(
AllRegions, AddressUiTest,