(use test data-generators) (define (make-falsified-property-condition value rounds) (make-property-condition 'falsified-property 'value value 'rounds rounds)) (define (check-property property value round) (handle-exceptions exn (signal (make-composite-condition (make-falsified-property-condition value round) exn)) (property value))) (define (run-property-test sample-size gen property) (let ((rounds 0)) (gen-for-each sample-size (lambda (value) (set! rounds (add1 rounds)) (unless (check-property property value rounds) (signal (make-composite-condition (make-property-condition 'exn 'message (sprintf "falsified with ~a after ~a try(s)" value rounds)) (make-falsified-property-condition value round))))) gen) #t)) (define current-sample-size (make-parameter 100)) (define test-property (case-lambda ((description gen property) (test-assert description (run-property-test (current-sample-size) gen property))) ((description amount gen property) (test-assert description (run-property-test amount gen property))))) ;; example (test-property "it's always positive" 100 (gen-transform abs (gen-fixnum)) positive?) (test-property "it fails" (gen-fixnum) positive?)