Пример #1
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:]) == """\
Пример #2
0
def test_struct_rendering_with_byte():
    nodes = [model.Struct("Struct", [model.StructMember("a", "byte")])]

    ref = """\
class Struct(prophy.with_metaclass(prophy.struct_generator, prophy.struct)):
    _descriptor = [
        ('a', prophy.u8),
    ]
"""
    assert serialize(nodes) == ref
Пример #3
0
def test_struct_rendering_with_optional():
    nodes = [
        model.Struct("Struct", [model.StructMember("a", "u32", optional=True)])
    ]

    ref = """\
class Struct(prophy.with_metaclass(prophy.struct_generator, prophy.struct)):
    _descriptor = [('a', prophy.optional(prophy.u32))]
"""
    assert ref == serialize(nodes)
Пример #4
0
def test_struct_repr():
    struct = model.Struct("MyStruct", [
        model.StructMember("a", "u8"),
        model.StructMember("b", "u16", bound='xlen'),
        model.StructMember("c", "u32", size=5),
        model.StructMember("d", "u64", bound='xlen', size=5),
        model.StructMember("e", "UU", unlimited=True),
        model.StructMember("f", "UUUU", optional=True)
    ])
    assert str(struct) == """\
Пример #5
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:]) == """\
Пример #6
0
def test_insert_field_no_3_params():
    nodes = [model.Struct("MyStruct", [model.StructMember("field1", "u32")])]
    patches = {
        'MyStruct':
        [patch.Action('insert', ['1', 'additional1', 'u8', 'extra'])]
    }

    with pytest.raises(Exception) as e:
        patch.patch(nodes, patches)
    assert 'Change field must have 3 params: MyStruct' in str(e.value)
Пример #7
0
def make_struct(xml_elem, last_member_array_is_dynamic=False):
    if len(xml_elem):
        members = []
        for member in xml_elem:
            for sub_ in make_struct_members(member,
                                            last_member_array_is_dynamic):
                members.append(sub_)
        return model.Struct(xml_elem.get("name"),
                            members,
                            docstring=get_docstr(xml_elem))
Пример #8
0
def test_make_field_greedy_array():
    nodes = [
        model.Struct("MyStruct", [
            model.StructMember("field1", "u32"),
            model.StructMember("field2", "u32"),
            model.StructMember("field3", "u32")
        ])
    ]
    patches = {'MyStruct': [patch.Action('greedy', ['field3'])]}

    patch.patch(nodes, patches)

    assert [
        model.Struct('MyStruct', [
            model.StructMember('field1', 'u32'),
            model.StructMember('field2', 'u32'),
            model.StructMember('field3', 'u32', greedy=True)
        ])
    ] == nodes
Пример #9
0
def test_cross_reference_expression_as_array_size():
    nodes = [
        model.Struct('X', [
            model.StructMember('x', 'u32', size = '2 * 3'),
        ])
    ]

    model.cross_reference(nodes)

    assert nodes[0].members[0].numeric_size == 6
Пример #10
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) == """\
Пример #11
0
def test_partition_many_dynamic_structs():
    nodes = [
        model.Struct("Dynamic", [
            model.StructMember("num_of_a", "u8"),
            model.StructMember("a", "u8", bound = "num_of_a")
        ]),
        model.Struct("X", [
            model.StructMember("a", "Dynamic"),
            model.StructMember("b", "Dynamic"),
            model.StructMember("c", "Dynamic")
        ])
    ]

    model.cross_reference(nodes)
    model.evaluate_kinds(nodes)
    main, parts = model.partition(nodes[1].members)

    assert [x.name for x in main] == ["a"]
    assert [[x.name for x in part] for part in parts] == [["b"], ["c"]]
