blob: e342d7b23eb72b85f9067f9fcec408e1d9314fc2 [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
Senthil Kumarance8e33a2010-01-08 19:04:16 +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):
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000165 self.assertIs(callable(len), True)
166 self.assertIs(callable(1), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000167
Walter Dörwalddbcede52003-04-25 10:22:01 +0000168 def test_isinstance(self):
169 self.assertIs(isinstance(True, bool), True)
170 self.assertIs(isinstance(False, bool), True)
171 self.assertIs(isinstance(True, int), True)
172 self.assertIs(isinstance(False, int), True)
173 self.assertIs(isinstance(1, bool), False)
174 self.assertIs(isinstance(0, bool), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000175
Walter Dörwalddbcede52003-04-25 10:22:01 +0000176 def test_issubclass(self):
177 self.assertIs(issubclass(bool, int), True)
178 self.assertIs(issubclass(int, bool), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000179
Walter Dörwalddbcede52003-04-25 10:22:01 +0000180 def test_haskey(self):
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000181 self.assertIs({}.has_key(1), False)
182 self.assertIs({1:1}.has_key(1), True)
Guido van Rossum5f820362002-04-03 23:01:45 +0000183
Walter Dörwalddbcede52003-04-25 10:22:01 +0000184 def test_string(self):
185 self.assertIs("xyz".endswith("z"), True)
186 self.assertIs("xyz".endswith("x"), False)
187 self.assertIs("xyz0123".isalnum(), True)
188 self.assertIs("@#$%".isalnum(), False)
189 self.assertIs("xyz".isalpha(), True)
190 self.assertIs("@#$%".isalpha(), False)
191 self.assertIs("0123".isdigit(), True)
192 self.assertIs("xyz".isdigit(), False)
193 self.assertIs("xyz".islower(), True)
194 self.assertIs("XYZ".islower(), False)
195 self.assertIs(" ".isspace(), True)
196 self.assertIs("XYZ".isspace(), False)
197 self.assertIs("X".istitle(), True)
198 self.assertIs("x".istitle(), False)
199 self.assertIs("XYZ".isupper(), True)
200 self.assertIs("xyz".isupper(), False)
201 self.assertIs("xyz".startswith("x"), True)
202 self.assertIs("xyz".startswith("z"), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000203
Walter Dörwald90437c02003-05-01 13:12:34 +0000204 if test_support.have_unicode:
Walter Dörwalddbcede52003-04-25 10:22:01 +0000205 self.assertIs(unicode("xyz", 'ascii').endswith(unicode("z", 'ascii')), True)
206 self.assertIs(unicode("xyz", 'ascii').endswith(unicode("x", 'ascii')), False)
207 self.assertIs(unicode("xyz0123", 'ascii').isalnum(), True)
208 self.assertIs(unicode("@#$%", 'ascii').isalnum(), False)
209 self.assertIs(unicode("xyz", 'ascii').isalpha(), True)
210 self.assertIs(unicode("@#$%", 'ascii').isalpha(), False)
211 self.assertIs(unicode("0123", 'ascii').isdecimal(), True)
212 self.assertIs(unicode("xyz", 'ascii').isdecimal(), False)
213 self.assertIs(unicode("0123", 'ascii').isdigit(), True)
214 self.assertIs(unicode("xyz", 'ascii').isdigit(), False)
215 self.assertIs(unicode("xyz", 'ascii').islower(), True)
216 self.assertIs(unicode("XYZ", 'ascii').islower(), False)
217 self.assertIs(unicode("0123", 'ascii').isnumeric(), True)
218 self.assertIs(unicode("xyz", 'ascii').isnumeric(), False)
219 self.assertIs(unicode(" ", 'ascii').isspace(), True)
220 self.assertIs(unicode("XYZ", 'ascii').isspace(), False)
221 self.assertIs(unicode("X", 'ascii').istitle(), True)
222 self.assertIs(unicode("x", 'ascii').istitle(), False)
223 self.assertIs(unicode("XYZ", 'ascii').isupper(), True)
224 self.assertIs(unicode("xyz", 'ascii').isupper(), False)
225 self.assertIs(unicode("xyz", 'ascii').startswith(unicode("x", 'ascii')), True)
226 self.assertIs(unicode("xyz", 'ascii').startswith(unicode("z", 'ascii')), False)
Guido van Rossum5f820362002-04-03 23:01:45 +0000227
Walter Dörwalddbcede52003-04-25 10:22:01 +0000228 def test_boolean(self):
229 self.assertEqual(True & 1, 1)
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000230 self.assertNotIsInstance(True & 1, bool)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000231 self.assertIs(True & True, True)
Guido van Rossum5f820362002-04-03 23:01:45 +0000232
Walter Dörwalddbcede52003-04-25 10:22:01 +0000233 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 Rossume2763392002-04-05 19:30:08 +0000236
Walter Dörwalddbcede52003-04-25 10:22:01 +0000237 self.assertEqual(True ^ 1, 0)
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, False)
240
241 def test_fileclosed(self):
242 try:
Walter Dörwald90437c02003-05-01 13:12:34 +0000243 f = file(test_support.TESTFN, "w")
Walter Dörwalddbcede52003-04-25 10:22:01 +0000244 self.assertIs(f.closed, False)
245 f.close()
246 self.assertIs(f.closed, True)
247 finally:
Walter Dörwald90437c02003-05-01 13:12:34 +0000248 os.remove(test_support.TESTFN)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000249
250 def test_operator(self):
251 import operator
252 self.assertIs(operator.truth(0), False)
253 self.assertIs(operator.truth(1), True)
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000254 self.assertIs(operator.isCallable(0), False)
255 self.assertIs(operator.isCallable(len), True)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000256 self.assertIs(operator.isNumberType(None), False)
257 self.assertIs(operator.isNumberType(0), True)
258 self.assertIs(operator.not_(1), False)
259 self.assertIs(operator.not_(0), True)
260 self.assertIs(operator.isSequenceType(0), False)
261 self.assertIs(operator.isSequenceType([]), True)
262 self.assertIs(operator.contains([], 1), False)
263 self.assertIs(operator.contains([1], 1), True)
264 self.assertIs(operator.isMappingType(1), False)
265 self.assertIs(operator.isMappingType({}), True)
266 self.assertIs(operator.lt(0, 0), False)
267 self.assertIs(operator.lt(0, 1), True)
268 self.assertIs(operator.is_(True, True), True)
269 self.assertIs(operator.is_(True, False), False)
270 self.assertIs(operator.is_not(True, True), False)
271 self.assertIs(operator.is_not(True, False), True)
272
273 def test_marshal(self):
274 import marshal
Walter Dörwald90437c02003-05-01 13:12:34 +0000275 self.assertIs(marshal.loads(marshal.dumps(True)), True)
276 self.assertIs(marshal.loads(marshal.dumps(False)), False)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000277
278 def test_pickle(self):
279 import pickle
280 self.assertIs(pickle.loads(pickle.dumps(True)), True)
281 self.assertIs(pickle.loads(pickle.dumps(False)), False)
282 self.assertIs(pickle.loads(pickle.dumps(True, True)), True)
283 self.assertIs(pickle.loads(pickle.dumps(False, True)), False)
284
285 def test_cpickle(self):
286 import cPickle
287 self.assertIs(cPickle.loads(cPickle.dumps(True)), True)
288 self.assertIs(cPickle.loads(cPickle.dumps(False)), False)
289 self.assertIs(cPickle.loads(cPickle.dumps(True, True)), True)
290 self.assertIs(cPickle.loads(cPickle.dumps(False, True)), False)
291
292 def test_mixedpickle(self):
293 import pickle, cPickle
294 self.assertIs(pickle.loads(cPickle.dumps(True)), True)
295 self.assertIs(pickle.loads(cPickle.dumps(False)), False)
296 self.assertIs(pickle.loads(cPickle.dumps(True, True)), True)
297 self.assertIs(pickle.loads(cPickle.dumps(False, True)), False)
298
299 self.assertIs(cPickle.loads(pickle.dumps(True)), True)
300 self.assertIs(cPickle.loads(pickle.dumps(False)), False)
301 self.assertIs(cPickle.loads(pickle.dumps(True, True)), True)
302 self.assertIs(cPickle.loads(pickle.dumps(False, True)), False)
303
304 def test_picklevalues(self):
305 import pickle, cPickle
306
307 # Test for specific backwards-compatible pickle values
308 self.assertEqual(pickle.dumps(True), "I01\n.")
309 self.assertEqual(pickle.dumps(False), "I00\n.")
310 self.assertEqual(cPickle.dumps(True), "I01\n.")
311 self.assertEqual(cPickle.dumps(False), "I00\n.")
312 self.assertEqual(pickle.dumps(True, True), "I01\n.")
313 self.assertEqual(pickle.dumps(False, True), "I00\n.")
314 self.assertEqual(cPickle.dumps(True, True), "I01\n.")
315 self.assertEqual(cPickle.dumps(False, True), "I00\n.")
316
Jeremy Hylton7ff55e62003-06-27 17:40:16 +0000317 def test_convert_to_bool(self):
318 # Verify that TypeError occurs when bad things are returned
319 # from __nonzero__(). This isn't really a bool test, but
320 # it's related.
321 check = lambda o: self.assertRaises(TypeError, bool, o)
322 class Foo(object):
323 def __nonzero__(self):
324 return self
325 check(Foo())
Tim Peters478c1052003-06-29 05:46:54 +0000326
Jeremy Hylton7ff55e62003-06-27 17:40:16 +0000327 class Bar(object):
328 def __nonzero__(self):
329 return "Yes"
330 check(Bar())
Tim Peters478c1052003-06-29 05:46:54 +0000331
Jeremy Hylton7ff55e62003-06-27 17:40:16 +0000332 class Baz(int):
333 def __nonzero__(self):
334 return self
335 check(Baz())
Tim Peters478c1052003-06-29 05:46:54 +0000336
Jeremy Hylton7ff55e62003-06-27 17:40:16 +0000337
Walter Dörwalddbcede52003-04-25 10:22:01 +0000338def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000339 test_support.run_unittest(BoolTest)
Walter Dörwalddbcede52003-04-25 10:22:01 +0000340
341if __name__ == "__main__":
342 test_main()