test_bool.py revision aa86e35c524275e1f6cca91c1f8fcfc15e8d8b30
1# Test properties of bool promised by PEP 285
2
3from test.test_support import verbose, TestFailed, TESTFN, vereq, have_unicode
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)
140veris(bool(), False)
141
142veris(hasattr([], "append"), True)
143veris(hasattr([], "wobble"), False)
144
145veris(callable(len), True)
146veris(callable(1), False)
147
148veris(isinstance(True, bool), True)
149veris(isinstance(False, bool), True)
150veris(isinstance(True, int), True)
151veris(isinstance(False, int), True)
152veris(isinstance(1, bool), False)
153veris(isinstance(0, bool), False)
154
155veris(issubclass(bool, int), True)
156veris(issubclass(int, bool), False)
157
158veris({}.has_key(1), False)
159veris({1:1}.has_key(1), True)
160
161veris("xyz".endswith("z"), True)
162veris("xyz".endswith("x"), False)
163veris("xyz0123".isalnum(), True)
164veris("@#$%".isalnum(), False)
165veris("xyz".isalpha(), True)
166veris("@#$%".isalpha(), False)
167veris("0123".isdigit(), True)
168veris("xyz".isdigit(), False)
169veris("xyz".islower(), True)
170veris("XYZ".islower(), False)
171veris(" ".isspace(), True)
172veris("XYZ".isspace(), False)
173veris("X".istitle(), True)
174veris("x".istitle(), False)
175veris("XYZ".isupper(), True)
176veris("xyz".isupper(), False)
177veris("xyz".startswith("x"), True)
178veris("xyz".startswith("z"), False)
179
180if have_unicode:
181    veris(unicode("xyz", 'ascii').endswith(unicode("z", 'ascii')), True)
182    veris(unicode("xyz", 'ascii').endswith(unicode("x", 'ascii')), False)
183    veris(unicode("xyz0123", 'ascii').isalnum(), True)
184    veris(unicode("@#$%", 'ascii').isalnum(), False)
185    veris(unicode("xyz", 'ascii').isalpha(), True)
186    veris(unicode("@#$%", 'ascii').isalpha(), False)
187    veris(unicode("0123", 'ascii').isdecimal(), True)
188    veris(unicode("xyz", 'ascii').isdecimal(), False)
189    veris(unicode("0123", 'ascii').isdigit(), True)
190    veris(unicode("xyz", 'ascii').isdigit(), False)
191    veris(unicode("xyz", 'ascii').islower(), True)
192    veris(unicode("XYZ", 'ascii').islower(), False)
193    veris(unicode("0123", 'ascii').isnumeric(), True)
194    veris(unicode("xyz", 'ascii').isnumeric(), False)
195    veris(unicode(" ", 'ascii').isspace(), True)
196    veris(unicode("XYZ", 'ascii').isspace(), False)
197    veris(unicode("X", 'ascii').istitle(), True)
198    veris(unicode("x", 'ascii').istitle(), False)
199    veris(unicode("XYZ", 'ascii').isupper(), True)
200    veris(unicode("xyz", 'ascii').isupper(), False)
201    veris(unicode("xyz", 'ascii').startswith(unicode("x", 'ascii')), True)
202    veris(unicode("xyz", 'ascii').startswith(unicode("z", 'ascii')), False)
203
204f = file(TESTFN, "w")
205veris(f.closed, False)
206f.close()
207veris(f.closed, True)
208os.remove(TESTFN)
209
210import operator
211veris(operator.truth(0), False)
212veris(operator.truth(1), True)
213veris(operator.isCallable(0), False)
214veris(operator.isCallable(len), True)
215veris(operator.isNumberType(None), False)
216veris(operator.isNumberType(0), True)
217veris(operator.not_(1), False)
218veris(operator.not_(0), True)
219veris(operator.isSequenceType(0), False)
220veris(operator.isSequenceType([]), True)
221veris(operator.contains([], 1), False)
222veris(operator.contains([1], 1), True)
223veris(operator.isMappingType(1), False)
224veris(operator.isMappingType({}), True)
225veris(operator.lt(0, 0), False)
226veris(operator.lt(0, 1), True)
227
228import marshal
229veris(marshal.loads(marshal.dumps(True)), True)
230veris(marshal.loads(marshal.dumps(False)), False)
231
232import pickle
233veris(pickle.loads(pickle.dumps(True)), True)
234veris(pickle.loads(pickle.dumps(False)), False)
235veris(pickle.loads(pickle.dumps(True, True)), True)
236veris(pickle.loads(pickle.dumps(False, True)), False)
237
238import cPickle
239veris(cPickle.loads(cPickle.dumps(True)), True)
240veris(cPickle.loads(cPickle.dumps(False)), False)
241veris(cPickle.loads(cPickle.dumps(True, True)), True)
242veris(cPickle.loads(cPickle.dumps(False, True)), False)
243
244veris(pickle.loads(cPickle.dumps(True)), True)
245veris(pickle.loads(cPickle.dumps(False)), False)
246veris(pickle.loads(cPickle.dumps(True, True)), True)
247veris(pickle.loads(cPickle.dumps(False, True)), False)
248
249veris(cPickle.loads(pickle.dumps(True)), True)
250veris(cPickle.loads(pickle.dumps(False)), False)
251veris(cPickle.loads(pickle.dumps(True, True)), True)
252veris(cPickle.loads(pickle.dumps(False, True)), False)
253
254# Test for specific backwards-compatible pickle values
255vereq(pickle.dumps(True), "I01\n.")
256vereq(pickle.dumps(False), "I00\n.")
257vereq(cPickle.dumps(True), "I01\n.")
258vereq(cPickle.dumps(False), "I00\n.")
259vereq(pickle.dumps(True, True), "I01\n.")
260vereq(pickle.dumps(False, True), "I00\n.")
261vereq(cPickle.dumps(True, True), "I01\n.")
262vereq(cPickle.dumps(False, True), "I00\n.")
263
264if verbose:
265    print "All OK"
266