Example #1
0
    def test_copy_from_list_of_structs_with_pointers(self):
        class Person(Struct):
            __static_data_size__ = 1
            __static_ptrs_size__ = 1

        john =  b('\x20\x00\x00\x00\x00\x00\x00\x00'    # age=32
                  '\x01\x00\x00\x00\x2a\x00\x00\x00'    # name=ptr
                  'J' 'o' 'h' 'n' '\x00\x00\x00\x00')   # John

        # emily is a "split struct", with garbage between the body and the extra
        emily = b('garbage0'
                  '\x18\x00\x00\x00\x00\x00\x00\x00'    # age=24
                  '\x09\x00\x00\x00\x32\x00\x00\x00'    # name=ptr
                  'garbage1'
                  'garbage2'
                  '\x45\x6d\x69\x6c\x79\x00\x00\x00'    # Emily
                  'garbage3')

        john = Person.from_buffer(john, 0, 1, 1)
        emily = Person.from_buffer(emily, 8, 1, 1)
        #
        buf = SegmentBuilder()
        pos = buf.allocate(8)
        item_type = StructItemType(Person)
        buf.copy_from_list(pos, item_type, [john, emily])
        s = buf.as_string()
        expected_buf = b('\x01\x00\x00\x00\x27\x00\x00\x00'    # ptrlist
                         '\x08\x00\x00\x00\x01\x00\x01\x00'    # list tag
                         '\x20\x00\x00\x00\x00\x00\x00\x00'    # age=32
                         '\x09\x00\x00\x00\x2a\x00\x00\x00'    # name=ptr
                         '\x18\x00\x00\x00\x00\x00\x00\x00'    # age=24
                         '\x05\x00\x00\x00\x32\x00\x00\x00'    # name=ptr
                         'J' 'o' 'h' 'n' '\x00\x00\x00\x00'    # John
                         'E' 'm' 'i' 'l' 'y' '\x00\x00\x00')   # Emily
        assert s == expected_buf
Example #2
0
    def test_copy_from_list_of_structs(self):
        class Point(Struct):
            __static_data_size__ = 2
            __static_ptrs_size__ = 0

        buf1 = b('\x0a\x00\x00\x00\x00\x00\x00\x00'    # 10
                 '\x64\x00\x00\x00\x00\x00\x00\x00')   # 100
        buf2 = b('\x14\x00\x00\x00\x00\x00\x00\x00'    # 20
                 '\xc8\x00\x00\x00\x00\x00\x00\x00')   # 200
        buf3 = b('\x1e\x00\x00\x00\x00\x00\x00\x00'    # 30
                 '\x2c\x01\x00\x00\x00\x00\x00\x00')   # 300
        buf4 = b('\x28\x00\x00\x00\x00\x00\x00\x00'    # 40
                 '\x90\x01\x00\x00\x00\x00\x00\x00')   # 400
        p1 = Point.from_buffer(buf1, 0, 2, 0)
        p2 = Point.from_buffer(buf2, 0, 2, 0)
        p3 = Point.from_buffer(buf3, 0, 2, 0)
        p4 = Point.from_buffer(buf4, 0, 2, 0)
        #
        buf = SegmentBuilder()
        pos = buf.allocate(8)
        item_type = StructItemType(Point)
        buf.copy_from_list(pos, item_type, [p1, p2, p3, p4])
        s = buf.as_string()
        expected_buf = b('\x01\x00\x00\x00\x47\x00\x00\x00'    # ptrlist
                         '\x10\x00\x00\x00\x02\x00\x00\x00'    # list tag
                         '\x0a\x00\x00\x00\x00\x00\x00\x00'    # 10
                         '\x64\x00\x00\x00\x00\x00\x00\x00'    # 100
                         '\x14\x00\x00\x00\x00\x00\x00\x00'    # 20
                         '\xc8\x00\x00\x00\x00\x00\x00\x00'    # 200
                         '\x1e\x00\x00\x00\x00\x00\x00\x00'    # 30
                         '\x2c\x01\x00\x00\x00\x00\x00\x00'    # 300
                         '\x28\x00\x00\x00\x00\x00\x00\x00'    # 40
                         '\x90\x01\x00\x00\x00\x00\x00\x00')   # 400
        assert s == expected_buf
