test-rackonsole.rkt
#lang racket/base
;; For legal info, see file "info.rkt".

(require racket/sequence
         (planet neil/overeasy)
         "rackonsole-ringbuf.rkt")

(test-section 'rackonsole-ringbuf
  
  (test-section 'size-0
    
    (test #:id   'error-append-to-ringbuf-size-0
          #:code (let ((rb (%rackonsole:ringbuf/size 0)))
                   (%rackonsole:ringbuf-append! rb 'a))
          #:exn  "%rackonsole:ringbuf-append!: cannot append to ringbuf size 0")
    
    (test #:id   'error-prepend-to-ringbuf-size-0
          #:code (let ((rb (%rackonsole:ringbuf/size 0)))
                   (%rackonsole:ringbuf-prepend! rb 'a))
          #:exn  "%rackonsole:ringbuf-prepend!: cannot prepend to ringbuf size 0"))
  
  (test-section 'size-1
    
    (let ((rb (%rackonsole:ringbuf/size 1)))
      
      (test 'start
            (sequence->list rb)
            '())
      
      (test 'append-a
            (begin (%rackonsole:ringbuf-append! rb 'a)
                   (sequence->list rb))
            '(a))
      
      (test 'append-b
            (begin (%rackonsole:ringbuf-append! rb 'b)
                   (sequence->list rb))
            '(b))
      
      (test 'append-c
            (begin (%rackonsole:ringbuf-append! rb 'c)
                   (sequence->list rb))
            '(c))
      
      (test 'prepend-d
            (begin (%rackonsole:ringbuf-prepend! rb 'd)
                   (sequence->list rb))
            '(d))
      
      (test 'prepend-e
            (begin (%rackonsole:ringbuf-prepend! rb 'e)
                   (sequence->list rb))
            '(e))
      
      (test 'prepend-f
            (begin (%rackonsole:ringbuf-prepend! rb 'f)
                   (sequence->list rb))
            '(f))))
  
  (test-section 'append
    
    (for ((start (in-range 0 5)))
      
      (test-section (string->symbol (format "start-~A" start))
        
        (let ((rb (%rackonsole:ringbuf/size/start 5 start)))
          
          (test 'start
                (sequence->list rb)
                '())
          
          (%rackonsole:ringbuf-append! rb 'a)
          (test 'after-a
                (sequence->list rb)
                '(a))
          
          (%rackonsole:ringbuf-append! rb 'b)
          (test 'after-b
                (sequence->list rb)
                '(a b))
          
          (%rackonsole:ringbuf-append! rb 'c)
          (test 'after-c
                (sequence->list rb)
                '(a b c))
          
          (%rackonsole:ringbuf-append! rb 'd)
          (test 'after-d
                (sequence->list rb)
                '(a b c d))
          
          (%rackonsole:ringbuf-append! rb 'e)
          (test 'after-e
                (sequence->list rb)
                '(a b c d e))
          
          (%rackonsole:ringbuf-append! rb 'f)
          (test 'after-f
                (sequence->list rb)
                '(b c d e f))
          
          (%rackonsole:ringbuf-append! rb 'g)
          (test 'after-f
                (sequence->list rb)
                '(c d e f g))
          
          (%rackonsole:ringbuf-append! rb 'h)
          (test 'after-h
                (sequence->list rb)
                '(d e f g h))
          
          (%rackonsole:ringbuf-append! rb 'i)
          (test 'after-i
                (sequence->list rb)
                '(e f g h i))
          
          (%rackonsole:ringbuf-append! rb 'j)
          (test 'after-j
                (sequence->list rb)
                '(f g h i j))
          
          (%rackonsole:ringbuf-append! rb 'k)
          (test 'after-k
                (sequence->list rb)
                '(g h i j k))))))
  
  (test-section 'prepend
    
    (for ((start (in-range 0 5)))
      
      (test-section (string->symbol (format "start-~A" start))
        
        (let ((rb (%rackonsole:ringbuf/size/start 5 start)))
          
          (test 'start
                (sequence->list rb)
                '())
          
          (%rackonsole:ringbuf-prepend! rb 'a)
          (test 'after-a
                (sequence->list rb)
                '(a))
          
          (%rackonsole:ringbuf-prepend! rb 'b)
          (test 'after-b
                (sequence->list rb)
                '(b a))
          
          (%rackonsole:ringbuf-prepend! rb 'c)
          (test 'after-c
                (sequence->list rb)
                '(c b a))
          
          (%rackonsole:ringbuf-prepend! rb 'd)
          (test 'after-d
                (sequence->list rb)
                '(d c b a))
          
          (%rackonsole:ringbuf-prepend! rb 'e)
          (test 'after-e
                (sequence->list rb)
                '(e d c b a))
          
          (%rackonsole:ringbuf-prepend! rb 'f)
          (test 'after-f
                (sequence->list rb)
                '(f e d c b))
          
          (%rackonsole:ringbuf-prepend! rb 'g)
          (test 'after-f
                (sequence->list rb)
                '(g f e d c))
          
          (%rackonsole:ringbuf-prepend! rb 'h)
          (test 'after-h
                (sequence->list rb)
                '(h g f e d))
          
          (%rackonsole:ringbuf-prepend! rb 'i)
          (test 'after-i
                (sequence->list rb)
                '(i h g f e))
          
          (%rackonsole:ringbuf-prepend! rb 'j)
          (test 'after-j
                (sequence->list rb)
                '(j i h g f))
          
          (%rackonsole:ringbuf-prepend! rb 'k)
          (test 'after-k
                (sequence->list rb)
                '(k j i h g)))))))