Example #1
0
def test_evaluate_sizes_array_with_named_size():
    nodes = process([
        model.Constant('NUM', '3'),
        model.Enum('E', [
            model.EnumMember('E1', '1'),
            model.EnumMember('E3', 'NUM')
        ]),
        model.Struct('X', [
            model.StructMember('x', 'u32', size = 'NUM'),
            model.StructMember('y', 'u32', size = 'E1'),
            model.StructMember('z', 'u32', size = 'E3')
        ]),
        model.Struct('Y', [
            model.StructMember('x', 'u32', size = 'UNKNOWN'),
            model.StructMember('y', 'u32')
        ])

    ])

    assert list(map(get_size_alignment_padding, get_members_and_node(nodes[2]))) == [
        (12, 4, 0),
        (4, 4, 0),
        (12, 4, 0),
        (28, 4)
    ]
    assert list(map(get_size_alignment_padding, get_members_and_node(nodes[3]))) == [
        (None, None, None),
        (4, 4, None),
        (None, None)
    ]
Example #2
0
def test_structs_with_dynamic_arrays_bounded_by_the_same_member_parsing_typedef_sizer(
):
    content = """\
typedef i32 num_of_elements_t;
typedef num_of_elements_t sz_t;
struct ExtSized
{
    sz_t sz;
    u32 one<@sz>;
    u16 two<@sz>;
    i32 three<@sz>;
};
"""

    assert parse(content) == [
        model.Typedef('num_of_elements_t', 'i32'),
        model.Typedef('sz_t', 'num_of_elements_t',
                      model.Typedef('num_of_elements_t', 'i32', None)),
        model.Struct('ExtSized', [
            model.StructMember(
                'sz', 'sz_t',
                model.Typedef('sz_t', 'num_of_elements_t',
                              model.Typedef('num_of_elements_t', 'i32',
                                            None))),
            model.StructMember('one', 'u32', bound='sz'),
            model.StructMember('two', 'u16', bound='sz'),
            model.StructMember('three', 'i32', bound='sz')
        ])
    ]
Example #3
0
def test_duplicated_identifiers_struct():
    with pytest.raises(model.ModelError,
                       match="Duplicated 'field_name' identifier in struct A"):
        model.Struct("A", [
            model.StructMember('field_name', 'u32'),
            model.StructMember('field_name', 'u16'),
        ])
Example #4
0
def test_cross_reference_array_size_from_includes():
    nodes = [
        model.Include('x', [
            model.Include('y', [
                model.Constant('NUM_HEX', '0xf'),
                model.Constant('NUM_DEC', '3'),
            ]),
            model.Enum('E', [
                model.EnumMember('E1', 'NUM_HEX'),
                model.EnumMember('E3', 'NUM_DEC'),
            ]),
        ]),
        model.Struct('X', [
            model.StructMember('x', 'u32', size='NUM_DEC'),
            model.StructMember('y', 'u32', size='E1'),
            model.StructMember('z', 'u32', size='UNKNOWN'),
            model.StructMember('a', 'u32', size='E3'),
        ])
    ]

    constants = model.cross_reference(nodes)

    assert nodes[1].members[0].numeric_size == 3
    assert nodes[1].members[1].numeric_size == 15
    assert nodes[1].members[2].numeric_size is None
    assert nodes[1].members[3].numeric_size == 3

    assert constants == {
        'E1': 15,
        'E3': 3,
        'NUM_DEC': 3,
        'NUM_HEX': 15,
    }
Example #5
0
def test_swap_struct_with_optional_element():
    nodes = [
        model.Struct("X", [(model.StructMember("x", "u32", optional=True)),
                           (model.StructMember("y", "Y", optional=True))])
    ]

    assert generate_swap(nodes) == """\
Example #6
0
def test_isar_struct_parsing_ext_sized_array():
    xml = """\
