package commando import utest._ object CommandTests extends TestSuite { def eval(cmd: Command, args: List[String]): Boolean = { cmd.parse(args).isEmpty } val tests = Tests { "empty" - { val cmd = new Command("cmd") assert(eval(cmd, Nil)) assert(!eval(cmd, "a" :: Nil)) } "positional required" - { val cmd = new Command("cmd") { positional("POS") } assert(!eval(cmd, Nil)) // no param assert(eval(cmd, "" :: Nil)) // empty param assert(eval(cmd, "a" :: Nil)) // one param assert(!eval(cmd, "a" :: "b" :: Nil)) // too many params assert(!eval(cmd, "a" :: "b" :: "c" :: Nil)) // too many params } "positional two" - { val cmd = new Command("cmd") { positional("one") positional("two") } assert(!eval(cmd, Nil)) // no param assert(!eval(cmd, "" :: Nil)) // empty param assert(!eval(cmd, "a" :: Nil)) // one param assert(eval(cmd, "a" :: "b" :: Nil)) // too many params assert(!eval(cmd, "a" :: "b" :: "c" :: Nil)) // too many params } "positional repeated" - { val cmd = new Command("cmd") { positional("one").repeat() } assert(eval(cmd, Nil)) assert(eval(cmd, "" :: Nil)) assert(eval(cmd, "a" :: Nil)) assert(eval(cmd, "a" :: "b" :: Nil)) assert(eval(cmd, "a" :: "b" :: "c" :: Nil)) } "positional optional" - { val cmd = new Command("cmd") { positional("one").optional() } assert(eval(cmd, Nil)) assert(eval(cmd, "" :: Nil)) assert(eval(cmd, "a" :: Nil)) assert(!eval(cmd, "a" :: "b" :: Nil)) assert(!eval(cmd, "a" :: "b" :: "c" :: Nil)) } "positional combination" - { class Cmd extends Command("cmd") { var one: Option[String] = None var two: Option[String] = None positional("one") .optional() .action(v => one = Some(v)) positional("two") .repeat() .action(v => two = Some(v)) } val cmd1 = new Cmd assert(eval(cmd1, Nil)) assert(cmd1.one == None && cmd1.two == None) val cmd2 = new Cmd assert(eval(cmd2, "" :: Nil)) assert(cmd2.one == Some("") && cmd2.two == None) val cmd3 = new Cmd assert(eval(cmd3, "a" :: Nil)) assert(cmd3.one == Some("a") && cmd3.two == None) val cmd4 = new Cmd assert(eval(cmd4, "a" :: "b" :: Nil)) assert(cmd4.one == Some("a") && cmd4.two == Some("b")) val cmd5 = new Cmd assert(eval(cmd5, "a" :: "b" :: "c" :: Nil)) assert(cmd5.one == Some("a") && cmd5.two == Some("c")) } "named flag optional" - { val cmd = new Command("cmd") { named("param") } assert(eval(cmd, Nil)) assert(!eval(cmd, "" :: Nil)) assert(eval(cmd, "--param" :: Nil)) assert(!eval(cmd, "--param" :: "" :: Nil)) assert(!eval(cmd, "--param" :: "--param" :: Nil)) assert(!eval(cmd, "--param" :: "--param" :: "a" :: Nil)) } "named flag required" - { val cmd = new Command("cmd") { named("param").require() } assert(!eval(cmd, Nil)) assert(!eval(cmd, "" :: Nil)) assert(eval(cmd, "--param" :: Nil)) assert(!eval(cmd, "--param" :: "" :: Nil)) assert(!eval(cmd, "--param" :: "--param" :: Nil)) assert(!eval(cmd, "--param" :: "--param" :: "a" :: Nil)) } "named flag repeated" - { val cmd = new Command("cmd") { named("param").repeat() } assert(eval(cmd, Nil)) assert(!eval(cmd, "" :: Nil)) assert(eval(cmd, "--param" :: Nil)) assert(!eval(cmd, "--param" :: "" :: Nil)) assert(eval(cmd, "--param" :: "--param" :: Nil)) assert(!eval(cmd, "--param" :: "--param" :: "a" :: Nil)) } "named arg" - { class Cmd extends Command("cmd") { var one: Option[String] = None var two: Option[String] = None named("one") .arg("value") .action(v => one = Some(v)) positional("two") .action(v => two = Some(v)) } val cmd1 = new Cmd assert(!eval(cmd1, Nil)) assert(cmd1.one == None && cmd1.two == None) val cmd2 = new Cmd assert(eval(cmd2, "--one=a" :: "b" :: Nil)) assert(cmd2.one == Some("a") && cmd2.two == Some("b")) val cmd3 = new Cmd assert(eval(cmd3, "b" :: "--one=a" :: Nil)) assert(cmd3.one == Some("a") && cmd3.two == Some("b")) val cmd4 = new Cmd assert(eval(cmd4, "--one" :: "a" :: "b" :: Nil)) assert(cmd4.one == Some("a") && cmd4.two == Some("b")) val cmd5 = new Cmd assert(eval(cmd5, "b" :: "--one" :: "a" :: Nil)) assert(cmd5.one == Some("a") && cmd5.two == Some("b")) val cmd6 = new Cmd assert(!eval(cmd6, "--one" :: "--a" :: "b" :: Nil)) val cmd7 = new Cmd assert(!eval(cmd7, "b" :: "--one" :: Nil)) val cmd8 = new Cmd assert(!eval(cmd8, "a" :: "--" :: "--one" :: Nil)) val cmd9 = new Cmd assert(!eval(cmd9, "--one" :: "--" :: "--one" :: "b" :: Nil)) val cmd10 = new Cmd assert(eval(cmd10, "--one=--ab" :: "b" :: Nil)) assert(cmd10.one == Some("--ab") && cmd10.two == Some("b")) } "named arg optional" - { class Cmd extends Command("cmd") { var one: Option[String] = None var two: Option[String] = None named("one") .optionalArg("value") .action(v => one = v) positional("two") .action(v => two = Some(v)) } val cmd1 = new Cmd assert(!eval(cmd1, Nil)) assert(cmd1.one == None && cmd1.two == None) val cmd2 = new Cmd assert(eval(cmd2, "--one=a" :: "b" :: Nil)) assert(cmd2.one == Some("a") && cmd2.two == Some("b")) val cmd3 = new Cmd assert(eval(cmd3, "b" :: "--one=a" :: Nil)) assert(cmd3.one == Some("a") && cmd3.two == Some("b")) val cmd4 = new Cmd assert(eval(cmd4, "--one" :: "a" :: "b" :: Nil)) assert(cmd4.one == Some("a") && cmd4.two == Some("b")) val cmd5 = new Cmd assert(eval(cmd5, "b" :: "--one" :: "a" :: Nil)) assert(cmd5.one == Some("a") && cmd5.two == Some("b")) val cmd6 = new Cmd assert(!eval(cmd6, "--one" :: "--a" :: "b" :: Nil)) val cmd7 = new Cmd assert(eval(cmd7, "b" :: "--one" :: Nil)) assert(cmd7.one == None && cmd7.two == Some("b")) val cmd8 = new Cmd assert(eval(cmd8, "--" :: "--one" :: Nil)) assert(cmd8.one == None && cmd8.two == Some("--one")) val cmd9 = new Cmd assert(eval(cmd9, "--one" :: "a" :: "--" :: "--one" :: Nil)) assert(cmd9.one == Some("a") && cmd9.two == Some("--one")) val cmd10 = new Cmd assert(eval(cmd10, "--one=--ab" :: "b" :: Nil)) assert(cmd10.one == Some("--ab") && cmd10.two == Some("b")) } } }