/** \file
 *
 *  Contains unit tests for the RingBuffer and Timespan classes
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 */

#ifndef _TC_RINGBUFFER_H_
#define _TC_RINGBUFFER_H_

#include "utils/RingBuffer.h"
#include <cxxtest/TestSuite.h>

/**
 *  Unit Tests for class RingBuffer
 *
 *  \ingroup utils
 */
class RingBuffer_Test : public CxxTest::TestSuite
{
public:

    void testRingBufferVoid( void )
    {
        RingBufferVoid buf;
        TS_ASSERT_EQUALS( buf.isEmpty(), true );
        buf.push( ( void* )1 );
        TS_ASSERT_EQUALS( buf.isEmpty(), false );
        TS_ASSERT_EQUALS( ( size_t )buf.peek(), ( size_t )1 );
        for( size_t i = 2; i <= 1000; ++i )
        {
            buf.push( ( void* )i );
        }
        for( size_t i = 1; i <= 500; ++i )
        {
            void* val = buf.pop();
            TS_ASSERT_EQUALS( ( size_t )val, i );
        }
        TS_ASSERT_EQUALS( ( size_t )buf.peek(), ( size_t )501 );
        for( size_t i = 1001; i <= 1500; ++i )
        {
            buf.push( ( void* )i );
        }
        for( size_t i = 501; i <= 1500; ++i )
        {
            void* val = buf.pop();
            TS_ASSERT_EQUALS( ( size_t )val, i );
        }
        TS_ASSERT_EQUALS( buf.isEmpty(), true );
        void* val = buf.pop();
        TS_ASSERT_EQUALS( ( size_t )val, ( size_t )0 );
    }
};



#endif // _TC_RINGBUFFER_H
