(import 
  (scheme base)
  (cyclone concurrent)
  (cyclone test))

(test-group "basic"
  (define q (make-shared-queue))
  (test "predicate" #t (shared-queue? q))
  (test "empty" #t (shared-queue-empty? q))
  (test "empty" 0 (shared-queue-size q))
  (shared-queue-add! q 'a)
  (test "add a" #f (shared-queue-empty? q))
  (test "add a" 1 (shared-queue-size q))
  (shared-queue-add! q 'b)
  (test "add b" #f (shared-queue-empty? q))
  (test "add b" 2 (shared-queue-size q))
  (shared-queue-add! q 'c)
  (shared-queue-add! q 'd)
  (shared-queue-add! q 'e)
  (shared-queue-add! q 'f)
  (shared-queue-add! q 'g)
  (shared-queue-add! q 'h)
  (shared-queue-add! q 'i)
  (shared-queue-add! q 'j)
  (test "add many" #f (shared-queue-empty? q))
  (test "add many" 10 (shared-queue-size q))
  (test "remove" 'a (shared-queue-remove! q))
  (test "remove a - size" 9 (shared-queue-size q))
  (test "remove" 'b (shared-queue-remove! q))
  (test "remove" 'c (shared-queue-remove! q))
  (test "remove" 'd (shared-queue-remove! q))
  (test "remove d - size" 6 (shared-queue-size q))
  
  (shared-queue-add! q 'a)
  (shared-queue-add! q 'b)
  (shared-queue-add! q 'c)
  (shared-queue-add! q 'd)
  (test "add many back" 10 (shared-queue-size q))

  (shared-queue-clear! q)
  (test "clear" 0 (shared-queue-size q))
)

(test-exit)