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 | # Opt in to lazy evaluation
|
21 |
|
22 | proc assert ( ; cond LAZY ) {
|
23 | echo hi
|
24 |
|
25 | # TODO: evalExpr() builtin
|
26 | var val = evalExpr(cond)
|
27 | if (not val) {
|
28 | # TODO: if it's an expr.Binary
|
29 | # Then
|
30 | #
|
31 | # Then print $left != $right
|
32 | #
|
33 | # I think you need to introspect on the source code
|
34 | #
|
35 | # Or print '5 != 3'
|
36 | #
|
37 | # Or you can evaluate left and right separately, and then compare them
|
38 |
|
39 | echo
|
40 | }
|
41 | }
|
42 |
|
43 | # What happens when there are duplicate test IDs?
|
44 | #
|
45 | # Also I think filter by "$test_id/$case_id"
|
46 |
|
47 | proc __it (case_id ; ; ; block) {
|
48 | # This uses a clean directory
|
49 | echo TODO
|
50 | }
|
51 |
|
52 | # is this accessible to users?
|
53 | # It can contain a global list of things to run
|
54 |
|
55 | # Naming convention: a proc named 'describe' mutates a global named _describe?
|
56 | # Or maybe _describe_list ?
|
57 |
|
58 | var _describe_list = []
|
59 |
|
60 | proc describe (test_id ; ; ; block) {
|
61 | echo describe
|
62 | = desc
|
63 |
|
64 | # TODO:
|
65 | # - need append
|
66 | # - need ::
|
67 | # _ _describe->append(cmd)
|
68 | #
|
69 | # Need to clean this up
|
70 | # append (_describe, cmd) # does NOT work!
|
71 |
|
72 | _ _describe_list->append(block)
|
73 | }
|
74 |
|
75 | # Problem: this creates a global variable?
|
76 | Args :spec {
|
77 | flag --filter 'Regex of test descriptions'
|
78 | }
|
79 |
|
80 | proc run-tests {
|
81 |
|
82 | # TODO: fix this crap
|
83 | var opt = null
|
84 | var i = null
|
85 | setvar opt, i = parseArgs(spec, ARGV)
|
86 |
|
87 | # TODO:
|
88 | # - parse --filter foo, which you can use eggex for!
|
89 |
|
90 | for cmd in (_describe) {
|
91 | # TODO: print filename and 'describe' name?
|
92 | try {
|
93 | eval (cmd)
|
94 | }
|
95 | if (_status !== 0) {
|
96 | echo 'failed'
|
97 | }
|
98 | }
|
99 | }
|