Coverage for src/extratools_core/testtools.py: 0%
44 statements
« prev ^ index » next coverage.py v7.8.1, created at 2025-05-23 01:16 -0700
« prev ^ index » next coverage.py v7.8.1, created at 2025-05-23 01:16 -0700
1from collections.abc import Callable, MutableMapping
2from typing import Any
5def expect_exception(error_cls: type[Exception], f: Callable[[], Any]) -> None:
6 try:
7 f()
8 except error_cls:
9 return
11 raise AssertionError
14def is_proper_mutable_mapping[KT, VT](
15 cls: type[MutableMapping[KT, VT]],
16 *,
17 key_cls: type[KT],
18 value_cls: type[VT],
19) -> None:
20 m: MutableMapping[KT, VT] = cls()
22 assert isinstance(m, MutableMapping)
24 assert len(m) == 0
26 assert list(m.keys()) == []
27 assert list(m.values()) == []
28 assert list(m.items()) == []
30 key: KT = key_cls()
31 value: VT = value_cls()
32 assert key not in m
34 m[key] = value
35 assert key in m
36 assert len(m) == 1
37 assert m[key] == value
38 assert m.get(key) == value
40 assert list(m.keys()) == [key]
41 assert list(m.values()) == [value]
42 assert list(m.items()) == [(key, value)]
44 # No duplication
45 m[key] = value
46 assert len(m) == 1
48 del m[key]
49 assert key not in m
50 assert len(m) == 0
51 expect_exception(KeyError, lambda: m[key])
52 assert m.get(key) is None
53 assert m.get(key, value) == value
55 assert m.setdefault(key, value) == value
56 assert key in m
57 assert len(m) == 1
58 assert m[key] == value
60 assert m.pop(key) == value
61 assert key not in m
62 assert len(m) == 0
63 # `pop`` is special here that it would raise `KeyError` if `default` is not specified.
64 expect_exception(KeyError, lambda: m.pop(key))
65 assert m.pop(key, None) is None
66 assert m.pop(key, value) == value