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