racket/pkgs/racket-test/tests/stxparse/function-header.rkt
Ryan Culpepper 80e4894597 fix mandatory-after-optional checking
Also fix tests for attribute change.
2015-02-22 21:51:49 -05:00

91 lines
2.0 KiB
Racket

#lang racket/base
(require syntax/parse
syntax/parse/lib/function-header
rackunit
"setup.rkt")
(test-case "basic"
(syntax-parse #'(b)
[(a:formal)
(s= t 't)]))
(test-case "formal: id"
(syntax-parse #'(b)
[(a:formal)
(s= a.name 'b)
(a= a.kw #f)
(a= a.default #f)]))
(test-case "formal: kw arg"
(syntax-parse #'(#:keyword argument)
[(a:formal)
(s= a.name 'argument)
(s= a.kw '#:keyword)
(a= a.default #f)]))
(test-case "formal: kw arg w/ default"
(syntax-parse #'(#:keyword [optional argument])
[(a:formal)
(s= a.name 'optional)
(s= a.kw '#:keyword)
(s= a.default 'argument)]))
(test-case "formal: plain arg w/ default"
(syntax-parse #'([optional argument])
[(a:formal)
(s= a.name 'optional)
(a= a.kw #f)
(s= a.default 'argument)]))
(test-case "bad formal: two args"
(check-equal?
(syntax-parse #'(a b)
[(a:formal) 'ok]
[_ 'bad])
'bad))
(test-case "bad formal: keyword"
(check-equal?
(syntax-parse #'(#:keyword)
[(a:formal) 'ok]
[_ 'bad])
'bad))
(test-case "formals: simple"
(syntax-parse #'(a b c)
[a:formals
(s= a '(a b c))
(s= a.params '(a b c))]))
(test-case "formals: mixed"
(syntax-parse #'(a #:keyword arg #:optional [keyword arg] . rest)
[a:formals
(s= a '(a #:keyword arg #:optional [keyword arg] . rest))
(s= a.params '(a arg keyword rest))]))
(test-case "bad formals: mandatory after optional"
(check-equal?
(syntax-parse #'([optional before] required)
[a:formals 'ok]
[_ 'bad])
'bad))
(test-case "formals: optional before rest"
(syntax-parse #'(a [optional arg] . rest)
[a:formals
(s= a '(a [optional arg] . rest))
(s= a.params '(a optional rest))]))
(test-case "function header: simple"
(syntax-parse #'(f a b c)
[a:function-header
(s= a '(f a b c ))
(s= a.params '(a b c))]))
(test-case "function header: curried"
(syntax-parse #'((f doing) currying)
[a:function-header
(s= a '((f doing) currying))
(s= a.params '(doing currying))]))