Files
argparse/spec/default_spec.lua
mpeterv 247c8a9cce Redesign argument storing
* Use state objects instead of tons of locals in the main
  function.
* Use actions for storing arguments into result table.
  Actions are now called at the end of each invocation,
  with result table, target index, arguments and overwrite flag as
  arguments.
* Remove command actions.
* Improve error messages, refer to options by the last used alias
  instead of the main name.

TODO:

* Improve error messages further ("argument 'foo' is required"
  -> "missing argument 'foo'", etc.).
* Add actions for positional arguments.
* Add actions for commands (should be called with final results
  after parsing is over, in "innermost first" order).
* Allow referring to built-in actions by strings a-la Python
  (e.g. action = "store_false").
* Allow setting initial value to be stored at target index
  for each option (perhaps use default value for that).
* Add more tests, particularly for actions.
2015-10-29 21:00:49 +03:00

136 lines
4.4 KiB
Lua

local Parser = require "argparse"
getmetatable(Parser()).error = function(_, msg) error(msg) end
describe("tests related to default values", function()
describe("default values for arguments", function()
it("handles default argument correctly", function()
local parser = Parser()
parser:argument "foo"
:default "bar"
local args = parser:parse{}
assert.same({foo = "bar"}, args)
args = parser:parse{"baz"}
assert.same({foo = "baz"}, args)
end)
it("handles default argument for multi-argument correctly", function()
local parser = Parser()
parser:argument "foo" {
args = 3,
default = "bar",
defmode = "arg"
}
local args = parser:parse{"baz"}
assert.same({foo = {"baz", "bar", "bar"}}, args)
end)
it("handles default value for multi-argument correctly", function()
local parser = Parser()
parser:argument "foo" {
args = 3,
default = "bar"
}
local args = parser:parse{}
assert.same({foo = {"bar", "bar", "bar"}}, args)
end)
it("does not use default values if not needed", function()
local parser = Parser()
parser:argument "foo" {
args = "1-2",
default = "bar"
}
local args = parser:parse({"baz"})
assert.same({foo = {"baz"}}, args)
end)
end)
describe("default values for options", function()
it("handles option with default value correctly", function()
local parser = Parser()
parser:option "-o" "--output"
:default "a.out"
:defmode "unused"
local args = parser:parse{}
assert.same({output = "a.out"}, args)
args = parser:parse{"--output", "foo.txt"}
assert.same({output = "foo.txt"}, args)
assert.has_error(function() parser:parse{"-o"} end, "option '-o' requires an argument")
end)
it("handles option with default value for multi-argument option correctly", function()
local parser = Parser()
parser:option("-s --several", "Two or three things", "foo", nil, "2-3")
local args = parser:parse{}
assert.same({several = {"foo", "foo"}}, args)
end)
it("handles option with default value and argument", function()
local parser = Parser()
parser:option "-o" "--output" {
default = "a.out",
defmode = "arg+count"
}
local args = parser:parse{}
assert.same({output = "a.out"}, args)
args = parser:parse{"-o"}
assert.same({output = "a.out"}, args)
args = parser:parse{"-o", "value"}
assert.same({output = "value"}, args)
end)
it("handles option with default argument correctly", function()
local parser = Parser()
parser:option "-p" "--protected"
:target "password"
:default "password"
:defmode "arg"
local args = parser:parse{"-p"}
assert.same({password = "password"}, args)
end)
it("doesn't use default argument if option is not invoked", function()
local parser = Parser()
parser:option "-f" "--foo" {
default = "bar",
defmode = "arg"
}
local args = parser:parse{}
assert.same({}, args)
end)
it("handles default multi-argument correctly", function()
local parser = Parser()
parser:option "-f" "--foo" {
args = 3,
default = "bar",
defmode = "arg"
}
local args = parser:parse({"--foo=baz"})
assert.same({foo = {"baz", "bar", "bar"}}, args)
end)
it("does not use default values if not needed", function()
local parser = Parser()
parser:option "-f" "--foo" {
args = "1-2",
default = "bar",
defmode = "arg"
}
local args = parser:parse({"-f", "baz"})
assert.same({foo = {"baz"}}, args)
end)
it("handles multi-count options with default value correctly", function()
local parser = Parser()
parser:option "-f" "--foo" {
count = "*",
default = "bar",
defmode = "arg + count"
}
local args = parser:parse({"-f", "--foo=baz", "--foo"})
assert.same({foo = {"bar", "baz", "bar"}}, args)
end)
end)
end)