blob: 7138081dc82a401ccd25f4fda0f5c2cf6779da2a [file] [log] [blame]
Facundo Batista5af2f742008-02-06 19:28:49 +00001from test.test_support import have_unicode, run_unittest
2import unittest
3
Guido van Rossum24512e62000-03-06 21:00:29 +00004
5class base_set:
Fred Drake004d5e62000-10-23 17:22:08 +00006 def __init__(self, el):
7 self.el = el
Guido van Rossum24512e62000-03-06 21:00:29 +00008
9class set(base_set):
Fred Drake004d5e62000-10-23 17:22:08 +000010 def __contains__(self, el):
11 return self.el == el
Guido van Rossum24512e62000-03-06 21:00:29 +000012
13class seq(base_set):
Fred Drake004d5e62000-10-23 17:22:08 +000014 def __getitem__(self, n):
15 return [self.el][n]
Guido van Rossum24512e62000-03-06 21:00:29 +000016
Guido van Rossum24512e62000-03-06 21:00:29 +000017
Facundo Batista5af2f742008-02-06 19:28:49 +000018class TestContains(unittest.TestCase):
19 def test_common_tests(self):
20 a = base_set(1)
21 b = set(1)
22 c = seq(1)
Ezio Melottiaa980582010-01-23 23:04:36 +000023 self.assertIn(1, b)
24 self.assertNotIn(0, b)
25 self.assertIn(1, c)
26 self.assertNotIn(0, c)
Facundo Batista5af2f742008-02-06 19:28:49 +000027 self.assertRaises(TypeError, lambda: 1 in a)
28 self.assertRaises(TypeError, lambda: 1 not in a)
Guido van Rossum24512e62000-03-06 21:00:29 +000029
Facundo Batista5af2f742008-02-06 19:28:49 +000030 # test char in string
Ezio Melottiaa980582010-01-23 23:04:36 +000031 self.assertIn('c', 'abc')
32 self.assertNotIn('d', 'abc')
Guido van Rossum24512e62000-03-06 21:00:29 +000033
Ezio Melottiaa980582010-01-23 23:04:36 +000034 self.assertIn('', '')
35 self.assertIn('', 'abc')
Guido van Rossum24512e62000-03-06 21:00:29 +000036
Facundo Batista5af2f742008-02-06 19:28:49 +000037 self.assertRaises(TypeError, lambda: None in 'abc')
Guido van Rossumda2361a2000-03-07 15:52:01 +000038
Facundo Batista5af2f742008-02-06 19:28:49 +000039 if have_unicode:
40 def test_char_in_unicode(self):
Ezio Melottiaa980582010-01-23 23:04:36 +000041 self.assertIn('c', unicode('abc'))
42 self.assertNotIn('d', unicode('abc'))
Guido van Rossumda2361a2000-03-07 15:52:01 +000043
Ezio Melottiaa980582010-01-23 23:04:36 +000044 self.assertIn('', unicode(''))
45 self.assertIn(unicode(''), '')
46 self.assertIn(unicode(''), unicode(''))
47 self.assertIn('', unicode('abc'))
48 self.assertIn(unicode(''), 'abc')
49 self.assertIn(unicode(''), unicode('abc'))
Guido van Rossumda2361a2000-03-07 15:52:01 +000050
Facundo Batista5af2f742008-02-06 19:28:49 +000051 self.assertRaises(TypeError, lambda: None in unicode('abc'))
Guido van Rossumda2361a2000-03-07 15:52:01 +000052
Facundo Batista5af2f742008-02-06 19:28:49 +000053 # test Unicode char in Unicode
Ezio Melottiaa980582010-01-23 23:04:36 +000054 self.assertIn(unicode('c'), unicode('abc'))
55 self.assertNotIn(unicode('d'), unicode('abc'))
Facundo Batista5af2f742008-02-06 19:28:49 +000056
57 # test Unicode char in string
Ezio Melottiaa980582010-01-23 23:04:36 +000058 self.assertIn(unicode('c'), 'abc')
59 self.assertNotIn(unicode('d'), 'abc')
Facundo Batista5af2f742008-02-06 19:28:49 +000060
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:
Ezio Melottiaa980582010-01-23 23:04:36 +000065 self.assertIn(i, a)
66 self.assertNotIn(16, a)
67 self.assertNotIn(a, a)
Facundo Batista5af2f742008-02-06 19:28:49 +000068
69 a = tuple(a)
70 for i in a:
Ezio Melottiaa980582010-01-23 23:04:36 +000071 self.assertIn(i, a)
72 self.assertNotIn(16, a)
73 self.assertNotIn(a, a)
Facundo Batista5af2f742008-02-06 19:28:49 +000074
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
Ezio Melottiaa980582010-01-23 23:04:36 +000089 self.assertNotIn(Deviant1(), Deviant1.aList)
Facundo Batista5af2f742008-02-06 19:28:49 +000090
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:
Ezio Melottiaa980582010-01-23 23:04:36 +0000102 self.assertNotIn(Deviant2(), a)
Facundo Batista5af2f742008-02-06 19:28:49 +0000103 except TypeError:
104 pass
Guido van Rossum45ad3c42000-04-10 13:52:13 +0000105
Guido van Rossum45ad3c42000-04-10 13:52:13 +0000106
Facundo Batista5af2f742008-02-06 19:28:49 +0000107def test_main():
108 run_unittest(TestContains)
Guido van Rossum45ad3c42000-04-10 13:52:13 +0000109
Facundo Batista5af2f742008-02-06 19:28:49 +0000110if __name__ == '__main__':
111 test_main()