|
8 | 8 | from cattrs import BaseConverter, Converter |
9 | 9 | from cattrs._compat import FrozenSet |
10 | 10 | from cattrs.cols import ( |
| 11 | + is_abstract_set, |
11 | 12 | is_any_set, |
12 | 13 | is_sequence, |
13 | 14 | iterable_unstructure_factory, |
@@ -75,3 +76,27 @@ def test_structure_mut_sequences(converter: BaseConverter): |
75 | 76 | """Mutable sequences are structured to lists.""" |
76 | 77 |
|
77 | 78 | assert converter.structure(["1", 2, 3.0], MutableSequence[int]) == [1, 2, 3] |
| 79 | + |
| 80 | + |
| 81 | +def test_abstract_set_predicate(): |
| 82 | + """`is_abstract_set` works.""" |
| 83 | + |
| 84 | + assert is_abstract_set(Set) |
| 85 | + assert is_abstract_set(Set[str]) |
| 86 | + |
| 87 | + assert not is_abstract_set(set) |
| 88 | + assert not is_abstract_set(set[str]) |
| 89 | + |
| 90 | + |
| 91 | +def test_structure_abstract_sets(converter: BaseConverter): |
| 92 | + """Abstract sets structure to frozensets.""" |
| 93 | + |
| 94 | + assert converter.structure(["1", "2", "3"], Set[int]) == frozenset([1, 2, 3]) |
| 95 | + assert isinstance(converter.structure([1, 2, 3], Set[int]), frozenset) |
| 96 | + |
| 97 | + |
| 98 | +def test_structure_abstract_sets_override(converter: BaseConverter): |
| 99 | + """Abstract sets can be overridden to structure to mutable sets, as before.""" |
| 100 | + converter.register_structure_hook_func(is_abstract_set, converter._structure_set) |
| 101 | + |
| 102 | + assert converter.structure(["1", 2, 3.0], Set[int]) == {1, 2, 3} |
0 commit comments