(import (chibi weak) (chibi ast) (only (chibi test) test-begin test test-end)) (test-begin "weak pointers") (test "preserved key and value" '("key1" "value1" #f) (let ((key (string-append "key" "1")) (value (string-append "value" "1"))) (let ((eph (make-ephemeron key value))) (gc) (list key (ephemeron-value eph) (ephemeron-broken? eph))))) (test "unpreserved key and value" '(#f #f #t) (let ((eph (make-ephemeron (string-append "key" "2") (string-append "value" "2")))) (gc) (list (ephemeron-key eph) (ephemeron-value eph) (ephemeron-broken? eph)))) (test "unpreserved key and preserved value" '(#f "value3" #t) (let ((value (string-append "value" "3"))) (let ((eph (make-ephemeron (string-append "key" "3") value))) (gc) (list (ephemeron-key eph) value (ephemeron-broken? eph))))) (test "unpreserved value references unpreserved key" '(#f #f #t) (let ((key (string-append "key"))) (let ((eph (make-ephemeron key (cons (string-append "value") key)))) (gc) (list (ephemeron-key eph) (ephemeron-value eph) (ephemeron-broken? eph))))) ;; disabled - we support weak keys, but not proper ephemerons '(test "preserved key and unpreserved value" '("key" "value" #f) (let ((key (string-append "key"))) (let ((eph (make-ephemeron key (string-append "value")))) (gc) (list key (ephemeron-value eph) (ephemeron-broken? eph))))) '(test "preserved value references unpreserved key" '(#f #f #t) (let* ((key (string-append "key")) (value (cons (string-append "value") key))) (let ((eph (make-ephemeron key value))) (gc) (list (ephemeron-key eph) value (ephemeron-broken? eph))))) (test-end)