(defpackage "parzival-tests" (:use :cl :parzival :prove)) (in-package "parzival-tests") (setf prove:*enable-colors* nil) (defmacro test-with ((var input-string) &rest tests) `(subtest (format nil "With the input ~s ..." ,input-string) (let ((,var (make-instance 'replay-streams:character-input-replay-stream :source (make-string-input-stream ,input-string)))) ,@tests))) (defmacro results (stream expr val) (let ((res (gensym)) (ok? (gensym)) (stream2 (gensym))) `(multiple-value-bind (,res ,ok? ,stream2) (parse ,stream ,expr) (is (and ,ok? ,res) ,val (format nil "Parsing with ~s results in ~s" ',expr ',val))))) (defmacro fails (stream expr) (let ((res (gensym)) (ok? (gensym)) (stream2 (gensym))) `(multiple-value-bind (,res ,ok? ,stream2) (parse ,stream ,expr) (unless ,res ; doing this to get rid of warning about unused variable (is ,ok? nil (format nil "Parsing with ~s should fail." ',expr)))))) (test-with (input "hey") (results input (<