feature. See also
. The project being documented here (as the example) is the Zig library itself.
testing.failEqualSlices
fn failEqualSlices(
comptime T: type,
expected: []const T,
actual: []const T,
diff_index: usize,
w: *Io.Writer,
terminal_mode: Io.Terminal.Mode,
) !void
File
Code
fn failEqualSlices(
comptime T: type,
expected: []const T,
actual: []const T,
diff_index: usize,
w: *Io.Writer,
terminal_mode: Io.Terminal.Mode,
) !void {
try w.print("slices differ. first difference occurs at index {d} (0x{X})\n", .{ diff_index, diff_index });
const max_lines: usize = 16;
const max_window_size: usize = if (T == u8) max_lines * 16 else max_lines;
// first difference to give a bit of context.
var window_start: usize = 0;
if (@max(actual.len, expected.len) > max_window_size) {
const alignment = if (T == u8) 16 else 2;
window_start = std.mem.alignBackward(usize, diff_index - @min(diff_index, alignment), alignment);
}
const expected_window = expected[window_start..@min(expected.len, window_start + max_window_size)];
const expected_truncated = window_start + expected_window.len < expected.len;
const actual_window = actual[window_start..@min(actual.len, window_start + max_window_size)];
const actual_truncated = window_start + actual_window.len < actual.len;
var differ = if (T == u8) BytesDiffer{
.expected = expected_window,
.actual = actual_window,
.terminal_mode = terminal_mode,
} else SliceDiffer(T){
.start_index = window_start,
.expected = expected_window,
.actual = actual_window,
.terminal_mode = terminal_mode,
};
// that is usually useful.
const index_fmt = if (T == u8) "0x{X}" else "{}";
try w.print("\n============ expected this output: ============= len: {} (0x{X})\n\n", .{ expected.len, expected.len });
if (window_start > 0) {
if (T == u8) {
try w.print("... truncated, start index: " ++ index_fmt ++ " ...\n", .{window_start});
} else {
try w.print("... truncated ...\n", .{});
}
}
differ.write(w) catch {};
if (expected_truncated) {
const end_offset = window_start + expected_window.len;
const num_missing_items = expected.len - (window_start + expected_window.len);
if (T == u8) {
try w.print("... truncated, indexes [" ++ index_fmt ++ "..] not shown, remaining bytes: " ++ index_fmt ++ " ...\n", .{ end_offset, num_missing_items });
} else {
try w.print("... truncated, remaining items: " ++ index_fmt ++ " ...\n", .{num_missing_items});
}
}
differ.expected = actual_window;
differ.actual = expected_window;
try w.print("\n============= instead found this: ============== len: {} (0x{X})\n\n", .{ actual.len, actual.len });
if (window_start > 0) {
if (T == u8) {
try w.print("... truncated, start index: " ++ index_fmt ++ " ...\n", .{window_start});
} else {
try w.print("... truncated ...\n", .{});
}
}
differ.write(w) catch {};
if (actual_truncated) {
const end_offset = window_start + actual_window.len;
const num_missing_items = actual.len - (window_start + actual_window.len);
if (T == u8) {
try w.print("... truncated, indexes [" ++ index_fmt ++ "..] not shown, remaining bytes: " ++ index_fmt ++ " ...\n", .{ end_offset, num_missing_items });
} else {
try w.print("... truncated, remaining items: " ++ index_fmt ++ " ...\n", .{num_missing_items});
}
}
try w.print("\n================================================\n\n", .{});
return error.TestExpectedEqual;
}