python (3.11.7)
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 self.assertEqual(~False, -1)
62 self.assertEqual(~True, -2)
63
64 self.assertEqual(False+2, 2)
65 self.assertEqual(True+2, 3)
66 self.assertEqual(2+False, 2)
67 self.assertEqual(2+True, 3)
68
69 self.assertEqual(False+False, 0)
70 self.assertIsNot(False+False, False)
71 self.assertEqual(False+True, 1)
72 self.assertIsNot(False+True, True)
73 self.assertEqual(True+False, 1)
74 self.assertIsNot(True+False, True)
75 self.assertEqual(True+True, 2)
76
77 self.assertEqual(True-True, 0)
78 self.assertIsNot(True-True, False)
79 self.assertEqual(False-False, 0)
80 self.assertIsNot(False-False, False)
81 self.assertEqual(True-False, 1)
82 self.assertIsNot(True-False, True)
83 self.assertEqual(False-True, -1)
84
85 self.assertEqual(True*1, 1)
86 self.assertEqual(False*1, 0)
87 self.assertIsNot(False*1, False)
88
89 self.assertEqual(True/1, 1)
90 self.assertIsNot(True/1, True)
91 self.assertEqual(False/1, 0)
92 self.assertIsNot(False/1, False)
93
94 self.assertEqual(True%1, 0)
95 self.assertIsNot(True%1, False)
96 self.assertEqual(True%2, 1)
97 self.assertIsNot(True%2, True)
98 self.assertEqual(False%1, 0)
99 self.assertIsNot(False%1, False)
100
101 for b in False, True:
102 for i in 0, 1, 2:
103 self.assertEqual(b**i, int(b)**i)
104 self.assertIsNot(b**i, bool(int(b)**i))
105
106 for a in False, True:
107 for b in False, True:
108 self.assertIs(a&b, bool(int(a)&int(b)))
109 self.assertIs(a|b, bool(int(a)|int(b)))
110 self.assertIs(a^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(a^int(b), int(a)^int(b))
116 self.assertIsNot(a^int(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 self.assertEqual(int(a)^b, int(a)^int(b))
122 self.assertIsNot(int(a)^b, bool(int(a)^int(b)))
123
124 self.assertIs(1==1, True)
125 self.assertIs(1==0, False)
126 self.assertIs(0<1, True)
127 self.assertIs(1<0, False)
128 self.assertIs(0<=0, True)
129 self.assertIs(1<=0, False)
130 self.assertIs(1>0, True)
131 self.assertIs(1>1, False)
132 self.assertIs(1>=1, True)
133 self.assertIs(0>=1, False)
134 self.assertIs(0!=1, True)
135 self.assertIs(0!=0, False)
136
137 x = [1]
138 self.assertIs(x is x, True)
139 self.assertIs(x is not x, False)
140
141 self.assertIs(1 in x, True)
142 self.assertIs(0 in x, False)
143 self.assertIs(1 not in x, False)
144 self.assertIs(0 not in x, True)
145
146 x = {1: 2}
147 self.assertIs(x is x, True)
148 self.assertIs(x is not x, False)
149
150 self.assertIs(1 in x, True)
151 self.assertIs(0 in x, False)
152 self.assertIs(1 not in x, False)
153 self.assertIs(0 not in x, True)
154
155 self.assertIs(not True, False)
156 self.assertIs(not False, True)
157
158 def test_convert(self):
159 self.assertRaises(TypeError, bool, 42, 42)
160 self.assertIs(bool(10), True)
161 self.assertIs(bool(1), True)
162 self.assertIs(bool(-1), True)
163 self.assertIs(bool(0), False)
164 self.assertIs(bool("hello"), True)
165 self.assertIs(bool(""), False)
166 self.assertIs(bool(), False)
167
168 def test_keyword_args(self):
169 with self.assertRaisesRegex(TypeError, 'keyword argument'):
170 bool(x=10)
171
172 def test_format(self):
173 self.assertEqual("%d" % False, "0")
174 self.assertEqual("%d" % True, "1")
175 self.assertEqual("%x" % False, "0")
176 self.assertEqual("%x" % True, "1")
177
178 def test_hasattr(self):
179 self.assertIs(hasattr([], "append"), True)
180 self.assertIs(hasattr([], "wobble"), False)
181
182 def test_callable(self):
183 self.assertIs(callable(len), True)
184 self.assertIs(callable(1), False)
185
186 def test_isinstance(self):
187 self.assertIs(isinstance(True, bool), True)
188 self.assertIs(isinstance(False, bool), True)
189 self.assertIs(isinstance(True, int), True)
190 self.assertIs(isinstance(False, int), True)
191 self.assertIs(isinstance(1, bool), False)
192 self.assertIs(isinstance(0, bool), False)
193
194 def test_issubclass(self):
195 self.assertIs(issubclass(bool, int), True)
196 self.assertIs(issubclass(int, bool), False)
197
198 def test_contains(self):
199 self.assertIs(1 in {}, False)
200 self.assertIs(1 in {1:1}, True)
201
202 def test_string(self):
203 self.assertIs("xyz".endswith("z"), True)
204 self.assertIs("xyz".endswith("x"), False)
205 self.assertIs("xyz0123".isalnum(), True)
206 self.assertIs("@#$%".isalnum(), False)
207 self.assertIs("xyz".isalpha(), True)
208 self.assertIs("@#$%".isalpha(), False)
209 self.assertIs("0123".isdigit(), True)
210 self.assertIs("xyz".isdigit(), False)
211 self.assertIs("xyz".islower(), True)
212 self.assertIs("XYZ".islower(), False)
213 self.assertIs("0123".isdecimal(), True)
214 self.assertIs("xyz".isdecimal(), False)
215 self.assertIs("0123".isnumeric(), True)
216 self.assertIs("xyz".isnumeric(), False)
217 self.assertIs(" ".isspace(), True)
218 self.assertIs("\xa0".isspace(), True)
219 self.assertIs("\u3000".isspace(), True)
220 self.assertIs("XYZ".isspace(), False)
221 self.assertIs("X".istitle(), True)
222 self.assertIs("x".istitle(), False)
223 self.assertIs("XYZ".isupper(), True)
224 self.assertIs("xyz".isupper(), False)
225 self.assertIs("xyz".startswith("x"), True)
226 self.assertIs("xyz".startswith("z"), False)
227
228 def test_boolean(self):
229 self.assertEqual(True & 1, 1)
230 self.assertNotIsInstance(True & 1, bool)
231 self.assertIs(True & True, True)
232
233 self.assertEqual(True | 1, 1)
234 self.assertNotIsInstance(True | 1, bool)
235 self.assertIs(True | True, True)
236
237 self.assertEqual(True ^ 1, 0)
238 self.assertNotIsInstance(True ^ 1, bool)
239 self.assertIs(True ^ True, False)
240
241 def test_fileclosed(self):
242 try:
243 with open(os_helper.TESTFN, "w", encoding="utf-8") as f:
244 self.assertIs(f.closed, False)
245 self.assertIs(f.closed, True)
246 finally:
247 os.remove(os_helper.TESTFN)
248
249 def test_types(self):
250 # types are always true.
251 for t in [bool, complex, dict, float, int, list, object,
252 set, str, tuple, type]:
253 self.assertIs(bool(t), True)
254
255 def test_operator(self):
256 import operator
257 self.assertIs(operator.truth(0), False)
258 self.assertIs(operator.truth(1), True)
259 self.assertIs(operator.not_(1), False)
260 self.assertIs(operator.not_(0), True)
261 self.assertIs(operator.contains([], 1), False)
262 self.assertIs(operator.contains([1], 1), True)
263 self.assertIs(operator.lt(0, 0), False)
264 self.assertIs(operator.lt(0, 1), True)
265 self.assertIs(operator.is_(True, True), True)
266 self.assertIs(operator.is_(True, False), False)
267 self.assertIs(operator.is_not(True, True), False)
268 self.assertIs(operator.is_not(True, False), True)
269
270 def test_marshal(self):
271 import marshal
272 self.assertIs(marshal.loads(marshal.dumps(True)), True)
273 self.assertIs(marshal.loads(marshal.dumps(False)), False)
274
275 def test_pickle(self):
276 import pickle
277 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
278 self.assertIs(pickle.loads(pickle.dumps(True, proto)), True)
279 self.assertIs(pickle.loads(pickle.dumps(False, proto)), False)
280
281 def test_picklevalues(self):
282 # Test for specific backwards-compatible pickle values
283 import pickle
284 self.assertEqual(pickle.dumps(True, protocol=0), b"I01\n.")
285 self.assertEqual(pickle.dumps(False, protocol=0), b"I00\n.")
286 self.assertEqual(pickle.dumps(True, protocol=1), b"I01\n.")
287 self.assertEqual(pickle.dumps(False, protocol=1), b"I00\n.")
288 self.assertEqual(pickle.dumps(True, protocol=2), b'\x80\x02\x88.')
289 self.assertEqual(pickle.dumps(False, protocol=2), b'\x80\x02\x89.')
290
291 def test_convert_to_bool(self):
292 # Verify that TypeError occurs when bad things are returned
293 # from __bool__(). This isn't really a bool test, but
294 # it's related.
295 check = lambda o: self.assertRaises(TypeError, bool, o)
296 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mobject):
297 def __bool__(self):
298 return self
299 check(Foo())
300
301 class ESC[4;38;5;81mBar(ESC[4;38;5;149mobject):
302 def __bool__(self):
303 return "Yes"
304 check(Bar())
305
306 class ESC[4;38;5;81mBaz(ESC[4;38;5;149mint):
307 def __bool__(self):
308 return self
309 check(Baz())
310
311 # __bool__() must return a bool not an int
312 class ESC[4;38;5;81mSpam(ESC[4;38;5;149mint):
313 def __bool__(self):
314 return 1
315 check(Spam())
316
317 class ESC[4;38;5;81mEggs:
318 def __len__(self):
319 return -1
320 self.assertRaises(ValueError, bool, Eggs())
321
322 def test_from_bytes(self):
323 self.assertIs(bool.from_bytes(b'\x00'*8, 'big'), False)
324 self.assertIs(bool.from_bytes(b'abcd', 'little'), True)
325
326 def test_sane_len(self):
327 # this test just tests our assumptions about __len__
328 # this will start failing if __len__ changes assertions
329 for badval in ['illegal', -1, 1 << 32]:
330 class ESC[4;38;5;81mA:
331 def __len__(self):
332 return badval
333 try:
334 bool(A())
335 except (Exception) as e_bool:
336 try:
337 len(A())
338 except (Exception) as e_len:
339 self.assertEqual(str(e_bool), str(e_len))
340
341 def test_blocked(self):
342 class ESC[4;38;5;81mA:
343 __bool__ = None
344 self.assertRaises(TypeError, bool, A())
345
346 class ESC[4;38;5;81mB:
347 def __len__(self):
348 return 10
349 __bool__ = None
350 self.assertRaises(TypeError, bool, B())
351
352 def test_real_and_imag(self):
353 self.assertEqual(True.real, 1)
354 self.assertEqual(True.imag, 0)
355 self.assertIs(type(True.real), int)
356 self.assertIs(type(True.imag), int)
357 self.assertEqual(False.real, 0)
358 self.assertEqual(False.imag, 0)
359 self.assertIs(type(False.real), int)
360 self.assertIs(type(False.imag), int)
361
362 def test_bool_called_at_least_once(self):
363 class ESC[4;38;5;81mX:
364 def __init__(self):
365 self.count = 0
366 def __bool__(self):
367 self.count += 1
368 return True
369
370 def f(x):
371 if x or True:
372 pass
373
374 x = X()
375 f(x)
376 self.assertGreaterEqual(x.count, 1)
377
378 def test_bool_new(self):
379 self.assertIs(bool.__new__(bool), False)
380 self.assertIs(bool.__new__(bool, 1), True)
381 self.assertIs(bool.__new__(bool, 0), False)
382 self.assertIs(bool.__new__(bool, False), False)
383 self.assertIs(bool.__new__(bool, True), True)
384
385
386 if __name__ == "__main__":
387 unittest.main()