1 | # testing.ysh
|
2 | #
|
3 | # Usage:
|
4 | # source --builtin testing.sh
|
5 | #
|
6 | # func f(x) { return (x + 1) }
|
7 | #
|
8 | # describe foo {
|
9 | # assert (43 === f(42))
|
10 | # }
|
11 | #
|
12 | # if is-main {
|
13 | # run-tests @ARGV # --filter
|
14 | # }
|
15 |
|
16 | module stdlib/testing || return 0
|
17 |
|
18 | source --builtin args.ysh
|
19 |
|
20 | proc assert ( ; cond ; fail_message='default fail message') {
|
21 | echo 'hi from assert'
|
22 |
|
23 | = cond
|
24 |
|
25 | # I think this might be ready now?
|
26 |
|
27 | var val = evalExpr(cond)
|
28 |
|
29 | echo
|
30 | echo 'value'
|
31 | = val
|
32 | pp line (val)
|
33 |
|
34 | = fail_message
|
35 |
|
36 | if (val) {
|
37 | echo 'OK'
|
38 | } else {
|
39 | var m = evalExpr(fail_message)
|
40 | echo "FAIL - this is where we extract the string - $m"
|
41 | }
|
42 | }
|
43 |
|
44 | proc test-assert {
|
45 | var x = 42
|
46 | assert [42 === x]
|
47 | }
|
48 |
|
49 | proc test-expr ( ; expr ) {
|
50 | echo 'expr'
|
51 | pp line (expr)
|
52 | }
|
53 |
|
54 | proc test-named ( ; ; n=^[99] ) {
|
55 | echo 'n'
|
56 | pp line (n)
|
57 | }
|
58 |
|
59 | # What happens when there are duplicate test IDs?
|
60 | #
|
61 | # Also I think filter by "$test_id/$case_id"
|
62 |
|
63 | proc __it (case_id ; ; ; block) {
|
64 | # This uses a clean directory
|
65 | echo TODO
|
66 | }
|
67 |
|
68 | # is this accessible to users?
|
69 | # It can contain a global list of things to run
|
70 |
|
71 | # Naming convention: a proc named 'describe' mutates a global named _describe?
|
72 | # Or maybe _describe_list ?
|
73 |
|
74 | var _describe_list = []
|
75 |
|
76 | proc describe (test_id ; ; ; block) {
|
77 | echo describe
|
78 | #= desc
|
79 |
|
80 | # TODO:
|
81 | # - need append
|
82 | # - need ::
|
83 | # _ _describe->append(cmd)
|
84 | #
|
85 | # Need to clean this up
|
86 | # append (_describe, cmd) # does NOT work!
|
87 |
|
88 | call _describe_list->append(block)
|
89 | }
|
90 |
|
91 | proc Args {
|
92 | echo TODO
|
93 | }
|
94 |
|
95 | # Problem: this creates a global variable?
|
96 | Args (&spec) {
|
97 | flag --filter 'Regex of test descriptions'
|
98 | }
|
99 |
|
100 | proc run-tests {
|
101 | var opt, i = parseArgs(spec, ARGV)
|
102 |
|
103 | # TODO:
|
104 | # - parse --filter foo, which you can use eggex for!
|
105 |
|
106 | for cmd in (_describe) {
|
107 | # TODO: print filename and 'describe' name?
|
108 | try {
|
109 | eval (cmd)
|
110 | }
|
111 | if (_status !== 0) {
|
112 | echo 'failed'
|
113 | }
|
114 | }
|
115 | }
|