14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test.test_support import have_unicode, run_unittest
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass base_set:
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, el):
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.el = el
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass set(base_set):
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __contains__(self, el):
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return self.el == el
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass seq(base_set):
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __getitem__(self, n):
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return [self.el][n]
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestContains(unittest.TestCase):
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_common_tests(self):
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a = base_set(1)
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        b = set(1)
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c = seq(1)
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertIn(1, b)
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotIn(0, b)
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertIn(1, c)
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotIn(0, c)
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, lambda: 1 in a)
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, lambda: 1 not in a)
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # test char in string
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertIn('c', 'abc')
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotIn('d', 'abc')
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertIn('', '')
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertIn('', 'abc')
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, lambda: None in 'abc')
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if have_unicode:
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_char_in_unicode(self):
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertIn('c', unicode('abc'))
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertNotIn('d', unicode('abc'))
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertIn('', unicode(''))
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertIn(unicode(''), '')
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertIn(unicode(''), unicode(''))
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertIn('', unicode('abc'))
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertIn(unicode(''), 'abc')
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertIn(unicode(''), unicode('abc'))
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertRaises(TypeError, lambda: None in unicode('abc'))
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # test Unicode char in Unicode
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertIn(unicode('c'), unicode('abc'))
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertNotIn(unicode('d'), unicode('abc'))
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # test Unicode char in string
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertIn(unicode('c'), 'abc')
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertNotIn(unicode('d'), 'abc')
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_builtin_sequence_types(self):
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # a collection of tests on builtin sequence types
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a = range(10)
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for i in a:
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertIn(i, a)
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotIn(16, a)
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotIn(a, a)
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a = tuple(a)
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for i in a:
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertIn(i, a)
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotIn(16, a)
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotIn(a, a)
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Deviant1:
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            """Behaves strangely when compared
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            This class is designed to make sure that the contains code
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            works when the list is modified during the check.
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            """
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            aList = range(15)
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if other == 12:
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self.aList.remove(12)
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self.aList.remove(13)
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self.aList.remove(14)
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 1
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotIn(Deviant1(), Deviant1.aList)
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Deviant2:
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            """Behaves strangely when compared
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            This class raises an exception during comparison.  That in
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            turn causes the comparison to fail with a TypeError.
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            """
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if other == 4:
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise RuntimeError, "gotcha"
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertNotIn(Deviant2(), a)
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except TypeError:
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main():
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    run_unittest(TestContains)
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == '__main__':
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_main()
112