test-weak-map.ss
(module test-weak-map mzscheme
  (require "weak-map.ss"
           (lib "list.ss")
           (planet "test.ss" ("schematics" "schemeunit.plt" 2 4))
           (planet "text-ui.ss" ("schematics" "schemeunit.plt" 2 4)))
  
  (define weak-map-tests
    (test-suite
     "tests for weak-map.ss"
     
     (test-case
      "empty"
      (let ([m (make-weak-map)])
        (check-pred empty? (weak-map-map m list))))
     
     (test-case
      "simple case"
      (let ([x '(1 2)]
            [m (make-weak-map)])
        (weak-map-put! m x x)
        (collect-garbage)
        (check equal? (weak-map-get m x #f) x)
        (set! x 'blah)
        (collect-garbage)
        (check equal? (weak-map-get m x #f) #f)))
     
     
     (test-case
      "equal flag"
      (let ([s (string-append "hel" "lo")]
            [m (make-weak-map 'equal)])
        (weak-map-put! m s s)
        (collect-garbage)
        (check-true (eq? (weak-map-get m (string-append "h" "ello"))
                         (weak-map-get m (string-append "he" "llo"))))
        (check equal?
               (weak-map-get m (string-append "h" "ello"))
               "hello")
        (check-false (equal? (weak-map-map m list) '()))
        (set! s #f)
        (collect-garbage)
        (check-true (equal? (weak-map-map m list) '()))))
     
     
     (test-case
      "simple case 2"
      (let ([x '(1 2)]
            [m (make-weak-map)])
        (weak-map-put! m x x)
        (collect-garbage)
        (check equal? (weak-map-get m x #f) x)
        (collect-garbage)
        (check equal? (weak-map-get m x #f) x)))
     
     (test-case
      "weak-map-map"
      (let ([m (make-weak-map)]
            [k1 (list 1)]
            [k2 (list 2)]
            [k3 (list 3)])
        (weak-map-put! m k1 k1)
        (weak-map-put! m k2 k2)
        (weak-map-put! m k3 k3)
        (set! k2 #f)
        (collect-garbage)
        (check-true
         (and (member '(1) (weak-map-map m (lambda (k v) v))) #t))
        (check-true
         (and (member '(3) (weak-map-map m (lambda (k v) v))) #t))
        (check-false
         (and (member '(2) (weak-map-map m (lambda (k v) v))) #t))))))
  
  (test/text-ui weak-map-tests))