test/test-queue.ss
#lang scheme

(require "checks.ss"
         "../queue.ss")

(provide queue-suite)

(define queue-suite
  (test-suite "queue.ss"
    (test-suite "queue-empty?"
      (test-case "make-queue"
        (check-true (queue-empty? (make-queue))))
      (test-case "enqueue! once"
        (let* ([q (make-queue)])
          (enqueue! q 1)
          (check-false (queue-empty? q))))
      (test-case "enqueue! once / dequeue! once"
        (let* ([q (make-queue)])
          (enqueue! q 1)
          (dequeue! q)
          (check-true (queue-empty? q))))
      (test-case "enqueue! twice"
        (let* ([q (make-queue)])
          (enqueue! q 1)
          (enqueue! q 2)
          (check-false (queue-empty? q))))
      (test-case "enqueue! twice / dequeue! once"
        (let* ([q (make-queue)])
          (enqueue! q 1)
          (enqueue! q 2)
          (dequeue! q)
          (check-false (queue-empty? q))))
      (test-case "enqueue! twice / dequeue! twice"
        (let* ([q (make-queue)])
          (enqueue! q 1)
          (enqueue! q 2)
          (dequeue! q)
          (dequeue! q)
          (check-true (queue-empty? q)))))
    (test-suite "dequeue!"
      (test-case "make-queue"
        (check-exn exn:fail:contract? (lambda () (dequeue! (make-queue)))))
      (test-case "enqueue! once"
        (let* ([q (make-queue)])
          (enqueue! q 1)
          (check-equal? (dequeue! q) 1)
          (check-exn exn:fail:contract?
                     (lambda () (dequeue! q)))))
      (test-case "enqueue! twice"
        (let* ([q (make-queue)])
          (enqueue! q 1)
          (enqueue! q 2)
          (check-equal? (dequeue! q) 1)
          (check-equal? (dequeue! q) 2)
          (check-exn exn:fail:contract?
                     (lambda () (dequeue! q))))))))