better char debugging experience
This commit is contained in:
parent
186796fffc
commit
83fa0c8733
@ -196,8 +196,8 @@ pub fn testCorpus(allocator: Allocator) !Corpus {
|
|||||||
.gid = math.maxInt(u32),
|
.gid = math.maxInt(u32),
|
||||||
.name = "Name" ** 8,
|
.name = "Name" ** 8,
|
||||||
.gecos = "Gecos" ** 51,
|
.gecos = "Gecos" ** 51,
|
||||||
.home = "Home" ** 16,
|
.home = "/Hom" ** 16,
|
||||||
.shell = "She.LllL" ** 8,
|
.shell = "/She.Lll" ** 8,
|
||||||
}, User{
|
}, User{
|
||||||
.uid = 100000,
|
.uid = 100000,
|
||||||
.gid = 1002,
|
.gid = 1002,
|
||||||
|
@ -184,7 +184,7 @@ test "User.fromLine" {
|
|||||||
},
|
},
|
||||||
.{
|
.{
|
||||||
.line = "žemas:x:0:0:root:/root:/bin/bash",
|
.line = "žemas:x:0:0:root:/root:/bin/bash",
|
||||||
.wantErr = "invalid name 'žemas': invalid character at position 0",
|
.wantErr = "invalid name 'žemas': invalid character 0xC5 at position 0",
|
||||||
},
|
},
|
||||||
.{
|
.{
|
||||||
.line = "root:x:-1:0:root:/root:/bin/bash",
|
.line = "root:x:-1:0:root:/root:/bin/bash",
|
||||||
|
@ -220,7 +220,7 @@ test "smoke test" {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const exit_code = execute(allocator, stdout.writer(), stderr.writer(), args);
|
const exit_code = execute(allocator, stdout.writer(), stderr.writer(), args);
|
||||||
if (true) return error.SkipZigTest;
|
//if (true) return error.SkipZigTest;
|
||||||
try testing.expectEqualStrings("", stderr.items);
|
try testing.expectEqualStrings("", stderr.items);
|
||||||
try testing.expectEqual(@as(u8, 0), exit_code);
|
try testing.expectEqual(@as(u8, 0), exit_code);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const ascii = std.ascii;
|
const ascii = std.ascii;
|
||||||
|
const BoundedArray = std.BoundedArray;
|
||||||
|
|
||||||
const ErrCtx = @import("ErrCtx.zig");
|
const ErrCtx = @import("ErrCtx.zig");
|
||||||
|
|
||||||
@ -13,6 +14,14 @@ pub fn utf8(s: []const u8) error{InvalidRecord}!void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn debugChar(c: u8) BoundedArray(u8, 4) {
|
||||||
|
var res = BoundedArray(u8, 4).init(0) catch unreachable;
|
||||||
|
if (ascii.isPrint(c)) {
|
||||||
|
res.writer().print("'{c}'", .{c}) catch unreachable;
|
||||||
|
} else res.writer().print("0x{X}", .{c}) catch unreachable;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
// # adduser žmogus
|
// # adduser žmogus
|
||||||
// adduser: To avoid problems, the username should consist only of letters,
|
// adduser: To avoid problems, the username should consist only of letters,
|
||||||
// digits, underscores, periods, at signs and dashes, and not start with a dash
|
// digits, underscores, periods, at signs and dashes, and not start with a dash
|
||||||
@ -24,13 +33,17 @@ pub fn name(s: []const u8, err: *ErrCtx) error{InvalidRecord}!void {
|
|||||||
|
|
||||||
const c0 = s[0];
|
const c0 = s[0];
|
||||||
if (!(ascii.isAlNum(c0) or c0 == '_' or c0 == '.' or c0 == '@'))
|
if (!(ascii.isAlNum(c0) or c0 == '_' or c0 == '.' or c0 == '@'))
|
||||||
return err.returnf("invalid character at position 0", .{}, error.InvalidRecord);
|
return err.returnf(
|
||||||
|
"invalid character {s} at position 0",
|
||||||
|
.{debugChar(c0).constSlice()},
|
||||||
|
error.InvalidRecord,
|
||||||
|
);
|
||||||
|
|
||||||
for (s[1..]) |c, i| {
|
for (s[1..]) |c, i| {
|
||||||
if (!(ascii.isAlNum(c) or c == '_' or c == '.' or c == '@' or c == '-'))
|
if (!(ascii.isAlNum(c) or c == '_' or c == '.' or c == '@' or c == '-'))
|
||||||
return err.returnf(
|
return err.returnf(
|
||||||
"invalid character at position {d}",
|
"invalid character {s} at position {d}",
|
||||||
.{i + 2},
|
.{ debugChar(c).constSlice(), i + 2 },
|
||||||
error.InvalidRecord,
|
error.InvalidRecord,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -59,7 +72,7 @@ pub fn path(s: []const u8, err: *ErrCtx) error{InvalidRecord}!void {
|
|||||||
for (s[1..]) |c, i| {
|
for (s[1..]) |c, i| {
|
||||||
if (!(ascii.isAlNum(c) or c == '/' or c == '_' or c == '.' or c == '@' or c == '-'))
|
if (!(ascii.isAlNum(c) or c == '/' or c == '_' or c == '.' or c == '@' or c == '-'))
|
||||||
return err.returnf(
|
return err.returnf(
|
||||||
"invalid character at position {d}",
|
"invalid character 0xD at position {d}",
|
||||||
.{i + 2},
|
.{i + 2},
|
||||||
error.InvalidRecord,
|
error.InvalidRecord,
|
||||||
);
|
);
|
||||||
@ -76,8 +89,8 @@ test "validate name" {
|
|||||||
.{ .name = "all-good" },
|
.{ .name = "all-good" },
|
||||||
.{ .name = "..." },
|
.{ .name = "..." },
|
||||||
.{ .name = "", .wantErr = "cannot be empty" },
|
.{ .name = "", .wantErr = "cannot be empty" },
|
||||||
.{ .name = "-no-start-dash", .wantErr = "invalid character at position 0" },
|
.{ .name = "-no-start-dash", .wantErr = "invalid character '-' at position 0" },
|
||||||
.{ .name = "Herbasž", .wantErr = "invalid character at position 7" },
|
.{ .name = "Herbasž", .wantErr = "invalid character 0xC5 at position 7" },
|
||||||
};
|
};
|
||||||
for (examples) |tt| {
|
for (examples) |tt| {
|
||||||
var err = ErrCtx{};
|
var err = ErrCtx{};
|
||||||
@ -130,8 +143,8 @@ test "validate path" {
|
|||||||
.{ .path = "/" },
|
.{ .path = "/" },
|
||||||
.{ .path = "foo", .wantErr = "must start with /" },
|
.{ .path = "foo", .wantErr = "must start with /" },
|
||||||
.{ .path = "", .wantErr = "cannot be empty" },
|
.{ .path = "", .wantErr = "cannot be empty" },
|
||||||
.{ .path = "/path:motiejus", .wantErr = "invalid character at position 6" },
|
.{ .path = "/path:motiejus", .wantErr = "invalid character 0xD at position 6" },
|
||||||
.{ .path = "/Herbasž", .wantErr = "invalid character at position 8" },
|
.{ .path = "/Herbasž", .wantErr = "invalid character 0xD at position 8" },
|
||||||
};
|
};
|
||||||
for (examples) |tt| {
|
for (examples) |tt| {
|
||||||
var err = ErrCtx{};
|
var err = ErrCtx{};
|
||||||
|
Loading…
Reference in New Issue
Block a user