1018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org// Copyright (C) 2014 Google Inc.
2018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org//
3018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org// Licensed under the Apache License, Version 2.0 (the "License");
4018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org// you may not use this file except in compliance with the License.
5018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org// You may obtain a copy of the License at
6018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org//
7018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org// http://www.apache.org/licenses/LICENSE-2.0
8018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org//
9018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org// Unless required by applicable law or agreed to in writing, software
10018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org// distributed under the License is distributed on an "AS IS" BASIS,
11018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org// See the License for the specific language governing permissions and
13018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org// limitations under the License.
14018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
15018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org#include <libaddressinput/region_data_builder.h>
16018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
17018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org#include <libaddressinput/callback.h>
18018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org#include <libaddressinput/null_storage.h>
19018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org#include <libaddressinput/preload_supplier.h>
20018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org#include <libaddressinput/region_data.h>
21018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org#include <libaddressinput/util/basictypes.h>
22018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org#include <libaddressinput/util/scoped_ptr.h>
23018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
24018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org#include <string>
25018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
26018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org#include <gtest/gtest.h>
27018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
288466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com#include "testdata_source.h"
299f47fe3ed525accac995b095d408a825673a2ee1roubert@google.com
30018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.orgnamespace {
31018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
32018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.orgusing i18n::addressinput::BuildCallback;
33018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.orgusing i18n::addressinput::NullStorage;
34018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.orgusing i18n::addressinput::PreloadSupplier;
35018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.orgusing i18n::addressinput::RegionData;
36018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.orgusing i18n::addressinput::RegionDataBuilder;
37018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.orgusing i18n::addressinput::scoped_ptr;
388466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.comusing i18n::addressinput::TestdataSource;
39018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
40018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.orgclass RegionDataBuilderTest : public testing::Test {
41018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org protected:
42018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  RegionDataBuilderTest()
438466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com      : supplier_(new TestdataSource(true),
44018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org                  new NullStorage),
45018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org        builder_(&supplier_),
46018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org        loaded_callback_(BuildCallback(this, &RegionDataBuilderTest::OnLoaded)),
47018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org        best_language_() {}
48018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
49018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  PreloadSupplier supplier_;
50018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  RegionDataBuilder builder_;
51e543c57d2256e9f144bbfc3783cc30a5d2129eaeroubert@google.com  const scoped_ptr<const PreloadSupplier::Callback> loaded_callback_;
52018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  std::string best_language_;
53018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
54018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org private:
558c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com  void OnLoaded(bool success, const std::string& region_code, int num_rules) {
56018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org    ASSERT_TRUE(success);
57018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org    ASSERT_FALSE(region_code.empty());
58018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org    ASSERT_LT(0, num_rules);
59018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org    ASSERT_TRUE(supplier_.IsLoaded(region_code));
60018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  }
61018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
62018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  DISALLOW_COPY_AND_ASSIGN(RegionDataBuilderTest);
63018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org};
64018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
65018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.orgTEST_F(RegionDataBuilderTest, BuildUsRegionTree) {
66018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  supplier_.LoadRules("US", *loaded_callback_);
67018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  const RegionData& tree = builder_.Build("US", "en-US", &best_language_);
68018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  EXPECT_FALSE(tree.sub_regions().empty());
69018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org}
70018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
71018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.orgTEST_F(RegionDataBuilderTest, BuildCnRegionTree) {
72018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  supplier_.LoadRules("CN", *loaded_callback_);
73018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  const RegionData& tree = builder_.Build("CN", "zh-Hans", &best_language_);
74018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  ASSERT_FALSE(tree.sub_regions().empty());
75018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  EXPECT_FALSE(tree.sub_regions().front()->sub_regions().empty());
76018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org}
77018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
78018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.orgTEST_F(RegionDataBuilderTest, BuildChRegionTree) {
79018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  supplier_.LoadRules("CH", *loaded_callback_);
80018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  const RegionData& tree = builder_.Build("CH", "de-CH", &best_language_);
81018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  // Although "CH" has information for its administrative divisions, the
82018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  // administrative area field is not used, which results in an empty tree of
83018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  // sub-regions.
84018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  EXPECT_TRUE(tree.sub_regions().empty());
85018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org}
86018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
87018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.orgTEST_F(RegionDataBuilderTest, BuildZwRegionTree) {
88018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  supplier_.LoadRules("ZW", *loaded_callback_);
89018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  const RegionData& tree = builder_.Build("ZW", "en-ZW", &best_language_);
90018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org  EXPECT_TRUE(tree.sub_regions().empty());
91018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org}
92018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org
93a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.orgTEST_F(RegionDataBuilderTest, UsTreeHasStateAbbreviationsAndNames) {
94a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  supplier_.LoadRules("US", *loaded_callback_);
95a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  const RegionData& tree = builder_.Build("US", "en-US", &best_language_);
96a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  EXPECT_EQ("en", best_language_);
97a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  ASSERT_FALSE(tree.sub_regions().empty());
98a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  EXPECT_EQ("AL", tree.sub_regions().front()->key());
99a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  EXPECT_EQ("Alabama", tree.sub_regions().front()->name());
100a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org}
101a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org
102a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.orgTEST_F(RegionDataBuilderTest,
103a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org       KrWithKoLatnLanguageHasKoreanKeysAndLatinScriptNames) {
104a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  supplier_.LoadRules("KR", *loaded_callback_);
105a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  const RegionData& tree = builder_.Build("KR", "ko-Latn", &best_language_);
106a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  EXPECT_EQ("ko-Latn", best_language_);
107a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  ASSERT_FALSE(tree.sub_regions().empty());
1089df6dae6a50aaed83d010be8a05030c15be204a0roubert@google.com  EXPECT_EQ(
1099df6dae6a50aaed83d010be8a05030c15be204a0roubert@google.com      "\xEA\xB0\x95\xEC\x9B\x90\xEB\x8F\x84",  /* "강원도" */
1109df6dae6a50aaed83d010be8a05030c15be204a0roubert@google.com      tree.sub_regions().front()->key());
111a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  EXPECT_EQ("Gangwon", tree.sub_regions().front()->name());
112a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org}
113a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org
114a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.orgTEST_F(RegionDataBuilderTest, KrWithKoKrLanguageHasKoreanKeysAndNames) {
115a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  supplier_.LoadRules("KR", *loaded_callback_);
116a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  const RegionData& tree = builder_.Build("KR", "ko-KR", &best_language_);
117a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  EXPECT_EQ("ko", best_language_);
118a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org  ASSERT_FALSE(tree.sub_regions().empty());
1199df6dae6a50aaed83d010be8a05030c15be204a0roubert@google.com  EXPECT_EQ(
1209df6dae6a50aaed83d010be8a05030c15be204a0roubert@google.com      "\xEA\xB0\x95\xEC\x9B\x90\xEB\x8F\x84",  /* "강원도" */
1219df6dae6a50aaed83d010be8a05030c15be204a0roubert@google.com      tree.sub_regions().front()->key());
1229df6dae6a50aaed83d010be8a05030c15be204a0roubert@google.com  EXPECT_EQ(
1239df6dae6a50aaed83d010be8a05030c15be204a0roubert@google.com      "\xEA\xB0\x95\xEC\x9B\x90",  /* "강원" */
1249df6dae6a50aaed83d010be8a05030c15be204a0roubert@google.com      tree.sub_regions().front()->name());
125a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org}
126a836956c1de1bd79119d125da0a1e496dbead155rouslan@chromium.org
127018e8c28bb50ae78b83921f7211667407512b706rouslan@chromium.org}  // namespace
128