1 // Copyright (C) 2009 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: David Yonge-Mallo
17 // Note that these tests use the test metadata, not the normal metadata file, so
18 // should not be used for regression test purposes - these tests are
19 // illustrative only and test functionality.
21 #include "phonenumbers/shortnumberinfo.h"
23 #include <gtest/gtest.h>
25 #include "phonenumbers/base/logging.h"
26 #include "phonenumbers/default_logger.h"
27 #include "phonenumbers/phonenumberutil.h"
28 #include "phonenumbers/stringutil.h"
29 #include "phonenumbers/test_util.h"
32 namespace phonenumbers {
34 class ShortNumberInfoTest : public testing::Test {
36 PhoneNumber ParseNumberForTesting(const string& number,
37 const string& region_code) {
38 PhoneNumber phone_number;
39 PhoneNumberUtil::ErrorType error_type = phone_util_.Parse(
40 number, region_code, &phone_number);
41 CHECK_EQ(error_type, PhoneNumberUtil::NO_PARSING_ERROR);
42 IGNORE_UNUSED(error_type);
46 ShortNumberInfoTest() : short_info_() {
47 PhoneNumberUtil::GetInstance()->SetLogger(new StdoutLogger());
50 const PhoneNumberUtil phone_util_;
51 const ShortNumberInfo short_info_;
54 DISALLOW_COPY_AND_ASSIGN(ShortNumberInfoTest);
57 TEST_F(ShortNumberInfoTest, IsPossibleShortNumber) {
58 PhoneNumber possible_number;
59 possible_number.set_country_code(33);
60 possible_number.set_national_number(123456ULL);
61 EXPECT_TRUE(short_info_.IsPossibleShortNumber(possible_number));
62 EXPECT_TRUE(short_info_.IsPossibleShortNumberForRegion(
63 ParseNumberForTesting("123456", RegionCode::FR()), RegionCode::FR()));
65 PhoneNumber impossible_number;
66 impossible_number.set_country_code(33);
67 impossible_number.set_national_number(9ULL);
68 EXPECT_FALSE(short_info_.IsPossibleShortNumber(impossible_number));
70 // Note that GB and GG share the country calling code 44, and that this
71 // number is possible but not valid.
72 PhoneNumber shared_number;
73 shared_number.set_country_code(44);
74 shared_number.set_national_number(11001ULL);
75 EXPECT_TRUE(short_info_.IsPossibleShortNumber(shared_number));
78 TEST_F(ShortNumberInfoTest, IsValidShortNumber) {
79 PhoneNumber valid_number;
80 valid_number.set_country_code(33);
81 valid_number.set_national_number(1010ULL);
82 EXPECT_TRUE(short_info_.IsValidShortNumber(valid_number));
83 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion(
84 ParseNumberForTesting("1010", RegionCode::FR()), RegionCode::FR()));
86 PhoneNumber invalid_number;
87 invalid_number.set_country_code(33);
88 invalid_number.set_national_number(123456ULL);
89 EXPECT_FALSE(short_info_.IsValidShortNumber(invalid_number));
90 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion(
91 ParseNumberForTesting("123456", RegionCode::FR()), RegionCode::FR()));
93 // Note that GB and GG share the country calling code 44.
94 PhoneNumber shared_number;
95 shared_number.set_country_code(44);
96 shared_number.set_national_number(18001ULL);
97 EXPECT_TRUE(short_info_.IsValidShortNumber(shared_number));
100 TEST_F(ShortNumberInfoTest, GetExpectedCost) {
101 uint64 national_number;
102 const string& premium_rate_example =
103 short_info_.GetExampleShortNumberForCost(
104 RegionCode::FR(), ShortNumberInfo::PREMIUM_RATE);
105 EXPECT_EQ(ShortNumberInfo::PREMIUM_RATE,
106 short_info_.GetExpectedCostForRegion(
107 ParseNumberForTesting(premium_rate_example, RegionCode::FR()),
109 PhoneNumber premium_rate_number;
110 premium_rate_number.set_country_code(33);
111 safe_strtou64(premium_rate_example, &national_number);
112 premium_rate_number.set_national_number(national_number);
113 EXPECT_EQ(ShortNumberInfo::PREMIUM_RATE,
114 short_info_.GetExpectedCost(premium_rate_number));
116 const string& standard_rate_example =
117 short_info_.GetExampleShortNumberForCost(
118 RegionCode::FR(), ShortNumberInfo::STANDARD_RATE);
119 EXPECT_EQ(ShortNumberInfo::STANDARD_RATE,
120 short_info_.GetExpectedCostForRegion(
121 ParseNumberForTesting(standard_rate_example, RegionCode::FR()),
123 PhoneNumber standard_rate_number;
124 standard_rate_number.set_country_code(33);
125 safe_strtou64(standard_rate_example, &national_number);
126 standard_rate_number.set_national_number(national_number);
127 EXPECT_EQ(ShortNumberInfo::STANDARD_RATE,
128 short_info_.GetExpectedCost(standard_rate_number));
130 const string& toll_free_example =
131 short_info_.GetExampleShortNumberForCost(
132 RegionCode::FR(), ShortNumberInfo::TOLL_FREE);
133 EXPECT_EQ(ShortNumberInfo::TOLL_FREE,
134 short_info_.GetExpectedCostForRegion(
135 ParseNumberForTesting(toll_free_example, RegionCode::FR()),
137 PhoneNumber toll_free_number;
138 toll_free_number.set_country_code(33);
139 safe_strtou64(toll_free_example, &national_number);
140 toll_free_number.set_national_number(national_number);
141 EXPECT_EQ(ShortNumberInfo::TOLL_FREE,
142 short_info_.GetExpectedCost(toll_free_number));
145 ShortNumberInfo::UNKNOWN_COST,
146 short_info_.GetExpectedCostForRegion(
147 ParseNumberForTesting("12345", RegionCode::FR()), RegionCode::FR()));
148 PhoneNumber unknown_cost_number;
149 unknown_cost_number.set_country_code(33);
150 unknown_cost_number.set_national_number(12345ULL);
151 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
152 short_info_.GetExpectedCost(unknown_cost_number));
154 // Test that an invalid number may nevertheless have a cost other than
156 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion(
157 ParseNumberForTesting("116123", RegionCode::FR()), RegionCode::FR()));
159 ShortNumberInfo::TOLL_FREE,
160 short_info_.GetExpectedCostForRegion(
161 ParseNumberForTesting("116123", RegionCode::FR()), RegionCode::FR()));
162 PhoneNumber invalid_number;
163 invalid_number.set_country_code(33);
164 invalid_number.set_national_number(116123ULL);
165 EXPECT_FALSE(short_info_.IsValidShortNumber(invalid_number));
166 EXPECT_EQ(ShortNumberInfo::TOLL_FREE,
167 short_info_.GetExpectedCost(invalid_number));
169 // Test a nonexistent country code.
171 ShortNumberInfo::UNKNOWN_COST,
172 short_info_.GetExpectedCostForRegion(
173 ParseNumberForTesting("911", RegionCode::US()), RegionCode::ZZ()));
174 unknown_cost_number.Clear();
175 unknown_cost_number.set_country_code(123);
176 unknown_cost_number.set_national_number(911ULL);
177 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
178 short_info_.GetExpectedCost(unknown_cost_number));
181 TEST_F(ShortNumberInfoTest, GetExpectedCostForSharedCountryCallingCode) {
182 // Test some numbers which have different costs in countries sharing the same
183 // country calling code. In Australia, 1234 is premium-rate, 1194 is
184 // standard-rate, and 733 is toll-free. These are not known to be valid
185 // numbers in the Christmas Islands.
186 string ambiguous_premium_rate_string("1234");
187 PhoneNumber ambiguous_premium_rate_number;
188 ambiguous_premium_rate_number.set_country_code(61);
189 ambiguous_premium_rate_number.set_national_number(1234ULL);
190 string ambiguous_standard_rate_string("1194");
191 PhoneNumber ambiguous_standard_rate_number;
192 ambiguous_standard_rate_number.set_country_code(61);
193 ambiguous_standard_rate_number.set_national_number(1194ULL);
194 string ambiguous_toll_free_string("733");
195 PhoneNumber ambiguous_toll_free_number;
196 ambiguous_toll_free_number.set_country_code(61);
197 ambiguous_toll_free_number.set_national_number(733ULL);
199 EXPECT_TRUE(short_info_.IsValidShortNumber(ambiguous_premium_rate_number));
200 EXPECT_TRUE(short_info_.IsValidShortNumber(ambiguous_standard_rate_number));
201 EXPECT_TRUE(short_info_.IsValidShortNumber(ambiguous_toll_free_number));
203 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion(
204 ParseNumberForTesting(ambiguous_premium_rate_string, RegionCode::AU()),
206 EXPECT_EQ(ShortNumberInfo::PREMIUM_RATE,
207 short_info_.GetExpectedCostForRegion(
208 ParseNumberForTesting(ambiguous_premium_rate_string,
212 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion(
213 ParseNumberForTesting(ambiguous_premium_rate_string, RegionCode::CX()),
215 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
216 short_info_.GetExpectedCostForRegion(
217 ParseNumberForTesting(ambiguous_premium_rate_string,
220 // PREMIUM_RATE takes precedence over UNKNOWN_COST.
221 EXPECT_EQ(ShortNumberInfo::PREMIUM_RATE,
222 short_info_.GetExpectedCost(ambiguous_premium_rate_number));
224 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion(
225 ParseNumberForTesting(ambiguous_standard_rate_string, RegionCode::AU()),
227 EXPECT_EQ(ShortNumberInfo::STANDARD_RATE,
228 short_info_.GetExpectedCostForRegion(
229 ParseNumberForTesting(ambiguous_standard_rate_string,
233 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion(
234 ParseNumberForTesting(ambiguous_standard_rate_string, RegionCode::CX()),
236 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
237 short_info_.GetExpectedCostForRegion(
238 ParseNumberForTesting(ambiguous_standard_rate_string,
241 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
242 short_info_.GetExpectedCost(ambiguous_standard_rate_number));
244 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion(
245 ParseNumberForTesting(ambiguous_toll_free_string, RegionCode::AU()),
248 ShortNumberInfo::TOLL_FREE,
249 short_info_.GetExpectedCostForRegion(
250 ParseNumberForTesting(ambiguous_toll_free_string, RegionCode::AU()),
253 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion(
254 ParseNumberForTesting(ambiguous_toll_free_string, RegionCode::CX()),
257 ShortNumberInfo::UNKNOWN_COST,
258 short_info_.GetExpectedCostForRegion(
259 ParseNumberForTesting(ambiguous_toll_free_string, RegionCode::CX()),
261 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
262 short_info_.GetExpectedCost(ambiguous_toll_free_number));
265 TEST_F(ShortNumberInfoTest, GetExampleShortNumber) {
266 EXPECT_EQ("8711", short_info_.GetExampleShortNumber(RegionCode::AM()));
267 EXPECT_EQ("1010", short_info_.GetExampleShortNumber(RegionCode::FR()));
268 EXPECT_EQ("", short_info_.GetExampleShortNumber(RegionCode::UN001()));
269 EXPECT_EQ("", short_info_.GetExampleShortNumber(RegionCode::GetUnknown()));
272 TEST_F(ShortNumberInfoTest, GetExampleShortNumberForCost) {
274 short_info_.GetExampleShortNumberForCost(RegionCode::FR(),
275 ShortNumberInfo::TOLL_FREE));
277 short_info_.GetExampleShortNumberForCost(RegionCode::FR(),
278 ShortNumberInfo::STANDARD_RATE));
280 short_info_.GetExampleShortNumberForCost(RegionCode::FR(),
281 ShortNumberInfo::PREMIUM_RATE));
282 EXPECT_EQ("", short_info_.GetExampleShortNumberForCost(RegionCode::FR(),
283 ShortNumberInfo::UNKNOWN_COST));
286 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_US) {
287 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::US()));
288 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("112", RegionCode::US()));
289 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("999", RegionCode::US()));
292 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberLongNumber_US) {
293 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("9116666666",
295 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("1126666666",
297 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9996666666",
301 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberWithFormatting_US) {
302 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("9-1-1", RegionCode::US()));
303 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("1-1-2", RegionCode::US()));
304 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9-9-9",
308 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberWithPlusSign_US) {
309 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("+911", RegionCode::US()));
310 // This hex sequence is the full-width plus sign U+FF0B.
311 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("\xEF\xBC\x8B" "911",
313 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber(" +911",
315 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("+112", RegionCode::US()));
316 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("+999", RegionCode::US()));
319 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_BR) {
320 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::BR()));
321 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("190", RegionCode::BR()));
322 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("999", RegionCode::BR()));
325 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberLongNumber_BR) {
326 // Brazilian emergency numbers don't work when additional digits are appended.
327 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9111", RegionCode::BR()));
328 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("1900", RegionCode::BR()));
329 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9996", RegionCode::BR()));
332 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_CL) {
333 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("131", RegionCode::CL()));
334 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("133", RegionCode::CL()));
337 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberLongNumber_CL) {
338 // Chilean emergency numbers don't work when additional digits are appended.
339 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("1313", RegionCode::CL()));
340 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("1330", RegionCode::CL()));
343 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_AO) {
344 // Angola doesn't have any metadata for emergency numbers in the test
346 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::AO()));
347 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("222123456",
349 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("923123456",
353 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_ZW) {
354 // Zimbabwe doesn't have any metadata in the test metadata.
355 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::ZW()));
356 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("01312345",
358 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("0711234567",
362 TEST_F(ShortNumberInfoTest, IsEmergencyNumber_US) {
363 EXPECT_TRUE(short_info_.IsEmergencyNumber("911", RegionCode::US()));
364 EXPECT_TRUE(short_info_.IsEmergencyNumber("112", RegionCode::US()));
365 EXPECT_FALSE(short_info_.IsEmergencyNumber("999", RegionCode::US()));
368 TEST_F(ShortNumberInfoTest, IsEmergencyNumberLongNumber_US) {
369 EXPECT_FALSE(short_info_.IsEmergencyNumber("9116666666", RegionCode::US()));
370 EXPECT_FALSE(short_info_.IsEmergencyNumber("1126666666", RegionCode::US()));
371 EXPECT_FALSE(short_info_.IsEmergencyNumber("9996666666", RegionCode::US()));
374 TEST_F(ShortNumberInfoTest, IsEmergencyNumberWithFormatting_US) {
375 EXPECT_TRUE(short_info_.IsEmergencyNumber("9-1-1", RegionCode::US()));
376 EXPECT_TRUE(short_info_.IsEmergencyNumber("*911", RegionCode::US()));
377 EXPECT_TRUE(short_info_.IsEmergencyNumber("1-1-2", RegionCode::US()));
378 EXPECT_TRUE(short_info_.IsEmergencyNumber("*112", RegionCode::US()));
379 EXPECT_FALSE(short_info_.IsEmergencyNumber("9-9-9", RegionCode::US()));
380 EXPECT_FALSE(short_info_.IsEmergencyNumber("*999", RegionCode::US()));
383 TEST_F(ShortNumberInfoTest, IsEmergencyNumberWithPlusSign_US) {
384 EXPECT_FALSE(short_info_.IsEmergencyNumber("+911", RegionCode::US()));
385 // This hex sequence is the full-width plus sign U+FF0B.
386 EXPECT_FALSE(short_info_.IsEmergencyNumber("\xEF\xBC\x8B" "911",
388 EXPECT_FALSE(short_info_.IsEmergencyNumber(" +911", RegionCode::US()));
389 EXPECT_FALSE(short_info_.IsEmergencyNumber("+112", RegionCode::US()));
390 EXPECT_FALSE(short_info_.IsEmergencyNumber("+999", RegionCode::US()));
393 TEST_F(ShortNumberInfoTest, IsEmergencyNumber_BR) {
394 EXPECT_TRUE(short_info_.IsEmergencyNumber("911", RegionCode::BR()));
395 EXPECT_TRUE(short_info_.IsEmergencyNumber("190", RegionCode::BR()));
396 EXPECT_FALSE(short_info_.IsEmergencyNumber("999", RegionCode::BR()));
399 TEST_F(ShortNumberInfoTest, EmergencyNumberLongNumber_BR) {
400 EXPECT_FALSE(short_info_.IsEmergencyNumber("9111", RegionCode::BR()));
401 EXPECT_FALSE(short_info_.IsEmergencyNumber("1900", RegionCode::BR()));
402 EXPECT_FALSE(short_info_.IsEmergencyNumber("9996", RegionCode::BR()));
405 TEST_F(ShortNumberInfoTest, IsEmergencyNumber_AO) {
406 // Angola doesn't have any metadata for emergency numbers in the test
408 EXPECT_FALSE(short_info_.IsEmergencyNumber("911", RegionCode::AO()));
409 EXPECT_FALSE(short_info_.IsEmergencyNumber("222123456", RegionCode::AO()));
410 EXPECT_FALSE(short_info_.IsEmergencyNumber("923123456", RegionCode::AO()));
413 TEST_F(ShortNumberInfoTest, IsEmergencyNumber_ZW) {
414 // Zimbabwe doesn't have any metadata in the test metadata.
415 EXPECT_FALSE(short_info_.IsEmergencyNumber("911", RegionCode::ZW()));
416 EXPECT_FALSE(short_info_.IsEmergencyNumber("01312345", RegionCode::ZW()));
417 EXPECT_FALSE(short_info_.IsEmergencyNumber("0711234567", RegionCode::ZW()));
420 TEST_F(ShortNumberInfoTest, EmergencyNumberForSharedCountryCallingCode) {
421 // Test the emergency number 112, which is valid in both Australia and the
422 // Christmas Islands.
423 EXPECT_TRUE(short_info_.IsEmergencyNumber("112", RegionCode::AU()));
424 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion(
425 ParseNumberForTesting("112", RegionCode::AU()), RegionCode::AU()));
427 ShortNumberInfo::TOLL_FREE,
428 short_info_.GetExpectedCostForRegion(
429 ParseNumberForTesting("112", RegionCode::AU()), RegionCode::AU()));
431 EXPECT_TRUE(short_info_.IsEmergencyNumber("112", RegionCode::CX()));
432 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion(
433 ParseNumberForTesting("112", RegionCode::CX()), RegionCode::CX()));
435 ShortNumberInfo::TOLL_FREE,
436 short_info_.GetExpectedCostForRegion(
437 ParseNumberForTesting("112", RegionCode::CX()), RegionCode::CX()));
439 PhoneNumber shared_emergency_number;
440 shared_emergency_number.set_country_code(61);
441 shared_emergency_number.set_national_number(112ULL);
442 EXPECT_TRUE(short_info_.IsValidShortNumber(shared_emergency_number));
443 EXPECT_EQ(ShortNumberInfo::TOLL_FREE,
444 short_info_.GetExpectedCost(shared_emergency_number));
447 TEST_F(ShortNumberInfoTest, OverlappingNANPANumber) {
448 // 211 is an emergency number in Barbados, while it is a toll-free
449 // information line in Canada and the USA.
450 EXPECT_TRUE(short_info_.IsEmergencyNumber("211", RegionCode::BB()));
452 ShortNumberInfo::TOLL_FREE,
453 short_info_.GetExpectedCostForRegion(
454 ParseNumberForTesting("211", RegionCode::BB()), RegionCode::BB()));
456 EXPECT_FALSE(short_info_.IsEmergencyNumber("211", RegionCode::US()));
458 ShortNumberInfo::UNKNOWN_COST,
459 short_info_.GetExpectedCostForRegion(
460 ParseNumberForTesting("211", RegionCode::US()), RegionCode::US()));
462 EXPECT_FALSE(short_info_.IsEmergencyNumber("211", RegionCode::CA()));
464 ShortNumberInfo::UNKNOWN_COST,
465 short_info_.GetExpectedCostForRegion(
466 ParseNumberForTesting("211", RegionCode::CA()), RegionCode::CA()));
469 } // namespace phonenumbers