add a standard zig formatter to Duration and more testing

This commit is contained in:
Jeffrey C. Ollie
2024-08-02 15:42:37 -05:00
parent cf515c80d0
commit d243ad6616

View File

@ -3894,9 +3894,12 @@ pub const Duration = struct {
var buf: [64]u8 = undefined; var buf: [64]u8 = undefined;
var fbs = std.io.fixedBufferStream(&buf); var fbs = std.io.fixedBufferStream(&buf);
const writer = fbs.writer(); const writer = fbs.writer();
try self.format("", .{}, writer);
try formatter.formatEntry([]const u8, fbs.getWritten());
}
pub fn format(self: @This(), comptime _: []const u8, _: std.fmt.FormatOptions, writer: anytype) !void {
var value = self.duration; var value = self.duration;
var i: usize = 0; var i: usize = 0;
for (units) |unit| { for (units) |unit| {
if (value >= unit.factor) { if (value >= unit.factor) {
@ -3908,8 +3911,6 @@ pub const Duration = struct {
i += 1; i += 1;
} }
} }
try formatter.formatEntry([]const u8, fbs.getWritten());
} }
}; };
@ -3976,9 +3977,22 @@ test "parse duration" {
try std.testing.expectError(error.InvalidValue, Duration.parseCLI("1 ")); try std.testing.expectError(error.InvalidValue, Duration.parseCLI("1 "));
} }
test "format duration" { test "test format" {
const testing = std.testing; inline for (Duration.units) |unit| {
var buf = std.ArrayList(u8).init(testing.allocator); const d: Duration = .{ .duration = unit.factor };
var actual_buf: [16]u8 = undefined;
const actual = try std.fmt.bufPrint(&actual_buf, "{}", .{d});
var expected_buf: [16]u8 = undefined;
const expected = if (!std.mem.eql(u8, unit.name, "us"))
try std.fmt.bufPrint(&expected_buf, "1{s}", .{unit.name})
else
"1µs";
try std.testing.expectEqualSlices(u8, expected, actual);
}
}
test "test entryFormatter" {
var buf = std.ArrayList(u8).init(std.testing.allocator);
defer buf.deinit(); defer buf.deinit();
var p: Duration = .{ .duration = std.math.maxInt(u64) }; var p: Duration = .{ .duration = std.math.maxInt(u64) };