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