authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-02-25 15:34:17-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-02-26 11:42:03-08:00
loga70307e7ffc608643bbd940796eaeb5bca6bbc8f
tree544804a8aaa72e04e427b2c4c3932e465a30a97c
parenteff1716b6c7800e6876d95d900b472fe351b0355

CLI: add unit test and improve sanitizeExampleName


1 files changed, 21 insertions(+), 7 deletions(-)

src/main.zig+21-7
...@@ -4773,22 +4773,36 @@ fn cmdInit(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {...@@ -4773,22 +4773,36 @@ fn cmdInit(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
4773}4773}
47744774
4775fn sanitizeExampleName(arena: Allocator, bytes: []const u8) error{OutOfMemory}![]const u8 {4775fn sanitizeExampleName(arena: Allocator, bytes: []const u8) error{OutOfMemory}![]const u8 {
4776 if (bytes.len == 0) return "foo";
4777 var result: std.ArrayListUnmanaged(u8) = .empty;4776 var result: std.ArrayListUnmanaged(u8) = .empty;
4778 try result.append(arena, switch (bytes[0]) {4777 for (bytes, 0..) |byte, i| switch (byte) {
4779 '_', 'a'...'z', 'A'...'Z' => |c| c,4778 '0'...'9' => {
4780 else => '_',4779 if (i == 0) try result.append(arena, '_');
4781 });4780 try result.append(arena, byte);
4782 for (bytes[1..]) |byte| switch (byte) {4781 },
4783 '_', 'a'...'z', 'A'...'Z', '0'...'9' => try result.append(arena, byte),4782 '_', 'a'...'z', 'A'...'Z' => try result.append(arena, byte),
4783 '-', '.', ' ' => try result.append(arena, '_'),
4784 else => continue,4784 else => continue,
4785 };4785 };
4786 if (result.items.len == 0) return "foo";
4786 if (result.items.len > Package.Manifest.max_name_len)4787 if (result.items.len > Package.Manifest.max_name_len)
4787 result.shrinkRetainingCapacity(Package.Manifest.max_name_len);4788 result.shrinkRetainingCapacity(Package.Manifest.max_name_len);
47884789
4789 return result.toOwnedSlice(arena);4790 return result.toOwnedSlice(arena);
4790}4791}
47914792
4793test sanitizeExampleName {
4794 var arena_instance = std.heap.ArenaAllocator.init(std.testing.allocator);
4795 defer arena_instance.deinit();
4796 const arena = arena_instance.allocator();
4797
4798 try std.testing.expectEqualStrings("foo_bar", try sanitizeExampleName(arena, "foo bar+"));
4799 try std.testing.expectEqualStrings("foo", try sanitizeExampleName(arena, ""));
4800 try std.testing.expectEqualStrings("foo", try sanitizeExampleName(arena, "!"));
4801 try std.testing.expectEqualStrings("a", try sanitizeExampleName(arena, "!a"));
4802 try std.testing.expectEqualStrings("a_b", try sanitizeExampleName(arena, "a.b!"));
4803 try std.testing.expectEqualStrings("_01234", try sanitizeExampleName(arena, "01234"));
4804}
4805
4792fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {4806fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
4793 dev.check(.build_command);4807 dev.check(.build_command);
47944808