1// Copyright (C) 2009 The Libphonenumber Authors 2// 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 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 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. 14 15// Author: David Yonge-Mallo 16 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. 20 21#include "phonenumbers/shortnumberinfo.h" 22 23#include <gtest/gtest.h> 24 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" 30 31namespace i18n { 32namespace phonenumbers { 33class ShortNumberInfoTest : public testing::Test { 34 public: 35 // This type is neither copyable nor movable. 36 ShortNumberInfoTest(const ShortNumberInfoTest&) = delete; 37 ShortNumberInfoTest& operator=(const ShortNumberInfoTest&) = delete; 38 39 protected: 40 PhoneNumber ParseNumberForTesting(const string& number, 41 const string& region_code) { 42 PhoneNumber phone_number; 43 PhoneNumberUtil::ErrorType error_type = phone_util_.Parse( 44 number, region_code, &phone_number); 45 CHECK_EQ(error_type, PhoneNumberUtil::NO_PARSING_ERROR); 46 IGNORE_UNUSED(error_type); 47 return phone_number; 48 } 49 50 ShortNumberInfoTest() : short_info_() { 51 PhoneNumberUtil::GetInstance()->SetLogger(new StdoutLogger()); 52 } 53 54 const PhoneNumberUtil phone_util_; 55 const ShortNumberInfo short_info_; 56 57}; 58 59TEST_F(ShortNumberInfoTest, IsPossibleShortNumber) { 60 PhoneNumber possible_number; 61 possible_number.set_country_code(33); 62 possible_number.set_national_number(uint64{123456}); 63 EXPECT_TRUE(short_info_.IsPossibleShortNumber(possible_number)); 64 EXPECT_TRUE(short_info_.IsPossibleShortNumberForRegion( 65 ParseNumberForTesting("123456", RegionCode::FR()), RegionCode::FR())); 66 67 PhoneNumber impossible_number; 68 impossible_number.set_country_code(33); 69 impossible_number.set_national_number(uint64{9}); 70 EXPECT_FALSE(short_info_.IsPossibleShortNumber(impossible_number)); 71 72 // Note that GB and GG share the country calling code 44, and that this 73 // number is possible but not valid. 74 PhoneNumber shared_number; 75 shared_number.set_country_code(44); 76 shared_number.set_national_number(uint64{11001}); 77 EXPECT_TRUE(short_info_.IsPossibleShortNumber(shared_number)); 78} 79 80TEST_F(ShortNumberInfoTest, IsValidShortNumber) { 81 PhoneNumber valid_number; 82 valid_number.set_country_code(33); 83 valid_number.set_national_number(uint64{1010}); 84 EXPECT_TRUE(short_info_.IsValidShortNumber(valid_number)); 85 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion( 86 ParseNumberForTesting("1010", RegionCode::FR()), RegionCode::FR())); 87 88 PhoneNumber invalid_number; 89 invalid_number.set_country_code(33); 90 invalid_number.set_national_number(uint64{123456}); 91 EXPECT_FALSE(short_info_.IsValidShortNumber(invalid_number)); 92 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion( 93 ParseNumberForTesting("123456", RegionCode::FR()), RegionCode::FR())); 94 95 // Note that GB and GG share the country calling code 44. 96 PhoneNumber shared_number; 97 shared_number.set_country_code(44); 98 shared_number.set_national_number(uint64{18001}); 99 EXPECT_TRUE(short_info_.IsValidShortNumber(shared_number)); 100} 101 102TEST_F(ShortNumberInfoTest, IsCarrierSpecific) { 103 PhoneNumber carrier_specific_number; 104 carrier_specific_number.set_country_code(1); 105 carrier_specific_number.set_national_number(uint64{33669}); 106 EXPECT_TRUE(short_info_.IsCarrierSpecific(carrier_specific_number)); 107 EXPECT_TRUE(short_info_.IsCarrierSpecificForRegion( 108 ParseNumberForTesting("33669", RegionCode::US()), RegionCode::US())); 109 110 PhoneNumber not_carrier_specific_number; 111 not_carrier_specific_number.set_country_code(1); 112 not_carrier_specific_number.set_national_number(uint64{911}); 113 EXPECT_FALSE(short_info_.IsCarrierSpecific(not_carrier_specific_number)); 114 EXPECT_FALSE(short_info_.IsCarrierSpecificForRegion( 115 ParseNumberForTesting("911", RegionCode::US()), RegionCode::US())); 116 117 PhoneNumber carrier_specific_number_for_some_region; 118 carrier_specific_number_for_some_region.set_country_code(1); 119 carrier_specific_number_for_some_region.set_national_number(uint64{211}); 120 EXPECT_TRUE(short_info_.IsCarrierSpecific( 121 carrier_specific_number_for_some_region)); 122 EXPECT_TRUE(short_info_.IsCarrierSpecificForRegion( 123 carrier_specific_number_for_some_region, RegionCode::US())); 124 EXPECT_FALSE(short_info_.IsCarrierSpecificForRegion( 125 carrier_specific_number_for_some_region, RegionCode::BB())); 126} 127 128TEST_F(ShortNumberInfoTest, IsSmsService) { 129 PhoneNumber sms_service_number_for_some_region; 130 sms_service_number_for_some_region.set_country_code(1); 131 sms_service_number_for_some_region.set_national_number(uint64{21234}); 132 EXPECT_TRUE(short_info_.IsSmsServiceForRegion( 133 sms_service_number_for_some_region, RegionCode::US())); 134 EXPECT_FALSE(short_info_.IsSmsServiceForRegion( 135 sms_service_number_for_some_region, RegionCode::BB())); 136} 137 138TEST_F(ShortNumberInfoTest, GetExpectedCost) { 139 uint64 national_number; 140 const string& premium_rate_example = 141 short_info_.GetExampleShortNumberForCost( 142 RegionCode::FR(), ShortNumberInfo::PREMIUM_RATE); 143 EXPECT_EQ(ShortNumberInfo::PREMIUM_RATE, 144 short_info_.GetExpectedCostForRegion( 145 ParseNumberForTesting(premium_rate_example, RegionCode::FR()), 146 RegionCode::FR())); 147 PhoneNumber premium_rate_number; 148 premium_rate_number.set_country_code(33); 149 safe_strtou64(premium_rate_example, &national_number); 150 premium_rate_number.set_national_number(national_number); 151 EXPECT_EQ(ShortNumberInfo::PREMIUM_RATE, 152 short_info_.GetExpectedCost(premium_rate_number)); 153 154 const string& standard_rate_example = 155 short_info_.GetExampleShortNumberForCost( 156 RegionCode::FR(), ShortNumberInfo::STANDARD_RATE); 157 EXPECT_EQ(ShortNumberInfo::STANDARD_RATE, 158 short_info_.GetExpectedCostForRegion( 159 ParseNumberForTesting(standard_rate_example, RegionCode::FR()), 160 RegionCode::FR())); 161 PhoneNumber standard_rate_number; 162 standard_rate_number.set_country_code(33); 163 safe_strtou64(standard_rate_example, &national_number); 164 standard_rate_number.set_national_number(national_number); 165 EXPECT_EQ(ShortNumberInfo::STANDARD_RATE, 166 short_info_.GetExpectedCost(standard_rate_number)); 167 168 const string& toll_free_example = 169 short_info_.GetExampleShortNumberForCost( 170 RegionCode::FR(), ShortNumberInfo::TOLL_FREE); 171 EXPECT_EQ(ShortNumberInfo::TOLL_FREE, 172 short_info_.GetExpectedCostForRegion( 173 ParseNumberForTesting(toll_free_example, RegionCode::FR()), 174 RegionCode::FR())); 175 PhoneNumber toll_free_number; 176 toll_free_number.set_country_code(33); 177 safe_strtou64(toll_free_example, &national_number); 178 toll_free_number.set_national_number(national_number); 179 EXPECT_EQ(ShortNumberInfo::TOLL_FREE, 180 short_info_.GetExpectedCost(toll_free_number)); 181 182 EXPECT_EQ( 183 ShortNumberInfo::UNKNOWN_COST, 184 short_info_.GetExpectedCostForRegion( 185 ParseNumberForTesting("12345", RegionCode::FR()), RegionCode::FR())); 186 PhoneNumber unknown_cost_number; 187 unknown_cost_number.set_country_code(33); 188 unknown_cost_number.set_national_number(uint64{12345}); 189 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST, 190 short_info_.GetExpectedCost(unknown_cost_number)); 191 192 // Test that an invalid number may nevertheless have a cost other than 193 // UNKNOWN_COST. 194 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion( 195 ParseNumberForTesting("116123", RegionCode::FR()), RegionCode::FR())); 196 EXPECT_EQ( 197 ShortNumberInfo::TOLL_FREE, 198 short_info_.GetExpectedCostForRegion( 199 ParseNumberForTesting("116123", RegionCode::FR()), RegionCode::FR())); 200 PhoneNumber invalid_number; 201 invalid_number.set_country_code(33); 202 invalid_number.set_national_number(uint64{116123}); 203 EXPECT_FALSE(short_info_.IsValidShortNumber(invalid_number)); 204 EXPECT_EQ(ShortNumberInfo::TOLL_FREE, 205 short_info_.GetExpectedCost(invalid_number)); 206 207 // Test a nonexistent country code. 208 EXPECT_EQ( 209 ShortNumberInfo::UNKNOWN_COST, 210 short_info_.GetExpectedCostForRegion( 211 ParseNumberForTesting("911", RegionCode::US()), RegionCode::ZZ())); 212 unknown_cost_number.Clear(); 213 unknown_cost_number.set_country_code(123); 214 unknown_cost_number.set_national_number(uint64{911}); 215 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST, 216 short_info_.GetExpectedCost(unknown_cost_number)); 217} 218 219TEST_F(ShortNumberInfoTest, GetExpectedCostForSharedCountryCallingCode) { 220 // Test some numbers which have different costs in countries sharing the same 221 // country calling code. In Australia, 1234 is premium-rate, 1194 is 222 // standard-rate, and 733 is toll-free. These are not known to be valid 223 // numbers in the Christmas Islands. 224 string ambiguous_premium_rate_string("1234"); 225 PhoneNumber ambiguous_premium_rate_number; 226 ambiguous_premium_rate_number.set_country_code(61); 227 ambiguous_premium_rate_number.set_national_number(uint64{1234}); 228 string ambiguous_standard_rate_string("1194"); 229 PhoneNumber ambiguous_standard_rate_number; 230 ambiguous_standard_rate_number.set_country_code(61); 231 ambiguous_standard_rate_number.set_national_number(uint64{1194}); 232 string ambiguous_toll_free_string("733"); 233 PhoneNumber ambiguous_toll_free_number; 234 ambiguous_toll_free_number.set_country_code(61); 235 ambiguous_toll_free_number.set_national_number(uint64{733}); 236 237 EXPECT_TRUE(short_info_.IsValidShortNumber(ambiguous_premium_rate_number)); 238 EXPECT_TRUE(short_info_.IsValidShortNumber(ambiguous_standard_rate_number)); 239 EXPECT_TRUE(short_info_.IsValidShortNumber(ambiguous_toll_free_number)); 240 241 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion( 242 ParseNumberForTesting(ambiguous_premium_rate_string, RegionCode::AU()), 243 RegionCode::AU())); 244 EXPECT_EQ(ShortNumberInfo::PREMIUM_RATE, 245 short_info_.GetExpectedCostForRegion( 246 ParseNumberForTesting(ambiguous_premium_rate_string, 247 RegionCode::AU()), 248 RegionCode::AU())); 249 250 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion( 251 ParseNumberForTesting(ambiguous_premium_rate_string, RegionCode::CX()), 252 RegionCode::CX())); 253 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST, 254 short_info_.GetExpectedCostForRegion( 255 ParseNumberForTesting(ambiguous_premium_rate_string, 256 RegionCode::CX()), 257 RegionCode::CX())); 258 // PREMIUM_RATE takes precedence over UNKNOWN_COST. 259 EXPECT_EQ(ShortNumberInfo::PREMIUM_RATE, 260 short_info_.GetExpectedCost(ambiguous_premium_rate_number)); 261 262 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion( 263 ParseNumberForTesting(ambiguous_standard_rate_string, RegionCode::AU()), 264 RegionCode::AU())); 265 EXPECT_EQ(ShortNumberInfo::STANDARD_RATE, 266 short_info_.GetExpectedCostForRegion( 267 ParseNumberForTesting(ambiguous_standard_rate_string, 268 RegionCode::AU()), 269 RegionCode::AU())); 270 271 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion( 272 ParseNumberForTesting(ambiguous_standard_rate_string, RegionCode::CX()), 273 RegionCode::CX())); 274 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST, 275 short_info_.GetExpectedCostForRegion( 276 ParseNumberForTesting(ambiguous_standard_rate_string, 277 RegionCode::CX()), 278 RegionCode::CX())); 279 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST, 280 short_info_.GetExpectedCost(ambiguous_standard_rate_number)); 281 282 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion( 283 ParseNumberForTesting(ambiguous_toll_free_string, RegionCode::AU()), 284 RegionCode::AU())); 285 EXPECT_EQ( 286 ShortNumberInfo::TOLL_FREE, 287 short_info_.GetExpectedCostForRegion( 288 ParseNumberForTesting(ambiguous_toll_free_string, RegionCode::AU()), 289 RegionCode::AU())); 290 291 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion( 292 ParseNumberForTesting(ambiguous_toll_free_string, RegionCode::CX()), 293 RegionCode::CX())); 294 EXPECT_EQ( 295 ShortNumberInfo::UNKNOWN_COST, 296 short_info_.GetExpectedCostForRegion( 297 ParseNumberForTesting(ambiguous_toll_free_string, RegionCode::CX()), 298 RegionCode::CX())); 299 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST, 300 short_info_.GetExpectedCost(ambiguous_toll_free_number)); 301} 302 303TEST_F(ShortNumberInfoTest, GetExampleShortNumber) { 304 EXPECT_FALSE(short_info_.GetExampleShortNumber(RegionCode::AD()).empty()); 305 EXPECT_FALSE(short_info_.GetExampleShortNumber(RegionCode::FR()).empty()); 306 EXPECT_TRUE(short_info_.GetExampleShortNumber(RegionCode::UN001()).empty()); 307 EXPECT_TRUE( 308 short_info_.GetExampleShortNumber(RegionCode::GetUnknown()).empty()); 309} 310 311TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_US) { 312 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::US())); 313 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("112", RegionCode::US())); 314 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("999", RegionCode::US())); 315} 316 317TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberLongNumber_US) { 318 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("9116666666", 319 RegionCode::US())); 320 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("1126666666", 321 RegionCode::US())); 322 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9996666666", 323 RegionCode::US())); 324} 325 326TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberWithFormatting_US) { 327 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("9-1-1", RegionCode::US())); 328 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("1-1-2", RegionCode::US())); 329 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9-9-9", 330 RegionCode::US())); 331} 332 333TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberWithPlusSign_US) { 334 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("+911", RegionCode::US())); 335 // This hex sequence is the full-width plus sign U+FF0B. 336 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("\xEF\xBC\x8B" "911", 337 RegionCode::US())); 338 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber(" +911", 339 RegionCode::US())); 340 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("+112", RegionCode::US())); 341 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("+999", RegionCode::US())); 342} 343 344TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_BR) { 345 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::BR())); 346 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("190", RegionCode::BR())); 347 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("999", RegionCode::BR())); 348} 349 350TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberLongNumber_BR) { 351 // Brazilian emergency numbers don't work when additional digits are appended. 352 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9111", RegionCode::BR())); 353 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("1900", RegionCode::BR())); 354 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9996", RegionCode::BR())); 355} 356 357TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_CL) { 358 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("131", RegionCode::CL())); 359 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("133", RegionCode::CL())); 360} 361 362TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberLongNumber_CL) { 363 // Chilean emergency numbers don't work when additional digits are appended. 364 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("1313", RegionCode::CL())); 365 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("1330", RegionCode::CL())); 366} 367 368TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_AO) { 369 // Angola doesn't have any metadata for emergency numbers in the test 370 // metadata. 371 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::AO())); 372 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("222123456", 373 RegionCode::AO())); 374 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("923123456", 375 RegionCode::AO())); 376} 377 378TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_ZW) { 379 // Zimbabwe doesn't have any metadata in the test metadata. 380 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::ZW())); 381 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("01312345", 382 RegionCode::ZW())); 383 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("0711234567", 384 RegionCode::ZW())); 385} 386 387TEST_F(ShortNumberInfoTest, IsEmergencyNumber_US) { 388 EXPECT_TRUE(short_info_.IsEmergencyNumber("911", RegionCode::US())); 389 EXPECT_TRUE(short_info_.IsEmergencyNumber("112", RegionCode::US())); 390 EXPECT_FALSE(short_info_.IsEmergencyNumber("999", RegionCode::US())); 391} 392 393TEST_F(ShortNumberInfoTest, IsEmergencyNumberLongNumber_US) { 394 EXPECT_FALSE(short_info_.IsEmergencyNumber("9116666666", RegionCode::US())); 395 EXPECT_FALSE(short_info_.IsEmergencyNumber("1126666666", RegionCode::US())); 396 EXPECT_FALSE(short_info_.IsEmergencyNumber("9996666666", RegionCode::US())); 397} 398 399TEST_F(ShortNumberInfoTest, IsEmergencyNumberWithFormatting_US) { 400 EXPECT_TRUE(short_info_.IsEmergencyNumber("9-1-1", RegionCode::US())); 401 EXPECT_TRUE(short_info_.IsEmergencyNumber("*911", RegionCode::US())); 402 EXPECT_TRUE(short_info_.IsEmergencyNumber("1-1-2", RegionCode::US())); 403 EXPECT_TRUE(short_info_.IsEmergencyNumber("*112", RegionCode::US())); 404 EXPECT_FALSE(short_info_.IsEmergencyNumber("9-9-9", RegionCode::US())); 405 EXPECT_FALSE(short_info_.IsEmergencyNumber("*999", RegionCode::US())); 406} 407 408TEST_F(ShortNumberInfoTest, IsEmergencyNumberWithPlusSign_US) { 409 EXPECT_FALSE(short_info_.IsEmergencyNumber("+911", RegionCode::US())); 410 // This hex sequence is the full-width plus sign U+FF0B. 411 EXPECT_FALSE(short_info_.IsEmergencyNumber("\xEF\xBC\x8B" "911", 412 RegionCode::US())); 413 EXPECT_FALSE(short_info_.IsEmergencyNumber(" +911", RegionCode::US())); 414 EXPECT_FALSE(short_info_.IsEmergencyNumber("+112", RegionCode::US())); 415 EXPECT_FALSE(short_info_.IsEmergencyNumber("+999", RegionCode::US())); 416} 417 418TEST_F(ShortNumberInfoTest, IsEmergencyNumber_BR) { 419 EXPECT_TRUE(short_info_.IsEmergencyNumber("911", RegionCode::BR())); 420 EXPECT_TRUE(short_info_.IsEmergencyNumber("190", RegionCode::BR())); 421 EXPECT_FALSE(short_info_.IsEmergencyNumber("999", RegionCode::BR())); 422} 423 424TEST_F(ShortNumberInfoTest, EmergencyNumberLongNumber_BR) { 425 EXPECT_FALSE(short_info_.IsEmergencyNumber("9111", RegionCode::BR())); 426 EXPECT_FALSE(short_info_.IsEmergencyNumber("1900", RegionCode::BR())); 427 EXPECT_FALSE(short_info_.IsEmergencyNumber("9996", RegionCode::BR())); 428} 429 430TEST_F(ShortNumberInfoTest, IsEmergencyNumber_AO) { 431 // Angola doesn't have any metadata for emergency numbers in the test 432 // metadata. 433 EXPECT_FALSE(short_info_.IsEmergencyNumber("911", RegionCode::AO())); 434 EXPECT_FALSE(short_info_.IsEmergencyNumber("222123456", RegionCode::AO())); 435 EXPECT_FALSE(short_info_.IsEmergencyNumber("923123456", RegionCode::AO())); 436} 437 438TEST_F(ShortNumberInfoTest, IsEmergencyNumber_ZW) { 439 // Zimbabwe doesn't have any metadata in the test metadata. 440 EXPECT_FALSE(short_info_.IsEmergencyNumber("911", RegionCode::ZW())); 441 EXPECT_FALSE(short_info_.IsEmergencyNumber("01312345", RegionCode::ZW())); 442 EXPECT_FALSE(short_info_.IsEmergencyNumber("0711234567", RegionCode::ZW())); 443} 444 445TEST_F(ShortNumberInfoTest, EmergencyNumberForSharedCountryCallingCode) { 446 // Test the emergency number 112, which is valid in both Australia and the 447 // Christmas Islands. 448 EXPECT_TRUE(short_info_.IsEmergencyNumber("112", RegionCode::AU())); 449 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion( 450 ParseNumberForTesting("112", RegionCode::AU()), RegionCode::AU())); 451 EXPECT_EQ( 452 ShortNumberInfo::TOLL_FREE, 453 short_info_.GetExpectedCostForRegion( 454 ParseNumberForTesting("112", RegionCode::AU()), RegionCode::AU())); 455 456 EXPECT_TRUE(short_info_.IsEmergencyNumber("112", RegionCode::CX())); 457 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion( 458 ParseNumberForTesting("112", RegionCode::CX()), RegionCode::CX())); 459 EXPECT_EQ( 460 ShortNumberInfo::TOLL_FREE, 461 short_info_.GetExpectedCostForRegion( 462 ParseNumberForTesting("112", RegionCode::CX()), RegionCode::CX())); 463 464 PhoneNumber shared_emergency_number; 465 shared_emergency_number.set_country_code(61); 466 shared_emergency_number.set_national_number(uint64{112}); 467 EXPECT_TRUE(short_info_.IsValidShortNumber(shared_emergency_number)); 468 EXPECT_EQ(ShortNumberInfo::TOLL_FREE, 469 short_info_.GetExpectedCost(shared_emergency_number)); 470} 471 472TEST_F(ShortNumberInfoTest, OverlappingNANPANumber) { 473 // 211 is an emergency number in Barbados, while it is a toll-free 474 // information line in Canada and the USA. 475 EXPECT_TRUE(short_info_.IsEmergencyNumber("211", RegionCode::BB())); 476 EXPECT_EQ( 477 ShortNumberInfo::TOLL_FREE, 478 short_info_.GetExpectedCostForRegion( 479 ParseNumberForTesting("211", RegionCode::BB()), RegionCode::BB())); 480 481 EXPECT_FALSE(short_info_.IsEmergencyNumber("211", RegionCode::US())); 482 EXPECT_EQ( 483 ShortNumberInfo::UNKNOWN_COST, 484 short_info_.GetExpectedCostForRegion( 485 ParseNumberForTesting("211", RegionCode::US()), RegionCode::US())); 486 487 EXPECT_FALSE(short_info_.IsEmergencyNumber("211", RegionCode::CA())); 488 EXPECT_EQ( 489 ShortNumberInfo::TOLL_FREE, 490 short_info_.GetExpectedCostForRegion( 491 ParseNumberForTesting("211", RegionCode::CA()), RegionCode::CA())); 492} 493 494TEST_F(ShortNumberInfoTest, CountryCallingCodeIsNotIgnored) { 495 // +46 is the country calling code for Sweden (SE), and 40404 is a valid short 496 // number in the US. 497 EXPECT_FALSE(short_info_.IsPossibleShortNumberForRegion( 498 ParseNumberForTesting("+4640404", RegionCode::SE()), RegionCode::US())); 499 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion( 500 ParseNumberForTesting("+4640404", RegionCode::SE()), RegionCode::US())); 501 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST, 502 short_info_.GetExpectedCostForRegion( 503 ParseNumberForTesting("+4640404", RegionCode::SE()), 504 RegionCode::US())); 505} 506 507} // namespace phonenumbers 508} // namespace i18n 509