<x>
    <struct name="StructX">
        <member name="a" type="u8"/>
        <member name="numOfZzz" type="u16"/>
        <member name="prophy_styled_x" type="u16">
            <dimension isVariableSize="true" variableSizeFieldName="@a"/>
        </member>
        <member name="prophy_styled_y" type="u16">
            <dimension isVariableSize="true" variableSizeFieldName="@a"/>
        </member>
        <member name="nativeIsarDefined" type="u32">
            <dimension size="THIS_IS_VARIABLE_SIZE_ARRAY"/>
        </member>
    </struct>
</x>
"""
    assert parse(xml) == [
        model.Struct("StructX", [
            model.StructMember("a", "u8"),
            model.StructMember("numOfZzz", "u16"),
            model.StructMember("prophy_styled_x", "u16", bound = "a"),
            model.StructMember("prophy_styled_y", "u16", bound = "a"),
            model.StructMember("nativeIsarDefined", "u32", bound = "numOfNativeIsarDefined")
        ])
    ]
Example #7
0
def test_multiple_enums():
    hpp = """\
typedef enum Enum
{
    Enum_One = 1,
    Enum_Two = 2,
    Enum_Three = 3
} Enum;
struct X
{
    Enum a;
    Enum b;
    Enum c;
};
"""
    assert parse(hpp) == [
        model.Enum("Enum", [
            model.EnumMember("Enum_One", "1"),
            model.EnumMember("Enum_Two", "2"),
            model.EnumMember("Enum_Three", "3")
        ]),
        model.Struct("X", [
            model.StructMember("a", "Enum"),
            model.StructMember("b", "Enum"),
            model.StructMember("c", "Enum")
        ])
    ]
Example #8
0
def test_swap_struct_with_dynamic_array_of_fixed_elements():
    nodes = [
        model.Struct("X", [(model.StructMember("num_of_x", "u32")),
                           (model.StructMember("x", "u16", bound="num_of_x"))])
    ]

    assert generate_swap(nodes) == """\
Example #9
0
def test_cross_reference_array_size_from_includes():
    nodes = [
        model.Include('x', [
            model.Include('y', [
                model.Constant('NUM', '3'),
            ]),
            model.Enum('E', [
                model.EnumMember('E1', '1'),
                model.EnumMember('E3', 'NUM')
            ]),
        ]),
        model.Struct('X', [
            model.StructMember('x', 'u32', size = 'NUM'),
            model.StructMember('y', 'u32', size = 'E1'),
            model.StructMember('z', 'u32', size = 'UNKNOWN'),
            model.StructMember('a', 'u32', size = 'E3')
        ])
    ]

    model.cross_reference(nodes)

    assert nodes[1].members[0].numeric_size == 3
    assert nodes[1].members[1].numeric_size == 1
    assert nodes[1].members[2].numeric_size == None
    assert nodes[1].members[3].numeric_size == 3
Example #10
0
def test_swap_struct_with_limited_array_of_fixed_elements():
    nodes = [
        model.Struct(
            "X", [(model.StructMember("num_of_x", "u16")),
                  (model.StructMember("x", "Y", bound="num_of_x", size=3))])
    ]

    assert generate_swap(nodes) == """\
Example #11
0
def test_swap_struct_with_ext_sized_array_of_fixed_elements():
    nodes = process([
        model.Struct("X", [(model.StructMember("szr", "u32")),
                           (model.StructMember("x", "u16", bound="szr")),
                           (model.StructMember("y", "u16", bound="szr"))])
    ])

    assert generate_swap(nodes) == """\
Example #12
0
def test_swap_struct_with_optional_element():
    nodes = process([
        model.Typedef('Y', 'u32'),
        model.Struct("X", [(model.StructMember("x", "u32", optional=True)),
                           (model.StructMember("y", "Y", optional=True))])
    ])

    assert generate_swap(nodes[-1:]) == """\
Example #13
0
def test_swap_struct_with_greedy_array():
    nodes = [
        model.Struct("X", [(model.StructMember("x", "u8")),
                           (model.StructMember("y", "Y", unlimited=True))]),
        model.Struct("Z", [(model.StructMember("z", "X"))])
    ]

    assert generate_swap(nodes) == """\
