aboutsummaryrefslogblamecommitdiff
path: root/src/test/scala/CmdTest.scala
blob: f78611d7aa5edefef69657b4e3e2f55cbd3c6fe6 (plain) (tree)
1
2
3
4
5
6
7
8
9
                




                                   
                             
          
                                                                              
                     
                
                                                                                        
                             


                                                        
                           


                                                                                             

                                            

                                                                                   
                                             

   
                                                                                      




                              
                                                          












































































































































































                                                                                                            
package commando

import utest._

object CmdTests extends TestSuite {

  val cbx = commando.Command(
    "cbx",
    commando.Optional("server", Some('s'), Some(commando.Positional("name"))),
    commando.Command(
      "version",
      commando.Optional("verbose", Some('v'), Some(commando.Positional("k=v", false)))),
    commando.Command("login",
                commando.Positional("server_url"),
                commando.Positional("username", false),
                commando.Positional("password", false)),
    commando.Command("run",
                commando.Optional("file", Some('f'), Some(commando.Positional("file_name"))),
                commando.Optional("force", None),
                commando.Positional("pipeline", false)),
    commando.Command("level1",
                commando.Command("level2-1",
                            commando.Positional("p2"),
                            commando.Command("level3", commando.Positional("p3"))),
                commando.Command("level2-2"))
  )

  def parse(in: String): CommandLine = commando.parse(cbx, in.split(" ").tail) match {
    case Left(ex) => throw ex
    case Right(res) => res
  }

  def shouldFail(in: String) =
    assert(commando.parse(cbx, in.split(" ").tail).isLeft)

  val tests = Tests {
    "printUsage" - {
      cbx.usage
    }
    "simple" - {
      assert(
        parse("cbx version").subcommand.get == CommandLine("version",
                                                           Map.empty,
                                                           None))
    }
    "emptyAllowedOption" - {
      assert(
        parse("cbx version -v").subcommand.get == CommandLine(
          "version",
          Map("verbose" -> ""),
          None))
      assert(
        parse("cbx version --verbose").subcommand.get == CommandLine(
          "version",
          Map("verbose" -> ""),
          None))
    }
    "setAllowedOption" - {
      assert(
        parse("cbx version -v x").subcommand.get == CommandLine(
          "version",
          Map("verbose" -> "x"),
          None))
      assert(
        parse("cbx version --verbose x").subcommand.get == CommandLine(
          "version",
          Map("verbose" -> "x"),
          None))
      assert(
        parse("cbx version --verbose=x").subcommand.get == CommandLine(
          "version",
          Map("verbose" -> "x"),
          None))
      assert(
        parse("cbx version --verbose=x=y").subcommand.get == CommandLine(
          "version",
          Map("verbose" -> "x=y"),
          None))
      assert(
        parse("cbx version --verbose=x=y,z=w").subcommand.get == CommandLine(
          "version",
          Map("verbose" -> "x=y,z=w"),
          None))
      assert(
        parse("cbx version --verbose x=y,z=w").subcommand.get == CommandLine(
          "version",
          Map("verbose" -> "x=y,z=w"),
          None))
      shouldFail("cbx version --verbose x=y z=w")
    }
    "requiredArgOption" - {
      assert(parse("cbx run").subcommand.get == CommandLine("run", Map(), None)) // make sure it works first
      assert(
        parse("cbx run -f x").subcommand.get == CommandLine("run",
                                                            Map("file" -> "x"),
                                                            None))
      assert(
        parse("cbx run --file x").subcommand.get == CommandLine(
          "run",
          Map("file" -> "x"),
          None))
      assert(
        parse("cbx run --file=x").subcommand.get == CommandLine(
          "run",
          Map("file" -> "x"),
          None))
      assert(
        parse("cbx run --file=x=y,z=w").subcommand.get == CommandLine(
          "run",
          Map("file" -> "x=y,z=w"),
          None))
      shouldFail("cbx run --file")
      shouldFail("cbx run --file --")
    }
    "noArgOption" - {
      shouldFail("cbx run --force=x")
      assert(
        parse("cbx run --force x").subcommand.get == CommandLine(
          "run",
          Map("force" -> "", "pipeline" -> "x"),
          None))
    }
    "globalOption" - {
      assert(parse("cbx --server run run").arguments == Map("server" -> "run"))
      assert(
        parse("cbx --server run run").subcommand.get == CommandLine("run",
                                                                    Map.empty,
                                                                    None))
      assert(parse("cbx -s run run").arguments == Map("server" -> "run"))
      assert(
        parse("cbx -s run run").subcommand.get == CommandLine("run",
                                                              Map.empty,
                                                              None))
      assert(parse("cbx --server=run run").arguments == Map("server" -> "run"))
      assert(
        parse("cbx --server=run run").subcommand.get == CommandLine("run",
                                                                    Map.empty,
                                                                    None))
      shouldFail("cbx -x run")
      shouldFail("cbx --x run")
    }
    "parameter" - {
      assert(
        parse("cbx login x").subcommand.get == CommandLine(
          "login",
          Map("server_url" -> "x"),
          None))
      assert(
        parse("cbx login x y").subcommand.get == CommandLine(
          "login",
          Map("server_url" -> "x", "username" -> "y"),
          None))
      assert(
        parse("cbx login x y z").subcommand.get == CommandLine(
          "login",
          Map("server_url" -> "x", "username" -> "y", "password" -> "z"),
          None))
      shouldFail("cbx login - y z w")
      assert(
        parse("cbx login - y").subcommand.get == CommandLine(
          "login",
          Map("server_url" -> "-", "username" -> "y"),
          None))
    }
    "outOfOrderOptions" - {
      assert(
        parse("cbx run --force pipelinename -f x").subcommand.get == CommandLine(
          "run",
          Map("force" -> "", "pipeline" -> "pipelinename", "file" -> "x"),
          None))
      assert(
        parse("cbx run --force -- -f").subcommand.get == CommandLine(
          "run",
          Map("force" -> "", "pipeline" -> "-f"),
          None))
      assert(
        parse("cbx run --force -- --file").subcommand.get == CommandLine(
          "run",
          Map("force" -> "", "pipeline" -> "--file"),
          None))
      assert(
        parse("cbx run --force -- --").subcommand.get == CommandLine(
          "run",
          Map("force" -> "", "pipeline" -> "--"),
          None))
      shouldFail("cbx run --force -- -f x") // too many parameters
    }
    "nested1" - {
      val line = parse("cbx level1 level2-1 x=y level3 z").subcommand.get
      val expected = CommandLine(
        "level1",
        Map.empty,
        Some(
          CommandLine("level2-1",
                      Map("p2" -> "x=y"),
                      Some(CommandLine("level3", Map("p3" -> "z"), None)))))
      assert(line == expected)
    }
    "nested2" - {
      val line = parse("cbx level1 level2-2 --").subcommand.get
      val expected = CommandLine("level1",
                                 Map.empty,
                                 Some(CommandLine("level2-2", Map.empty, None)))
      assert(line == expected)
    }
  }
}