Example #3
0
 def test_as_list_of_structs(self):
     schema = """
     @0xbf5147cbbecf40c1;
     struct Polygon {
         struct Point {
             x @0 :Int64;
             y @1 :Int64;
         }
         points @0 :AnyPointer;
     }
     """
     mod = self.compile(schema)
     buf = b('\x01\x00\x00\x00\x47\x00\x00\x00'  # ptrlist
             '\x10\x00\x00\x00\x02\x00\x00\x00'  # list tag
             '\x0a\x00\x00\x00\x00\x00\x00\x00'  # 10
             '\x64\x00\x00\x00\x00\x00\x00\x00'  # 100
             '\x14\x00\x00\x00\x00\x00\x00\x00'  # 20
             '\xc8\x00\x00\x00\x00\x00\x00\x00'  # 200
             '\x1e\x00\x00\x00\x00\x00\x00\x00'  # 30
             '\x2c\x01\x00\x00\x00\x00\x00\x00'  # 300
             '\x28\x00\x00\x00\x00\x00\x00\x00'  # 40
             '\x90\x01\x00\x00\x00\x00\x00\x00')  # 400
     poly = mod.Polygon.from_buffer(buf, 0, 0, 1)
     assert poly.points.is_list()
     assert not poly.points.is_struct()
     assert not poly.points.is_text()
     points = poly.points.as_list(StructItemType(mod.Polygon_Point))
     assert len(points) == 4
     assert points[0].x == 10
     assert points[0].y == 100
     #
     points = poly.points.as_list(mod.Polygon_Point)
     assert len(points) == 4
     assert points[0].x == 10
     assert points[0].y == 100
Example #4
0
def test_alloc_list_of_structs_with_pointers():
    class Person(Struct):
        __static_data_size__ = 1
        __static_ptrs_size__ = 1

    john = (
        '\x20\x00\x00\x00\x00\x00\x00\x00'  # age=32
        '\x01\x00\x00\x00\x2a\x00\x00\x00'  # name=ptr
        'J'
        'o'
        'h'
        'n'
        '\x00\x00\x00\x00')  # John

    # emily is a "split struct", with garbage between the body and the extra
    emily = (
        'garbage0'
        '\x18\x00\x00\x00\x00\x00\x00\x00'  # age=24
        '\x09\x00\x00\x00\x32\x00\x00\x00'  # name=ptr
        'garbage1'
        'garbage2'
        '\x45\x6d\x69\x6c\x79\x00\x00\x00'  # Emily
        'garbage3')

    john = Person.from_buffer(john, 0, 1, 1)
    emily = Person.from_buffer(emily, 8, 1, 1)
    #
    builder = Builder(0, 1)
    builder.alloc_list(0, StructItemType(Person), [john, emily])
    buf = builder.build()

    expected_buf = (
        '\x01\x00\x00\x00\x27\x00\x00\x00'  # ptrlist
        '\x08\x00\x00\x00\x01\x00\x01\x00'  # list tag
        '\x20\x00\x00\x00\x00\x00\x00\x00'  # age=32
        '\x09\x00\x00\x00\x2a\x00\x00\x00'  # name=ptr
        '\x18\x00\x00\x00\x00\x00\x00\x00'  # age=24
        '\x05\x00\x00\x00\x32\x00\x00\x00'  # name=ptr
        'J'
        'o'
        'h'
        'n'
        '\x00\x00\x00\x00'  # John
        'E'
        'm'
        'i'
        'l'
        'y'
        '\x00\x00\x00')  # Emily
    assert buf == expected_buf
