test_contains.py 2.5 KB
Newer Older
1
from collections import deque
Christian Heimes's avatar
Christian Heimes committed
2
import unittest
3 4


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

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

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

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

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

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

        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:
42 43 44
            self.assertIn(i, a)
        self.assertNotIn(16, a)
        self.assertNotIn(a, a)
Christian Heimes's avatar
Christian Heimes committed
45 46 47

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

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

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

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
    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:
83
                self.assertIn(elem, container)
84 85
            self.assertTrue(container == constructor(values))
            self.assertTrue(container == container)
86

Christian Heimes's avatar
Christian Heimes committed
87 88

if __name__ == '__main__':
89
    unittest.main()