File: test_callback_container.py

package info (click to toggle)
python-echo 0.11.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 364 kB
  • sloc: python: 2,607; makefile: 148
file content (131 lines) | stat: -rw-r--r-- 2,784 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import pytest

from ..callback_container import CallbackContainer


def func_a():
    return 1


def func_b():
    return 2


class SimpleClass:

    def __init__(self, value):
        self._value = value

    def meth(self):
        return self._value


def test_callback_container_func():

    container = CallbackContainer()
    container.append(func_a)

    assert len(container) == 1
    assert func_a in container
    assert func_b not in container

    container.append(func_b)

    assert len(container) == 2
    assert func_a in container
    assert func_b in container

    callbacks = list(container)

    assert callbacks[0] is func_a
    assert callbacks[1] is func_b

    container.clear()

    assert len(container) == 0
    assert func_a not in container
    assert func_b not in container


def test_callback_container_meth():

    instance1 = SimpleClass(2)
    instance2 = SimpleClass(3)

    container = CallbackContainer()
    container.append(instance1.meth)

    assert len(container) == 1
    assert instance1.meth in container
    assert instance2.meth not in container

    container.append(instance2.meth)

    assert len(container) == 2
    assert instance1.meth in container
    assert instance2.meth in container

    callbacks = list(container)

    assert callbacks[0]() == 2
    assert callbacks[1]() == 3

    container.clear()

    assert len(container) == 0
    assert instance1.meth not in container
    assert instance2.meth not in container


def test_callback_container_invalid():

    container = CallbackContainer()
    with pytest.raises(TypeError, match=r'Only callable values can be stored in CallbackContainer'):
        container.append('banana')


def test_callback_container_duplicates():

    # Don't store duplicates

    instance1 = SimpleClass(2)
    instance2 = SimpleClass(3)

    container = CallbackContainer()
    container.append(func_a)
    container.append(instance1.meth)
    container.append(instance2.meth)
    container.append(instance1.meth)
    container.append(instance2.meth, priority=2)  # will be added as different priority
    container.append(func_a)
    container.append(instance2.meth)

    assert len(container) == 4
    assert func_a in container
    assert func_b not in container
    assert instance1.meth in container
    assert instance2.meth in container


def test_callback_container_remove():

    instance = SimpleClass(2)

    container = CallbackContainer()
    container.append(func_a)
    container.append(instance.meth)
    container.append(instance.meth, priority=2)

    assert len(container) == 3

    container.remove(instance.meth)

    assert len(container) == 1

    container.remove(func_a)

    assert len(container) == 0

    container.remove(func_b)

    assert len(container) == 0