aboutsummaryrefslogtreecommitdiff
path: root/test/cases/array.zig
blob: b481261b4f2156a4815b870c10cf9f9006fdfc85 (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
const assert = @import("std").debug.assert;
const mem = @import("std").mem;

test "arrays" {
    var array: [5]u32 = undefined;

    var i: u32 = 0;
    while (i < 5) {
        array[i] = i + 1;
        i = array[i];
    }

    i = 0;
    var accumulator = u32(0);
    while (i < 5) {
        accumulator += array[i];

        i += 1;
    }

    assert(accumulator == 15);
    assert(getArrayLen(array) == 5);
}
fn getArrayLen(a: []const u32) usize {
    return a.len;
}

test "void arrays" {
    var array: [4]void = undefined;
    array[0] = void{};
    array[1] = array[2];
    assert(@sizeOf(@typeOf(array)) == 0);
    assert(array.len == 4);
}

test "array literal" {
    const hex_mult = []u16{
        4096,
        256,
        16,
        1,
    };

    assert(hex_mult.len == 4);
    assert(hex_mult[1] == 256);
}

test "array dot len const expr" {
    assert(comptime x: {
        break :x some_array.len == 4;
    });
}

const ArrayDotLenConstExpr = struct {
    y: [some_array.len]u8,
};
const some_array = []u8{
    0,
    1,
    2,
    3,
};

test "nested arrays" {
    const array_of_strings = [][]const u8{
        "hello",
        "this",
        "is",
        "my",
        "thing",
    };
    for (array_of_strings) |s, i| {
        if (i == 0) assert(mem.eql(u8, s, "hello"));
        if (i == 1) assert(mem.eql(u8, s, "this"));
        if (i == 2) assert(mem.eql(u8, s, "is"));
        if (i == 3) assert(mem.eql(u8, s, "my"));
        if (i == 4) assert(mem.eql(u8, s, "thing"));
    }
}

var s_array: [8]Sub = undefined;
const Sub = struct {
    b: u8,
};
const Str = struct {
    a: []Sub,
};
test "set global var array via slice embedded in struct" {
    var s = Str{ .a = s_array[0..] };

    s.a[0].b = 1;
    s.a[1].b = 2;
    s.a[2].b = 3;

    assert(s_array[0].b == 1);
    assert(s_array[1].b == 2);
    assert(s_array[2].b == 3);
}

test "array literal with specified size" {
    var array = [2]u8{
        1,
        2,
    };
    assert(array[0] == 1);
    assert(array[1] == 2);
}

test "array child property" {
    var x: [5]i32 = undefined;
    assert(@typeOf(x).Child == i32);
}

test "array len property" {
    var x: [5]i32 = undefined;
    assert(@typeOf(x).len == 5);
}

test "array len field" {
    var arr = [4]u8{ 0, 0, 0, 0 };
    var ptr = &arr;
    assert(arr.len == 4);
    comptime assert(arr.len == 4);
    assert(ptr.len == 4);
    comptime assert(ptr.len == 4);
}

test "single-item pointer to array indexing and slicing" {
    testSingleItemPtrArrayIndexSlice();
    comptime testSingleItemPtrArrayIndexSlice();
}

fn testSingleItemPtrArrayIndexSlice() void {
    var array = "aaaa";
    doSomeMangling(&array);
    assert(mem.eql(u8, "azya", array));
}

fn doSomeMangling(array: *[4]u8) void {
    array[1] = 'z';
    array[2..3][0] = 'y';
}

test "implicit cast single-item pointer" {
    testImplicitCastSingleItemPtr();
    comptime testImplicitCastSingleItemPtr();
}

fn testImplicitCastSingleItemPtr() void {
    var byte: u8 = 100;
    const slice = (*[1]u8)(&byte)[0..];
    slice[0] += 1;
    assert(byte == 101);
}