root/src/tests/kits/app/bmessagequeue/MessageQueueTestCase.cpp
/*
        $Id: MessageQueueTestCase.cpp 383 2002-07-22 09:28:00Z tylerdauwalder $
        
        This file implements a base class for testing BMessageQueue functionality.
        
        */


#include "MessageQueueTestCase.h"
#include <MessageQueue.h>
#include "MessageQueue.h"


int testMessageClass::messageDestructorCount = 0;

                

        MessageQueueTestCase::MessageQueueTestCase(
                std::string name) : BThreadedTestCase(name),
                                                        theMessageQueue(new BMessageQueue())
{
        }



        MessageQueueTestCase::~MessageQueueTestCase()
{
        delete theMessageQueue;
        theMessageQueue = NULL;
        }
        
        

        void MessageQueueTestCase::CheckQueueAgainstList(void)
{
        SafetyLock theSafetyLock(theMessageQueue);
        
        if (theMessageQueue->Lock()) {
                CPPUNIT_ASSERT(theMessageQueue->CountMessages() == messageList.CountItems());
                int i;
                for (i = 0; i < theMessageQueue->CountMessages(); i++) {
                        CPPUNIT_ASSERT(theMessageQueue->FindMessage((int32)i) ==
                                        messageList.ItemAt(i));
                }
                theMessageQueue->Unlock();
        }
}



        void MessageQueueTestCase::AddMessage(BMessage *message)
{
        if (theMessageQueue->Lock()) {
                theMessageQueue->AddMessage(message);
                messageList.AddItem(message);
                theMessageQueue->Unlock();
        }
}
        

        void MessageQueueTestCase::RemoveMessage(BMessage *message)
{
        if (theMessageQueue->Lock()) {
                theMessageQueue->RemoveMessage(message);
                messageList.RemoveItem((void *)message);
                theMessageQueue->Unlock();
        }
}
        

        BMessage *MessageQueueTestCase::NextMessage(void)
{
        SafetyLock theSafetyLock(theMessageQueue);
                
        BMessage *result = NULL;
        if (theMessageQueue->Lock()) {
                result = theMessageQueue->NextMessage();
                CPPUNIT_ASSERT(result == messageList.RemoveItem((int32)0));
                theMessageQueue->Unlock();
        }
        return(result);
}



        BMessage *MessageQueueTestCase::FindMessage(uint32 what, int index)
{
        int listCount = messageList.CountItems();
        int i;
        
        for (i = 0; i < listCount; i++) {
                BMessage *theMessage = (BMessage *)messageList.ItemAt(i);
                if (theMessage->what == what) {
                        if (index == 0) {
                                return(theMessage);
                        }
                        index--;
                }
        }
        
        return(NULL);
}