From 4640a2a51cba13b935b3670fd4e0c054342aaf2d Mon Sep 17 00:00:00 2001 From: William West Date: Wed, 11 Mar 2015 22:47:17 -0400 Subject: [PATCH] Allow for approx comparison of floats in tests defexample entries may now include a symbol `~>' instead of `=>' which uses an approximate comparison instead of `equal' to compare actual and expected floating-point values. Also, for completeness, add support for the `should-error' symbol `!!>' in `examples-to-docs.el'. This is formatted as the comment ";; Error" --- dev/examples-to-docs.el | 12 +++++++++--- dev/examples-to-tests.el | 2 ++ dev/examples.el | 13 ++++++++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/dev/examples-to-docs.el b/dev/examples-to-docs.el index 6d5044e..f40ce5b 100644 --- a/dev/examples-to-docs.el +++ b/dev/examples-to-docs.el @@ -5,9 +5,15 @@ (defvar functions '()) (defun example-to-string (example) - (let ((actual (car example)) - (expected (nth 2 example))) - (--> (format "%S ;; => %S" actual expected) + (-let* (((actual sym expected) example) + (comment + (cond + ((eq sym '=>) (format "=> %S" expected)) + ((eq sym '~>) (format "~> %S" expected)) + ((eq sym '!!>) (format "Error")) + (t (error "Invalid test case: %S" `(,actual ,sym ,expected)))))) + (--> comment + (format "%S ;; %s" actual it) (replace-regexp-in-string "\\\\\\?" "?" it) (replace-regexp-in-string "\n" "\\n" it t t) (replace-regexp-in-string "\t" "\\t" it t t) diff --git a/dev/examples-to-tests.el b/dev/examples-to-tests.el index 49d6649..bd01637 100644 --- a/dev/examples-to-tests.el +++ b/dev/examples-to-tests.el @@ -3,6 +3,8 @@ (defun example-to-should (actual sym expected) (cond ((eq sym '=>) `(should (equal ,actual ,expected))) + ((eq sym '~>) + `(should (approx-equal ,actual ,expected))) ((eq sym '!!>) `(should-error (eval ',actual) :type ',expected)) (t diff --git a/dev/examples.el b/dev/examples.el index 79ac244..ac09d16 100644 --- a/dev/examples.el +++ b/dev/examples.el @@ -9,6 +9,17 @@ (defun square (num) (* num num)) (defun three-letters () '("A" "B" "C")) +;; Allow approximate comparison of floating-point results, to work +;; around differences in implementation between systems. Use the `~>' +;; symbol instead of `=>' to test the expected and actual values with +;; `approx-equal' +(defvar epsilon 1e-15) +(defun approx-equal (u v) + (or (= u v) + (< (/ (abs (- u v)) + (max (abs u) (abs v))) + epsilon))) + (def-example-group "Maps" "Functions in this category take a transforming function, which is then applied sequentially to each or selected elements of the @@ -977,5 +988,5 @@ new list." (funcall (-prodfn (-compose f ff) (-compose g gg)) input3)))) => t))) ;; Local Variables: -;; eval: (font-lock-add-keywords nil '(("defexamples\\|def-example-group\\| => \\| !!> " (0 'font-lock-keyword-face)) ("(defexamples[[:blank:]]+\\(.*\\)" (1 'font-lock-function-name-face)))) +;; eval: (font-lock-add-keywords nil '(("defexamples\\|def-example-group\\| => \\| !!> \\| ~>" (0 'font-lock-keyword-face)) ("(defexamples[[:blank:]]+\\(.*\\)" (1 'font-lock-function-name-face)))) ;; End: