1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
from dataclasses import dataclass
from typing import Optional
from dataclasses_json import DataClassJsonMixin
@dataclass(frozen=True)
class Tree(DataClassJsonMixin):
value: str
left: Optional['Tree']
right: Optional['Tree']
family_tree_json = """
{
"value": "Boy",
"left": {
"value": "Ma",
"left": {
"value": "Maternal Grandma",
"left": null,
"right": null
},
"right": {
"value": "Maternal Grandpa",
"left": null,
"right": null
}
},
"right": {
"value": "Pa",
"left": {
"value": "Paternal Grandma",
"left": null,
"right": null
},
"right": {
"value": "Paternal Grandpa",
"left": null,
"right": null
}
}
}
""".strip()
family_tree = Tree(
"Boy",
Tree(
"Ma",
Tree(
"Maternal Grandma",
None,
None
),
Tree(
"Maternal Grandpa",
None,
None
)
),
Tree("Pa",
Tree(
"Paternal Grandma",
None,
None
),
Tree(
"Paternal Grandpa",
None,
None
)
)
)
class TestRecursive:
def test_tree_encode(self):
assert family_tree.to_json(indent=4) == family_tree_json
def test_tree_decode(self):
assert Tree.from_json(family_tree_json) == family_tree
def test_tree_schema_round_trip(self):
tree_dict = Tree.schema().dump(family_tree)
tree_obj = Tree.schema().load(tree_dict)
assert tree_obj == family_tree
|