Module hebi.tests.test_ops
Expand source code
import unittest
from hypothesis import example, given
from hypothesis import strategies as st
from uplc import ast as uplc, eval as uplc_eval
from .. import compiler
class OpTest(unittest.TestCase):
@given(x=st.booleans(), y=st.booleans())
def test_and_bool(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: bool, y: bool) -> bool:
return x and y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]:
f = uplc.Apply(f, d)
ret = bool(uplc_eval(f).value)
self.assertEqual(ret, x and y, "and returned wrong value")
@given(x=st.booleans(), y=st.booleans())
def test_or_bool(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: bool, y: bool) -> bool:
return x or y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]:
f = uplc.Apply(f, d)
ret = bool(uplc_eval(f).value)
self.assertEqual(ret, x or y, "or returned wrong value")
@given(x=st.booleans())
def test_not_bool(self, x):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: bool) -> bool:
return not x
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
for d in [uplc.PlutusInteger(int(x))]:
f = uplc.Apply(f, d)
ret = bool(uplc_eval(f).value)
self.assertEqual(ret, not x, "not returned wrong value")
@given(x=st.integers())
def test_usub_int(self, x):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: int) -> int:
return -x
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
for d in [uplc.PlutusInteger(int(x))]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
self.assertEqual(ret, -x, "not returned wrong value")
@given(x=st.integers(), y=st.integers())
def test_add_int(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: int, y: int) -> int:
return x + y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
self.assertEqual(ret, x + y, "+ returned wrong value")
@given(x=st.integers(), y=st.integers())
def test_sub_int(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: int, y: int) -> int:
return x - y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
self.assertEqual(ret, x - y, "- returned wrong value")
@given(x=st.integers(), y=st.integers())
def test_mul_int(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: int, y: int) -> int:
return x * y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
self.assertEqual(ret, x * y, "* returned wrong value")
@given(x=st.integers(), y=st.integers())
def test_div_int(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: int, y: int) -> int:
return x // y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
try:
exp = x // y
except ZeroDivisionError:
exp = None
try:
for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
except Exception:
ret = None
self.assertEqual(ret, exp, "// returned wrong value")
@given(x=st.integers(), y=st.integers())
def test_mod_int(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: int, y: int) -> int:
return x % y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
try:
exp = x % y
except ZeroDivisionError:
exp = None
try:
for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
except Exception:
ret = None
self.assertEqual(ret, exp, "% returned wrong value")
@given(x=st.integers(), y=st.integers(min_value=0, max_value=20))
def test_pow_int(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: int, y: int) -> int:
return x ** y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
self.assertEqual(ret, x**y, "** returned wrong value")
@given(x=st.binary(), y=st.binary())
def test_add_bytes(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: bytes, y: bytes) -> bytes:
return x + y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
for d in [uplc.PlutusByteString(bytes(x)), uplc.PlutusByteString(bytes(y))]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
self.assertEqual(ret, x + y, "+ returned wrong value")
@given(x=st.text(), y=st.text())
def test_add_str(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: str, y: str) -> str:
return x + y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
for d in [
uplc.PlutusByteString(bytes(x.encode("utf8"))),
uplc.PlutusByteString(bytes(y.encode("utf8"))),
]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value.decode("utf8")
self.assertEqual(ret, x + y, "+ returned wrong value")
@given(x=st.binary(), y=st.integers(), z=st.integers())
@example(b"\x00", -2, 0)
@example(b"1234", 1, 2)
@example(b"1234", 2, 4)
@example(b"1234", 2, 2)
@example(b"1234", 3, 3)
@example(b"1234", 3, 1)
def test_slice_bytes(self, x, y, z):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: bytes, y: int, z: int) -> bytes:
return x[y:z]
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
try:
exp = x[y:z]
except IndexError:
exp = None
try:
for d in [
uplc.PlutusByteString(x),
uplc.PlutusInteger(y),
uplc.PlutusInteger(z),
]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
except:
ret = None
self.assertEqual(ret, exp, "byte slice returned wrong value")
@given(x=st.binary(), y=st.integers())
@example(b"1234", 0)
@example(b"1234", 1)
@example(b"1234", -1)
def test_index_bytes(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: bytes, y: int) -> int:
return x[y]
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
try:
exp = x[y]
except IndexError:
exp = None
try:
for d in [uplc.PlutusByteString(x), uplc.PlutusInteger(y)]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
except:
ret = None
self.assertEqual(ret, exp, "byte index returned wrong value")
@given(xs=st.lists(st.integers()), y=st.integers())
@example(xs=[0], y=-1)
@example(xs=[0], y=0)
def test_index_list(self, xs, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
from typing import Dict, List, Union
def validator(x: List[int], y: int) -> int:
return x[y]
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
try:
exp = xs[y]
except IndexError:
exp = None
try:
for d in [
uplc.PlutusList([uplc.PlutusInteger(x) for x in xs]),
uplc.PlutusInteger(y),
]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
except Exception as e:
ret = None
self.assertEqual(ret, exp, "list index returned wrong value")
@given(xs=st.lists(st.integers()), y=st.integers())
@example(xs=[0, 1], y=-1)
@example(xs=[0, 1], y=0)
def test_in_list_int(self, xs, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
from typing import Dict, List, Union
def validator(x: List[int], y: int) -> bool:
return y in x
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
exp = y in xs
for d in [
uplc.PlutusList([uplc.PlutusInteger(x) for x in xs]),
uplc.PlutusInteger(y),
]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
self.assertEqual(ret, exp, "list in returned wrong value")
@given(xs=st.lists(st.binary()), y=st.binary())
def test_in_list_bytes(self, xs, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
from typing import Dict, List, Union
def validator(x: List[bytes], y: bytes) -> bool:
return y in x
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
exp = y in xs
for d in [
uplc.PlutusList([uplc.PlutusByteString(x) for x in xs]),
uplc.PlutusByteString(y),
]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
self.assertEqual(ret, exp, "list in returned wrong value")
@given(x=st.binary(), y=st.binary())
def test_eq_bytes(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: bytes, y: bytes) -> bool:
return x == y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
exp = x == y
for d in [
uplc.PlutusByteString(x),
uplc.PlutusByteString(y),
]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
self.assertEqual(ret, exp, "bytes eq returned wrong value")
@given(x=st.integers(), y=st.integers())
def test_eq_bytes(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: int, y: int) -> bool:
return x == y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
exp = x == y
for d in [
uplc.PlutusInteger(x),
uplc.PlutusInteger(y),
]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
self.assertEqual(ret, exp, "int eq returned wrong value")
@given(x=st.text(), y=st.text())
def test_eq_str(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: str, y: str) -> bool:
return x == y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
exp = x == y
for d in [
uplc.PlutusByteString(x.encode("utf8")),
uplc.PlutusByteString(y.encode("utf8")),
]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
self.assertEqual(ret, exp, "str eq returned wrong value")
@given(x=st.booleans(), y=st.booleans())
def test_eq_bool(self, x, y):
# this tests that errors that are caused by assignments are actually triggered at the time of assigning
source_code = """
def validator(x: bool, y: bool) -> bool:
return x == y
"""
ast = compiler.parse(source_code)
code = compiler.compile(ast)
code = code.compile()
f = code.term
# UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying
exp = x == y
for d in [
uplc.PlutusInteger(int(x)),
uplc.PlutusInteger(int(y)),
]:
f = uplc.Apply(f, d)
ret = uplc_eval(f).value
self.assertEqual(ret, exp, "str eq returned wrong value")
Classes
class OpTest (methodName='runTest')
-
A class whose instances are single test cases.
By default, the test code itself should be placed in a method named 'runTest'.
If the fixture may be used for many test cases, create as many test methods as are needed. When instantiating such a TestCase subclass, specify in the constructor arguments the name of the test method that the instance is to execute.
Test authors should subclass TestCase for their own tests. Construction and deconstruction of the test's environment ('fixture') can be implemented by overriding the 'setUp' and 'tearDown' methods respectively.
If it is necessary to override the init method, the base class init method must always be called. It is important that subclasses should not change the signature of their init method, since instances of the classes are instantiated automatically by parts of the framework in order to be run.
When subclassing TestCase, you can set these attributes: * failureException: determines which exception will be raised when the instance's assertion methods fail; test methods raising this exception will be deemed to have 'failed' rather than 'errored'. * longMessage: determines whether long messages (including repr of objects used in assert methods) will be printed on failure in addition to any explicit message passed. * maxDiff: sets the maximum length of a diff in failure messages by assert methods using difflib. It is looked up as an instance attribute so can be configured by individual tests if required.
Create an instance of the class that will use the named test method when executed. Raises a ValueError if the instance does not have a method with the specified name.
Expand source code
class OpTest(unittest.TestCase): @given(x=st.booleans(), y=st.booleans()) def test_and_bool(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bool, y: bool) -> bool: return x and y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = bool(uplc_eval(f).value) self.assertEqual(ret, x and y, "and returned wrong value") @given(x=st.booleans(), y=st.booleans()) def test_or_bool(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bool, y: bool) -> bool: return x or y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = bool(uplc_eval(f).value) self.assertEqual(ret, x or y, "or returned wrong value") @given(x=st.booleans()) def test_not_bool(self, x): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bool) -> bool: return not x """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x))]: f = uplc.Apply(f, d) ret = bool(uplc_eval(f).value) self.assertEqual(ret, not x, "not returned wrong value") @given(x=st.integers()) def test_usub_int(self, x): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int) -> int: return -x """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, -x, "not returned wrong value") @given(x=st.integers(), y=st.integers()) def test_add_int(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> int: return x + y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, x + y, "+ returned wrong value") @given(x=st.integers(), y=st.integers()) def test_sub_int(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> int: return x - y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, x - y, "- returned wrong value") @given(x=st.integers(), y=st.integers()) def test_mul_int(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> int: return x * y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, x * y, "* returned wrong value") @given(x=st.integers(), y=st.integers()) def test_div_int(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> int: return x // y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying try: exp = x // y except ZeroDivisionError: exp = None try: for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value except Exception: ret = None self.assertEqual(ret, exp, "// returned wrong value") @given(x=st.integers(), y=st.integers()) def test_mod_int(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> int: return x % y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying try: exp = x % y except ZeroDivisionError: exp = None try: for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value except Exception: ret = None self.assertEqual(ret, exp, "% returned wrong value") @given(x=st.integers(), y=st.integers(min_value=0, max_value=20)) def test_pow_int(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> int: return x ** y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, x**y, "** returned wrong value") @given(x=st.binary(), y=st.binary()) def test_add_bytes(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bytes, y: bytes) -> bytes: return x + y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusByteString(bytes(x)), uplc.PlutusByteString(bytes(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, x + y, "+ returned wrong value") @given(x=st.text(), y=st.text()) def test_add_str(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: str, y: str) -> str: return x + y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [ uplc.PlutusByteString(bytes(x.encode("utf8"))), uplc.PlutusByteString(bytes(y.encode("utf8"))), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value.decode("utf8") self.assertEqual(ret, x + y, "+ returned wrong value") @given(x=st.binary(), y=st.integers(), z=st.integers()) @example(b"\x00", -2, 0) @example(b"1234", 1, 2) @example(b"1234", 2, 4) @example(b"1234", 2, 2) @example(b"1234", 3, 3) @example(b"1234", 3, 1) def test_slice_bytes(self, x, y, z): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bytes, y: int, z: int) -> bytes: return x[y:z] """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying try: exp = x[y:z] except IndexError: exp = None try: for d in [ uplc.PlutusByteString(x), uplc.PlutusInteger(y), uplc.PlutusInteger(z), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value except: ret = None self.assertEqual(ret, exp, "byte slice returned wrong value") @given(x=st.binary(), y=st.integers()) @example(b"1234", 0) @example(b"1234", 1) @example(b"1234", -1) def test_index_bytes(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bytes, y: int) -> int: return x[y] """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying try: exp = x[y] except IndexError: exp = None try: for d in [uplc.PlutusByteString(x), uplc.PlutusInteger(y)]: f = uplc.Apply(f, d) ret = uplc_eval(f).value except: ret = None self.assertEqual(ret, exp, "byte index returned wrong value") @given(xs=st.lists(st.integers()), y=st.integers()) @example(xs=[0], y=-1) @example(xs=[0], y=0) def test_index_list(self, xs, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ from typing import Dict, List, Union def validator(x: List[int], y: int) -> int: return x[y] """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying try: exp = xs[y] except IndexError: exp = None try: for d in [ uplc.PlutusList([uplc.PlutusInteger(x) for x in xs]), uplc.PlutusInteger(y), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value except Exception as e: ret = None self.assertEqual(ret, exp, "list index returned wrong value") @given(xs=st.lists(st.integers()), y=st.integers()) @example(xs=[0, 1], y=-1) @example(xs=[0, 1], y=0) def test_in_list_int(self, xs, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ from typing import Dict, List, Union def validator(x: List[int], y: int) -> bool: return y in x """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying exp = y in xs for d in [ uplc.PlutusList([uplc.PlutusInteger(x) for x in xs]), uplc.PlutusInteger(y), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, exp, "list in returned wrong value") @given(xs=st.lists(st.binary()), y=st.binary()) def test_in_list_bytes(self, xs, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ from typing import Dict, List, Union def validator(x: List[bytes], y: bytes) -> bool: return y in x """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying exp = y in xs for d in [ uplc.PlutusList([uplc.PlutusByteString(x) for x in xs]), uplc.PlutusByteString(y), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, exp, "list in returned wrong value") @given(x=st.binary(), y=st.binary()) def test_eq_bytes(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bytes, y: bytes) -> bool: return x == y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying exp = x == y for d in [ uplc.PlutusByteString(x), uplc.PlutusByteString(y), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, exp, "bytes eq returned wrong value") @given(x=st.integers(), y=st.integers()) def test_eq_bytes(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> bool: return x == y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying exp = x == y for d in [ uplc.PlutusInteger(x), uplc.PlutusInteger(y), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, exp, "int eq returned wrong value") @given(x=st.text(), y=st.text()) def test_eq_str(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: str, y: str) -> bool: return x == y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying exp = x == y for d in [ uplc.PlutusByteString(x.encode("utf8")), uplc.PlutusByteString(y.encode("utf8")), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, exp, "str eq returned wrong value") @given(x=st.booleans(), y=st.booleans()) def test_eq_bool(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bool, y: bool) -> bool: return x == y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying exp = x == y for d in [ uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y)), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, exp, "str eq returned wrong value")
Ancestors
- unittest.case.TestCase
Methods
def test_add_bytes(self) ‑> None
-
Expand source code
@given(x=st.binary(), y=st.binary()) def test_add_bytes(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bytes, y: bytes) -> bytes: return x + y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusByteString(bytes(x)), uplc.PlutusByteString(bytes(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, x + y, "+ returned wrong value")
def test_add_int(self) ‑> None
-
Expand source code
@given(x=st.integers(), y=st.integers()) def test_add_int(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> int: return x + y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, x + y, "+ returned wrong value")
def test_add_str(self) ‑> None
-
Expand source code
@given(x=st.text(), y=st.text()) def test_add_str(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: str, y: str) -> str: return x + y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [ uplc.PlutusByteString(bytes(x.encode("utf8"))), uplc.PlutusByteString(bytes(y.encode("utf8"))), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value.decode("utf8") self.assertEqual(ret, x + y, "+ returned wrong value")
def test_and_bool(self) ‑> None
-
Expand source code
@given(x=st.booleans(), y=st.booleans()) def test_and_bool(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bool, y: bool) -> bool: return x and y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = bool(uplc_eval(f).value) self.assertEqual(ret, x and y, "and returned wrong value")
def test_div_int(self) ‑> None
-
Expand source code
@given(x=st.integers(), y=st.integers()) def test_div_int(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> int: return x // y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying try: exp = x // y except ZeroDivisionError: exp = None try: for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value except Exception: ret = None self.assertEqual(ret, exp, "// returned wrong value")
def test_eq_bool(self) ‑> None
-
Expand source code
@given(x=st.booleans(), y=st.booleans()) def test_eq_bool(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bool, y: bool) -> bool: return x == y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying exp = x == y for d in [ uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y)), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, exp, "str eq returned wrong value")
def test_eq_bytes(self) ‑> None
-
Expand source code
@given(x=st.integers(), y=st.integers()) def test_eq_bytes(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> bool: return x == y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying exp = x == y for d in [ uplc.PlutusInteger(x), uplc.PlutusInteger(y), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, exp, "int eq returned wrong value")
def test_eq_str(self) ‑> None
-
Expand source code
@given(x=st.text(), y=st.text()) def test_eq_str(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: str, y: str) -> bool: return x == y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying exp = x == y for d in [ uplc.PlutusByteString(x.encode("utf8")), uplc.PlutusByteString(y.encode("utf8")), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, exp, "str eq returned wrong value")
def test_in_list_bytes(self) ‑> None
-
Expand source code
@given(xs=st.lists(st.binary()), y=st.binary()) def test_in_list_bytes(self, xs, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ from typing import Dict, List, Union def validator(x: List[bytes], y: bytes) -> bool: return y in x """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying exp = y in xs for d in [ uplc.PlutusList([uplc.PlutusByteString(x) for x in xs]), uplc.PlutusByteString(y), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, exp, "list in returned wrong value")
def test_in_list_int(self) ‑> None
-
Expand source code
@given(xs=st.lists(st.integers()), y=st.integers()) @example(xs=[0, 1], y=-1) @example(xs=[0, 1], y=0) def test_in_list_int(self, xs, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ from typing import Dict, List, Union def validator(x: List[int], y: int) -> bool: return y in x """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying exp = y in xs for d in [ uplc.PlutusList([uplc.PlutusInteger(x) for x in xs]), uplc.PlutusInteger(y), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, exp, "list in returned wrong value")
def test_index_bytes(self) ‑> None
-
Expand source code
@given(x=st.binary(), y=st.integers()) @example(b"1234", 0) @example(b"1234", 1) @example(b"1234", -1) def test_index_bytes(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bytes, y: int) -> int: return x[y] """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying try: exp = x[y] except IndexError: exp = None try: for d in [uplc.PlutusByteString(x), uplc.PlutusInteger(y)]: f = uplc.Apply(f, d) ret = uplc_eval(f).value except: ret = None self.assertEqual(ret, exp, "byte index returned wrong value")
def test_index_list(self) ‑> None
-
Expand source code
@given(xs=st.lists(st.integers()), y=st.integers()) @example(xs=[0], y=-1) @example(xs=[0], y=0) def test_index_list(self, xs, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ from typing import Dict, List, Union def validator(x: List[int], y: int) -> int: return x[y] """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying try: exp = xs[y] except IndexError: exp = None try: for d in [ uplc.PlutusList([uplc.PlutusInteger(x) for x in xs]), uplc.PlutusInteger(y), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value except Exception as e: ret = None self.assertEqual(ret, exp, "list index returned wrong value")
def test_mod_int(self) ‑> None
-
Expand source code
@given(x=st.integers(), y=st.integers()) def test_mod_int(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> int: return x % y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying try: exp = x % y except ZeroDivisionError: exp = None try: for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value except Exception: ret = None self.assertEqual(ret, exp, "% returned wrong value")
def test_mul_int(self) ‑> None
-
Expand source code
@given(x=st.integers(), y=st.integers()) def test_mul_int(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> int: return x * y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, x * y, "* returned wrong value")
def test_not_bool(self) ‑> None
-
Expand source code
@given(x=st.booleans()) def test_not_bool(self, x): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bool) -> bool: return not x """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x))]: f = uplc.Apply(f, d) ret = bool(uplc_eval(f).value) self.assertEqual(ret, not x, "not returned wrong value")
def test_or_bool(self) ‑> None
-
Expand source code
@given(x=st.booleans(), y=st.booleans()) def test_or_bool(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bool, y: bool) -> bool: return x or y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = bool(uplc_eval(f).value) self.assertEqual(ret, x or y, "or returned wrong value")
def test_pow_int(self) ‑> None
-
Expand source code
@given(x=st.integers(), y=st.integers(min_value=0, max_value=20)) def test_pow_int(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> int: return x ** y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, x**y, "** returned wrong value")
def test_slice_bytes(self) ‑> None
-
Expand source code
@given(x=st.binary(), y=st.integers(), z=st.integers()) @example(b"\x00", -2, 0) @example(b"1234", 1, 2) @example(b"1234", 2, 4) @example(b"1234", 2, 2) @example(b"1234", 3, 3) @example(b"1234", 3, 1) def test_slice_bytes(self, x, y, z): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: bytes, y: int, z: int) -> bytes: return x[y:z] """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying try: exp = x[y:z] except IndexError: exp = None try: for d in [ uplc.PlutusByteString(x), uplc.PlutusInteger(y), uplc.PlutusInteger(z), ]: f = uplc.Apply(f, d) ret = uplc_eval(f).value except: ret = None self.assertEqual(ret, exp, "byte slice returned wrong value")
def test_sub_int(self) ‑> None
-
Expand source code
@given(x=st.integers(), y=st.integers()) def test_sub_int(self, x, y): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int, y: int) -> int: return x - y """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x)), uplc.PlutusInteger(int(y))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, x - y, "- returned wrong value")
def test_usub_int(self) ‑> None
-
Expand source code
@given(x=st.integers()) def test_usub_int(self, x): # this tests that errors that are caused by assignments are actually triggered at the time of assigning source_code = """ def validator(x: int) -> int: return -x """ ast = compiler.parse(source_code) code = compiler.compile(ast) code = code.compile() f = code.term # UPLC lambdas may only take one argument at a time, so we evaluate by repeatedly applying for d in [uplc.PlutusInteger(int(x))]: f = uplc.Apply(f, d) ret = uplc_eval(f).value self.assertEqual(ret, -x, "not returned wrong value")