|
2 | 2 |
|
3 | 3 | import io
|
4 | 4 | from dataclasses import dataclass
|
5 |
| -from typing import Dict, List, Optional, Tuple |
| 5 | +from typing import Any, Dict, List, Optional, Tuple, Type |
6 | 6 |
|
7 | 7 | import pytest
|
| 8 | +from blspy import G1Element |
8 | 9 | from clvm_tools import binutils
|
9 | 10 | from typing_extensions import Literal
|
10 | 11 |
|
|
18 | 19 | from chia.util.streamable import (
|
19 | 20 | DefinitionError,
|
20 | 21 | Streamable,
|
| 22 | + dataclass_from_dict, |
21 | 23 | is_type_List,
|
22 | 24 | is_type_SpecificOptional,
|
23 | 25 | parse_bool,
|
@@ -91,6 +93,58 @@ class TestClassPlain(Streamable):
|
91 | 93 | a: PlainClass
|
92 | 94 |
|
93 | 95 |
|
| 96 | +@dataclass |
| 97 | +class TestDataclassFromDict1: |
| 98 | + a: int |
| 99 | + b: str |
| 100 | + c: G1Element |
| 101 | + |
| 102 | + |
| 103 | +@dataclass |
| 104 | +class TestDataclassFromDict2: |
| 105 | + a: TestDataclassFromDict1 |
| 106 | + b: TestDataclassFromDict1 |
| 107 | + c: float |
| 108 | + |
| 109 | + |
| 110 | +def test_pure_dataclasses_in_dataclass_from_dict() -> None: |
| 111 | + |
| 112 | + d1_dict = {"a": 1, "b": "2", "c": str(G1Element())} |
| 113 | + |
| 114 | + d1: TestDataclassFromDict1 = dataclass_from_dict(TestDataclassFromDict1, d1_dict) |
| 115 | + assert d1.a == 1 |
| 116 | + assert d1.b == "2" |
| 117 | + assert d1.c == G1Element() |
| 118 | + |
| 119 | + d2_dict = {"a": d1, "b": d1_dict, "c": 1.2345} |
| 120 | + |
| 121 | + d2: TestDataclassFromDict2 = dataclass_from_dict(TestDataclassFromDict2, d2_dict) |
| 122 | + assert d2.a == d1 |
| 123 | + assert d2.b == d1 |
| 124 | + assert d2.c == 1.2345 |
| 125 | + |
| 126 | + |
| 127 | +@pytest.mark.parametrize( |
| 128 | + "test_class, input_dict, error", |
| 129 | + [ |
| 130 | + [TestDataclassFromDict1, {"a": "asdf", "b": "2", "c": G1Element()}, ValueError], |
| 131 | + [TestDataclassFromDict1, {"a": 1, "b": "2"}, KeyError], |
| 132 | + [TestDataclassFromDict1, {"a": 1, "b": "2", "c": "asd"}, ValueError], |
| 133 | + [TestDataclassFromDict1, {"a": 1, "b": "2", "c": "00" * G1Element.SIZE}, ValueError], |
| 134 | + [TestDataclassFromDict1, {"a": [], "b": "2", "c": G1Element()}, TypeError], |
| 135 | + [TestDataclassFromDict1, {"a": {}, "b": "2", "c": G1Element()}, TypeError], |
| 136 | + [TestDataclassFromDict2, {"a": "asdf", "b": 1.2345, "c": 1.2345}, TypeError], |
| 137 | + [TestDataclassFromDict2, {"a": 1.2345, "b": {"a": 1, "b": "2"}, "c": 1.2345}, TypeError], |
| 138 | + [TestDataclassFromDict2, {"a": {"a": 1, "b": "2", "c": G1Element()}, "b": {"a": 1, "b": "2"}}, KeyError], |
| 139 | + [TestDataclassFromDict2, {"a": {"a": 1, "b": "2"}, "b": {"a": 1, "b": "2"}, "c": 1.2345}, KeyError], |
| 140 | + ], |
| 141 | +) |
| 142 | +def test_dataclass_from_dict_failures(test_class: Type[Any], input_dict: Dict[str, Any], error: Any) -> None: |
| 143 | + |
| 144 | + with pytest.raises(error): |
| 145 | + dataclass_from_dict(test_class, input_dict) |
| 146 | + |
| 147 | + |
94 | 148 | def test_basic_list() -> None:
|
95 | 149 | a = [1, 2, 3]
|
96 | 150 | assert is_type_List(type(a))
|
|
0 commit comments