diff --git a/mod.ts b/mod.ts index ca32ada..f0684a2 100644 --- a/mod.ts +++ b/mod.ts @@ -89,7 +89,7 @@ export class FlagsImpl implements Flags { value(n: string): T { const f = this.m.get(n); if (!f) { - throw new Error("unknown flag ${n}"); + throw new Error(`unknown flag ${n}`); } let v = f.value ?? f.default ?? this.defaultValue(f); if (Array.isArray(v)) { @@ -101,7 +101,7 @@ export class FlagsImpl implements Flags { values(n: string): T[] { const f = this.m.get(n); if (!f) { - throw new Error("unknown flag ${n}"); + throw new Error(`unknown flag ${n}`); } let v = f.value ?? f.default ?? this.defaultValue(f); if (!Array.isArray(v)) { diff --git a/test.ts b/test.ts index 99ba6ee..18db1a7 100644 --- a/test.ts +++ b/test.ts @@ -100,3 +100,163 @@ Deno.test("command needs use", () => { "use is required", ); }); + +Deno.test("flags - non existing flag returns null", async () => { + const root = cli({ use: "test" }); + root.addCommand({ + use: "t", + run: (_cmd, _args, flags): Promise => { + assertEquals(flags.getFlag("test"), null); + return Promise.resolve(0); + }, + }); + + const rv = await root.execute(["t"]); + assertEquals(rv, 0); + assertEquals(root.lastCmd.cmd.name, "t"); +}); + +Deno.test("flags - default value", async () => { + const root = cli({ use: "test" }); + const t = root.addCommand({ + use: "t", + run: (_cmd, _args, flags): Promise => { + assertEquals(flags.value("ok"), false); + assertEquals(flags.value("dok"), true); + assertEquals(flags.value("name"), ""); + assertEquals(flags.value("dname"), "hello"); + assertEquals(flags.value("num"), 0); + assertEquals(flags.value("dnum"), 10); + + return Promise.resolve(0); + }, + }); + + t.addFlag({ name: "ok", type: "boolean" }); + t.addFlag({ name: "dok", type: "boolean", default: true }); + t.addFlag({ name: "name", type: "string" }); + t.addFlag({ name: "dname", type: "string", default: "hello" }); + t.addFlag({ name: "num", type: "number" }); + t.addFlag({ name: "dnum", type: "number", default: 10 }); + + const rv = await root.execute(["t"]); + assertEquals(rv, 0); +}); + +Deno.test("flags - unknown flag throws", async () => { + const root = cli({ use: "test" }); + root.addCommand({ + use: "t", + run: (_cmd, _args, flags): Promise => { + assertThrows( + () => { + flags.value("bad"); + }, + Error, + "unknown flag bad", + ); + + return Promise.resolve(0); + }, + }); + + const rv = await root.execute(["t"]); + assertEquals(rv, 0); +}); + +Deno.test("flags - array values", async () => { + const root = cli({ use: "test" }); + const t = root.addCommand({ + use: "t", + run: (_cmd, _args, flags): Promise => { + const v = flags.values("x"); + assertEquals(v, [1, 2]); + return Promise.resolve(0); + }, + }); + t.addFlag({ + name: "x", + type: "number", + }); + + const rv = await root.execute(["t", "--x", "1", "--x", "2"]); + assertEquals(rv, 0); +}); + +Deno.test("flags - array value returns first value", async () => { + const root = cli({ use: "test" }); + const t = root.addCommand({ + use: "t", + run: (_cmd, _args, flags): Promise => { + const v = flags.value("x"); + assertEquals(v, 1); + return Promise.resolve(0); + }, + }); + t.addFlag({ + name: "x", + type: "number", + }); + + const rv = await root.execute(["t", "--x", "1", "--x", "2"]); + assertEquals(rv, 0); +}); + +Deno.test("flags - array values returns array", async () => { + const root = cli({ use: "test" }); + const t = root.addCommand({ + use: "t", + run: (_cmd, _args, flags): Promise => { + const v = flags.values("x"); + assertEquals(v, [1]); + return Promise.resolve(0); + }, + }); + t.addFlag({ + name: "x", + type: "number", + }); + + const rv = await root.execute(["t", "--x", "1"]); + assertEquals(rv, 0); +}); + +Deno.test("flags - array values returns default", async () => { + const root = cli({ use: "test" }); + const t = root.addCommand({ + use: "t", + run: (_cmd, _args, flags): Promise => { + const v = flags.values("x"); + assertEquals(v, [0]); + return Promise.resolve(0); + }, + }); + t.addFlag({ + name: "x", + type: "number", + }); + + const rv = await root.execute(["t"]); + assertEquals(rv, 0); +}); + +Deno.test("flags - unknown values throws", async () => { + const root = cli({ use: "test" }); + root.addCommand({ + use: "t", + run: (_cmd, _args, flags): Promise => { + assertThrows( + () => { + flags.values("bad"); + }, + Error, + "unknown flag bad", + ); + + return Promise.resolve(0); + }, + }); + + const rv = await root.execute(["t"]); + assertEquals(rv, 0); +});