From 4025722943ae814c88da1fa8fe5778cffecce4ad Mon Sep 17 00:00:00 2001 From: colin Date: Sat, 9 Sep 2023 11:09:10 -0700 Subject: Testiere2 Add examples changed some internal names; improved some error messages Added more examples renaming exports Added New Readme --- examples/examples.lisp | 124 ++++++++++++++++++++++++++++++++++++++++++ examples/legacy-examples.lisp | 72 ++++++++++++++++++++++++ 2 files changed, 196 insertions(+) create mode 100644 examples/examples.lisp create mode 100644 examples/legacy-examples.lisp (limited to 'examples') diff --git a/examples/examples.lisp b/examples/examples.lisp new file mode 100644 index 0000000..a188f2f --- /dev/null +++ b/examples/examples.lisp @@ -0,0 +1,124 @@ +(defpackage :testiere.examples + (:use #:cl #:testiere)) + +(defpackage :dummy + (:use #:cl)) + +(in-package :testiere.examples) + +;;; Turn Testiere On. +(testiere-on) + +;;; BASIC TESTS + +(defun add3 (x y z) + "Adds three numbers" + #+testiere + (:tests + (= 6 (add3 1 2 3)) + (:is (evenp (add3 2 2 2))) + (:fails (add3)) + (:fails (add3 1 2 "oh no"))) + (+ x y z)) + +;;; Using external tests + +(defun dummy::test-add10 (n) + "Tests add10 in the same way N times. Obviously useless. We define +this in a separate package to give you an idea that you can embed +tests that aren't part of the package you're testing." + (loop :repeat n :do + (assert (= 13 (add10 3))))) + +(defun add10 (x) + "Adds 10 to X" + #+testiere + (:tests + (:funcall 'dummy::test-add10 1)) + (+ x 10)) + +;;; Adding some context to tests with :LET + +(defvar *count*) + +(defun increment-count (&optional (amount 1)) + "Increments *COUNT* by AMOUNT" + #+testiere + (:tests + (:let ((*count* 5)) + (:funcall #'increment-count) + (= *count* 6) + (:funcall #'increment-count 4) + (= *count* 10)) + (:let ((*count* -10)) + (= (increment-count) -9))) + (incf *count* amount)) + +;;; Stubbing functions with :WITH-DEFUNS + +(defun dummy::make-drakma-request (url) + "Assume this actually makes an HTTP request using drakma" + ) + +(defun test-count-words-in-response () + (assert (= 3 (count-words-in-response "blah")))) + +(defun count-words-in-response (url) + "Fetches a url and counts the words in the response." + #+testiere + (:tests + (:with-defuns + ((dummy::make-drakma-request (url) + (declare (values (simple-array character))) + "Hello there dudes")) + (= 3 (count-words-in-response "dummy-url")) + (:funcall 'test-count-words-in-response))) + (loop + :with resp string := (dummy::make-drakma-request url) + :with in-word? := nil + :for char :across resp + :when (and in-word? (not (alphanumericp char))) + :count 1 :into wc + :and :do (setf in-word? nil) + :when (alphanumericp char) + :do (setf in-word? t) + :finally (return + (if (alphanumericp char) (1+ wc) wc)))) + +;;; Testing Classes + +(defclass point () + ((x + :accessor px + :initform 0 + :initarg :x) + (y + :accessor py + :initform 0 + :initarg :y)) + #+testiere + (:tests + (:let ((pt (make-instance 'point :x 10 :y 20))) + (= 20 (py pt)) + (= 10 (px pt)) + (:is (< (px pt) (py pt)))))) + +;;; Testing Structs + +(defstruct pt + x y + #+testiere + (:tests + (:let ((pt (make-pt :x 10 :y 20))) + (= 20 (pt-y pt)) + (:is (< (pt-x pt) (pt-y pt)))))) + +;;; Testing Types + +(deftype optional-int () + #+testiere + (:tests + (:is (typep nil 'optional-int)) + (:is (typep 10 'optional-int)) + (:is (not (typep "foo" 'optional-int)))) + '(or integer null)) diff --git a/examples/legacy-examples.lisp b/examples/legacy-examples.lisp new file mode 100644 index 0000000..b515b98 --- /dev/null +++ b/examples/legacy-examples.lisp @@ -0,0 +1,72 @@ +(defpackage :testiere.examples + (:use #:cl) + (:import-from #:testiere + #:defun/t + #:with-stubs)) + +(in-package :testiere.examples) + +(defun test-fibble () + (assert (= 13 (fibble 1 2)))) + +(defun/t fibble (x y &key (z 10)) + "Hey, a docstring." + :tests + (:program test-fibble) + :end + (+ x y z)) + +(defvar *count*) + +(defun/t increment-count () + "Increments the *count* variable." + :tests + (:let ((*count* 4)) + (:afterp () (lambda () (= *count* 5))) + (= () 6) + (:outputp () (lambda (x) (= x 7)))) + :end + (incf *count*)) + +(defun/t other-increment-count (&optional (amount 1)) + "Also increments the *count* variable by an optional amount." + :tests + (:let ((*count* 10)) + (= () 11)) + (:let ((*count* 0)) + (= (10) 10) + (:afterp (2) (lambda () (= *count* 12)))) + :end + (incf *count* amount)) + + +(defun just-a-function () + (print "Just a function.")) + +(defun/t call-just-a-function () + "Calls JUST-A-FUNCTION." + :tests + (:with-stubs ((just-a-function () (print "TEMP JUST-A-FUNCTION."))) + (equal () "TEMP JUST-A-FUNCTION.")) + :end + (just-a-function)) + + +(defun make-drakma-request () + "Make an HTTP request using DRAKMA" + ;; implemented elsewhere + ) + +(defun test-url-word-counter () + (with-stubs + ((make-drakma-request () "one two three four five six seven")) + (assert (= (count-words) 7)))) + +(defun/t count-words () + "Fetches a url and counts now many words the page contains." + :tests + (:program test-url-word-counter) + :end + (let ((fetched + (make-drakma-request))) + (1+ (count #\space fetched)))) -- cgit v1.2.3