test_bool.py revision 2f6d4da2784c79bfc8f3c38fda1ac4c95f6a3b11
1# Test properties of bool promised by PEP 285
2
3from test_support import verbose, TestFailed, TESTFN, vereq
4import os
5
6def veris(a, b):
7    if a is not b:
8        raise TestFailed, "%r is %r" % (a, b)
9
10def verisnot(a, b):
11    if a is b:
12        raise TestFailed, "%r is %r" % (a, b)
13
14try:
15    class C(bool):
16        pass
17except TypeError:
18    pass
19else:
20    raise TestFailed, "bool should not be subclassable"
21
22try:
23    int.__new__(bool, 0)
24except TypeError:
25    pass
26else:
27    raise TestFailed, "should not be able to create new bool instances"
28
29# checking tp_print slot
30fo = open(TESTFN, "wb")
31print >> fo, False, True
32fo.close()
33fo = open(TESTFN, "rb")
34vereq(fo.read(), 'False True\n')
35fo.close()
36os.remove(TESTFN)
37
38# checking repr and str
39vereq(str(False), 'False')
40vereq(str(True), 'True')
41vereq(repr(False), 'False')
42vereq(repr(True), 'True')
43vereq(eval(repr(False)), False)
44vereq(eval(repr(True)), True)
45
46vereq(int(False), 0)
47verisnot(int(False), False)
48vereq(int(True), 1)
49verisnot(int(True), True)
50
51vereq(+False, 0)
52verisnot(+False, False)
53vereq(-False, 0)
54verisnot(-False, False)
55vereq(abs(False), 0)
56verisnot(abs(False), False)
57vereq(+True, 1)
58verisnot(+True, True)
59vereq(-True, -1)
60vereq(abs(True), 1)
61verisnot(abs(True), True)
62vereq(~False, -1)
63vereq(~True, -2)
64
65vereq(False+2, 2)
66vereq(True+2, 3)
67vereq(2+False, 2)
68vereq(2+True, 3)
69
70vereq(False+False, 0)
71verisnot(False+False, False)
72vereq(False+True, 1)
73verisnot(False+True, True)
74vereq(True+False, 1)
75verisnot(True+False, True)
76vereq(True+True, 2)
77
78vereq(True-True, 0)
79verisnot(True-True, False)
80vereq(False-False, 0)
81verisnot(False-False, False)
82vereq(True-False, 1)
83verisnot(True-False, True)
84vereq(False-True, -1)
85
86vereq(True*1, 1)
87vereq(False*1, 0)
88verisnot(False*1, False)
89
90vereq(True/1, 1)
91verisnot(True/1, True)
92vereq(False/1, 0)
93verisnot(False/1, False)
94
95for b in False, True:
96    for i in 0, 1, 2:
97        vereq(b**i, int(b)**i)
98        verisnot(b**i, bool(int(b)**i))
99
100for a in False, True:
101    for b in False, True:
102        veris(a&b, bool(int(a)&int(b)))
103        veris(a|b, bool(int(a)|int(b)))
104        veris(a^b, bool(int(a)^int(b)))
105        vereq(a&int(b), int(a)&int(b))
106        verisnot(a&int(b), bool(int(a)&int(b)))
107        vereq(a|int(b), int(a)|int(b))
108        verisnot(a|int(b), bool(int(a)|int(b)))
109        vereq(a^int(b), int(a)^int(b))
110        verisnot(a^int(b), bool(int(a)^int(b)))
111        vereq(int(a)&b, int(a)&int(b))
112        verisnot(int(a)&b, bool(int(a)&int(b)))
113        vereq(int(a)|b, int(a)|int(b))
114        verisnot(int(a)|b, bool(int(a)|int(b)))
115        vereq(int(a)^b, int(a)^int(b))
116        verisnot(int(a)^b, bool(int(a)^int(b)))
117
118veris(1==1, True)
119veris(1==0, False)
120# XXX <, <=, >, >=, !=
121
122x = [1]
123veris(x is x, True)
124veris(x is not x, False)
125
126veris(1 in x, True)
127veris(0 in x, False)
128veris(1 not in x, False)
129veris(0 not in x, True)
130
131veris(not True, False)
132veris(not False, True)
133
134veris(bool(10), True)
135veris(bool(1), True)
136veris(bool(-1), True)
137veris(bool(0), False)
138veris(bool("hello"), True)
139veris(bool(""), False)
140
141veris(hasattr([], "append"), True)
142veris(hasattr([], "wobble"), False)
143
144veris(callable(len), True)
145veris(callable(1), False)
146
147veris(isinstance(True, bool), True)
148veris(isinstance(False, bool), True)
149veris(isinstance(True, int), True)
150veris(isinstance(False, int), True)
151veris(isinstance(1, bool), False)
152veris(isinstance(0, bool), False)
153
154veris(issubclass(bool, int), True)
155veris(issubclass(int, bool), False)
156
157veris({}.has_key(1), False)
158veris({1:1}.has_key(1), True)
159
160veris("xyz".endswith("z"), True)
161veris("xyz".endswith("x"), False)
162veris("xyz0123".isalnum(), True)
163veris("@#$%".isalnum(), False)
164veris("xyz".isalpha(), True)
165veris("@#$%".isalpha(), False)
166veris("0123".isdigit(), True)
167veris("xyz".isdigit(), False)
168veris("xyz".islower(), True)
169veris("XYZ".islower(), False)
170veris(" ".isspace(), True)
171veris("XYZ".isspace(), False)
172veris("X".istitle(), True)
173veris("x".istitle(), False)
174veris("XYZ".isupper(), True)
175veris("xyz".isupper(), False)
176veris("xyz".startswith("x"), True)
177veris("xyz".startswith("z"), False)
178
179veris(u"xyz".endswith(u"z"), True)
180veris(u"xyz".endswith(u"x"), False)
181veris(u"xyz0123".isalnum(), True)
182veris(u"@#$%".isalnum(), False)
183veris(u"xyz".isalpha(), True)
184veris(u"@#$%".isalpha(), False)
185veris(u"0123".isdecimal(), True)
186veris(u"xyz".isdecimal(), False)
187veris(u"0123".isdigit(), True)
188veris(u"xyz".isdigit(), False)
189veris(u"xyz".islower(), True)
190veris(u"XYZ".islower(), False)
191veris(u"0123".isnumeric(), True)
192veris(u"xyz".isnumeric(), False)
193veris(u" ".isspace(), True)
194veris(u"XYZ".isspace(), False)
195veris(u"X".istitle(), True)
196veris(u"x".istitle(), False)
197veris(u"XYZ".isupper(), True)
198veris(u"xyz".isupper(), False)
199veris(u"xyz".startswith(u"x"), True)
200veris(u"xyz".startswith(u"z"), False)
201
202f = file(TESTFN, "w")
203veris(f.closed, False)
204f.close()
205veris(f.closed, True)
206os.remove(TESTFN)
207
208import operator
209veris(operator.truth(0), False)
210veris(operator.truth(1), True)
211veris(operator.isCallable(0), False)
212veris(operator.isCallable(len), True)
213veris(operator.isNumberType(None), False)
214veris(operator.isNumberType(0), True)
215veris(operator.not_(1), False)
216veris(operator.not_(0), True)
217veris(operator.isSequenceType(0), False)
218veris(operator.isSequenceType([]), True)
219veris(operator.contains([], 1), False)
220veris(operator.contains([1], 1), True)
221veris(operator.isMappingType([]), False)
222veris(operator.isMappingType({}), True)
223veris(operator.lt(0, 0), False)
224veris(operator.lt(0, 1), True)
225
226import marshal
227veris(marshal.loads(marshal.dumps(True)), True)
228veris(marshal.loads(marshal.dumps(False)), False)
229
230import pickle
231veris(pickle.loads(pickle.dumps(True)), True)
232veris(pickle.loads(pickle.dumps(False)), False)
233veris(pickle.loads(pickle.dumps(True, True)), True)
234veris(pickle.loads(pickle.dumps(False, True)), False)
235
236import cPickle
237veris(cPickle.loads(cPickle.dumps(True)), True)
238veris(cPickle.loads(cPickle.dumps(False)), False)
239veris(cPickle.loads(cPickle.dumps(True, True)), True)
240veris(cPickle.loads(cPickle.dumps(False, True)), False)
241
242veris(pickle.loads(cPickle.dumps(True)), True)
243veris(pickle.loads(cPickle.dumps(False)), False)
244veris(pickle.loads(cPickle.dumps(True, True)), True)
245veris(pickle.loads(cPickle.dumps(False, True)), False)
246
247veris(cPickle.loads(pickle.dumps(True)), True)
248veris(cPickle.loads(pickle.dumps(False)), False)
249veris(cPickle.loads(pickle.dumps(True, True)), True)
250veris(cPickle.loads(pickle.dumps(False, True)), False)
251
252# Test for specific backwards-compatible pickle values
253vereq(pickle.dumps(True), "I01\n.")
254vereq(pickle.dumps(False), "I00\n.")
255vereq(cPickle.dumps(True), "I01\n.")
256vereq(cPickle.dumps(False), "I00\n.")
257vereq(pickle.dumps(True, True), "I01\n.")
258vereq(pickle.dumps(False, True), "I00\n.")
259vereq(cPickle.dumps(True, True), "I01\n.")
260vereq(cPickle.dumps(False, True), "I00\n.")
261
262if verbose:
263    print "All OK"
264