|
1 from test.test_support import have_unicode, run_unittest |
|
2 import unittest |
|
3 |
|
4 |
|
5 class base_set: |
|
6 def __init__(self, el): |
|
7 self.el = el |
|
8 |
|
9 class set(base_set): |
|
10 def __contains__(self, el): |
|
11 return self.el == el |
|
12 |
|
13 class seq(base_set): |
|
14 def __getitem__(self, n): |
|
15 return [self.el][n] |
|
16 |
|
17 |
|
18 class TestContains(unittest.TestCase): |
|
19 def test_common_tests(self): |
|
20 a = base_set(1) |
|
21 b = set(1) |
|
22 c = seq(1) |
|
23 self.assert_(1 in b) |
|
24 self.assert_(0 not in b) |
|
25 self.assert_(1 in c) |
|
26 self.assert_(0 not in c) |
|
27 self.assertRaises(TypeError, lambda: 1 in a) |
|
28 self.assertRaises(TypeError, lambda: 1 not in a) |
|
29 |
|
30 # test char in string |
|
31 self.assert_('c' in 'abc') |
|
32 self.assert_('d' not in 'abc') |
|
33 |
|
34 self.assert_('' in '') |
|
35 self.assert_('' in 'abc') |
|
36 |
|
37 self.assertRaises(TypeError, lambda: None in 'abc') |
|
38 |
|
39 if have_unicode: |
|
40 def test_char_in_unicode(self): |
|
41 self.assert_('c' in unicode('abc')) |
|
42 self.assert_('d' not in unicode('abc')) |
|
43 |
|
44 self.assert_('' in unicode('')) |
|
45 self.assert_(unicode('') in '') |
|
46 self.assert_(unicode('') in unicode('')) |
|
47 self.assert_('' in unicode('abc')) |
|
48 self.assert_(unicode('') in 'abc') |
|
49 self.assert_(unicode('') in unicode('abc')) |
|
50 |
|
51 self.assertRaises(TypeError, lambda: None in unicode('abc')) |
|
52 |
|
53 # test Unicode char in Unicode |
|
54 self.assert_(unicode('c') in unicode('abc')) |
|
55 self.assert_(unicode('d') not in unicode('abc')) |
|
56 |
|
57 # test Unicode char in string |
|
58 self.assert_(unicode('c') in 'abc') |
|
59 self.assert_(unicode('d') not in 'abc') |
|
60 |
|
61 def test_builtin_sequence_types(self): |
|
62 # a collection of tests on builtin sequence types |
|
63 a = range(10) |
|
64 for i in a: |
|
65 self.assert_(i in a) |
|
66 self.assert_(16 not in a) |
|
67 self.assert_(a not in a) |
|
68 |
|
69 a = tuple(a) |
|
70 for i in a: |
|
71 self.assert_(i in a) |
|
72 self.assert_(16 not in a) |
|
73 self.assert_(a not in a) |
|
74 |
|
75 class Deviant1: |
|
76 """Behaves strangely when compared |
|
77 |
|
78 This class is designed to make sure that the contains code |
|
79 works when the list is modified during the check. |
|
80 """ |
|
81 aList = range(15) |
|
82 def __cmp__(self, other): |
|
83 if other == 12: |
|
84 self.aList.remove(12) |
|
85 self.aList.remove(13) |
|
86 self.aList.remove(14) |
|
87 return 1 |
|
88 |
|
89 self.assert_(Deviant1() not in Deviant1.aList) |
|
90 |
|
91 class Deviant2: |
|
92 """Behaves strangely when compared |
|
93 |
|
94 This class raises an exception during comparison. That in |
|
95 turn causes the comparison to fail with a TypeError. |
|
96 """ |
|
97 def __cmp__(self, other): |
|
98 if other == 4: |
|
99 raise RuntimeError, "gotcha" |
|
100 |
|
101 try: |
|
102 self.assert_(Deviant2() not in a) |
|
103 except TypeError: |
|
104 pass |
|
105 |
|
106 |
|
107 def test_main(): |
|
108 run_unittest(TestContains) |
|
109 |
|
110 if __name__ == '__main__': |
|
111 test_main() |