From b29b08dec0eb4654eeab6d9baf8a6da908549aff Mon Sep 17 00:00:00 2001 From: Stevie Strickland Date: Fri, 16 Jan 2009 18:24:59 +0000 Subject: [PATCH] Adding tests, because we should. svn: r13175 --- collects/tests/units/test-unit-contracts.ss | 133 +++++++++++++++++++- 1 file changed, 128 insertions(+), 5 deletions(-) diff --git a/collects/tests/units/test-unit-contracts.ss b/collects/tests/units/test-unit-contracts.ss index 1320dab453..dd5f04de6f 100644 --- a/collects/tests/units/test-unit-contracts.ss +++ b/collects/tests/units/test-unit-contracts.ss @@ -4,9 +4,9 @@ (define-signature sig1 ((contracted [x number?]))) (define-signature sig2 - ((contracted [f (-> number? number?)))) + ((contracted [f (-> number? number?)]))) (define-signature sig3 extends sig2 - ((contracted [g (-> number? boolean?)))) + ((contracted [g (-> number? boolean?)]))) (define-signature sig4 ((contracted [a number?] [b (-> boolean? number?)]))) (define-signature sig5 @@ -14,18 +14,141 @@ (contracted [d symbol?]))) (define-unit unit1 + (import) + (export sig1) + (define x #f)) + +(define-unit unit2 (import sig1) (export sig2) (define (f n) x)) -(define-unit unit2 +(define-unit unit3 (import sig3 sig4) (export) (b (g a))) -(define-unit unit3 +(define-unit unit4 + (import sig3 sig4) + (export) + + (g (b a))) + +(define-unit unit5 (import) (export sig5) - (define-values (c d) (values "foo" 'a))) + (define-values (c d) (values "foo" 3))) + +(test-syntax-error "misuse of contracted" + contracted) +(test-syntax-error "invalid forms after contracted in signature" + (define-signature x ((contracted x y)))) +(test-syntax-error "identifier not first part of pair after contracted in signature" + (define-signature x ((contracted [(-> number? number?) x])))) + +(test-syntax-error "f not defined in unit exporting sig3" + (unit (import) (export sig3 sig4) + (define a #t) + (define g zero?) + (define (b t) (if t 3 0)))) + +(test-runtime-error exn:fail:contract? "x exported by unit1 not a number" + (invoke-unit unit1)) +(test-runtime-error exn:fail:contract? "x exported by unit1 not a number" + (invoke-unit (compound-unit (import) (export) + (link (((S1 : sig1)) unit1) + (() unit2 S1))))) +(test-runtime-error exn:fail:contract? "a provided by anonymous unit not a number" + (invoke-unit (compound-unit (import) (export) + (link (((S3 : sig3) (S4 : sig4)) + (unit (import) (export sig3 sig4) + (define a #t) + (define f add1) + (define g zero?) + (define (b t) (if t 3 0)))) + (() unit3 S3 S4))))) + +(test-runtime-error exn:fail:contract? "g provided by anonymous unit returns the wrong value" + (invoke-unit (compound-unit (import) (export) + (link (((S3 : sig3) (S4 : sig4)) + (unit (import) (export sig3 sig4) + (define a 3) + (define f add1) + (define g values) + (define (b t) (if t 3 0)))) + (() unit3 S3 S4))))) + +(test-runtime-error exn:fail:contract? "unit4 misuses function b" + (invoke-unit (compound-unit (import) (export) + (link (((S3 : sig3) (S4 : sig4)) + (unit (import) (export sig3 sig4) + (define a 3) + (define f add1) + (define g zero?) + (define (b t) (if t 3 0)))) + (() unit4 S3 S4))))) + +(test-runtime-error exn:fail:contract? "unit5 provides bad value for d" + (invoke-unit unit5)) + +(define-unit unit6 + (import) + (export sig1) + (define-unit unit6-1 + (import) + (export sig1) + (define x 3)) + (define-values/invoke-unit unit6-1 + (import) + (export sig1))) + +(invoke-unit unit6) + +(define-signature sig6 + ((contracted [x boolean?]))) + +(define-unit unit7 + (import) + (export sig6) + (define-unit unit7-1 + (import) + (export sig1) + (define x 3)) + (define-values/invoke-unit unit7-1 + (import) + (export sig1))) + +(test-runtime-error exn:fail:contract? "unit7 reexports x with different (wrong) contract" + (invoke-unit unit7)) + +(define-unit unit8 + (import) + (export) + (define-unit unit8-1 + (import) + (export sig2) + (define f values)) + (define-values/invoke-unit unit8-1 + (import) + (export sig2)) + (f #t)) + +(test-runtime-error exn:fail:contract? "unit8 misuses f from internal unit" + (invoke-unit unit8)) + +(define-unit unit9 + (import) + (export) + (define-unit unit9-1 + (import) + (export sig2) + (define f zero?)) + (define-values/invoke-unit unit9-1 + (import) + (export sig2)) + (f 3)) + +(test-runtime-error exn:fail:contract? "unit9-1 provides wrong value for function f" + (invoke-unit unit9))