zig-clap/tests/core.zig

135 lines
5.6 KiB
Zig

const std = @import("std");
const clap = @import("../index.zig");
const debug = std.debug;
const mem = std.mem;
const core = clap.core;
const assert = debug.assert;
const ArgSliceIterator = core.ArgSliceIterator;
const Names = core.Names;
const Param = core.Param;
const Clap = core.Clap;
fn testNoErr(params: []const Param(u8), args: []const []const u8, ids: []const u8, values: []const ?[]const u8) void {
var arg_iter = ArgSliceIterator.init(args);
var iter = Clap(u8, ArgSliceIterator.Error).init(params, &arg_iter.iter);
var i: usize = 0;
while (iter.next() catch unreachable) |arg| : (i += 1) {
debug.assert(ids[i] == arg.param.id);
const expected_value = values[i] ?? {
debug.assert(arg.value == null);
continue;
};
const actual_value = arg.value ?? unreachable;
debug.assert(mem.eql(u8, expected_value, actual_value));
}
}
test "clap.core: short" {
const params = []Param(u8) {
Param(u8).init(0, false, Names.short('a')),
Param(u8).init(1, false, Names.short('b')),
Param(u8).init(2, true, Names.short('c')),
};
testNoErr(params, [][]const u8 { "-a" }, []u8{0}, []?[]const u8{null});
testNoErr(params, [][]const u8 { "-a", "-b" }, []u8{0,1}, []?[]const u8{null,null});
testNoErr(params, [][]const u8 { "-ab" }, []u8{0,1}, []?[]const u8{null,null});
testNoErr(params, [][]const u8 { "-c=100" }, []u8{2}, []?[]const u8{"100"});
testNoErr(params, [][]const u8 { "-c100" }, []u8{2}, []?[]const u8{"100"});
testNoErr(params, [][]const u8 { "-c", "100" }, []u8{2}, []?[]const u8{"100"});
testNoErr(params, [][]const u8 { "-abc", "100" }, []u8{0,1,2}, []?[]const u8{null,null,"100"});
testNoErr(params, [][]const u8 { "-abc=100" }, []u8{0,1,2}, []?[]const u8{null,null,"100"});
testNoErr(params, [][]const u8 { "-abc100" }, []u8{0,1,2}, []?[]const u8{null,null,"100"});
}
test "clap.core: long" {
const params = []Param(u8) {
Param(u8).init(0, false, Names.long("aa")),
Param(u8).init(1, false, Names.long("bb")),
Param(u8).init(2, true, Names.long("cc")),
};
testNoErr(params, [][]const u8 { "--aa" }, []u8{0}, []?[]const u8{null});
testNoErr(params, [][]const u8 { "--aa", "--bb" }, []u8{0,1}, []?[]const u8{null,null});
testNoErr(params, [][]const u8 { "--cc=100" }, []u8{2}, []?[]const u8{"100"});
testNoErr(params, [][]const u8 { "--cc", "100" }, []u8{2}, []?[]const u8{"100"});
}
test "clap.core: bare" {
const params = []Param(u8) {
Param(u8).init(0, false, Names.bare("aa")),
Param(u8).init(1, false, Names.bare("bb")),
Param(u8).init(2, true, Names.bare("cc")),
};
testNoErr(params, [][]const u8 { "aa" }, []u8{0}, []?[]const u8{null});
testNoErr(params, [][]const u8 { "aa", "bb" }, []u8{0,1}, []?[]const u8{null,null});
testNoErr(params, [][]const u8 { "cc=100" }, []u8{2}, []?[]const u8{"100"});
testNoErr(params, [][]const u8 { "cc", "100" }, []u8{2}, []?[]const u8{"100"});
}
test "clap.core: none" {
const params = []Param(u8) {
Param(u8).init(0, true, Names.none()),
};
testNoErr(params, [][]const u8 { "aa" }, []u8{0}, []?[]const u8{"aa"});
}
test "clap.core: all" {
const params = []Param(u8) {
Param(u8).init(
0,
false,
Names{
.bare = "aa",
.short = 'a',
.long = "aa",
}
),
Param(u8).init(
1,
false,
Names{
.bare = "bb",
.short = 'b',
.long = "bb",
}
),
Param(u8).init(
2,
true,
Names{
.bare = "cc",
.short = 'c',
.long = "cc",
}
),
Param(u8).init(3, true, Names.none()),
};
testNoErr(params, [][]const u8 { "-a" }, []u8{0}, []?[]const u8{null});
testNoErr(params, [][]const u8 { "-a", "-b" }, []u8{0,1}, []?[]const u8{null,null});
testNoErr(params, [][]const u8 { "-ab" }, []u8{0,1}, []?[]const u8{null,null});
testNoErr(params, [][]const u8 { "-c=100" }, []u8{2}, []?[]const u8{"100"});
testNoErr(params, [][]const u8 { "-c100" }, []u8{2}, []?[]const u8{"100"});
testNoErr(params, [][]const u8 { "-c", "100" }, []u8{2}, []?[]const u8{"100"});
testNoErr(params, [][]const u8 { "-abc", "100" }, []u8{0,1,2}, []?[]const u8{null,null,"100"});
testNoErr(params, [][]const u8 { "-abc=100" }, []u8{0,1,2}, []?[]const u8{null,null,"100"});
testNoErr(params, [][]const u8 { "-abc100" }, []u8{0,1,2}, []?[]const u8{null,null,"100"});
testNoErr(params, [][]const u8 { "--aa" }, []u8{0}, []?[]const u8{null});
testNoErr(params, [][]const u8 { "--aa", "--bb" }, []u8{0,1}, []?[]const u8{null,null});
testNoErr(params, [][]const u8 { "--cc=100" }, []u8{2}, []?[]const u8{"100"});
testNoErr(params, [][]const u8 { "--cc", "100" }, []u8{2}, []?[]const u8{"100"});
testNoErr(params, [][]const u8 { "aa" }, []u8{0}, []?[]const u8{null});
testNoErr(params, [][]const u8 { "aa", "bb" }, []u8{0,1}, []?[]const u8{null,null});
testNoErr(params, [][]const u8 { "cc=100" }, []u8{2}, []?[]const u8{"100"});
testNoErr(params, [][]const u8 { "cc", "100" }, []u8{2}, []?[]const u8{"100"});
testNoErr(params, [][]const u8 { "dd" }, []u8{3}, []?[]const u8{"dd"});
}