File: test_pattern_matching.py

package info (click to toggle)
python-returns 0.26.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,652 kB
  • sloc: python: 11,000; makefile: 18
file content (82 lines) | stat: -rw-r--r-- 2,609 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import pytest

from returns.io import IO, IOFailure, IOResult, IOSuccess
from returns.maybe import Maybe, Nothing, Some
from returns.result import Failure, Result, Success


@pytest.mark.parametrize(
    'container',
    [
        Success(10),
        Success(42),
        Failure(RuntimeError()),
        Failure(Exception()),
    ],
)
def test_result_pattern_matching(container: Result[int, Exception]):
    """Ensures ``Result`` containers work properly with pattern matching."""
    match container:
        case Success(10):
            assert isinstance(container, Success)
            assert container.unwrap() == 10
        case Success(value):
            assert isinstance(container, Success)
            assert value == 42
            assert container.unwrap() == value
        case Failure(RuntimeError()):
            assert isinstance(container, Failure)
            assert isinstance(container.failure(), RuntimeError)
        case Failure(_):
            assert isinstance(container, Failure)
            assert isinstance(container.failure(), Exception)
        case _:
            pytest.fail('Was not matched')


@pytest.mark.parametrize(
    'container',
    [
        Some('SOME'),
        Some('THERE IS SOME VALUE'),
        Nothing,
    ],
)
def test_maybe_pattern_matching(container: Maybe[str]):
    """Ensures ``Maybe`` containers work properly with pattern matching."""
    match container:
        case Some('SOME'):
            assert isinstance(container, Some)
            assert container.unwrap() == 'SOME'
        case Some(value):
            assert isinstance(container, Some)
            assert value == 'THERE IS SOME VALUE'
            assert container.unwrap() == value
        case Maybe.empty:
            assert container is Nothing
        case _:
            pytest.fail('Was not matched')


@pytest.mark.parametrize(
    'container',
    [
        IOSuccess(42.0),
        IOSuccess(10.0),
        IOFailure(50),
    ],
)
def test_ioresult_pattern_matching(container: IOResult[float, int]):
    """Ensures ``IOResult`` containers work properly with pattern matching."""
    match container:
        case IOSuccess(Success(42.0)):
            assert isinstance(container, IOSuccess)
            assert container.unwrap() == IO(42.0)
        case IOSuccess(value):
            assert isinstance(container, IOSuccess)
            assert container.unwrap() == IO(value.unwrap())
        case IOFailure(_):
            assert isinstance(container, IOFailure)
            assert container.failure() == IO(50)
        case _:
            pytest.fail('Was not matched')