""" Other testing examples """

from Aspidites._vendor.contracts.test_registrar import good, fail

# dummy
good(["*"], [0])
good(["*", "*"], [0, 1])
good(["=0", "=1"], [0, 1])
fail(["=0", "=1"], [0, 2])

# Lists of equal length
good(["list[N]", "list[N]"], [[4], [3]])
good(["list[N]", "list[N]"], [[], []])
fail(["list[N]", "list[N]"], [[], [1]])
good(["list[N]", "list[N],N>0"], [[1], [3]])
# we can also refer to the other context
good(["list[N]", "list,N>0"], [[1], [3]])
fail(["list[N]", "list,N>0"], [[], [3]])

# Lists of different length
good(["list[N]", "list[M],M!=N"], [[4], [3, 2]])
good(["list[N]", "list[M],M!=N"], [[4, 3], [3]])
fail(["list[N]", "list[M],M!=N"], [[3], [3]])

# One list shorter than the other
good(["list[N]", "list[M],M<N"], [[4, 3], [3]])
good(["list[N]", "list[M],N>M"], [[4, 3], [3]])
fail(["list[N]", "list[M],N>M"], [[3], [3]])

# Values of the same type
good(["type(x)", "type(x)"], [0, 1])
good(["type(x)", "type(x)"], [0.1, 1.1])
fail(["type(x)", "type(x)"], [0.1, 1])
good(["type(x)", "type(y)", "type(x)|type(y)"], [0, 1.1, 1.2])
good(["type(x)", "type(y)", "type(x)|type(y)"], [0, 1.1, 3])
fail(["type(x)", "type(y)", "type(x)|type(y)"], [0, 1.1, "ciao"])

# A list with all elements of the same type
good(["list(type(x))"], [[0, 1, 2]])
fail(["list(type(x))"], [[0, 1.2, 2]])
fail(["list(type(x))"], [[0, None, 2]])
# Lists with the same type of elements
good(["list(type(x))", "list(type(x))"], [[1, 2], [3, 4]])
fail(["list(type(x))", "list(type(x))"], [[1, 2], [3.0, 4]])
# Using different variables and then imposing they are equal
good(["list(type(x))", "list(type(y)),x=y"], [[1, 2], [3, 4]])
fail(["list(type(x))", "list(type(y)),x=y"], [[1, 2], [3.0, 4]])

# a list with at most two types
good("list(type(x|y))", [1, 2, 3, 4.0])
fail("list(type(x|y))", [1, 2, "ciao", 4.0])
