aboutsummaryrefslogtreecommitdiffstats
path: root/srfi-252.sld
blob: 6d9f42618a9444f936d749c42ac4b206edae787c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
;; Property-based testing extension for SRFI 64.
;; SPDX-License-Identifier: MIT
;; Copyright 2024 Antero Mejr <mail@antr.me>

;; 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))))))