@@ -259,6 +259,72 @@ class Color(
259
259
GREEN = 2 , 'Verde' , (0 , 1 , 0 ), '00ff00'
260
260
BLUE = 3 , 'Azul' , (0 , 0 , 1 ), '0000ff'
261
261
262
+ def test_symmetric_match_none_parameter (self ):
263
+
264
+ # test default behavior
265
+ class ColorDefault (
266
+ EnumProperties ,
267
+ p ('spanish' ),
268
+ s ('rgb' ),
269
+ s ('hex' )
270
+ ):
271
+
272
+ RED = 1 , 'Roja' , (1 , 0 , 0 ), 'ff0000'
273
+ GREEN = 2 , 'Verde' , (0 , 1 , 0 ), None
274
+ BLUE = 3 , 'Azul' , (0 , 0 , 1 ), None
275
+
276
+ self .assertEqual (ColorDefault .RED , 'ff0000' )
277
+ self .assertNotEqual (ColorDefault .GREEN , None )
278
+ self .assertNotEqual (ColorDefault .BLUE , None )
279
+ self .assertRaises (ValueError , ColorDefault , None )
280
+ self .assertRaises (ValueError , ColorDefault , 'FF0000' )
281
+ self .assertEqual (ColorDefault ('ff0000' ), ColorDefault .RED )
282
+ self .assertEqual (ColorDefault ((1 , 0 , 0 )), ColorDefault .RED )
283
+ self .assertEqual (ColorDefault ((0 , 1 , 0 )), ColorDefault .GREEN )
284
+ self .assertEqual (ColorDefault ((0 , 0 , 1 )), ColorDefault .BLUE )
285
+
286
+ class ColorNoMatchNone (
287
+ EnumProperties ,
288
+ p ('spanish' ),
289
+ s ('rgb' ),
290
+ s ('hex' , case_fold = True , match_none = False )
291
+ ):
292
+
293
+ RED = 1 , 'Roja' , (1 , 0 , 0 ), 'ff0000'
294
+ GREEN = 2 , 'Verde' , (0 , 1 , 0 ), None
295
+ BLUE = 3 , 'Azul' , (0 , 0 , 1 ), None
296
+
297
+ self .assertEqual (ColorNoMatchNone .RED , 'fF0000' )
298
+ self .assertNotEqual (ColorNoMatchNone .GREEN , None )
299
+ self .assertNotEqual (ColorNoMatchNone .BLUE , None )
300
+ self .assertRaises (ValueError , ColorNoMatchNone , None )
301
+ self .assertEqual (ColorNoMatchNone ('Ff0000' ), ColorNoMatchNone .RED )
302
+ self .assertEqual (ColorNoMatchNone ((1 , 0 , 0 )), ColorNoMatchNone .RED )
303
+ self .assertEqual (ColorNoMatchNone ((0 , 1 , 0 )), ColorNoMatchNone .GREEN )
304
+ self .assertEqual (ColorNoMatchNone ((0 , 0 , 1 )), ColorNoMatchNone .BLUE )
305
+
306
+ class ColorMatchNone (
307
+ EnumProperties ,
308
+ p ('spanish' ),
309
+ s ('rgb' ),
310
+ s ('hex' , match_none = True )
311
+ ):
312
+
313
+ RED = 1 , 'Roja' , (1 , 0 , 0 ), 'ff0000'
314
+ GREEN = 2 , 'Verde' , (0 , 1 , 0 ), None
315
+ BLUE = 3 , 'Azul' , (0 , 0 , 1 ), None
316
+
317
+ self .assertNotEqual (ColorMatchNone .RED , 'FF0000' )
318
+ self .assertEqual (ColorMatchNone .RED , 'ff0000' )
319
+ self .assertEqual (ColorMatchNone .GREEN , None )
320
+ self .assertNotEqual (ColorMatchNone .BLUE , None )
321
+ self .assertEqual (ColorMatchNone (None ), ColorMatchNone .GREEN )
322
+ self .assertEqual (ColorMatchNone ('ff0000' ), ColorMatchNone .RED )
323
+ self .assertRaises (ValueError , ColorMatchNone , 'FF0000' )
324
+ self .assertEqual (ColorMatchNone ((1 , 0 , 0 )), ColorMatchNone .RED )
325
+ self .assertEqual (ColorMatchNone ((0 , 1 , 0 )), ColorMatchNone .GREEN )
326
+ self .assertEqual (ColorMatchNone ((0 , 0 , 1 )), ColorMatchNone .BLUE )
327
+
262
328
def test_properties_no_symmetry (self ):
263
329
"""
264
330
Tests that absence of SymmetricMixin works but w/o symmetric
@@ -546,7 +612,7 @@ class Color(
546
612
EnumProperties ,
547
613
p ('spanish' ),
548
614
s ('rgb' ),
549
- s ('hex' , case_fold = True )
615
+ s ('hex' , case_fold = True , match_none = True )
550
616
):
551
617
RED = 1 , 'Roja' , (1 , 0 , 0 ), 'ff0000'
552
618
GREEN = 2 , None , (0 , 1 , 0 ), '00ff00'
@@ -1676,6 +1742,26 @@ class Type3:
1676
1742
self .assertTrue (MyEnum .Type3 .value ().__class__ is MyEnum .Type3 .value )
1677
1743
1678
1744
1745
+ class TestGiantFlags (TestCase ):
1746
+
1747
+ def test_over64_flags (self ):
1748
+
1749
+ class BigFlags (IntFlagProperties , p ('label' )):
1750
+
1751
+ ONE = 2 ** 0 , 'one'
1752
+ MIDDLE = 2 ** 64 , 'middle'
1753
+ MIXED = ONE | MIDDLE , 'mixed'
1754
+ LAST = 2 ** 128 , 'last'
1755
+
1756
+ self .assertEqual ((BigFlags .ONE | BigFlags .LAST ).value , 2 ** 128 + 1 )
1757
+ self .assertEqual (
1758
+ (BigFlags .MIDDLE | BigFlags .LAST ).value , 2 ** 128 + 2 ** 64
1759
+ )
1760
+ self .assertEqual (
1761
+ (BigFlags .MIDDLE | BigFlags .ONE ).label , 'mixed'
1762
+ )
1763
+
1764
+
1679
1765
class TestSpecialize (TestCase ):
1680
1766
"""
1681
1767
Test the specialize decorator
@@ -1872,3 +1958,22 @@ def test_property_access_time(self):
1872
1958
1873
1959
for_loop_time = perf_counter () - for_loop_time
1874
1960
print ('for loop time: {}' .format (for_loop_time ))
1961
+
1962
+ def test_symmetric_mapping (self ):
1963
+ """
1964
+ Symmetric mapping benchmarks
1965
+
1966
+ v1.4.0 ISOCountry: ~3 seconds (macbook M1 Pro)
1967
+ v1.4.1 ISOCountry: ~ seconds (macbook M1 Pro) (x faster)
1968
+ """
1969
+ self .assertEqual (
1970
+ self .ISOCountry (self .ISOCountry .US .full_name .lower ()),
1971
+ self .ISOCountry .US
1972
+ )
1973
+ from time import perf_counter
1974
+ for_loop_time = perf_counter ()
1975
+ for i in range (1000000 ):
1976
+ self .ISOCountry (self .ISOCountry .US .full_name .lower ())
1977
+
1978
+ for_loop_time = perf_counter () - for_loop_time
1979
+ print ('for loop time: {}' .format (for_loop_time ))
0 commit comments