def test_StaticArray_set_copy(): value = abi.StaticArray(abi.StaticArrayTypeSpec(abi.Uint64TypeSpec(), 10)) otherArray = abi.StaticArray( abi.StaticArrayTypeSpec(abi.Uint64TypeSpec(), 10)) with pytest.raises(pt.TealInputError): value.set( abi.StaticArray(abi.StaticArrayTypeSpec(abi.Uint64TypeSpec(), 11))) with pytest.raises(pt.TealInputError): value.set( abi.StaticArray(abi.StaticArrayTypeSpec(abi.Uint8TypeSpec(), 10))) with pytest.raises(pt.TealInputError): value.set(abi.Uint64()) expr = value.set(otherArray) assert expr.type_of() == pt.TealType.none assert not expr.has_return() expected = pt.TealSimpleBlock([ pt.TealOp(None, pt.Op.load, otherArray.stored_value.slot), pt.TealOp(None, pt.Op.store, value.stored_value.slot), ]) actual, _ = expr.__teal__(options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_StaticArray_getitem(): for length in (0, 1, 2, 3, 1000): value = abi.StaticArray( abi.StaticArrayTypeSpec(abi.Uint64TypeSpec(), length)) for index in range(length): # dynamic indexes indexExpr = pt.Int(index) element = value[indexExpr] assert type(element) is abi.ArrayElement assert element.array is value assert element.index is indexExpr for index in range(length): # static indexes element = value[index] assert type(element) is abi.ArrayElement assert element.array is value assert type(element.index) is pt.Int assert element.index.value == index with pytest.raises(pt.TealInputError): value[-1] with pytest.raises(pt.TealInputError): value[length]
def test_StaticArray_set_computed(): value = abi.StaticArray(abi.StaticArrayTypeSpec(abi.Uint64TypeSpec(), 10)) computed = ContainerType(value.type_spec(), pt.Bytes("indeed this is hard to simulate")) expr = value.set(computed) assert expr.type_of() == pt.TealType.none assert not expr.has_return() expected = pt.TealSimpleBlock([ pt.TealOp(None, pt.Op.byte, '"indeed this is hard to simulate"'), pt.TealOp(None, pt.Op.store, value.stored_value.slot), ]) actual, _ = expr.__teal__(options) actual.addIncoming() actual = actual.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected with pytest.raises(pt.TealInputError): value.set( ContainerType( abi.StaticArrayTypeSpec(abi.Uint16TypeSpec(), 40), pt.Bytes("well i am trolling"), ))
def test_StaticArray_set_values(): value = abi.StaticArray(abi.StaticArrayTypeSpec(abi.Uint64TypeSpec(), 10)) with pytest.raises(pt.TealInputError): value.set([]) with pytest.raises(pt.TealInputError): value.set([abi.Uint64()] * 9) with pytest.raises(pt.TealInputError): value.set([abi.Uint64()] * 11) with pytest.raises(pt.TealInputError): value.set([abi.Uint16()] * 10) with pytest.raises(pt.TealInputError): value.set([abi.Uint64()] * 9 + [abi.Uint16()]) values = [abi.Uint64() for _ in range(10)] expr = value.set(values) assert expr.type_of() == pt.TealType.none assert not expr.has_return() expectedExpr = value.stored_value.store(_encode_tuple(values)) expected, _ = expectedExpr.__teal__(options) expected.addIncoming() expected = pt.TealBlock.NormalizeBlocks(expected) actual, _ = expr.__teal__(options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_Address_set_StaticArray(): value_to_set = abi.StaticArray( abi.StaticArrayTypeSpec(abi.ByteTypeSpec(), abi.AddressLength.Bytes)) value = abi.Address() expr = value.set(value_to_set) assert expr.type_of() == pt.TealType.none assert not expr.has_return() expected = pt.TealSimpleBlock([ pt.TealOp(None, pt.Op.load, value_to_set.stored_value.slot), pt.TealOp(None, pt.Op.store, value.stored_value.slot), ]) actual, _ = expr.__teal__(options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected with pytest.raises(pt.TealInputError): bogus = abi.StaticArray(abi.StaticArrayTypeSpec( abi.ByteTypeSpec(), 10)) value.set(bogus)
def test_StaticArray_encode(): value = abi.StaticArray(abi.StaticArrayTypeSpec(abi.Uint64TypeSpec(), 10)) expr = value.encode() assert expr.type_of() == pt.TealType.bytes assert not expr.has_return() expected = pt.TealSimpleBlock( [pt.TealOp(None, pt.Op.load, value.stored_value.slot)]) actual, _ = expr.__teal__(options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_StaticArray_length(): for length in (0, 1, 2, 3, 1000): value = abi.StaticArray( abi.StaticArrayTypeSpec(abi.Uint64TypeSpec(), length)) expr = value.length() assert expr.type_of() == pt.TealType.uint64 assert not expr.has_return() expected = pt.TealSimpleBlock([pt.TealOp(None, pt.Op.int, length)]) actual, _ = expr.__teal__(options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected
def test_StaticArray_decode(): encoded = pt.Bytes("encoded") for start_index in (None, pt.Int(1)): for end_index in (None, pt.Int(2)): for length in (None, pt.Int(3)): value = abi.StaticArray( abi.StaticArrayTypeSpec(abi.Uint64TypeSpec(), 10)) if end_index is not None and length is not None: with pytest.raises(pt.TealInputError): value.decode( encoded, start_index=start_index, end_index=end_index, length=length, ) continue expr = value.decode(encoded, start_index=start_index, end_index=end_index, length=length) assert expr.type_of() == pt.TealType.none assert not expr.has_return() expectedExpr = value.stored_value.store( substring_for_decoding( encoded, start_index=start_index, end_index=end_index, length=length, )) expected, _ = expectedExpr.__teal__(options) expected.addIncoming() expected = pt.TealBlock.NormalizeBlocks(expected) actual, _ = expr.__teal__(options) actual.addIncoming() actual = pt.TealBlock.NormalizeBlocks(actual) with pt.TealComponent.Context.ignoreExprEquality(): assert actual == expected