master
 1const expect = @import("std").testing.expect;
 2
 3test "if optional" {
 4    // If expressions test for null.
 5
 6    const a: ?u32 = 0;
 7    if (a) |value| {
 8        try expect(value == 0);
 9    } else {
10        unreachable;
11    }
12
13    const b: ?u32 = null;
14    if (b) |_| {
15        unreachable;
16    } else {
17        try expect(true);
18    }
19
20    // The else is not required.
21    if (a) |value| {
22        try expect(value == 0);
23    }
24
25    // To test against null only, use the binary equality operator.
26    if (b == null) {
27        try expect(true);
28    }
29
30    // Access the value by reference using a pointer capture.
31    var c: ?u32 = 3;
32    if (c) |*value| {
33        value.* = 2;
34    }
35
36    if (c) |value| {
37        try expect(value == 2);
38    } else {
39        unreachable;
40    }
41}
42
43test "if error union with optional" {
44    // If expressions test for errors before unwrapping optionals.
45    // The |optional_value| capture's type is ?u32.
46
47    const a: anyerror!?u32 = 0;
48    if (a) |optional_value| {
49        try expect(optional_value.? == 0);
50    } else |err| {
51        _ = err;
52        unreachable;
53    }
54
55    const b: anyerror!?u32 = null;
56    if (b) |optional_value| {
57        try expect(optional_value == null);
58    } else |_| {
59        unreachable;
60    }
61
62    const c: anyerror!?u32 = error.BadValue;
63    if (c) |optional_value| {
64        _ = optional_value;
65        unreachable;
66    } else |err| {
67        try expect(err == error.BadValue);
68    }
69
70    // Access the value by reference by using a pointer capture each time.
71    var d: anyerror!?u32 = 3;
72    if (d) |*optional_value| {
73        if (optional_value.*) |*value| {
74            value.* = 9;
75        }
76    } else |_| {
77        unreachable;
78    }
79
80    if (d) |optional_value| {
81        try expect(optional_value.? == 9);
82    } else |_| {
83        unreachable;
84    }
85}
86
87// test