Example #14
0
def test_model_sort_struct_with_two_deps():
    nodes = [model.Struct("C", [model.StructMember("a", "B")]),
             model.Struct("B", [model.StructMember("a", "A")]),
             model.Struct("A", [model.StructMember("a", "X")])]

    model.topological_sort(nodes)

    assert ["A", "B", "C"] == [node.name for node in nodes]
Example #15
0
def test_definitions_struct():
    nodes = [
        model.Struct("Struct", [(model.StructMember("a", "u8")),
                                (model.StructMember("b", "i64")),
                                (model.StructMember("c", "r32")),
                                (model.StructMember("d", "TTypeX"))])
    ]

    assert generate_definitions(nodes) == """\
Example #16
0
def test_swap_struct_with_dynamic_element():
    nodes = process([
        model.Struct("Dynamic",
                     [(model.StructMember("num_of_x", "u32")),
                      (model.StructMember("x", "u16", bound="num_of_x"))]),
        model.Struct("X", [(model.StructMember("a", "Dynamic"))])
    ])

    assert generate_swap(nodes) == """\
Example #17
0
def test_swap_struct_with_limited_array_of_fixed_elements():
    nodes = process([
        model.Typedef('Y', 'u32'),
        model.Struct(
            "X", [(model.StructMember("num_of_x", "u16")),
                  (model.StructMember("x", "Y", bound="num_of_x", size=3))])
    ])

    assert generate_swap(nodes[-1:]) == """\
Example #18
0
def test_swap_struct_with_dynamic_field_and_tail_fixed():
    nodes = [
        model.Struct("X", [(model.StructMember("num_of_x", "u8")),
                           (model.StructMember("x", "u8", bound="num_of_x")),
                           (model.StructMember("y", "u32")),
                           (model.StructMember("z", "u64"))])
    ]

    assert generate_swap(nodes) == """\
Example #19
0
def test_definitions_struct_with_dynamic_array():
    nodes = [
        model.Struct("Struct", [
            model.StructMember("tmpName", "TNumberOfItems"),
            model.StructMember("a", "u8", bound="tmpName")
        ])
    ]

    assert generate_definitions(nodes) == """\
Example #20
0
def test_swap_struct_with_many_arrays_passing_numbering_fields():
    nodes = [
        model.Struct("X", [(model.StructMember("num_of_x", "u32")),
                           (model.StructMember("num_of_y", "u32")),
                           (model.StructMember("x", "u32", bound="num_of_x")),
                           (model.StructMember("y", "u32", bound="num_of_y"))])
    ]

    assert generate_swap(nodes) == """\
Example #21
0
def test_definitions_struct():
    nodes = process([
        model.Typedef('TTypeX', 'u32'),
        model.Struct("Struct", [(model.StructMember("a", "u8")),
                                (model.StructMember("b", "i64")),
                                (model.StructMember("c", "r32")),
                                (model.StructMember("d", "TTypeX"))])
    ])

    assert generate_definitions(nodes[-1:]) == """\
Example #22
0
def test_definitions_struct_with_dynamic_array():
    nodes = process([
        model.Typedef('TNumberOfItems', 'u32'),
        model.Struct("Struct", [
            model.StructMember("tmpName", "TNumberOfItems"),
            model.StructMember("a", "u8", bound="tmpName")
        ])
    ])

    assert generate_definitions(nodes[-1:]) == """\
Example #23
0
def test_swap_struct_with_greedy_array():
    nodes = process([
        model.Typedef('X', 'u32'),
        model.Typedef('Y', 'u32'),
        model.Struct("X", [(model.StructMember("x", "u8")),
                           (model.StructMember("y", "Y", unlimited=True))]),
        model.Struct("Z", [(model.StructMember("z", "X"))])
    ])

    assert generate_swap(nodes) == """\
Example #24
0
def test_swap_struct_with_many_arrays_bounded_by_the_same_member():
    nodes = process([
        model.Struct(
            "X", [(model.StructMember("num_of_elements", "u32")),
                  (model.StructMember("dummy", "u32")),
                  (model.StructMember("x", "u32", bound="num_of_elements")),
                  (model.StructMember("y", "u32", bound="num_of_elements"))])
    ])

    assert generate_swap(nodes) == """\
