aboutsummaryrefslogtreecommitdiff
path: root/compiler/tests/runtime/optional.test.lc
blob: 6fdb770593f6c94944b1cabde4ab2f0a0bb70836 (plain)
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

linkname "";

int main()
{
    // Optional pointers ("none" is merged into the pointer as NULL)
    byte b = 22;
    byte c;
    byte^? op = makeopt @b;
    byte^? opn = none;
    assert op? == @b;
    assert op == op;
    assert op == makeopt @b;
    assert op != makeopt @c;
    assert makeopt @b == op;
    assert op != none;
    assert none != op;
    assert op != opn;
    assert opn != op;
    assert opn == none;
    assert none == opn;

    // Optional integer. This becomes a struct with has_value
    int? i = makeopt 123;
    int? j = none;
    assert i? == 123;
    assert i == i;
    assert i == makeopt 123;
    assert i != makeopt 321;
    assert makeopt 123 == i;
    assert i != none;
    assert none != i;
    assert i != j;
    assert j != i;
    assert j == none;
    assert none == j;

    // Optional struct (more complex)
    (int x, byte y)? os = makeopt (333, 44);
    (int x, byte y)? osn = none;
    assert os? == (333, 44);
    assert os == os;
    assert os == makeopt (333, 44);
    assert os != makeopt (111, 22);
    assert makeopt (333, 44) == os;
    assert os != none;
    assert none != os;
    assert os != osn;
    assert osn != os;
    assert osn == none;
    assert none == osn;

    // Optional array
    int#[3]? oa = makeopt [555,444,333];
    int#[3]? oan = none;
    assert oa? == [555,444,333];
    assert oa == oa;
    assert oa == makeopt [555,444,333];
    assert oa != makeopt [111,222,333];
    assert makeopt [555,444,333] == oa;
    assert oa != none;
    assert none != oa;
    assert oa != oan;
    assert oan != oa;
    assert oan == none;
    assert none == oan;

    return 0;
}