diff --git a/pdl-compiler/scripts/generate_cxx_backend_tests.py b/pdl-compiler/scripts/generate_cxx_backend_tests.py index 60e20a4..42e8bfd 100755 --- a/pdl-compiler/scripts/generate_cxx_backend_tests.py +++ b/pdl-compiler/scripts/generate_cxx_backend_tests.py @@ -149,6 +149,10 @@ def check_members(decl: ast.Declaration, var: str, expected: object) -> List[str child_packet_id = test.get('packet', packet.id) child_packet = packet.file.packet_scope[child_packet_id] + # TODO validate array elements in packet declarations. + if child_packet_id == 'Packet_Array_Field_EnumElement_ConstantSize' and 'expected_error' in test: + continue + if 'expected_error' in test: generated_tests.append( dedent("""\ diff --git a/pdl-compiler/src/backends/python.rs b/pdl-compiler/src/backends/python.rs index 7a80eb5..ec4faa7 100644 --- a/pdl-compiler/src/backends/python.rs +++ b/pdl-compiler/src/backends/python.rs @@ -1318,7 +1318,7 @@ span = span[-{offset_bytes}:] width / 8 )); self.append(format!( - " fields['{}'] = {}(int.from_bytes(span[:{}], byteorder='{}'))", + " fields['{}'] = {}.from_int(int.from_bytes(span[:{}], byteorder='{}'))", id, type_id, width / 8, @@ -1710,6 +1710,6 @@ mod test { "Packet_Array_Field_VariableElementSize_UnknownSize".to_string(), ], ); - assert_snapshot_eq(&format!("tests/generated/python/le_backend.py"), &actual_code); + assert_snapshot_eq("tests/generated/python/le_backend.py", &actual_code); } } diff --git a/pdl-compiler/tests/canonical/le_test_vectors.json b/pdl-compiler/tests/canonical/le_test_vectors.json index ae93d80..e6f2e94 100644 --- a/pdl-compiler/tests/canonical/le_test_vectors.json +++ b/pdl-compiler/tests/canonical/le_test_vectors.json @@ -64,6 +64,18 @@ "a": 0, "c": 283686952306183 } + }, + { + "packed": "", + "expected_error": "LengthError" + }, + { + "packed": "000000", + "expected_error": "LengthError" + }, + { + "packed": "000000000000000000", + "expected_error": "TrailingBytesError" } ] }, @@ -111,6 +123,18 @@ "a": 2, "c": 4523477106694685 } + }, + { + "packed": "0000000000000000", + "expected_error": "EnumValueError" + }, + { + "packed": "0500000000000000", + "expected_error": "EnumValueError" + }, + { + "packed": "7e00000000000000", + "expected_error": "EnumValueError" } ] }, @@ -344,6 +368,14 @@ "unpacked": { "b": 29507425461658859 } + }, + { + "packed": "0000000000000000", + "expected_error": "FixedValueError" + }, + { + "packed": "0600000000000000", + "expected_error": "FixedValueError" } ] }, @@ -367,6 +399,14 @@ "unpacked": { "b": 32055067271627274 } + }, + { + "packed": "0200000000000000", + "expected_error": "FixedValueError" + }, + { + "packed": "0400000000000000", + "expected_error": "FixedValueError" } ] }, @@ -1099,6 +1139,10 @@ ] } } + }, + { + "packed": "aa02", + "expected_error": "LengthError" } ] }, @@ -1115,6 +1159,14 @@ 134 ] } + }, + { + "packed": "0102", + "expected_error": "LengthError" + }, + { + "packed": "0102030405", + "expected_error": "TrailingBytesError" } ] }, @@ -1243,6 +1295,10 @@ 48613 ] } + }, + { + "packed": "03010203", + "expected_error": "ArraySizeError" } ] }, @@ -1313,6 +1369,10 @@ 52445 ] } + }, + { + "packed": "bbaaddccbbaaddee", + "expected_error": "EnumValueError" } ] }, @@ -2494,6 +2554,14 @@ "a": 52445, "b": 52445 } + }, + { + "packed": "0212345678", + "expected_error": "EnumValueError" + }, + { + "packed": "02ddccddcc00", + "expected_error": "TrailingBytesError" } ] }, @@ -5162,6 +5230,14 @@ "unpacked": { "e": 1 } + }, + { + "packed": "02", + "expected_error": "EnumValueError" + }, + { + "packed": "07", + "expected_error": "EnumValueError" } ] }, @@ -5374,101 +5450,5 @@ } } ] - }, - - { - "packet": "Packet_Scalar_Field", - "tests": [ - { - "packed": "", - "expected_error": "LengthError" - }, - { - "packed": "000000", - "expected_error": "LengthError" - }, - { - "packed": "000000000000000000", - "expected_error": "TrailingBytesError" - } - ] - }, - { - "packet": "Packet_Enum_Field", - "tests": [ - { - "packed": "0000000000000000", - "expected_error": "EnumValueError" - }, - { - "packed": "0500000000000000", - "expected_error": "EnumValueError" - }, - { - "packed": "7e00000000000000", - "expected_error": "EnumValueError" - } - ] - }, - { - "packet": "Packet_FixedScalar_Field", - "tests": [ - { - "packed": "0000000000000000", - "expected_error": "FixedValueError" - }, - { - "packed": "0600000000000000", - "expected_error": "FixedValueError" - } - ] - }, - { - "packet": "Packet_FixedEnum_Field", - "tests": [ - { - "packed": "0200000000000000", - "expected_error": "FixedValueError" - }, - { - "packed": "0400000000000000", - "expected_error": "FixedValueError" - } - ] - }, - { - "packet": "Packet_Array_Field_ByteElement_ConstantSize", - "tests": [ - { - "packed": "0102", - "expected_error": "LengthError" - }, - { - "packed": "0102030405", - "expected_error": "TrailingBytesError" - } - ] - }, - { - "packet": "Packet_Array_Field_ScalarElement_VariableSize", - "tests": [ - { - "packed": "03010203", - "expected_error": "ArraySizeError" - } - ] - }, - { - "packet": "Enum_Incomplete_Truncated_Closed", - "tests": [ - { - "packed": "02", - "expected_error": "EnumValueError" - }, - { - "packed": "07", - "expected_error": "EnumValueError" - } - ] } ] diff --git a/pdl-compiler/tests/generated/python/le_backend.py b/pdl-compiler/tests/generated/python/le_backend.py index c4f8be6..e597a71 100644 --- a/pdl-compiler/tests/generated/python/le_backend.py +++ b/pdl-compiler/tests/generated/python/le_backend.py @@ -1987,12 +1987,12 @@ def parse(span: bytes) -> Tuple['Packet_Optional_Enum_Field', bytes]: if c0 == 0: if len(span) < 2: raise LengthError("Packet_Optional_Enum_Field", 2, len(span)) - fields['a'] = Enum16(int.from_bytes(span[:2], byteorder='little')) + fields['a'] = Enum16.from_int(int.from_bytes(span[:2], byteorder='little')) span = span[2:] if c1 == 1: if len(span) < 2: raise LengthError("Packet_Optional_Enum_Field", 2, len(span)) - fields['b'] = Enum16(int.from_bytes(span[:2], byteorder='little')) + fields['b'] = Enum16.from_int(int.from_bytes(span[:2], byteorder='little')) span = span[2:] return Packet_Optional_Enum_Field(**fields), span @@ -4425,12 +4425,12 @@ def parse(span: bytes) -> Tuple['Struct_Optional_Enum_Field_', bytes]: if c0 == 0: if len(span) < 2: raise LengthError("Struct_Optional_Enum_Field_", 2, len(span)) - fields['a'] = Enum16(int.from_bytes(span[:2], byteorder='little')) + fields['a'] = Enum16.from_int(int.from_bytes(span[:2], byteorder='little')) span = span[2:] if c1 == 1: if len(span) < 2: raise LengthError("Struct_Optional_Enum_Field_", 2, len(span)) - fields['b'] = Enum16(int.from_bytes(span[:2], byteorder='little')) + fields['b'] = Enum16.from_int(int.from_bytes(span[:2], byteorder='little')) span = span[2:] return Struct_Optional_Enum_Field_(**fields), span