def test_type_refinement_spec() -> None: spec = { "Message_Type": Specification( ContextSpec([]), PackageSpec( "Message_Type", [ ModularInteger("__PACKAGE__.T", Number(256)), MessageSpec( "__PACKAGE__.PDU", [ Component( "Foo", "T", [ Then( "Bar", UNDEFINED, UNDEFINED, LessEqual(Variable("Foo"), Number(30, 16)), ), Then( "Baz", UNDEFINED, UNDEFINED, Greater(Variable("Foo"), Number(30, 16)), ), ], ), Component("Bar", "T"), Component("Baz", "T"), ], ), MessageSpec( "__PACKAGE__.Simple_PDU", [Component("Bar", "T"), Component("Baz", "T")], ), MessageSpec("__PACKAGE__.Empty_PDU", []), ], ), ), "Type_Refinement": Specification( ContextSpec(["Message_Type"]), PackageSpec( "Type_Refinement", [ RefinementSpec( "Message_Type.Simple_PDU", "Bar", "Message_Type.PDU", Equal(Variable("Baz"), Number(42)), ), RefinementSpec("Message_Type.PDU", "Bar", "Message_Type.Simple_PDU"), ], ), ), } assert_specifications_files( [f"{TESTDIR}/message_type.rflx", f"{TESTDIR}/type_refinement.rflx"], spec )
def test_context_spec() -> None: assert_specifications_files( [f"{TESTDIR}/context.rflx"], { "Context": Specification( ContextSpec(["Empty_File", "Empty_Package"]), PackageSpec("Context", []), ), "Empty_Package": Specification(ContextSpec([]), PackageSpec("Empty_Package", [])), }, )
def test_array_type_spec() -> None: spec = { "Array_Type": Specification( ContextSpec([]), PackageSpec( "Array_Type", [ ModularInteger("__PACKAGE__.Byte", Number(256)), ArraySpec("__PACKAGE__.Bytes", ReferenceSpec("__PACKAGE__.Byte")), MessageSpec( "__PACKAGE__.Foo", [ Component( "Length", "Byte", [Then("Bytes", UNDEFINED, Mul(Variable("Length"), Number(8)))], ), Component("Bytes", "Bytes"), ], ), ArraySpec("__PACKAGE__.Bar", ReferenceSpec("__PACKAGE__.Foo")), ], ), ) } assert_specifications_files([f"{TESTDIR}/array_type.rflx"], spec)
def test_type_derivation_spec() -> None: assert_specifications_string( """ package Test is type T is mod 256; type Foo is message N : T; end message; type Bar is new Foo; end Test; """, { "Test": Specification( ContextSpec([]), PackageSpec( "Test", [ ModularInteger("__PACKAGE__.T", Number(256)), MessageSpec("__PACKAGE__.Foo", [Component("N", "T")]), DerivationSpec("__PACKAGE__.Bar", "Foo"), ], ), ) }, )
def test_integer_type_spec() -> None: spec = { "Integer_Type": Specification( ContextSpec([]), PackageSpec( "Integer_Type", [ RangeInteger("__PACKAGE__.Page_Num", Number(1), Number(2000), Number(16)), RangeInteger("__PACKAGE__.Line_Size", Number(0), Number(255), Number(8)), ModularInteger("__PACKAGE__.Byte", Number(256)), ModularInteger("__PACKAGE__.Hash_Index", Number(64)), ], ), ) } assert_specifications_files([f"{TESTDIR}/integer_type.rflx"], spec)
def test_enumeration_type_spec() -> None: spec = { "Enumeration_Type": Specification( ContextSpec([]), PackageSpec( "Enumeration_Type", [ Enumeration( "__PACKAGE__.Day", [ ("Mon", Number(1)), ("Tue", Number(2)), ("Wed", Number(3)), ("Thu", Number(4)), ("Fri", Number(5)), ("Sat", Number(6)), ("Sun", Number(7)), ], Number(3), False, ), Enumeration( "__PACKAGE__.Gender", [("M", Number(0)), ("F", Number(1))], Number(1), False, ), Enumeration( "__PACKAGE__.Priority", [("LOW", Number(1)), ("MEDIUM", Number(4)), ("HIGH", Number(7))], Number(8), True, ), ], ), ) } assert_specifications_files([f"{TESTDIR}/enumeration_type.rflx"], spec)
def test_duplicate_specifications() -> None: files = [f"{TESTDIR}/empty_package.rflx", f"{TESTDIR}/empty_package.rflx"] assert_specifications_files( files, {"Empty_Package": Specification(ContextSpec([]), PackageSpec("Empty_Package", []))}, ) assert_messages_files(files, [])
def test_package_spec() -> None: assert_specifications_files( [f"{TESTDIR}/empty_package.rflx"], {"Empty_Package": Specification(ContextSpec([]), PackageSpec("Empty_Package", []))}, )
def test_ethernet_spec() -> None: spec = { "Ethernet": Specification( ContextSpec([]), PackageSpec( "Ethernet", [ ModularInteger("__PACKAGE__.Address", Pow(Number(2), Number(48))), RangeInteger( "__PACKAGE__.Type_Length", Number(46), Sub(Pow(Number(2), Number(16)), Number(1)), Number(16), ), RangeInteger( "__PACKAGE__.TPID", Number(0x8100, 16), Number(0x8100, 16), Number(16) ), ModularInteger("__PACKAGE__.TCI", Pow(Number(2), Number(16))), MessageSpec( "__PACKAGE__.Frame", [ Component("Destination", "Address"), Component("Source", "Address"), Component( "Type_Length_TPID", "Type_Length", [ Then( "TPID", First("Type_Length_TPID"), UNDEFINED, Equal(Variable("Type_Length_TPID"), Number(33024, 16)), ), Then( "Type_Length", First("Type_Length_TPID"), UNDEFINED, NotEqual(Variable("Type_Length_TPID"), Number(33024, 16)), ), ], ), Component("TPID", "TPID"), Component("TCI", "TCI"), Component( "Type_Length", "Type_Length", [ Then( "Payload", UNDEFINED, Mul(Variable("Type_Length"), Number(8)), LessEqual(Variable("Type_Length"), Number(1500)), ), Then( "Payload", UNDEFINED, Sub(Last("Message"), Last("Type_Length")), GreaterEqual(Variable("Type_Length"), Number(1536)), ), ], ), Component( "Payload", "Opaque", [ Then( condition=And( GreaterEqual( Div(Length("Payload"), Number(8)), Number(46), ), LessEqual( Div(Length("Payload"), Number(8)), Number(1500), ), ), ) ], ), ], ), ], ), ) } assert_specifications_files([f"{SPECDIR}/ethernet.rflx"], spec)