159 lines
4.0 KiB
Python
159 lines
4.0 KiB
Python
# This file is only collected when Python >= 3.10, because it tests match syntax.
|
|
import pytest
|
|
from pyo3_pytests import enums
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"variant",
|
|
[
|
|
enums.ComplexEnum.Int(42),
|
|
enums.ComplexEnum.Float(3.14),
|
|
enums.ComplexEnum.Str("hello"),
|
|
enums.ComplexEnum.EmptyStruct(),
|
|
enums.ComplexEnum.MultiFieldStruct(42, 3.14, True),
|
|
],
|
|
)
|
|
def test_complex_enum_match_statement(variant: enums.ComplexEnum):
|
|
match variant:
|
|
case enums.ComplexEnum.Int(i=x):
|
|
assert x == 42
|
|
case enums.ComplexEnum.Float(f=x):
|
|
assert x == 3.14
|
|
case enums.ComplexEnum.Str(s=x):
|
|
assert x == "hello"
|
|
case enums.ComplexEnum.EmptyStruct():
|
|
assert True
|
|
case enums.ComplexEnum.MultiFieldStruct(a=x, b=y, c=z):
|
|
assert x == 42
|
|
assert y == 3.14
|
|
assert z is True
|
|
case _:
|
|
assert False
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"variant",
|
|
[
|
|
enums.ComplexEnum.Int(42),
|
|
enums.ComplexEnum.Float(3.14),
|
|
enums.ComplexEnum.Str("hello"),
|
|
enums.ComplexEnum.EmptyStruct(),
|
|
enums.ComplexEnum.MultiFieldStruct(42, 3.14, True),
|
|
],
|
|
)
|
|
def test_complex_enum_pyfunction_in_out(variant: enums.ComplexEnum):
|
|
match enums.do_complex_stuff(variant):
|
|
case enums.ComplexEnum.Int(i=x):
|
|
assert x == 5
|
|
case enums.ComplexEnum.Float(f=x):
|
|
assert x == 9.8596
|
|
case enums.ComplexEnum.Str(s=x):
|
|
assert x == "42"
|
|
case enums.ComplexEnum.EmptyStruct():
|
|
assert True
|
|
case enums.ComplexEnum.MultiFieldStruct(a=x, b=y, c=z):
|
|
assert x == 42
|
|
assert y == 3.14
|
|
assert z is True
|
|
case _:
|
|
assert False
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"variant",
|
|
[
|
|
enums.ComplexEnum.MultiFieldStruct(42, 3.14, True),
|
|
],
|
|
)
|
|
def test_complex_enum_partial_match(variant: enums.ComplexEnum):
|
|
match variant:
|
|
case enums.ComplexEnum.MultiFieldStruct(a):
|
|
assert a == 42
|
|
case _:
|
|
assert False
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"variant",
|
|
[
|
|
enums.TupleEnum.Full(42, 3.14, True),
|
|
enums.TupleEnum.EmptyTuple(),
|
|
],
|
|
)
|
|
def test_tuple_enum_match_statement(variant: enums.TupleEnum):
|
|
match variant:
|
|
case enums.TupleEnum.Full(_0=x, _1=y, _2=z):
|
|
assert x == 42
|
|
assert y == 3.14
|
|
assert z is True
|
|
case enums.TupleEnum.EmptyTuple():
|
|
assert True
|
|
case _:
|
|
print(variant)
|
|
assert False
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"variant",
|
|
[
|
|
enums.SimpleTupleEnum.Int(42),
|
|
enums.SimpleTupleEnum.Str("hello"),
|
|
],
|
|
)
|
|
def test_simple_tuple_enum_match_statement(variant: enums.SimpleTupleEnum):
|
|
match variant:
|
|
case enums.SimpleTupleEnum.Int(x):
|
|
assert x == 42
|
|
case enums.SimpleTupleEnum.Str(x):
|
|
assert x == "hello"
|
|
case _:
|
|
assert False
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"variant",
|
|
[
|
|
enums.TupleEnum.Full(42, 3.14, True),
|
|
],
|
|
)
|
|
def test_tuple_enum_match_match_args(variant: enums.TupleEnum):
|
|
match variant:
|
|
case enums.TupleEnum.Full(x, y, z):
|
|
assert x == 42
|
|
assert y == 3.14
|
|
assert z is True
|
|
assert True
|
|
case _:
|
|
assert False
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"variant",
|
|
[
|
|
enums.TupleEnum.Full(42, 3.14, True),
|
|
],
|
|
)
|
|
def test_tuple_enum_partial_match(variant: enums.TupleEnum):
|
|
match variant:
|
|
case enums.TupleEnum.Full(a):
|
|
assert a == 42
|
|
case _:
|
|
assert False
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"variant",
|
|
[
|
|
enums.MixedComplexEnum.Nothing(),
|
|
enums.MixedComplexEnum.Empty(),
|
|
],
|
|
)
|
|
def test_mixed_complex_enum_match_statement(variant: enums.MixedComplexEnum):
|
|
match variant:
|
|
case enums.MixedComplexEnum.Nothing():
|
|
assert True
|
|
case enums.MixedComplexEnum.Empty():
|
|
assert True
|
|
case _:
|
|
assert False
|