feature. See also
. The project being documented here (as the example) is the Zig library itself.
deque.fuzzAgainstArrayList
fn fuzzAgainstArrayList(_: void, smith: *std.testing.Smith) anyerror!void
File
Code
fn fuzzAgainstArrayList(_: void, smith: *std.testing.Smith) anyerror!void {
const testing = std.testing;
var q_gpa_inst: FuzzAllocator = .init(smith);
var l_gpa_buf: [q_gpa_inst.bufs[0].len]u8 align(4) = undefined;
var l_gpa_inst: std.heap.FixedBufferAllocator = .init(&l_gpa_buf);
const q_gpa = q_gpa_inst.allocator();
const l_gpa = l_gpa_inst.allocator();
var q: Deque(u32) = .empty;
var l: std.ArrayList(u32) = .empty;
const Action = enum(u8) {
grow,
push_back,
push_front,
push_back_slice,
push_front_slice,
pop_back,
pop_front,
};
while (!smith.eosWeightedSimple(15, 1)) {
const baseline = testing.Smith.baselineWeights(Action);
const grow_weight: testing.Smith.Weight = .value(Action, .grow, 3);
switch (smith.valueWeighted(Action, baseline ++ .{grow_weight})) {
.push_back => {
const item = smith.value(u32);
try testing.expectEqual(
l.appendBounded(item),
q.pushBackBounded(item),
);
},
.push_front => {
const item = smith.value(u32);
try testing.expectEqual(
l.insertBounded(0, item),
q.pushFrontBounded(item),
);
},
.push_back_slice => {
var buffer: [std.math.maxInt(u3)]u32 = undefined;
const items = buffer[0..smith.value(u3)];
for (items) |*item| {
item.* = smith.value(u32);
}
try testing.expectEqual(
l.appendSliceBounded(items),
q.pushBackSliceBounded(items),
);
},
.push_front_slice => {
var buffer: [std.math.maxInt(u3)]u32 = undefined;
const items = buffer[0..smith.value(u3)];
for (items) |*item| {
item.* = smith.value(u32);
}
try testing.expectEqual(
l.insertSliceBounded(0, items),
q.pushFrontSliceBounded(items),
);
},
.pop_back => {
try testing.expectEqual(l.pop(), q.popBack());
},
.pop_front => {
try testing.expectEqual(
if (l.items.len > 0) l.orderedRemove(0) else null,
q.popFront(),
);
},
// ensureTotalCapacityPrecise(), which is the most complex part
// of the Deque implementation.
.grow => {
const growth = smith.value(u3);
try l.ensureTotalCapacityPrecise(l_gpa, l.items.len + growth);
try q.ensureTotalCapacityPrecise(q_gpa, q.len + growth);
},
}
try testing.expectEqual(l.getLast(), q.back());
try testing.expectEqual(
if (l.items.len > 0) l.items[0] else null,
q.front(),
);
try testing.expectEqual(l.items.len, q.len);
try testing.expectEqual(l.capacity, q.buffer.len);
{
var it = q.iterator();
for (l.items) |item| {
try testing.expectEqual(item, it.next());
}
try testing.expectEqual(null, it.next());
}
try testing.expectEqual(@intFromBool(q.buffer.len != 0), q_gpa_inst.allocCount());
}
q.deinit(q_gpa);
try testing.expectEqual(0, q_gpa_inst.allocCount());
}