changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/cli/tests/clap.lisp

changeset 688: 517c65b51e6b
author: Richard Westhaver <ellis@rwest.io>
date: Tue, 01 Oct 2024 21:52:17 -0400
permissions: -rw-r--r--
description: clap tests
688
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; clap.lisp --- CLAP tests
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;; 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Code:
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 (in-package :cli/tests)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 (in-suite :cli)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
 (defcmd flub-thunk
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
   ;; FIX 2024-10-01: 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
   (println *optc*)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
   (println *argc*)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
   (print *opts*)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
   (print *args*))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
 (defparameter *opts* '((:name "foo" :description "bar" :kind string)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
                        (:name "bar" :description "foo" :kind string)))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
 (defparameter *cmd1* (make-cli :cmd :name "holla" :opts *opts* :description "cmd1 description"))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
 (defparameter *cmd2* (make-cli :cmd :name "ayo" :cmds (vector *cmd1*) :opts *opts* :description "cmd1 description"))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
 (defparameter *cmd3* (make-cli :cmd :name "flub" :opts *opts* :thunk 'flub-thunk))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
 (defparameter *cmds* (make-cmds (list `(:name "baz" :description "baz" :opts ,*opts*) *cmd1* *cmd2* *cmd3*)))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
 (defparameter *cli* (make-cli :cli :opts *opts* :cmds *cmds* :description "test cli"))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
 (deftest mixed-args ()
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
   (with-cli (*cli*) '("--foo" "bar" "flub") 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
     (is (string= "bar" (cli-opt-val (aref (opts *cli*) 0))))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
     (is (null (cli-args *cli*)))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
     (do-cmd *cli*)))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
 (deftest cli-ast ()
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
   "Validate the CLI/CLAP/AST parser."
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
   (is (string= (cli-opt-name (cli-node-form (car (ast (proc-args *cli* '("--foo" "1"))))))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
                "foo"))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
   (signals clap-unknown-argument
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
     (proc-args *cli* '("--log" "default" "--foo=11"))))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
 (defmain foo-main (:exit nil)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
   (with-cli (*cli*) ()
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
     (log:trace! "defmain is OK")
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
     t))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
 (deftest clap-main ()
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
   (is (null (funcall #'foo-main))))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
 (deftest clap-basic (:skip t)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
   "test basic CLAP functionality."
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
   (with-cli (*cli* opts cmds args) *args*
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
     (is (eq (make-shorty "test") #\t))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
     (is (equalp (proc-args *cli* '("-f" "baz" "--bar=fax")) ;; not eql
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
51
                 (make-cli-ast 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
52
                  (list (make-cli-node 'opt (find-short-opts *cli* #\f))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
53
                        (make-cli-node 'cmd (find-cmd *cli* "baz"))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
54
                        (make-cli-node 'opt (find-opts *cli* "bar"))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
55
                        (make-cli-node 'arg "fax")))))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
56
     (is (parse-args *cli* '("--bar" "baz" "-f" "yaks")))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
57
     (is (stringp
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
58
        (with-output-to-string (s)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
59
          (print-version *cli* s)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
60
          (print-usage *cli* s)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
61
          (print-help *cli* s))))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
62
   (is (string= "foobar" (cli/clap:parse-string-opt "foobar")))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
63
   (do-cmd *cli*)))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
64
 
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
65
 (deftest clap-opts ()
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
66
   "CLAP opt tests."
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
67
   (make-opt-parser trivial *arg*)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
68
   (is (reduce (lambda (x y) (and x y))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
69
               (loop for k across *cli-opt-kinds* collect (cli-opt-kind-p k))))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
70
   (is (parse-trivial-opt t))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
71
   (is (null (parse-trivial-opt nil))))