blob: 16cd1aa1ff80510ff6c74cc5720408c5438249c8 [file] [log] [blame]
Guido van Rossum5f820362002-04-03 23:01:45 +00001# Test properties of bool promised by PEP 285
2
Walter Dörwalddbcede52003-04-25 10:22:01 +00003import unittest
4from test import test_support
5
Martin v. Löwis2f6d4da2002-04-14 10:22:29 +00006import os
Guido van Rossum5f820362002-04-03 23:01:45 +00007
Walter Dörwalddbcede52003-04-25 10:22:01 +00008class BoolTest(unittest.TestCase):
Guido van Rossum5f820362002-04-03 23:01:45 +00009
Walter Dörwalddbcede52003-04-25 10:22:01 +000010 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")
Martin v. Löwis2f6d4da2002-04-14 10:22:29 +000018
Walter Dörwalddbcede52003-04-25 10:22:01 +000019 self.assertRaises(TypeError, int.__new__, bool, 0)
Guido van Rossum5f820362002-04-03 23:01:45 +000020
Walter Dörwalddbcede52003-04-25 10:22:01 +000021 def test_print(self):
22 try:
23 fo = open(test_support.TESTFN, "wb")
24 print >> fo, False, True
25 fo.close()
26 fo = open(test_support.TESTFN, "rb")
27 self.assertEqual(fo.read(), 'False True\n')
28 finally:
29 fo.close()
30 os.remove(test_support.TESTFN)
Guido van Rossum5f820362002-04-03 23:01:45 +000031
Walter Dörwalddbcede52003-04-25 10:22:01 +000032 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)
Guido van Rossum5f820362002-04-03 23:01:45 +000037
Walter Dörwalddbcede52003-04-25 10:22:01 +000038 def test_str(self):
39 self.assertEqual(str(False), 'False')
40 self.assertEqual(str(True), 'True')
Guido van Rossum5f820362002-04-03 23:01:45 +000041
Walter Dörwalddbcede52003-04-25 10:22:01 +000042 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)
Guido van Rossum5f820362002-04-03 23:01:45 +000047
Antoine Pitrou6032c252010-03-30 18:49:45 +000048 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_long(self):
Antoine Pitrou8f66efe2010-03-30 18:58:22 +000055 self.assertEqual(long(False), 0L)
56 self.assertIsNot(long(False), False)
57 self.assertEqual(long(True), 1L)
58 self.assertIsNot(long(True), True)
Antoine Pitrou6032c252010-03-30 18:49:45 +000059
Walter Dörwalddbcede52003-04-25 10:22:01 +000060 def test_math(self):
61 self.assertEqual(+False, 0)
62 self.assertIsNot(+False, False)
63 self.assertEqual(-False, 0)
64 self.assertIsNot(-False, False)
65 self.assertEqual(abs(False), 0)
66 self.assertIsNot(abs(False), False)
67 self.assertEqual(+True, 1)
68 self.assertIsNot(+True, True)
69 self.assertEqual(-True, -1)
70 self.assertEqual(abs(True), 1)
71 self.assertIsNot(abs(True), True)
72 self.assertEqual(~False, -1)
73 self.assertEqual(~True, -2)
Guido van Rossum5f820362002-04-03 23:01:45 +000074
Walter Dörwalddbcede52003-04-25 10:22:01 +000075 self.assertEqual(False+2, 2)
76 self.assertEqual(True+2, 3)
77 self.assertEqual(2+False, 2)
78 self.assertEqual(2+True, 3)
Guido van Rossum5f820362002-04-03 23:01:45 +000079
Walter Dörwalddbcede52003-04-25 10:22:01 +000080 self.assertEqual(False+False, 0)
81 self.assertIsNot(False+False, False)
82 self.assertEqual(False+True, 1)
83 self.assertIsNot(False+True, True)
84 self.assertEqual(True+False, 1)
85 self.assertIsNot(True+False, True)
86 self.assertEqual(True+True, 2)
Guido van Rossum5f820362002-04-03 23:01:45 +000087
Walter Dörwalddbcede52003-04-25 10:22:01 +000088 self.assertEqual(True-True, 0)
89 self.assertIsNot(True-True, False)
90 self.assertEqual(False-False, 0)
91 self.assertIsNot(False-False, False)
92 self.assertEqual(True-False, 1)
93 self.assertIsNot(True-False, True)
94 self.assertEqual(False-True, -1)
Guido van Rossum5f820362002-04-03 23:01:45 +000095
Walter Dörwalddbcede52003-04-25 10:22:01 +000096 self.assertEqual(True*1, 1)
97 self.assertEqual(False*1, 0)
98 self.assertIsNot(False*1, False)
Guido van Rossum5f820362002-04-03 23:01:45 +000099
Florent Xicluna07627882010-03-21 01:14:24 +0000100 self.assertEqual(True//1, 1)
101 self.assertIsNot(True//1, True)
102 self.assertEqual(False//1, 0)
103 self.assertIsNot(False//1, False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000104
Walter Dörwalddbcede52003-04-25 10:22:01 +0000105 for b in False, True:
106 for i in 0, 1, 2:
107 self.assertEqual(b**i, int(b)**i)
108 self.assertIsNot(b**i, bool(int(b)**i))
Guido van Rossum5f820362002-04-03 23:01:45 +0000109
Walter Dörwalddbcede52003-04-25 10:22:01 +0000110 for a in False, True:
111 for b in False, True:
112 self.assertIs(a&b, bool(int(a)&int(b)))
113 self.assertIs(a|b, bool(int(a)|int(b)))
114 self.assertIs(a^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(a|int(b), int(a)|int(b))
118 self.assertIsNot(a|int(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(int(a)&b, int(a)&int(b))
122 self.assertIsNot(int(a)&b, bool(int(a)&int(b)))
123 self.assertEqual(int(a)|b, int(a)|int(b))
124 self.assertIsNot(int(a)|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)))
Guido van Rossum5f820362002-04-03 23:01:45 +0000127
Walter Dörwalddbcede52003-04-25 10:22:01 +0000128 self.assertIs(1==1, True)
129 self.assertIs(1==0, False)
130 self.assertIs(0<1, True)
131 self.assertIs(1<0, False)
132 self.assertIs(0<=0, True)
133 self.assertIs(1<=0, False)
134 self.assertIs(1>0, True)
135 self.assertIs(1>1, False)
136 self.assertIs(1>=1, True)
137 self.assertIs(0>=1, False)
138 self.assertIs(0!=1, True)
139 self.assertIs(0!=0, False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000140
Walter Dörwalddbcede52003-04-25 10:22:01 +0000141 x = [1]
142 self.assertIs(x is x, True)
143 self.assertIs(x is not x, False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000144
Walter Dörwalddbcede52003-04-25 10:22:01 +0000145 self.assertIs(1 in x, True)
146 self.assertIs(0 in x, False)
147 self.assertIs(1 not in x, False)
148 self.assertIs(0 not in x, True)
Guido van Rossum5f820362002-04-03 23:01:45 +0000149
Walter Dörwalddbcede52003-04-25 10:22:01 +0000150 x = {1: 2}
151 self.assertIs(x is x, True)
152 self.assertIs(x is not x, False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000153
Walter Dörwalddbcede52003-04-25 10:22:01 +0000154 self.assertIs(1 in x, True)
155 self.assertIs(0 in x, False)
156 self.assertIs(1 not in x, False)
157 self.assertIs(0 not in x, True)
Guido van Rossum5f820362002-04-03 23:01:45 +0000158
Walter Dörwalddbcede52003-04-25 10:22:01 +0000159 self.assertIs(not True, False)
160 self.assertIs(not False, True)
Guido van Rossum5f820362002-04-03 23:01:45 +0000161
Walter Dörwalddbcede52003-04-25 10:22:01 +0000162 def test_convert(self):
163 self.assertRaises(TypeError, bool, 42, 42)
164 self.assertIs(bool(10), True)
165 self.assertIs(bool(1), True)
166 self.assertIs(bool(-1), True)
167 self.assertIs(bool(0), False)
168 self.assertIs(bool("hello"), True)
169 self.assertIs(bool(""), False)
170 self.assertIs(bool(), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000171
Antoine Pitrou6032c252010-03-30 18:49:45 +0000172 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
Walter Dörwalddbcede52003-04-25 10:22:01 +0000178 def test_hasattr(self):
179 self.assertIs(hasattr([], "append"), True)
180 self.assertIs(hasattr([], "wobble"), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000181
Walter Dörwalddbcede52003-04-25 10:22:01 +0000182 def test_callable(self):
Ezio Melotti152d61a2011-11-06 17:17:52 +0200183 self.assertIs(callable(len), True)
184 self.assertIs(callable(1), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000185
Walter Dörwalddbcede52003-04-25 10:22:01 +0000186 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)
Guido van Rossum5f820362002-04-03 23:01:45 +0000193
Walter Dörwalddbcede52003-04-25 10:22:01 +0000194 def test_issubclass(self):
195 self.assertIs(issubclass(bool, int), True)
196 self.assertIs(issubclass(int, bool), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000197
Walter Dörwalddbcede52003-04-25 10:22:01 +0000198 def test_haskey(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000199 self.assertIs(1 in {}, False)
200 self.assertIs(1 in {1:1}, True)
201 with test_support.check_py3k_warnings():
202 self.assertIs({}.has_key(1), False)
203 self.assertIs({1:1}.has_key(1), True)
Guido van Rossum5f820362002-04-03 23:01:45 +0000204
Walter Dörwalddbcede52003-04-25 10:22:01 +0000205 def test_string(self):
206 self.assertIs("xyz".endswith("z"), True)
207 self.assertIs("xyz".endswith("x"), False)
208 self.assertIs("xyz0123".isalnum(), True)
209 self.assertIs("@#$%".isalnum(), False)
210 self.assertIs("xyz".isalpha(), True)
211 self.assertIs("@#$%".isalpha(), False)
212 self.assertIs("0123".isdigit(), True)
213 self.assertIs("xyz".isdigit(), False)
214 self.assertIs("xyz".islower(), True)
215 self.assertIs("XYZ".islower(), False)
216 self.assertIs(" ".isspace(), True)
217 self.assertIs("XYZ".isspace(), False)
218 self.assertIs("X".istitle(), True)
219 self.assertIs("x".istitle(), False)
220 self.assertIs("XYZ".isupper(), True)
221 self.assertIs("xyz".isupper(), False)
222 self.assertIs("xyz".startswith("x"), True)
223 self.assertIs("xyz".startswith("z"), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000224
Walter Dörwald90437c02003-05-01 13:12:34 +0000225 if test_support.have_unicode:
Walter Dörwalddbcede52003-04-25 10:22:01 +0000226 self.assertIs(unicode("xyz", 'ascii').endswith(unicode("z", 'ascii')), True)
227 self.assertIs(unicode("xyz", 'ascii').endswith(unicode("x", 'ascii')), False)
228 self.assertIs(unicode("xyz0123", 'ascii').isalnum(), True)
229 self.assertIs(unicode("@#$%", 'ascii').isalnum(), False)
230 self.assertIs(unicode("xyz", 'ascii').isalpha(), True)
231 self.assertIs(unicode("@#$%", 'ascii').isalpha(), False)
232 self.assertIs(unicode("0123", 'ascii').isdecimal(), True)
233 self.assertIs(unicode("xyz", 'ascii').isdecimal(), False)
234 self.assertIs(unicode("0123", 'ascii').isdigit(), True)
235 self.assertIs(unicode("xyz", 'ascii').isdigit(), False)
236 self.assertIs(unicode("xyz", 'ascii').islower(), True)
237 self.assertIs(unicode("XYZ", 'ascii').islower(), False)
238 self.assertIs(unicode("0123", 'ascii').isnumeric(), True)
239 self.assertIs(unicode("xyz", 'ascii').isnumeric(), False)
240 self.assertIs(unicode(" ", 'ascii').isspace(), True)
241 self.assertIs(unicode("XYZ", 'ascii').isspace(), False)
242 self.assertIs(unicode("X", 'ascii').istitle(), True)
243 self.assertIs(unicode("x", 'ascii').istitle(), False)
244 self.assertIs(unicode("XYZ", 'ascii').isupper(), True)
245 self.assertIs(unicode("xyz", 'ascii').isupper(), False)
246 self.assertIs(unicode("xyz", 'ascii').startswith(unicode("x", 'ascii')), True)
247 self.assertIs(unicode("xyz", 'ascii').startswith(unicode("z", 'ascii')), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000248
Walter Dörwalddbcede52003-04-25 10:22:01 +0000249 def test_boolean(self):
250 self.assertEqual(True & 1, 1)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000251 self.assertNotIsInstance(True & 1, bool)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000252 self.assertIs(True & True, True)
Guido van Rossum5f820362002-04-03 23:01:45 +0000253
Walter Dörwalddbcede52003-04-25 10:22:01 +0000254 self.assertEqual(True | 1, 1)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000255 self.assertNotIsInstance(True | 1, bool)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000256 self.assertIs(True | True, True)
Guido van Rossume2763392002-04-05 19:30:08 +0000257
Walter Dörwalddbcede52003-04-25 10:22:01 +0000258 self.assertEqual(True ^ 1, 0)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000259 self.assertNotIsInstance(True ^ 1, bool)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000260 self.assertIs(True ^ True, False)
261
262 def test_fileclosed(self):
263 try:
Walter Dörwald90437c02003-05-01 13:12:34 +0000264 f = file(test_support.TESTFN, "w")
Walter Dörwalddbcede52003-04-25 10:22:01 +0000265 self.assertIs(f.closed, False)
266 f.close()
267 self.assertIs(f.closed, True)
268 finally:
Walter Dörwald90437c02003-05-01 13:12:34 +0000269 os.remove(test_support.TESTFN)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000270
Antoine Pitrou6032c252010-03-30 18:49:45 +0000271 def test_types(self):
272 # types are always true.
273 for t in [bool, complex, dict, file, float, int, list, long, object,
274 set, str, tuple, type]:
275 self.assertIs(bool(t), True)
276
Walter Dörwalddbcede52003-04-25 10:22:01 +0000277 def test_operator(self):
278 import operator
279 self.assertIs(operator.truth(0), False)
280 self.assertIs(operator.truth(1), True)
Florent Xicluna07627882010-03-21 01:14:24 +0000281 with test_support.check_py3k_warnings():
282 self.assertIs(operator.isCallable(0), False)
283 self.assertIs(operator.isCallable(len), True)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000284 self.assertIs(operator.isNumberType(None), False)
285 self.assertIs(operator.isNumberType(0), True)
286 self.assertIs(operator.not_(1), False)
287 self.assertIs(operator.not_(0), True)
288 self.assertIs(operator.isSequenceType(0), False)
289 self.assertIs(operator.isSequenceType([]), True)
290 self.assertIs(operator.contains([], 1), False)
291 self.assertIs(operator.contains([1], 1), True)
292 self.assertIs(operator.isMappingType(1), False)
293 self.assertIs(operator.isMappingType({}), True)
294 self.assertIs(operator.lt(0, 0), False)
295 self.assertIs(operator.lt(0, 1), True)
296 self.assertIs(operator.is_(True, True), True)
297 self.assertIs(operator.is_(True, False), False)
298 self.assertIs(operator.is_not(True, True), False)
299 self.assertIs(operator.is_not(True, False), True)
300
301 def test_marshal(self):
302 import marshal
Walter Dörwald90437c02003-05-01 13:12:34 +0000303 self.assertIs(marshal.loads(marshal.dumps(True)), True)
304 self.assertIs(marshal.loads(marshal.dumps(False)), False)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000305
306 def test_pickle(self):
307 import pickle
308 self.assertIs(pickle.loads(pickle.dumps(True)), True)
309 self.assertIs(pickle.loads(pickle.dumps(False)), False)
310 self.assertIs(pickle.loads(pickle.dumps(True, True)), True)
311 self.assertIs(pickle.loads(pickle.dumps(False, True)), False)
312
313 def test_cpickle(self):
314 import cPickle
315 self.assertIs(cPickle.loads(cPickle.dumps(True)), True)
316 self.assertIs(cPickle.loads(cPickle.dumps(False)), False)
317 self.assertIs(cPickle.loads(cPickle.dumps(True, True)), True)
318 self.assertIs(cPickle.loads(cPickle.dumps(False, True)), False)
319
320 def test_mixedpickle(self):
321 import pickle, cPickle
322 self.assertIs(pickle.loads(cPickle.dumps(True)), True)
323 self.assertIs(pickle.loads(cPickle.dumps(False)), False)
324 self.assertIs(pickle.loads(cPickle.dumps(True, True)), True)
325 self.assertIs(pickle.loads(cPickle.dumps(False, True)), False)
326
327 self.assertIs(cPickle.loads(pickle.dumps(True)), True)
328 self.assertIs(cPickle.loads(pickle.dumps(False)), False)
329 self.assertIs(cPickle.loads(pickle.dumps(True, True)), True)
330 self.assertIs(cPickle.loads(pickle.dumps(False, True)), False)
331
332 def test_picklevalues(self):
333 import pickle, cPickle
334
335 # Test for specific backwards-compatible pickle values
336 self.assertEqual(pickle.dumps(True), "I01\n.")
337 self.assertEqual(pickle.dumps(False), "I00\n.")
338 self.assertEqual(cPickle.dumps(True), "I01\n.")
339 self.assertEqual(cPickle.dumps(False), "I00\n.")
340 self.assertEqual(pickle.dumps(True, True), "I01\n.")
341 self.assertEqual(pickle.dumps(False, True), "I00\n.")
342 self.assertEqual(cPickle.dumps(True, True), "I01\n.")
343 self.assertEqual(cPickle.dumps(False, True), "I00\n.")
344
Jeremy Hylton7ff55e62003-06-27 17:40:16 +0000345 def test_convert_to_bool(self):
346 # Verify that TypeError occurs when bad things are returned
347 # from __nonzero__(). This isn't really a bool test, but
348 # it's related.
349 check = lambda o: self.assertRaises(TypeError, bool, o)
350 class Foo(object):
351 def __nonzero__(self):
352 return self
353 check(Foo())
Tim Peters478c1052003-06-29 05:46:54 +0000354
Jeremy Hylton7ff55e62003-06-27 17:40:16 +0000355 class Bar(object):
356 def __nonzero__(self):
357 return "Yes"
358 check(Bar())
Tim Peters478c1052003-06-29 05:46:54 +0000359
Jeremy Hylton7ff55e62003-06-27 17:40:16 +0000360 class Baz(int):
361 def __nonzero__(self):
362 return self
363 check(Baz())
Tim Peters478c1052003-06-29 05:46:54 +0000364
Jeremy Hylton7ff55e62003-06-27 17:40:16 +0000365
Walter Dörwalddbcede52003-04-25 10:22:01 +0000366def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000367 test_support.run_unittest(BoolTest)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000368
369if __name__ == "__main__":
370 test_main()