zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

test_for.zig (2226B) - Raw


      1 const expect = @import("std").testing.expect;
      2 
      3 test "for basics" {
      4     const items = [_]i32{ 4, 5, 3, 4, 0 };
      5     var sum: i32 = 0;
      6 
      7     // For loops iterate over slices and arrays.
      8     for (items) |value| {
      9         // Break and continue are supported.
     10         if (value == 0) {
     11             continue;
     12         }
     13         sum += value;
     14     }
     15     try expect(sum == 16);
     16 
     17     // To iterate over a portion of a slice, reslice.
     18     for (items[0..1]) |value| {
     19         sum += value;
     20     }
     21     try expect(sum == 20);
     22 
     23     // To access the index of iteration, specify a second condition as well
     24     // as a second capture value.
     25     var sum2: i32 = 0;
     26     for (items, 0..) |_, i| {
     27         try expect(@TypeOf(i) == usize);
     28         sum2 += @as(i32, @intCast(i));
     29     }
     30     try expect(sum2 == 10);
     31 
     32     // To iterate over consecutive integers, use the range syntax.
     33     // Unbounded range is always a compile error.
     34     var sum3: usize = 0;
     35     for (0..5) |i| {
     36         sum3 += i;
     37     }
     38     try expect(sum3 == 10);
     39 }
     40 
     41 test "multi object for" {
     42     const items = [_]usize{ 1, 2, 3 };
     43     const items2 = [_]usize{ 4, 5, 6 };
     44     var count: usize = 0;
     45 
     46     // Iterate over multiple objects.
     47     // All lengths must be equal at the start of the loop, otherwise detectable
     48     // illegal behavior occurs.
     49     for (items, items2) |i, j| {
     50         count += i + j;
     51     }
     52 
     53     try expect(count == 21);
     54 }
     55 
     56 test "for reference" {
     57     var items = [_]i32{ 3, 4, 2 };
     58 
     59     // Iterate over the slice by reference by
     60     // specifying that the capture value is a pointer.
     61     for (&items) |*value| {
     62         value.* += 1;
     63     }
     64 
     65     try expect(items[0] == 4);
     66     try expect(items[1] == 5);
     67     try expect(items[2] == 3);
     68 }
     69 
     70 test "for else" {
     71     // For allows an else attached to it, the same as a while loop.
     72     const items = [_]?i32{ 3, 4, null, 5 };
     73 
     74     // For loops can also be used as expressions.
     75     // Similar to while loops, when you break from a for loop, the else branch is not evaluated.
     76     var sum: i32 = 0;
     77     const result = for (items) |value| {
     78         if (value != null) {
     79             sum += value.?;
     80         }
     81     } else blk: {
     82         try expect(sum == 12);
     83         break :blk sum;
     84     };
     85     try expect(result == 12);
     86 }
     87 
     88 // test