Пример #12
0
def test_make_field_static_array():
    nodes = [
        model.Struct("MyStruct", [
            model.StructMember("field1", "u32"),
            model.StructMember("field2", "u32"),
            model.StructMember("field3", "u32")
        ])
    ]
    patches = {'MyStruct': [patch.Action('static', ['field3', '3'])]}

    patch.patch(nodes, patches)

    assert [
        model.Struct('MyStruct', [
            model.StructMember('field1', 'u32'),
            model.StructMember('field2', 'u32'),
            model.StructMember('field3', 'u32', size='3')
        ])
    ] == nodes
Пример #13
0
def test_make_field_limited_array():
    nodes = [
        model.Struct("MyStruct", [
            model.StructMember("field1", "u32"),
            model.StructMember("field2", "u32"),
            model.StructMember("field3", "u32", size='20')
        ])
    ]
    patches = {'MyStruct': [patch.Action('limited', ['field3', 'field2'])]}

    patch.patch(nodes, patches)

    assert [
        model.Struct('MyStruct', [
            model.StructMember('field1', 'u32'),
            model.StructMember('field2', 'u32'),
            model.StructMember('field3', 'u32', bound='field2', size='20')
        ])
    ] == nodes
Пример #14
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) == """\
Пример #15
0
def test_change_field_type():
    nodes = [
        model.Struct("MyStruct", [
            model.StructMember("field1", "u32"),
            model.StructMember("field2", "u32"),
            model.StructMember("field3", "u32")
        ])
    ]
    patches = {'MyStruct': [patch.Action('type', ['field2', 'TheRealType'])]}

    patch.patch(nodes, patches)

    assert [
        model.Struct('MyStruct', [
            model.StructMember('field1', 'u32'),
            model.StructMember('field2', 'TheRealType'),
            model.StructMember('field3', 'u32')
        ])
    ] == nodes
Пример #16
0
def test_cross_reference_typedef():
    nodes = [
        model.Struct("A", [
            model.StructMember("a", "u8")
        ]),
        model.Typedef("B", "A"),
        model.Struct("C", [
            model.StructMember("a", "A"),
            model.StructMember("b", "B")
        ]),
        model.Typedef("D", "B")
    ]

    model.cross_reference(nodes)

    assert nodes[1].definition.name == "A"
    assert nodes[2].members[1].definition.definition.name == "A"
    assert nodes[3].definition.name == "B"
    assert nodes[3].definition.definition.name == "A"
Пример #17
0
def test_definitions_struct_padding():
    nodes = process([
        model.Struct("B", [
            model.StructMember("num_of_a", "u16"),
            model.StructMember("a", "u8", bound="num_of_a")
        ]),
        model.Struct("C", [model.StructMember("a", "u16")]),
        model.Struct("X", [
            model.StructMember("a", "u8"),
            model.StructMember("b", "B"),
            model.StructMember("c", "C"),
            model.StructMember("d", "u32"),
            model.StructMember("num_of_e", "u32"),
            model.StructMember("e", "u64", bound="num_of_e"),
            model.StructMember("f", "u8")
        ])
    ])

    assert generate_definitions(nodes[-1:]) == """\
Пример #18
0
def test_insert_field_index_not_an_int():
    nodes = [model.Struct("MyStruct", [model.StructMember("field1", "u32")])]
    patches = {
        'MyStruct':
        [patch.Action('insert', ['not_a_number', 'additional1', 'u8'])]
    }

    with pytest.raises(Exception) as e:
        patch.patch(nodes, patches)
    assert 'Index is not a number: MyStruct' in str(e.value)
Пример #19
0
def test_struct_with_incomplete_array(extension):
    hpp = """\
struct X
{
    char b[];
};
"""
    assert parse(hpp, extension) == [
        model.Struct('X', [model.StructMember('b', 'i8')])
    ]
