+(defun byte-array-to-hex-string (bytevec)
+ (format nil "~(~{~2,'0X~}~)" (coerce bytevec 'list)))
+
+(defun one-shot-test (string)
+ (md5sum-string string :external-format :ascii))
+
+(defun incremental-test (string)
+ (let ((bytevec (sb-ext:string-to-octets string :external-format :ascii))
+ (state (sb-md5:make-md5-state)))
+ (dotimes (i (length bytevec) (sb-md5:finalize-md5-state state))
+ (sb-md5:update-md5-state state bytevec :start i :end (1+ i)))))
+
+(defun fill-pointer-test (string)
+ (let* ((bytevec (sb-ext:string-to-octets string :external-format :ascii))
+ (fillvec (let ((x (make-array (* 2 (length bytevec))
+ :fill-pointer 0
+ :element-type '(unsigned-byte 8))))
+ (dotimes (i (length bytevec) x)
+ (vector-push (aref bytevec i) x)))))
+ (sb-md5:md5sum-sequence fillvec)))
+
+(eval-when (:compile-toplevel :load-toplevel :execute)
+(defun tests-for-test-suite (basename index string expected-result)
+ (loop for (test-kind testfun) in '(("ONE-SHOT" one-shot-test)
+ ("INCREMENTAL" incremental-test)
+ ("FILL-POINTER" fill-pointer-test))
+ collect `(deftest ,(intern (format nil "~A.~A.~A" basename test-kind index))
+ (string= (byte-array-to-hex-string (funcall ',testfun ,string))
+ ,expected-result)
+ t) into test-forms
+ finally (return `(progn ,@test-forms))))
+) ; EVAL-WHEN
+