1 # Test properties of bool promised by PEP 285
2
3 import unittest
4 from test.support import os_helper
5
6 import os
7
8 class ESC[4;38;5;81mBoolTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
9
10 def test_subclass(self):
11 try:
12 class ESC[4;38;5;81mC(ESC[4;38;5;149mbool):
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_repr(self):
22 self.assertEqual(repr(False), 'False')
23 self.assertEqual(repr(True), 'True')
24 self.assertIs(eval(repr(False)), False)
25 self.assertIs(eval(repr(True)), True)
26
27 def test_str(self):
28 self.assertEqual(str(False), 'False')
29 self.assertEqual(str(True), 'True')
30
31 def test_int(self):
32 self.assertEqual(int(False), 0)
33 self.assertIsNot(int(False), False)
34 self.assertEqual(int(True), 1)
35 self.assertIsNot(int(True), True)
36
37 def test_float(self):
38 self.assertEqual(float(False), 0.0)
39 self.assertIsNot(float(False), False)
40 self.assertEqual(float(True), 1.0)
41 self.assertIsNot(float(True), True)
42
43 def test_complex(self):
44 self.assertEqual(complex(False), 0j)
45 self.assertEqual(complex(False), False)
46 self.assertEqual(complex(True), 1+0j)
47 self.assertEqual(complex(True), True)
48
49 def test_math(self):
50 self.assertEqual(+False, 0)
51 self.assertIsNot(+False, False)
52 self.assertEqual(-False, 0)
53 self.assertIsNot(-False, False)
54 self.assertEqual(abs(False), 0)
55 self.assertIsNot(abs(False), False)
56 self.assertEqual(+True, 1)
57 self.assertIsNot(+True, True)
58 self.assertEqual(-True, -1)
59 self.assertEqual(abs(True), 1)
60 self.assertIsNot(abs(True), True)
61 with self.assertWarns(DeprecationWarning):
62 # We need to put the bool in a variable, because the constant
63 # ~False is evaluated at compile time due to constant folding;
64 # consequently the DeprecationWarning would be issued during
65 # module loading and not during test execution.
66 false = False
67 self.assertEqual(~false, -1)
68 with self.assertWarns(DeprecationWarning):
69 # also check that the warning is issued in case of constant
70 # folding at compile time
71 self.assertEqual(eval("~False"), -1)
72 with self.assertWarns(DeprecationWarning):
73 true = True
74 self.assertEqual(~true, -2)
75 with self.assertWarns(DeprecationWarning):
76 self.assertEqual(eval("~True"), -2)
77
78 self.assertEqual(False+2, 2)
79 self.assertEqual(True+2, 3)
80 self.assertEqual(2+False, 2)
81 self.assertEqual(2+True, 3)
82
83 self.assertEqual(False+False, 0)
84 self.assertIsNot(False+False, False)
85 self.assertEqual(False+True, 1)
86 self.assertIsNot(False+True, True)
87 self.assertEqual(True+False, 1)
88 self.assertIsNot(True+False, True)
89 self.assertEqual(True+True, 2)
90
91 self.assertEqual(True-True, 0)
92 self.assertIsNot(True-True, False)
93 self.assertEqual(False-False, 0)
94 self.assertIsNot(False-False, False)
95 self.assertEqual(True-False, 1)
96 self.assertIsNot(True-False, True)
97 self.assertEqual(False-True, -1)
98
99 self.assertEqual(True*1, 1)
100 self.assertEqual(False*1, 0)
101 self.assertIsNot(False*1, False)
102
103 self.assertEqual(True/1, 1)
104 self.assertIsNot(True/1, True)
105 self.assertEqual(False/1, 0)
106 self.assertIsNot(False/1, False)
107
108 self.assertEqual(True%1, 0)
109 self.assertIsNot(True%1, False)
110 self.assertEqual(True%2, 1)
111 self.assertIsNot(True%2, True)
112 self.assertEqual(False%1, 0)
113 self.assertIsNot(False%1, False)
114
115 for b in False, True:
116 for i in 0, 1, 2:
117 self.assertEqual(b**i, int(b)**i)
118 self.assertIsNot(b**i, bool(int(b)**i))
119
120 for a in False, True:
121 for b in False, True:
122 self.assertIs(a&b, bool(int(a)&int(b)))
123 self.assertIs(a|b, bool(int(a)|int(b)))
124 self.assertIs(a^b, bool(int(a)^int(b)))
125 self.assertEqual(a&int(b), int(a)&int(b))
126 self.assertIsNot(a&int(b), bool(int(a)&int(b)))
127 self.assertEqual(a|int(b), int(a)|int(b))
128 self.assertIsNot(a|int(b), bool(int(a)|int(b)))
129 self.assertEqual(a^int(b), int(a)^int(b))
130 self.assertIsNot(a^int(b), bool(int(a)^int(b)))
131 self.assertEqual(int(a)&b, int(a)&int(b))
132 self.assertIsNot(int(a)&b, bool(int(a)&int(b)))
133 self.assertEqual(int(a)|b, int(a)|int(b))
134 self.assertIsNot(int(a)|b, bool(int(a)|int(b)))
135 self.assertEqual(int(a)^b, int(a)^int(b))
136 self.assertIsNot(int(a)^b, bool(int(a)^int(b)))
137
138 self.assertIs(1==1, True)
139 self.assertIs(1==0, False)
140 self.assertIs(0<1, True)
141 self.assertIs(1<0, False)
142 self.assertIs(0<=0, True)
143 self.assertIs(1<=0, False)
144 self.assertIs(1>0, True)
145 self.assertIs(1>1, False)
146 self.assertIs(1>=1, True)
147 self.assertIs(0>=1, False)
148 self.assertIs(0!=1, True)
149 self.assertIs(0!=0, False)
150
151 x = [1]
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 x = {1: 2}
161 self.assertIs(x is x, True)
162 self.assertIs(x is not x, False)
163
164 self.assertIs(1 in x, True)
165 self.assertIs(0 in x, False)
166 self.assertIs(1 not in x, False)
167 self.assertIs(0 not in x, True)
168
169 self.assertIs(not True, False)
170 self.assertIs(not False, True)
171
172 def test_convert(self):
173 self.assertRaises(TypeError, bool, 42, 42)
174 self.assertIs(bool(10), True)
175 self.assertIs(bool(1), True)
176 self.assertIs(bool(-1), True)
177 self.assertIs(bool(0), False)
178 self.assertIs(bool("hello"), True)
179 self.assertIs(bool(""), False)
180 self.assertIs(bool(), False)
181
182 def test_keyword_args(self):
183 with self.assertRaisesRegex(TypeError, 'keyword argument'):
184 bool(x=10)
185
186 def test_format(self):
187 self.assertEqual("%d" % False, "0")
188 self.assertEqual("%d" % True, "1")
189 self.assertEqual("%x" % False, "0")
190 self.assertEqual("%x" % True, "1")
191
192 def test_hasattr(self):
193 self.assertIs(hasattr([], "append"), True)
194 self.assertIs(hasattr([], "wobble"), False)
195
196 def test_callable(self):
197 self.assertIs(callable(len), True)
198 self.assertIs(callable(1), False)
199
200 def test_isinstance(self):
201 self.assertIs(isinstance(True, bool), True)
202 self.assertIs(isinstance(False, bool), True)
203 self.assertIs(isinstance(True, int), True)
204 self.assertIs(isinstance(False, int), True)
205 self.assertIs(isinstance(1, bool), False)
206 self.assertIs(isinstance(0, bool), False)
207
208 def test_issubclass(self):
209 self.assertIs(issubclass(bool, int), True)
210 self.assertIs(issubclass(int, bool), False)
211
212 def test_contains(self):
213 self.assertIs(1 in {}, False)
214 self.assertIs(1 in {1:1}, True)
215
216 def test_string(self):
217 self.assertIs("xyz".endswith("z"), True)
218 self.assertIs("xyz".endswith("x"), False)
219 self.assertIs("xyz0123".isalnum(), True)
220 self.assertIs("@#$%".isalnum(), False)
221 self.assertIs("xyz".isalpha(), True)
222 self.assertIs("@#$%".isalpha(), False)
223 self.assertIs("0123".isdigit(), True)
224 self.assertIs("xyz".isdigit(), False)
225 self.assertIs("xyz".islower(), True)
226 self.assertIs("XYZ".islower(), False)
227 self.assertIs("0123".isdecimal(), True)
228 self.assertIs("xyz".isdecimal(), False)
229 self.assertIs("0123".isnumeric(), True)
230 self.assertIs("xyz".isnumeric(), False)
231 self.assertIs(" ".isspace(), True)
232 self.assertIs("\xa0".isspace(), True)
233 self.assertIs("\u3000".isspace(), True)
234 self.assertIs("XYZ".isspace(), False)
235 self.assertIs("X".istitle(), True)
236 self.assertIs("x".istitle(), False)
237 self.assertIs("XYZ".isupper(), True)
238 self.assertIs("xyz".isupper(), False)
239 self.assertIs("xyz".startswith("x"), True)
240 self.assertIs("xyz".startswith("z"), False)
241
242 def test_boolean(self):
243 self.assertEqual(True & 1, 1)
244 self.assertNotIsInstance(True & 1, bool)
245 self.assertIs(True & True, True)
246
247 self.assertEqual(True | 1, 1)
248 self.assertNotIsInstance(True | 1, bool)
249 self.assertIs(True | True, True)
250
251 self.assertEqual(True ^ 1, 0)
252 self.assertNotIsInstance(True ^ 1, bool)
253 self.assertIs(True ^ True, False)
254
255 def test_fileclosed(self):
256 try:
257 with open(os_helper.TESTFN, "w", encoding="utf-8") as f:
258 self.assertIs(f.closed, False)
259 self.assertIs(f.closed, True)
260 finally:
261 os.remove(os_helper.TESTFN)
262
263 def test_types(self):
264 # types are always true.
265 for t in [bool, complex, dict, float, int, list, object,
266 set, str, tuple, type]:
267 self.assertIs(bool(t), True)
268
269 def test_operator(self):
270 import operator
271 self.assertIs(operator.truth(0), False)
272 self.assertIs(operator.truth(1), True)
273 self.assertIs(operator.not_(1), False)
274 self.assertIs(operator.not_(0), True)
275 self.assertIs(operator.contains([], 1), False)
276 self.assertIs(operator.contains([1], 1), True)
277 self.assertIs(operator.lt(0, 0), False)
278 self.assertIs(operator.lt(0, 1), True)
279 self.assertIs(operator.is_(True, True), True)
280 self.assertIs(operator.is_(True, False), False)
281 self.assertIs(operator.is_not(True, True), False)
282 self.assertIs(operator.is_not(True, False), True)
283
284 def test_marshal(self):
285 import marshal
286 self.assertIs(marshal.loads(marshal.dumps(True)), True)
287 self.assertIs(marshal.loads(marshal.dumps(False)), False)
288
289 def test_pickle(self):
290 import pickle
291 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
292 self.assertIs(pickle.loads(pickle.dumps(True, proto)), True)
293 self.assertIs(pickle.loads(pickle.dumps(False, proto)), False)
294
295 def test_picklevalues(self):
296 # Test for specific backwards-compatible pickle values
297 import pickle
298 self.assertEqual(pickle.dumps(True, protocol=0), b"I01\n.")
299 self.assertEqual(pickle.dumps(False, protocol=0), b"I00\n.")
300 self.assertEqual(pickle.dumps(True, protocol=1), b"I01\n.")
301 self.assertEqual(pickle.dumps(False, protocol=1), b"I00\n.")
302 self.assertEqual(pickle.dumps(True, protocol=2), b'\x80\x02\x88.')
303 self.assertEqual(pickle.dumps(False, protocol=2), b'\x80\x02\x89.')
304
305 def test_convert_to_bool(self):
306 # Verify that TypeError occurs when bad things are returned
307 # from __bool__(). This isn't really a bool test, but
308 # it's related.
309 check = lambda o: self.assertRaises(TypeError, bool, o)
310 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mobject):
311 def __bool__(self):
312 return self
313 check(Foo())
314
315 class ESC[4;38;5;81mBar(ESC[4;38;5;149mobject):
316 def __bool__(self):
317 return "Yes"
318 check(Bar())
319
320 class ESC[4;38;5;81mBaz(ESC[4;38;5;149mint):
321 def __bool__(self):
322 return self
323 check(Baz())
324
325 # __bool__() must return a bool not an int
326 class ESC[4;38;5;81mSpam(ESC[4;38;5;149mint):
327 def __bool__(self):
328 return 1
329 check(Spam())
330
331 class ESC[4;38;5;81mEggs:
332 def __len__(self):
333 return -1
334 self.assertRaises(ValueError, bool, Eggs())
335
336 def test_interpreter_convert_to_bool_raises(self):
337 class ESC[4;38;5;81mSymbolicBool:
338 def __bool__(self):
339 raise TypeError
340
341 class ESC[4;38;5;81mSymbol:
342 def __gt__(self, other):
343 return SymbolicBool()
344
345 x = Symbol()
346
347 with self.assertRaises(TypeError):
348 if x > 0:
349 msg = "x > 0 was true"
350 else:
351 msg = "x > 0 was false"
352
353 # This used to create negative refcounts, see gh-102250
354 del x
355
356 def test_from_bytes(self):
357 self.assertIs(bool.from_bytes(b'\x00'*8, 'big'), False)
358 self.assertIs(bool.from_bytes(b'abcd', 'little'), True)
359
360 def test_sane_len(self):
361 # this test just tests our assumptions about __len__
362 # this will start failing if __len__ changes assertions
363 for badval in ['illegal', -1, 1 << 32]:
364 class ESC[4;38;5;81mA:
365 def __len__(self):
366 return badval
367 try:
368 bool(A())
369 except (Exception) as e_bool:
370 try:
371 len(A())
372 except (Exception) as e_len:
373 self.assertEqual(str(e_bool), str(e_len))
374
375 def test_blocked(self):
376 class ESC[4;38;5;81mA:
377 __bool__ = None
378 self.assertRaises(TypeError, bool, A())
379
380 class ESC[4;38;5;81mB:
381 def __len__(self):
382 return 10
383 __bool__ = None
384 self.assertRaises(TypeError, bool, B())
385
386 def test_real_and_imag(self):
387 self.assertEqual(True.real, 1)
388 self.assertEqual(True.imag, 0)
389 self.assertIs(type(True.real), int)
390 self.assertIs(type(True.imag), int)
391 self.assertEqual(False.real, 0)
392 self.assertEqual(False.imag, 0)
393 self.assertIs(type(False.real), int)
394 self.assertIs(type(False.imag), int)
395
396 def test_bool_called_at_least_once(self):
397 class ESC[4;38;5;81mX:
398 def __init__(self):
399 self.count = 0
400 def __bool__(self):
401 self.count += 1
402 return True
403
404 def f(x):
405 if x or True:
406 pass
407
408 x = X()
409 f(x)
410 self.assertGreaterEqual(x.count, 1)
411
412 def test_bool_new(self):
413 self.assertIs(bool.__new__(bool), False)
414 self.assertIs(bool.__new__(bool, 1), True)
415 self.assertIs(bool.__new__(bool, 0), False)
416 self.assertIs(bool.__new__(bool, False), False)
417 self.assertIs(bool.__new__(bool, True), True)
418
419
420 if __name__ == "__main__":
421 unittest.main()