require 'test/unit'
require 'queue'

class TestQueue < Test::Unit::TestCase
  def setup
    @tq = Queue.new
  end

  # Check proper empty queue behavior
  #
  def test_001_new_queue
    assert( @tq.size == 0, "New queue size not zero" )
    assert( @tq.empty?, "New queue not empty" )
    assert_raise(Queue::Empty) { @tq.peek }
    assert_raise(Queue::Empty) { value = @tq.head }
  end

  # Check proper FIFO behavior.
  #
  def test_002_fifo_check
    test_values = %w{ A B C }
    test_values.each { |v| @tq.tail = v }

    size = @tq.size
    assert( size == test_values.length,
		"#{test_values.length} element queue reports size of #{size}" )
    assert( ! @tq.empty?, "Non-empty queue reports empty" )

    test_values.each do |v|
      assert_nothing_raised() { qv = @tq.peek }
      assert_equal(v, qv, '@tq.peek:')

      assert_nothing_raised() { qv = @tq.head }
      assert_equal(v, qv, '@tq.head:')
    end

    assert_raise(Queue::Empty) { @tq.peek }
    assert_raise(Queue::Empty) { qv = @tq.head }
  end
end
