blob: 7464c7152fa823371bd09dab64f7fbbb49674fae [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
Walter Dörwalddbcede52003-04-25 10:22:01 +000048 def test_math(self):
49 self.assertEqual(+False, 0)
50 self.assertIsNot(+False, False)
51 self.assertEqual(-False, 0)
52 self.assertIsNot(-False, False)
53 self.assertEqual(abs(False), 0)
54 self.assertIsNot(abs(False), False)
55 self.assertEqual(+True, 1)
56 self.assertIsNot(+True, True)
57 self.assertEqual(-True, -1)
58 self.assertEqual(abs(True), 1)
59 self.assertIsNot(abs(True), True)
60 self.assertEqual(~False, -1)
61 self.assertEqual(~True, -2)
Guido van Rossum5f820362002-04-03 23:01:45 +000062
Walter Dörwalddbcede52003-04-25 10:22:01 +000063 self.assertEqual(False+2, 2)
64 self.assertEqual(True+2, 3)
65 self.assertEqual(2+False, 2)
66 self.assertEqual(2+True, 3)
Guido van Rossum5f820362002-04-03 23:01:45 +000067
Walter Dörwalddbcede52003-04-25 10:22:01 +000068 self.assertEqual(False+False, 0)
69 self.assertIsNot(False+False, False)
70 self.assertEqual(False+True, 1)
71 self.assertIsNot(False+True, True)
72 self.assertEqual(True+False, 1)
73 self.assertIsNot(True+False, True)
74 self.assertEqual(True+True, 2)
Guido van Rossum5f820362002-04-03 23:01:45 +000075
Walter Dörwalddbcede52003-04-25 10:22:01 +000076 self.assertEqual(True-True, 0)
77 self.assertIsNot(True-True, False)
78 self.assertEqual(False-False, 0)
79 self.assertIsNot(False-False, False)
80 self.assertEqual(True-False, 1)
81 self.assertIsNot(True-False, True)
82 self.assertEqual(False-True, -1)
Guido van Rossum5f820362002-04-03 23:01:45 +000083
Walter Dörwalddbcede52003-04-25 10:22:01 +000084 self.assertEqual(True*1, 1)
85 self.assertEqual(False*1, 0)
86 self.assertIsNot(False*1, False)
Guido van Rossum5f820362002-04-03 23:01:45 +000087
Florent Xicluna07627882010-03-21 01:14:24 +000088 self.assertEqual(True//1, 1)
89 self.assertIsNot(True//1, True)
90 self.assertEqual(False//1, 0)
91 self.assertIsNot(False//1, False)
Guido van Rossum5f820362002-04-03 23:01:45 +000092
Walter Dörwalddbcede52003-04-25 10:22:01 +000093 for b in False, True:
94 for i in 0, 1, 2:
95 self.assertEqual(b**i, int(b)**i)
96 self.assertIsNot(b**i, bool(int(b)**i))
Guido van Rossum5f820362002-04-03 23:01:45 +000097
Walter Dörwalddbcede52003-04-25 10:22:01 +000098 for a in False, True:
99 for b in False, True:
100 self.assertIs(a&b, bool(int(a)&int(b)))
101 self.assertIs(a|b, bool(int(a)|int(b)))
102 self.assertIs(a^b, bool(int(a)^int(b)))
103 self.assertEqual(a&int(b), int(a)&int(b))
104 self.assertIsNot(a&int(b), bool(int(a)&int(b)))
105 self.assertEqual(a|int(b), int(a)|int(b))
106 self.assertIsNot(a|int(b), bool(int(a)|int(b)))
107 self.assertEqual(a^int(b), int(a)^int(b))
108 self.assertIsNot(a^int(b), bool(int(a)^int(b)))
109 self.assertEqual(int(a)&b, int(a)&int(b))
110 self.assertIsNot(int(a)&b, bool(int(a)&int(b)))
111 self.assertEqual(int(a)|b, int(a)|int(b))
112 self.assertIsNot(int(a)|b, bool(int(a)|int(b)))
113 self.assertEqual(int(a)^b, int(a)^int(b))
114 self.assertIsNot(int(a)^b, bool(int(a)^int(b)))
Guido van Rossum5f820362002-04-03 23:01:45 +0000115
Walter Dörwalddbcede52003-04-25 10:22:01 +0000116 self.assertIs(1==1, True)
117 self.assertIs(1==0, False)
118 self.assertIs(0<1, True)
119 self.assertIs(1<0, False)
120 self.assertIs(0<=0, True)
121 self.assertIs(1<=0, False)
122 self.assertIs(1>0, True)
123 self.assertIs(1>1, False)
124 self.assertIs(1>=1, True)
125 self.assertIs(0>=1, False)
126 self.assertIs(0!=1, True)
127 self.assertIs(0!=0, False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000128
Walter Dörwalddbcede52003-04-25 10:22:01 +0000129 x = [1]
130 self.assertIs(x is x, True)
131 self.assertIs(x is not x, False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000132
Walter Dörwalddbcede52003-04-25 10:22:01 +0000133 self.assertIs(1 in x, True)
134 self.assertIs(0 in x, False)
135 self.assertIs(1 not in x, False)
136 self.assertIs(0 not in x, True)
Guido van Rossum5f820362002-04-03 23:01:45 +0000137
Walter Dörwalddbcede52003-04-25 10:22:01 +0000138 x = {1: 2}
139 self.assertIs(x is x, True)
140 self.assertIs(x is not x, False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000141
Walter Dörwalddbcede52003-04-25 10:22:01 +0000142 self.assertIs(1 in x, True)
143 self.assertIs(0 in x, False)
144 self.assertIs(1 not in x, False)
145 self.assertIs(0 not in x, True)
Guido van Rossum5f820362002-04-03 23:01:45 +0000146
Walter Dörwalddbcede52003-04-25 10:22:01 +0000147 self.assertIs(not True, False)
148 self.assertIs(not False, True)
Guido van Rossum5f820362002-04-03 23:01:45 +0000149
Walter Dörwalddbcede52003-04-25 10:22:01 +0000150 def test_convert(self):
151 self.assertRaises(TypeError, bool, 42, 42)
152 self.assertIs(bool(10), True)
153 self.assertIs(bool(1), True)
154 self.assertIs(bool(-1), True)
155 self.assertIs(bool(0), False)
156 self.assertIs(bool("hello"), True)
157 self.assertIs(bool(""), False)
158 self.assertIs(bool(), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000159
Walter Dörwalddbcede52003-04-25 10:22:01 +0000160 def test_hasattr(self):
161 self.assertIs(hasattr([], "append"), True)
162 self.assertIs(hasattr([], "wobble"), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000163
Walter Dörwalddbcede52003-04-25 10:22:01 +0000164 def test_callable(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000165 with test_support.check_py3k_warnings():
166 self.assertIs(callable(len), True)
167 self.assertIs(callable(1), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000168
Walter Dörwalddbcede52003-04-25 10:22:01 +0000169 def test_isinstance(self):
170 self.assertIs(isinstance(True, bool), True)
171 self.assertIs(isinstance(False, bool), True)
172 self.assertIs(isinstance(True, int), True)
173 self.assertIs(isinstance(False, int), True)
174 self.assertIs(isinstance(1, bool), False)
175 self.assertIs(isinstance(0, bool), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000176
Walter Dörwalddbcede52003-04-25 10:22:01 +0000177 def test_issubclass(self):
178 self.assertIs(issubclass(bool, int), True)
179 self.assertIs(issubclass(int, bool), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000180
Walter Dörwalddbcede52003-04-25 10:22:01 +0000181 def test_haskey(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000182 self.assertIs(1 in {}, False)
183 self.assertIs(1 in {1:1}, True)
184 with test_support.check_py3k_warnings():
185 self.assertIs({}.has_key(1), False)
186 self.assertIs({1:1}.has_key(1), True)
Guido van Rossum5f820362002-04-03 23:01:45 +0000187
Walter Dörwalddbcede52003-04-25 10:22:01 +0000188 def test_string(self):
189 self.assertIs("xyz".endswith("z"), True)
190 self.assertIs("xyz".endswith("x"), False)
191 self.assertIs("xyz0123".isalnum(), True)
192 self.assertIs("@#$%".isalnum(), False)
193 self.assertIs("xyz".isalpha(), True)
194 self.assertIs("@#$%".isalpha(), False)
195 self.assertIs("0123".isdigit(), True)
196 self.assertIs("xyz".isdigit(), False)
197 self.assertIs("xyz".islower(), True)
198 self.assertIs("XYZ".islower(), False)
199 self.assertIs(" ".isspace(), True)
200 self.assertIs("XYZ".isspace(), False)
201 self.assertIs("X".istitle(), True)
202 self.assertIs("x".istitle(), False)
203 self.assertIs("XYZ".isupper(), True)
204 self.assertIs("xyz".isupper(), False)
205 self.assertIs("xyz".startswith("x"), True)
206 self.assertIs("xyz".startswith("z"), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000207
Walter Dörwald90437c02003-05-01 13:12:34 +0000208 if test_support.have_unicode:
Walter Dörwalddbcede52003-04-25 10:22:01 +0000209 self.assertIs(unicode("xyz", 'ascii').endswith(unicode("z", 'ascii')), True)
210 self.assertIs(unicode("xyz", 'ascii').endswith(unicode("x", 'ascii')), False)
211 self.assertIs(unicode("xyz0123", 'ascii').isalnum(), True)
212 self.assertIs(unicode("@#$%", 'ascii').isalnum(), False)
213 self.assertIs(unicode("xyz", 'ascii').isalpha(), True)
214 self.assertIs(unicode("@#$%", 'ascii').isalpha(), False)
215 self.assertIs(unicode("0123", 'ascii').isdecimal(), True)
216 self.assertIs(unicode("xyz", 'ascii').isdecimal(), False)
217 self.assertIs(unicode("0123", 'ascii').isdigit(), True)
218 self.assertIs(unicode("xyz", 'ascii').isdigit(), False)
219 self.assertIs(unicode("xyz", 'ascii').islower(), True)
220 self.assertIs(unicode("XYZ", 'ascii').islower(), False)
221 self.assertIs(unicode("0123", 'ascii').isnumeric(), True)
222 self.assertIs(unicode("xyz", 'ascii').isnumeric(), False)
223 self.assertIs(unicode(" ", 'ascii').isspace(), True)
224 self.assertIs(unicode("XYZ", 'ascii').isspace(), False)
225 self.assertIs(unicode("X", 'ascii').istitle(), True)
226 self.assertIs(unicode("x", 'ascii').istitle(), False)
227 self.assertIs(unicode("XYZ", 'ascii').isupper(), True)
228 self.assertIs(unicode("xyz", 'ascii').isupper(), False)
229 self.assertIs(unicode("xyz", 'ascii').startswith(unicode("x", 'ascii')), True)
230 self.assertIs(unicode("xyz", 'ascii').startswith(unicode("z", 'ascii')), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000231
Walter Dörwalddbcede52003-04-25 10:22:01 +0000232 def test_boolean(self):
233 self.assertEqual(True & 1, 1)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000234 self.assertNotIsInstance(True & 1, bool)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000235 self.assertIs(True & True, True)
Guido van Rossum5f820362002-04-03 23:01:45 +0000236
Walter Dörwalddbcede52003-04-25 10:22:01 +0000237 self.assertEqual(True | 1, 1)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000238 self.assertNotIsInstance(True | 1, bool)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000239 self.assertIs(True | True, True)
Guido van Rossume2763392002-04-05 19:30:08 +0000240
Walter Dörwalddbcede52003-04-25 10:22:01 +0000241 self.assertEqual(True ^ 1, 0)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000242 self.assertNotIsInstance(True ^ 1, bool)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000243 self.assertIs(True ^ True, False)
244
245 def test_fileclosed(self):
246 try:
Walter Dörwald90437c02003-05-01 13:12:34 +0000247 f = file(test_support.TESTFN, "w")
Walter Dörwalddbcede52003-04-25 10:22:01 +0000248 self.assertIs(f.closed, False)
249 f.close()
250 self.assertIs(f.closed, True)
251 finally:
Walter Dörwald90437c02003-05-01 13:12:34 +0000252 os.remove(test_support.TESTFN)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000253
254 def test_operator(self):
255 import operator
256 self.assertIs(operator.truth(0), False)
257 self.assertIs(operator.truth(1), True)
Florent Xicluna07627882010-03-21 01:14:24 +0000258 with test_support.check_py3k_warnings():
259 self.assertIs(operator.isCallable(0), False)
260 self.assertIs(operator.isCallable(len), True)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000261 self.assertIs(operator.isNumberType(None), False)
262 self.assertIs(operator.isNumberType(0), True)
263 self.assertIs(operator.not_(1), False)
264 self.assertIs(operator.not_(0), True)
265 self.assertIs(operator.isSequenceType(0), False)
266 self.assertIs(operator.isSequenceType([]), True)
267 self.assertIs(operator.contains([], 1), False)
268 self.assertIs(operator.contains([1], 1), True)
269 self.assertIs(operator.isMappingType(1), False)
270 self.assertIs(operator.isMappingType({}), True)
271 self.assertIs(operator.lt(0, 0), False)
272 self.assertIs(operator.lt(0, 1), True)
273 self.assertIs(operator.is_(True, True), True)
274 self.assertIs(operator.is_(True, False), False)
275 self.assertIs(operator.is_not(True, True), False)
276 self.assertIs(operator.is_not(True, False), True)
277
278 def test_marshal(self):
279 import marshal
Walter Dörwald90437c02003-05-01 13:12:34 +0000280 self.assertIs(marshal.loads(marshal.dumps(True)), True)
281 self.assertIs(marshal.loads(marshal.dumps(False)), False)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000282
283 def test_pickle(self):
284 import pickle
285 self.assertIs(pickle.loads(pickle.dumps(True)), True)
286 self.assertIs(pickle.loads(pickle.dumps(False)), False)
287 self.assertIs(pickle.loads(pickle.dumps(True, True)), True)
288 self.assertIs(pickle.loads(pickle.dumps(False, True)), False)
289
290 def test_cpickle(self):
291 import cPickle
292 self.assertIs(cPickle.loads(cPickle.dumps(True)), True)
293 self.assertIs(cPickle.loads(cPickle.dumps(False)), False)
294 self.assertIs(cPickle.loads(cPickle.dumps(True, True)), True)
295 self.assertIs(cPickle.loads(cPickle.dumps(False, True)), False)
296
297 def test_mixedpickle(self):
298 import pickle, cPickle
299 self.assertIs(pickle.loads(cPickle.dumps(True)), True)
300 self.assertIs(pickle.loads(cPickle.dumps(False)), False)
301 self.assertIs(pickle.loads(cPickle.dumps(True, True)), True)
302 self.assertIs(pickle.loads(cPickle.dumps(False, True)), False)
303
304 self.assertIs(cPickle.loads(pickle.dumps(True)), True)
305 self.assertIs(cPickle.loads(pickle.dumps(False)), False)
306 self.assertIs(cPickle.loads(pickle.dumps(True, True)), True)
307 self.assertIs(cPickle.loads(pickle.dumps(False, True)), False)
308
309 def test_picklevalues(self):
310 import pickle, cPickle
311
312 # Test for specific backwards-compatible pickle values
313 self.assertEqual(pickle.dumps(True), "I01\n.")
314 self.assertEqual(pickle.dumps(False), "I00\n.")
315 self.assertEqual(cPickle.dumps(True), "I01\n.")
316 self.assertEqual(cPickle.dumps(False), "I00\n.")
317 self.assertEqual(pickle.dumps(True, True), "I01\n.")
318 self.assertEqual(pickle.dumps(False, True), "I00\n.")
319 self.assertEqual(cPickle.dumps(True, True), "I01\n.")
320 self.assertEqual(cPickle.dumps(False, True), "I00\n.")
321
Jeremy Hylton7ff55e62003-06-27 17:40:16 +0000322 def test_convert_to_bool(self):
323 # Verify that TypeError occurs when bad things are returned
324 # from __nonzero__(). This isn't really a bool test, but
325 # it's related.
326 check = lambda o: self.assertRaises(TypeError, bool, o)
327 class Foo(object):
328 def __nonzero__(self):
329 return self
330 check(Foo())
Tim Peters478c1052003-06-29 05:46:54 +0000331
Jeremy Hylton7ff55e62003-06-27 17:40:16 +0000332 class Bar(object):
333 def __nonzero__(self):
334 return "Yes"
335 check(Bar())
Tim Peters478c1052003-06-29 05:46:54 +0000336
Jeremy Hylton7ff55e62003-06-27 17:40:16 +0000337 class Baz(int):
338 def __nonzero__(self):
339 return self
340 check(Baz())
Tim Peters478c1052003-06-29 05:46:54 +0000341
Jeremy Hylton7ff55e62003-06-27 17:40:16 +0000342
Walter Dörwalddbcede52003-04-25 10:22:01 +0000343def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000344 test_support.run_unittest(BoolTest)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000345
346if __name__ == "__main__":
347 test_main()