Example #5
0
def test_list_of_structs():
    class Point(Struct):
        __static_data_size__ = 2
        __static_ptrs_size__ = 0

    # list of Point {x: Int64, y: Int64}
    buf = (
        '\x01\x00\x00\x00\x47\x00\x00\x00'  # ptrlist
        '\x10\x00\x00\x00\x02\x00\x00\x00'  # list tag
        '\x0a\x00\x00\x00\x00\x00\x00\x00'  # 10
        '\x64\x00\x00\x00\x00\x00\x00\x00'  # 100
        '\x14\x00\x00\x00\x00\x00\x00\x00'  # 20
        '\xc8\x00\x00\x00\x00\x00\x00\x00'  # 200
        '\x1e\x00\x00\x00\x00\x00\x00\x00'  # 30
        '\x2c\x01\x00\x00\x00\x00\x00\x00'  # 300
        '\x28\x00\x00\x00\x00\x00\x00\x00'  # 40
        '\x90\x01\x00\x00\x00\x00\x00\x00')  # 400
    blob = Struct.from_buffer(buf, 0, data_size=0, ptrs_size=1)
    lst = blob._read_list(0, StructItemType(Point))
    assert lst._seg is blob._seg
    assert lst._offset == 8
    assert lst._item_offset == 8
    assert lst._item_count == 4
    assert lst._item_length == 16
    #
    assert len(lst) == 4

    def read_point(i):
        p = lst[i]
        assert p._data_size == 2
        assert p._ptrs_size == 0
        x = p._read_data(0, Types.int64.ifmt)
        y = p._read_data(8, Types.int64.ifmt)
        return x, y

    assert read_point(0) == (10, 100)
    assert read_point(1) == (20, 200)
    assert read_point(2) == (30, 300)
    assert read_point(3) == (40, 400)
    #
    py.test.raises(TypeError, "lst == lst")
Example #6
0
def test_alloc_list_of_structs():
    class Point(Struct):
        __static_data_size__ = 2
        __static_ptrs_size__ = 0

    buf1 = (
        '\x0a\x00\x00\x00\x00\x00\x00\x00'  # 10
        '\x64\x00\x00\x00\x00\x00\x00\x00')  # 100
    buf2 = (
        '\x14\x00\x00\x00\x00\x00\x00\x00'  # 20
        '\xc8\x00\x00\x00\x00\x00\x00\x00')  # 200
    buf3 = (
        '\x1e\x00\x00\x00\x00\x00\x00\x00'  # 30
        '\x2c\x01\x00\x00\x00\x00\x00\x00')  # 300
    buf4 = (
        '\x28\x00\x00\x00\x00\x00\x00\x00'  # 40
        '\x90\x01\x00\x00\x00\x00\x00\x00')  # 400
    p1 = Point.from_buffer(buf1, 0, 2, 0)
    p2 = Point.from_buffer(buf2, 0, 2, 0)
    p3 = Point.from_buffer(buf3, 0, 2, 0)
    p4 = Point.from_buffer(buf4, 0, 2, 0)
    #
    builder = Builder(0, 1)
    builder.alloc_list(0, StructItemType(Point), [p1, p2, p3, p4])
    buf = builder.build()
    expected_buf = (
        '\x01\x00\x00\x00\x47\x00\x00\x00'  # ptrlist
        '\x10\x00\x00\x00\x02\x00\x00\x00'  # list tag
        '\x0a\x00\x00\x00\x00\x00\x00\x00'  # 10
        '\x64\x00\x00\x00\x00\x00\x00\x00'  # 100
        '\x14\x00\x00\x00\x00\x00\x00\x00'  # 20
        '\xc8\x00\x00\x00\x00\x00\x00\x00'  # 200
        '\x1e\x00\x00\x00\x00\x00\x00\x00'  # 30
        '\x2c\x01\x00\x00\x00\x00\x00\x00'  # 300
        '\x28\x00\x00\x00\x00\x00\x00\x00'  # 40
        '\x90\x01\x00\x00\x00\x00\x00\x00')  # 400
    assert buf == expected_buf