from test.test_support import have_unicode, run_unittest
import unittest


class base_set:
    def __init__(self, el):
        self.el = el

class set(base_set):
    def __contains__(self, el):
        return self.el == el

class seq(base_set):
    def __getitem__(self, n):
        return [self.el][n]


class TestContains(unittest.TestCase):
    def test_common_tests(self):
        a = base_set(1)
        b = set(1)
        c = seq(1)
        self.assertIn(1, b)
        self.assertNotIn(0, b)
        self.assertIn(1, c)
        self.assertNotIn(0, c)
        self.assertRaises(TypeError, lambda: 1 in a)
        self.assertRaises(TypeError, lambda: 1 not in a)

        # test char in string
        self.assertIn('c', 'abc')
        self.assertNotIn('d', 'abc')

        self.assertIn('', '')
        self.assertIn('', 'abc')

        self.assertRaises(TypeError, lambda: None in 'abc')

    if have_unicode:
        def test_char_in_unicode(self):
            self.assertIn('c', unicode('abc'))
            self.assertNotIn('d', unicode('abc'))

            self.assertIn('', unicode(''))
            self.assertIn(unicode(''), '')
            self.assertIn(unicode(''), unicode(''))
            self.assertIn('', unicode('abc'))
            self.assertIn(unicode(''), 'abc')
            self.assertIn(unicode(''), unicode('abc'))

            self.assertRaises(TypeError, lambda: None in unicode('abc'))

            # test Unicode char in Unicode
            self.assertIn(unicode('c'), unicode('abc'))
            self.assertNotIn(unicode('d'), unicode('abc'))

            # test Unicode char in string
            self.assertIn(unicode('c'), 'abc')
            self.assertNotIn(unicode('d'), 'abc')

    def test_builtin_sequence_types(self):
        # a collection of tests on builtin sequence types
        a = range(10)
        for i in a:
            self.assertIn(i, a)
        self.assertNotIn(16, a)
        self.assertNotIn(a, a)

        a = tuple(a)
        for i in a:
            self.assertIn(i, a)
        self.assertNotIn(16, a)
        self.assertNotIn(a, a)

        class Deviant1:
            """Behaves strangely when compared

            This class is designed to make sure that the contains code
            works when the list is modified during the check.
            """
            aList = range(15)
            def __cmp__(self, other):
                if other == 12:
                    self.aList.remove(12)
                    self.aList.remove(13)
                    self.aList.remove(14)
                return 1

        self.assertNotIn(Deviant1(), Deviant1.aList)

        class Deviant2:
            """Behaves strangely when compared

            This class raises an exception during comparison.  That in
            turn causes the comparison to fail with a TypeError.
            """
            def __cmp__(self, other):
                if other == 4:
                    raise RuntimeError, "gotcha"

        try:
            self.assertNotIn(Deviant2(), a)
        except TypeError:
            pass


def test_main():
    run_unittest(TestContains)

if __name__ == '__main__':
    test_main()
