test_bool.py revision c9c0f201fed21efcf669dbbf5f923eaf0eeb1db9
1# Test properties of bool promised by PEP 285
2
3import unittest
4from test import support
5
6import os
7
8class BoolTest(unittest.TestCase):
9
10    def assertIs(self, a, b):
11        self.assertTrue(a is b)
12
13    def assertIsNot(self, a, b):
14        self.assertTrue(a is not b)
15
16    def test_subclass(self):
17        try:
18            class C(bool):
19                pass
20        except TypeError:
21            pass
22        else:
23            self.fail("bool should not be subclassable")
24
25        self.assertRaises(TypeError, int.__new__, bool, 0)
26
27    def test_print(self):
28        try:
29            fo = open(support.TESTFN, "w")
30            print(False, True, file=fo)
31            fo.close()
32            fo = open(support.TESTFN, "r")
33            self.assertEqual(fo.read(), 'False True\n')
34        finally:
35            fo.close()
36            os.remove(support.TESTFN)
37
38    def test_repr(self):
39        self.assertEqual(repr(False), 'False')
40        self.assertEqual(repr(True), 'True')
41        self.assertEqual(eval(repr(False)), False)
42        self.assertEqual(eval(repr(True)), True)
43
44    def test_str(self):
45        self.assertEqual(str(False), 'False')
46        self.assertEqual(str(True), 'True')
47
48    def test_int(self):
49        self.assertEqual(int(False), 0)
50        self.assertIsNot(int(False), False)
51        self.assertEqual(int(True), 1)
52        self.assertIsNot(int(True), True)
53
54    def test_math(self):
55        self.assertEqual(+False, 0)
56        self.assertIsNot(+False, False)
57        self.assertEqual(-False, 0)
58        self.assertIsNot(-False, False)
59        self.assertEqual(abs(False), 0)
60        self.assertIsNot(abs(False), False)
61        self.assertEqual(+True, 1)
62        self.assertIsNot(+True, True)
63        self.assertEqual(-True, -1)
64        self.assertEqual(abs(True), 1)
65        self.assertIsNot(abs(True), True)
66        self.assertEqual(~False, -1)
67        self.assertEqual(~True, -2)
68
69        self.assertEqual(False+2, 2)
70        self.assertEqual(True+2, 3)
71        self.assertEqual(2+False, 2)
72        self.assertEqual(2+True, 3)
73
74        self.assertEqual(False+False, 0)
75        self.assertIsNot(False+False, False)
76        self.assertEqual(False+True, 1)
77        self.assertIsNot(False+True, True)
78        self.assertEqual(True+False, 1)
79        self.assertIsNot(True+False, True)
80        self.assertEqual(True+True, 2)
81
82        self.assertEqual(True-True, 0)
83        self.assertIsNot(True-True, False)
84        self.assertEqual(False-False, 0)
85        self.assertIsNot(False-False, False)
86        self.assertEqual(True-False, 1)
87        self.assertIsNot(True-False, True)
88        self.assertEqual(False-True, -1)
89
90        self.assertEqual(True*1, 1)
91        self.assertEqual(False*1, 0)
92        self.assertIsNot(False*1, False)
93
94        self.assertEqual(True/1, 1)
95        self.assertIsNot(True/1, True)
96        self.assertEqual(False/1, 0)
97        self.assertIsNot(False/1, False)
98
99        for b in False, True:
100            for i in 0, 1, 2:
101                self.assertEqual(b**i, int(b)**i)
102                self.assertIsNot(b**i, bool(int(b)**i))
103
104        for a in False, True:
105            for b in False, True:
106                self.assertIs(a&b, bool(int(a)&int(b)))
107                self.assertIs(a|b, bool(int(a)|int(b)))
108                self.assertIs(a^b, bool(int(a)^int(b)))
109                self.assertEqual(a&int(b), int(a)&int(b))
110                self.assertIsNot(a&int(b), bool(int(a)&int(b)))
111                self.assertEqual(a|int(b), int(a)|int(b))
112                self.assertIsNot(a|int(b), bool(int(a)|int(b)))
113                self.assertEqual(a^int(b), int(a)^int(b))
114                self.assertIsNot(a^int(b), bool(int(a)^int(b)))
115                self.assertEqual(int(a)&b, int(a)&int(b))
116                self.assertIsNot(int(a)&b, bool(int(a)&int(b)))
117                self.assertEqual(int(a)|b, int(a)|int(b))
118                self.assertIsNot(int(a)|b, bool(int(a)|int(b)))
119                self.assertEqual(int(a)^b, int(a)^int(b))
120                self.assertIsNot(int(a)^b, bool(int(a)^int(b)))
121
122        self.assertIs(1==1, True)
123        self.assertIs(1==0, False)
124        self.assertIs(0<1, True)
125        self.assertIs(1<0, False)
126        self.assertIs(0<=0, True)
127        self.assertIs(1<=0, False)
128        self.assertIs(1>0, True)
129        self.assertIs(1>1, False)
130        self.assertIs(1>=1, True)
131        self.assertIs(0>=1, False)
132        self.assertIs(0!=1, True)
133        self.assertIs(0!=0, False)
134
135        x = [1]
136        self.assertIs(x is x, True)
137        self.assertIs(x is not x, False)
138
139        self.assertIs(1 in x, True)
140        self.assertIs(0 in x, False)
141        self.assertIs(1 not in x, False)
142        self.assertIs(0 not in x, True)
143
144        x = {1: 2}
145        self.assertIs(x is x, True)
146        self.assertIs(x is not x, False)
147
148        self.assertIs(1 in x, True)
149        self.assertIs(0 in x, False)
150        self.assertIs(1 not in x, False)
151        self.assertIs(0 not in x, True)
152
153        self.assertIs(not True, False)
154        self.assertIs(not False, True)
155
156    def test_convert(self):
157        self.assertRaises(TypeError, bool, 42, 42)
158        self.assertIs(bool(10), True)
159        self.assertIs(bool(1), True)
160        self.assertIs(bool(-1), True)
161        self.assertIs(bool(0), False)
162        self.assertIs(bool("hello"), True)
163        self.assertIs(bool(""), False)
164        self.assertIs(bool(), False)
165
166    def test_format(self):
167        self.assertEqual("%d" % False, "0")
168        self.assertEqual("%d" % True, "1")
169        self.assertEqual("%x" % False, "0")
170        self.assertEqual("%x" % True, "1")
171
172    def test_hasattr(self):
173        self.assertIs(hasattr([], "append"), True)
174        self.assertIs(hasattr([], "wobble"), False)
175
176    def test_callable(self):
177        self.assertIs(hasattr(len, '__call__'), True)
178        self.assertIs(hasattr(1, '__call__'), False)
179
180    def test_isinstance(self):
181        self.assertIs(isinstance(True, bool), True)
182        self.assertIs(isinstance(False, bool), True)
183        self.assertIs(isinstance(True, int), True)
184        self.assertIs(isinstance(False, int), True)
185        self.assertIs(isinstance(1, bool), False)
186        self.assertIs(isinstance(0, bool), False)
187
188    def test_issubclass(self):
189        self.assertIs(issubclass(bool, int), True)
190        self.assertIs(issubclass(int, bool), False)
191
192    def test_contains(self):
193        self.assertIs(1 in {}, False)
194        self.assertIs(1 in {1:1}, True)
195
196    def test_string(self):
197        self.assertIs("xyz".endswith("z"), True)
198        self.assertIs("xyz".endswith("x"), False)
199        self.assertIs("xyz0123".isalnum(), True)
200        self.assertIs("@#$%".isalnum(), False)
201        self.assertIs("xyz".isalpha(), True)
202        self.assertIs("@#$%".isalpha(), False)
203        self.assertIs("0123".isdigit(), True)
204        self.assertIs("xyz".isdigit(), False)
205        self.assertIs("xyz".islower(), True)
206        self.assertIs("XYZ".islower(), False)
207        self.assertIs("0123".isdecimal(), True)
208        self.assertIs("xyz".isdecimal(), False)
209        self.assertIs("0123".isnumeric(), True)
210        self.assertIs("xyz".isnumeric(), False)
211        self.assertIs(" ".isspace(), True)
212        self.assertIs("\xa0".isspace(), True)
213        self.assertIs("\u3000".isspace(), True)
214        self.assertIs("XYZ".isspace(), False)
215        self.assertIs("X".istitle(), True)
216        self.assertIs("x".istitle(), False)
217        self.assertIs("XYZ".isupper(), True)
218        self.assertIs("xyz".isupper(), False)
219        self.assertIs("xyz".startswith("x"), True)
220        self.assertIs("xyz".startswith("z"), False)
221
222    def test_boolean(self):
223        self.assertEqual(True & 1, 1)
224        self.assertTrue(not isinstance(True & 1, bool))
225        self.assertIs(True & True, True)
226
227        self.assertEqual(True | 1, 1)
228        self.assertTrue(not isinstance(True | 1, bool))
229        self.assertIs(True | True, True)
230
231        self.assertEqual(True ^ 1, 0)
232        self.assertTrue(not isinstance(True ^ 1, bool))
233        self.assertIs(True ^ True, False)
234
235    def test_fileclosed(self):
236        try:
237            f = open(support.TESTFN, "w")
238            self.assertIs(f.closed, False)
239            f.close()
240            self.assertIs(f.closed, True)
241        finally:
242            os.remove(support.TESTFN)
243
244    def test_operator(self):
245        import operator
246        self.assertIs(operator.truth(0), False)
247        self.assertIs(operator.truth(1), True)
248        self.assertIs(operator.not_(1), False)
249        self.assertIs(operator.not_(0), True)
250        self.assertIs(operator.contains([], 1), False)
251        self.assertIs(operator.contains([1], 1), True)
252        self.assertIs(operator.lt(0, 0), False)
253        self.assertIs(operator.lt(0, 1), True)
254        self.assertIs(operator.is_(True, True), True)
255        self.assertIs(operator.is_(True, False), False)
256        self.assertIs(operator.is_not(True, True), False)
257        self.assertIs(operator.is_not(True, False), True)
258
259    def test_marshal(self):
260        import marshal
261        self.assertIs(marshal.loads(marshal.dumps(True)), True)
262        self.assertIs(marshal.loads(marshal.dumps(False)), False)
263
264    def test_pickle(self):
265        import pickle
266        self.assertIs(pickle.loads(pickle.dumps(True)), True)
267        self.assertIs(pickle.loads(pickle.dumps(False)), False)
268        self.assertIs(pickle.loads(pickle.dumps(True, True)), True)
269        self.assertIs(pickle.loads(pickle.dumps(False, True)), False)
270
271    def test_picklevalues(self):
272        # Test for specific backwards-compatible pickle values
273        import pickle
274        self.assertEqual(pickle.dumps(True, protocol=0), b"I01\n.")
275        self.assertEqual(pickle.dumps(False, protocol=0), b"I00\n.")
276        self.assertEqual(pickle.dumps(True, protocol=1), b"I01\n.")
277        self.assertEqual(pickle.dumps(False, protocol=1), b"I00\n.")
278        self.assertEqual(pickle.dumps(True, protocol=2), b'\x80\x02\x88.')
279        self.assertEqual(pickle.dumps(False, protocol=2), b'\x80\x02\x89.')
280
281    def test_convert_to_bool(self):
282        # Verify that TypeError occurs when bad things are returned
283        # from __bool__().  This isn't really a bool test, but
284        # it's related.
285        check = lambda o: self.assertRaises(TypeError, bool, o)
286        class Foo(object):
287            def __bool__(self):
288                return self
289        check(Foo())
290
291        class Bar(object):
292            def __bool__(self):
293                return "Yes"
294        check(Bar())
295
296        class Baz(int):
297            def __bool__(self):
298                return self
299        check(Baz())
300
301        # __bool__() must return a bool not an int
302        class Spam(int):
303            def __bool__(self):
304                return 1
305        check(Spam())
306
307        class Eggs:
308            def __len__(self):
309                return -1
310        self.assertRaises(ValueError, bool, Eggs())
311
312    def test_sane_len(self):
313        # this test just tests our assumptions about __len__
314        # this will start failing if __len__ changes assertions
315        for badval in ['illegal', -1, 1 << 32]:
316            class A:
317                def __len__(self):
318                    return badval
319            try:
320                bool(A())
321            except (Exception) as e_bool:
322                try:
323                    len(A())
324                except (Exception) as e_len:
325                    self.assertEqual(str(e_bool), str(e_len))
326
327def test_main():
328    support.run_unittest(BoolTest)
329
330if __name__ == "__main__":
331    test_main()
332