def test_list_comparisons(): buf1 = ( '\x01\x00\x00\x00\x00\x00\x00\x00' # 1 '\x02\x00\x00\x00\x00\x00\x00\x00' # 2 '\x03\x00\x00\x00\x00\x00\x00\x00' # 3 '\x04\x00\x00\x00\x00\x00\x00\x00') # 4 buf2 = 'garbage0' + buf1 # lst1 = List.from_buffer(buf1, 0, ptr.LIST_SIZE_64, 4, PrimitiveItemType(Types.int64)) lst2 = List.from_buffer(buf2, 8, ptr.LIST_SIZE_64, 4, PrimitiveItemType(Types.int64)) lst3 = List.from_buffer(buf1, 0, ptr.LIST_SIZE_64, 3, PrimitiveItemType(Types.int64)) # assert lst1 == lst2 assert not lst1 != lst2 # assert not lst1 == lst3 # different item_count assert lst1 != lst3 # py.test.raises(TypeError, "lst1 < lst2") py.test.raises(TypeError, "lst1 <= lst2") py.test.raises(TypeError, "lst1 > lst2") py.test.raises(TypeError, "lst1 >= lst2")
def test_alloc_list_int8(): builder = Builder(0, 1) builder.alloc_list(0, PrimitiveItemType(Types.int8), [1, 2, 3, 4]) buf = builder.build() assert buf == ( '\x01\x00\x00\x00\x22\x00\x00\x00' # ptrlist '\x01\x02\x03\x04\x00\x00\x00\x00') # 1,2,3,4 + padding
def test_ListItem_far_pointer(): seg0 = b('\x01\x00\x00\x00\x26\x00\x00\x00' # ptrlist '\x0d\x00\x00\x00\x12\x00\x00\x00' # ptr item 1 '\x0d\x00\x00\x00\x1a\x00\x00\x00' # ptr item 2 '\x0d\x00\x00\x00\x22\x00\x00\x00' # ptr item 3 '\x02\x00\x00\x00\x01\x00\x00\x00' # far ptr, segment=1, offset=0 'A' '\x00\x00\x00\x00\x00\x00\x00' # A 'B' 'C' '\x00\x00\x00\x00\x00\x00' # BC 'D' 'E' 'F' '\x00\x00\x00\x00\x00') # DEF # seg1 = b('\x01\x00\x00\x00\x2a\x00\x00\x00' # ptr item 4 'G' 'H' 'I' 'J' '\x00\x00\x00\x00') # GHIJ # buf = MultiSegment(seg0 + seg1, segment_offsets=(0, len(seg0))) blob = Struct.from_buffer(buf, 0, data_size=0, ptrs_size=1) item_type = ListItemType(PrimitiveItemType(Types.int8)) lst = blob._read_list(0, item_type) ghij = lst[3] assert list(ghij) == [ord('G'), ord('H'), ord('I'), ord('J'), 0]
def test_Int8List(): buf = b('\x01\x00\x00\x00\x82\x00\x00\x00' # ptrlist 'hello capnproto\0') # string blob = Struct.from_buffer(buf, 0, data_size=0, ptrs_size=1) lst = blob._read_list(0, PrimitiveItemType(Types.int8)) assert len(lst) == 16 assert list(lst) == list(map(ord, 'hello capnproto\0'))
def test_null_pointers(): NULL = '\x00\x00\x00\x00\x00\x00\x00\x00' # NULL pointer builder = Builder(0, 3) builder.alloc_struct(0, Struct, None) builder.alloc_text(8, None) builder.alloc_list(16, PrimitiveItemType(Types.int64), None) buf = builder.build() assert buf == NULL * 3
def test_null_pointers(self): NULL = b'\x00\x00\x00\x00\x00\x00\x00\x00' # NULL pointer buf = SegmentBuilder() pos = buf.allocate(24) buf.copy_from_struct(0, Struct, None) buf.alloc_text(8, None) buf.copy_from_list(16, PrimitiveItemType(Types.int64), None) s = buf.as_string() assert s == NULL*3
def test_compare_with_py_list(): buf = b('\x01\x00\x00\x00\x25\x00\x00\x00' # ptrlist '\x01\x00\x00\x00\x00\x00\x00\x00' # 1 '\x02\x00\x00\x00\x00\x00\x00\x00' # 2 '\x03\x00\x00\x00\x00\x00\x00\x00' # 3 '\x04\x00\x00\x00\x00\x00\x00\x00') # 4 blob = Struct.from_buffer(buf, 0, data_size=0, ptrs_size=1) lst = blob._read_list(0, PrimitiveItemType(Types.int64)) assert lst == [1, 2, 3, 4]
def test_Float64List(): buf = b('\x01\x00\x00\x00\x25\x00\x00\x00' # ptrlist '\x58\x39\xb4\xc8\x76\xbe\xf3\x3f' # 1.234 '\xc3\xf5\x28\x5c\x8f\xc2\x02\x40' # 2.345 '\xd9\xce\xf7\x53\xe3\xa5\x0b\x40' # 3.456 '\xf8\x53\xe3\xa5\x9b\x44\x12\x40') # 4.567 blob = Struct.from_buffer(buf, 0, data_size=0, ptrs_size=1) lst = blob._read_list(0, PrimitiveItemType(Types.float64)) assert list(lst) == [1.234, 2.345, 3.456, 4.567]
def test_alloc_list_int64(): builder = Builder(0, 1) builder.alloc_list(0, PrimitiveItemType(Types.int64), [1, 2, 3, 4]) buf = builder.build() assert buf == ( '\x01\x00\x00\x00\x25\x00\x00\x00' # ptrlist '\x01\x00\x00\x00\x00\x00\x00\x00' # 1 '\x02\x00\x00\x00\x00\x00\x00\x00' # 2 '\x03\x00\x00\x00\x00\x00\x00\x00' # 3 '\x04\x00\x00\x00\x00\x00\x00\x00') # 4
def mylist(self): buf = b('\x01\x00\x00\x00\x2D\x00\x00\x00' # ptrlist '\x00\x00\x00\x00\x00\x00\x00\x00' # 0 '\x01\x00\x00\x00\x00\x00\x00\x00' # 1 '\x02\x00\x00\x00\x00\x00\x00\x00' # 2 '\x03\x00\x00\x00\x00\x00\x00\x00' # 3 '\x04\x00\x00\x00\x00\x00\x00\x00') # 4 blob = Struct.from_buffer(buf, 0, data_size=0, ptrs_size=1) lst = blob._read_list(0, PrimitiveItemType(Types.int64)) return lst
def test_alloc_list_float64(): builder = Builder(0, 1) builder.alloc_list(0, PrimitiveItemType(Types.float64), [1.234, 2.345, 3.456, 4.567]) buf = builder.build() assert buf == ( '\x01\x00\x00\x00\x25\x00\x00\x00' # ptrlist '\x58\x39\xb4\xc8\x76\xbe\xf3\x3f' # 1.234 '\xc3\xf5\x28\x5c\x8f\xc2\x02\x40' # 2.345 '\xd9\xce\xf7\x53\xe3\xa5\x0b\x40' # 3.456 '\xf8\x53\xe3\xa5\x9b\x44\x12\x40') # 4.567
def test_copy_from_list_int8(self): buf = SegmentBuilder() buf.allocate(8) # allocate some garbage at the beginning pos = buf.allocate(8) item_type = PrimitiveItemType(Types.int8) buf.copy_from_list(pos, item_type, [1, 2, 3, 4]) s = buf.as_string() assert s == b( '\x00\x00\x00\x00\x00\x00\x00\x00' # garbage '\x01\x00\x00\x00\x22\x00\x00\x00' # ptrlist '\x01\x02\x03\x04\x00\x00\x00\x00') # 1,2,3,4 + padding
def test_far_pointer_0(): # see also test_blob.test_far_pointer_0 seg0 = b('\x00\x00\x00\x00\x00\x00\x00\x00' # some garbage '\x0a\x00\x00\x00\x01\x00\x00\x00') # far pointer: segment=1, offset=1 seg1 = b('\x00\x00\x00\x00\x00\x00\x00\x00' # random data '\x01\x00\x00\x00\x25\x00\x00\x00' # ptrlist '\x01\x00\x00\x00\x00\x00\x00\x00' # 1 '\x02\x00\x00\x00\x00\x00\x00\x00' # 2 '\x03\x00\x00\x00\x00\x00\x00\x00' # 3 '\x04\x00\x00\x00\x00\x00\x00\x00') # 4 buf = MultiSegment(seg0+seg1, segment_offsets=(0, 16)) blob = Struct.from_buffer(buf, 8, data_size=0, ptrs_size=1) lst = blob._read_list(0, PrimitiveItemType(Types.int64)) assert lst == [1, 2, 3, 4]
def test_copy_from_list_float64(self): buf = SegmentBuilder() buf.allocate(8) # allocate some garbage at the beginning pos = buf.allocate(8) item_type = PrimitiveItemType(Types.float64) buf.copy_from_list(pos, item_type, [1.234, 2.345, 3.456, 4.567]) s = buf.as_string() assert s == b( '\x00\x00\x00\x00\x00\x00\x00\x00' # garbage '\x01\x00\x00\x00\x25\x00\x00\x00' # ptrlist '\x58\x39\xb4\xc8\x76\xbe\xf3\x3f' # 1.234 '\xc3\xf5\x28\x5c\x8f\xc2\x02\x40' # 2.345 '\xd9\xce\xf7\x53\xe3\xa5\x0b\x40' # 3.456 '\xf8\x53\xe3\xa5\x9b\x44\x12\x40') # 4.567
def test_read_list_offset(): buf = b('abcd' # random garbage '\x01\x00\x00\x00\x25\x00\x00\x00' # ptrlist '\x01\x00\x00\x00\x00\x00\x00\x00' # 1 '\x02\x00\x00\x00\x00\x00\x00\x00' # 2 '\x03\x00\x00\x00\x00\x00\x00\x00' # 3 '\x04\x00\x00\x00\x00\x00\x00\x00') # 4 blob = Struct.from_buffer(buf, 4, data_size=0, ptrs_size=1) lst = blob._read_list(0, PrimitiveItemType(Types.int64)) assert lst._seg is blob._seg assert lst._offset == 12 assert lst._item_count == 4 assert lst._item_length == 8 assert lst._getitem_fast(0) == 1 assert lst._getitem_fast(1) == 2 assert lst._getitem_fast(2) == 3 assert lst._getitem_fast(3) == 4
def test_as_list_of_primitives(self): schema = """ @0xbf5147cbbecf40c1; struct Foo { p @0 :AnyPointer; } """ mod = self.compile(schema) buf = b('\x01\x00\x00\x00\x25\x00\x00\x00' # ptrlist '\x01\x00\x00\x00\x00\x00\x00\x00' # 1 '\x02\x00\x00\x00\x00\x00\x00\x00' # 2 '\x03\x00\x00\x00\x00\x00\x00\x00' # 3 '\x04\x00\x00\x00\x00\x00\x00\x00') # 4 f = mod.Foo.from_buffer(buf, 0, 0, 1) assert f.p.is_list() assert not f.p.is_struct() assert not f.p.is_text() items = f.p.as_list(PrimitiveItemType(Types.int64)) assert items == [1, 2, 3, 4]
def test_far_pointer_1(): # see also test_blob.test_far_pointer_1 seg0 = b('\x00\x00\x00\x00\x00\x00\x00\x00' # some garbage '\x0e\x00\x00\x00\x02\x00\x00\x00') # far ptr: pad=1, segment=2, offset=1 # ==> 2nd line of seg2 seg1 = b('\x00\x00\x00\x00\x00\x00\x00\x00' # garbage '\x01\x00\x00\x00\x00\x00\x00\x00' # 1 '\x02\x00\x00\x00\x00\x00\x00\x00' # 2 '\x03\x00\x00\x00\x00\x00\x00\x00' # 3 '\x04\x00\x00\x00\x00\x00\x00\x00') # 4 seg2 = b('\x00\x00\x00\x00\x00\x00\x00\x00' # garbage '\x0a\x00\x00\x00\x01\x00\x00\x00' # far ptr: pad=0, segment=1, offset=1 # ==> 2nd line of seg1 '\x01\x00\x00\x00\x25\x00\x00\x00') # tag: ptrlist buf = MultiSegment(seg0+seg1+seg2, segment_offsets=(0, len(seg0), len(seg0+seg1))) blob = Struct.from_buffer(buf, 8, data_size=0, ptrs_size=1) lst = blob._read_list(0, PrimitiveItemType(Types.int64)) assert lst == [1, 2, 3, 4]