Example #25
0
def test_definitions_struct_with_limited_array():
    nodes = [
        model.Struct("Struct", [
            model.StructMember("a_len", "u8"),
            model.StructMember(
                "a", "u8", bound="a_len", size="NUM_OF_ARRAY_ELEMS")
        ])
    ]

    assert generate_definitions(nodes) == """\
Example #26
0
def test_model_sort_structs():
    nodes = [
        model.Struct("C", [
            model.StructMember("a", "B"),
            model.StructMember("b", "A"),
            model.StructMember("c", "D"),
        ]),
        model.Struct("B", [
            model.StructMember("a", "X"),
            model.StructMember("b", "A"),
            model.StructMember("c", "Y"),
        ]),
        model.Struct("A", [
            model.StructMember("a", "X"),
            model.StructMember("b", "Y"),
            model.StructMember("c", "Z"),
        ]),
    ]

    model.topological_sort(nodes)

    assert [node.name for node in nodes] == ["A", "B", "C"]
    assert [tuple(node.dependencies()) for node in nodes] == [('X', 'Y', 'Z'),
                                                              ('X', 'A', 'Y'),
                                                              ('B', 'A', 'D')]
Example #27
0
def test_insert_field():
    nodes = [
        model.Struct("MyStruct", [
            model.StructMember("field1", "u32"),
            model.StructMember("field2", "u32"),
            model.StructMember("field3", "u32")
        ])
    ]
    patches = {
        'MyStruct': [
            patch.Action('insert', ['1', 'additional1', 'u8']),
            patch.Action('insert', ['-1', 'additional2', 'u16']),
            patch.Action('insert', ['128', 'additional3', 'u64'])
        ]
    }

    patch.patch(nodes, patches)

    assert [
        model.Struct('MyStruct', [
            model.StructMember('field1', 'u32'),
            model.StructMember('additional1', 'u8'),
            model.StructMember('field2', 'u32'),
            model.StructMember('additional2', 'u16'),
            model.StructMember('field3', 'u32'),
            model.StructMember('additional3', 'u64')
        ])
    ] == nodes
Example #28
0
def test_cross_reference_structs():
    nodes = [
        model.Struct("A", [
            model.StructMember("a", "u8")
        ]),
        model.Struct("B", [
            model.StructMember("a", "A"),
            model.StructMember("b", "u8")
        ]),
        model.Struct("C", [
            model.StructMember("a", "A"),
            model.StructMember("b", "B"),
            model.StructMember("c", "NON_EXISTENT")
        ]),
        model.Struct("D", [
            model.StructMember("a", "A"),
            model.StructMember("b", "B"),
            model.StructMember("c", "C")
        ])
    ]

    model.cross_reference(nodes)

    definition_names = [[x.definition.name if x.definition else None for x in y.members] for y in nodes]
    assert definition_names == [
        [None],
        ['A', None],
        ['A', 'B', None],
        ['A', 'B', 'C']
    ]
Example #29
0
def test_definitions_struct_many_arrays_mixed():
    nodes = [
        model.Struct("ManyArraysMixed", [
            model.StructMember("num_of_a", "u8"),
            model.StructMember("num_of_b", "u8"),
            model.StructMember("a", "u8", bound="num_of_a"),
            model.StructMember("b", "u8", bound="num_of_b")
        ])
    ]

    assert generate_definitions(nodes) == """\
Example #30
0
def test_swap_struct_with_many_dynamic_fields():
    nodes = [
        model.Struct("Y",
                     [(model.StructMember("num_of_x", "u32")),
                      (model.StructMember("x", "u16", bound="num_of_x"))]),
        model.Struct("X", [(model.StructMember("x", "Y")),
                           (model.StructMember("y", "Y")),
                           (model.StructMember("z", "Y"))])
    ]

    assert generate_swap(nodes) == """\