1 // Copyright (C) 2012 The Libphonenumber Authors
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
15 // Author: Patrick Mezard
17 #include "phonenumbers/geocoding/phonenumber_offline_geocoder.h"
19 #include <gtest/gtest.h>
20 #include <unicode/locid.h>
22 #include "phonenumbers/geocoding/geocoding_test_data.h"
23 #include "phonenumbers/phonenumber.h"
24 #include "phonenumbers/phonenumber.pb.h"
27 namespace phonenumbers {
33 PhoneNumber MakeNumber(int32 country_code, uint64 national_number) {
35 n.set_country_code(country_code);
36 n.set_national_number(national_number);
40 const Locale kEnglishLocale = Locale("en", "GB");
41 const Locale kFrenchLocale = Locale("fr", "FR");
42 const Locale kGermanLocale = Locale("de", "DE");
43 const Locale kItalianLocale = Locale("it", "IT");
44 const Locale kKoreanLocale = Locale("ko", "KR");
45 const Locale kSimplifiedChineseLocale = Locale("zh", "CN");
49 class PhoneNumberOfflineGeocoderTest : public testing::Test {
51 PhoneNumberOfflineGeocoderTest() :
52 KO_NUMBER1(MakeNumber(82, 22123456UL)),
53 KO_NUMBER2(MakeNumber(82, 322123456UL)),
54 KO_NUMBER3(MakeNumber(82, 6421234567UL)),
55 KO_INVALID_NUMBER(MakeNumber(82, 1234UL)),
56 US_NUMBER1(MakeNumber(1, 6502530000UL)),
57 US_NUMBER2(MakeNumber(1, 6509600000UL)),
58 US_NUMBER3(MakeNumber(1, 2128120000UL)),
59 US_NUMBER4(MakeNumber(1, 6174240000UL)),
60 US_INVALID_NUMBER(MakeNumber(1, 123456789UL)),
61 BS_NUMBER1(MakeNumber(1, 2423651234UL)),
62 AU_NUMBER(MakeNumber(61, 236618300UL)),
63 NUMBER_WITH_INVALID_COUNTRY_CODE(MakeNumber(999, 2423651234UL)),
64 INTERNATIONAL_TOLL_FREE(MakeNumber(800, 12345678UL)) {
67 virtual void SetUp() {
69 new PhoneNumberOfflineGeocoder(
70 get_test_country_calling_codes(),
71 get_test_country_calling_codes_size(),
72 get_test_country_languages,
73 get_test_prefix_language_code_pairs(),
74 get_test_prefix_language_code_pairs_size(),
75 get_test_prefix_descriptions));
79 scoped_ptr<PhoneNumberOfflineGeocoder> geocoder_;
81 const PhoneNumber KO_NUMBER1;
82 const PhoneNumber KO_NUMBER2;
83 const PhoneNumber KO_NUMBER3;
84 const PhoneNumber KO_INVALID_NUMBER;
86 const PhoneNumber US_NUMBER1;
87 const PhoneNumber US_NUMBER2;
88 const PhoneNumber US_NUMBER3;
89 const PhoneNumber US_NUMBER4;
90 const PhoneNumber US_INVALID_NUMBER;
92 const PhoneNumber BS_NUMBER1;
93 const PhoneNumber AU_NUMBER;
94 const PhoneNumber NUMBER_WITH_INVALID_COUNTRY_CODE;
95 const PhoneNumber INTERNATIONAL_TOLL_FREE;
98 TEST_F(PhoneNumberOfflineGeocoderTest,
99 TestGetDescriptionForNumberWithNoDataFile) {
100 // No data file containing mappings for US numbers is available in Chinese for
101 // the unittests. As a result, the country name of United States in simplified
102 // Chinese is returned.
104 // "\u7F8E\u56FD" (unicode escape sequences are not always supported)
105 EXPECT_EQ("\xe7""\xbe""\x8e""\xe5""\x9b""\xbd",
106 geocoder_->GetDescriptionForNumber(US_NUMBER1,
107 kSimplifiedChineseLocale));
109 geocoder_->GetDescriptionForNumber(BS_NUMBER1, Locale("en", "US")));
110 EXPECT_EQ("Australia",
111 geocoder_->GetDescriptionForNumber(AU_NUMBER, Locale("en", "US")));
113 geocoder_->GetDescriptionForNumber(NUMBER_WITH_INVALID_COUNTRY_CODE,
114 Locale("en", "US")));
116 geocoder_->GetDescriptionForNumber(INTERNATIONAL_TOLL_FREE,
117 Locale("en", "US")));
120 TEST_F(PhoneNumberOfflineGeocoderTest,
121 TestGetDescriptionForNumberWithMissingPrefix) {
122 // Test that the name of the country is returned when the number passed in is
123 // valid but not covered by the geocoding data file.
124 EXPECT_EQ("United States",
125 geocoder_->GetDescriptionForNumber(US_NUMBER4, Locale("en", "US")));
128 TEST_F(PhoneNumberOfflineGeocoderTest, TestGetDescriptionForNumber_en_US) {
130 geocoder_->GetDescriptionForNumber(US_NUMBER1, Locale("en", "US")));
131 EXPECT_EQ("Mountain View, CA",
132 geocoder_->GetDescriptionForNumber(US_NUMBER2, Locale("en", "US")));
133 EXPECT_EQ("New York, NY",
134 geocoder_->GetDescriptionForNumber(US_NUMBER3, Locale("en", "US")));
137 TEST_F(PhoneNumberOfflineGeocoderTest, TestGetDescriptionForKoreanNumber) {
139 geocoder_->GetDescriptionForNumber(KO_NUMBER1, kEnglishLocale));
141 geocoder_->GetDescriptionForNumber(KO_NUMBER2, kEnglishLocale));
143 geocoder_->GetDescriptionForNumber(KO_NUMBER3, kEnglishLocale));
145 EXPECT_EQ("\xec""\x84""\x9c""\xec""\x9a""\xb8",
146 geocoder_->GetDescriptionForNumber(KO_NUMBER1, kKoreanLocale));
148 EXPECT_EQ("\xec""\x9d""\xb8""\xec""\xb2""\x9c",
149 geocoder_->GetDescriptionForNumber(KO_NUMBER2, kKoreanLocale));
152 TEST_F(PhoneNumberOfflineGeocoderTest, TestGetDescriptionForFallBack) {
153 // No fallback, as the location name for the given phone number is available
154 // in the requested language.
155 EXPECT_EQ("Kalifornien",
156 geocoder_->GetDescriptionForNumber(US_NUMBER1, kGermanLocale));
157 // German falls back to English.
158 EXPECT_EQ("New York, NY",
159 geocoder_->GetDescriptionForNumber(US_NUMBER3, kGermanLocale));
160 // Italian falls back to English.
162 geocoder_->GetDescriptionForNumber(US_NUMBER1, kItalianLocale));
163 // Korean doesn't fall back to English.
164 // "\uB300\uD55C\uBBFC\uAD6D"
165 EXPECT_EQ("\xeb""\x8c""\x80""\xed""\x95""\x9c""\xeb""\xaf""\xbc""\xea""\xb5"
167 geocoder_->GetDescriptionForNumber(KO_NUMBER3, kKoreanLocale));
170 TEST_F(PhoneNumberOfflineGeocoderTest,
171 TestGetDescriptionForNumberWithUserRegion) {
172 // User in Italy, American number. We should just show United States, in
173 // Spanish, and not more detailed information.
174 EXPECT_EQ("Estados Unidos",
175 geocoder_->GetDescriptionForNumber(US_NUMBER1, Locale("es", "ES"),
177 // Unknown region - should just show country name.
178 EXPECT_EQ("Estados Unidos",
179 geocoder_->GetDescriptionForNumber(US_NUMBER1, Locale("es", "ES"),
181 // User in the States, language German, should show detailed data.
182 EXPECT_EQ("Kalifornien",
183 geocoder_->GetDescriptionForNumber(US_NUMBER1, kGermanLocale,
185 // User in the States, language French, no data for French, so we fallback to
186 // English detailed data.
188 geocoder_->GetDescriptionForNumber(US_NUMBER1, kFrenchLocale,
190 // Invalid number - return an empty string.
192 geocoder_->GetDescriptionForNumber(US_INVALID_NUMBER,
197 TEST_F(PhoneNumberOfflineGeocoderTest, TestGetDescriptionForInvalidNumber) {
198 EXPECT_EQ("", geocoder_->GetDescriptionForNumber(KO_INVALID_NUMBER,
200 EXPECT_EQ("", geocoder_->GetDescriptionForNumber(US_INVALID_NUMBER,
204 } // namespace phonenumbers