diff --git a/pkgs/racket-test/tests/racket/contract-rand-test.rkt b/pkgs/racket-test/tests/racket/contract-rand-test.rkt index 4abdaf67f0..1132ec2738 100644 --- a/pkgs/racket-test/tests/racket/contract-rand-test.rkt +++ b/pkgs/racket-test/tests/racket/contract-rand-test.rkt @@ -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?)))) diff --git a/pkgs/racket-test/tests/racket/contract/stronger.rkt b/pkgs/racket-test/tests/racket/contract/stronger.rkt index 185a2458d2..81ad5c66d8 100644 --- a/pkgs/racket-test/tests/racket/contract/stronger.rkt +++ b/pkgs/racket-test/tests/racket/contract/stronger.rkt @@ -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)) diff --git a/racket/collects/racket/contract/private/misc.rkt b/racket/collects/racket/contract/private/misc.rkt index 3835b3a0fe..8db77063ee 100644 --- a/racket/collects/racket/contract/private/misc.rkt +++ b/racket/collects/racket/contract/private/misc.rkt @@ -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?)