@@ -1,9 +1,9 @@
use protobuf ::{ Message , MessageField } ;
use crate ::{
enums ::{ PhoneNumberFormat , PhoneNumberType , Valid NumberLenType} ,
errors ::{ ParseError , ValidationResult Err } ,
phonemetadata ::{ PhoneMetadata , PhoneMetadataCollection , PhoneNumberDesc } ,
enums ::{ PhoneNumberFormat , PhoneNumberType , NumberLength Type } ,
errors ::{ ParseError , ValidationErro r } ,
phonemetadata ::{ NumberFormat , PhoneMetadata, PhoneMetadataCollection , PhoneNumberDesc } ,
phonenumber ::{ phone_number ::CountryCodeSource , PhoneNumber } ,
PhoneNumberUtil ,
} ;
@@ -679,6 +679,261 @@ fn format_with_preferred_carrier_code() {
assert_eq! ( " 424 123 1234 " , formatted ) ;
}
#[ test ]
fn format_number_for_mobile_dialing ( ) {
let phone_util = get_phone_util ( ) ;
let mut test_number = PhoneNumber ::new ( ) ;
// Номера обычно набираются в национальном формате внутри страны и
// в международном формате из-за пределов страны.
test_number . set_country_code ( 57 ) ;
test_number . set_national_number ( 6012345678 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " CO " , false ) . unwrap ( ) ;
assert_eq! ( " 6012345678 " , formatted_number ) ;
test_number . set_country_code ( 49 ) ;
test_number . set_national_number ( 30123456 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " DE " , false ) . unwrap ( ) ;
assert_eq! ( " 030123456 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " CH " , false ) . unwrap ( ) ;
assert_eq! ( " +4930123456 " , formatted_number ) ;
test_number . set_extension ( " 1234 " . to_string ( ) ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " DE " , false ) . unwrap ( ) ;
assert_eq! ( " 030123456 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " CH " , false ) . unwrap ( ) ;
assert_eq! ( " +4930123456 " , formatted_number ) ;
test_number . set_country_code ( 1 ) ;
test_number . clear_extension ( ) ;
// Бесплатные номера США помечены как noInternationalDialing в тестовых метаданных
// для целей тестирования. Для таких номеров мы ожидаем, что ничего не будет
// возвращено, если код региона не совпадает.
test_number . set_national_number ( 8002530000 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " US " , true ) . unwrap ( ) ;
assert_eq! ( " 800 253 0000 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " CN " , true ) . unwrap ( ) ;
assert_eq! ( " " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " US " , false ) . unwrap ( ) ;
assert_eq! ( " 8002530000 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " CN " , false ) . unwrap ( ) ;
assert_eq! ( " " , formatted_number ) ;
test_number . set_national_number ( 6502530000 ) ;
let formatted_number = phone_util
. format_number_for_mobile_dialing ( & test_number , " US " , true )
. unwrap ( ) ;
assert_eq! ( " +1 650 253 0000 " , formatted_number ) ;
let formatted_number = phone_util
. format_number_for_mobile_dialing ( & test_number , " US " , false )
. unwrap ( ) ;
assert_eq! ( " +16502530000 " , formatted_number ) ;
test_number . set_extension ( " 1234 " . to_string ( ) ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " US " , true ) . unwrap ( ) ;
assert_eq! ( " +1 650 253 0000 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " US " , false ) . unwrap ( ) ;
assert_eq! ( " +16502530000 " , formatted_number ) ;
// Невалидный номер США, который на одну цифру длиннее.
test_number . clear_extension ( ) ;
test_number . set_national_number ( 65025300001 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " US " , true ) . unwrap ( ) ;
assert_eq! ( " +1 65025300001 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " US " , false ) . unwrap ( ) ;
assert_eq! ( " +165025300001 " , formatted_number ) ;
// Номера с о звёздочкой. В реальности они есть в Израиле, но в наших
// тестовых метаданных они есть для Японии (JP).
test_number . set_country_code ( 81 ) ;
test_number . set_national_number ( 2345 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " JP " , true ) . unwrap ( ) ;
assert_eq! ( " *2345 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " JP " , false ) . unwrap ( ) ;
assert_eq! ( " *2345 " , formatted_number ) ;
test_number . set_country_code ( 800 ) ;
test_number . set_national_number ( 12345678 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " JP " , false ) . unwrap ( ) ;
assert_eq! ( " +80012345678 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " JP " , true ) . unwrap ( ) ;
assert_eq! ( " +800 1234 5678 " , formatted_number ) ;
// Номера ОАЭ, начинающиеся с 600 (классифицируются как UAN), должны набираться
// без +971 на местном уровне.
test_number . set_country_code ( 971 ) ;
test_number . set_national_number ( 600123456 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " JP " , false ) . unwrap ( ) ;
assert_eq! ( " +971600123456 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " AE " , true ) . unwrap ( ) ;
assert_eq! ( " 600123456 " , formatted_number ) ;
test_number . set_country_code ( 52 ) ;
test_number . set_national_number ( 3312345678 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " MX " , false ) . unwrap ( ) ;
assert_eq! ( " +523312345678 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " US " , false ) . unwrap ( ) ;
assert_eq! ( " +523312345678 " , formatted_number ) ;
// Проверяем, что узбекские номера возвращаются в международном формате, даже
// если набираются из того же региона или других регионов.
// Стационарный номер
test_number . set_country_code ( 998 ) ;
test_number . set_national_number ( 612201234 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " UZ " , false ) . unwrap ( ) ;
assert_eq! ( " +998612201234 " , formatted_number ) ;
// Мобильный номер
test_number . set_national_number ( 950123456 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " UZ " , false ) . unwrap ( ) ;
assert_eq! ( " +998950123456 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " US " , false ) . unwrap ( ) ;
assert_eq! ( " +998950123456 " , formatted_number ) ;
// Негеографические номера всегда должны набираться в международном формате.
test_number . set_country_code ( 800 ) ;
test_number . set_national_number ( 12345678 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " US " , false ) . unwrap ( ) ;
assert_eq! ( " +80012345678 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " 001 " , false ) . unwrap ( ) ;
assert_eq! ( " +80012345678 " , formatted_number ) ;
// Тестируем, что короткий номер форматируется корректно для мобильного набора
// внутри региона и не может быть набран из-за е г о пределов.
test_number . set_country_code ( 49 ) ;
test_number . set_national_number ( 123 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " DE " , false ) . unwrap ( ) ;
assert_eq! ( " 123 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " IT " , false ) . unwrap ( ) ;
assert_eq! ( " " , formatted_number ) ;
// Тестируем специальную логику для стран NANPA, где номера обычной длины
// всегда выводятся в международном формате, а короткие — в национальном.
test_number . set_country_code ( 1 ) ;
test_number . set_national_number ( 6502530000 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " US " , false ) . unwrap ( ) ;
assert_eq! ( " +16502530000 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " CA " , false ) . unwrap ( ) ;
assert_eq! ( " +16502530000 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " BR " , false ) . unwrap ( ) ;
assert_eq! ( " +16502530000 " , formatted_number ) ;
test_number . set_national_number ( 911 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " US " , false ) . unwrap ( ) ;
assert_eq! ( " 911 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " CA " , false ) . unwrap ( ) ;
assert_eq! ( " " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " BR " , false ) . unwrap ( ) ;
assert_eq! ( " " , formatted_number ) ;
// Тестируем, что австралийский номер экстренной службы 000 форматируется корректно.
test_number . set_country_code ( 61 ) ;
test_number . set_national_number ( 0 ) ;
test_number . set_italian_leading_zero ( true ) ;
test_number . set_number_of_leading_zeros ( 2 ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " AU " , false ) . unwrap ( ) ;
assert_eq! ( " 000 " , formatted_number ) ;
let formatted_number = phone_util . format_number_for_mobile_dialing ( & test_number , " NZ " , false ) . unwrap ( ) ;
assert_eq! ( " " , formatted_number ) ;
}
#[ test ]
fn format_by_pattern ( ) {
let phone_util = get_phone_util ( ) ;
let mut test_number = PhoneNumber ::new ( ) ;
let mut number_format = NumberFormat ::new ( ) ;
test_number . set_country_code ( 1 ) ;
test_number . set_national_number ( 6502530000 ) ;
number_format . set_pattern ( " ( \\ d{3})( \\ d{3})( \\ d{4}) " . to_string ( ) ) ;
number_format . set_format ( " ($1) $2-$3 " . to_string ( ) ) ;
let number_formats = vec! [ number_format . clone ( ) ] ;
let formatted_number = phone_util
. format_by_pattern ( & test_number , PhoneNumberFormat ::National , & number_formats )
. unwrap ( ) ;
assert_eq! ( " (650) 253-0000 " , formatted_number ) ;
let formatted_number = phone_util
. format_by_pattern ( & test_number , PhoneNumberFormat ::International , & number_formats )
. unwrap ( ) ;
assert_eq! ( " +1 (650) 253-0000 " , formatted_number ) ;
let formatted_number = phone_util
. format_by_pattern ( & test_number , PhoneNumberFormat ::RFC3966 , & number_formats )
. unwrap ( ) ;
assert_eq! ( " tel:+1-650-253-0000 " , formatted_number ) ;
// $NP устанавливается в '1' для США. Здесь мы проверяем, что для других стран
// NANPA (Североамериканский план нумерации) правила США соблюдаются.
number_format . set_national_prefix_formatting_rule ( " $NP ($FG) " . to_string ( ) ) ;
number_format . set_format ( " $1 $2-$3 " . to_string ( ) ) ;
let number_formats = vec! [ number_format . clone ( ) ] ;
test_number . set_country_code ( 1 ) ;
test_number . set_national_number ( 4168819999 ) ;
let formatted_number = phone_util
. format_by_pattern ( & test_number , PhoneNumberFormat ::National , & number_formats )
. unwrap ( ) ;
assert_eq! ( " 1 (416) 881-9999 " , formatted_number ) ;
let formatted_number = phone_util
. format_by_pattern ( & test_number , PhoneNumberFormat ::International , & number_formats )
. unwrap ( ) ;
assert_eq! ( " +1 416 881-9999 " , formatted_number ) ;
test_number . set_country_code ( 39 ) ;
test_number . set_national_number ( 236618300 ) ;
test_number . set_italian_leading_zero ( true ) ;
number_format . set_pattern ( " ( \\ d{2})( \\ d{5})( \\ d{3}) " . to_string ( ) ) ;
number_format . set_format ( " $1-$2 $3 " . to_string ( ) ) ;
number_format . clear_national_prefix_formatting_rule ( ) ;
let number_formats = vec! [ number_format . clone ( ) ] ;
let formatted_number = phone_util
. format_by_pattern ( & test_number , PhoneNumberFormat ::National , & number_formats )
. unwrap ( ) ;
assert_eq! ( " 02-36618 300 " , formatted_number ) ;
let formatted_number = phone_util
. format_by_pattern ( & test_number , PhoneNumberFormat ::International , & number_formats )
. unwrap ( ) ;
assert_eq! ( " +39 02-36618 300 " , formatted_number ) ;
test_number . set_country_code ( 44 ) ;
test_number . set_national_number ( 2012345678 ) ;
test_number . set_italian_leading_zero ( false ) ;
number_format . set_national_prefix_formatting_rule ( " $NP$FG " . to_string ( ) ) ;
number_format . set_pattern ( " ( \\ d{2})( \\ d{4})( \\ d{4}) " . to_string ( ) ) ;
number_format . set_format ( " $1 $2 $3 " . to_string ( ) ) ;
let mut number_formats = vec! [ number_format ] ; // mutable vec to modify the element inside
let formatted_number = phone_util
. format_by_pattern ( & test_number , PhoneNumberFormat ::National , & number_formats )
. unwrap ( ) ;
assert_eq! ( " 020 1234 5678 " , formatted_number ) ;
number_formats [ 0 ] . set_national_prefix_formatting_rule ( " ($NP$FG) " . to_string ( ) ) ;
let formatted_number = phone_util
. format_by_pattern ( & test_number , PhoneNumberFormat ::National , & number_formats )
. unwrap ( ) ;
assert_eq! ( " (020) 1234 5678 " , formatted_number ) ;
number_formats [ 0 ] . clear_national_prefix_formatting_rule ( ) ;
let formatted_number = phone_util
. format_by_pattern ( & test_number , PhoneNumberFormat ::National , & number_formats )
. unwrap ( ) ;
assert_eq! ( " 20 1234 5678 " , formatted_number ) ;
let formatted_number = phone_util
. format_by_pattern ( & test_number , PhoneNumberFormat ::International , & number_formats )
. unwrap ( ) ;
assert_eq! ( " +44 20 1234 5678 " , formatted_number ) ;
}
#[ test ]
fn format_in_original_format ( ) {
let phone_util = get_phone_util ( ) ;
@@ -1047,6 +1302,221 @@ fn format_number_with_extension() {
assert_eq! ( " 650 253 0000 extn. 4567 " , phone_util . format ( & us_number_with_extension , PhoneNumberFormat ::National ) . unwrap ( ) ) ;
}
#[ test ]
fn get_length_of_geographical_area_code ( ) {
let phone_util = get_phone_util ( ) ;
let mut number = PhoneNumber ::new ( ) ;
// Google MTV, с кодом города "650".
number . set_country_code ( 1 ) ;
number . set_national_number ( 6502530000 ) ;
assert_eq! ( 3 , phone_util . get_length_of_geographical_area_code ( & number ) . unwrap ( ) ) ;
// Бесплатный номер в Северной Америке, без кода города.
number . set_country_code ( 1 ) ;
number . set_national_number ( 8002530000 ) ;
assert_eq! ( 0 , phone_util . get_length_of_geographical_area_code ( & number ) . unwrap ( ) ) ;
// Невалидный номер США (на 1 цифру короче), без кода города.
number . set_country_code ( 1 ) ;
number . set_national_number ( 650253000 ) ;
assert_eq! ( 0 , phone_util . get_length_of_geographical_area_code ( & number ) . unwrap ( ) ) ;
// Google London, с кодом города "20".
number . set_country_code ( 44 ) ;
number . set_national_number ( 2070313000 ) ;
assert_eq! ( 2 , phone_util . get_length_of_geographical_area_code ( & number ) . unwrap ( ) ) ;
// Мобильный номер в Великобритании не имеет кода города.
number . set_country_code ( 44 ) ;
number . set_national_number ( 7912345678 ) ;
assert_eq! ( 0 , phone_util . get_length_of_geographical_area_code ( & number ) . unwrap ( ) ) ;
// Google Buenos Aires, с кодом города "11".
number . set_country_code ( 54 ) ;
number . set_national_number ( 1155303000 ) ;
assert_eq! ( 2 , phone_util . get_length_of_geographical_area_code ( & number ) . unwrap ( ) ) ;
// Мобильный номер в Аргентине также имеет код города.
number . set_country_code ( 54 ) ;
number . set_national_number ( 91187654321 ) ;
assert_eq! ( 3 , phone_util . get_length_of_geographical_area_code ( & number ) . unwrap ( ) ) ;
// Google Sydney, с кодом города "2".
number . set_country_code ( 61 ) ;
number . set_national_number ( 293744000 ) ;
assert_eq! ( 1 , phone_util . get_length_of_geographical_area_code ( & number ) . unwrap ( ) ) ;
// Номера Мексики - нет национального префикса, но есть код города.
number . set_country_code ( 52 ) ;
number . set_national_number ( 3312345678 ) ;
assert_eq! ( 2 , phone_util . get_length_of_geographical_area_code ( & number ) . unwrap ( ) ) ;
// Итальянские номера - нет национального префикса, но есть код города.
number . set_country_code ( 39 ) ;
number . set_national_number ( 236618300 ) ;
number . set_italian_leading_zero ( true ) ;
assert_eq! ( 2 , phone_util . get_length_of_geographical_area_code ( & number ) . unwrap ( ) ) ;
// Google Singapore. В Сингапуре нет кода города и национального префикса.
number . set_country_code ( 65 ) ;
number . set_national_number ( 65218000 ) ;
number . set_italian_leading_zero ( false ) ;
assert_eq! ( 0 , phone_util . get_length_of_geographical_area_code ( & number ) . unwrap ( ) ) ;
// Международный бесплатный номер, без кода города.
number . set_country_code ( 800 ) ;
number . set_national_number ( 12345678 ) ;
assert_eq! ( 0 , phone_util . get_length_of_geographical_area_code ( & number ) . unwrap ( ) ) ;
// Мобильный номер из Китая является географическим, но не имеет кода города.
let mut cn_mobile = PhoneNumber ::new ( ) ;
cn_mobile . set_country_code ( 86 ) ;
cn_mobile . set_national_number ( 18912341234 ) ;
assert_eq! ( 0 , phone_util . get_length_of_geographical_area_code ( & cn_mobile ) . unwrap ( ) ) ;
}
#[ test ]
fn get_length_of_national_destination_code ( ) {
let phone_util = get_phone_util ( ) ;
let mut number = PhoneNumber ::new ( ) ;
// Google MTV, с национальным кодом назначения (NDC) "650".
number . set_country_code ( 1 ) ;
number . set_national_number ( 6502530000 ) ;
assert_eq! ( 3 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Бесплатный номер Северной Америки, с NDC "800".
number . set_country_code ( 1 ) ;
number . set_national_number ( 8002530000 ) ;
assert_eq! ( 3 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Google London, с NDC "20".
number . set_country_code ( 44 ) ;
number . set_national_number ( 2070313000 ) ;
assert_eq! ( 2 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Мобильный телефон в Великобритании, с NDC "7912".
number . set_country_code ( 44 ) ;
number . set_national_number ( 7912345678 ) ;
assert_eq! ( 4 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Google Buenos Aires, с NDC "11".
number . set_country_code ( 54 ) ;
number . set_national_number ( 1155303000 ) ;
assert_eq! ( 2 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Аргентинский мобильный, с NDC "911".
number . set_country_code ( 54 ) ;
number . set_national_number ( 91187654321 ) ;
assert_eq! ( 3 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Google Sydney, с NDC "2".
number . set_country_code ( 61 ) ;
number . set_national_number ( 293744000 ) ;
assert_eq! ( 1 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Google Singapore. Сингапур имеет NDC "6521".
number . set_country_code ( 65 ) ;
number . set_national_number ( 65218000 ) ;
assert_eq! ( 4 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Невалидный номер США (на 1 цифру короче), без NDC.
number . set_country_code ( 1 ) ;
number . set_national_number ( 650253000 ) ;
assert_eq! ( 0 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Номер с невалидным кодом страны, не должен иметь NDC.
number . set_country_code ( 123 ) ;
number . set_national_number ( 650253000 ) ;
assert_eq! ( 0 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Номер, который имеет только одну группу цифр после кода страны при
// форматировании в международном формате.
number . set_country_code ( 376 ) ;
number . set_national_number ( 12345 ) ;
assert_eq! ( 0 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Тот же номер, но с добавочным.
number . set_extension ( " 321 " . to_string ( ) ) ;
assert_eq! ( 0 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Международный бесплатный номер, с NDC "1234".
number = PhoneNumber ::new ( ) ;
number . set_country_code ( 800 ) ;
number . set_national_number ( 12345678 ) ;
assert_eq! ( 4 , phone_util . get_length_of_national_destination_code ( & number ) . unwrap ( ) ) ;
// Мобильный номер из Китая является географическим, но не имеет кода города,
// однако у него может быть национальный код назначения.
let mut cn_mobile = PhoneNumber ::new ( ) ;
cn_mobile . set_country_code ( 86 ) ;
cn_mobile . set_national_number ( 18912341234 ) ;
assert_eq! ( 3 , phone_util . get_length_of_national_destination_code ( & cn_mobile ) . unwrap ( ) ) ;
}
#[ test ]
fn extract_possible_number ( ) {
let phone_util = get_phone_util ( ) ;
// Удаляет предшествующие знаки препинания и буквы, но оставляет остальное без изменений.
let extracted_number = phone_util
. extract_possible_number ( " Tel:0800-345-600 " )
. unwrap ( ) ;
assert_eq! ( " 0800-345-600 " , extracted_number ) ;
let extracted_number = phone_util
. extract_possible_number ( " Tel:0800 FOR PIZZA " )
. unwrap ( ) ;
assert_eq! ( " 0800 FOR PIZZA " , extracted_number ) ;
// Н е должен удалять знак плюса.
let extracted_number = phone_util
. extract_possible_number ( " Tel:+800-345-600 " )
. unwrap ( ) ;
assert_eq! ( " +800-345-600 " , extracted_number ) ;
// Должен распознавать широкие цифры как возможные начальные значения.
let extracted_number = phone_util
. extract_possible_number ( " \u{FF10} \u{FF12} \u{FF13} " )
. unwrap ( ) ; // "0 2 3 "
assert_eq! ( " \u{FF10} \u{FF12} \u{FF13} " , extracted_number ) ;
// Дефисы не являются возможными начальными значениями и должны быть удалены.
let extracted_number = phone_util .
extract_possible_number ( " Num- \u{FF11} \u{FF12} \u{FF13} " )
. unwrap ( ) ; // "Num-1 2 3 "
assert_eq! ( " \u{FF11} \u{FF12} \u{FF13} " , extracted_number ) ;
// Если возможный номер отсутствует, возвращается пустая строка.
let extracted_number = phone_util
. extract_possible_number ( " Num-.... " ) ;
assert! ( extracted_number . is_err ( ) ) ;
// Ведущие скобки удаляются - они не используются при парсинге.
let extracted_number = phone_util
. extract_possible_number ( " (650) 253-0000 " )
. unwrap ( ) ;
assert_eq! ( " 650) 253-0000 " , extracted_number ) ;
// Конечные не-буквенно-цифровые символы должны быть удалены.
let extracted_number = phone_util
. extract_possible_number ( " (650) 253-0000..- .. " )
. unwrap ( ) ;
assert_eq! ( " 650) 253-0000 " , extracted_number ) ;
let extracted_number = phone_util
. extract_possible_number ( " (650) 253-0000. " )
. unwrap ( ) ;
assert_eq! ( " 650) 253-0000 " , extracted_number ) ;
// Этот случай имеет конечный символ RTL.
let extracted_number = phone_util
. extract_possible_number ( " (650) 253-0000 \u{200F} " )
. unwrap ( ) ; // "(650) 253-0000 "
assert_eq! ( " 650) 253-0000 " , extracted_number ) ;
}
#[ test ]
fn is_valid_number ( ) {
let phone_util = get_phone_util ( ) ;
@@ -1232,6 +1702,106 @@ fn is_possible_number() {
assert! ( phone_util . is_possible_number_for_string ( " +800 1234 5678 " , RegionCode ::un001 ( ) ) ) ;
}
#[ test ]
fn is_possible_number_for_type_different_type_lengths ( ) {
let phone_util = get_phone_util ( ) ;
// Мы используем аргентинские номера, так как у них разная возможная длина для
// разных типов.
let mut number = PhoneNumber ::new ( ) ;
number . set_country_code ( 54 ) ;
number . set_national_number ( 12345 ) ;
// Слишком короткий для любого аргентинского номера, включая стационарный.
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::FixedLine ) ) ;
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Unknown ) ) ;
// 6-значные номера подходят для стационарных телефонов.
number . set_national_number ( 123456 ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Unknown ) ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::FixedLine ) ) ;
// Н о слишком короткие для мобильных.
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Mobile ) ) ;
// И слишком короткие для бесплатных номеров.
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::TollFree ) ) ;
// Т о же самое относится к 9-значным номерам.
number . set_national_number ( 123456789 ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Unknown ) ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::FixedLine ) ) ;
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Mobile ) ) ;
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::TollFree ) ) ;
// 10-значные номера возможны для всех типов.
number . set_national_number ( 1234567890 ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Unknown ) ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::FixedLine ) ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Mobile ) ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::TollFree ) ) ;
// 11-значные номера возможны только для мобильных номеров. Обратите внимание, что мы не
// требуем ведущую 9, с которой начинаются все мобильные номера и которая
// была бы необходима для действительного мобильного номера.
number . set_national_number ( 12345678901 ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Unknown ) ) ;
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::FixedLine ) ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Mobile ) ) ;
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::TollFree ) ) ;
}
#[ test ]
fn is_possible_number_for_type_local_only ( ) {
let phone_util = get_phone_util ( ) ;
let mut number = PhoneNumber ::new ( ) ;
// Здесь мы тестируем длину номера, которая соответствует длине только для местных номеров.
number . set_country_code ( 49 ) ;
number . set_national_number ( 12 ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Unknown ) ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::FixedLine ) ) ;
// Мобильные номера должны состоять из 10 или 11 цифр, и для них нет длин,
// предназначенных только для местных номеров.
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Mobile ) ) ;
}
#[ test ]
fn is_possible_number_for_type_data_missing_for_size_reasons ( ) {
let phone_util = get_phone_util ( ) ;
let mut number = PhoneNumber ::new ( ) ;
// Здесь мы тестируем случай, когда возможные длины соответствуют возможным
// длинам страны в целом и, следовательно, отсутствуют в бинарных данных
// по соображениям размера - это все равно должно работать.
// Номер только для местного использования.
number . set_country_code ( 55 ) ;
number . set_national_number ( 12345678 ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Unknown ) ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::FixedLine ) ) ;
number . set_national_number ( 1234567890 ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Unknown ) ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::FixedLine ) ) ;
}
#[ test ]
fn is_possible_number_for_type_number_type_not_supported_for_region ( ) {
let phone_util = get_phone_util ( ) ;
let mut number = PhoneNumber ::new ( ) ;
// Для этого региона вообще нет мобильных номеров, поэтому мы возвращаем false.
number . set_country_code ( 55 ) ;
number . set_national_number ( 12345678 ) ;
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Mobile ) ) ;
// Однако это соответствует длине стационарного номера.
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::FixedLine ) ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::FixedLineOrMobile ) ) ;
// Для этого кода страны вообще нет ни стационарных, ни мобильных номеров,
// поэтому мы возвращаем false для них.
number . set_country_code ( 979 ) ;
number . set_national_number ( 123456789 ) ;
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::Mobile ) ) ;
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::FixedLine ) ) ;
assert! ( ! phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::FixedLineOrMobile ) ) ;
assert! ( phone_util . is_possible_number_for_type ( & number , PhoneNumberType ::PremiumRate ) ) ;
}
#[ test ]
fn is_not_possible_number ( ) {
let phone_util = get_phone_util ( ) ;
@@ -1270,36 +1840,36 @@ fn is_possible_number_with_reason() {
number . set_country_code ( 1 ) ;
number . set_national_number ( 6502530000 ) ;
assert_eq! ( Ok ( Valid NumberLenType ::IsPossible ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
assert_eq! ( Ok ( NumberLength Type ::IsPossible ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
number . set_national_number ( 2530000 ) ;
assert_eq! ( Ok ( Valid NumberLenType ::IsPossibleLocalOnly ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
assert_eq! ( Ok ( NumberLength Type ::IsPossibleLocalOnly ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
number . set_country_code ( 0 ) ;
assert_eq! ( Err ( ValidationResult Err ::InvalidCountryCode ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
assert_eq! ( Err ( ValidationErro r ::InvalidCountryCode ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
number . set_country_code ( 1 ) ;
number . set_national_number ( 253000 ) ;
assert_eq! ( Err ( ValidationResult Err ::TooShort ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
assert_eq! ( Err ( ValidationErro r ::TooShort ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
number . set_national_number ( 65025300000 ) ;
assert_eq! ( Err ( ValidationResult Err ::TooLong ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
assert_eq! ( Err ( ValidationErro r ::TooLong ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
number . set_country_code ( 44 ) ;
number . set_national_number ( 2070310000 ) ;
assert_eq! ( Ok ( Valid NumberLenType ::IsPossible ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
assert_eq! ( Ok ( NumberLength Type ::IsPossible ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
number . set_country_code ( 49 ) ;
number . set_national_number ( 30123456 ) ;
assert_eq! ( Ok ( Valid NumberLenType ::IsPossible ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
assert_eq! ( Ok ( NumberLength Type ::IsPossible ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
number . set_country_code ( 65 ) ;
number . set_national_number ( 1234567890 ) ;
assert_eq! ( Ok ( Valid NumberLenType ::IsPossible ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
assert_eq! ( Ok ( NumberLength Type ::IsPossible ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
number . set_country_code ( 800 ) ;
number . set_national_number ( 123456789 ) ;
assert_eq! ( Err ( ValidationResult Err ::TooLong ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
assert_eq! ( Err ( ValidationErro r ::TooLong ) , phone_util . is_possible_number_with_reason ( & number ) ) ;
}
#[ test ]
@@ -1309,33 +1879,170 @@ fn is_possible_number_for_type_with_reason() {
ar_number . set_country_code ( 54 ) ;
ar_number . set_national_number ( 12345 ) ;
assert_eq! ( Err ( ValidationResult Err ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Err ( ValidationResult Err ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Err ( ValidationErro r ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Err ( ValidationErro r ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::FixedLine ) ) ;
ar_number . set_national_number ( 123456 ) ;
assert_eq! ( Ok ( Valid NumberLenType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Ok ( Valid NumberLenType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Err ( ValidationResult Err ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Err ( ValidationResult Err ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::TollFree ) ) ;
assert_eq! ( Ok ( NumberLength Type ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Ok ( NumberLength Type ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Err ( ValidationErro r ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Err ( ValidationErro r ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::TollFree ) ) ;
ar_number . set_national_number ( 12345678901 ) ;
assert_eq! ( Ok ( Valid NumberLenType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Err ( ValidationResult Err ::TooLong ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Ok ( Valid NumberLenType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Err ( ValidationResult Err ::TooLong ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::TollFree ) ) ;
assert_eq! ( Ok ( NumberLength Type ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Err ( ValidationErro r ::TooLong ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Ok ( NumberLength Type ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Err ( ValidationErro r ::TooLong ) , phone_util . is_possible_number_for_type_with_reason ( & ar_number , PhoneNumberType ::TollFree ) ) ;
let mut de_number = PhoneNumber ::new ( ) ;
de_number . set_country_code ( 49 ) ;
de_number . set_national_number ( 12 ) ;
assert_eq! ( Ok ( Valid NumberLenType ::IsPossibleLocalOnly ) , phone_util . is_possible_number_for_type_with_reason ( & de_number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Ok ( Valid NumberLenType ::IsPossibleLocalOnly ) , phone_util . is_possible_number_for_type_with_reason ( & de_number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Err ( ValidationResult Err ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & de_number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Ok ( NumberLength Type ::IsPossibleLocalOnly ) , phone_util . is_possible_number_for_type_with_reason ( & de_number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Ok ( NumberLength Type ::IsPossibleLocalOnly ) , phone_util . is_possible_number_for_type_with_reason ( & de_number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Err ( ValidationErro r ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & de_number , PhoneNumberType ::Mobile ) ) ;
let mut br_number = PhoneNumber ::new ( ) ;
br_number . set_country_code ( 55 ) ;
br_number . set_national_number ( 12345678 ) ;
assert_eq! ( Err ( ValidationResult Err ::InvalidLength ) , phone_util . is_possible_number_for_type_with_reason ( & br_number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Ok ( Valid NumberLenType ::IsPossibleLocalOnly ) , phone_util . is_possible_number_for_type_with_reason ( & br_number , PhoneNumberType ::FixedLineOrMobile ) ) ;
assert_eq! ( Err ( ValidationErro r ::InvalidLength ) , phone_util . is_possible_number_for_type_with_reason ( & br_number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Ok ( NumberLength Type ::IsPossibleLocalOnly ) , phone_util . is_possible_number_for_type_with_reason ( & br_number , PhoneNumberType ::FixedLineOrMobile ) ) ;
}
#[ test ]
fn is_possible_number_for_type_with_reason_different_type_lengths ( ) {
// Мы используем аргентинские номера, так как у них разная возможная длина для разных типов.
let phone_util = get_phone_util ( ) ;
let mut number = PhoneNumber ::new ( ) ;
number . set_country_code ( 54 ) ;
number . set_national_number ( 12345 ) ;
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
// 6-значные номера подходят для стационарных телефонов.
number . set_national_number ( 123456 ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
// Н о слишком коротки для мобильных.
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
// И слишком коротки для бесплатных номеров.
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::TollFree ) ) ;
// Т о же самое касается 9-значных номеров.
number . set_national_number ( 123456789 ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::TollFree ) ) ;
// 10-значные номера возможны для всех типов.
number . set_national_number ( 1234567890 ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::TollFree ) ) ;
// 11-значные номера возможны для мобильных номеров. Обратите внимание, что мы не требуем ведущую 9,
// с которой начинаются все мобильные номера и которая была бы необходима для действительного мобильного номера.
number . set_national_number ( 12345678901 ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Err ( ValidationError ::TooLong ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Err ( ValidationError ::TooLong ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::TollFree ) ) ;
}
#[ test ]
fn is_possible_number_for_type_with_reason_local_only ( ) {
let phone_util = get_phone_util ( ) ;
let mut number = PhoneNumber ::new ( ) ;
// Здесь мы тестируем длину номера, которая соответствует только местной длине.
number . set_country_code ( 49 ) ;
number . set_national_number ( 12 ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossibleLocalOnly ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossibleLocalOnly ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
// Мобильные номера должны состоять из 10 или 11 цифр, и для них нет только местных длин.
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
}
#[ test ]
fn is_possible_number_for_type_with_reason_data_missing_for_size_reasons ( ) {
let phone_util = get_phone_util ( ) ;
let mut number = PhoneNumber ::new ( ) ;
// Здесь мы тестируем случай, когда возможные длины соответствуют возможным длинам страны в целом
// и поэтому отсутствуют в бинарных данных по соображениям размера - это все равно должно работать.
// Номер только для местного использования.
number . set_country_code ( 55 ) ;
number . set_national_number ( 12345678 ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossibleLocalOnly ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossibleLocalOnly ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
// Номер нормальной длины.
number . set_national_number ( 1234567890 ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Unknown ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
}
#[ test ]
fn is_possible_number_for_type_with_reason_number_type_not_supported_for_region ( ) {
let phone_util = get_phone_util ( ) ;
let mut number = PhoneNumber ::new ( ) ;
// В этом регионе вообще *нет* мобильных номеров, поэтому мы возвращаем INVALID_LENGTH.
number . set_country_code ( 55 ) ;
number . set_national_number ( 12345678 ) ;
assert_eq! ( Err ( ValidationError ::InvalidLength ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
// Однако это соответствует длине стационарного номера.
assert_eq! ( Ok ( NumberLengthType ::IsPossibleLocalOnly ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLineOrMobile ) ) ;
// Этот номер слишком короткий для стационарного, а мобильных номеров не существует.
number . set_national_number ( 1234567 ) ;
assert_eq! ( Err ( ValidationError ::InvalidLength ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLineOrMobile ) ) ;
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
// Этот номер слишком короткий для мобильного, а стационарных номеров не существует.
number . set_country_code ( 882 ) ;
number . set_national_number ( 1234567 ) ;
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLineOrMobile ) ) ;
assert_eq! ( Err ( ValidationError ::InvalidLength ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
// Для этого кода страны вообще *нет* ни стационарных, ни мобильных номеров,
// поэтому мы возвращаем INVALID_LENGTH.
number . set_country_code ( 979 ) ;
number . set_national_number ( 123456789 ) ;
assert_eq! ( Err ( ValidationError ::InvalidLength ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Err ( ValidationError ::InvalidLength ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Err ( ValidationError ::InvalidLength ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLineOrMobile ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::PremiumRate ) ) ;
}
#[ test ]
fn is_possible_number_for_type_with_reason_fixed_line_or_mobile ( ) {
let phone_util = get_phone_util ( ) ;
let mut number = PhoneNumber ::new ( ) ;
// Для FIXED_LINE_OR_MOBILE номер должен считаться действительным, если он соответствует
// возможным длинам для мобильных *или* стационарных номеров.
number . set_country_code ( 290 ) ;
number . set_national_number ( 1234 ) ;
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLineOrMobile ) ) ;
number . set_national_number ( 12345 ) ;
assert_eq! ( Err ( ValidationError ::TooShort ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Err ( ValidationError ::TooLong ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Err ( ValidationError ::InvalidLength ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLineOrMobile ) ) ;
number . set_national_number ( 123456 ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Err ( ValidationError ::TooLong ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLineOrMobile ) ) ;
number . set_national_number ( 1234567 ) ;
assert_eq! ( Err ( ValidationError ::TooLong ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLine ) ) ;
assert_eq! ( Err ( ValidationError ::TooLong ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::Mobile ) ) ;
assert_eq! ( Err ( ValidationError ::TooLong ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLineOrMobile ) ) ;
number . set_national_number ( 12345678 ) ;
assert_eq! ( Ok ( NumberLengthType ::IsPossible ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::TollFree ) ) ;
assert_eq! ( Err ( ValidationError ::TooLong ) , phone_util . is_possible_number_for_type_with_reason ( & number , PhoneNumberType ::FixedLineOrMobile ) ) ;
}
#[ test ]