406 lines
14 KiB
Clojure
406 lines
14 KiB
Clojure
(ns cli-matic.help-gen-test
|
|
(:require [clojure.test :refer [is are deftest testing]]
|
|
#?(:clj [cli-matic.platform-macros :refer [try-catch-all]]
|
|
:cljs [cli-matic.platform-macros :refer-macros [try-catch-all]])
|
|
[cli-matic.help-gen :refer [generate-possible-mistypes
|
|
generate-section
|
|
generate-a-command
|
|
generate-global-help
|
|
generate-subcmd-help]]
|
|
[cli-matic.utils-v2 :as U2]))
|
|
|
|
(deftest generate-possible-mistypes-test
|
|
|
|
(are [w c a o]
|
|
(= o (generate-possible-mistypes w c a))
|
|
|
|
;
|
|
"purchasse"
|
|
["purchase" "purchasing" "add" "remove"]
|
|
[nil "PP" "A" "R"]
|
|
["purchase" "purchasing"]))
|
|
|
|
(deftest generate-section-test
|
|
|
|
(are [t l o]
|
|
(= o (-> (generate-section t l)
|
|
flatten
|
|
vec))
|
|
|
|
; full
|
|
"tit"
|
|
["a" "b"]
|
|
["tit:" " a" " b" ""]
|
|
|
|
; empty
|
|
"tittel"
|
|
[]
|
|
[]))
|
|
|
|
(deftest generate-a-command-test
|
|
|
|
(are [c s d o]
|
|
(= o (generate-a-command {:command c :short s :description d}))
|
|
|
|
; full
|
|
"tit" "t" ["a" "b"]
|
|
" tit, t a"
|
|
|
|
; linea singola
|
|
"tit" "t" "singel"
|
|
" tit, t singel"
|
|
|
|
; no description
|
|
"tit" "t" []
|
|
" tit, t ?"))
|
|
|
|
(defn dummy-cmd [_])
|
|
|
|
(def CONFIGURATION-TOYCALC
|
|
{:app {:command "toycalc"
|
|
:description "A command-line toy calculator"
|
|
:version "0.0.1"}
|
|
:global-opts [{:option "base"
|
|
:as "The number base for output"
|
|
:type :int
|
|
:default 10}]
|
|
:commands [{:command "add" :short "a"
|
|
:description ["Adds two numbers together"
|
|
""
|
|
"Looks great, doesn't it?"]
|
|
:opts [{:option "a1" :short "a" :env "AA" :as "First addendum" :type :int :default 0}
|
|
{:option "a2" :short "b" :as "Second addendum" :type :int :default 0}]
|
|
:runs dummy-cmd}
|
|
{:command "sub" :short "s"
|
|
:description "Subtracts parameter B from A"
|
|
:opts [{:option "pa" :short "a" :as "Parameter A" :type :int :default 0}
|
|
{:option "pb" :short "b" :as "Parameter B" :type :int :default 0}]
|
|
:runs dummy-cmd}]})
|
|
|
|
(def CONFIGURATION-TOYCALC-v2
|
|
(U2/convert-config-v1->v2 CONFIGURATION-TOYCALC))
|
|
|
|
(def CONFIGURATION-TOYCALC-NESTED
|
|
{:command "toycalc"
|
|
:description "A command-line toy calculator"
|
|
:version "0.0.1"
|
|
:opts [{:as "The number base for output"
|
|
:default 10
|
|
:option "base"
|
|
:type :int}]
|
|
:subcommands [{:command "add"
|
|
:short "a"
|
|
:description "Adds two numbers together"
|
|
:version "3.3.3"
|
|
:examples ["Example One" "Example Two"]
|
|
:opts [{:as "Addendum 1"
|
|
:option "a"
|
|
:type :int}
|
|
{:as "Addendum 2"
|
|
:default 0
|
|
:option "b"
|
|
:type :int}]
|
|
:runs dummy-cmd}
|
|
{:command "subc"
|
|
:description "Subtracts parameter B from A"
|
|
:examples "Just one example"
|
|
:version "1.2.3"
|
|
:opts [{:as "Parameter q"
|
|
:default 0
|
|
:option "q"
|
|
:type :int}]
|
|
:subcommands [{:command "sub"
|
|
:description "Subtracts"
|
|
:opts [{:as "Parameter A to subtract from"
|
|
:default 0
|
|
:option "a"
|
|
:type :int}
|
|
{:as "Parameter B"
|
|
:default 0
|
|
:option "b"
|
|
:type :int}]
|
|
:runs dummy-cmd}]}]})
|
|
|
|
(deftest generate-global-help-test
|
|
|
|
(is
|
|
(= ["NAME:"
|
|
" toycalc - A command-line toy calculator"
|
|
""
|
|
"USAGE:"
|
|
" toycalc [global-options] command [command options] [arguments...]"
|
|
""
|
|
"VERSION:"
|
|
" 0.0.1"
|
|
""
|
|
"COMMANDS:"
|
|
" add, a Adds two numbers together"
|
|
" sub, s Subtracts parameter B from A"
|
|
""
|
|
"GLOBAL OPTIONS:"
|
|
" --base N 10 The number base for output"
|
|
" -?, --help"
|
|
""]
|
|
(generate-global-help CONFIGURATION-TOYCALC-v2 ["toycalc"]))))
|
|
|
|
(deftest generate-global-help-test-nested
|
|
|
|
(is
|
|
(= ["NAME:"
|
|
" toycalc - A command-line toy calculator"
|
|
""
|
|
"USAGE:"
|
|
" toycalc [global-options] command [command options] [arguments...]"
|
|
""
|
|
"VERSION:"
|
|
" 0.0.1"
|
|
""
|
|
"COMMANDS:"
|
|
" add, a Adds two numbers together"
|
|
" subc Subtracts parameter B from A"
|
|
""
|
|
"GLOBAL OPTIONS:"
|
|
" --base N 10 The number base for output"
|
|
" -?, --help"
|
|
""]
|
|
(generate-global-help CONFIGURATION-TOYCALC-NESTED ["toycalc"])))
|
|
|
|
(is
|
|
(= ["NAME:"
|
|
" toycalc - A command-line toy calculator"
|
|
""
|
|
"USAGE:"
|
|
" toycalc [global-options] command [command options] [arguments...]"
|
|
""
|
|
"VERSION:"
|
|
" 0.0.1"
|
|
""
|
|
"COMMANDS:"
|
|
" add, a Adds two numbers together"
|
|
" subc Subtracts parameter B from A"
|
|
""
|
|
"GLOBAL OPTIONS:"
|
|
" --base N 10 The number base for output"
|
|
" -?, --help"
|
|
""]
|
|
(generate-global-help CONFIGURATION-TOYCALC-NESTED [])))
|
|
|
|
(is
|
|
(= ["NAME:"
|
|
" toycalc subc - Subtracts parameter B from A"
|
|
""
|
|
"USAGE:"
|
|
" toycalc subc [global-options] command [command options] [arguments...]"
|
|
""
|
|
"EXAMPLES:"
|
|
" Just one example"
|
|
""
|
|
"VERSION:"
|
|
" 1.2.3"
|
|
""
|
|
"COMMANDS:"
|
|
" sub Subtracts"
|
|
""
|
|
"GLOBAL OPTIONS:"
|
|
" --q N 0 Parameter q"
|
|
" -?, --help"
|
|
""]
|
|
(generate-global-help CONFIGURATION-TOYCALC-NESTED ["toycalc" "subc"]))))
|
|
|
|
(deftest generate-subcmd-help-test-nested
|
|
(is
|
|
(= ["NAME:"
|
|
" toycalc add - Adds two numbers together"
|
|
""
|
|
"USAGE:"
|
|
" toycalc [add|a] [command options] [arguments...]"
|
|
""
|
|
"EXAMPLES:"
|
|
" Example One"
|
|
" Example Two"
|
|
""
|
|
"VERSION:"
|
|
" 3.3.3"
|
|
""
|
|
"OPTIONS:"
|
|
" --a N Addendum 1"
|
|
" --b N 0 Addendum 2"
|
|
" -?, --help"
|
|
""]
|
|
(generate-subcmd-help CONFIGURATION-TOYCALC-NESTED ["toycalc" "add"]))))
|
|
|
|
(deftest generate-subcmd-help-test
|
|
|
|
(is
|
|
(= ["NAME:"
|
|
" toycalc add - Adds two numbers together"
|
|
" "
|
|
" Looks great, doesn't it?"
|
|
""
|
|
"USAGE:"
|
|
" toycalc [add|a] [command options] [arguments...]"
|
|
""
|
|
"OPTIONS:"
|
|
" -a, --a1 N 0 First addendum [$AA]"
|
|
" -b, --a2 N 0 Second addendum"
|
|
" -?, --help"
|
|
""]
|
|
(generate-subcmd-help CONFIGURATION-TOYCALC-v2 ["toycalc" "add"])))
|
|
|
|
(is
|
|
(= ["NAME:"
|
|
" toycalc sub - Subtracts parameter B from A"
|
|
""
|
|
"USAGE:"
|
|
" toycalc [sub|s] [command options] [arguments...]"
|
|
""
|
|
"OPTIONS:"
|
|
" -a, --pa N 0 Parameter A"
|
|
" -b, --pb N 0 Parameter B"
|
|
" -?, --help"
|
|
""]
|
|
(generate-subcmd-help CONFIGURATION-TOYCALC-v2 ["toycalc" "sub"])))
|
|
|
|
(is
|
|
(= :ERR
|
|
(try-catch-all
|
|
(generate-subcmd-help CONFIGURATION-TOYCALC-v2 ["toycalc" "undefined-cmd"])
|
|
(fn [_] :ERR)))))
|
|
|
|
(def CONFIGURATION-POSITIONAL-TOYCALC
|
|
{:app {:command "toycalc"
|
|
:description "A command-line toy calculator"
|
|
:version "0.0.1"}
|
|
:global-opts [{:option "base"
|
|
:as "The number base for output"
|
|
:type :int
|
|
:default 10}]
|
|
:commands [{:command "add" :short "a"
|
|
:description ["Adds two numbers together"
|
|
""
|
|
"Looks great, doesn't it?"]
|
|
:opts [{:option "a1" :short 0 :env "AA" :as "First addendum" :type :int :default 0}
|
|
{:option "a2" :short 1 :as "Second addendum" :type :int :default 0}]
|
|
:runs dummy-cmd}]})
|
|
|
|
(def CONFIGURATION-POSITIONAL-TOYCALC-v2
|
|
(U2/convert-config-v1->v2 CONFIGURATION-POSITIONAL-TOYCALC))
|
|
|
|
(deftest generate-subcmd-positional-test
|
|
(is
|
|
(= ["NAME:"
|
|
" toycalc add - Adds two numbers together"
|
|
" "
|
|
" Looks great, doesn't it?"
|
|
""
|
|
"USAGE:"
|
|
" toycalc [add|a] [command options] a1 a2"
|
|
""
|
|
"OPTIONS:"
|
|
" --a1 N 0 First addendum [$AA]"
|
|
" --a2 N 0 Second addendum"
|
|
" -?, --help"
|
|
""]
|
|
(generate-subcmd-help CONFIGURATION-POSITIONAL-TOYCALC-v2 ["toycalc" "add"]))))
|
|
|
|
(def CONFIGURATION-MULTILINES
|
|
{:command "multiline"
|
|
:description ["An app description can span"
|
|
"multiple lines."]
|
|
:version "1.2.3"
|
|
:opts [{:option "global-opt"
|
|
:as ["Global opt help"
|
|
"with"
|
|
"multiple lines."]
|
|
:type :int
|
|
:default 10}]
|
|
:subcommands [{:command "mycmd"
|
|
:description ["A command description"
|
|
""
|
|
"Can contain multiple lines."
|
|
"Only the first line is displayed on global help."]
|
|
:opts [{:option "mycmd-opt1" :short "a" :type :int :default 0
|
|
:as ["not really a multiline but just fine"]}
|
|
{:option "long-name-here-should-stretch-things-out" :short "l" :type :keyword
|
|
:as ["testing out how a longer"
|
|
"option affects things."]}
|
|
{:option "opt2" :type :int :default 0
|
|
:as ["text that is long"
|
|
"can be split"
|
|
"over"
|
|
"many"
|
|
"lines"
|
|
"and"
|
|
" will"
|
|
" be"
|
|
" indented"
|
|
" appropriately"
|
|
"and"
|
|
"can"
|
|
"include empty"
|
|
""
|
|
"lines."]}
|
|
{:option "opt3" :short "c" :env "ENV_VAR" :type :string :multiple true :default :present
|
|
:as ["here's what happens to a multiline with"
|
|
"env also set"]}]
|
|
|
|
:runs dummy-cmd}]})
|
|
|
|
(deftest multilines-global-help-test
|
|
(is
|
|
(= ["NAME:"
|
|
" multiline - An app description can span"
|
|
" multiple lines."
|
|
""
|
|
"USAGE:"
|
|
" multiline [global-options] command [command options] [arguments...]"
|
|
""
|
|
"VERSION:"
|
|
" 1.2.3"
|
|
""
|
|
"COMMANDS:"
|
|
" mycmd A command description"
|
|
""
|
|
"GLOBAL OPTIONS:"
|
|
" --global-opt N 10 Global opt help"
|
|
" with"
|
|
" multiple lines."
|
|
" -?, --help"
|
|
""]
|
|
(generate-global-help CONFIGURATION-MULTILINES ["multiline"]))))
|
|
|
|
(deftest multilines-cmd-help-test
|
|
(is
|
|
(= ["NAME:"
|
|
" multiline mycmd - A command description"
|
|
" "
|
|
" Can contain multiple lines."
|
|
" Only the first line is displayed on global help."
|
|
""
|
|
"USAGE:"
|
|
" multiline mycmd [command options] [arguments...]"
|
|
""
|
|
"OPTIONS:"
|
|
" -a, --mycmd-opt1 N 0 not really a multiline but just fine"
|
|
" -l, --long-name-here-should-stretch-things-out S testing out how a longer"
|
|
" option affects things."
|
|
" --opt2 N 0 text that is long"
|
|
" can be split"
|
|
" over"
|
|
" many"
|
|
" lines"
|
|
" and"
|
|
" will"
|
|
" be"
|
|
" indented"
|
|
" appropriately"
|
|
" and"
|
|
" can"
|
|
" include empty"
|
|
" "
|
|
" lines."
|
|
" -c, --opt3 S* here's what happens to a multiline with"
|
|
" env also set [$ENV_VAR]"
|
|
" -?, --help"
|
|
""]
|
|
(generate-subcmd-help CONFIGURATION-MULTILINES ["multiline" "mycmd"]))))
|