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
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
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
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
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")
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