1(define-library (chibi weak-test)
2  (export run-tests)
3  (import (chibi) (chibi weak) (chibi ast) (chibi test))
4  (begin
5    (define (run-tests)
6      (test-begin "weak pointers")
7
8      (test "preserved key and value" '("key1" "value1" #f)
9        (let ((key (string-append "key" "1"))
10              (value (string-append "value" "1")))
11          (let ((eph (make-ephemeron key value)))
12            (gc)
13            (list key (ephemeron-value eph) (ephemeron-broken? eph)))))
14
15      (test "unpreserved key and value" '(#f #f #t)
16        (let ((eph (make-ephemeron (string-append "key" "2")
17                                   (string-append "value" "2"))))
18          (gc)
19          (list (ephemeron-key eph)
20                (ephemeron-value eph)
21                (ephemeron-broken? eph))))
22
23      (test "unpreserved key and preserved value" '(#f "value3" #t)
24        (let ((value (string-append "value" "3")))
25          (let ((eph (make-ephemeron (string-append "key" "3") value)))
26            (gc)
27            (list (ephemeron-key eph) value (ephemeron-broken? eph)))))
28
29      (test "unpreserved value references unpreserved key" '(#f #f #t)
30        (let ((key (string-append "key")))
31          (let ((eph (make-ephemeron key (cons (string-append "value") key))))
32            (gc)
33            (list (ephemeron-key eph)
34                  (ephemeron-value eph)
35                  (ephemeron-broken? eph)))))
36
37      ;; disabled - we support weak keys, but not proper ephemerons
38
39      '(test "preserved key and unpreserved value" '("key" "value" #f)
40         (let ((key (string-append "key")))
41           (let ((eph (make-ephemeron key (string-append "value"))))
42             (gc)
43             (list key (ephemeron-value eph) (ephemeron-broken? eph)))))
44
45      '(test "preserved value references unpreserved key" '(#f #f #t)
46         (let* ((key (string-append "key"))
47                (value (cons (string-append "value") key)))
48           (let ((eph (make-ephemeron key value)))
49             (gc)
50             (list (ephemeron-key eph) value (ephemeron-broken? eph)))))
51
52      (test-end))))
53