
This change does not yet update the *SL error-message rewriter to recognize the new error-message formats; the tests do not currently use the rewriter. A next step is to decide on the rewritings, implement them, change the test suite to use the rewriter, and test the rewritings.
130 lines
8.7 KiB
Racket
130 lines
8.7 KiB
Racket
|
|
;; These are true for beginner, but the operators are syntax, so
|
|
;; arity-test doesn't work.
|
|
|
|
(htdp-syntax-test #'local "local: expected an open parenthesis before local, but found none")
|
|
(htdp-syntax-test #'(local) "local: expected at least one definition (in square brackets) after local, but nothing's there")
|
|
(htdp-syntax-test #'(local ()) "local: expected an expression after the local definitions, but nothing's there")
|
|
(htdp-syntax-test #'(local 1) "local: expected at least one definition (in square brackets) after local, but found a number")
|
|
(htdp-syntax-test #'(local 1 1) "local: expected at least one definition (in square brackets) after local, but found a number")
|
|
(htdp-syntax-test #'(local () 1 2) "local: expected only one expression after the local definitions, but found 1 extra part")
|
|
(htdp-syntax-test #'(local [1] 1 2) "local: expected a definition, but found a number")
|
|
(htdp-syntax-test #'(local [(+ 1 2)] 1) "local: expected a definition, but found a part")
|
|
(htdp-syntax-test #'(local [(define x)] 1) "define: expected an expression after the variable name x, but nothing's there")
|
|
(htdp-syntax-test #'(local [(define x 1) (define x 2)] 1) "local: x was defined locally more than once")
|
|
(htdp-syntax-test #'(local [(define (x a) 12) (+ 1 2)] 1) "local: expected a definition, but found a part")
|
|
|
|
(htdp-err/rt-test (local [(define x y) (define y 5)] 10)
|
|
(exn-type-and-msg exn:fail:contract:variable?
|
|
"local variable used before its definition: y"))
|
|
|
|
(htdp-test 1 'local (local () 1))
|
|
(htdp-test 5 'local (local [(define y 5) (define x y)] x))
|
|
(htdp-test #t 'local (local [(define (even n) (if (zero? n) true (odd (sub1 n))))
|
|
(define (odd n) (if (zero? n) false (even (sub1 n))))]
|
|
(even 100)))
|
|
(htdp-test 19 (local [(define (f x) (+ x 10))] f) 9)
|
|
(htdp-test 16 'local (local [(define (f x) (+ x 10))] (f 6)))
|
|
|
|
(htdp-syntax-test #'letrec "letrec: expected an open parenthesis before letrec, but found none")
|
|
(htdp-syntax-test #'(letrec) "letrec: expected at least one binding (in parentheses) after letrec, but nothing's there")
|
|
(htdp-syntax-test #'(letrec ()) "letrec: expected an expression after the bindings, but nothing's there")
|
|
(htdp-syntax-test #'(letrec 1 2) "letrec: expected at least one binding (in parentheses) after letrec, but found a number")
|
|
(htdp-syntax-test #'(letrec 1 2 3) "letrec: expected at least one binding (in parentheses) after letrec, but found a number")
|
|
(htdp-syntax-test #'(letrec (10) 1) "letrec: expected a binding with a variable and an expression, but found a number")
|
|
(htdp-syntax-test #'(letrec ([x]) 1) "letrec: expected an expression after the name x, but nothing's there")
|
|
(htdp-syntax-test #'(letrec ([x 2 3]) 1) "letrec: expected only one expression after the name x, but found 1 extra part")
|
|
(htdp-syntax-test #'(letrec ([x 5] 10) 1) "letrec: expected a binding with a variable and an expression, but found a number")
|
|
(htdp-syntax-test #'(letrec ([1 5]) 1) "letrec: expected a variable for the binding, but found a number")
|
|
(htdp-syntax-test #'(letrec ([1 5 6]) 1) "letrec: expected a variable for the binding, but found a number")
|
|
(htdp-syntax-test #'(letrec ([x 5]) 1 2) "letrec: expected only one expression after the bindings, but found 1 extra part")
|
|
(htdp-syntax-test #'(letrec ([x 5][x 6]) 1) "letrec: x was defined locally more than once")
|
|
|
|
(htdp-err/rt-test (letrec ([x y] [y 5]) 10)
|
|
(exn-type-and-msg exn:fail:contract:variable?
|
|
"local variable used before its definition: y"))
|
|
|
|
(htdp-test 1 'letrec (letrec () 1))
|
|
(htdp-test 5 'letrec (letrec ([y 5][x y]) x))
|
|
(htdp-test #t 'letrec (letrec ([even (lambda (n) (if (zero? n) true (odd (sub1 n))))]
|
|
[odd (lambda (n) (if (zero? n) false (even (sub1 n))))])
|
|
(even 100)))
|
|
(htdp-test 19 (letrec ([f (lambda (x) (+ x 10))]) f) 9)
|
|
(htdp-test 16 'letrec (letrec ([f (lambda (x) (+ x 10))]) (f 6)))
|
|
|
|
(htdp-syntax-test #'let "let: expected an open parenthesis before let, but found none")
|
|
(htdp-syntax-test #'(let) "let: expected at least one binding (in parentheses) after let, but nothing's there")
|
|
(htdp-syntax-test #'(let ()) "let: expected an expression after the bindings, but nothing's there")
|
|
(htdp-syntax-test #'(let 1 2) "let: expected at least one binding (in parentheses) after let, but found a number")
|
|
(htdp-syntax-test #'(let 1 2 3) "let: expected at least one binding (in parentheses) after let, but found a number")
|
|
(htdp-syntax-test #'(let (10) 1) "let: expected a binding with a variable and an expression, but found a number")
|
|
(htdp-syntax-test #'(let ([x]) 1) "let: expected an expression after the name x, but nothing's there")
|
|
(htdp-syntax-test #'(let ([x 2 3]) 1) "let: expected only one expression after the name x, but found 1 extra part" )
|
|
(htdp-syntax-test #'(let ([x 5] 10) 1) "let: expected a binding with a variable and an expression, but found a number")
|
|
(htdp-syntax-test #'(let ([1 5]) 1) "let: expected a variable for the binding, but found a number")
|
|
(htdp-syntax-test #'(let ([1 5 6]) 1) "let: expected a variable for the binding, but found a number")
|
|
(htdp-syntax-test #'(let ([x 5]) 1 2) "let: expected only one expression after the bindings, but found 1 extra part")
|
|
(htdp-syntax-test #'(let ([x 5][x 6]) 1) "let: x was defined locally more than once")
|
|
|
|
(htdp-test 1 'let (let () 1))
|
|
(htdp-test 5 'let (let ([y 5]) (let ([x y]) x)))
|
|
(htdp-test 6 'let (let ([y 6]) (let ([y 10][x y]) x)))
|
|
(htdp-test 19 (let ([f (lambda (x) (+ x 10))]) f) 9)
|
|
(htdp-test 16 'let (let ([f (lambda (x) (+ x 10))]) (f 6)))
|
|
|
|
(htdp-syntax-test #'let* "let*: expected an open parenthesis before let*, but found none")
|
|
(htdp-syntax-test #'(let*) "let*: expected at least one binding (in parentheses) after let*, but nothing's there")
|
|
(htdp-syntax-test #'(let* ()) "let*: expected an expression after the bindings, but nothing's there")
|
|
(htdp-syntax-test #'(let* 1 2) "let*: expected at least one binding (in parentheses) after let*, but found a number")
|
|
(htdp-syntax-test #'(let* 1 2 3) "let*: expected at least one binding (in parentheses) after let*, but found a number")
|
|
(htdp-syntax-test #'(let* (10) 1) "let*: expected a binding with a variable and an expression, but found a number")
|
|
(htdp-syntax-test #'(let* ([x]) 1) "let*: expected an expression after the name x, but nothing's there")
|
|
(htdp-syntax-test #'(let* ([x 2 3]) 1) "let*: expected only one expression after the name x, but found 1 extra part")
|
|
(htdp-syntax-test #'(let* ([x 5] 10) 1) "let*: expected a binding with a variable and an expression, but found a number")
|
|
(htdp-syntax-test #'(let* ([1 5]) 1) "let*: expected a variable for the binding, but found a number")
|
|
(htdp-syntax-test #'(let* ([1 5 6]) 1) "let*: expected a variable for the binding, but found a number")
|
|
(htdp-syntax-test #'(let* ([x 5]) 1 2) "let*: expected only one expression after the bindings, but found 1 extra part")
|
|
|
|
(htdp-test 1 'let* (let* () 1))
|
|
(htdp-test 6 'let* (let* ([x 5][x 6]) x))
|
|
(htdp-test 9 'let* (let* ([x 8][x (add1 x)]) x))
|
|
(htdp-test 5 'let* (let* ([y 5]) (let* ([x y]) x)))
|
|
(htdp-test 10 'let* (let* ([y 6]) (let* ([y 10][x y]) x)))
|
|
(htdp-test 19 (let* ([f (lambda (x) (+ x 10))]) f) 9)
|
|
(htdp-test 16 'let* (let* ([f (lambda (x) (+ x 10))]) (f 6)))
|
|
|
|
(htdp-test 7779 'time (time 7779))
|
|
(htdp-syntax-test #'time "time: expected an open parenthesis before time, but found none")
|
|
(htdp-syntax-test #'(time) "time: expected an expression after time, but nothing's there")
|
|
(htdp-syntax-test #'(time 1 2) "time: expected only one expression after time, but found 1 extra part")
|
|
(htdp-syntax-test #'(time (define x 5)) "define: found a definition that is not at the top level")
|
|
|
|
(htdp-err/rt-test (foldr car 2 '(1 2 3))
|
|
"foldr : first argument must be a function that expects two arguments, given")
|
|
|
|
(htdp-err/rt-test (foldl car 2 '(1 2 3))
|
|
"foldl : first argument must be a function that expects two arguments, given #<procedure:car>")
|
|
|
|
(htdp-err/rt-test (build-string 2 add1)
|
|
"build-string : the second argument must be a function that produces a character, given #<procedure:add1>, which produced 1 when given 0")
|
|
|
|
(htdp-test 0 '+ (+))
|
|
(htdp-test 1 '+ (+ 1))
|
|
(htdp-test 1 '* (*))
|
|
(htdp-test 1 '* (* 1))
|
|
(htdp-err/rt-test (-) (exn-type-and-msg exn:application:arity? #rx"wrong number of arguments.*procedure: -\n.*expected[^:]*: at least 1.*given[^:]*: 0"))
|
|
(htdp-err/rt-test (/) (exn-type-and-msg exn:application:arity? #rx"wrong number of arguments.*procedure: /\n.*expected[^:]*: at least 1.*given[^:]*: 0"))
|
|
;(htdp-test 1 (/ 1) exn:application:arity?)
|
|
|
|
;; Check that `local' works with macros that expand to `begin':
|
|
(module my-multi-defn racket/base
|
|
(provide multi)
|
|
(define-syntax-rule (multi a b)
|
|
(begin
|
|
(define a 1)
|
|
(define b 2))))
|
|
(htdp-teachpack my-multi-defn)
|
|
|
|
(htdp-test '(2 1) 'local (local [(multi x y)]
|
|
(list y x)))
|