Skip to content

Commit 01d8712

Browse files
committed
tests: Test dataclass_from_dict with non-streamable classes
1 parent 441849a commit 01d8712

File tree

1 file changed

+55
-1
lines changed

1 file changed

+55
-1
lines changed

tests/core/util/test_streamable.py

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
import io
44
from dataclasses import dataclass
5-
from typing import Dict, List, Optional, Tuple
5+
from typing import Any, Dict, List, Optional, Tuple, Type
66

77
import pytest
8+
from blspy import G1Element
89
from clvm_tools import binutils
910
from typing_extensions import Literal
1011

@@ -18,6 +19,7 @@
1819
from chia.util.streamable import (
1920
DefinitionError,
2021
Streamable,
22+
dataclass_from_dict,
2123
is_type_List,
2224
is_type_SpecificOptional,
2325
parse_bool,
@@ -91,6 +93,58 @@ class TestClassPlain(Streamable):
9193
a: PlainClass
9294

9395

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+
94148
def test_basic_list() -> None:
95149
a = [1, 2, 3]
96150
assert is_type_List(type(a))

0 commit comments

Comments
 (0)