| 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 | }
|