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