;; Property-based testing extension for SRFI 64. ;; SPDX-License-Identifier: MIT ;; Copyright 2024 Antero Mejr ;; Permission is hereby granted, free of charge, to any person ;; obtaining a copy of this software and associated documentation ;; files (the "Software"), to deal in the Software without ;; restriction, including without limitation the rights to use, copy, ;; modify, merge, publish, distribute, sublicense, and/or sell copies ;; of the Software, and to permit persons to whom the Software is ;; furnished to do so, subject to the following conditions: ;; The above copyright notice and this permission notice shall be ;; included in all copies or substantial portions of the Software. ;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ;; BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ;; ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ;; CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ;; SOFTWARE. (define-library (srfi 252) (import (scheme base) (scheme case-lambda) (srfi 64) (srfi 252 generators) (chicken condition)) (export test-property test-property-expect-fail test-property-skip test-property-error test-property-error-type property-test-runner ;; Generator procedures boolean-generator bytevector-generator char-generator string-generator symbol-generator ;; exact number generators exact-complex-generator exact-integer-generator exact-number-generator exact-rational-generator exact-real-generator exact-integer-complex-generator ;; inexact number generators inexact-complex-generator inexact-integer-generator inexact-number-generator inexact-rational-generator inexact-real-generator ;; Unions of numerical generators complex-generator integer-generator number-generator rational-generator real-generator ;; Special generators list-generator-of pair-generator-of procedure-generator-of vector-generator-of) (begin ;; Number of property tests to run by default. (define default-runs 100) ;; Runner (define property-test-runner test-runner-create) ;; Test procedures (define (prop-test property generators runs) (unless (and (integer? runs) (not (negative? runs))) (error "runs must be a non-negative integer" runs)) (do ((n 0 (+ n 1))) ((= n runs)) (test-assert (apply property (let ((args (map (lambda (gen) (gen)) generators)) (runner (test-runner-current))) (test-result-set! runner 'property-test-arguments args) (test-result-set! runner 'property-test-iteration (+ n 1)) (test-result-set! runner 'property-test-iterations runs) args))))) (define (prop-test-error type property generators runs) (unless (and (integer? runs) (not (negative? runs))) (error "runs must be a non-negative integer" runs)) (do ((n 0 (+ n 1))) ((= n runs)) (test-error type (apply property (let ((args (map (lambda (gen) (gen)) generators)) (runner (test-runner-current))) (test-result-set! runner 'property-test-arguments args) (test-result-set! runner 'property-test-iteration (+ n 1)) (test-result-set! runner 'property-test-iterations runs) args))))) (define test-property-error (case-lambda ((property generators) (prop-test-error #t property generators default-runs)) ((property generators n) (prop-test-error #t property generators n)))) (define test-property-error-type (case-lambda ((type property generators) (prop-test-error type property generators default-runs)) ((type property generators n) (prop-test-error type property generators n)))) (define test-property-skip (case-lambda ((property generators) (begin (test-skip default-runs) (prop-test property generators default-runs))) ((property generators n) (begin (test-skip n) (prop-test property generators n))))) (define test-property-expect-fail (case-lambda ((property generators) (begin (test-expect-fail default-runs) (prop-test property generators default-runs))) ((property generators n) (begin (test-expect-fail n) (prop-test property generators n))))) (define test-property (case-lambda ((property generators) (prop-test property generators default-runs)) ((property generators n) (prop-test property generators n))))))