From 9e0e5ff8ea07ec9f6497a3566fbeb152301c0d73 Mon Sep 17 00:00:00 2001 From: ktkk Date: Tue, 25 Aug 2026 12:07:43 +0000 Subject: [PATCH] Add EnumFlags tests --- src/EnumFlags.zig | 75 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/src/EnumFlags.zig b/src/EnumFlags.zig index 80c7e40..d7ca723 100644 --- a/src/EnumFlags.zig +++ b/src/EnumFlags.zig @@ -8,7 +8,13 @@ pub fn EnumFlags(comptime E: type) type { mask: BackingInt, - pub const empty: Self = .{ .data = 0 }; + pub const empty: Self = .{ .mask = 0 }; + + test empty { + const flags: EnumFlags(Enum) = .empty; + + try std.testing.expectEqual(0b0000_0000, flags.mask); + } pub fn from(mask: BackingInt) Self { return .{ @@ -16,6 +22,12 @@ pub fn EnumFlags(comptime E: type) type { }; } + test from { + const flags: EnumFlags(Enum) = .from(0b0000_0001); + + try std.testing.expectEqual(0b0000_0001, flags.mask); + } + pub fn contains(self: Self, flag: E) bool { return (self.mask & @intFromEnum(flag)) != 0; } @@ -48,3 +60,64 @@ pub fn EnumFlags(comptime E: type) type { }; } +const Enum = enum(u8) { + a = 0b0000_0001, + b = 0b0000_0010, + c = 0b0000_0100, +}; + +test { + + std.testing.refAllDecls(EnumFlags(Enum)); +} + +test "EnumFlags operations" { + var flags: EnumFlags(Enum) = .from(0b0000_0001); + + try std.testing.expect(flags.contains(Enum.a)); + + flags.remove(Enum.a); + try std.testing.expect(!flags.contains(Enum.a)); + + flags.remove(Enum.a); // Removing twice should not enable the flag + try std.testing.expect(!flags.contains(Enum.a)); + + flags.insert(Enum.b); + try std.testing.expectEqual(0b0000_0010, flags.mask); + try std.testing.expect(flags.contains(Enum.b)); + try std.testing.expect(!flags.contains(Enum.a)); + + flags.toggle(Enum.a); + try std.testing.expectEqual(0b0000_0011, flags.mask); + try std.testing.expect(flags.contains(Enum.a)); + try std.testing.expect(flags.contains(Enum.b)); + try std.testing.expect(!flags.contains(Enum.c)); +} + +fn testFormat(expected: []const u8, flags: EnumFlags(Enum)) !void { + var out_buf: [1024]u8 = undefined; + var out: std.Io.Writer = .fixed(&out_buf); + + try flags.format(&out); + + try std.testing.expectEqualStrings(expected, out.buffered()); +} + +test "EnumFlags format" { + var flags: EnumFlags(Enum) = .empty; + + flags.toggle(Enum.a); + flags.toggle(Enum.b); + flags.toggle(Enum.c); + try testFormat("a | b | c", flags); + + flags.toggle(Enum.b); + try testFormat("a | c", flags); + + flags.remove(Enum.c); + try testFormat("a", flags); + + flags.insert(Enum.b); + try testFormat("a | b", flags); +} +