11# Copyright 2009-2015 Ram Rachum.
22# This program is distributed under the MIT license.
33
4- '''Testing module for `logic_tools.all_equal`.'''
5-
64import operator
75import itertools
86
@@ -15,31 +13,41 @@ def test():
1513 _check (True )
1614
1715
18- def _check (exhaustive ):
19- '''Check the basic working of `all_equal` with given `exhaustive` flag.'''
20- assert all_equivalent ([1 , 1 , 1 , 1 ], exhaustive = exhaustive )
21- assert all_equivalent ([1 , 1 , 1.0 , 1 ], exhaustive = exhaustive )
22- assert all_equivalent (((1 + 0j ), 1 , 1.0 , 1 ), exhaustive = exhaustive )
23- assert all_equivalent ([], exhaustive = exhaustive )
24- assert all_equivalent (iter ([1 , 1 , 1.0 , 1 ]), exhaustive = exhaustive )
25- assert all_equivalent ({'meow' }, exhaustive = exhaustive )
26- assert all_equivalent (['frr' , 'frr' , 'frr' , 'frr' ], exhaustive = exhaustive )
16+ def _check (assume_transitive ):
17+ '''Check the basic working of `all_equal` with given `assume_transitive` flag.'''
18+ assert all_equivalent ([1 , 1 , 1 , 1 ], assume_transitive = assume_transitive )
19+ assert all_equivalent ([1 , 1 , 1.0 , 1 ], assume_transitive = assume_transitive )
20+ assert all_equivalent (((1 + 0j ), 1 , 1.0 , 1 ),
21+ assume_transitive = assume_transitive )
22+ assert all_equivalent ([], assume_transitive = assume_transitive )
23+ assert all_equivalent (iter ([1 , 1 , 1.0 , 1 ]),
24+ assume_transitive = assume_transitive )
25+ assert all_equivalent ({'meow' }, assume_transitive = assume_transitive )
26+ assert all_equivalent (['frr' , 'frr' , 'frr' , 'frr' ],
27+ assume_transitive = assume_transitive )
2728
28- assert not all_equivalent ([1 , 1 , 2 , 1 ], exhaustive = exhaustive )
29- assert not all_equivalent ([1 , 1 , 1.001 , 1 ], exhaustive = exhaustive )
30- assert not all_equivalent (((1 + 0j ), 3 , 1.0 , 1 ), exhaustive = exhaustive )
31- assert not all_equivalent (range (7 ), exhaustive = exhaustive )
32- assert not all_equivalent (iter ([1 , 17 , 1.0 , 1 ]), exhaustive = exhaustive )
33- assert not all_equivalent ({'meow' , 'grr' }, exhaustive = exhaustive )
29+ assert not all_equivalent ([1 , 1 , 2 , 1 ],
30+ assume_transitive = assume_transitive )
31+ assert not all_equivalent ([1 , 1 , 1.001 , 1 ],
32+ assume_transitive = assume_transitive )
33+ assert not all_equivalent (((1 + 0j ), 3 , 1.0 , 1 ),
34+ assume_transitive = assume_transitive )
35+ assert not all_equivalent (range (7 ), assume_transitive = assume_transitive )
36+ assert not all_equivalent (iter ([1 , 17 , 1.0 , 1 ]),
37+ assume_transitive = assume_transitive )
38+ assert not all_equivalent ({'meow' , 'grr' },
39+ assume_transitive = assume_transitive )
3440 assert not all_equivalent (['frr' , 'frr' , {}, 'frr' , 'frr' ],
35- exhaustive = exhaustive )
36- assert not all_equivalent (itertools .count ()) # Not using given `exhaustive`
37- # flag here because `count()` is
38- # infinite.
41+ assume_transitive = assume_transitive )
42+ assert not all_equivalent (itertools .count ())
43+ # Not using given `assume_transitive` flag here because `count()` is
44+ # infinite.
3945
4046
41- def test_exhaustive_true ():
42- '''Test `all_equal` in cases where `exhaustive=True` is relevant.'''
47+ def test_assume_transitive_false ():
48+ '''
49+ Test `all_equivalent` in cases where `assume_transitive=False` is relevant.
50+ '''
4351
4452 class FunkyFloat (float ):
4553 def __eq__ (self , other ):
@@ -53,7 +61,68 @@ def __eq__(self, other):
5361 ]
5462
5563 assert all_equivalent (funky_floats )
56- assert not all_equivalent (funky_floats , exhaustive = True )
64+ assert not all_equivalent (funky_floats , assume_transitive = False )
65+
66+
67+ def test_all_assumptions ():
68+ class EquivalenceChecker :
69+ pairs_checked = []
70+ def __init__ (self , tag ):
71+ self .tag = tag
72+ def is_equivalent (self , other ):
73+ EquivalenceChecker .pairs_checked .append ((self , other ))
74+ return True
75+ def __eq__ (self , other ):
76+ return (type (self ), self .tag ) == (type (other ), other .tag )
77+
78+ def get_pairs_for_options (** kwargs ):
79+ assert EquivalenceChecker .pairs_checked == []
80+ # Testing with an iterator instead of the tuple to ensure it works and that
81+ # the function doesn't try to exhaust it twice.
82+ assert all_equivalent (iter (things ), EquivalenceChecker .is_equivalent ,
83+ ** kwargs ) is True
84+ try :
85+ return tuple ((a .tag , b .tag ) for (a , b ) in
86+ EquivalenceChecker .pairs_checked )
87+ finally :
88+ EquivalenceChecker .pairs_checked = []
89+
90+ x0 = EquivalenceChecker (0 )
91+ x1 = EquivalenceChecker (1 )
92+ x2 = EquivalenceChecker (2 )
93+ things = (x0 , x1 , x2 )
94+
95+ assert get_pairs_for_options (assume_reflexive = False , assume_symmetric = False ,
96+ assume_transitive = False ) == (
97+ (0 , 1 ), (1 , 0 ), (0 , 2 ), (2 , 0 ), (1 , 2 ), (2 , 1 ), (0 , 0 ), (1 , 1 ), (2 , 2 )
98+ )
99+ assert get_pairs_for_options (assume_reflexive = False , assume_symmetric = False ,
100+ assume_transitive = True ) == (
101+ (0 , 1 ), (1 , 0 ), (1 , 2 ), (2 , 1 ), (0 , 0 ), (1 , 1 ), (2 , 2 )
102+ )
103+ assert get_pairs_for_options (assume_reflexive = False , assume_symmetric = True ,
104+ assume_transitive = False ) == (
105+ (0 , 1 ), (0 , 2 ), (1 , 2 ), (0 , 0 ), (1 , 1 ), (2 , 2 )
106+ )
107+ assert get_pairs_for_options (assume_reflexive = False , assume_symmetric = True ,
108+ assume_transitive = True ) == (
109+ (0 , 1 ), (1 , 2 ), (0 , 0 ), (1 , 1 ), (2 , 2 )
110+ )
111+ assert get_pairs_for_options (assume_reflexive = True , assume_symmetric = False ,
112+ assume_transitive = False ) == (
113+ (0 , 1 ), (1 , 0 ), (0 , 2 ), (2 , 0 ), (1 , 2 ), (2 , 1 ),
114+ )
115+ assert get_pairs_for_options (assume_reflexive = True , assume_symmetric = False ,
116+ assume_transitive = True ) == (
117+ (0 , 1 ), (1 , 0 ), (1 , 2 ), (2 , 1 ),
118+ )
119+ assert get_pairs_for_options (assume_reflexive = True , assume_symmetric = True ,
120+ assume_transitive = False ) == (
121+ (0 , 1 ), (0 , 2 ), (1 , 2 ),
122+ )
123+ assert get_pairs_for_options (assume_reflexive = True , assume_symmetric = True ,
124+ assume_transitive = True ) == ((0 , 1 ), (1 , 2 ))
125+
57126
58127
59128
@@ -62,17 +131,17 @@ def test_custom_relations():
62131 assert all_equivalent (range (4 ), relation = operator .ge ) is False
63132 assert all_equivalent (range (4 ), relation = operator .le ) is True
64133 assert all_equivalent (range (4 ), relation = operator .le ,
65- exhaustive = True ) is True
66- # (Always comparing small to big, even on exhaustive .)
134+ assume_transitive = True ) is True
135+ # (Always comparing small to big, even on `assume_transitive=False` .)
67136
68137 assert all_equivalent (range (4 ),
69138 relation = lambda x , y : (x // 10 == y // 10 )) is True
70139 assert all_equivalent (range (4 ),
71140 relation = lambda x , y : (x // 10 == y // 10 ),
72- exhaustive = True ) is True
141+ assume_transitive = True ) is True
73142 assert all_equivalent (range (8 , 12 ),
74143 relation = lambda x , y : (x // 10 == y // 10 )) is False
75144 assert all_equivalent (range (8 , 12 ),
76145 relation = lambda x , y : (x // 10 == y // 10 ),
77- exhaustive = True ) is False
146+ assume_transitive = True ) is False
78147
0 commit comments