(Arne Babenhauserheide)
2017-10-10: simplify and document doctests simplify and document doctests
diff --git a/examples/doctests.w b/examples/doctests.w --- a/examples/doctests.w +++ b/examples/doctests.w @@ -4,6 +4,46 @@ guile -L $(dirname $(dirname $(realpath exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples doctests) main)' -s "$0" "$@" ; !# +;;; doctests --- simple testing by adding procedure-properties with tests. + +;;; Usage + +;; Add a tests property to a procedure to have simple unit tests. + +;; Simple tests: +;; +;; (define (A) +;; #((tests (test-eqv 'A (A)) +;; (test-assert #t))) +;; 'A) +;; +;; Named tests: +;; +;; (define (A) +;; #((tests ('test1 (test-eqv 'A (A)) +;; (test-assert #t)) +;; ('test2 (test-assert #t)))) +;; 'A) +;; +;; Allows for docstrings: +;; +;; (define (A) +;; "returns 'A" +;; #((tests (test-eqv 'A (A)) +;; (test-assert #t))) +;; 'A) + +;; For writing the test before the implementation, start with the test and #f: + +;; (define (A) +;; #((tests (test-eqv 'A (A)))) +;; #f) + +;; With wisp, you currently need to use the literal #((tests (...))) +;; TODO: add array parsing to wisp following quoting with ': +;; # a b → #(a b) and # : a b c → #((a b)) + + define-module : examples doctests . #:export : doctests-testmod @@ -58,7 +98,7 @@ define : doctests-extract-from-string s define : subtract a b . "Subtract B from A." - . #((tests ((test-eqv 3 (subtract 5 2))))) ;; TODO: remove the double paren + . #((tests (test-eqv 3 (subtract 5 2)))) - a b define : doctests-testmod mod @@ -80,63 +120,61 @@ define : doctests-testmod mod filename if (module-filename mod) (string-join (string-split (module-filename mod) #\/ ) "-") string-join (cons "._" (map symbol->string (module-name mod))) "-" - docstrings - map (λ (x) (if (procedure? x) (procedure-documentation x))) - map (λ (x) (module-ref mod x)) names doctests map (λ (x) (if (procedure? x) (procedure-property x 'tests))) map (λ (x) (module-ref mod x)) names let loop : names names - docstrings docstrings doctests doctests ;; pretty-print doctests ;; newline - when : not : null? docstrings - when doctests - let* - : name : car names - docstring : car docstrings - - let loop-tests - : doctest : car doctests - when : and (pair? doctest) (car doctest) : pair? : car doctest - ;; pretty-print : car doctest - ;; newline - let* - : - testid - match : car doctest - : ('quote id) tests ... - string-join : list filename (symbol->string name) : symbol->string id - . "--" - : tests ... - string-join : list filename (symbol->string name) - . "--" - body - match : car doctest - : ('quote id) tests ... - . tests - : tests ... - . tests - cleaned - cons 'begin - cons '(import (srfi srfi-64)) - cons - list 'test-begin : or testid "" - append - . body - list : list 'test-end : or testid "" - ;; pretty-print testid - ;; pretty-print body - ;; pretty-print cleaned - ;; newline - when cleaned - let : - eval cleaned mod - newline - loop-tests : cdr doctest - loop (cdr names) (cdr docstrings) (cdr doctests) + when : pair? doctests + let* + : name : car names + doctest : car doctests + let loop-tests + : doctest doctest + when : and (pair? doctest) (car doctest) : pair? : car doctest + ;; pretty-print : car doctest + ;; newline + let* + : + testid + match doctest + : (('quote id) tests ...) moretests ... + string-join : list filename (symbol->string name) : symbol->string id + . "--" + : tests ... + string-join : list filename (symbol->string name) + . "--" + body + match doctest + : (('quote id) test tests ...) moretests ... + cons test tests + : tests ... + . tests + cleaned + cons 'begin + cons '(import (srfi srfi-64)) + cons + list 'test-begin : or testid "" + append + . body + list : list 'test-end : or testid "" + ;; pretty-print testid + ;; pretty-print body + ;; pretty-print cleaned + ;; newline + when cleaned + let : + eval cleaned mod + newline + match doctest + : (('quote id) tests ...) moretests ... + loop-tests moretests + : tests ... + . #t + loop (cdr names) (cdr doctests) define %this-module : current-module define : main args