summaryrefslogblamecommitdiffstats
path: root/private/oleutest/oletest/genenum.cpp
blob: c52cca8a582607ef484a445b162611058856056c (plain) (tree)














































































































































































































































































































































                                                                                                 
//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1993.
//
//  File: 	genenum.cpp
//
//  Contents: 	implementation of CGenDataObject
//
//  Classes:
//
//  Functions:
//
//  History:    dd-mmm-yy Author    Comment
//              24-May-94 kennethm  author
//
//--------------------------------------------------------------------------

#include "oletest.h"
#include "genenum.h"

//+-------------------------------------------------------------------------
//
//  Member:     CEnumeratorTest::CEnumeratorTest
//
//  Synopsis:   Constructor
//
//  Effects:
//
//  Arguments:  [penum]		-- Enumerator Interface cast to void*
//		[ElementSize]	-- Size of elements return from next
//		[ElementCount]	-- Numer of elements that should be in the enumeration,
//				   -1 if unknown.
//
//  Requires:
//
//  Returns:
//
//  Signals:
//
//  Modifies:
//
//  Derivation:
//
//  Algorithm:
//
//  History:    dd-mmm-yy Author    Comment
//		24-May-94 kennethm  author
//
//  Notes:
//
//--------------------------------------------------------------------------

CEnumeratorTest::CEnumeratorTest(
		void *penum,
		size_t ElementSize,
		LONG ElementCount,
                HRESULT& rhr)
{
	assert(penum);

	m_pEnumTest = (IGenEnum*)penum;

	m_ElementSize = ElementSize;
	m_ElementCount = ElementCount;

	rhr = m_pEnumTest->Reset();

	if (rhr != S_OK)
	{
		OutputStr(("IEnumnX: Reset failed (%lx)\r\n", rhr));
	}
}



//+-------------------------------------------------------------------------
//
//  Function: 	CEnumeratorTest::GetNext
//
//  Synopsis:	Internal Next Implementation. Does some basic checks on the	
//		return values.
//
//  Effects:
//
//  Arguments:	[celt]		-- the number of items to fetch
//		[pceltFetched]	-- the number of items fetched
//		[phresult]	-- the return from next
//
//  Requires:
//
//  Returns:	True if the basic tests passed, false if they didn't
//		The result of the next call itself is passed in param 3.
//
//  Signals:
//
//  Modifies:
//
//  Algorithm:	Checks:
//		That if s_ok is returned celt and pceltFetched are ==
//		If a verify is provided it is called
//
//  History:    dd-mmm-yy Author    Comment
//              24-May-94 kennethm  author
//
//  Notes:
//
//--------------------------------------------------------------------------

BOOL CEnumeratorTest::GetNext(	ULONG   celt,
		ULONG*  pceltFetched,
		HRESULT* phresult
		)
{
	void* 	prgelt;
	ULONG  	ul;
	BOOL	fRet = TRUE;

	// Allocate memory for the return elements

	prgelt = new char[m_ElementSize * celt];

	assert(prgelt);

	// Call next

	*phresult = m_pEnumTest->Next(celt, prgelt, pceltFetched);

	// If the return result is S_OK make sure the numbers match

	if (*phresult == S_OK)
	{
		if ((pceltFetched) && (celt != *pceltFetched))
		{
			OutputStr(("IEnumX::Next return S_OK but celt"
					" and pceltFetch mismatch.\r\n"));
			return(FALSE);
		}
	}

	// Call verify to make sure the elements are ok.

	if ((*phresult == NOERROR) || (*phresult == ResultFromScode(S_FALSE)))
	{
		// loop through every returned element

		for (ul=0; ul < *pceltFetched ; ul++)
		{
			if (!Verify(prgelt))
			{
				OutputStr(("Data elment %d returned by IEnumX::Next is bad.\r\n",
						ul));

				fRet = FALSE;
				// we keep looping anyway just to
				// free up resources.
			}

			// If the user supplied a cleanup function there is additional
			// memory that needs to be freed

			CleanUp(prgelt);
		}

	}

	free (prgelt);

	return fRet;
}

//+-------------------------------------------------------------------------
//
//  Method: 	CEnumeratorTest::TestNext
//
//  Synopsis:	Test the next enumerator methods
//
//  Effects:
//
//  Arguments:	None.
//
//  Requires:
//
//  Returns:	HRESULT
//
//  Signals:
//
//  Modifies:
//
//  Algorithm:
//
//  History:    dd-mmm-yy Author    Comment
//              24-May-94 kennethm  author
//
//  Notes:
//
//--------------------------------------------------------------------------

HRESULT CEnumeratorTest::TestNext(void)
{
	ULONG	celtFetched;
	LONG	InternalCount = 0;
	HRESULT	hresult;

	// First we want to count the element by doing a next on each one.

	do {
		if (!GetNext(1, &celtFetched, &hresult))
		{
			return ResultFromScode(E_FAIL);
		}
		if (hresult == S_OK)
		{
			InternalCount++;
		}

	} while ( hresult == S_OK );

	// If the user passed in an ammount make sure it matches what we got

	if ((m_ElementCount != -1) && (InternalCount != m_ElementCount))
	{
		OutputStr(("IEnumX: enumerated count and passed count do not match!\r\n"));
		return ResultFromScode(E_FAIL);
	}

	m_pEnumTest->Reset();

	// Make sure we fail on ...Next(celt>1, ...,NULL)

	/* BUGBUG: clipboard enumerator fails on this test

	if (GetNext(2, NULL, &hresult))
	{
		if ((hresult == S_OK ) || (hresult == S_FALSE))
		{
			(("IEnumX: celt>1 pceltFetched==NULL returned S_OK\r\n"));
			return(E_FAIL);
		}
	}
	else
	{
		return(E_FAIL);
	}

	*/

	return(S_OK);

}

//+-------------------------------------------------------------------------
//
//  Method: 	CEnumeratorTest::TestAll
//
//  Synopsis:	This function calls all the tests
//
//  Effects:
//
//  Arguments:	None
//
//  Requires:
//
//  Returns:	HRESULT
//
//  Signals:
//
//  Modifies:
//
//  Algorithm:
//
//  History:    dd-mmm-yy Author    Comment
//              24-May-94 kennethm  author
//
//  Notes:
//
//--------------------------------------------------------------------------

HRESULT CEnumeratorTest::TestAll(void)
{
	return(TestNext());


}




//+-------------------------------------------------------------------------
//
//  Method: 	CEnumeratorTest::VerifyAll
//
//  Synopsis:   Verify entire array of returned results.
//
//  Arguments:	None
//
//  Returns:	HRESULT
//
//  Algorithm:  Just default to saying everything is ok
//
//  History:    dd-mmm-yy Author    Comment
//              24-May-94 ricksa    author
//
//  Notes:
//
//--------------------------------------------------------------------------

BOOL CEnumeratorTest::VerifyAll(void *pv, LONG cl)
{
	return TRUE;
}




//+-------------------------------------------------------------------------
//
//  Method: 	CEnumeratorTest::CleanUp
//
//  Synopsis:   Default implementation of cleanup
//
//  Arguments:  [pv] - pointer to entry enumerated
//
//  Algorithm:  If there is nothing special to free this implementation
//              can be used.
//
//  History:    dd-mmm-yy Author    Comment
//              24-May-94 ricksa    author
//
//--------------------------------------------------------------------------

void  CEnumeratorTest::CleanUp(void *pv)
{
    return;
}