OILS / stdlib / testing.ysh View on Github | oilshell.org

115 lines, 55 significant
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
16module stdlib/testing || return 0
17
18source --builtin args.ysh
19
20proc 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
44proc test-assert {
45 var x = 42
46 assert [42 === x]
47}
48
49proc test-expr ( ; expr ) {
50 echo 'expr'
51 pp line (expr)
52}
53
54proc 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
63proc __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
74var _describe_list = []
75
76proc 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
91proc Args {
92 echo TODO
93}
94
95# Problem: this creates a global variable?
96Args (&spec) {
97 flag --filter 'Regex of test descriptions'
98}
99
100proc 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}