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