summaryrefslogtreecommitdiff
path: root/tests/core.zig
blob: 765b1612c5b0f835796d80329b53fd7cb7d91c7e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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] orelse {
            debug.assert(arg.value == null);
            continue;
        };
        const actual_value = arg.value orelse 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"});
}