(cond-expand
 (modules (import (chibi) (chibi test) (srfi 16)))
 (else #f))

(define plus
  (case-lambda 
   (() 0)
   ((x) x)
   ((x y) (+ x y))
   ((x y z) (+ (+ x y) z))
   (args (apply + args))))

(test-begin "case-lambda")

(test 0 (plus))
(test 1 (plus 1))
(test 6 (plus 1 2 3))
(test-error ((case-lambda ((a) a) ((a b) (* a b))) 1 2 3))

(define print
  (case-lambda
   (()
    (display ""))
   ((arg)
    (display arg))
   ((arg . args)
    (display arg)
    (display " ")
    (apply print args))))

(define (print-to-string . args)
  (let ((out (open-output-string))
        (old-out (current-output-port)))
    (dynamic-wind
      (lambda () (current-output-port out))
      (lambda () (apply print args))
      (lambda () (current-output-port old-out)))
    (get-output-string out)))

(test "" (print-to-string))
(test "hi" (print-to-string 'hi))
(test "hi there world" (print-to-string 'hi 'there 'world))

(test-end)