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

1from collections.abc import Callable, MutableMapping 

2from typing import Any 

3 

4 

5def expect_exception(error_cls: type[Exception], f: Callable[[], Any]) -> None: 

6 try: 

7 f() 

8 except error_cls: 

9 return 

10 

11 raise AssertionError 

12 

13 

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() 

21 

22 assert isinstance(m, MutableMapping) 

23 

24 assert len(m) == 0 

25 

26 assert list(m.keys()) == [] 

27 assert list(m.values()) == [] 

28 assert list(m.items()) == [] 

29 

30 key: KT = key_cls() 

31 value: VT = value_cls() 

32 assert key not in m 

33 

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 

39 

40 assert list(m.keys()) == [key] 

41 assert list(m.values()) == [value] 

42 assert list(m.items()) == [(key, value)] 

43 

44 # No duplication 

45 m[key] = value 

46 assert len(m) == 1 

47 

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 

54 

55 assert m.setdefault(key, value) == value 

56 assert key in m 

57 assert len(m) == 1 

58 assert m[key] == value 

59 

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