aboutsummaryrefslogblamecommitdiff
path: root/commando/test/src/CommandTest.scala
blob: aca1a77d1f7595fd2853c3413a1201cb0625556d (plain) (tree)
























































































                                                                     
                    






                                                





































































































                                                                   
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" - {
      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 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"))
    }
  }
}