Skip to content

Commit 0e61a66

Browse files
committed
test: add pytest file 'test_mirrordict.py'
1 parent 558f603 commit 0e61a66

File tree

1 file changed

+362
-0
lines changed

1 file changed

+362
-0
lines changed

tests/test_mirrordict.py

Lines changed: 362 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,362 @@
1+
import pytest
2+
from MirrorDict import MirrorDict
3+
4+
5+
def test_initialization():
6+
md = MirrorDict({"a": 1, "b": 2})
7+
assert md["a"] == 1
8+
assert md[1] == "a"
9+
assert md["b"] == 2
10+
assert md[2] == "b"
11+
12+
13+
def test_empty_initialization():
14+
md = MirrorDict()
15+
assert len(md) == 0
16+
17+
18+
def test_add_and_lookup():
19+
md = MirrorDict()
20+
md["x"] = 10
21+
md["y"] = 20
22+
md["z"] = 30
23+
assert md["x"] == 10
24+
assert md[10] == "x"
25+
assert md["y"] == 20
26+
assert md[20] == "y"
27+
assert md["z"] == 30
28+
assert md[30] == "z"
29+
30+
31+
def test_add_and_update_and_lookup():
32+
md = MirrorDict()
33+
md["x"] = 10
34+
md["y"] = 20
35+
md["z"] = 30
36+
37+
assert md["x"] == 10
38+
assert md["y"] == 20
39+
assert md["z"] == 30
40+
assert md[10] == "x"
41+
assert md[20] == "y"
42+
assert md[30] == "z"
43+
44+
md[20] = "a" # reverses key direction and updates to "a"
45+
46+
assert md["x"] == 10
47+
assert md["z"] == 30
48+
assert md["a"] == 20
49+
assert md[10] == "x"
50+
assert md[30] == "z"
51+
assert md[20] == "a"
52+
53+
54+
def test_key_order():
55+
md = MirrorDict()
56+
md["x"] = 10
57+
md["y"] = 20
58+
md["z"] = 30
59+
60+
assert md["x"] == 10
61+
assert md["y"] == 20
62+
assert md["z"] == 30
63+
assert md[10] == "x"
64+
assert md[20] == "y"
65+
assert md[30] == "z"
66+
67+
md[20] = "a" # reverses key direction and updates to "a"
68+
69+
assert md["x"] == 10
70+
assert md["z"] == 30
71+
assert md["a"] == 20
72+
assert md[10] == "x"
73+
assert md[30] == "z"
74+
assert md[20] == "a"
75+
76+
77+
def test_update_with_mapping():
78+
md = MirrorDict({"a": 1})
79+
md.update({"b": 2, "c": 3})
80+
assert md["b"] == 2
81+
assert md["c"] == 3
82+
assert md[2] == "b"
83+
assert md[3] == "c"
84+
85+
86+
def test_update_with_iterable():
87+
md = MirrorDict({"a": 1})
88+
md.update([("b", 2), ("c", 3)])
89+
assert md["b"] == 2
90+
assert md["c"] == 3
91+
assert md[2] == "b"
92+
assert md[3] == "c"
93+
94+
95+
def test_update_with_kwargs():
96+
md = MirrorDict({"a": 1})
97+
md.update(b=2, c=3)
98+
assert md["b"] == 2
99+
assert md["c"] == 3
100+
assert md[2] == "b"
101+
assert md[3] == "c"
102+
103+
104+
def test_clear():
105+
md = MirrorDict({"a": 1, "b": 2})
106+
md.clear()
107+
assert len(md) == 0
108+
assert list(md.keys()) == []
109+
assert list(md.values()) == []
110+
111+
112+
def test_copy():
113+
md = MirrorDict({"a": 1, "b": 2})
114+
md_copy = md.copy()
115+
assert md_copy == md
116+
assert id(md_copy) != id(md)
117+
118+
119+
def test_non_hashable_key_or_value():
120+
md = MirrorDict()
121+
with pytest.raises(TypeError):
122+
md[["a"]] = 1
123+
with pytest.raises(TypeError):
124+
md["a"] = {"key": "value"}
125+
126+
127+
def test_pop():
128+
md = MirrorDict({"a": 1, "b": 2})
129+
assert md.pop("a") == 1
130+
assert "a" not in md
131+
assert 1 not in md
132+
with pytest.raises(KeyError):
133+
md.pop("c")
134+
135+
136+
def test_pop_with_default():
137+
md = MirrorDict({"a": 1})
138+
assert md.pop("b", "default") == "default"
139+
140+
141+
def test_pop_nonexistent_key_raises():
142+
md = MirrorDict({"a": 1})
143+
with pytest.raises(KeyError):
144+
md.pop("b")
145+
146+
147+
def test_popitem():
148+
md = MirrorDict({"a": 1, "b": 2})
149+
key, value = md.popitem()
150+
assert key in ["a", "b"]
151+
assert value in [1, 2]
152+
assert key not in md
153+
assert value not in md
154+
155+
156+
def test_popitem_empty():
157+
md = MirrorDict()
158+
with pytest.raises(KeyError):
159+
md.popitem()
160+
161+
162+
def test_reversed():
163+
md = MirrorDict({"a": 1, "b": 2})
164+
assert list(md.reversed()) == ["b", "a"]
165+
166+
167+
def test_setdefault_existing_key():
168+
md = MirrorDict({"a": 1})
169+
assert md.setdefault("a", 3) == 1
170+
171+
172+
def test_setdefault_new_key():
173+
md = MirrorDict({"a": 1})
174+
assert md.setdefault("b", 2) == 2
175+
assert md["b"] == 2
176+
assert md[2] == "b"
177+
178+
179+
def test_contains():
180+
md = MirrorDict({"a": 1, "b": 2})
181+
assert "a" in md
182+
assert 1 in md
183+
assert "c" not in md
184+
assert 3 not in md
185+
186+
187+
def test_len():
188+
md = MirrorDict({"a": 1, "b": 2})
189+
assert len(md) == 2
190+
191+
192+
def test_iter():
193+
md = MirrorDict({"a": 1, "b": 2})
194+
assert list(iter(md)) == ["a", "b"]
195+
196+
197+
def test_eq():
198+
md1 = MirrorDict({"a": 1, "b": 2})
199+
md2 = MirrorDict({"a": 1, "b": 2})
200+
assert md1 == md2
201+
202+
203+
def test_ne():
204+
md1 = MirrorDict({"a": 1, "b": 2})
205+
md2 = MirrorDict({"a": 1, "b": 3})
206+
assert md1 != md2
207+
208+
209+
def test_ior():
210+
md1 = MirrorDict({"a": 1})
211+
md2 = MirrorDict({"b": 2})
212+
md1 |= md2
213+
assert md1["b"] == 2
214+
assert md1[2] == "b"
215+
216+
217+
def test_or():
218+
md1 = MirrorDict({"a": 1})
219+
md2 = MirrorDict({"b": 2})
220+
result = md1 | md2
221+
assert result["b"] == 2
222+
assert result[2] == "b"
223+
224+
225+
def test_ror():
226+
md1 = MirrorDict({"b": 2})
227+
md2 = {"a": 1} | md1
228+
assert md2["a"] == 1
229+
assert md2["b"] == 2
230+
231+
232+
def test_bidirectional_mapping():
233+
md = MirrorDict({"a": 1, "b": 2})
234+
assert md["a"] == 1
235+
assert md[1] == "a"
236+
assert md["b"] == 2
237+
assert md[2] == "b"
238+
239+
240+
def test_update_and_iterables():
241+
md = MirrorDict({"a": 1})
242+
md.update([("b", 2), ("c", 3)])
243+
assert md["b"] == 2
244+
assert md[2] == "b"
245+
246+
247+
def test_setdefault():
248+
md = MirrorDict({"a": 1})
249+
assert md.setdefault("b", 2) == 2
250+
assert md["b"] == 2
251+
assert md.setdefault("a", 3) == 1
252+
253+
254+
def test_clear_empty_dict():
255+
md = MirrorDict()
256+
md.clear()
257+
assert len(md) == 0
258+
259+
260+
def test_copy_independence():
261+
md = MirrorDict({"a": 1})
262+
md_copy = md.copy()
263+
md["b"] = 2
264+
assert "b" not in md_copy
265+
266+
267+
def test_keys_values_items_consistency():
268+
md = MirrorDict({"a": 1, "b": 2})
269+
assert list(md.keys()) == ["a", "b"]
270+
assert list(md.values()) == [1, 2]
271+
assert list(md.items()) == [("a", 1), ("b", 2)]
272+
273+
274+
def test_update_with_conflicting_keys():
275+
md = MirrorDict({"a": 1})
276+
md.update({"a": 2}) # Changes value for "a"
277+
assert md["a"] == 2
278+
assert md[2] == "a"
279+
assert 1 not in md # Old mirrored value should be removed
280+
281+
282+
def test_update_with_no_args():
283+
md = MirrorDict({"a": 1})
284+
md.update()
285+
assert md["a"] == 1 # Nothing changes
286+
287+
288+
def test_reversed_empty():
289+
md = MirrorDict()
290+
assert list(md.reversed()) == []
291+
292+
293+
def test_popitem_respects_order():
294+
md = MirrorDict({"a": 1, "b": 2, "c": 3})
295+
assert md.popitem() == ("c", 3) # Last added is removed
296+
assert md.popitem() == ("b", 2)
297+
assert md.popitem() == ("a", 1)
298+
assert len(md) == 0
299+
300+
301+
def test_str():
302+
md = MirrorDict({"a": 1, "b": 2, "c": 3})
303+
assert str(md) == "MirrorDict({'a': 1, 'b': 2, 'c': 3})"
304+
305+
306+
def test_repr():
307+
md = MirrorDict({"a": 1, "b": 2, "c": 3})
308+
assert str(md) == "MirrorDict({'a': 1, 'b': 2, 'c': 3})"
309+
310+
311+
def test_str_pop():
312+
md = MirrorDict({"a": 1, "b": 2, "c": 3})
313+
md.pop(2)
314+
assert str(md) == "MirrorDict({'a': 1, 'c': 3})"
315+
316+
317+
def test_repr_pop():
318+
md = MirrorDict({"a": 1, "b": 2, "c": 3})
319+
md.pop(2)
320+
assert repr(md) == "MirrorDict({'a': 1, 'c': 3})"
321+
322+
323+
def test_str_popitem():
324+
md = MirrorDict({"a": 1, "b": 2, "c": 3})
325+
md.popitem()
326+
assert str(md) == "MirrorDict({'a': 1, 'b': 2})"
327+
328+
329+
def test_repr_popitem():
330+
md = MirrorDict({"a": 1, "b": 2, "c": 3})
331+
md.popitem()
332+
assert repr(md) == "MirrorDict({'a': 1, 'b': 2})"
333+
334+
335+
def test_str_empty():
336+
md = MirrorDict()
337+
assert str(md) == "MirrorDict({})"
338+
339+
md = MirrorDict({"a": 1, "b": 2, "c": 3})
340+
md.clear()
341+
assert str(md) == "MirrorDict({})"
342+
343+
md = MirrorDict({"a": 1, "b": 2, "c": 3})
344+
md.popitem()
345+
md.popitem()
346+
md.popitem()
347+
assert str(md) == "MirrorDict({})"
348+
349+
350+
def test_repr_empty():
351+
md = MirrorDict()
352+
assert repr(md) == "MirrorDict({})"
353+
354+
md = MirrorDict({"a": 1, "b": 2, "c": 3})
355+
md.clear()
356+
assert repr(md) == "MirrorDict({})"
357+
358+
md = MirrorDict({"a": 1, "b": 2, "c": 3})
359+
md.popitem()
360+
md.popitem()
361+
md.popitem()
362+
assert repr(md) == "MirrorDict({})"

0 commit comments

Comments
 (0)