import bind_optional


def test_none_if_zero():
    x = bind_optional.none_if_zero(0)
    y = bind_optional.none_if_zero(-1)
    assert x is None
    assert y == -1


def test_struct_ctors():
    # test struct ctors

    struct = bind_optional.mystruct()
    assert struct.a is None
    assert struct.b is None
    assert struct.msg == "i am struct"

    ## no 2nd arg automatic overload using bp::optional
    struct = bind_optional.mystruct(2)
    assert struct.a == 2
    assert struct.b is None

    struct = bind_optional.mystruct(13, -1.0)
    assert struct.a == 13
    assert struct.b == -1.0


def test_struct_setters():
    struct = bind_optional.mystruct()
    struct.a = 1
    assert struct.a == 1

    struct.b = -3.14
    assert struct.b == -3.14

    # set to None
    struct.a = None
    struct.b = None
    struct.msg = None
    assert struct.a is None
    assert struct.b is None
    assert struct.msg is None


def test_factory():
    struct = bind_optional.create_if_true(False, None)
    assert struct is None
    struct = bind_optional.create_if_true(True, None)
    assert struct.a == 0
    assert struct.b is None


def test_random_mat():
    M = bind_optional.random_mat_if_true(False)
    assert M is None
    M = bind_optional.random_mat_if_true(True)
    assert M.shape == (4, 4)


if __name__ == "__main__":
    import pytest
    import sys

    sys.exit(pytest.main(sys.argv))