test_contains.py 2.58 KB
Newer Older
1
from collections import deque
2
from test.support import run_unittest
Christian Heimes's avatar
Christian Heimes committed
3
import unittest
4 5


Christian Heimes's avatar
Christian Heimes committed
6
class base_set:
7 8
    def __init__(self, el):
        self.el = el
9

10
class myset(base_set):
11 12
    def __contains__(self, el):
        return self.el == el
13 14

class seq(base_set):
15 16
    def __getitem__(self, n):
        return [self.el][n]
17

Christian Heimes's avatar
Christian Heimes committed
18 19 20
class TestContains(unittest.TestCase):
    def test_common_tests(self):
        a = base_set(1)
21
        b = myset(1)
Christian Heimes's avatar
Christian Heimes committed
22
        c = seq(1)
23 24 25 26
        self.assertIn(1, b)
        self.assertNotIn(0, b)
        self.assertIn(1, c)
        self.assertNotIn(0, c)
Christian Heimes's avatar
Christian Heimes committed
27 28 29 30
        self.assertRaises(TypeError, lambda: 1 in a)
        self.assertRaises(TypeError, lambda: 1 not in a)

        # test char in string
31 32
        self.assertIn('c', 'abc')
        self.assertNotIn('d', 'abc')
Christian Heimes's avatar
Christian Heimes committed
33

34 35
        self.assertIn('', '')
        self.assertIn('', 'abc')
Christian Heimes's avatar
Christian Heimes committed
36 37 38 39 40 41 42

        self.assertRaises(TypeError, lambda: None in 'abc')

    def test_builtin_sequence_types(self):
        # a collection of tests on builtin sequence types
        a = range(10)
        for i in a:
43 44 45
            self.assertIn(i, a)
        self.assertNotIn(16, a)
        self.assertNotIn(a, a)
Christian Heimes's avatar
Christian Heimes committed
46 47 48

        a = tuple(a)
        for i in a:
49 50 51
            self.assertIn(i, a)
        self.assertNotIn(16, a)
        self.assertNotIn(a, a)
Christian Heimes's avatar
Christian Heimes committed
52 53 54 55 56 57 58

        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.
            """
59 60
            aList = list(range(15))
            def __eq__(self, other):
Christian Heimes's avatar
Christian Heimes committed
61 62 63 64
                if other == 12:
                    self.aList.remove(12)
                    self.aList.remove(13)
                    self.aList.remove(14)
65
                return 0
Christian Heimes's avatar
Christian Heimes committed
66

67
        self.assertNotIn(Deviant1(), Deviant1.aList)
Christian Heimes's avatar
Christian Heimes committed
68

69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
    def test_nonreflexive(self):
        # containment and equality tests involving elements that are
        # not necessarily equal to themselves

        class MyNonReflexive(object):
            def __eq__(self, other):
                return False
            def __hash__(self):
                return 28

        values = float('nan'), 1, None, 'abc', MyNonReflexive()
        constructors = list, tuple, dict.fromkeys, set, frozenset, deque
        for constructor in constructors:
            container = constructor(values)
            for elem in container:
84
                self.assertIn(elem, container)
85 86
            self.assertTrue(container == constructor(values))
            self.assertTrue(container == container)
87

Christian Heimes's avatar
Christian Heimes committed
88 89 90 91 92 93

def test_main():
    run_unittest(TestContains)

if __name__ == '__main__':
    test_main()