• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 test_subclass(self):
11        try:
12            class C(bool):
13                pass
14        except TypeError:
15            pass
16        else:
17            self.fail("bool should not be subclassable")
18
19        self.assertRaises(TypeError, int.__new__, bool, 0)
20
21    def test_print(self):
22        try:
23            fo = open(support.TESTFN, "w")
24            print(False, True, file=fo)
25            fo.close()
26            fo = open(support.TESTFN, "r")
27            self.assertEqual(fo.read(), 'False True\n')
28        finally:
29            fo.close()
30            os.remove(support.TESTFN)
31
32    def test_repr(self):
33        self.assertEqual(repr(False), 'False')
34        self.assertEqual(repr(True), 'True')
35        self.assertEqual(eval(repr(False)), False)
36        self.assertEqual(eval(repr(True)), True)
37
38    def test_str(self):
39        self.assertEqual(str(False), 'False')
40        self.assertEqual(str(True), 'True')
41
42    def test_int(self):
43        self.assertEqual(int(False), 0)
44        self.assertIsNot(int(False), False)
45        self.assertEqual(int(True), 1)
46        self.assertIsNot(int(True), True)
47
48    def test_float(self):
49        self.assertEqual(float(False), 0.0)
50        self.assertIsNot(float(False), False)
51        self.assertEqual(float(True), 1.0)
52        self.assertIsNot(float(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        self.assertEqual(True%1, 0)
100        self.assertIsNot(True%1, False)
101        self.assertEqual(True%2, 1)
102        self.assertIsNot(True%2, True)
103        self.assertEqual(False%1, 0)
104        self.assertIsNot(False%1, False)
105
106        for b in False, True:
107            for i in 0, 1, 2:
108                self.assertEqual(b**i, int(b)**i)
109                self.assertIsNot(b**i, bool(int(b)**i))
110
111        for a in False, True:
112            for b in False, True:
113                self.assertIs(a&b, bool(int(a)&int(b)))
114                self.assertIs(a|b, bool(int(a)|int(b)))
115                self.assertIs(a^b, bool(int(a)^int(b)))
116                self.assertEqual(a&int(b), int(a)&int(b))
117                self.assertIsNot(a&int(b), bool(int(a)&int(b)))
118                self.assertEqual(a|int(b), int(a)|int(b))
119                self.assertIsNot(a|int(b), bool(int(a)|int(b)))
120                self.assertEqual(a^int(b), int(a)^int(b))
121                self.assertIsNot(a^int(b), bool(int(a)^int(b)))
122                self.assertEqual(int(a)&b, int(a)&int(b))
123                self.assertIsNot(int(a)&b, bool(int(a)&int(b)))
124                self.assertEqual(int(a)|b, int(a)|int(b))
125                self.assertIsNot(int(a)|b, bool(int(a)|int(b)))
126                self.assertEqual(int(a)^b, int(a)^int(b))
127                self.assertIsNot(int(a)^b, bool(int(a)^int(b)))
128
129        self.assertIs(1==1, True)
130        self.assertIs(1==0, False)
131        self.assertIs(0<1, True)
132        self.assertIs(1<0, False)
133        self.assertIs(0<=0, True)
134        self.assertIs(1<=0, False)
135        self.assertIs(1>0, True)
136        self.assertIs(1>1, False)
137        self.assertIs(1>=1, True)
138        self.assertIs(0>=1, False)
139        self.assertIs(0!=1, True)
140        self.assertIs(0!=0, False)
141
142        x = [1]
143        self.assertIs(x is x, True)
144        self.assertIs(x is not x, False)
145
146        self.assertIs(1 in x, True)
147        self.assertIs(0 in x, False)
148        self.assertIs(1 not in x, False)
149        self.assertIs(0 not in x, True)
150
151        x = {1: 2}
152        self.assertIs(x is x, True)
153        self.assertIs(x is not x, False)
154
155        self.assertIs(1 in x, True)
156        self.assertIs(0 in x, False)
157        self.assertIs(1 not in x, False)
158        self.assertIs(0 not in x, True)
159
160        self.assertIs(not True, False)
161        self.assertIs(not False, True)
162
163    def test_convert(self):
164        self.assertRaises(TypeError, bool, 42, 42)
165        self.assertIs(bool(10), True)
166        self.assertIs(bool(1), True)
167        self.assertIs(bool(-1), True)
168        self.assertIs(bool(0), False)
169        self.assertIs(bool("hello"), True)
170        self.assertIs(bool(""), False)
171        self.assertIs(bool(), False)
172
173    def test_format(self):
174        self.assertEqual("%d" % False, "0")
175        self.assertEqual("%d" % True, "1")
176        self.assertEqual("%x" % False, "0")
177        self.assertEqual("%x" % True, "1")
178
179    def test_hasattr(self):
180        self.assertIs(hasattr([], "append"), True)
181        self.assertIs(hasattr([], "wobble"), False)
182
183    def test_callable(self):
184        self.assertIs(callable(len), True)
185        self.assertIs(callable(1), False)
186
187    def test_isinstance(self):
188        self.assertIs(isinstance(True, bool), True)
189        self.assertIs(isinstance(False, bool), True)
190        self.assertIs(isinstance(True, int), True)
191        self.assertIs(isinstance(False, int), True)
192        self.assertIs(isinstance(1, bool), False)
193        self.assertIs(isinstance(0, bool), False)
194
195    def test_issubclass(self):
196        self.assertIs(issubclass(bool, int), True)
197        self.assertIs(issubclass(int, bool), False)
198
199    def test_contains(self):
200        self.assertIs(1 in {}, False)
201        self.assertIs(1 in {1:1}, True)
202
203    def test_string(self):
204        self.assertIs("xyz".endswith("z"), True)
205        self.assertIs("xyz".endswith("x"), False)
206        self.assertIs("xyz0123".isalnum(), True)
207        self.assertIs("@#$%".isalnum(), False)
208        self.assertIs("xyz".isalpha(), True)
209        self.assertIs("@#$%".isalpha(), False)
210        self.assertIs("0123".isdigit(), True)
211        self.assertIs("xyz".isdigit(), False)
212        self.assertIs("xyz".islower(), True)
213        self.assertIs("XYZ".islower(), False)
214        self.assertIs("0123".isdecimal(), True)
215        self.assertIs("xyz".isdecimal(), False)
216        self.assertIs("0123".isnumeric(), True)
217        self.assertIs("xyz".isnumeric(), False)
218        self.assertIs(" ".isspace(), True)
219        self.assertIs("\xa0".isspace(), True)
220        self.assertIs("\u3000".isspace(), True)
221        self.assertIs("XYZ".isspace(), False)
222        self.assertIs("X".istitle(), True)
223        self.assertIs("x".istitle(), False)
224        self.assertIs("XYZ".isupper(), True)
225        self.assertIs("xyz".isupper(), False)
226        self.assertIs("xyz".startswith("x"), True)
227        self.assertIs("xyz".startswith("z"), False)
228
229    def test_boolean(self):
230        self.assertEqual(True & 1, 1)
231        self.assertNotIsInstance(True & 1, bool)
232        self.assertIs(True & True, True)
233
234        self.assertEqual(True | 1, 1)
235        self.assertNotIsInstance(True | 1, bool)
236        self.assertIs(True | True, True)
237
238        self.assertEqual(True ^ 1, 0)
239        self.assertNotIsInstance(True ^ 1, bool)
240        self.assertIs(True ^ True, False)
241
242    def test_fileclosed(self):
243        try:
244            f = open(support.TESTFN, "w")
245            self.assertIs(f.closed, False)
246            f.close()
247            self.assertIs(f.closed, True)
248        finally:
249            os.remove(support.TESTFN)
250
251    def test_types(self):
252        # types are always true.
253        for t in [bool, complex, dict, float, int, list, object,
254                  set, str, tuple, type]:
255            self.assertIs(bool(t), True)
256
257    def test_operator(self):
258        import operator
259        self.assertIs(operator.truth(0), False)
260        self.assertIs(operator.truth(1), True)
261        self.assertIs(operator.not_(1), False)
262        self.assertIs(operator.not_(0), True)
263        self.assertIs(operator.contains([], 1), False)
264        self.assertIs(operator.contains([1], 1), True)
265        self.assertIs(operator.lt(0, 0), False)
266        self.assertIs(operator.lt(0, 1), True)
267        self.assertIs(operator.is_(True, True), True)
268        self.assertIs(operator.is_(True, False), False)
269        self.assertIs(operator.is_not(True, True), False)
270        self.assertIs(operator.is_not(True, False), True)
271
272    def test_marshal(self):
273        import marshal
274        self.assertIs(marshal.loads(marshal.dumps(True)), True)
275        self.assertIs(marshal.loads(marshal.dumps(False)), False)
276
277    def test_pickle(self):
278        import pickle
279        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
280            self.assertIs(pickle.loads(pickle.dumps(True, proto)), True)
281            self.assertIs(pickle.loads(pickle.dumps(False, proto)), False)
282
283    def test_picklevalues(self):
284        # Test for specific backwards-compatible pickle values
285        import pickle
286        self.assertEqual(pickle.dumps(True, protocol=0), b"I01\n.")
287        self.assertEqual(pickle.dumps(False, protocol=0), b"I00\n.")
288        self.assertEqual(pickle.dumps(True, protocol=1), b"I01\n.")
289        self.assertEqual(pickle.dumps(False, protocol=1), b"I00\n.")
290        self.assertEqual(pickle.dumps(True, protocol=2), b'\x80\x02\x88.')
291        self.assertEqual(pickle.dumps(False, protocol=2), b'\x80\x02\x89.')
292
293    def test_convert_to_bool(self):
294        # Verify that TypeError occurs when bad things are returned
295        # from __bool__().  This isn't really a bool test, but
296        # it's related.
297        check = lambda o: self.assertRaises(TypeError, bool, o)
298        class Foo(object):
299            def __bool__(self):
300                return self
301        check(Foo())
302
303        class Bar(object):
304            def __bool__(self):
305                return "Yes"
306        check(Bar())
307
308        class Baz(int):
309            def __bool__(self):
310                return self
311        check(Baz())
312
313        # __bool__() must return a bool not an int
314        class Spam(int):
315            def __bool__(self):
316                return 1
317        check(Spam())
318
319        class Eggs:
320            def __len__(self):
321                return -1
322        self.assertRaises(ValueError, bool, Eggs())
323
324    def test_from_bytes(self):
325        self.assertIs(bool.from_bytes(b'\x00'*8, 'big'), False)
326        self.assertIs(bool.from_bytes(b'abcd', 'little'), True)
327
328    def test_sane_len(self):
329        # this test just tests our assumptions about __len__
330        # this will start failing if __len__ changes assertions
331        for badval in ['illegal', -1, 1 << 32]:
332            class A:
333                def __len__(self):
334                    return badval
335            try:
336                bool(A())
337            except (Exception) as e_bool:
338                try:
339                    len(A())
340                except (Exception) as e_len:
341                    self.assertEqual(str(e_bool), str(e_len))
342
343    def test_blocked(self):
344        class A:
345            __bool__ = None
346        self.assertRaises(TypeError, bool, A())
347
348        class B:
349            def __len__(self):
350                return 10
351            __bool__ = None
352        self.assertRaises(TypeError, bool, B())
353
354    def test_real_and_imag(self):
355        self.assertEqual(True.real, 1)
356        self.assertEqual(True.imag, 0)
357        self.assertIs(type(True.real), int)
358        self.assertIs(type(True.imag), int)
359        self.assertEqual(False.real, 0)
360        self.assertEqual(False.imag, 0)
361        self.assertIs(type(False.real), int)
362        self.assertIs(type(False.imag), int)
363
364def test_main():
365    support.run_unittest(BoolTest)
366
367if __name__ == "__main__":
368    test_main()
369