srctree

Andrew Kelley parent a2651cbc 90c94a2f d8bb139d
Merge pull request #19390 from ziglang/valgrind

make the behavior tests run almost valgrind clean

inlinesplit
lib/std/ascii.zig added: 434, removed: 391, total 43
@@ -147,7 +147,7 @@ pub fn isWhitespace(c: u8) bool {
/// See also: `isWhitespace`
pub const whitespace = [_]u8{ ' ', '\t', '\n', '\r', control_code.vt, control_code.ff };
 
test "whitespace" {
test whitespace {
for (whitespace) |char| try std.testing.expect(isWhitespace(char));
 
var i: u8 = 0;
@@ -278,7 +278,7 @@ pub fn lowerString(output: []u8, ascii_string: []const u8) []u8 {
return output[0..ascii_string.len];
}
 
test "lowerString" {
test lowerString {
var buf: [1024]u8 = undefined;
const result = lowerString(&buf, "aBcDeFgHiJkLmNOPqrst0234+πŸ’©!");
try std.testing.expectEqualStrings("abcdefghijklmnopqrst0234+πŸ’©!", result);
@@ -291,7 +291,7 @@ pub fn allocLowerString(allocator: std.mem.Allocator, ascii_string: []const u8)
return lowerString(result, ascii_string);
}
 
test "allocLowerString" {
test allocLowerString {
const result = try allocLowerString(std.testing.allocator, "aBcDeFgHiJkLmNOPqrst0234+πŸ’©!");
defer std.testing.allocator.free(result);
try std.testing.expectEqualStrings("abcdefghijklmnopqrst0234+πŸ’©!", result);
@@ -307,7 +307,7 @@ pub fn upperString(output: []u8, ascii_string: []const u8) []u8 {
return output[0..ascii_string.len];
}
 
test "upperString" {
test upperString {
var buf: [1024]u8 = undefined;
const result = upperString(&buf, "aBcDeFgHiJkLmNOPqrst0234+πŸ’©!");
try std.testing.expectEqualStrings("ABCDEFGHIJKLMNOPQRST0234+πŸ’©!", result);
@@ -320,7 +320,7 @@ pub fn allocUpperString(allocator: std.mem.Allocator, ascii_string: []const u8)
return upperString(result, ascii_string);
}
 
test "allocUpperString" {
test allocUpperString {
const result = try allocUpperString(std.testing.allocator, "aBcDeFgHiJkLmNOPqrst0234+πŸ’©!");
defer std.testing.allocator.free(result);
try std.testing.expectEqualStrings("ABCDEFGHIJKLMNOPQRST0234+πŸ’©!", result);
@@ -335,7 +335,7 @@ pub fn eqlIgnoreCase(a: []const u8, b: []const u8) bool {
return true;
}
 
test "eqlIgnoreCase" {
test eqlIgnoreCase {
try std.testing.expect(eqlIgnoreCase("HElπŸ’©Lo!", "helπŸ’©lo!"));
try std.testing.expect(!eqlIgnoreCase("hElLo!", "hello! "));
try std.testing.expect(!eqlIgnoreCase("hElLo!", "helro!"));
@@ -345,7 +345,7 @@ pub fn startsWithIgnoreCase(haystack: []const u8, needle: []const u8) bool {
return if (needle.len > haystack.len) false else eqlIgnoreCase(haystack[0..needle.len], needle);
}
 
test "startsWithIgnoreCase" {
test startsWithIgnoreCase {
try std.testing.expect(startsWithIgnoreCase("boB", "Bo"));
try std.testing.expect(!startsWithIgnoreCase("Needle in hAyStAcK", "haystack"));
}
@@ -354,7 +354,7 @@ pub fn endsWithIgnoreCase(haystack: []const u8, needle: []const u8) bool {
return if (needle.len > haystack.len) false else eqlIgnoreCase(haystack[haystack.len - needle.len ..], needle);
}
 
test "endsWithIgnoreCase" {
test endsWithIgnoreCase {
try std.testing.expect(endsWithIgnoreCase("Needle in HaYsTaCk", "haystack"));
try std.testing.expect(!endsWithIgnoreCase("BoB", "Bo"));
}
@@ -409,7 +409,7 @@ fn boyerMooreHorspoolPreprocessIgnoreCase(pattern: []const u8, table: *[256]usiz
}
}
 
test "indexOfIgnoreCase" {
test indexOfIgnoreCase {
try std.testing.expect(indexOfIgnoreCase("one Two Three Four", "foUr").? == 14);
try std.testing.expect(indexOfIgnoreCase("one two three FouR", "gOur") == null);
try std.testing.expect(indexOfIgnoreCase("foO", "Foo").? == 0);
 
lib/std/bit_set.zig added: 434, removed: 391, total 43
@@ -1648,7 +1648,7 @@ fn testStaticBitSet(comptime Set: type) !void {
try testPureBitSet(Set);
}
 
test "IntegerBitSet" {
test IntegerBitSet {
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
 
try testStaticBitSet(IntegerBitSet(0));
@@ -1661,7 +1661,7 @@ test "IntegerBitSet" {
try testStaticBitSet(IntegerBitSet(127));
}
 
test "ArrayBitSet" {
test ArrayBitSet {
inline for (.{ 0, 1, 2, 31, 32, 33, 63, 64, 65, 254, 500, 3000 }) |size| {
try testStaticBitSet(ArrayBitSet(u8, size));
try testStaticBitSet(ArrayBitSet(u16, size));
@@ -1671,7 +1671,7 @@ test "ArrayBitSet" {
}
}
 
test "DynamicBitSetUnmanaged" {
test DynamicBitSetUnmanaged {
const allocator = std.testing.allocator;
var a = try DynamicBitSetUnmanaged.initEmpty(allocator, 300);
try testing.expectEqual(@as(usize, 0), a.count());
@@ -1724,7 +1724,7 @@ test "DynamicBitSetUnmanaged" {
}
}
 
test "DynamicBitSet" {
test DynamicBitSet {
const allocator = std.testing.allocator;
var a = try DynamicBitSet.initEmpty(allocator, 300);
try testing.expectEqual(@as(usize, 0), a.count());
@@ -1765,7 +1765,7 @@ test "DynamicBitSet" {
}
}
 
test "StaticBitSet" {
test StaticBitSet {
try testing.expectEqual(IntegerBitSet(0), StaticBitSet(0));
try testing.expectEqual(IntegerBitSet(5), StaticBitSet(5));
try testing.expectEqual(IntegerBitSet(@bitSizeOf(usize)), StaticBitSet(@bitSizeOf(usize)));
 
lib/std/bounded_array.zig added: 434, removed: 391, total 43
@@ -287,7 +287,7 @@ pub fn BoundedArrayAligned(
};
}
 
test "BoundedArray" {
test BoundedArray {
var a = try BoundedArray(u8, 64).init(32);
 
try testing.expectEqual(a.capacity(), 64);
 
lib/std/child_process.zig added: 434, removed: 391, total 43
@@ -1231,7 +1231,7 @@ fn windowsCreateProcessSupportsExtension(ext: []const u16) ?CreateProcessSupport
return null;
}
 
test "windowsCreateProcessSupportsExtension" {
test windowsCreateProcessSupportsExtension {
try std.testing.expectEqual(CreateProcessSupportedExtension.exe, windowsCreateProcessSupportsExtension(&[_]u16{ '.', 'e', 'X', 'e' }).?);
try std.testing.expect(windowsCreateProcessSupportsExtension(&[_]u16{ '.', 'e', 'X', 'e', 'c' }) == null);
}
@@ -1322,7 +1322,7 @@ pub fn argvToCommandLineWindows(
return try unicode.wtf8ToWtf16LeAllocZ(allocator, buf.items);
}
 
test "argvToCommandLineWindows" {
test argvToCommandLineWindows {
const t = testArgvToCommandLineWindows;
 
try t(&.{
@@ -1556,7 +1556,7 @@ pub fn createNullDelimitedEnvMap(arena: mem.Allocator, env_map: *const EnvMap) !
return envp_buf;
}
 
test "createNullDelimitedEnvMap" {
test createNullDelimitedEnvMap {
const testing = std.testing;
const allocator = testing.allocator;
var envmap = EnvMap.init(allocator);
 
lib/std/crypto/utils.zig added: 434, removed: 391, total 43
@@ -138,7 +138,7 @@ pub inline fn secureZero(comptime T: type, s: []T) void {
@memset(@as([]volatile T, s), 0);
}
 
test "timingSafeEql" {
test timingSafeEql {
var a: [100]u8 = undefined;
var b: [100]u8 = undefined;
random.bytes(a[0..]);
@@ -162,7 +162,7 @@ test "timingSafeEql (vectors)" {
try testing.expect(timingSafeEql(@Vector(100, u8), v1, v3));
}
 
test "timingSafeCompare" {
test timingSafeCompare {
var a = [_]u8{10} ** 32;
var b = [_]u8{10} ** 32;
try testing.expectEqual(timingSafeCompare(u8, &a, &b, .big), .eq);
@@ -195,7 +195,7 @@ test "timingSafe{Add,Sub}" {
}
}
 
test "secureZero" {
test secureZero {
var a = [_]u8{0xfe} ** 8;
var b = [_]u8{0xfe} ** 8;
 
 
lib/std/debug.zig added: 434, removed: 391, total 43
@@ -905,7 +905,7 @@ fn machoSearchSymbols(symbols: []const MachoSymbol, address: usize) ?*const Mach
return null;
}
 
test "machoSearchSymbols" {
test machoSearchSymbols {
const symbols = [_]MachoSymbol{
.{ .addr = 100, .strx = undefined, .size = undefined, .ofile = undefined },
.{ .addr = 200, .strx = undefined, .size = undefined, .ofile = undefined },
@@ -1504,7 +1504,7 @@ fn printLineFromFileAnyOs(out_stream: anytype, line_info: LineInfo) !void {
}
}
 
test "printLineFromFileAnyOs" {
test printLineFromFileAnyOs {
var output = std.ArrayList(u8).init(std.testing.allocator);
defer output.deinit();
const output_stream = output.writer();
@@ -2858,6 +2858,16 @@ pub const SafetyLock = struct {
}
};
 
/// Detect whether the program is being executed in the Valgrind virtual machine.
///
/// When Valgrind integrations are disabled, this returns comptime-known false.
/// Otherwise, the result is runtime-known.
pub inline fn inValgrind() bool {
if (@inComptime()) return false;
if (!builtin.valgrind_support) return false;
return std.valgrind.runningOnValgrind() > 0;
}
 
test {
_ = &dump_hex;
}
 
lib/std/fifo.zig added: 434, removed: 391, total 43
@@ -507,7 +507,7 @@ test "LinearFifo(u8, .Dynamic)" {
}
}
 
test "LinearFifo" {
test LinearFifo {
inline for ([_]type{ u1, u8, u16, u64 }) |T| {
inline for ([_]LinearFifoBufferType{ LinearFifoBufferType{ .Static = 32 }, .Slice, .Dynamic }) |bt| {
const FifoType = LinearFifo(T, bt);
 
lib/std/fmt.zig added: 434, removed: 391, total 43
@@ -1303,7 +1303,7 @@ pub fn fmtDuration(ns: u64) Formatter(formatDuration) {
return .{ .data = data };
}
 
test "fmtDuration" {
test fmtDuration {
var buf: [24]u8 = undefined;
inline for (.{
.{ .s = "0ns", .d = 0 },
@@ -1367,7 +1367,7 @@ pub fn fmtDurationSigned(ns: i64) Formatter(formatDurationSigned) {
return .{ .data = ns };
}
 
test "fmtDurationSigned" {
test fmtDurationSigned {
var buf: [24]u8 = undefined;
inline for (.{
.{ .s = "0ns", .d = 0 },
@@ -1497,7 +1497,7 @@ pub fn parseInt(comptime T: type, buf: []const u8, base: u8) ParseIntError!T {
return parseWithSign(T, buf, base, .pos);
}
 
test "parseInt" {
test parseInt {
try std.testing.expect((try parseInt(i32, "-10", 10)) == -10);
try std.testing.expect((try parseInt(i32, "+10", 10)) == 10);
try std.testing.expect((try parseInt(u32, "+10", 10)) == 10);
@@ -1639,7 +1639,7 @@ pub fn parseUnsigned(comptime T: type, buf: []const u8, base: u8) ParseIntError!
return parseWithSign(T, buf, base, .pos);
}
 
test "parseUnsigned" {
test parseUnsigned {
try std.testing.expect((try parseUnsigned(u16, "050124", 10)) == 50124);
try std.testing.expect((try parseUnsigned(u16, "65535", 10)) == 65535);
try std.testing.expect((try parseUnsigned(u16, "65_535", 10)) == 65535);
@@ -1713,7 +1713,7 @@ pub fn parseIntSizeSuffix(buf: []const u8, digit_base: u8) ParseIntError!usize {
return math.mul(usize, number, multiplier);
}
 
test "parseIntSizeSuffix" {
test parseIntSizeSuffix {
try std.testing.expect(try parseIntSizeSuffix("2", 10) == 2);
try std.testing.expect(try parseIntSizeSuffix("2B", 10) == 2);
try std.testing.expect(try parseIntSizeSuffix("2kB", 10) == 2000);
@@ -1796,7 +1796,7 @@ pub fn allocPrintZ(allocator: mem.Allocator, comptime fmt: []const u8, args: any
return result[0 .. result.len - 1 :0];
}
 
test "bufPrintInt" {
test bufPrintIntToSlice {
var buffer: [100]u8 = undefined;
const buf = buffer[0..];
 
@@ -1830,7 +1830,7 @@ pub inline fn comptimePrint(comptime fmt: []const u8, args: anytype) *const [cou
}
}
 
test "comptimePrint" {
test comptimePrint {
@setEvalBranchQuota(2000);
try std.testing.expectEqual(*const [3:0]u8, @TypeOf(comptimePrint("{}", .{100})));
try std.testing.expectEqualSlices(u8, "100", comptimePrint("{}", .{100}));
@@ -2445,14 +2445,14 @@ pub fn hexToBytes(out: []u8, input: []const u8) ![]u8 {
return out[0 .. in_i / 2];
}
 
test "bytesToHex" {
test bytesToHex {
const input = "input slice";
const encoded = bytesToHex(input, .lower);
var decoded: [input.len]u8 = undefined;
try std.testing.expectEqualSlices(u8, input, try hexToBytes(&decoded, &encoded));
}
 
test "hexToBytes" {
test hexToBytes {
var buf: [32]u8 = undefined;
try expectFmt("90" ** 32, "{s}", .{fmtSliceHexUpper(try hexToBytes(&buf, "90" ** 32))});
try expectFmt("ABCD", "{s}", .{fmtSliceHexUpper(try hexToBytes(&buf, "ABCD"))});
 
lib/std/fmt/parse_float.zig added: 434, removed: 391, total 43
@@ -1,7 +1,4 @@
pub const parseFloat = @import("parse_float/parse_float.zig").parseFloat;
pub const ParseFloatError = @import("parse_float/parse_float.zig").ParseFloatError;
 
const std = @import("std");
const std = @import("../std.zig");
const math = std.math;
const testing = std.testing;
const expect = testing.expect;
@@ -9,10 +6,75 @@ const expectEqual = testing.expectEqual;
const expectError = testing.expectError;
const approxEqAbs = std.math.approxEqAbs;
const epsilon = 1e-7;
const parse = @import("parse_float/parse.zig");
const convertHex = @import("parse_float/convert_hex.zig").convertHex;
const convertFast = @import("parse_float/convert_fast.zig").convertFast;
const convertEiselLemire = @import("parse_float/convert_eisel_lemire.zig").convertEiselLemire;
const convertSlow = @import("parse_float/convert_slow.zig").convertSlow;
 
pub const ParseFloatError = error{
InvalidCharacter,
};
 
pub fn parseFloat(comptime T: type, s: []const u8) ParseFloatError!T {
if (@typeInfo(T) != .Float) {
@compileError("Cannot parse a float into a non-floating point type.");
}
 
if (T == f80) {
@compileError("TODO support parsing float to f80");
}
 
if (s.len == 0) {
return error.InvalidCharacter;
}
 
var i: usize = 0;
const negative = s[i] == '-';
if (s[i] == '-' or s[i] == '+') {
i += 1;
}
if (s.len == i) {
return error.InvalidCharacter;
}
 
const n = parse.parseNumber(T, s[i..], negative) orelse {
return parse.parseInfOrNan(T, s[i..], negative) orelse error.InvalidCharacter;
};
 
if (n.hex) {
return convertHex(T, n);
}
 
if (convertFast(T, n)) |f| {
return f;
}
 
if (T == f16 or T == f32 or T == f64) {
// If significant digits were truncated, then we can have rounding error
// only if `mantissa + 1` produces a different result. We also avoid
// redundantly using the Eisel-Lemire algorithm if it was unable to
// correctly round on the first pass.
if (convertEiselLemire(T, n.exponent, n.mantissa)) |bf| {
if (!n.many_digits) {
return bf.toFloat(T, n.negative);
}
if (convertEiselLemire(T, n.exponent, n.mantissa + 1)) |bf2| {
if (bf.eql(bf2)) {
return bf.toFloat(T, n.negative);
}
}
}
}
 
// Unable to correctly round the float using the Eisel-Lemire algorithm.
// Fallback to a slower, but always correct algorithm.
return convertSlow(T, s[i..]).toFloat(T, negative);
}
 
// See https://github.com/tiehuis/parse-number-fxx-test-data for a wider-selection of test-data.
 
test "parseFloat" {
test parseFloat {
inline for ([_]type{ f16, f32, f64, f128 }) |T| {
try testing.expectError(error.InvalidCharacter, parseFloat(T, ""));
try testing.expectError(error.InvalidCharacter, parseFloat(T, " 1"));
 
ev/null added: 434, removed: 391, total 43
@@ -1,66 +0,0 @@
const std = @import("std");
const parse = @import("parse.zig");
const convertFast = @import("convert_fast.zig").convertFast;
const convertEiselLemire = @import("convert_eisel_lemire.zig").convertEiselLemire;
const convertSlow = @import("convert_slow.zig").convertSlow;
const convertHex = @import("convert_hex.zig").convertHex;
 
pub const ParseFloatError = error{
InvalidCharacter,
};
 
pub fn parseFloat(comptime T: type, s: []const u8) ParseFloatError!T {
if (@typeInfo(T) != .Float) {
@compileError("Cannot parse a float into a non-floating point type.");
}
 
if (T == f80) {
@compileError("TODO support parsing float to f80");
}
 
if (s.len == 0) {
return error.InvalidCharacter;
}
 
var i: usize = 0;
const negative = s[i] == '-';
if (s[i] == '-' or s[i] == '+') {
i += 1;
}
if (s.len == i) {
return error.InvalidCharacter;
}
 
const n = parse.parseNumber(T, s[i..], negative) orelse {
return parse.parseInfOrNan(T, s[i..], negative) orelse error.InvalidCharacter;
};
 
if (n.hex) {
return convertHex(T, n);
}
 
if (convertFast(T, n)) |f| {
return f;
}
 
if (T == f16 or T == f32 or T == f64) {
// If significant digits were truncated, then we can have rounding error
// only if `mantissa + 1` produces a different result. We also avoid
// redundantly using the Eisel-Lemire algorithm if it was unable to
// correctly round on the first pass.
if (convertEiselLemire(T, n.exponent, n.mantissa)) |bf| {
if (!n.many_digits) {
return bf.toFloat(T, n.negative);
}
if (convertEiselLemire(T, n.exponent, n.mantissa + 1)) |bf2| {
if (bf.eql(bf2)) {
return bf.toFloat(T, n.negative);
}
}
}
}
 
// Unable to correctly round the float using the Eisel-Lemire algorithm.
// Fallback to a slower, but always correct algorithm.
return convertSlow(T, s[i..]).toFloat(T, negative);
}
 
lib/std/fs/get_app_data_dir.zig added: 434, removed: 391, total 43
@@ -61,7 +61,7 @@ pub fn getAppDataDir(allocator: mem.Allocator, appname: []const u8) GetAppDataDi
}
}
 
test "getAppDataDir" {
test getAppDataDir {
if (native_os == .wasi) return error.SkipZigTest;
 
// We can't actually validate the result
 
lib/std/fs/path.zig added: 434, removed: 391, total 43
@@ -180,7 +180,7 @@ fn testJoinMaybeZPosix(paths: []const []const u8, expected: []const u8, zero: bo
try testing.expectEqualSlices(u8, expected, if (zero) actual[0 .. actual.len - 1 :0] else actual);
}
 
test "join" {
test join {
{
const actual: []u8 = try join(testing.allocator, &[_][]const u8{});
defer testing.allocator.free(actual);
@@ -303,7 +303,7 @@ pub fn isAbsolutePosixZ(path_c: [*:0]const u8) bool {
return isAbsolutePosix(mem.sliceTo(path_c, 0));
}
 
test "isAbsoluteWindows" {
test isAbsoluteWindows {
try testIsAbsoluteWindows("", false);
try testIsAbsoluteWindows("/", true);
try testIsAbsoluteWindows("//", true);
@@ -326,7 +326,7 @@ test "isAbsoluteWindows" {
try testIsAbsoluteWindows("/usr/local", true);
}
 
test "isAbsolutePosix" {
test isAbsolutePosix {
try testIsAbsolutePosix("", false);
try testIsAbsolutePosix("/home/foo", true);
try testIsAbsolutePosix("/home/foo/..", true);
@@ -400,7 +400,7 @@ pub fn windowsParsePath(path: []const u8) WindowsPath {
return relative_path;
}
 
test "windowsParsePath" {
test windowsParsePath {
{
const parsed = windowsParsePath("//a/b");
try testing.expect(parsed.is_abs);
@@ -884,7 +884,7 @@ pub fn dirnamePosix(path: []const u8) ?[]const u8 {
return path[0..end_index];
}
 
test "dirnamePosix" {
test dirnamePosix {
try testDirnamePosix("/a/b/c", "/a/b");
try testDirnamePosix("/a/b/c///", "/a/b");
try testDirnamePosix("/a", "/");
@@ -898,7 +898,7 @@ test "dirnamePosix" {
try testDirnamePosix("a//", null);
}
 
test "dirnameWindows" {
test dirnameWindows {
try testDirnameWindows("c:\\", null);
try testDirnameWindows("c:\\foo", "c:\\");
try testDirnameWindows("c:\\foo\\", "c:\\");
@@ -1011,7 +1011,7 @@ pub fn basenameWindows(path: []const u8) []const u8 {
return path[start_index + 1 .. end_index];
}
 
test "basename" {
test basename {
try testBasename("", "");
try testBasename("/", "");
try testBasename("/dir/basename.ext", "basename.ext");
@@ -1186,7 +1186,7 @@ pub fn relativePosix(allocator: Allocator, from: []const u8, to: []const u8) ![]
return [_]u8{};
}
 
test "relative" {
test relative {
try testRelativeWindows("c:/blah\\blah", "d:/games", "D:\\games");
try testRelativeWindows("c:/aaaa/bbbb", "c:/aaaa", "..");
try testRelativeWindows("c:/aaaa/bbbb", "c:/cccc", "..\\..\\cccc");
@@ -1271,7 +1271,7 @@ fn testExtension(path: []const u8, expected: []const u8) !void {
try testing.expectEqualStrings(expected, extension(path));
}
 
test "extension" {
test extension {
try testExtension("", "");
try testExtension(".", "");
try testExtension("a.", ".");
@@ -1328,7 +1328,7 @@ fn testStem(path: []const u8, expected: []const u8) !void {
try testing.expectEqualStrings(expected, stem(path));
}
 
test "stem" {
test stem {
try testStem("hello/world/lib.tar.gz", "lib.tar");
try testStem("hello/world/lib.tar", "lib");
try testStem("hello/world/lib", "lib");
 
lib/std/io.zig added: 434, removed: 391, total 43
@@ -421,7 +421,7 @@ fn dummyWrite(context: void, data: []const u8) error{}!usize {
return data.len;
}
 
test "null_writer" {
test null_writer {
null_writer.writeAll("yay" ** 10) catch |err| switch (err) {};
}
 
 
lib/std/math.zig added: 434, removed: 391, total 43
@@ -167,26 +167,16 @@ pub fn approxEqRel(comptime T: type, x: T, y: T, tolerance: T) bool {
return @abs(x - y) <= @max(@abs(x), @abs(y)) * tolerance;
}
 
test "approxEqAbs and approxEqRel" {
test approxEqAbs {
inline for ([_]type{ f16, f32, f64, f128 }) |T| {
const eps_value = comptime floatEps(T);
const sqrt_eps_value = comptime sqrt(eps_value);
const nan_value = comptime nan(T);
const inf_value = comptime inf(T);
const min_value = comptime floatMin(T);
 
try testing.expect(approxEqAbs(T, 0.0, 0.0, eps_value));
try testing.expect(approxEqAbs(T, -0.0, -0.0, eps_value));
try testing.expect(approxEqAbs(T, 0.0, -0.0, eps_value));
try testing.expect(approxEqRel(T, 1.0, 1.0, sqrt_eps_value));
try testing.expect(!approxEqRel(T, 1.0, 0.0, sqrt_eps_value));
try testing.expect(!approxEqAbs(T, 1.0 + 2 * eps_value, 1.0, eps_value));
try testing.expect(approxEqAbs(T, 1.0 + 1 * eps_value, 1.0, eps_value));
try testing.expect(!approxEqRel(T, 1.0, nan_value, sqrt_eps_value));
try testing.expect(!approxEqRel(T, nan_value, nan_value, sqrt_eps_value));
try testing.expect(approxEqRel(T, inf_value, inf_value, sqrt_eps_value));
try testing.expect(approxEqRel(T, min_value, min_value, sqrt_eps_value));
try testing.expect(approxEqRel(T, -min_value, -min_value, sqrt_eps_value));
try testing.expect(approxEqAbs(T, min_value, 0.0, eps_value * 2));
try testing.expect(approxEqAbs(T, -min_value, 0.0, eps_value * 2));
}
@@ -198,18 +188,46 @@ test "approxEqAbs and approxEqRel" {
// possible epsilon value like we do in the tests above. In the same vein, we
// also can't represent a max/min, `NaN` or `Inf` values.
const eps_value = 1e-4;
const sqrt_eps_value = sqrt(eps_value);
 
try testing.expect(approxEqAbs(comptime_float, 0.0, 0.0, eps_value));
try testing.expect(approxEqAbs(comptime_float, -0.0, -0.0, eps_value));
try testing.expect(approxEqAbs(comptime_float, 0.0, -0.0, eps_value));
try testing.expect(approxEqRel(comptime_float, 1.0, 1.0, sqrt_eps_value));
try testing.expect(!approxEqRel(comptime_float, 1.0, 0.0, sqrt_eps_value));
try testing.expect(!approxEqAbs(comptime_float, 1.0 + 2 * eps_value, 1.0, eps_value));
try testing.expect(approxEqAbs(comptime_float, 1.0 + 1 * eps_value, 1.0, eps_value));
}
}
 
test approxEqRel {
inline for ([_]type{ f16, f32, f64, f128 }) |T| {
const eps_value = comptime floatEps(T);
const sqrt_eps_value = comptime sqrt(eps_value);
const nan_value = comptime nan(T);
const inf_value = comptime inf(T);
const min_value = comptime floatMin(T);
 
try testing.expect(approxEqRel(T, 1.0, 1.0, sqrt_eps_value));
try testing.expect(!approxEqRel(T, 1.0, 0.0, sqrt_eps_value));
try testing.expect(!approxEqRel(T, 1.0, nan_value, sqrt_eps_value));
try testing.expect(!approxEqRel(T, nan_value, nan_value, sqrt_eps_value));
try testing.expect(approxEqRel(T, inf_value, inf_value, sqrt_eps_value));
try testing.expect(approxEqRel(T, min_value, min_value, sqrt_eps_value));
try testing.expect(approxEqRel(T, -min_value, -min_value, sqrt_eps_value));
}
 
comptime {
// `comptime_float` is guaranteed to have the same precision and operations of
// the largest other floating point type, which is f128 but it doesn't have a
// defined layout so we can't rely on `@bitCast` to construct the smallest
// possible epsilon value like we do in the tests above. In the same vein, we
// also can't represent a max/min, `NaN` or `Inf` values.
const eps_value = 1e-4;
const sqrt_eps_value = sqrt(eps_value);
 
try testing.expect(approxEqRel(comptime_float, 1.0, 1.0, sqrt_eps_value));
try testing.expect(!approxEqRel(comptime_float, 1.0, 0.0, sqrt_eps_value));
}
}
 
pub const doNotOptimizeAway = @compileError("Deprecated: use `std.mem.doNotOptimizeAway` instead");
 
pub fn raiseInvalid() void {
@@ -310,7 +328,7 @@ pub fn radiansToDegrees(ang: anytype) if (@TypeOf(ang) == comptime_int) comptime
@compileError("Input must be float or a comptime number, or a vector of floats.");
}
 
test "radiansToDegrees" {
test radiansToDegrees {
const zero: f32 = 0;
const half_pi: f32 = pi / 2.0;
const neg_quart_pi: f32 = -pi / 4.0;
@@ -345,7 +363,7 @@ pub fn degreesToRadians(ang: anytype) if (@TypeOf(ang) == comptime_int) comptime
@compileError("Input must be float or a comptime number, or a vector of floats.");
}
 
test "degreesToRadians" {
test degreesToRadians {
const ninety: f32 = 90;
const neg_two_seventy: f32 = -270;
const three_sixty: f32 = 360;
@@ -506,7 +524,7 @@ pub fn wrap(x: anytype, r: anytype) @TypeOf(x) {
},
}
}
test "wrap" {
test wrap {
// Within range
try testing.expect(wrap(@as(i32, -75), @as(i32, 180)) == -75);
try testing.expect(wrap(@as(i32, -75), @as(i32, -180)) == -75);
@@ -543,8 +561,7 @@ test "wrap" {
var i: i32 = 1;
_ = &i;
try testing.expect(wrap(i, 10) == 1);
}
test wrap {
 
const limit: i32 = 180;
// Within range
try testing.expect(wrap(@as(i32, -75), limit) == -75);
@@ -569,7 +586,7 @@ pub fn clamp(val: anytype, lower: anytype, upper: anytype) @TypeOf(val, lower, u
assert(lower <= upper);
return @max(lower, @min(val, upper));
}
test "clamp" {
test clamp {
// Within range
try testing.expect(std.math.clamp(@as(i32, -1), @as(i32, -4), @as(i32, 7)) == -1);
// Below
@@ -650,7 +667,7 @@ pub fn shl(comptime T: type, a: T, shift_amt: anytype) T {
return a << casted_shift_amt;
}
 
test "shl" {
test shl {
if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .aarch64) {
// https://github.com/ziglang/zig/issues/12012
return error.SkipZigTest;
@@ -695,7 +712,7 @@ pub fn shr(comptime T: type, a: T, shift_amt: anytype) T {
return a >> casted_shift_amt;
}
 
test "shr" {
test shr {
if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .aarch64) {
// https://github.com/ziglang/zig/issues/12012
return error.SkipZigTest;
@@ -741,7 +758,7 @@ pub fn rotr(comptime T: type, x: T, r: anytype) T {
}
}
 
test "rotr" {
test rotr {
if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .aarch64) {
// https://github.com/ziglang/zig/issues/12012
return error.SkipZigTest;
@@ -787,7 +804,7 @@ pub fn rotl(comptime T: type, x: T, r: anytype) T {
}
}
 
test "rotl" {
test rotl {
if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .aarch64) {
// https://github.com/ziglang/zig/issues/12012
return error.SkipZigTest;
@@ -850,7 +867,7 @@ pub fn IntFittingRange(comptime from: comptime_int, comptime to: comptime_int) t
return std.meta.Int(signedness, magnitude_bits);
}
 
test "IntFittingRange" {
test IntFittingRange {
try testing.expect(IntFittingRange(0, 0) == u0);
try testing.expect(IntFittingRange(0, 1) == u1);
try testing.expect(IntFittingRange(0, 2) == u2);
@@ -918,7 +935,7 @@ pub fn divTrunc(comptime T: type, numerator: T, denominator: T) !T {
return @divTrunc(numerator, denominator);
}
 
test "divTrunc" {
test divTrunc {
try testDivTrunc();
try comptime testDivTrunc();
}
@@ -942,7 +959,7 @@ pub fn divFloor(comptime T: type, numerator: T, denominator: T) !T {
return @divFloor(numerator, denominator);
}
 
test "divFloor" {
test divFloor {
try testDivFloor();
try comptime testDivFloor();
}
@@ -979,7 +996,7 @@ pub fn divCeil(comptime T: type, numerator: T, denominator: T) !T {
}
}
 
test "divCeil" {
test divCeil {
try testDivCeil();
try comptime testDivCeil();
}
@@ -1023,7 +1040,7 @@ pub fn divExact(comptime T: type, numerator: T, denominator: T) !T {
return result;
}
 
test "divExact" {
test divExact {
try testDivExact();
try comptime testDivExact();
}
@@ -1049,7 +1066,7 @@ pub fn mod(comptime T: type, numerator: T, denominator: T) !T {
return @mod(numerator, denominator);
}
 
test "mod" {
test mod {
try testMod();
try comptime testMod();
}
@@ -1075,7 +1092,7 @@ pub fn rem(comptime T: type, numerator: T, denominator: T) !T {
return @rem(numerator, denominator);
}
 
test "rem" {
test rem {
try testRem();
try comptime testRem();
}
@@ -1104,7 +1121,7 @@ pub fn negateCast(x: anytype) !std.meta.Int(.signed, @bitSizeOf(@TypeOf(x))) {
return -@as(int, @intCast(x));
}
 
test "negateCast" {
test negateCast {
try testing.expect((negateCast(@as(u32, 999)) catch unreachable) == -999);
try testing.expect(@TypeOf(negateCast(@as(u32, 999)) catch unreachable) == i32);
 
@@ -1129,7 +1146,7 @@ pub fn cast(comptime T: type, x: anytype) ?T {
}
}
 
test "cast" {
test cast {
try testing.expect(cast(u8, 300) == null);
try testing.expect(cast(u8, @as(u32, 300)) == null);
try testing.expect(cast(i8, -200) == null);
@@ -1188,7 +1205,7 @@ pub fn ByteAlignedInt(comptime T: type) type {
return extended_type;
}
 
test "ByteAlignedInt" {
test ByteAlignedInt {
try testing.expect(ByteAlignedInt(u0) == u0);
try testing.expect(ByteAlignedInt(i0) == i0);
try testing.expect(ByteAlignedInt(u3) == u8);
@@ -1226,7 +1243,7 @@ pub fn floorPowerOfTwo(comptime T: type, value: T) T {
return @as(T, 1) << log2_int(uT, @as(uT, @intCast(value)));
}
 
test "floorPowerOfTwo" {
test floorPowerOfTwo {
try testFloorPowerOfTwo();
try comptime testFloorPowerOfTwo();
}
@@ -1288,7 +1305,7 @@ pub fn ceilPowerOfTwoAssert(comptime T: type, value: T) T {
return ceilPowerOfTwo(T, value) catch unreachable;
}
 
test "ceilPowerOfTwoPromote" {
test ceilPowerOfTwoPromote {
try testCeilPowerOfTwoPromote();
try comptime testCeilPowerOfTwoPromote();
}
@@ -1305,7 +1322,7 @@ fn testCeilPowerOfTwoPromote() !void {
try testing.expectEqual(@as(u5, 16), ceilPowerOfTwoPromote(u4, 9));
}
 
test "ceilPowerOfTwo" {
test ceilPowerOfTwo {
try testCeilPowerOfTwo();
try comptime testCeilPowerOfTwo();
}
@@ -1398,7 +1415,7 @@ pub fn lossyCast(comptime T: type, value: anytype) T {
}
}
 
test "lossyCast" {
test lossyCast {
try testing.expect(lossyCast(i16, 70000.0) == @as(i16, 32767));
try testing.expect(lossyCast(u32, @as(i16, -255)) == @as(u32, 0));
try testing.expect(lossyCast(i9, @as(u32, 200)) == @as(i9, 200));
@@ -1417,7 +1434,7 @@ pub fn lerp(a: anytype, b: anytype, t: anytype) @TypeOf(a, b, t) {
return @mulAdd(Type, b - a, t, a);
}
 
test "lerp" {
test lerp {
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/17884
if (builtin.zig_backend == .stage2_x86_64 and
!comptime std.Target.x86.featureSetHas(builtin.cpu.features, .fma)) return error.SkipZigTest;
@@ -1483,7 +1500,7 @@ pub fn minInt(comptime T: type) comptime_int {
return -(1 << (bit_count - 1));
}
 
test "minInt and maxInt" {
test maxInt {
try testing.expect(maxInt(u0) == 0);
try testing.expect(maxInt(u1) == 1);
try testing.expect(maxInt(u8) == 255);
@@ -1500,7 +1517,9 @@ test "minInt and maxInt" {
try testing.expect(maxInt(i63) == 4611686018427387903);
try testing.expect(maxInt(i64) == 9223372036854775807);
try testing.expect(maxInt(i128) == 170141183460469231731687303715884105727);
}
 
test minInt {
try testing.expect(minInt(u0) == 0);
try testing.expect(minInt(u1) == 0);
try testing.expect(minInt(u8) == 0);
@@ -1538,7 +1557,7 @@ pub fn mulWide(comptime T: type, a: T, b: T) std.meta.Int(
return @as(ResultInt, a) * @as(ResultInt, b);
}
 
test "mulWide" {
test mulWide {
try testing.expect(mulWide(u8, 5, 5) == 25);
try testing.expect(mulWide(i8, 5, -5) == -25);
try testing.expect(mulWide(u8, 100, 100) == 10000);
@@ -1563,6 +1582,12 @@ pub const Order = enum {
};
}
 
test invert {
try testing.expect(Order.invert(order(0, 0)) == .eq);
try testing.expect(Order.invert(order(1, 0)) == .lt);
try testing.expect(Order.invert(order(-1, 0)) == .gt);
}
 
pub fn compare(self: Order, op: CompareOperator) bool {
return switch (self) {
.lt => switch (op) {
@@ -1591,6 +1616,18 @@ pub const Order = enum {
},
};
}
 
// https://github.com/ziglang/zig/issues/19295
test "compare" {
try testing.expect(order(-1, 0).compare(.lt));
try testing.expect(order(-1, 0).compare(.lte));
try testing.expect(order(0, 0).compare(.lte));
try testing.expect(order(0, 0).compare(.eq));
try testing.expect(order(0, 0).compare(.gte));
try testing.expect(order(1, 0).compare(.gte));
try testing.expect(order(1, 0).compare(.gt));
try testing.expect(order(1, 0).compare(.neq));
}
};
 
/// Given two numbers, this function returns the order they are with respect to each other.
@@ -1633,6 +1670,15 @@ pub const CompareOperator = enum {
.neq => .neq,
};
}
 
test reverse {
inline for (@typeInfo(CompareOperator).Enum.fields) |op_field| {
const op = @as(CompareOperator, @enumFromInt(op_field.value));
try testing.expect(compare(2, op, 3) == compare(3, op.reverse(), 2));
try testing.expect(compare(3, op, 3) == compare(3, op.reverse(), 3));
try testing.expect(compare(4, op, 3) == compare(3, op.reverse(), 4));
}
}
};
 
/// This function does the same thing as comparison operators, however the
@@ -1649,7 +1695,7 @@ pub fn compare(a: anytype, op: CompareOperator, b: anytype) bool {
};
}
 
test "compare between signed and unsigned" {
test compare {
try testing.expect(compare(@as(i8, -1), .lt, @as(u8, 255)));
try testing.expect(compare(@as(i8, 2), .gt, @as(u8, 1)));
try testing.expect(!compare(@as(i8, -1), .gte, @as(u8, 255)));
@@ -1669,38 +1715,12 @@ test "compare between signed and unsigned" {
try testing.expect(compare(@as(u8, 1), .eq, @as(u8, 1)));
}
 
test "order" {
test order {
try testing.expect(order(0, 0) == .eq);
try testing.expect(order(1, 0) == .gt);
try testing.expect(order(-1, 0) == .lt);
}
 
test "order.invert" {
try testing.expect(Order.invert(order(0, 0)) == .eq);
try testing.expect(Order.invert(order(1, 0)) == .lt);
try testing.expect(Order.invert(order(-1, 0)) == .gt);
}
 
test "order.compare" {
try testing.expect(order(-1, 0).compare(.lt));
try testing.expect(order(-1, 0).compare(.lte));
try testing.expect(order(0, 0).compare(.lte));
try testing.expect(order(0, 0).compare(.eq));
try testing.expect(order(0, 0).compare(.gte));
try testing.expect(order(1, 0).compare(.gte));
try testing.expect(order(1, 0).compare(.gt));
try testing.expect(order(1, 0).compare(.neq));
}
 
test "compare.reverse" {
inline for (@typeInfo(CompareOperator).Enum.fields) |op_field| {
const op = @as(CompareOperator, @enumFromInt(op_field.value));
try testing.expect(compare(2, op, 3) == compare(3, op.reverse(), 2));
try testing.expect(compare(3, op, 3) == compare(3, op.reverse(), 3));
try testing.expect(compare(4, op, 3) == compare(3, op.reverse(), 4));
}
}
 
/// Returns a mask of all ones if value is true,
/// and a mask of all zeroes if value is false.
/// Compiles to one instruction for register sized integers.
@@ -1722,7 +1742,7 @@ pub inline fn boolMask(comptime MaskInt: type, value: bool) MaskInt {
return -%@as(MaskInt, @intCast(@intFromBool(value)));
}
 
test "boolMask" {
test boolMask {
const runTest = struct {
fn runTest() !void {
try testing.expectEqual(@as(u1, 0), boolMask(u1, false));
@@ -1870,7 +1890,7 @@ fn testSign() !void {
try std.testing.expectEqual(0.0, sign(0.0));
}
 
test "sign" {
test sign {
if (builtin.zig_backend == .stage2_llvm) {
// https://github.com/ziglang/zig/issues/12012
return error.SkipZigTest;
 
lib/std/mem.zig added: 434, removed: 391, total 43
@@ -306,7 +306,7 @@ pub fn zeroes(comptime T: type) T {
}
}
 
test "zeroes" {
test zeroes {
const C_struct = extern struct {
x: u32,
y: u32 align(128),
@@ -475,7 +475,7 @@ pub fn zeroInit(comptime T: type, init: anytype) T {
}
}
 
test "zeroInit" {
test zeroInit {
const I = struct {
d: f64,
};
@@ -606,16 +606,19 @@ pub fn orderZ(comptime T: type, lhs: [*:0]const T, rhs: [*:0]const T) math.Order
return math.order(lhs[i], rhs[i]);
}
 
test "order and orderZ" {
test order {
try testing.expect(order(u8, "abcd", "bee") == .lt);
try testing.expect(orderZ(u8, "abcd", "bee") == .lt);
try testing.expect(order(u8, "abc", "abc") == .eq);
try testing.expect(orderZ(u8, "abc", "abc") == .eq);
try testing.expect(order(u8, "abc", "abc0") == .lt);
try testing.expect(orderZ(u8, "abc", "abc0") == .lt);
try testing.expect(order(u8, "", "") == .eq);
try testing.expect(orderZ(u8, "", "") == .eq);
try testing.expect(order(u8, "", "a") == .lt);
}
 
test orderZ {
try testing.expect(orderZ(u8, "abcd", "bee") == .lt);
try testing.expect(orderZ(u8, "abc", "abc") == .eq);
try testing.expect(orderZ(u8, "abc", "abc0") == .lt);
try testing.expect(orderZ(u8, "", "") == .eq);
try testing.expect(orderZ(u8, "", "a") == .lt);
}
 
@@ -624,7 +627,7 @@ pub fn lessThan(comptime T: type, lhs: []const T, rhs: []const T) bool {
return order(T, lhs, rhs) == .lt;
}
 
test "lessThan" {
test lessThan {
try testing.expect(lessThan(u8, "abcd", "bee"));
try testing.expect(!lessThan(u8, "abc", "abc"));
try testing.expect(lessThan(u8, "abc", "abc0"));
@@ -726,7 +729,7 @@ pub fn indexOfDiff(comptime T: type, a: []const T, b: []const T) ?usize {
return if (a.len == b.len) null else shortest;
}
 
test "indexOfDiff" {
test indexOfDiff {
try testing.expectEqual(indexOfDiff(u8, "one", "one"), null);
try testing.expectEqual(indexOfDiff(u8, "one two", "one"), 3);
try testing.expectEqual(indexOfDiff(u8, "one", "one two"), 3);
@@ -759,7 +762,7 @@ fn Span(comptime T: type) type {
@compileError("invalid type given to std.mem.span: " ++ @typeName(T));
}
 
test "Span" {
test Span {
try testing.expect(Span([*:1]u16) == [:1]u16);
try testing.expect(Span(?[*:1]u16) == ?[:1]u16);
try testing.expect(Span([*:1]const u8) == [:1]const u8);
@@ -793,7 +796,7 @@ pub fn span(ptr: anytype) Span(@TypeOf(ptr)) {
}
}
 
test "span" {
test span {
var array: [5]u16 = [_]u16{ 1, 2, 3, 4, 5 };
const ptr = @as([*:3]u16, array[0..2 :3]);
try testing.expect(eql(u16, span(ptr), &[_]u16{ 1, 2 }));
@@ -877,7 +880,7 @@ pub fn sliceTo(ptr: anytype, comptime end: std.meta.Elem(@TypeOf(ptr))) SliceTo(
}
}
 
test "sliceTo" {
test sliceTo {
try testing.expectEqualSlices(u8, "aoeu", sliceTo("aoeu", 0));
 
{
@@ -963,7 +966,7 @@ fn lenSliceTo(ptr: anytype, comptime end: std.meta.Elem(@TypeOf(ptr))) usize {
@compileError("invalid type given to std.mem.sliceTo: " ++ @typeName(@TypeOf(ptr)));
}
 
test "lenSliceTo" {
test lenSliceTo {
try testing.expect(lenSliceTo("aoeu", 0) == 4);
 
{
@@ -1018,7 +1021,7 @@ pub fn len(value: anytype) usize {
}
}
 
test "len" {
test len {
var array: [5]u16 = [_]u16{ 1, 2, 0, 4, 5 };
const ptr = @as([*:4]u16, array[0..3 :4]);
try testing.expect(len(ptr) == 3);
@@ -1035,6 +1038,7 @@ pub fn indexOfSentinel(comptime T: type, comptime sentinel: T, p: [*:sentinel]co
var i: usize = 0;
 
if (backend_supports_vectors and
!std.debug.inValgrind() and // https://github.com/ziglang/zig/issues/17717
!@inComptime() and
(@typeInfo(T) == .Int or @typeInfo(T) == .Float) and std.math.isPowerOfTwo(@bitSizeOf(T)))
{
@@ -1157,7 +1161,7 @@ pub fn trim(comptime T: type, slice: []const T, values_to_strip: []const T) []co
return slice[begin..end];
}
 
test "trim" {
test trim {
try testing.expectEqualSlices(u8, "foo\n ", trimLeft(u8, " foo\n ", " \n"));
try testing.expectEqualSlices(u8, " foo", trimRight(u8, " foo\n ", " \n"));
try testing.expectEqualSlices(u8, "foo", trim(u8, " foo\n ", " \n"));
@@ -1184,6 +1188,7 @@ pub fn indexOfScalarPos(comptime T: type, slice: []const T, start_index: usize,
 
var i: usize = start_index;
if (backend_supports_vectors and
!std.debug.inValgrind() and // https://github.com/ziglang/zig/issues/17717
!@inComptime() and
(@typeInfo(T) == .Int or @typeInfo(T) == .Float) and std.math.isPowerOfTwo(@bitSizeOf(T)))
{
@@ -1240,7 +1245,7 @@ pub fn indexOfScalarPos(comptime T: type, slice: []const T, start_index: usize,
return null;
}
 
test "indexOfScalarPos" {
test indexOfScalarPos {
const Types = [_]type{ u8, u16, u32, u64 };
 
inline for (Types) |T| {
@@ -1316,7 +1321,7 @@ pub fn indexOfNonePos(comptime T: type, slice: []const T, start_index: usize, va
return null;
}
 
test "indexOfNone" {
test indexOfNone {
try testing.expect(indexOfNone(u8, "abc123", "123").? == 0);
try testing.expect(lastIndexOfNone(u8, "abc123", "123").? == 2);
try testing.expect(indexOfNone(u8, "123abc", "123").? == 3);
@@ -1460,7 +1465,7 @@ pub fn indexOfPos(comptime T: type, haystack: []const T, start_index: usize, nee
return null;
}
 
test "indexOf" {
test indexOf {
try testing.expect(indexOf(u8, "one two three four five six seven eight nine ten eleven", "three four").? == 8);
try testing.expect(lastIndexOf(u8, "one two three four five six seven eight nine ten eleven", "three four").? == 8);
try testing.expect(indexOf(u8, "one two three four five six seven eight nine ten eleven", "two two") == null);
@@ -1533,7 +1538,7 @@ pub fn count(comptime T: type, haystack: []const T, needle: []const T) usize {
return found;
}
 
test "count" {
test count {
try testing.expect(count(u8, "", "h") == 0);
try testing.expect(count(u8, "h", "h") == 1);
try testing.expect(count(u8, "hh", "h") == 2);
@@ -1565,7 +1570,7 @@ pub fn containsAtLeast(comptime T: type, haystack: []const T, expected_count: us
return false;
}
 
test "containsAtLeast" {
test containsAtLeast {
try testing.expect(containsAtLeast(u8, "aa", 0, "a"));
try testing.expect(containsAtLeast(u8, "aa", 1, "a"));
try testing.expect(containsAtLeast(u8, "aa", 2, "a"));
@@ -1698,6 +1703,9 @@ test readInt {
 
try testing.expect(readInt(i16, &[_]u8{ 0xff, 0xfd }, .big) == -3);
try testing.expect(readInt(i16, &[_]u8{ 0xfc, 0xff }, .little) == -4);
 
try moreReadIntTests();
try comptime moreReadIntTests();
}
 
fn readPackedIntLittle(comptime T: type, bytes: []const u8, bit_offset: usize) T {
@@ -2027,7 +2035,7 @@ pub fn byteSwapAllFields(comptime S: type, ptr: *S) void {
}
}
 
test "byteSwapAllFields" {
test byteSwapAllFields {
const T = extern struct {
f0: u8,
f1: u16,
@@ -2136,7 +2144,7 @@ pub fn tokenizeScalar(comptime T: type, buffer: []const T, delimiter: T) TokenIt
};
}
 
test "tokenizeScalar" {
test tokenizeScalar {
var it = tokenizeScalar(u8, " abc def ghi ", ' ');
try testing.expect(eql(u8, it.next().?, "abc"));
try testing.expect(eql(u8, it.peek().?, "def"));
@@ -2177,7 +2185,7 @@ test "tokenizeScalar" {
try testing.expect(it16.next() == null);
}
 
test "tokenizeAny" {
test tokenizeAny {
var it = tokenizeAny(u8, "a|b,c/d e", " /,|");
try testing.expect(eql(u8, it.next().?, "a"));
try testing.expect(eql(u8, it.peek().?, "b"));
@@ -2205,7 +2213,7 @@ test "tokenizeAny" {
try testing.expect(it16.next() == null);
}
 
test "tokenizeSequence" {
test tokenizeSequence {
var it = tokenizeSequence(u8, "a<>b<><>c><>d><", "<>");
try testing.expectEqualStrings("a", it.next().?);
try testing.expectEqualStrings("b", it.peek().?);
@@ -2334,7 +2342,7 @@ pub fn splitScalar(comptime T: type, buffer: []const T, delimiter: T) SplitItera
};
}
 
test "splitScalar" {
test splitScalar {
var it = splitScalar(u8, "abc|def||ghi", '|');
try testing.expectEqualSlices(u8, it.rest(), "abc|def||ghi");
try testing.expectEqualSlices(u8, it.first(), "abc");
@@ -2377,7 +2385,7 @@ test "splitScalar" {
try testing.expect(it16.next() == null);
}
 
test "splitSequence" {
test splitSequence {
var it = splitSequence(u8, "a, b ,, c, d, e", ", ");
try testing.expectEqualSlices(u8, it.first(), "a");
try testing.expectEqualSlices(u8, it.rest(), "b ,, c, d, e");
@@ -2400,7 +2408,7 @@ test "splitSequence" {
try testing.expect(it16.next() == null);
}
 
test "splitAny" {
test splitAny {
var it = splitAny(u8, "a,b, c d e", ", ");
try testing.expectEqualSlices(u8, it.first(), "a");
try testing.expectEqualSlices(u8, it.rest(), "b, c d e");
@@ -2536,7 +2544,7 @@ pub fn splitBackwardsScalar(comptime T: type, buffer: []const T, delimiter: T) S
};
}
 
test "splitBackwardsScalar" {
test splitBackwardsScalar {
var it = splitBackwardsScalar(u8, "abc|def||ghi", '|');
try testing.expectEqualSlices(u8, it.rest(), "abc|def||ghi");
try testing.expectEqualSlices(u8, it.first(), "ghi");
@@ -2575,7 +2583,7 @@ test "splitBackwardsScalar" {
try testing.expect(it16.next() == null);
}
 
test "splitBackwardsSequence" {
test splitBackwardsSequence {
var it = splitBackwardsSequence(u8, "a, b ,, c, d, e", ", ");
try testing.expectEqualSlices(u8, it.rest(), "a, b ,, c, d, e");
try testing.expectEqualSlices(u8, it.first(), "e");
@@ -2608,7 +2616,7 @@ test "splitBackwardsSequence" {
try testing.expect(it16.next() == null);
}
 
test "splitBackwardsAny" {
test splitBackwardsAny {
var it = splitBackwardsAny(u8, "a,b, c d e", ", ");
try testing.expectEqualSlices(u8, it.rest(), "a,b, c d e");
try testing.expectEqualSlices(u8, it.first(), "e");
@@ -2715,7 +2723,7 @@ pub fn window(comptime T: type, buffer: []const T, size: usize, advance: usize)
};
}
 
test "window" {
test window {
{
// moving average size 3
var it = window(u8, "abcdefg", 3, 1);
@@ -2841,7 +2849,7 @@ pub fn startsWith(comptime T: type, haystack: []const T, needle: []const T) bool
return if (needle.len > haystack.len) false else eql(T, haystack[0..needle.len], needle);
}
 
test "startsWith" {
test startsWith {
try testing.expect(startsWith(u8, "Bob", "Bo"));
try testing.expect(!startsWith(u8, "Needle in haystack", "haystack"));
}
@@ -2850,7 +2858,7 @@ pub fn endsWith(comptime T: type, haystack: []const T, needle: []const T) bool {
return if (needle.len > haystack.len) false else eql(T, haystack[haystack.len - needle.len ..], needle);
}
 
test "endsWith" {
test endsWith {
try testing.expect(endsWith(u8, "Needle in haystack", "haystack"));
try testing.expect(!endsWith(u8, "Bob", "Bo"));
}
@@ -3086,7 +3094,7 @@ fn joinMaybeZ(allocator: Allocator, separator: []const u8, slices: []const []con
return buf;
}
 
test "join" {
test join {
{
const str = try join(testing.allocator, ",", &[_][]const u8{});
defer testing.allocator.free(str);
@@ -3109,7 +3117,7 @@ test "join" {
}
}
 
test "joinZ" {
test joinZ {
{
const str = try joinZ(testing.allocator, ",", &[_][]const u8{});
defer testing.allocator.free(str);
@@ -3181,7 +3189,7 @@ pub fn concatMaybeSentinel(allocator: Allocator, comptime T: type, slices: []con
return buf;
}
 
test "concat" {
test concat {
{
const str = try concat(testing.allocator, u8, &[_][]const u8{ "abc", "def", "ghi" });
defer testing.allocator.free(str);
@@ -3219,17 +3227,13 @@ test "concat" {
}
}
 
test "testStringEquality" {
test eql {
try testing.expect(eql(u8, "abcd", "abcd"));
try testing.expect(!eql(u8, "abcdef", "abZdef"));
try testing.expect(!eql(u8, "abcdefg", "abcdef"));
}
 
test "testReadInt" {
try testReadIntImpl();
try comptime testReadIntImpl();
}
fn testReadIntImpl() !void {
fn moreReadIntTests() !void {
{
const bytes = [_]u8{
0x12,
@@ -3287,7 +3291,7 @@ pub fn min(comptime T: type, slice: []const T) T {
return best;
}
 
test "min" {
test min {
try testing.expectEqual(min(u8, "abcdefg"), 'a');
try testing.expectEqual(min(u8, "bcdefga"), 'a');
try testing.expectEqual(min(u8, "a"), 'a');
@@ -3304,7 +3308,7 @@ pub fn max(comptime T: type, slice: []const T) T {
return best;
}
 
test "max" {
test max {
try testing.expectEqual(max(u8, "abcdefg"), 'g');
try testing.expectEqual(max(u8, "gabcdef"), 'g');
try testing.expectEqual(max(u8, "g"), 'g');
@@ -3357,7 +3361,7 @@ pub fn indexOfMin(comptime T: type, slice: []const T) usize {
return index;
}
 
test "indexOfMin" {
test indexOfMin {
try testing.expectEqual(indexOfMin(u8, "abcdefg"), 0);
try testing.expectEqual(indexOfMin(u8, "bcdefga"), 6);
try testing.expectEqual(indexOfMin(u8, "a"), 0);
@@ -3378,7 +3382,7 @@ pub fn indexOfMax(comptime T: type, slice: []const T) usize {
return index;
}
 
test "indexOfMax" {
test indexOfMax {
try testing.expectEqual(indexOfMax(u8, "abcdefg"), 6);
try testing.expectEqual(indexOfMax(u8, "gabcdef"), 0);
try testing.expectEqual(indexOfMax(u8, "a"), 0);
@@ -3406,7 +3410,7 @@ pub fn indexOfMinMax(comptime T: type, slice: []const T) struct { usize, usize }
return .{ minIdx, maxIdx };
}
 
test "indexOfMinMax" {
test indexOfMinMax {
try testing.expectEqual(.{ 0, 6 }, indexOfMinMax(u8, "abcdefg"));
try testing.expectEqual(.{ 1, 0 }, indexOfMinMax(u8, "gabcdef"));
try testing.expectEqual(.{ 0, 0 }, indexOfMinMax(u8, "a"));
@@ -3427,7 +3431,7 @@ pub fn reverse(comptime T: type, items: []T) void {
}
}
 
test "reverse" {
test reverse {
var arr = [_]i32{ 5, 3, 1, 2, 4 };
reverse(i32, arr[0..]);
 
@@ -3488,7 +3492,7 @@ pub fn reverseIterator(slice: anytype) ReverseIterator(@TypeOf(slice)) {
return .{ .ptr = slice.ptr, .index = slice.len };
}
 
test "reverseIterator" {
test reverseIterator {
{
var it = reverseIterator("abc");
try testing.expectEqual(@as(?u8, 'c'), it.next());
@@ -3546,7 +3550,7 @@ pub fn rotate(comptime T: type, items: []T, amount: usize) void {
reverse(T, items);
}
 
test "rotate" {
test rotate {
var arr = [_]i32{ 5, 3, 1, 2, 4 };
rotate(i32, arr[0..], 2);
 
@@ -3580,7 +3584,7 @@ pub fn replace(comptime T: type, input: []const T, needle: []const T, replacemen
return replacements;
}
 
test "replace" {
test replace {
var output: [29]u8 = undefined;
var replacements = replace(u8, "All your base are belong to us", "base", "Zig", output[0..]);
var expected: []const u8 = "All your Zig are belong to us";
@@ -3643,7 +3647,7 @@ fn testCollapseRepeats(str: []const u8, elem: u8, expected: []const u8) !void {
defer std.testing.allocator.free(mutable);
try testing.expect(std.mem.eql(u8, collapseRepeats(u8, mutable, elem), expected));
}
test "collapseRepeats" {
test collapseRepeats {
try testCollapseRepeats("", '/', "");
try testCollapseRepeats("a", '/', "a");
try testCollapseRepeats("/", '/', "/");
@@ -3677,7 +3681,7 @@ pub fn replacementSize(comptime T: type, input: []const T, needle: []const T, re
return size;
}
 
test "replacementSize" {
test replacementSize {
try testing.expect(replacementSize(u8, "All your base are belong to us", "base", "Zig") == 29);
try testing.expect(replacementSize(u8, "Favor reading code over writing code.", "code", "") == 29);
try testing.expect(replacementSize(u8, "Only one obvious way to do things.", "things.", "things in Zig.") == 41);
@@ -3697,7 +3701,7 @@ pub fn replaceOwned(comptime T: type, allocator: Allocator, input: []const T, ne
return output;
}
 
test "replaceOwned" {
test replaceOwned {
const gpa = std.testing.allocator;
 
const base_replace = replaceOwned(u8, gpa, "All your base are belong to us", "base", "Zig") catch @panic("out of memory");
@@ -3801,7 +3805,7 @@ pub fn alignPointer(ptr: anytype, align_to: usize) ?@TypeOf(ptr) {
return @alignCast(ptr + adjust_off);
}
 
test "alignPointer" {
test alignPointer {
const S = struct {
fn checkAlign(comptime T: type, base: usize, align_to: usize, expected: usize) !void {
const ptr: T = @ptrFromInt(base);
@@ -3850,7 +3854,7 @@ pub fn asBytes(ptr: anytype) AsBytesReturnType(@TypeOf(ptr)) {
return @ptrCast(@alignCast(ptr));
}
 
test "asBytes" {
test asBytes {
const deadbeef = @as(u32, 0xDEADBEEF);
const deadbeef_bytes = switch (native_endian) {
.big => "\xDE\xAD\xBE\xEF",
@@ -3910,7 +3914,7 @@ pub fn toBytes(value: anytype) [@sizeOf(@TypeOf(value))]u8 {
return asBytes(&value).*;
}
 
test "toBytes" {
test toBytes {
var my_bytes = toBytes(@as(u32, 0x12345678));
switch (native_endian) {
.big => try testing.expect(eql(u8, &my_bytes, "\x12\x34\x56\x78")),
@@ -3934,7 +3938,7 @@ pub fn bytesAsValue(comptime T: type, bytes: anytype) BytesAsValueReturnType(T,
return @ptrCast(bytes);
}
 
test "bytesAsValue" {
test bytesAsValue {
const deadbeef = @as(u32, 0xDEADBEEF);
const deadbeef_bytes = switch (native_endian) {
.big => "\xDE\xAD\xBE\xEF",
@@ -3993,7 +3997,7 @@ test "bytesAsValue preserves pointer attributes" {
pub fn bytesToValue(comptime T: type, bytes: anytype) T {
return bytesAsValue(T, bytes).*;
}
test "bytesToValue" {
test bytesToValue {
const deadbeef_bytes = switch (native_endian) {
.big => "\xDE\xAD\xBE\xEF",
.little => "\xEF\xBE\xAD\xDE",
@@ -4021,7 +4025,7 @@ pub fn bytesAsSlice(comptime T: type, bytes: anytype) BytesAsSliceReturnType(T,
return @as(cast_target, @ptrCast(bytes))[0..@divExact(bytes.len, @sizeOf(T))];
}
 
test "bytesAsSlice" {
test bytesAsSlice {
{
const bytes = [_]u8{ 0xDE, 0xAD, 0xBE, 0xEF };
const slice = bytesAsSlice(u16, bytes[0..]);
@@ -4110,7 +4114,7 @@ pub fn sliceAsBytes(slice: anytype) SliceAsBytesReturnType(@TypeOf(slice)) {
return @as(cast_target, @ptrCast(slice))[0 .. slice.len * @sizeOf(std.meta.Elem(Slice))];
}
 
test "sliceAsBytes" {
test sliceAsBytes {
const bytes = [_]u16{ 0xDEAD, 0xBEEF };
const slice = sliceAsBytes(bytes[0..]);
try testing.expect(slice.len == 4);
@@ -4268,7 +4272,7 @@ fn doNotOptimizeAwayC(ptr: anytype) void {
dest.* = 0;
}
 
test "doNotOptimizeAway" {
test doNotOptimizeAway {
comptime doNotOptimizeAway("test");
 
doNotOptimizeAway(null);
@@ -4293,7 +4297,7 @@ test "doNotOptimizeAway" {
doNotOptimizeAway(@as(std.builtin.Endian, .little));
}
 
test "alignForward" {
test alignForward {
try testing.expect(alignForward(usize, 1, 1) == 1);
try testing.expect(alignForward(usize, 2, 1) == 2);
try testing.expect(alignForward(usize, 1, 2) == 2);
@@ -4362,7 +4366,7 @@ pub fn isAlignedGeneric(comptime T: type, addr: T, alignment: T) bool {
return alignBackward(T, addr, alignment) == addr;
}
 
test "isAligned" {
test isAligned {
try testing.expect(isAligned(0, 4));
try testing.expect(isAligned(1, 1));
try testing.expect(isAligned(2, 1));
 
lib/std/meta/trailer_flags.zig added: 434, removed: 391, total 43
@@ -132,7 +132,7 @@ pub fn TrailerFlags(comptime Fields: type) type {
};
}
 
test "TrailerFlags" {
test TrailerFlags {
const Flags = TrailerFlags(struct {
a: i32,
b: bool,
 
lib/std/os/windows.zig added: 434, removed: 391, total 43
@@ -1379,7 +1379,7 @@ pub fn GetFinalPathNameByHandle(
}
}
 
test "GetFinalPathNameByHandle" {
test GetFinalPathNameByHandle {
if (builtin.os.tag != .windows)
return;
 
@@ -2601,7 +2601,7 @@ pub fn ntToWin32Namespace(path: []const u16) !PathSpace {
}
}
 
test "ntToWin32Namespace" {
test ntToWin32Namespace {
const L = std.unicode.utf8ToUtf16LeStringLiteral;
 
try testNtToWin32Namespace(L("UNC"), L("\\??\\UNC"));
@@ -3539,7 +3539,7 @@ pub const GUID = extern struct {
}
};
 
test "GUID" {
test GUID {
try std.testing.expectEqual(
GUID{
.Data1 = 0x01234567,
 
lib/std/process.zig added: 434, removed: 391, total 43
@@ -215,7 +215,7 @@ pub const EnvMap = struct {
}
};
 
test "EnvMap" {
test EnvMap {
var env = EnvMap.init(testing.allocator);
defer env.deinit();
 
@@ -377,7 +377,7 @@ pub fn getEnvMap(allocator: Allocator) GetEnvMapError!EnvMap {
}
}
 
test "getEnvMap" {
test getEnvMap {
var env = try getEnvMap(testing.allocator);
defer env.deinit();
}
@@ -1181,7 +1181,7 @@ pub fn argsFree(allocator: Allocator, args_alloc: []const [:0]u8) void {
return allocator.free(aligned_allocated_buf);
}
 
test "ArgIteratorWindows" {
test ArgIteratorWindows {
const t = testArgIteratorWindows;
 
try t(
 
lib/std/sort.zig added: 434, removed: 391, total 43
@@ -430,7 +430,7 @@ pub fn binarySearch(
return null;
}
 
test "binarySearch" {
test binarySearch {
const S = struct {
fn order_u32(context: void, lhs: u32, rhs: u32) math.Order {
_ = context;
@@ -537,7 +537,7 @@ pub fn lowerBound(
return left;
}
 
test "lowerBound" {
test lowerBound {
const S = struct {
fn lower_u32(context: void, lhs: u32, rhs: u32) bool {
_ = context;
@@ -627,7 +627,7 @@ pub fn upperBound(
return left;
}
 
test "upperBound" {
test upperBound {
const S = struct {
fn lower_u32(context: void, lhs: u32, rhs: u32) bool {
_ = context;
@@ -712,7 +712,7 @@ pub fn equalRange(
};
}
 
test "equalRange" {
test equalRange {
const S = struct {
fn lower_u32(context: void, lhs: u32, rhs: u32) bool {
_ = context;
@@ -792,7 +792,7 @@ pub fn argMin(
return smallest_index;
}
 
test "argMin" {
test argMin {
try testing.expectEqual(@as(?usize, null), argMin(i32, &[_]i32{}, {}, asc_i32));
try testing.expectEqual(@as(?usize, 0), argMin(i32, &[_]i32{1}, {}, asc_i32));
try testing.expectEqual(@as(?usize, 0), argMin(i32, &[_]i32{ 1, 2, 3, 4, 5 }, {}, asc_i32));
@@ -812,7 +812,7 @@ pub fn min(
return items[i];
}
 
test "min" {
test min {
try testing.expectEqual(@as(?i32, null), min(i32, &[_]i32{}, {}, asc_i32));
try testing.expectEqual(@as(?i32, 1), min(i32, &[_]i32{1}, {}, asc_i32));
try testing.expectEqual(@as(?i32, 1), min(i32, &[_]i32{ 1, 2, 3, 4, 5 }, {}, asc_i32));
@@ -844,7 +844,7 @@ pub fn argMax(
return biggest_index;
}
 
test "argMax" {
test argMax {
try testing.expectEqual(@as(?usize, null), argMax(i32, &[_]i32{}, {}, asc_i32));
try testing.expectEqual(@as(?usize, 0), argMax(i32, &[_]i32{1}, {}, asc_i32));
try testing.expectEqual(@as(?usize, 4), argMax(i32, &[_]i32{ 1, 2, 3, 4, 5 }, {}, asc_i32));
@@ -864,7 +864,7 @@ pub fn max(
return items[i];
}
 
test "max" {
test max {
try testing.expectEqual(@as(?i32, null), max(i32, &[_]i32{}, {}, asc_i32));
try testing.expectEqual(@as(?i32, 1), max(i32, &[_]i32{1}, {}, asc_i32));
try testing.expectEqual(@as(?i32, 5), max(i32, &[_]i32{ 1, 2, 3, 4, 5 }, {}, asc_i32));
@@ -890,7 +890,7 @@ pub fn isSorted(
return true;
}
 
test "isSorted" {
test isSorted {
try testing.expect(isSorted(i32, &[_]i32{}, {}, asc_i32));
try testing.expect(isSorted(i32, &[_]i32{10}, {}, asc_i32));
try testing.expect(isSorted(i32, &[_]i32{ 1, 2, 3, 4, 5 }, {}, asc_i32));
 
lib/std/tar.zig added: 434, removed: 391, total 43
@@ -676,7 +676,7 @@ fn stripComponents(path: []const u8, count: u32) []const u8 {
return path[i..];
}
 
test "stripComponents" {
test stripComponents {
const expectEqualStrings = testing.expectEqualStrings;
try expectEqualStrings("a/b/c", stripComponents("a/b/c", 0));
try expectEqualStrings("b/c", stripComponents("a/b/c", 1));
@@ -685,7 +685,7 @@ test "stripComponents" {
try expectEqualStrings("", stripComponents("a/b/c", 4));
}
 
test "PaxIterator" {
test PaxIterator {
const Attr = struct {
kind: PaxAttributeKind,
value: []const u8 = undefined,
 
lib/std/testing.zig added: 434, removed: 391, total 43
@@ -242,7 +242,7 @@ fn expectApproxEqAbsInner(comptime T: type, expected: T, actual: T, tolerance: T
}
}
 
test "expectApproxEqAbs" {
test expectApproxEqAbs {
inline for ([_]type{ f16, f32, f64, f128 }) |T| {
const pos_x: T = 12.0;
const pos_y: T = 12.06;
@@ -278,7 +278,7 @@ fn expectApproxEqRelInner(comptime T: type, expected: T, actual: T, tolerance: T
}
}
 
test "expectApproxEqRel" {
test expectApproxEqRel {
inline for ([_]type{ f16, f32, f64, f128 }) |T| {
const eps_value = comptime math.floatEps(T);
const sqrt_eps_value = comptime @sqrt(eps_value);
 
lib/std/time.zig added: 434, removed: 391, total 43
@@ -53,7 +53,7 @@ pub fn sleep(nanoseconds: u64) void {
posix.nanosleep(s, ns);
}
 
test "sleep" {
test sleep {
sleep(1);
}
 
@@ -123,7 +123,7 @@ pub fn nanoTimestamp() i128 {
}
}
 
test "timestamp" {
test milliTimestamp {
const margin = ns_per_ms * 50;
 
const time_0 = milliTimestamp();
@@ -327,7 +327,7 @@ pub const Timer = struct {
}
};
 
test "Timer + Instant" {
test Timer {
const margin = ns_per_ms * 150;
 
var timer = try Timer.start();
 
lib/std/time/epoch.zig added: 434, removed: 391, total 43
@@ -53,7 +53,7 @@ pub fn isLeapYear(year: Year) bool {
return (0 == @mod(year, 400));
}
 
test "isLeapYear" {
test isLeapYear {
try testing.expectEqual(false, isLeapYear(2095));
try testing.expectEqual(true, isLeapYear(2096));
try testing.expectEqual(false, isLeapYear(2100));
 
lib/std/unicode.zig added: 434, removed: 391, total 43
@@ -907,7 +907,7 @@ pub fn fmtUtf8(utf8: []const u8) std.fmt.Formatter(formatUtf8) {
return .{ .data = utf8 };
}
 
test "fmtUtf8" {
test fmtUtf8 {
const expectFmt = testing.expectFmt;
try expectFmt("", "{}", .{fmtUtf8("")});
try expectFmt("foo", "{}", .{fmtUtf8("foo")});
@@ -1249,7 +1249,7 @@ pub fn utf8ToUtf16LeImpl(utf16le: []u16, utf8: []const u8, comptime surrogates:
return dest_index;
}
 
test "utf8ToUtf16Le" {
test utf8ToUtf16Le {
var utf16le: [128]u16 = undefined;
{
const length = try utf8ToUtf16Le(utf16le[0..], "𐐷");
@@ -1430,7 +1430,7 @@ pub fn fmtUtf16Le(utf16le: []const u16) std.fmt.Formatter(formatUtf16Le) {
return .{ .data = utf16le };
}
 
test "fmtUtf16Le" {
test fmtUtf16Le {
const expectFmt = testing.expectFmt;
try expectFmt("", "{}", .{fmtUtf16Le(utf8ToUtf16LeStringLiteral(""))});
try expectFmt("foo", "{}", .{fmtUtf16Le(utf8ToUtf16LeStringLiteral("foo"))});
@@ -1443,7 +1443,7 @@ test "fmtUtf16Le" {
try expectFmt("ξ€€", "{}", .{fmtUtf16Le(&[_]u16{mem.readInt(u16, "\x00\xe0", native_endian)})});
}
 
test "utf8ToUtf16LeStringLiteral" {
test utf8ToUtf16LeStringLiteral {
{
const bytes = [_:0]u16{
mem.nativeToLittle(u16, 0x41),
 
lib/std/valgrind/memcheck.zig added: 434, removed: 391, total 43
@@ -137,7 +137,7 @@ pub fn countLeaks() CountResult {
return res;
}
 
test "countLeaks" {
test countLeaks {
try testing.expectEqual(
@as(CountResult, .{
.leaked = 0,
@@ -167,7 +167,7 @@ pub fn countLeakBlocks() CountResult {
return res;
}
 
test "countLeakBlocks" {
test countLeakBlocks {
try testing.expectEqual(
@as(CountResult, .{
.leaked = 0,
 
lib/std/zig/ErrorBundle.zig added: 434, removed: 391, total 43
@@ -642,96 +642,96 @@ pub const Wip = struct {
i += 1;
}
}
};
 
test "addBundleAsRoots" {
var bundle = bundle: {
var wip: ErrorBundle.Wip = undefined;
try wip.init(std.testing.allocator);
errdefer wip.deinit();
test addBundleAsRoots {
var bundle = bundle: {
var wip: ErrorBundle.Wip = undefined;
try wip.init(std.testing.allocator);
errdefer wip.deinit();
 
var ref_traces: [3]ReferenceTrace = undefined;
for (&ref_traces, 0..) |*ref_trace, i| {
if (i == ref_traces.len - 1) {
// sentinel reference trace
ref_trace.* = .{
.decl_name = 3, // signifies 3 hidden references
.src_loc = .none,
};
} else {
ref_trace.* = .{
.decl_name = try wip.addString("foo"),
.src_loc = try wip.addSourceLocation(.{
.src_path = try wip.addString("foo"),
.line = 1,
.column = 2,
.span_start = 3,
.span_main = 4,
.span_end = 5,
.source_line = 0,
}),
};
var ref_traces: [3]ReferenceTrace = undefined;
for (&ref_traces, 0..) |*ref_trace, i| {
if (i == ref_traces.len - 1) {
// sentinel reference trace
ref_trace.* = .{
.decl_name = 3, // signifies 3 hidden references
.src_loc = .none,
};
} else {
ref_trace.* = .{
.decl_name = try wip.addString("foo"),
.src_loc = try wip.addSourceLocation(.{
.src_path = try wip.addString("foo"),
.line = 1,
.column = 2,
.span_start = 3,
.span_main = 4,
.span_end = 5,
.source_line = 0,
}),
};
}
}
}
 
const src_loc = try wip.addSourceLocation(.{
.src_path = try wip.addString("foo"),
.line = 1,
.column = 2,
.span_start = 3,
.span_main = 4,
.span_end = 5,
.source_line = try wip.addString("some source code"),
.reference_trace_len = ref_traces.len,
});
for (&ref_traces) |ref_trace| {
try wip.addReferenceTrace(ref_trace);
}
 
try wip.addRootErrorMessage(ErrorMessage{
.msg = try wip.addString("hello world"),
.src_loc = src_loc,
.notes_len = 1,
});
const i = try wip.reserveNotes(1);
const note_index = @intFromEnum(wip.addErrorMessageAssumeCapacity(.{
.msg = try wip.addString("this is a note"),
.src_loc = try wip.addSourceLocation(.{
.src_path = try wip.addString("bar"),
const src_loc = try wip.addSourceLocation(.{
.src_path = try wip.addString("foo"),
.line = 1,
.column = 2,
.span_start = 3,
.span_main = 4,
.span_end = 5,
.source_line = try wip.addString("another line of source"),
}),
}));
wip.extra.items[i] = note_index;
.source_line = try wip.addString("some source code"),
.reference_trace_len = ref_traces.len,
});
for (&ref_traces) |ref_trace| {
try wip.addReferenceTrace(ref_trace);
}
 
break :bundle try wip.toOwnedBundle("");
};
defer bundle.deinit(std.testing.allocator);
try wip.addRootErrorMessage(ErrorMessage{
.msg = try wip.addString("hello world"),
.src_loc = src_loc,
.notes_len = 1,
});
const i = try wip.reserveNotes(1);
const note_index = @intFromEnum(wip.addErrorMessageAssumeCapacity(.{
.msg = try wip.addString("this is a note"),
.src_loc = try wip.addSourceLocation(.{
.src_path = try wip.addString("bar"),
.line = 1,
.column = 2,
.span_start = 3,
.span_main = 4,
.span_end = 5,
.source_line = try wip.addString("another line of source"),
}),
}));
wip.extra.items[i] = note_index;
 
const ttyconf: std.io.tty.Config = .no_color;
break :bundle try wip.toOwnedBundle("");
};
defer bundle.deinit(std.testing.allocator);
 
var bundle_buf = std.ArrayList(u8).init(std.testing.allocator);
defer bundle_buf.deinit();
try bundle.renderToWriter(.{ .ttyconf = ttyconf }, bundle_buf.writer());
const ttyconf: std.io.tty.Config = .no_color;
 
var copy = copy: {
var wip: ErrorBundle.Wip = undefined;
try wip.init(std.testing.allocator);
errdefer wip.deinit();
var bundle_buf = std.ArrayList(u8).init(std.testing.allocator);
defer bundle_buf.deinit();
try bundle.renderToWriter(.{ .ttyconf = ttyconf }, bundle_buf.writer());
 
try wip.addBundleAsRoots(bundle);
var copy = copy: {
var wip: ErrorBundle.Wip = undefined;
try wip.init(std.testing.allocator);
errdefer wip.deinit();
 
break :copy try wip.toOwnedBundle("");
};
defer copy.deinit(std.testing.allocator);
try wip.addBundleAsRoots(bundle);
 
var copy_buf = std.ArrayList(u8).init(std.testing.allocator);
defer copy_buf.deinit();
try copy.renderToWriter(.{ .ttyconf = ttyconf }, copy_buf.writer());
break :copy try wip.toOwnedBundle("");
};
defer copy.deinit(std.testing.allocator);
 
try std.testing.expectEqualStrings(bundle_buf.items, copy_buf.items);
}
var copy_buf = std.ArrayList(u8).init(std.testing.allocator);
defer copy_buf.deinit();
try copy.renderToWriter(.{ .ttyconf = ttyconf }, copy_buf.writer());
 
try std.testing.expectEqualStrings(bundle_buf.items, copy_buf.items);
}
};
 
lib/std/zig/primitives.zig added: 434, removed: 391, total 43
@@ -51,7 +51,7 @@ pub fn isPrimitive(name: []const u8) bool {
return true;
}
 
test "isPrimitive" {
test isPrimitive {
const expect = std.testing.expect;
try expect(!isPrimitive(""));
try expect(!isPrimitive("_"));
 
lib/std/zig/string_literal.zig added: 434, removed: 391, total 43
@@ -148,7 +148,7 @@ pub fn parseEscapeSequence(slice: []const u8, offset: *usize) ParsedCharLiteral
}
}
 
test "parseCharLiteral" {
test parseCharLiteral {
try std.testing.expectEqual(
ParsedCharLiteral{ .success = 'a' },
parseCharLiteral("'a'"),
@@ -281,7 +281,7 @@ pub fn parseAlloc(allocator: std.mem.Allocator, bytes: []const u8) ParseError![]
}
}
 
test "parse" {
test parseAlloc {
const expect = std.testing.expect;
const expectError = std.testing.expectError;
const eql = std.mem.eql;
 
test/behavior/bitcast.zig added: 434, removed: 391, total 43
@@ -374,6 +374,11 @@ test "comptime @bitCast packed struct to int and back" {
}
 
test "comptime bitcast with fields following f80" {
if (true) {
// https://github.com/ziglang/zig/issues/19387
return error.SkipZigTest;
}
 
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
 
test/behavior/comptime_memory.zig added: 434, removed: 391, total 43
@@ -400,6 +400,10 @@ test "accessing reinterpreted memory of parent object" {
}
 
test "bitcast packed union to integer" {
if (true) {
// https://github.com/ziglang/zig/issues/19384
return error.SkipZigTest;
}
const U = packed union {
x: u1,
y: u2,
 
test/behavior/union.zig added: 434, removed: 391, total 43
@@ -1746,6 +1746,10 @@ fn littleToNativeEndian(comptime T: type, v: T) T {
}
 
test "reinterpret extern union" {
if (true) {
// https://github.com/ziglang/zig/issues/19389
return error.SkipZigTest;
}
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
 
const U = extern union {