diff options
Diffstat (limited to 'cpp/test/phonenumbers/geocoding/phonenumber_offline_geocoder_test.cc')
-rw-r--r-- | cpp/test/phonenumbers/geocoding/phonenumber_offline_geocoder_test.cc | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/cpp/test/phonenumbers/geocoding/phonenumber_offline_geocoder_test.cc b/cpp/test/phonenumbers/geocoding/phonenumber_offline_geocoder_test.cc new file mode 100644 index 0000000..fcb6b3f --- /dev/null +++ b/cpp/test/phonenumbers/geocoding/phonenumber_offline_geocoder_test.cc @@ -0,0 +1,204 @@ +// Copyright (C) 2012 The Libphonenumber Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Author: Patrick Mezard + +#include "phonenumbers/geocoding/phonenumber_offline_geocoder.h" + +#include <gtest/gtest.h> +#include <unicode/locid.h> + +#include "phonenumbers/geocoding/geocoding_test_data.h" +#include "phonenumbers/phonenumber.h" +#include "phonenumbers/phonenumber.pb.h" + +namespace i18n { +namespace phonenumbers { + +using icu::Locale; + +namespace { + +PhoneNumber MakeNumber(int32 country_code, uint64 national_number) { + PhoneNumber n; + n.set_country_code(country_code); + n.set_national_number(national_number); + return n; +} + +const Locale kEnglishLocale = Locale("en", "GB"); +const Locale kFrenchLocale = Locale("fr", "FR"); +const Locale kGermanLocale = Locale("de", "DE"); +const Locale kItalianLocale = Locale("it", "IT"); +const Locale kKoreanLocale = Locale("ko", "KR"); +const Locale kSimplifiedChineseLocale = Locale("zh", "CN"); + +} // namespace + +class PhoneNumberOfflineGeocoderTest : public testing::Test { + protected: + PhoneNumberOfflineGeocoderTest() : + KO_NUMBER1(MakeNumber(82, 22123456L)), + KO_NUMBER2(MakeNumber(82, 322123456L)), + KO_NUMBER3(MakeNumber(82, 6421234567L)), + KO_INVALID_NUMBER(MakeNumber(82, 1234L)), + US_NUMBER1(MakeNumber(1, 6502530000L)), + US_NUMBER2(MakeNumber(1, 6509600000L)), + US_NUMBER3(MakeNumber(1, 2128120000L)), + US_NUMBER4(MakeNumber(1, 6174240000L)), + US_INVALID_NUMBER(MakeNumber(1, 123456789L)), + BS_NUMBER1(MakeNumber(1, 2423651234L)), + AU_NUMBER(MakeNumber(61, 236618300L)), + NUMBER_WITH_INVALID_COUNTRY_CODE(MakeNumber(999, 2423651234L)), + INTERNATIONAL_TOLL_FREE(MakeNumber(800, 12345678L)) { + } + + virtual void SetUp() { + geocoder_.reset( + new PhoneNumberOfflineGeocoder( + get_test_country_calling_codes(), + get_test_country_calling_codes_size(), + get_test_country_languages, + get_test_prefix_language_code_pairs(), + get_test_prefix_language_code_pairs_size(), + get_test_prefix_descriptions)); + } + + protected: + scoped_ptr<PhoneNumberOfflineGeocoder> geocoder_; + + const PhoneNumber KO_NUMBER1; + const PhoneNumber KO_NUMBER2; + const PhoneNumber KO_NUMBER3; + const PhoneNumber KO_INVALID_NUMBER; + + const PhoneNumber US_NUMBER1; + const PhoneNumber US_NUMBER2; + const PhoneNumber US_NUMBER3; + const PhoneNumber US_NUMBER4; + const PhoneNumber US_INVALID_NUMBER; + + const PhoneNumber BS_NUMBER1; + const PhoneNumber AU_NUMBER; + const PhoneNumber NUMBER_WITH_INVALID_COUNTRY_CODE; + const PhoneNumber INTERNATIONAL_TOLL_FREE; +}; + +TEST_F(PhoneNumberOfflineGeocoderTest, + TestGetDescriptionForNumberWithNoDataFile) { + // No data file containing mappings for US numbers is available in Chinese for + // the unittests. As a result, the country name of United States in simplified + // Chinese is returned. + + // "\u7F8E\u56FD" (unicode escape sequences are not always supported) + EXPECT_EQ("\xe7""\xbe""\x8e""\xe5""\x9b""\xbd", + geocoder_->GetDescriptionForNumber(US_NUMBER1, + kSimplifiedChineseLocale)); + EXPECT_EQ("Bahamas", + geocoder_->GetDescriptionForNumber(BS_NUMBER1, Locale("en", "US"))); + EXPECT_EQ("Australia", + geocoder_->GetDescriptionForNumber(AU_NUMBER, Locale("en", "US"))); + EXPECT_EQ("", + geocoder_->GetDescriptionForNumber(NUMBER_WITH_INVALID_COUNTRY_CODE, + Locale("en", "US"))); + EXPECT_EQ("", + geocoder_->GetDescriptionForNumber(INTERNATIONAL_TOLL_FREE, + Locale("en", "US"))); +} + +TEST_F(PhoneNumberOfflineGeocoderTest, + TestGetDescriptionForNumberWithMissingPrefix) { + // Test that the name of the country is returned when the number passed in is + // valid but not covered by the geocoding data file. + EXPECT_EQ("United States", + geocoder_->GetDescriptionForNumber(US_NUMBER4, Locale("en", "US"))); +} + +TEST_F(PhoneNumberOfflineGeocoderTest, TestGetDescriptionForNumber_en_US) { + EXPECT_EQ("CA", + geocoder_->GetDescriptionForNumber(US_NUMBER1, Locale("en", "US"))); + EXPECT_EQ("Mountain View, CA", + geocoder_->GetDescriptionForNumber(US_NUMBER2, Locale("en", "US"))); + EXPECT_EQ("New York, NY", + geocoder_->GetDescriptionForNumber(US_NUMBER3, Locale("en", "US"))); +} + +TEST_F(PhoneNumberOfflineGeocoderTest, TestGetDescriptionForKoreanNumber) { + EXPECT_EQ("Seoul", + geocoder_->GetDescriptionForNumber(KO_NUMBER1, kEnglishLocale)); + EXPECT_EQ("Incheon", + geocoder_->GetDescriptionForNumber(KO_NUMBER2, kEnglishLocale)); + EXPECT_EQ("Jeju", + geocoder_->GetDescriptionForNumber(KO_NUMBER3, kEnglishLocale)); + // "\uC11C\uC6B8" + EXPECT_EQ("\xec""\x84""\x9c""\xec""\x9a""\xb8", + geocoder_->GetDescriptionForNumber(KO_NUMBER1, kKoreanLocale)); + // "\uC778\uCC9C" + EXPECT_EQ("\xec""\x9d""\xb8""\xec""\xb2""\x9c", + geocoder_->GetDescriptionForNumber(KO_NUMBER2, kKoreanLocale)); +} + +TEST_F(PhoneNumberOfflineGeocoderTest, TestGetDescriptionForFallBack) { + // No fallback, as the location name for the given phone number is available + // in the requested language. + EXPECT_EQ("Kalifornien", + geocoder_->GetDescriptionForNumber(US_NUMBER1, kGermanLocale)); + // German falls back to English. + EXPECT_EQ("New York, NY", + geocoder_->GetDescriptionForNumber(US_NUMBER3, kGermanLocale)); + // Italian falls back to English. + EXPECT_EQ("CA", + geocoder_->GetDescriptionForNumber(US_NUMBER1, kItalianLocale)); + // Korean doesn't fall back to English. + // "\uB300\uD55C\uBBFC\uAD6D" + EXPECT_EQ("\xeb""\x8c""\x80""\xed""\x95""\x9c""\xeb""\xaf""\xbc""\xea""\xb5" + "\xad", + geocoder_->GetDescriptionForNumber(KO_NUMBER3, kKoreanLocale)); +} + +TEST_F(PhoneNumberOfflineGeocoderTest, + TestGetDescriptionForNumberWithUserRegion) { + // User in Italy, American number. We should just show United States, in + // Spanish, and not more detailed information. + EXPECT_EQ("Estados Unidos", + geocoder_->GetDescriptionForNumber(US_NUMBER1, Locale("es", "ES"), + "IT")); + // Unknown region - should just show country name. + EXPECT_EQ("Estados Unidos", + geocoder_->GetDescriptionForNumber(US_NUMBER1, Locale("es", "ES"), + "ZZ")); + // User in the States, language German, should show detailed data. + EXPECT_EQ("Kalifornien", + geocoder_->GetDescriptionForNumber(US_NUMBER1, kGermanLocale, + "US")); + // User in the States, language French, no data for French, so we fallback to + // English detailed data. + EXPECT_EQ("CA", + geocoder_->GetDescriptionForNumber(US_NUMBER1, kFrenchLocale, + "US")); + // Invalid number - return an empty string. + EXPECT_EQ("", + geocoder_->GetDescriptionForNumber(US_INVALID_NUMBER, + kEnglishLocale, "US")); +} + +TEST_F(PhoneNumberOfflineGeocoderTest, TestGetDescriptionForInvalidNumber) { + EXPECT_EQ("", geocoder_->GetDescriptionForNumber(KO_INVALID_NUMBER, + kEnglishLocale)); + EXPECT_EQ("", geocoder_->GetDescriptionForNumber(US_INVALID_NUMBER, + kEnglishLocale)); +} + +} // namespace phonenumbers +} // namespace i18n |