aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/aedifex/cli.lux
blob: e41f3e44c21e53c12720ee1e2cfd230331c620b3 (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
(.module:
  [library
   [lux "*"
    ["_" test {"+" [Test]}]
    [abstract
     [monad {"+" [do]}]
     [\\specification
      ["$[0]" equivalence]]]
    [control
     [pipe {"+" [case>]}]
     ["[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} (list& "auto" (..compilation_format compilation))))

(def: without_profile
  Test
  (do random.monad
    [expected ..command]
    (_.test "Without profile."
            (|> expected
                ..format
                (cli.result /.command)
                (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
                (list& "with" expected_profile)
                (cli.result /.command)
                (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
                            ))))))