Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
9e0e5ff8ea Add EnumFlags tests 2026-08-25 12:07:43 +00:00

View file

@ -8,7 +8,13 @@ pub fn EnumFlags(comptime E: type) type {
mask: BackingInt, 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 { pub fn from(mask: BackingInt) Self {
return .{ 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 { pub fn contains(self: Self, flag: E) bool {
return (self.mask & @intFromEnum(flag)) != 0; 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);
}