/*
	$Id: DeskbarLocationTest.cpp,v 1.3 2002/09/28 07:27:00 shatty Exp $
	
	This file implements tests for the following use cases of BDeskbar:
	  - Frame
	  - Location
	  - Is Expanded
	  - Set Location
	  - Expand
	
	*/


#include "DeskbarLocationTest.h"
#include <Deskbar.h>
#include <InterfaceDefs.h>


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

	DeskbarLocationTest::DeskbarLocationTest(std::string name) :
		TestCase(name)
{
	}


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

	DeskbarLocationTest::~DeskbarLocationTest()
{
	}
	
	
/*
 *  Method:  DeskbarLocationTest::CheckLocation()
 *   Descr:  This member fuction checks that the passed in location and
 *           expansion state is the actual deskbar state
 */
 

	void DeskbarLocationTest::CheckLocation(BDeskbar *myDeskbar,
	                                        deskbar_location currLocation,
	                                        bool currExpanded,
	                                        bool expandedSetDirectly)
{
	bool isExpanded;
	assert(myDeskbar->Location() == currLocation);
	assert(myDeskbar->Location(&isExpanded) == currLocation);
	
	if ((currLocation == B_DESKBAR_LEFT_TOP) ||
	    (currLocation == B_DESKBAR_RIGHT_TOP) ||
	    (expandedSetDirectly)) {
		assert(myDeskbar->IsExpanded() == currExpanded);
		assert(isExpanded == currExpanded);
	} else if ((currLocation == B_DESKBAR_LEFT_BOTTOM) ||
	           (currLocation == B_DESKBAR_RIGHT_BOTTOM)) {
		assert(!myDeskbar->IsExpanded());
		assert(!isExpanded);
	} else {
		assert(myDeskbar->IsExpanded());
		assert(isExpanded);
	}
	
	BRect myRect(myDeskbar->Frame());
	switch (currLocation) {
		case B_DESKBAR_TOP:
		case B_DESKBAR_LEFT_TOP:
			assert(myRect.top == 0.0);
			assert(myRect.left == 0.0);
			break;
		case B_DESKBAR_BOTTOM:
		case B_DESKBAR_LEFT_BOTTOM:
			assert(myRect.left == 0.0);
			break;
		case B_DESKBAR_RIGHT_TOP:
		case B_DESKBAR_RIGHT_BOTTOM:
			break;
		default:
			assert(false);
			break;
	}
	assert(get_deskbar_frame(&myRect) == B_OK);
	switch (currLocation) {
		case B_DESKBAR_TOP:
		case B_DESKBAR_LEFT_TOP:
			assert(myRect.top == 0.0);
			assert(myRect.left == 0.0);
			break;
		case B_DESKBAR_BOTTOM:
		case B_DESKBAR_LEFT_BOTTOM:
			assert(myRect.left == 0.0);
			break;
		case B_DESKBAR_RIGHT_TOP:
		case B_DESKBAR_RIGHT_BOTTOM:
			break;
		default:
			assert(false);
			break;
	}	
}	
	
/*
 *  Method:  DeskbarLocationTest::TestLocation()
 *   Descr:  This member fuction performs a test of one location of the
 *           deskbar.
 */
 

	void DeskbarLocationTest::TestLocation(BDeskbar *myDeskbar,
	                                       deskbar_location newLocation)
{
	assert(myDeskbar->SetLocation(newLocation) == B_OK);
	CheckLocation(myDeskbar, newLocation, false, false);
	
	assert(myDeskbar->SetLocation(B_DESKBAR_TOP) == B_OK);
	CheckLocation(myDeskbar, B_DESKBAR_TOP, false, false);
	
	assert(myDeskbar->SetLocation(newLocation, false) == B_OK);
	CheckLocation(myDeskbar, newLocation, false, false);
	
	assert(myDeskbar->SetLocation(B_DESKBAR_TOP) == B_OK);
	CheckLocation(myDeskbar, B_DESKBAR_TOP, false, false);
	
	assert(myDeskbar->SetLocation(newLocation, true) == B_OK);
	CheckLocation(myDeskbar, newLocation, true, false);
	
	assert(myDeskbar->Expand(false) == B_OK);
	CheckLocation(myDeskbar, newLocation, false, true);
	
	assert(myDeskbar->Expand(true) == B_OK);
	CheckLocation(myDeskbar, newLocation, true, true);
	}


/*
 *  Method:  DeskbarLocationTest::PerformTest()
 *   Descr:  This member function saves the starting state of the deskbar
 *           and then sets the deskbar location to each individual allowed
 *           state.  Finally, it restores the original location at the end
 *           of the test.
 */


	void DeskbarLocationTest::PerformTest(void)
{
	BDeskbar myDeskbar;
	bool origExpanded;
	deskbar_location origLocation = myDeskbar.Location(&origExpanded);
	
	assert((origLocation == B_DESKBAR_TOP) ||
	       (origLocation == B_DESKBAR_BOTTOM) ||
	       (origLocation == B_DESKBAR_LEFT_BOTTOM) ||
	       (origLocation == B_DESKBAR_RIGHT_BOTTOM) ||
	       (origLocation == B_DESKBAR_LEFT_TOP) ||
	       (origLocation == B_DESKBAR_RIGHT_TOP));
	       
	TestLocation(&myDeskbar, B_DESKBAR_TOP);
	TestLocation(&myDeskbar, B_DESKBAR_BOTTOM);
	TestLocation(&myDeskbar, B_DESKBAR_LEFT_BOTTOM);
	TestLocation(&myDeskbar, B_DESKBAR_RIGHT_BOTTOM);
	TestLocation(&myDeskbar, B_DESKBAR_LEFT_TOP);
	TestLocation(&myDeskbar, B_DESKBAR_RIGHT_TOP);
	
	assert(myDeskbar.SetLocation(origLocation, origExpanded) == B_OK);
	assert(myDeskbar.Location() == origLocation);
	assert(myDeskbar.IsExpanded() == origExpanded);
	}
	

/*
 *  Method:  PropertyConstructionTest::suite()
 *   Descr:  This static member function returns a test caller for performing 
 *           all combinations of "DeskbarLocationTest".
 */

 Test *DeskbarLocationTest::suite(void)
{	
	typedef CppUnit::TestCaller<DeskbarLocationTest>
		DeskbarLocationTestCaller;
		
	return(new DeskbarLocationTestCaller("BDeskbar::Location Test", &DeskbarLocationTest::PerformTest));
	}
