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