test-tqueue.rkt
#lang racket/base


(require "tqueue.rkt"
         rackunit
         rackunit/text-ui)

(provide test-topological-queue)


(define test-topological-queue
  (test-suite
   "test-topological-queue.ss"
   (test-case
    "c depends on b, b depends on a"
    (let ([tqueue (new-tqueue)])
      (tqueue-add! tqueue 'a '())
      (check-eq? (tqueue-get tqueue) 'a)
      (tqueue-add! tqueue 'b '(a))
      (check-false (tqueue-try-get tqueue))
      (tqueue-add! tqueue 'c '(b))
      (check-false (tqueue-try-get tqueue))
      (tqueue-satisfy! tqueue 'a)
      
      (check-eq? (tqueue-try-get tqueue) 'b)
      (tqueue-satisfy! tqueue 'b)
      (check-eq? (tqueue-try-get tqueue) 'c)))

   (test-case
    "ensure it's depending on eq rather than equal"
    (let ([tqueue (new-tqueue)])
      (tqueue-add! tqueue "a" (list "b"))
      (tqueue-satisfy! tqueue (string-copy "b"))
      (check-eq? (tqueue-try-get tqueue) #f)))

   (test-case
    "ensure it's depending on eq rather than equal"
    (let ([tqueue (new-tqueue)]
          [a (string-copy "a")]
          [b (string-copy "b")])
      (tqueue-add! tqueue a (list b))
      (tqueue-satisfy! tqueue b)
      (check-eq? (tqueue-try-get tqueue) a)))

   (test-case
    "ensure it's depending on eq rather than equal"
    (let ([tqueue (new-tqueue)]
          [a (string-copy "a")]
          [b (string-copy "b")])
      (tqueue-add! tqueue a (list b))
      (tqueue-satisfy! tqueue (string-copy b))
      (check-eq? (tqueue-try-get tqueue) #f)))
   
   
   (test-case
    "'b' depends on 'a' and 'c'"
    (let ([tqueue (new-tqueue)])
      (tqueue-add! tqueue 'a '())
      (tqueue-add! tqueue 'c '())
      (tqueue-add! tqueue 'b '(a c))
      
      (check-eq? (tqueue-get tqueue) 'a)
      (check-eq? (tqueue-get tqueue) 'c)
      (check-false (tqueue-try-get tqueue))
      (tqueue-satisfy! tqueue 'a)
      (check-false (tqueue-try-get tqueue))
      (tqueue-satisfy! tqueue 'c)
      (check-eq? (tqueue-get tqueue) 'b)))
   
   
   (test-case
    "'b' depends on 'a' and 'c' again"
    (let ([tqueue (new-tqueue)])
      (tqueue-satisfy! tqueue 'a)
      (tqueue-satisfy! tqueue 'c)
      (tqueue-add! tqueue 'b '(a c))
      (check-eq? (tqueue-get tqueue) 'b)))))

(define (test)
  (run-tests test-topological-queue))

(test)