Skip to content

Commit

Permalink
finish testcase
Browse files Browse the repository at this point in the history
  • Loading branch information
ahangsu committed Jul 13, 2022
1 parent 7389aeb commit 8f41bad
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 14 deletions.
16 changes: 9 additions & 7 deletions pyteal/ast/box.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,21 +156,21 @@ def has_return(self):
class BoxExtract(Expr):
"""Extracts bytes in a box given its name, start index and stop index."""

def __init__(self, name: Expr, start: Expr, stop: Expr) -> None:
def __init__(self, name: Expr, start: Expr, length: Expr) -> None:
"""
Args:
name: The key the box was created with. Must evaluate to bytes
start: The byte index into the box to start reading. Must evaluate to uint64
stop: The byte index into the box to stop reading. Must evaluate to uint64
length: The byte length into the box from start to stop reading. Must evaluate to uint64
"""

super().__init__()
require_type(name, TealType.bytes)
require_type(start, TealType.uint64)
require_type(stop, TealType.uint64)
require_type(length, TealType.uint64)
self.name = name
self.start = start
self.stop = stop
self.length = length

def __teal__(self, options: "CompileOptions"):
if options.version < Op.box_extract.min_version:
Expand All @@ -179,11 +179,11 @@ def __teal__(self, options: "CompileOptions"):
)

return TealBlock.FromOp(
options, TealOp(self, Op.box_extract), self.name, self.start, self.stop
options, TealOp(self, Op.box_extract), self.name, self.start, self.length
)

def __str__(self):
return f"(box_extract {self.name} {self.start} {self.stop})"
return f"(box_extract {self.name} {self.start} {self.length})"

def type_of(self):
return TealType.bytes
Expand Down Expand Up @@ -239,7 +239,9 @@ def __teal__(self, options: "CompileOptions"):
f"BoxPut not available on teal version {options.version} (first available {Op.box_put.min_version})"
)

return TealBlock.FromOp(options, TealOp(self, Op.box_put), self.name)
return TealBlock.FromOp(
options, TealOp(self, Op.box_put), self.name, self.value
)

def __str__(self):
return f"(box_put {self.name})"
Expand Down
120 changes: 113 additions & 7 deletions pyteal/ast/box_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,28 +62,134 @@ def test_box_invalid_args():


def test_box_create_compile():
pass
name_arg: pt.Expr = pt.Bytes("eineName")
size_arg: pt.Expr = pt.Int(10)
expr: pt.Expr = pt.Box.create(name_arg, size_arg)

expected = pt.TealSimpleBlock(
[
pt.TealOp(size_arg, pt.Op.int, 10),
pt.TealOp(name_arg, pt.Op.byte, '"eineName"'),
pt.TealOp(expr, pt.Op.box_create),
]
)
actual, _ = expr.__teal__(teal7Options)
actual.addIncoming()
actual = pt.TealBlock.NormalizeBlocks(actual)

assert expected == actual


def test_box_delete_compile():
pass
name_arg: pt.Expr = pt.Bytes("eineName")
expr: pt.Expr = pt.Box.delete(name_arg)

expected = pt.TealSimpleBlock(
[pt.TealOp(name_arg, pt.Op.byte, '"eineName"'), pt.TealOp(expr, pt.Op.box_del)]
)
actual, _ = expr.__teal__(teal7Options)
actual.addIncoming()
actual = pt.TealBlock.NormalizeBlocks(actual)

assert expected == actual


def test_box_extract():
pass
name_arg: pt.Expr = pt.Bytes("eineName")
srt_arg: pt.Expr = pt.Int(10)
end_arg: pt.Expr = pt.Int(15)
expr: pt.Expr = pt.Box.extract(name_arg, srt_arg, end_arg)

expected = pt.TealSimpleBlock(
[
pt.TealOp(name_arg, pt.Op.byte, '"eineName"'),
pt.TealOp(srt_arg, pt.Op.int, 10),
pt.TealOp(end_arg, pt.Op.int, 15),
pt.TealOp(expr, pt.Op.box_extract),
]
)
actual, _ = expr.__teal__(teal7Options)
actual.addIncoming()
actual = pt.TealBlock.NormalizeBlocks(actual)

assert expected == actual


def test_box_replace():
pass
name_arg: pt.Expr = pt.Bytes("eineName")
srt_arg: pt.Expr = pt.Int(10)
replace_arg: pt.Expr = pt.Bytes("replace-str")
expr: pt.Expr = pt.Box.replace(name_arg, srt_arg, replace_arg)

expected = pt.TealSimpleBlock(
[
pt.TealOp(name_arg, pt.Op.byte, '"eineName"'),
pt.TealOp(srt_arg, pt.Op.int, 10),
pt.TealOp(replace_arg, pt.Op.byte, '"replace-str"'),
pt.TealOp(expr, pt.Op.box_replace),
]
)
actual, _ = expr.__teal__(teal7Options)
actual.addIncoming()
actual = pt.TealBlock.NormalizeBlocks(actual)

assert expected == actual


def test_box_length():
pass
name_arg: pt.Expr = pt.Bytes("eineName")
expr: pt.MultiValue = pt.Box.length(name_arg)

expected = pt.TealSimpleBlock(
[
pt.TealOp(name_arg, pt.Op.byte, '"eineName"'),
pt.TealOp(expr, pt.Op.box_len),
pt.TealOp(expr.output_slots[1].store(), pt.Op.store, expr.output_slots[1]),
pt.TealOp(expr.output_slots[0].store(), pt.Op.store, expr.output_slots[0]),
]
)
actual, _ = expr.__teal__(teal7Options)
actual.addIncoming()
actual = pt.TealBlock.NormalizeBlocks(actual)

with pt.TealComponent.Context.ignoreExprEquality():
assert expected == actual


def test_box_get():
pass
name_arg: pt.Expr = pt.Bytes("eineName")
expr: pt.MultiValue = pt.Box.get(name_arg)

expected = pt.TealSimpleBlock(
[
pt.TealOp(name_arg, pt.Op.byte, '"eineName"'),
pt.TealOp(expr, pt.Op.box_get),
pt.TealOp(expr.output_slots[1].store(), pt.Op.store, expr.output_slots[1]),
pt.TealOp(expr.output_slots[0].store(), pt.Op.store, expr.output_slots[0]),
]
)
actual, _ = expr.__teal__(teal7Options)
actual.addIncoming()
actual = pt.TealBlock.NormalizeBlocks(actual)

with pt.TealComponent.Context.ignoreExprEquality():
assert expected == actual


def test_box_put():
pass
name_arg: pt.Expr = pt.Bytes("eineName")
put_arg: pt.Expr = pt.Bytes("put-str")
expr: pt.Expr = pt.Box.put(name_arg, put_arg)

expected = pt.TealSimpleBlock(
[
pt.TealOp(name_arg, pt.Op.byte, '"eineName"'),
pt.TealOp(put_arg, pt.Op.byte, '"put-str"'),
pt.TealOp(expr, pt.Op.box_put),
]
)
actual, _ = expr.__teal__(teal7Options)
actual.addIncoming()
actual = pt.TealBlock.NormalizeBlocks(actual)

assert expected == actual

0 comments on commit 8f41bad

Please sign in to comment.