Login
7 branches 0 tags
Ben (Win10) Moved avl trees into a module e69ddd3 3 years ago 738 Commits
nujel / stdlib_modules / test.nuj
;;;; Nujel - Copyright (C) 2020-2021 - Benjamin Vincent Schulenburg
;;;; This project uses the MIT license, a copy should be included under /LICENSE
[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]

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

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

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

[export reset! [defn reset! []
                     [set! test-list [cons 4 '[+ 3 1]]]
                     [set! test-count 1]]]

[defn display-results []
      "Prints the result Message"
      [random/seed-initialize!]
      [efmtln "Nujel [{System/OS} {System/Architecture}] - {} - [{} / {}] in {} ms - {}"
              [if [and [zero? error-count] [> test-count 0]]
                  "Success"
                  "Failed!"]
              [ansi-green success-count]
              [ansi-red error-count]
              [- [time/milliseconds] nujel-start]
              [if [and [zero? error-count] [> test-count 0]]
                  [ansi-rainbow "Everything is working, very nice!"]
                  [ansi-red "Better fix those!"]]]]

[defn test-success [res-should res-is expr i]
      "Should be called after a test has finished successfully"
      [when print-passes
            [efmtln "{} == {}\r\n{}\r\n\r\n"
                    [ansi-green [string/write res-is]]
                    [ansi-green [string/write res-should]]
                    [string/write expr]]]
      [set! success-count [+ 1 success-count]]]

[defn test-failure [res-should res-is expr i]
      "Should be called if EXPR does not equal RES"
      [when print-errors
            [pfmtln "{} != {}\r\n{}\r\n\r\n"
                    [ansi-red [string/write res-is]]
                    [ansi-green [string/write res-should]]
                    [string/write expr]]]
      [set! error-count [+ 1 error-count]]]

[defn run-test [result rawexpr i]
      "Tests that RAWEXPR evaluates to RESULT"
      [try [fn [err]
               [display/error err]
               [test-failure result [list :exception-caught err] rawexpr i]]
           [def expr [eval rawexpr]]
           [if [equal? result expr]
               [test-success result expr rawexpr i]
               [test-failure result expr rawexpr i]]]]

[export run [defn run [output-passes hide-errors]
                  "Run through all automated Tests"
                  [set! print-errors   [not [bool hide-errors]]]
                  [set! print-passes   [bool output-passes]]
                  [set! nujel-start    [time/milliseconds]]
                  [set! success-count  0]
                  [set! error-count    0]

                  [def i [+ test-count 1]]
                  [doseq [cur-test test-list]
                         [run-test [car cur-test]
                                   [cdr cur-test]
                                   [dec! i]]]

                  [display-results]
                  [return error-count]]]

[reset!]

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