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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
import pytest
from pyrsistent import b, pbag
def test_literalish_works():
assert b(1, 2) == pbag([1, 2])
def test_empty_bag():
"""
creating an empty pbag returns a singleton.
Note that this should NOT be relied upon in application code.
"""
assert b() is b()
def test_supports_hash():
assert hash(b(1, 2)) == hash(b(2, 1))
def test_hash_in_dict():
assert {b(1,2,3,3): "hello"}[b(3,3,2,1)] == "hello"
def test_empty_truthiness():
assert b(1)
assert not b()
def test_repr_empty():
assert repr(b()) == 'pbag([])'
def test_repr_elements():
assert repr(b(1, 2)) in ('pbag([1, 2])', 'pbag([2, 1])')
def test_add_empty():
assert b().add(1) == b(1)
def test_remove_final():
assert b().add(1).remove(1) == b()
def test_remove_nonfinal():
assert b().add(1).add(1).remove(1) == b(1)
def test_remove_nonexistent():
with pytest.raises(KeyError) as excinfo:
b().remove(1)
assert str(excinfo.exconly()) == 'KeyError: 1'
def test_eq_empty():
assert b() == b()
def test_neq():
assert b(1) != b()
def test_eq_same_order():
assert b(1, 2, 1) == b(1, 2, 1)
def test_eq_different_order():
assert b(2, 1, 2) == b(1, 2, 2)
def test_count_non_existent():
assert b().count(1) == 0
def test_count_unique():
assert b(1).count(1) == 1
def test_count_duplicate():
assert b(1, 1).count(1) == 2
def test_length_empty():
assert len(b()) == 0
def test_length_unique():
assert len(b(1)) == 1
def test_length_duplicates():
assert len(b(1, 1)) == 2
def test_length_multiple_elements():
assert len(b(1, 1, 2, 3)) == 4
def test_iter_duplicates():
assert list(b(1, 1)) == [1, 1]
def test_iter_multiple_elements():
assert list(b(1, 2, 2)) in ([1, 2, 2], [2, 2, 1])
def test_contains():
assert 1 in b(1)
def test_not_contains():
assert 1 not in b(2)
def test_add():
assert b(3, 3, 3, 2, 2, 1) + b(4, 3, 2, 1) == b(4,
3, 3, 3, 3,
2, 2, 2,
1, 1)
def test_sub():
assert b(1, 2, 3, 3) - b(3, 4) == b(1, 2, 3)
def test_or():
assert b(1, 2, 2, 3, 3, 3) | b(1, 2, 3, 4, 4) == b(1,
2, 2,
3, 3, 3,
4, 4)
def test_and():
assert b(1, 2, 2, 3, 3, 3) & b(2, 3, 3, 4) == b(2, 3, 3)
def test_pbag_is_unorderable():
with pytest.raises(TypeError):
_ = b(1) < b(2) # type: ignore
with pytest.raises(TypeError):
_ = b(1) <= b(2) # type: ignore
with pytest.raises(TypeError):
_ = b(1) > b(2) # type: ignore
with pytest.raises(TypeError):
_ = b(1) >= b(2) # type: ignore
def test_supports_weakref():
import weakref
weakref.ref(b(1))
def test_update():
assert pbag([1, 2, 2]).update([3, 3, 4]) == pbag([1, 2, 2, 3, 3, 4])
def test_update_no_elements():
b = pbag([1, 2, 2])
assert b.update([]) is b
def test_iterable():
"""
PBags can be created from iterables even though they can't be len() hinted.
"""
assert pbag(iter("a")) == pbag(iter("a"))
|