Default minimum for gen-integer is most-negative-fixnum - 1, not most-negative-fixnum...
[fiveam.git] / src / random.lisp
index 0f66f84..bb4ba9e 100644 (file)
@@ -2,7 +2,7 @@
 
 (in-package :it.bese.FiveAM)
 
-;;;; * Random (QuickCheck-ish) testing
+;;;; ** Random (QuickCheck-ish) testing
 
 ;;;; FiveAM provides the ability to automatically generate a
 ;;;; collection of random input data for a specific test and run a
@@ -104,7 +104,7 @@ returning true. This second run limit prevents that.")
 (defclass for-all-test-never-run (test-failure for-all-test-result)
   ())
 
-;;;; ** Generators.
+;;;; *** Generators
 
 ;;;; Since this is random testing we need some way of creating random
 ;;;; data to feed to our code. Generators are regular functions whcih
@@ -117,11 +117,17 @@ returning true. This second run limit prevents that.")
      (lambda () ,@body)))
 
 (defgenerator gen-integer (&key (max (1+ most-positive-fixnum))
-                                (min (1+ most-negative-fixnum)))
+                                (min (1- most-negative-fixnum)))
   (+ min (random (1+ (- max min)))))
 
-(defgenerator gen-character (&key (code (gen-integer :min 0 :max (1- char-code-limit))))
-  (code-char (funcall code)))
+(defgenerator gen-character (&key (code (gen-integer :min 0 :max (1- char-code-limit)))
+                                  (alphanumericp nil))
+  (if alphanumericp
+      (code-char (funcall code))
+      (loop
+         for char = (code-char (funcall code))
+         until (alphanumericp char)
+         finally (return char))))
 
 (defun gen-string (&key
                    (length (gen-integer :min 0 :max 80))