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
|
import typing as t
import construct as c
from construct_classes import Struct, subcon
class BasicStruct(Struct):
a: int
b: int
SUBCON = c.Struct(
"a" / c.Int8ub,
"b" / c.Int8ub,
)
def test_basic():
bs = BasicStruct(a=5, b=10)
compiled = bs.build()
parsed = BasicStruct.parse(compiled)
assert parsed == bs
class SubconStruct(Struct):
a: int
b: BasicStruct = subcon(BasicStruct)
SUBCON = c.Struct(
"a" / c.Int8ub,
"b" / BasicStruct.SUBCON,
)
def test_subcon():
ss = SubconStruct(a=5, b=BasicStruct(a=10, b=20))
compiled = ss.build()
parsed = SubconStruct.parse(compiled)
assert parsed == ss
substr = parsed.b.build()
assert substr in compiled
class WithDefaultFactory(Struct):
array: t.List[BasicStruct] = subcon(BasicStruct, default_factory=list)
SUBCON = c.Struct(
"array" / c.Array(2, BasicStruct.SUBCON),
)
def test_default():
dd = WithDefaultFactory()
assert dd.array == []
class MoreFieldsInConstruct(Struct):
a: int
SUBCON = c.Struct(
"a" / c.Int8ub,
"b" / c.Tell,
)
def test_more_fields():
MoreFieldsInConstruct.parse(b"\x01")
|