aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/aedifex/cli.lux
blob: 3f3f79b1cab4a3fe1c5acefb90cee832be95d7e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
(.using
 [library
  [lux "*"
   ["_" test {"+" Test}]
   [abstract
    [monad {"+" do}]
    [\\specification
     ["$[0]" equivalence]]]
   [control
    ["[0]" pipe]
    ["[0]" try]
    [parser
     ["[0]" cli]]]
   [data
    ["[0]" text]
    [collection
     ["[0]" list]]]
   [math
    ["[0]" random {"+" Random} ("[1]#[0]" monad)]]]]
 [\\program
  ["[0]" /
   ["/[1]" // "_"
    ["[1]" profile]]]])

(def: compilation
  (Random /.Compilation)
  (random.or (random#in [])
             (random#in [])))

(def: command
  (Random /.Command)
  ($_ random.or
      ... #Version
      (random#in [])
      ... #Clean
      (random#in [])
      ... #POM
      (random#in [])
      ... #Dependencies
      (random#in [])
      ... #Install
      (random#in [])
      ... #Deploy
      ($_ random.and
          (random.ascii/alpha 1)
          (random.ascii/alpha 1)
          (random.ascii/alpha 1))
      ... #Compilation
      ..compilation
      ... #Auto
      ..compilation))

(def: (compilation_format value)
  (-> /.Compilation (List Text))
  (case value
    {/.#Build} (list "build")
    {/.#Test} (list "test")))

(def: (format value)
  (-> /.Command (List Text))
  (case value
    {/.#Version} (list "version")
    {/.#Clean} (list "clean")
    {/.#POM} (list "pom")
    {/.#Dependencies} (list "deps")
    {/.#Install} (list "install")
    {/.#Deploy repository [user password]} (list "deploy" repository user password)
    {/.#Compilation compilation} (..compilation_format compilation)
    {/.#Auto compilation} (partial_list "auto" (..compilation_format compilation))))

(def: without_profile
  Test
  (do random.monad
    [expected ..command]
    (_.test "Without profile."
            (|> expected
                ..format
                (cli.result /.command)
                (pipe.case
                  {try.#Success [names actual]}
                  (and (# (list.equivalence text.equivalence) = (list //.default) names)
                       (# /.equivalence = expected actual))
                  
                  {try.#Failure error}
                  false)))))

(def: with_profile
  Test
  (do random.monad
    [expected_profile (random.ascii/alpha 1)
     expected_command ..command]
    (_.test "With profile."
            (|> expected_command
                ..format
                (partial_list "with" expected_profile)
                (cli.result /.command)
                (pipe.case
                  {try.#Success [actual_profile actual_command]}
                  (and (# (list.equivalence text.equivalence) = (list expected_profile //.default) actual_profile)
                       (# /.equivalence = expected_command actual_command))
                  
                  {try.#Failure error}
                  false)))))

(def: .public test
  Test
  (<| (_.covering /._)
      (_.for [/.Compilation /.Command]
             ($_ _.and
                 (_.for [/.equivalence]
                        ($equivalence.spec /.equivalence ..command))

                 (_.for [/.command]
                        ($_ _.and
                            ..without_profile
                            ..with_profile
                            ))))))