92 lines
1.7 KiB
Python
92 lines
1.7 KiB
Python
from __future__ import annotations
|
|
from dataclasses import dataclass
|
|
from typing import Optional
|
|
|
|
from megasniff.deflator import SchemaDeflatorGenerator
|
|
from src.megasniff import SchemaInflatorGenerator
|
|
|
|
|
|
def test_basic_deflator():
|
|
class A:
|
|
a: int
|
|
|
|
def __init__(self, a: int):
|
|
self.a = a
|
|
|
|
class B:
|
|
def __init__(self, b: int):
|
|
self.b = b
|
|
|
|
defl = SchemaDeflatorGenerator()
|
|
fn = defl.schema_to_deflator(A)
|
|
a = fn(A(42))
|
|
|
|
assert a['a'] == 42
|
|
|
|
fnb = defl.schema_to_deflator(B)
|
|
b = fnb(B(11))
|
|
assert len(b) == 0
|
|
|
|
|
|
def test_unions():
|
|
@dataclass
|
|
class A:
|
|
a: int | str
|
|
|
|
defl = SchemaDeflatorGenerator()
|
|
fn = defl.schema_to_deflator(A)
|
|
|
|
a = fn(A(42))
|
|
assert a['a'] == 42
|
|
a = fn(A('42'))
|
|
assert a['a'] == '42'
|
|
a = fn(A('42a'))
|
|
assert a['a'] == '42a'
|
|
|
|
|
|
def test_dict_body():
|
|
@dataclass
|
|
class A:
|
|
a: dict[str, float]
|
|
|
|
defl = SchemaDeflatorGenerator()
|
|
fn = defl.schema_to_deflator(A)
|
|
|
|
a = fn(A({'1': 1.1, '2': 2.2}))
|
|
print(a)
|
|
assert a['a']['1'] == 1.1
|
|
assert a['a']['2'] == 2.2
|
|
|
|
|
|
@dataclass
|
|
class CircA:
|
|
b: CircB
|
|
|
|
|
|
@dataclass
|
|
class CircB:
|
|
a: CircA | None
|
|
|
|
|
|
def test_circular():
|
|
defl = SchemaDeflatorGenerator()
|
|
fn = defl.schema_to_deflator(CircA)
|
|
a = fn(CircA(CircB(CircA(CircB(None)))))
|
|
|
|
assert isinstance(a['b'], dict)
|
|
assert isinstance(a['b']['a'], dict)
|
|
assert a['b']['a']['b']['a'] is None
|
|
|
|
|
|
def test_optional():
|
|
@dataclass
|
|
class C:
|
|
a: Optional[int] = None
|
|
|
|
defl = SchemaDeflatorGenerator()
|
|
fn = defl.schema_to_deflator(C)
|
|
c = fn(C())
|
|
assert c['a'] is None
|
|
c = fn(C(123))
|
|
assert c['a'] == 123
|