aboutsummaryrefslogtreecommitdiff
path: root/src/test/scala/ParserTest.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/scala/ParserTest.scala')
-rw-r--r--src/test/scala/ParserTest.scala140
1 files changed, 128 insertions, 12 deletions
diff --git a/src/test/scala/ParserTest.scala b/src/test/scala/ParserTest.scala
index 11694c4..579ba95 100644
--- a/src/test/scala/ParserTest.scala
+++ b/src/test/scala/ParserTest.scala
@@ -6,22 +6,138 @@ object ParserTest extends TestSuite {
implicit class EliteCommando(line: String) {
def parse(command: Command): Unit = {
- val args = line.split(" ")
- commando.parse(args, command)(err => throw new ParseException(err))
+ val args = line.split(" ").tail
+ commando.parse(args, command, (c, err) => throw new ParseException(err))
+ }
+ def fail(command: Command, message: String): Unit = {
+ val args = line.split(" ").tail
+ try {
+ commando.parse(args, command, (c, err) => throw new ParseException(err))
+ sys.error("parsing succeeded but was expected to fail")
+ } catch {
+ case err: ParseException if err.getMessage.contains(message) =>
+ case err: ParseException =>
+ sys.error(s"parsing failed for the wrong reason: ${err.getMessage}")
+ }
}
}
- val tests = Tests {
- "foo" - {
- val command = cmd("cbx")(
- opt("server", 'S', param = "url" -> false),
- pos("number")
- ).run(
- ctx => println("yoyo, my context was: " + ctx)
+ def cbx(asserts: Command.Arguments => Unit) =
+ cmd("cbx")(
+ opt("server", 's', "name" -> true)
+ ).sub(
+ cmd("version")(
+ opt("verbose", 'v', "k=v" -> false)
+ ).run(asserts),
+ cmd("login")(
+ pos("server_url"),
+ pos("username", false),
+ pos("password", false)
+ ).run(asserts),
+ cmd("run")(
+ opt("file", 'f', "file_name" -> true),
+ opt("force"),
+ pos("pipeline", false)
+ ).run(asserts),
+ cmd("level1")().sub(
+ cmd("level2-1")(
+ pos("p2")
+ ).sub(
+ cmd("level3")(pos("p3")).run(asserts)
+ ),
+ cmd("level2-2")().run(asserts)
)
- "--server x 3 -S 5 --server=2 --server 2".parse(command)
- println(command.usage)
+ )
+
+ val tests = Tests {
+ "print usage" - {
+ cbx(_ => ()).usage
+ }
+ "simple" - {
+ "cbx version" parse cbx { args =>
+ args ==> Map.empty
+ }
+ }
+ "empty allowed optional" - {
+ "cbx version -v" parse cbx { args =>
+ args ==> Map("verbose" -> Seq(""))
+ }
+ "cbx version --verbose" parse cbx { args =>
+ args ==> Map("verbose" -> Seq(""))
+ }
+ }
+ "set allowed optional" - {
+ "cbx version -v x" parse cbx { args =>
+ args ==> Map("verbose" -> Seq("x"))
+ }
+ "cbx version --verbose x" parse cbx { args =>
+ args ==> Map("verbose" -> Seq("x"))
+ }
+ "cbx version --verbose=x" parse cbx { args =>
+ args ==> Map("verbose" -> Seq("x"))
+ }
+ "cbx version --verbose=x=y" parse cbx { args =>
+ args ==> Map("verbose" -> Seq("x=y"))
+ }
+ "cbx version --verbose=x=y,z=w" parse cbx { args =>
+ args ==> Map("verbose" -> Seq("x=y,z=w"))
+ }
+ "cbx version --verbose x=y" parse cbx { args =>
+ args ==> Map("verbose" -> Seq("x=y"))
+ }
+ "cbx version --verbose x=y z=w".fail(cbx(_ => ()), "too many arguments")
+ }
+ "required argument optional" - {
+ "cbx run" parse cbx { _ ==> Map.empty } // make sure it works first
+ "cbx run -f x" parse cbx { _ ==> Map("file" -> Seq("x")) }
+ "cbx run --file x" parse cbx { _ ==> Map("file" -> Seq("x")) }
+ "cbx run --file=x" parse cbx { _ ==> Map("file" -> Seq("x")) }
+ "cbx run --file=x=y,z=w" parse cbx { _ ==> Map("file" -> Seq("x=y,z=w")) }
+ "cbx run --file".fail(cbx(_ => ()), "requires")
+ "cbx run --file --".fail(cbx(_ => ()), "requires")
+ }
+ "no argument optional" - {
+ "cbx run --force=x".fail(cbx(_ => ()), "no argument allowed")
+ "cbx run --force x" parse cbx { _ ==> Map("force" -> Seq(""), "pipeline" -> Seq("x")) }
+ }
+ "global optional" - {
+ "cbx --server run run" parse cbx {_ ==> Map("server" -> Seq("run"))}
+ "cbx -s run run" parse cbx {_ ==> Map("server" -> Seq("run"))}
+ "cbx --server=run run" parse cbx {_ ==> Map("server" -> Seq("run"))}
+ "cbx -x run".fail(cbx(_ => ()), "unknown option")
+ "cbx --x run".fail(cbx(_ => ()), "unknown option")
+ }
+ "positional" - {
+ "cbx login x" parse cbx { _ ==> Map("server_url" -> Seq("x"))}
+ "cbx login x y" parse cbx { _ ==> Map("server_url" -> Seq("x"), "username" -> Seq("y"))}
+ "cbx login x y z" parse cbx { _ ==> Map("server_url" -> Seq("x"), "username" -> Seq("y"), "password" -> Seq("z"))}
+ "cbx login - x y z".fail(cbx(_ => ()), "too many")
+ "cbx login - y" parse cbx { _ ==> Map("server_url" -> Seq("-"), "username" -> Seq("y"))}
+ }
+ "out of order options" - {
+ "cbx run --force pipelinename -f x" parse cbx {
+ _ ==> Map("force" -> Seq(""), "pipeline" -> Seq("pipelinename"), "file" -> Seq("x"))
+ }
+ "cbx run --force -- -f" parse cbx {
+ _ ==> Map("force" -> Seq(""), "pipeline" -> Seq("-f"))
+ }
+ "cbx run --force -- --file" parse cbx {
+ _ ==> Map("force" -> Seq(""), "pipeline" -> Seq("--file"))
+ }
+ "cbx run --force -- --" parse cbx {
+ _ ==> Map("force" -> Seq(""), "pipeline" -> Seq("--"))
+ }
+ "cbx run --force -- -f x".fail(cbx(_ => ()), "too many")
+ }
+ "nested1" - {
+ "cbx level1 level2-1 x=y level3 z" parse cbx {
+ _ ==> Map("p2" -> Seq("x=y"), "p3" -> Seq("z"))
+ }
+ }
+ "nested2" - {
+ "cbx level1 level2-2 --" parse cbx {
+ _ ==> Map.empty
+ }
}
}
-
}