Annotate

spec/util_argparse_spec.lua @ 13733:48c056c10e5a 13.0

util.argparse: Add strict mode + tests
author Matthew Wild <mwild1@gmail.com>
date Mon, 17 Feb 2025 18:24:23 +0000
parent 13160:4ee9a912ceea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11843
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 describe("parse", function()
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local parse
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 setup(function() parse = require"util.argparse".parse; end);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 it("works", function()
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 -- basic smoke test
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 local opts = parse({ "--help" });
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 assert.same({ help = true }, opts);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 end);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 it("returns if no args", function() assert.same({}, parse({})); end);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 it("supports boolean flags", function()
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 local opts, err = parse({ "--foo"; "--no-bar" });
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 assert.falsy(err);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 assert.same({ foo = true; bar = false }, opts);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 end);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 it("consumes input until the first argument", function()
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 local arg = { "--foo"; "bar"; "--baz" };
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 local opts, err = parse(arg);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 assert.falsy(err);
12477
cc84682b8429 util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents: 11845
diff changeset
23 assert.same({ foo = true, "bar", "--baz" }, opts);
11843
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 assert.same({ "bar"; "--baz" }, arg);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 end);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26
13733
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
27 it("allows continuation beyond first positional argument", function()
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
28 local arg = { "--foo"; "bar"; "--baz" };
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
29 local opts, err = parse(arg, { stop_on_positional = false });
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
30 assert.falsy(err);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
31 assert.same({ foo = true, baz = true, "bar" }, opts);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
32 -- All input should have been consumed:
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
33 assert.same({ }, arg);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
34 end);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
35
11843
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 it("expands short options", function()
13733
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
37 do
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
38 local opts, err = parse({ "--foo"; "-b" }, { short_params = { b = "bar" } });
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
39 assert.falsy(err);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
40 assert.same({ foo = true; bar = true }, opts);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
41 end
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
42
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
43 do
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
44 -- Same test with strict mode enabled and all parameters declared
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
45 local opts, err = parse({ "--foo"; "-b" }, { kv_params = { foo = true, bar = true }; short_params = { b = "bar" }, strict = true });
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
46 assert.falsy(err);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
47 assert.same({ foo = true; bar = true }, opts);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
48 end
11843
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 end);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 it("supports value arguments", function()
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 local opts, err = parse({ "--foo"; "bar"; "--baz=moo" }, { value_params = { foo = true; bar = true } });
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 assert.falsy(err);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 assert.same({ foo = "bar"; baz = "moo" }, opts);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 end);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 it("demands values for value params", function()
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 local opts, err, where = parse({ "--foo" }, { value_params = { foo = true } });
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 assert.falsy(opts);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 assert.equal("missing-value", err);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 assert.equal("--foo", where);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 end);
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63
11845
97c1399720c2 util.argparse: Add test for #1691
Kim Alvefur <zash@zash.se>
parents: 11843
diff changeset
64 it("reports where the problem is", function()
97c1399720c2 util.argparse: Add test for #1691
Kim Alvefur <zash@zash.se>
parents: 11843
diff changeset
65 local opts, err, where = parse({ "-h" });
97c1399720c2 util.argparse: Add test for #1691
Kim Alvefur <zash@zash.se>
parents: 11843
diff changeset
66 assert.falsy(opts);
97c1399720c2 util.argparse: Add test for #1691
Kim Alvefur <zash@zash.se>
parents: 11843
diff changeset
67 assert.equal("param-not-found", err);
97c1399720c2 util.argparse: Add test for #1691
Kim Alvefur <zash@zash.se>
parents: 11843
diff changeset
68 assert.equal("-h", where, "returned where");
97c1399720c2 util.argparse: Add test for #1691
Kim Alvefur <zash@zash.se>
parents: 11843
diff changeset
69 end);
97c1399720c2 util.argparse: Add test for #1691
Kim Alvefur <zash@zash.se>
parents: 11843
diff changeset
70
13160
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 12477
diff changeset
71 it("supports array arguments", function ()
13733
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
72 do
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
73 local opts, err = parse({ "--item"; "foo"; "--item"; "bar" }, { array_params = { item = true } });
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
74 assert.falsy(err);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
75 assert.same({"foo","bar"}, opts.item);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
76 end
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
77
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
78 do
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
79 -- Same test with strict mode enabled
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
80 local opts, err = parse({ "--item"; "foo"; "--item"; "bar" }, { array_params = { item = true }, strict = true });
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
81 assert.falsy(err);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
82 assert.same({"foo","bar"}, opts.item);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
83 end
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
84 end)
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
85
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
86 it("rejects unknown parameters in strict mode", function ()
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
87 local opts, err, err2 = parse({ "--item"; "foo"; "--item"; "bar", "--foobar" }, { array_params = { item = true }, strict = true });
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
88 assert.falsy(opts);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
89 assert.same("param-not-found", err);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
90 assert.same("--foobar", err2);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
91 end);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
92
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
93 it("accepts known kv parameters in strict mode", function ()
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
94 local opts, err = parse({ "--item=foo" }, { kv_params = { item = true }, strict = true });
13160
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 12477
diff changeset
95 assert.falsy(err);
13733
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
96 assert.same("foo", opts.item);
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
97 end);
11843
d2a939e21671 util.argparse: Tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 end);