Login
7 branches 0 tags
Ben (Win10) Symbol now get collectd and exit on heap fill a392d09 4 years ago 312 Commits
nujel / stdlib / testing-framework.nuj
; Nujel - Copyright (C) 2020-2021 - Benjamin Vincent Schulenburg
; This project uses the MIT license, a copy should be included under /LICENSE

[def test-context "Nujel"]

[def test-list   #nil]
[def test-count     0]
[def nujel-start    0]
[def success-count  0]
[def error-count    0]
[def print-errors  #t]
[def print-passes  #f]

[defun test/add* [result expr]
       [set! test-list [cons [cons result expr] test-list]]
       [set! test-count [+ test-count 1]]]

[defmacro test/add [result ...expr]
       "Add a test where ...EXPR must eval to RESULT"
       `[test/add* ~result ~[list 'quote [cons 'do ...expr]]]]

[defun display-results []
       "Prints the result Message"
       [random/seed-initialize!]
       [error [cat test-context " [" OS " " ARCH "] - "
                   [if [and [zero? error-count] [> test-count 0]]
                       "Success - ["
                       "Failed! - ["]
                   [ansi-green success-count]
                   " / "
                   [ansi-red error-count]
                   "] in "
                   [- [time/milliseconds] nujel-start]
                   "ms - "
                   [if [and [zero? error-count] [> test-count 0]]
                       [ansi-rainbow "Everything is working, very nice!"]
                       [ansi-red "Better fix those!"]]
                   "\r\n"]]]

[defun test-success [res-should res-is expr i]
       "Should be called after a test has finished successfully"
       [when print-passes [error [cat "stdlib/tests.nuj:" i ":1: "
                                      [ansi-green "[PASS] -> "]
                                      [ansi-green [str/write res-is]]
                                      " != "
                                      [ansi-green [str/write res-should]]
                                      "\r\n"
                                      [str/write expr]
                                      "\r\n\r\n"]]]
       [set! success-count [+ 1 success-count]]]

[defun test-failure [res-should res-is expr i]
       "Should be called if EXPR does not equal RES"
       [when print-errors [error [cat "stdlib/tests.nuj:" i ":1: "
                                      [ansi-red "[FAIL] -> "]
                                      [ansi-red [str/write res-is]]
                                      " != "
                                      [ansi-green [str/write res-should]]
                                      "\r\n"
                                      [str/write expr]
                                      "\r\n\r\n"]]]
       [set! error-count [+ 1 error-count]]]

[defun test-default [result rawexpr i]
       "Tests that RAWEXPR evaluates to RESULT"
       [try [\ [err] [test-failure result err rawexpr i]]
            [def expr [eval rawexpr]]
            [def pred? ==]
            [when [pair? result]
                  [set! pred? list-equal?]]
            [if [pred? result expr]
                [test-success result expr rawexpr i]
                [test-failure result expr rawexpr i]]]]

[defun test-forked [nujel-runtime]
       [\ [result rawexpr i]
         "Tests that RAWEXPR evaluates to RESULT in a separate runtime"
          [def eval-result [eval/forked nujel-runtime rawexpr]]
          [def expr [cdr eval-result]]
          [def pred? ==]
          [when-not [string? result]
                    [set! expr [car [read expr]]]
          ]
          [when [pair? result]
                [set! pred? list-equal?]
          ]
          [if [and [zero? [car eval-result]]
                   [pred? result expr]]
              [test-success result expr rawexpr i]
              [test-failure result expr rawexpr i]]]]

[defun test-run-iter [test l i]
  "Recurse through LIST and runs eatch test"
       [when l
             [test [caar l] [cdar l] i]
             [test-run-iter test [cdr l] [- i 1]]]]

[defun test-run-real [test]
       [set! nujel-start    [time/milliseconds]]
       [set! success-count  0]
       [set! error-count    0]
       [test-run-iter test test-list test-count]
       [display-results]
       error-count]

[defun test-run [output-passes hide-errors]
       "Run through all automated Tests"
       [set! print-errors  [not [bool hide-errors]]]
       [set! print-passes  [bool output-passes]]
       [test-run-real test-default]]

[defun test-run-forked [\ [nujel-runtime output-passes hide-errors]
       "Run through all automated Tests in a separate runtime"
       [set! print-errors  [not [bool hide-errors]]]
       [set! print-passes  [bool output-passes]]
       [test-run-real [test-forked nujel-runtime]]]]

; [error"Evaluating comments is a terrible Idea!"] [newline] [exit 2]