test/tests.lisp @ cd52795d9ecd
default tip
Update URLs
author |
Steve Losh <steve@stevelosh.com> |
date |
Tue, 14 Jan 2020 19:53:05 -0500 |
parents |
a4f701ecf78c |
children |
(none) |
(in-package :pcg.test)
;;;; Utils --------------------------------------------------------------------
(defmacro define-test (name &body body)
`(test ,(symb 'test- name)
(let ((*package* ,*package*))
,@body)))
(defmacro gimme (n &body body)
`(loop :repeat ,n :collect (progn ,@body)))
(defun run-tests ()
(1am:run))
;;;; Tests --------------------------------------------------------------------
(defparameter *iterations* 200)
(defparameter *run-length* 5000)
(define-test seeding
(loop :repeat *iterations*
:for seed = (random (expt 2 64))
:for stream = (random (expt 2 32))
:for a = (make-pcg :seed seed :stream-id stream)
:for b = (make-pcg :seed seed :stream-id stream)
:for a-vals = (gimme 200 (pcg-random a (1- (expt 2 32))))
:for b-vals = (gimme 200 (pcg-random b (1- (expt 2 32))))
:do (is (equal a-vals b-vals))))
(define-test rewind
(loop :repeat *iterations*
:do (let ((g (make-pcg))
(a nil)
(b nil)
(bound (1+ (random 50000))))
(setf a (gimme 20 (pcg-random g bound)))
(pcg-rewind g 20) ; Rewind to start
(setf b (gimme 20 (pcg-random g bound)))
(is (equal a b))
(setf a (gimme 10 (pcg-random g bound)))
(pcg-rewind g 10) ; Rewind back to midpoint
(setf b (gimme 10 (pcg-random g bound)))
(is (equal a b)))))
(define-test upper-bound
(loop :repeat *iterations*
:for bound = (1+ (random 50))
:for gen = (make-pcg)
:for vals = (gimme *run-length* (pcg-random gen bound))
:do (is (every (lambda (n) (<= 0 n (1- bound)))
vals))))
(define-test bounds-exclusive
(loop :repeat *iterations*
:for min = (- (random 50) 25)
:for max = (+ min 1 (random 10))
:for gen = (make-pcg)
:for vals = (gimme *run-length* (pcg-random gen min max))
:do (is (every (lambda (n) (<= min n (1- max)))
vals))))
(define-test bounds-inclusive
(loop :repeat *iterations*
:for min = (- (random 50) 25)
:for max = (+ min 1 (random 10))
:for gen = (make-pcg)
:for vals = (gimme *run-length* (pcg-random gen min max t))
:do (is (every (lambda (n) (<= min n max))
vals))))
(define-test bounds-floats
(loop :repeat *iterations*
:for min = (- (random 50.0) 25)
:for max = (+ min 1 (random 10.0))
:for gen = (make-pcg)
:for vals = (gimme *run-length* (pcg-random gen min max))
:do (is (every (lambda (n) (<= min n max))
vals))))
(define-test degenerate-bounds
(loop :repeat *iterations*
:for gen = (make-pcg)
:for vals = (gimme *run-length* (pcg-random gen 1))
:do (is (every #'zerop vals))))
(define-test type-coercion
(let ((gen (make-pcg)))
(is (floatp (pcg-random gen 1.0)))
(is (floatp (pcg-random gen 0.0 1.0)))
(is (floatp (pcg-random gen 0 1.0)))
(is (floatp (pcg-random gen 0.0 1)))
(is (integerp (pcg-random gen 10)))
(is (integerp (pcg-random gen 0 10)))
(is (integerp (pcg-random gen 0 10 t)))))