aboutsummaryrefslogtreecommitdiffstats
path: root/tests/run.scm
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2025-01-10 18:01:05 -0500
committerGravatar Peter McGoron 2025-01-10 18:01:05 -0500
commitae54a031c96e8729c94baf706fa13ed6e8aa3d6d (patch)
tree9248c4da8777f086f70c376849b3131e05f27b5e /tests/run.scm
tests run in CHICKEN 5
Diffstat (limited to 'tests/run.scm')
-rw-r--r--tests/run.scm222
1 files changed, 222 insertions, 0 deletions
diff --git a/tests/run.scm b/tests/run.scm
new file mode 100644
index 0000000..7610959
--- /dev/null
+++ b/tests/run.scm
@@ -0,0 +1,222 @@
+;; Tests for property-test library.
+;; 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.
+
+(import (scheme base)
+ (scheme complex)
+ (scheme read)
+ (srfi 1)
+ (srfi 27)
+ (srfi 64)
+ (srfi 158)
+ (srfi 194)
+ (srfi 252))
+
+
+(test-begin "property-test")
+
+(define (three x) 3)
+(define (wrong-three x) x)
+(define (three-property x) (= (three x) 3))
+(define (wrong-three-property x) (= (wrong-three x) 3))
+(define (error-three-property x) (string-append 1 2))
+(define (make-read-error x) (read (open-input-string (string-append ")" x))))
+(define (make-read-error-property x) (symbol? (make-read-error x)))
+(define (bad-generator) (gmap (lambda (x)
+ (string-append 1 2)
+ x)
+ (boolean-generator)))
+
+(test-group "test-property"
+ (test-property three-property (list (integer-generator)))
+ (test-property three-property (list (real-generator)))
+ (test-property three-property (list (integer-generator)) 10))
+
+(test-group "test-property-expect-fail"
+ (test-property-expect-fail wrong-three-property (list (integer-generator)))
+ (test-property-expect-fail wrong-three-property (list (integer-generator)) 10))
+
+(test-group "test-property-skip" ; shouldn't run
+ (test-property-skip three-property (list (bad-generator)))
+ (test-property-skip three-property (list (bad-generator)) 10))
+
+(test-group "test-property-error"
+ (test-property-error error-three-property (list (integer-generator)))
+ (test-property-error error-three-property (list (integer-generator)) 10))
+
+#;(cond-expand
+ ((library (srfi 36))
+ (test-group "test-property-error-type"
+ (test-property-error-type &read-error make-read-error-property
+ (list (string-generator)))))
+ (else))
+
+(test-group "test-property/with-2-arguments"
+ (test-property (lambda (x y)
+ (and (boolean? x) (integer? y)))
+ (list (boolean-generator) (integer-generator))))
+
+;; Testing basic generators
+
+(test-group "boolean-generator"
+ (test-property boolean? (list (boolean-generator))))
+
+(test-group "bytevector-generator"
+ (test-property bytevector? (list (bytevector-generator))))
+
+(test-group "char-generator"
+ (test-property char? (list (char-generator))))
+
+(test-group "string-generator"
+ (test-property string? (list (string-generator))))
+
+(test-group "symbol-generator"
+ (test-property symbol? (list (symbol-generator))))
+
+;; Testing exact generators
+
+(cond-expand
+ (exact-complex
+ (test-group "exact-complex-generator"
+ (test-property (lambda (x)
+ (and (complex? x)
+ (exact? (real-part x))
+ (exact? (imag-part x))))
+ (list (exact-complex-generator)))))
+ (else))
+
+(test-group "exact-integer-generator"
+ (test-property (lambda (x)
+ (and (integer? x) (exact? x)))
+ (list (exact-integer-generator))))
+
+(test-group "exact-number-generator"
+ (test-property exact? (list (exact-number-generator))))
+
+(test-group "exact-rational-generator"
+ (test-property (lambda (x)
+ (and (exact? x) (rational? x)))
+ (list (exact-rational-generator))))
+
+(test-group "exact-real-generator"
+ (test-property (lambda (x)
+ (and (exact? x) (real? x)))
+ (list (exact-real-generator))))
+
+(test-group "exact-integer-complex-generator"
+ (cond-expand
+ (exact-complex
+ (test-property (lambda (x)
+ (and (complex? x)
+ (exact? (real-part x))
+ (exact? (imag-part x))
+ (integer? (real-part x))
+ (integer? (imag-part x))))
+ (list (exact-integer-complex-generator))))
+ (else)))
+
+;; Testing inexact generators
+
+(test-group "inexact-complex-generator"
+ (test-property (lambda (x)
+ (and (complex? x)
+ (inexact? (real-part x))
+ (inexact? (imag-part x))))
+ (list (inexact-complex-generator))))
+
+(test-group "inexact-integer-generator"
+ (test-property (lambda (x)
+ (and (inexact? x) (integer? x)))
+ (list (inexact-integer-generator))))
+
+(test-group "inexact-number-generator"
+ (test-property inexact? (list (inexact-number-generator))))
+
+(test-group "inexact-rational-generator"
+ (test-property (lambda (x)
+ (and (inexact? x) (rational? x)))
+ (list (inexact-rational-generator))))
+
+(test-group "inexact-integer-generator"
+ (test-property (lambda (x)
+ (and (inexact? x) (real? x)))
+ (list (inexact-real-generator))))
+
+;; Testing union generators
+
+(test-group "complex-generator"
+ (test-property complex? (list (complex-generator))))
+
+(test-group "integer-generator"
+ (test-property integer? (list (integer-generator))))
+
+(test-group "number-generator"
+ (test-property number? (list (number-generator))))
+
+(test-group "rational-generator"
+ (test-property rational? (list (rational-generator))))
+
+(test-group "real-generator"
+ (test-property real? (list (real-generator))))
+
+;; Testing special generators
+
+(test-group "list-generator-of"
+ (test-property (lambda (x)
+ (and (list? x) (<= (length x) 1001)
+ (every integer? x)))
+ (list (list-generator-of (integer-generator)))))
+
+(test-group "pair-generator-of"
+ (test-property (lambda (x)
+ (pair? x) (integer? (car x)) (boolean? (cdr x)))
+ (list (pair-generator-of (integer-generator)
+ (boolean-generator)))))
+
+(test-group "procedure-generator-of"
+ (test-property (lambda (x)
+ (procedure? x) (integer? (x)))
+ (list (procedure-generator-of (integer-generator)))))
+
+(test-group "vector-generator-of"
+ (test-property (lambda (x)
+ (vector? x)
+ (<= (vector-length x) 1001)
+ (every integer? (vector->list x)))
+ (list (vector-generator-of (integer-generator)))))
+
+(test-group "non-determinism"
+ (let ((gen1 (gdrop (exact-number-generator) 30)) ;skip the initial sequence
+ (gen2 (gdrop (exact-number-generator) 30)))
+ (test-property (lambda (x y)
+ (not (= x y)))
+ (list gen1 gen2))))
+
+(test-group "determinism"
+ (parameterize ((current-random-source (make-random-source)))
+ (let ((gen1 (gdrop (exact-number-generator) 30)))
+ (parameterize ((current-random-source (make-random-source)))
+ (let ((gen2 (gdrop (exact-number-generator) 30)))
+ (test-property = (list gen1 gen2)))))))
+
+(test-end)