@@ -685,6 +685,7 @@ def testFormatNumberForMobileDialing(self):
685685
686686 def testFormatByPattern (self ):
687687 newNumFormat = NumberFormat (pattern = "(\\ d{3})(\\ d{3})(\\ d{4})" , format = "(\\ 1) \\ 2-\\ 3" )
688+ newNumFormat ._mutable = True
688689 newNumberFormats = [newNumFormat ]
689690
690691 self .assertEqual ("(650) 253-0000" , phonenumbers .format_by_pattern (US_NUMBER , PhoneNumberFormat .NATIONAL ,
@@ -1276,7 +1277,9 @@ def testExtractPossibleNumber(self):
12761277
12771278 def testMaybeStripNationalPrefix (self ):
12781279 metadata = PhoneMetadata (id = "Test" , national_prefix_for_parsing = "34" , register = False )
1280+ metadata ._mutable = True
12791281 metadata .general_desc = PhoneNumberDesc (national_number_pattern = "\\ d{4,8}" )
1282+ metadata .general_desc ._mutable = True
12801283 numberToStrip = "34356778"
12811284 strippedNumber = "356778"
12821285 cc , numberToStrip , rc = phonenumberutil ._maybe_strip_national_prefix_carrier_code (numberToStrip , metadata )
@@ -2186,10 +2189,13 @@ def testIsAlphaNumber(self):
21862189 def testMetadataEquality (self ):
21872190 # Python version extra tests for equality against other types
21882191 desc1 = PhoneNumberDesc (national_number_pattern = "\\ d{4,8}" )
2192+ desc1 ._mutable = True
21892193 desc2 = PhoneNumberDesc (national_number_pattern = "\\ d{4,8}" )
2194+ desc2 ._mutable = True
21902195 desc3 = PhoneNumberDesc (national_number_pattern = "\\ d{4,7}" ,
21912196 possible_number_pattern = "\\ d{7}" ,
21922197 example_number = "1234567" )
2198+ desc3 ._mutable = True
21932199 self .assertNotEqual (desc1 , None )
21942200 self .assertNotEqual (desc1 , "" )
21952201 self .assertEqual (desc1 , desc2 )
@@ -2201,10 +2207,13 @@ def testMetadataEquality(self):
22012207 r"possible_number_pattern='\\d{7}', example_number='1234567')" ,
22022208 str (desc3 ))
22032209 nf1 = NumberFormat (pattern = r'\d{3}' , format = r'\1' , leading_digits_pattern = ['1' ])
2210+ nf1 ._mutable = True
22042211 nf2 = NumberFormat (pattern = r'\d{3}' , format = r'\1' , leading_digits_pattern = ['1' ])
2212+ nf2 ._mutable = True
22052213 nf3 = NumberFormat (pattern = r'\d{3}' , format = r'\1' , leading_digits_pattern = ['2' ],
22062214 national_prefix_formatting_rule = '$NP' ,
22072215 domestic_carrier_code_formatting_rule = '$NP' )
2216+ nf3 ._mutable = True
22082217 self .assertEqual (nf1 , nf2 )
22092218 self .assertNotEqual (nf1 , nf3 )
22102219 self .assertNotEqual (nf1 , None )
@@ -2216,15 +2225,72 @@ def testMetadataEquality(self):
22162225 self .assertNotEqual (nf1 , nf3 )
22172226
22182227 metadata1 = PhoneMetadata ("XY" , preferred_international_prefix = u ('9123' ), register = False )
2228+ metadata1 ._mutable = True
22192229 metadata2 = PhoneMetadata ("XY" , preferred_international_prefix = u ('9123' ), register = False )
2230+ metadata2 ._mutable = True
22202231 metadata3 = PhoneMetadata ("XY" , preferred_international_prefix = u ('9100' ), register = False )
2232+ metadata3 ._mutable = True
22212233 self .assertEqual (metadata1 , metadata2 )
22222234 self .assertNotEqual (metadata1 , metadata3 )
22232235 self .assertTrue (metadata1 != metadata3 )
22242236 self .assertNotEqual (metadata1 , None )
22252237 self .assertNotEqual (metadata1 , "" )
22262238 self .assertNotEqual (metadata1 , 123 )
22272239
2240+ def testFrozenPhoneNumberImmutable (self ):
2241+ number = PhoneNumber (country_code = 39 , national_number = 236618300L , italian_leading_zero = True )
2242+ frozen1 = FrozenPhoneNumber (country_code = 39 , national_number = 236618300L , italian_leading_zero = True )
2243+ frozen2 = FrozenPhoneNumber (number )
2244+ self .assertEqual (number , frozen1 )
2245+ self .assertEqual (frozen1 , frozen2 )
2246+ number .country_code = 999
2247+ self .assertNotEqual (number , frozen1 )
2248+ try :
2249+ frozen1 .country_code = 999
2250+ self .fail ("Expected exception on __setattr__" )
2251+ except TypeError :
2252+ pass
2253+ try :
2254+ del frozen2 .country_code
2255+ self .fail ("Expected exception on __delattr__" )
2256+ except TypeError :
2257+ pass
2258+
2259+ def testMetadataImmutable (self ):
2260+ desc = PhoneNumberDesc (national_number_pattern = "\\ d{4,8}" )
2261+ nf = NumberFormat (pattern = r'\d{3}' , format = r'\1' , leading_digits_pattern = ['1' ])
2262+ metadata = PhoneMetadata ("XY" , preferred_international_prefix = u'9123' , register = False )
2263+ try :
2264+ desc .national_number_pattern = ""
2265+ self .fail ("Expected exception on __setattr__" )
2266+ except TypeError :
2267+ pass
2268+ try :
2269+ del desc .national_number_pattern
2270+ self .fail ("Expected exception on __delattr__" )
2271+ except TypeError :
2272+ pass
2273+ try :
2274+ nf .pattern = ""
2275+ self .fail ("Expected exception on __setattr__" )
2276+ except TypeError :
2277+ pass
2278+ try :
2279+ del nf .pattern
2280+ self .fail ("Expected exception on __delattr__" )
2281+ except TypeError :
2282+ pass
2283+ try :
2284+ metadata .id = None
2285+ self .fail ("Expected exception on __setattr__" )
2286+ except TypeError :
2287+ pass
2288+ try :
2289+ del metadata .id
2290+ self .fail ("Expected exception on __delattr__" )
2291+ except TypeError :
2292+ pass
2293+
22282294 def testMetadataAsString (self ):
22292295 # Python version extra tests for string conversions
22302296 metadata = PhoneMetadata .region_metadata ["AU" ]
@@ -2361,17 +2427,21 @@ def testCoverage(self):
23612427 # Temporarily insert invalid example number
23622428 metadata800 = PhoneMetadata .country_code_metadata [800 ]
23632429 saved_example = metadata800 .general_desc .example_number
2430+ metadata800 .general_desc ._mutable = True
23642431 metadata800 .general_desc .example_number = '01'
23652432 self .assertTrue (phonenumbers .example_number_for_non_geo_entity (800 ) is None )
23662433 metadata800 .general_desc .example_number = saved_example
2434+ metadata800 .general_desc ._mutable = False
23672435
23682436 self .assertFalse (phonenumbers .phonenumberutil ._raw_input_contains_national_prefix ("077" , "0" , "JP" ))
23692437
23702438 # Temporarily change formatting rule
23712439 metadataGB = PhoneMetadata .region_metadata ["GB" ]
23722440 saved_rule = metadataGB .number_format [0 ].national_prefix_formatting_rule
2441+ metadataGB .number_format [0 ]._mutable = True
23732442 metadataGB .number_format [0 ].national_prefix_formatting_rule = u ('(\\ 1)' )
23742443 numberWithoutNationalPrefixGB = phonenumbers .parse ("2087654321" , "GB" , keep_raw_input = True )
23752444 self .assertEqual ("(20) 8765 4321" ,
23762445 phonenumbers .format_in_original_format (numberWithoutNationalPrefixGB , "GB" ))
23772446 metadataGB .number_format [0 ].national_prefix_formatting_rule = saved_rule
2447+ metadataGB .number_format [0 ]._mutable = False
0 commit comments