root/src/tests/kits/app/bmessagequeue/AddMessageTest1.cpp
/*
        $Id: AddMessageTest1.cpp 383 2002-07-22 09:28:00Z tylerdauwalder $
        
        This file implements the first test for the Haiku BMessageQueue code.
        It tests the Construction, Destruction, Add Message 1, Count Messages,
        Is Empty and Find Message 1 use cases.  It does so by doing the following:
                - checks that the queue is empty according to IsEmpty() and CountMessages()
                - adds 10000 messages to the queue and a BList
                - as each is added, checks that IsEmpty() is false and CountMessages()
                  returns what is expected
                - the BList contents is compared to the queue contents (uses FindMessage())
                - the number of BMessages destructed is checked, no messages should have been
                  deleted so far.
                - the queue is deleted
                - the number of BMessages destructed should now be 10000
        
        */


#include "AddMessageTest1.h"

#include <assert.h>

#include <Message.h>
#include <MessageQueue.h>

#include "ThreadedTestCaller.h"


/*
 *  Method:  AddMessageTest1::AddMessageTest1()
 *   Descr:  This is the constructor for this class.
 */
                

        AddMessageTest1::AddMessageTest1(std::string name) :
                MessageQueueTestCase(name)
{
        }


/*
 *  Method:  AddMessageTest1::~AddMessageTest1()
 *   Descr:  This is the destructor for this class.
 */
 

        AddMessageTest1::~AddMessageTest1()
{
        }
        
        
/*
 *  Method:  AddMessageTest1::setUp()
 *   Descr:  This member function is called just prior to running the test.
 *           It resets the destructor count for testMessageClass.
 */


        void AddMessageTest1::setUp(void)
{
        testMessageClass::messageDestructorCount = 0;
        }


/*
 *  Method:  AddMessageTest1::PerformTest()
 *   Descr:  This member function performs this test.  It adds
 *           10000 messages to the message queue and confirms that
 *           the queue contains the right messages.  Then it confirms
 *           that all 10000 messages are deleted when the message
 *           queue is deleted.
 */     


        void AddMessageTest1::PerformTest(void)
{
        assert(theMessageQueue->IsEmpty());
        assert(theMessageQueue->CountMessages() == 0);
        
        int i;
        for(i = 0; i < 10000; i++) {
                if (i % (10000 / 10) == 0)
                        NextSubTest();
                BMessage *theMessage = new testMessageClass(i);
                AddMessage(theMessage);
                assert(!theMessageQueue->IsEmpty());
                assert(theMessageQueue->CountMessages() == i + 1);
        }

        NextSubTest();
        CheckQueueAgainstList();
        
        assert(testMessageClass::messageDestructorCount == 0);
        delete theMessageQueue;
        theMessageQueue = NULL;
        NextSubTest();
        assert(testMessageClass::messageDestructorCount == 10000);
}


/*
 *  Method:  AddMessageTest1::suite()
 *   Descr:  This static member function returns a test caller for performing 
 *           all combinations of "AddMessageTest1".  The test
 *           is created as a ThreadedTestCase (typedef'd as
 *           AddMessageTest1Caller) with only one thread.
 */

 Test *AddMessageTest1::suite(void)
{       
        typedef BThreadedTestCaller<AddMessageTest1>
                AddMessageTest1Caller;

        AddMessageTest1 *theTest = new AddMessageTest1("");
        AddMessageTest1Caller *testCaller = new AddMessageTest1Caller("BMessageQueue::Add Message Test #1", theTest);
        testCaller->addThread("A", &AddMessageTest1::PerformTest);
                                
        return(testCaller);
        }