aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/external/metalang99/tests/either.c
blob: 4a29fb94b31c7edcd95dda02cfe4dc4124d9f2c7 (plain) (blame)
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
#include <metalang99/assert.h>
#include <metalang99/either.h>
#include <metalang99/nat.h>

int main(void) {

#define MATCH_IMPL(either)  ML99_match(v(either), v(MATCH_))
#define MATCH_left_IMPL(x)  v(ML99_ASSERT_UNEVAL(x == 18))
#define MATCH_right_IMPL(x) v(ML99_ASSERT_UNEVAL(x == 4))

    // Pattern matching
    {
        ML99_EVAL(ML99_call(MATCH, ML99_left(v(18))));
        ML99_EVAL(ML99_call(MATCH, ML99_right(v(4))));
    }

#undef MATCH_IMPL
#undef MATCH_left_IMPL
#undef MATCH_right_IMPL

#define VAL v(abc ? +-148 % "hello world")

    // ML99_isLeft
    {
        ML99_ASSERT(ML99_isLeft(ML99_left(VAL)));
        ML99_ASSERT(ML99_not(ML99_isLeft(ML99_right(VAL))));
    }

    // ML99_IS_LEFT
    {
        ML99_ASSERT_UNEVAL(ML99_IS_LEFT(ML99_LEFT(VAL)));
        ML99_ASSERT_UNEVAL(!ML99_IS_LEFT(ML99_RIGHT(VAL)));
    }

    // ML99_isRight
    {
        ML99_ASSERT(ML99_isRight(ML99_right(VAL)));
        ML99_ASSERT(ML99_not(ML99_isRight(ML99_left(VAL))));
    }

    // ML99_IS_RIGHT
    {
        ML99_ASSERT_UNEVAL(ML99_IS_RIGHT(ML99_RIGHT(VAL)));
        ML99_ASSERT_UNEVAL(!ML99_IS_RIGHT(ML99_LEFT(VAL)));
    }

    // ML99_eitherEq
    {
        ML99_ASSERT(ML99_eitherEq(v(ML99_natEq), ML99_left(v(123)), ML99_left(v(123))));
        ML99_ASSERT(ML99_not(ML99_eitherEq(v(ML99_natEq), ML99_left(v(18)), ML99_left(v(123)))));

        ML99_ASSERT(ML99_eitherEq(v(ML99_natEq), ML99_right(v(123)), ML99_right(v(123))));
        ML99_ASSERT(ML99_not(ML99_eitherEq(v(ML99_natEq), ML99_right(v(18)), ML99_right(v(123)))));

        ML99_ASSERT(ML99_not(ML99_eitherEq(v(ML99_natEq), ML99_left(v(123)), ML99_right(v(123)))));
        ML99_ASSERT(ML99_not(ML99_eitherEq(v(ML99_natEq), ML99_left(v(123)), ML99_right(v(4)))));
        ML99_ASSERT(ML99_not(ML99_eitherEq(v(ML99_natEq), ML99_right(v(123)), ML99_left(v(123)))));
        ML99_ASSERT(ML99_not(ML99_eitherEq(v(ML99_natEq), ML99_right(v(123)), ML99_left(v(4)))));
    }

    // ML99_unwrapLeft
    { ML99_ASSERT_EQ(ML99_unwrapLeft(ML99_left(v(123))), v(123)); }

    // ML99_unwrapRight
    { ML99_ASSERT_EQ(ML99_unwrapRight(ML99_right(v(123))), v(123)); }
}