Пример #20
0
def test_swap_struct_with_many_arrays_passing_numbering_fields_heavily():
    nodes = [
        model.Struct("X", [(model.StructMember("num_of_a", "u32")),
                           (model.StructMember("num_of_b", "u32")),
                           (model.StructMember("b", "u16", bound="num_of_b")),
                           (model.StructMember("num_of_c", "u32")),
                           (model.StructMember("c", "u16", bound="num_of_c")),
                           (model.StructMember("a", "u16", bound="num_of_a"))])
    ]

    assert generate_swap(nodes) == """\
Пример #21
0
def test_swap_struct_with_many_arrays():
    nodes = [
        model.Struct("X", [(model.StructMember("num_of_x", "u32")),
                           (model.StructMember("x", "u32", bound="num_of_x")),
                           (model.StructMember("num_of_y", "u32")),
                           (model.StructMember("y", "u32", bound="num_of_y")),
                           (model.StructMember("num_of_z", "u32")),
                           (model.StructMember("z", "u32", bound="num_of_z"))])
    ]

    assert generate_swap(nodes) == """\
Пример #22
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) == """\
Пример #23
0
def test_rename_field():
    nodes = [
        model.Struct("MyStruct", [
            model.StructMember("field1", "u32"),
            model.StructMember("field2", "u32"),
            model.StructMember("field3", "u32")
        ])
    ]

    patches = {'MyStruct': [patch.Action('rename', ['field2', 'field69'])]}

    patch.patch(nodes, patches)

    assert [
        model.Struct('MyStruct', [
            model.StructMember('field1', 'u32'),
            model.StructMember('field69', 'u32'),
            model.StructMember('field3', 'u32')
        ])
    ] == nodes
Пример #24
0
def test_nested_typedefs():
    hpp = """\
typedef int my_int;
typedef my_int i_like_typedefs;
typedef i_like_typedefs i_really_do;
struct X
{
    i_really_do a;
};
"""
    assert parse(hpp) == [model.Struct("X", [model.StructMember("a", "i32")])]
Пример #25
0
def test_omit_bitfields():
    hpp = """\
typedef struct X
{
    unsigned a: 1;
    unsigned b: 1;
    unsigned c: 1;
    unsigned  : 5;
};
"""
    assert parse(hpp) == [model.Struct('X', [])]
Пример #26
0
def test_array():
    hpp = """\
#include <stdint.h>
struct X
{
    uint32_t a[4];
};
"""
    assert parse(hpp) == [
        model.Struct("X", [model.StructMember("a", "u32", size=4)])
    ]
Пример #27
0
def test_definitions_struct_with_ext_sized_array():
    nodes = process([
        model.Struct("Struct", [
            model.StructMember("count", "u8"),
            model.StructMember("a", "u8", bound="count"),
            model.StructMember("b", "u8", bound="count"),
            model.StructMember("c", "u8", bound="count")
        ])
    ])

    assert generate_definitions(nodes) == """\
Пример #28
0
def test_definitions_struct_many_arrays_bounded_by_the_same_member():
    nodes = process([
        model.Struct("ManyArraysBoundedByTheSame", [
            model.StructMember("num_of_elements", "u8"),
            model.StructMember("dummy", "u8"),
            model.StructMember("a", "u8", bound="num_of_elements"),
            model.StructMember("b", "u8", bound="num_of_elements")
        ])
    ])

    assert generate_definitions(nodes) == """\
Пример #29
0
def test_evaluate_sizes_empty():
    nodes = process([
        model.Struct('X', []),
        model.Union('X', []),
    ])
    assert list(map(get_size_alignment_padding, get_members_and_node(nodes[0]))) == [
        (0, 1)
    ]
    assert list(map(get_size_alignment_padding, get_members_and_node(nodes[1]))) == [
        (4, 4)
    ]
Пример #30
0
def test_definitions_struct_with_limited_array():
    nodes = process([
        model.Constant('NUM_OF_ARRAY_ELEMS', '1'),
        model.Struct("Struct", [
            model.StructMember("a_len", "u8"),
            model.StructMember(
                "a", "u8", bound="a_len", size="NUM_OF_ARRAY_ELEMS")
        ])
    ])

    assert generate_definitions(nodes[-1:]) == """\