//+----------------------------------------------------------------------------
//
//      File:
//              ctest.hxx
//
//      Contents:
//              Primary include file for Cache Unit Test
//
//      Classes:
//              TestInstance - Instance of cache unit test methods
//
//      History:
//              04-Sep-94    davepl    Created
//
//-----------------------------------------------------------------------------

// 
// PROTOTYPES
//

HRESULT EltIsInArray(STATDATA sdToFind, STATDATA rgStat[], DWORD cCount);
ULONG   __stdcall LaunchTestInstance(void *);
int     ConvHeightInPelsToLHM(HDC, int);
int     ConvWidthInPelsToLHM(HDC, int);
int     mprintf(LPCSTR szFormat, ...);
int     dprintf(LPCSTR szFormat, ...);

//
// Possible states for the unit test
//

typedef enum tagTEST_STATE 
{
    INVALID_STATE,
    TEST_STARTING,
    TESTING_ENUMERATOR,
    SAVE_AND_RELOAD,
    MULTI_CACHE,
    DATA_TEST,
    DRAW_METAFILE_NOW,
    DRAW_METAFILETILED_NOW,
    DRAW_DIB_NOW,
    DRAW_DIBTILED_NOW
} TEST_STATE;


//
// Class which defines one particular Cache Test object
//

class TestInstance
{

private:

    IStorage		*m_pStorage;
    IPersistStorage	*m_pPersistStorage;
    IDataObject		*m_pDataObject;
    IViewObject         *m_pViewObject;
    OLECHAR              m_wszStorage[ MAX_PATH ];
    TEST_STATE           m_State;

public:
    TestInstance();
    ~TestInstance();

    IOleCache		*m_pOleCache;
    IOleCache2		*m_pOleCache2;
    

    HRESULT 		CreateAndInit(LPOLESTR lpwszStgName);
    HRESULT             SaveCache();
    HRESULT             LoadCache();
    HRESULT             SaveAndReload();

    HRESULT		AddMFCacheNode(DWORD *pdwCon);
    HRESULT		AddEMFCacheNode(DWORD *pdwCon);
    HRESULT		AddDIBCacheNode(DWORD *pdwCon);
    HRESULT		AddBITMAPCacheNode(DWORD *pdwCon);
    HRESULT             UncacheFormat(CLIPFORMAT);

    HRESULT 		EnumeratorTest();
    HRESULT             MultiCache(DWORD dwCount);

    HRESULT             CacheDataTest(char *, char *);
    HRESULT             CompareDIB(HGLOBAL);
    HRESULT             CompareMF(HGLOBAL);
    HRESULT             DrawCacheToMetaFilePict(HGLOBAL *, BOOL);
    void                Draw(HDC);
    TEST_STATE          GetCurrentState();
    void                SetCurrentState(TEST_STATE);
};

#ifndef DEF_LINDEX
#define DEF_LINDEX (-1)
#endif

//
// I N L I N E   U T I L I T Y   F U N C T I O N S 
//


//+----------------------------------------------------------------------------
//
//      Member:		MassageErrorCode
//
//      Synopsis:	Takes a given HRESULT and converts it to S_OK if
//                      [hrExpected] is the error code.  If the HRESULT is
//                      not S_OK and not Expected, it is left untouched.
//                      If it was S_OK, it is changed to E_UNEXPECTED.
//
//      Arguments:	[hrExpected]    The acceptable error code
//                      [hrIn]          The error code in question
//
//      Returns:	HRESULT (not as a success value for this fn)
//
//      Notes:
// 
//      History:	23-Aug-94  Davepl	Created
//
//-----------------------------------------------------------------------------

inline HRESULT MassageErrorCode(HRESULT hrExpected, HRESULT hrIn)
{

    if (hrExpected == hrIn)
    {
        return S_OK;
    }
    else if (S_OK == hrIn)
    {
        return E_UNEXPECTED;
    }
    else
    {
        return hrIn;
    }
}