(define-library (chibi generic-test) (export run-tests) (import (chibi) (chibi generic) (chibi test)) (begin (define (run-tests) (test-begin "generics") (let () (define-generic add) (define-method (add (x number?) (y number?)) (+ x y)) (define-method (add (x string?) (y string?)) (string-append x y)) (define-method (add x (y list?)) (append x y)) (test 4 (add 2 2)) (test "22" (add "2" "2")) (test '(2 2) (add '() '(2 2))) (test '(2 2) (add '(2) '(2))) (test '(2 2) (add '(2 2) '())) (test '(2) (add #f '(2))) (test-error (add #(2) #(2)))) (let () (define-generic mul) (define-method (mul (x number?) (y number?)) (* x y)) (define-method (mul (x inexact?) (y inexact?)) (+ (* x y) 0.1)) (define-method (mul (x exact?) (y exact?)) (inexact->exact (call-next-method))) (test 21 (mul 3 7)) (test 21.0 (mul 3.0 7)) (test 21.0 (mul 3 7.0)) (test 21.1 (mul 3.0 7.0))) (test-end))))