Update version number and release date.
[python/dscho.git] / Lib / test / test_contains.py
blob04eedf1757a5016f21fb80d8d17237039741a702
1 from test.test_support import TestFailed, have_unicode
3 class base_set:
5 def __init__(self, el):
6 self.el = el
8 class set(base_set):
10 def __contains__(self, el):
11 return self.el == el
13 class seq(base_set):
15 def __getitem__(self, n):
16 return [self.el][n]
18 def check(ok, *args):
19 if not ok:
20 raise TestFailed, " ".join(map(str, args))
22 a = base_set(1)
23 b = set(1)
24 c = seq(1)
26 check(1 in b, "1 not in set(1)")
27 check(0 not in b, "0 in set(1)")
28 check(1 in c, "1 not in seq(1)")
29 check(0 not in c, "0 in seq(1)")
31 try:
32 1 in a
33 check(0, "in base_set did not raise error")
34 except TypeError:
35 pass
37 try:
38 1 not in a
39 check(0, "not in base_set did not raise error")
40 except TypeError:
41 pass
43 # Test char in string
45 check('c' in 'abc', "'c' not in 'abc'")
46 check('d' not in 'abc', "'d' in 'abc'")
48 check('' in '', "'' not in ''")
49 check('' in 'abc', "'' not in 'abc'")
51 try:
52 None in 'abc'
53 check(0, "None in 'abc' did not raise error")
54 except TypeError:
55 pass
58 if have_unicode:
60 # Test char in Unicode
62 check('c' in unicode('abc'), "'c' not in u'abc'")
63 check('d' not in unicode('abc'), "'d' in u'abc'")
65 check('' in unicode(''), "'' not in u''")
66 check(unicode('') in '', "u'' not in ''")
67 check(unicode('') in unicode(''), "u'' not in u''")
68 check('' in unicode('abc'), "'' not in u'abc'")
69 check(unicode('') in 'abc', "u'' not in 'abc'")
70 check(unicode('') in unicode('abc'), "u'' not in u'abc'")
72 try:
73 None in unicode('abc')
74 check(0, "None in u'abc' did not raise error")
75 except TypeError:
76 pass
78 # Test Unicode char in Unicode
80 check(unicode('c') in unicode('abc'), "u'c' not in u'abc'")
81 check(unicode('d') not in unicode('abc'), "u'd' in u'abc'")
83 # Test Unicode char in string
85 check(unicode('c') in 'abc', "u'c' not in 'abc'")
86 check(unicode('d') not in 'abc', "u'd' in 'abc'")
88 # A collection of tests on builtin sequence types
89 a = range(10)
90 for i in a:
91 check(i in a, "%s not in %s" % (`i`, `a`))
92 check(16 not in a, "16 not in %s" % `a`)
93 check(a not in a, "%s not in %s" % (`a`, `a`))
95 a = tuple(a)
96 for i in a:
97 check(i in a, "%s not in %s" % (`i`, `a`))
98 check(16 not in a, "16 not in %s" % `a`)
99 check(a not in a, "%s not in %s" % (`a`, `a`))
101 class Deviant1:
102 """Behaves strangely when compared
104 This class is designed to make sure that the contains code
105 works when the list is modified during the check.
108 aList = range(15)
110 def __cmp__(self, other):
111 if other == 12:
112 self.aList.remove(12)
113 self.aList.remove(13)
114 self.aList.remove(14)
115 return 1
117 check(Deviant1() not in Deviant1.aList, "Deviant1 failed")
119 class Deviant2:
120 """Behaves strangely when compared
122 This class raises an exception during comparison. That in
123 turn causes the comparison to fail with a TypeError.
126 def __cmp__(self, other):
127 if other == 4:
128 raise RuntimeError, "gotcha"
130 try:
131 check(Deviant2() not in a, "oops")
132 except TypeError:
133 pass