add stronger and random generation for integer-in
This commit is contained in:
parent
3372ba3547
commit
94a450999a
|
@ -33,6 +33,8 @@
|
|||
(check-not-exn (λ () (test-contract-generation (listof boolean?))))
|
||||
(check-not-exn (λ () (test-contract-generation (listof number?))))
|
||||
|
||||
(check-not-exn (λ () (test-contract-generation (integer-in 0 100))))
|
||||
(check-not-exn (λ () (test-contract-generation (integer-in 0 (expt 2 1000)))))
|
||||
(check-not-exn (λ () (test-contract-generation (between/c 1 100))))
|
||||
(check-not-exn (λ () (test-contract-generation (between/c 1.0 100.0))))
|
||||
(check-not-exn (λ () (test-contract-generation (listof integer?))))
|
||||
|
|
|
@ -10,6 +10,9 @@
|
|||
(contract-eval '(define-contract-struct triple (a b c)))
|
||||
|
||||
(ctest #t contract-stronger? any/c any/c)
|
||||
(ctest #t contract-stronger? (integer-in 0 4) (integer-in 0 4))
|
||||
(ctest #t contract-stronger? (integer-in 1 3) (integer-in 0 4))
|
||||
(ctest #f contract-stronger? (integer-in 0 4) (integer-in 1 3))
|
||||
(ctest #t contract-stronger? (between/c 1 3) (between/c 0 4))
|
||||
(ctest #f contract-stronger? (between/c 0 4) (between/c 1 3))
|
||||
(ctest #t contract-stronger? (>=/c 3) (>=/c 2))
|
||||
|
|
|
@ -515,13 +515,35 @@
|
|||
(format "~a" (object-name pred2?))
|
||||
1
|
||||
arg1 arg2)))
|
||||
(struct integer-in-ctc (start end)
|
||||
#:property prop:flat-contract
|
||||
(build-flat-contract-property
|
||||
#:name (λ (ctc) `(integer-in ,(integer-in-ctc-start ctc)
|
||||
,(integer-in-ctc-end ctc)))
|
||||
#:first-order (λ (ctc)
|
||||
(define start (integer-in-ctc-start ctc))
|
||||
(define end (integer-in-ctc-end ctc))
|
||||
(λ (x) (and (exact-integer? x)
|
||||
(<= start x end))))
|
||||
#:stronger (λ (this that)
|
||||
(define this-start (integer-in-ctc-start this))
|
||||
(define this-end (integer-in-ctc-end that))
|
||||
(cond
|
||||
[(integer-in-ctc? that)
|
||||
(define that-start (integer-in-ctc-start that))
|
||||
(define that-end (integer-in-ctc-end that))
|
||||
(<= that-start this-start this-end that-end)]
|
||||
[else #f]))
|
||||
#:generate (λ (ctc)
|
||||
(define start (integer-in-ctc-start ctc))
|
||||
(define end (integer-in-ctc-end ctc))
|
||||
(λ (fuel)
|
||||
(λ ()
|
||||
(+ start (random (min 4294967087 (+ (- end start) 1)))))))))
|
||||
|
||||
(define/final-prop (integer-in start end)
|
||||
(check-two-args 'integer-in start end exact-integer? exact-integer?)
|
||||
(flat-named-contract
|
||||
`(integer-in ,start ,end)
|
||||
(λ (x)
|
||||
(and (exact-integer? x)
|
||||
(<= start x end)))))
|
||||
(integer-in-ctc start end))
|
||||
|
||||
(define/final-prop (real-in start end)
|
||||
(check-two-args 'real-in start end real? real?)
|
||||
|
|
Loading…
Reference in New Issue
Block a user