2025-11-28 00:35:46 +09:00

5692 lines
162 KiB
C++

//--------------------------------------------------------------------
// Microsoft OLE DB Test
//
// Copyright (C) 1995-2000 Microsoft Corporation
//
// @doc
//
// @module IRowPos.cpp | Tests for the IRowPosition and IRowPositionChange interfaces.
//
/////////////////////////////////////////////////////////////////////////
// Includes
//
/////////////////////////////////////////////////////////////////////////
#include "modstandard.hpp"
#include "IRowPos.h" //The Header file.
#include "ExtraLib.h" //Usefull functions that we use.
#include "olectl.h" //CONNECT_E_NOCONNECT
/////////////////////////////////////////////////////////////////////////
// Defines
//
/////////////////////////////////////////////////////////////////////////
#define MAX_LISTENERS 3
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Module Values
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// {{ TCW_MODULE_GLOBALS
DECLARE_MODULE_CLSID = { 0x0fd29ae1, 0xe1f4, 0x11d0, { 0x94, 0x46, 0x00, 0xc0, 0x4f, 0xd7, 0x05, 0xe9 }};
DECLARE_MODULE_NAME("IRowPosition");
DECLARE_MODULE_OWNER("Microsoft");
DECLARE_MODULE_DESCRIP("IRowPosition holds the current row on a Rowset");
DECLARE_MODULE_VERSION(795921705);
// TCW_WizardVersion(2)
// TCW_Automation(False)
// }} TCW_MODULE_GLOBALS_END
//--------------------------------------------------------------------
// @func Module level initialization routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleInit(CThisTestModule * pThisTestModule)
{
return CommonModuleInit(pThisTestModule, IID_IRowset, FIVE_ROWS);
}
//--------------------------------------------------------------------
// @func Module level termination routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleTerminate(CThisTestModule * pThisTestModule)
{
return CommonModuleTerminate(pThisTestModule);
}
////////////////////////////////////////////////////////////////////////////
// TCRowPosition
//
////////////////////////////////////////////////////////////////////////////
class TCRowPosition : public CRowset
{
public:
//Constructors
TCRowPosition(WCHAR* pwszTestCaseName = INVALID(WCHAR*));
virtual ~TCRowPosition();
//methods
virtual BOOL Init();
virtual BOOL Terminate();
//helpers
static HRESULT CreateRowPosition(IUnknown* pIRowset, IRowPosition** ppIRowPosition = NULL);
static HRESULT Initialize(IRowPosition* pIRowPosition, IUnknown* pIRowset);
static HRESULT ClearRowPosition(IRowPosition* pIRowPosition);
static HRESULT SetRowPosition(IRowPosition* pIRowPosition, HCHAPTER hChapter, HROW hRow, DBPOSITIONFLAGS dwPosFlags);
static HRESULT GetRowPosition(IRowPosition* pIRowPosition, HCHAPTER* phChapter, HROW* phRow, DBPOSITIONFLAGS* pdwPosFlags);
static HRESULT GetRowset(IRowPosition* pIRowPosition, REFIID riid, IUnknown** ppIRowset);
virtual BOOL VerifyGetRowPosition(IRowPosition* pIRowPosition, HCHAPTER hChapter, HROW hRow, DBPOSITIONFLAGS dwPosFlags);
virtual BOOL VerifySetRowPosition(IRowPosition* pIRowPosition, HCHAPTER hChapter, HROW hRow, DBPOSITIONFLAGS dwPosFlags);
//Connection Points
virtual IConnectionPoint* const pICP();
virtual IConnectionPointContainer* const pICPC();
virtual IEnumConnectionPoints* const pIEnumCP();
virtual IRowPosition* const pIRowPos();
//Notifications
virtual BOOL VerifyDiffCookies(ULONG cCookies, DWORD* rgCookies) const;
virtual BOOL AdviseAll(ULONG* rgCookies, IRowPosition* pIRowPosition = NULL);
virtual BOOL UnadviseAll(ULONG* rgCookies, IRowPosition* pIRowPosition = NULL);
virtual BOOL RestartListeners();
virtual BOOL ResetTimesNotified();
virtual BOOL VerifyTimesNotified(ULONG cTimes, DBREASON eReason = DBREASON_ALL, DBEVENTPHASE ePhase = DBEVENTPHASE_ALL);
virtual BOOL VerifyFailedTodo(DBREASON eReason, DBEVENTPHASE ePhase);
//Enumerations
virtual BOOL VerifyConnectData(ULONG cConnections, CONNECTDATA* rgConnectData, ULONG cCookies, IUnknown** rgpListeners, DWORD* rgCookies);
virtual BOOL FreeConnectData(ULONG cConnections, CONNECTDATA* rgConnectData);
//Thread Functions
static ULONG WINAPI Thread_CreateRowPosition(LPVOID pv);
static ULONG WINAPI Thread_Initialize(LPVOID pv);
static ULONG WINAPI Thread_GetRowset(LPVOID pv);
static ULONG WINAPI Thread_GetRowPosition(LPVOID pv);
static ULONG WINAPI Thread_ClearSetGetCombo(LPVOID pv);
public:
//data
DBCOUNTITEM m_ulTotalRows;
protected:
//data
IConnectionPoint* m_pIConnectionPoint;
IConnectionPointContainer* m_pIConnectionPointContainer;
IEnumConnectionPoints* m_pIEnumConnectionPoints;
IRowPosition* m_pIRowPosition;
//Listeners
ULONG m_cListeners;
CListener* m_rgpListeners[MAX_LISTENERS];
};
TCRowPosition::TCRowPosition(WCHAR* pwszTestCaseName) : CRowset(pwszTestCaseName)
{
//Connection
m_pIConnectionPoint = NULL;
m_pIConnectionPointContainer = NULL;
m_pIEnumConnectionPoints = NULL;
m_pIRowPosition = NULL;
m_ulTotalRows = 0; //the number of rows that we use right now.
m_cListeners = 0;
}
TCRowPosition::~TCRowPosition()
{
}
BOOL TCRowPosition::Init()
{
TBEGIN
ULONG i=0;
//Initialize inherited object
TESTC(CRowset::Init());
//Create Rowset object
TESTC_(CreateRowset(DBPROP_CANHOLDROWS),S_OK);
m_ulTotalRows = GetTotalRows();
//Create RowPosition object
TESTC_(CreateRowPosition(pIRowset(), &m_pIRowPosition),S_OK);
//Obtain the connection point container
TESTC_((QI(m_pIRowPosition,IID_IConnectionPointContainer,(void**)&m_pIConnectionPointContainer)),S_OK);
//Obtain the IRowsetNotify connection point
TESTC_(m_pIConnectionPointContainer->FindConnectionPoint(IID_IRowPositionChange, &m_pIConnectionPoint),S_OK);
//Obtain the IEnumConnectionPoints
TESTC_(m_pIConnectionPointContainer->EnumConnectionPoints(&m_pIEnumConnectionPoints),S_OK);
//Create Listeners
m_cListeners = MAX_LISTENERS;
for(i=0; i<m_cListeners; i++)
{
m_rgpListeners[i] = new CListener(IID_IRowPositionChange, m_pIRowPosition);
SAFE_ADDREF(m_rgpListeners[i]);
}
CLEANUP:
TRETURN
}
BOOL TCRowPosition::Terminate()
{
//Remove Listeners
for(ULONG i=0; i<m_cListeners; i++)
{
SAFE_RELEASE(m_rgpListeners[i]);
}
SAFE_RELEASE(m_pIConnectionPoint);
SAFE_RELEASE(m_pIConnectionPointContainer);
SAFE_RELEASE(m_pIEnumConnectionPoints);
//Release all interfaces
SAFE_RELEASE(m_pIRowPosition);
return CRowset::Terminate();
}
HRESULT TCRowPosition::CreateRowPosition(IUnknown* pIRowset, IRowPosition** ppIRowPosition)
{
HRESULT hr = E_FAIL;
IRowPosition* pIRowPosition = NULL;
//CreateInstance of IRowPosition
hr = CoCreateInstance(CLSID_OLEDB_ROWPOSITIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, IID_IRowPosition, (void**)&pIRowPosition);
if(SUCCEEDED(hr))
{
TESTC(pIRowPosition != NULL);
}
else
{
TESTC(pIRowPosition == NULL);
}
//Initialize
QTESTC_(hr = Initialize(pIRowPosition, pIRowset),S_OK);
CLEANUP:
if(ppIRowPosition)
*ppIRowPosition = pIRowPosition;
else
SAFE_RELEASE(pIRowPosition);
return hr;
}
HRESULT TCRowPosition::Initialize(IRowPosition* pIRowPosition, IUnknown* pIRowset)
{
TBEGIN
ASSERT(pIRowPosition);
return pIRowPosition->Initialize(pIRowset);
}
HRESULT TCRowPosition::ClearRowPosition(IRowPosition* pIRowPosition)
{
TBEGIN
ASSERT(pIRowPosition);
return pIRowPosition->ClearRowPosition();
}
HRESULT TCRowPosition::GetRowset(IRowPosition* pIRowPosition, REFIID riid, IUnknown** ppIRowset)
{
TBEGIN
HRESULT hr = S_OK;
ASSERT(pIRowPosition);
hr = pIRowPosition->GetRowset(riid, ppIRowset);
if(ppIRowset)
{
if(SUCCEEDED(hr))
{
TESTC(*ppIRowset != NULL);
}
else
{
TESTC(*ppIRowset == NULL);
}
}
CLEANUP:
return hr;
}
HRESULT TCRowPosition::SetRowPosition(IRowPosition* pIRowPosition, HCHAPTER hChapter, HROW hRow, DBPOSITIONFLAGS dwPosFlags)
{
TBEGIN
ASSERT(pIRowPosition);
HRESULT hr = E_FAIL;
IRowset* pIRowset = NULL;
//SetRowPosition
hr = pIRowPosition->SetRowPosition(hChapter, hRow, dwPosFlags);
//Need to release the extra row handle reference (if successful)
if(SUCCEEDED(hr) && hRow != DB_NULL_HROW)
{
//GetRowset
TESTC_(GetRowset(pIRowPosition, IID_IRowset, (IUnknown**)&pIRowset),S_OK);
TESTC_(pIRowset->ReleaseRows(1, &hRow, NULL, NULL, NULL),S_OK);
}
CLEANUP:
SAFE_RELEASE(pIRowset);
return hr;
}
HRESULT TCRowPosition::GetRowPosition(IRowPosition* pIRowPosition, HCHAPTER* phChapter, HROW* phRow, DBPOSITIONFLAGS* pdwPosFlags)
{
TBEGIN
ASSERT(pIRowPosition);
HRESULT hr = E_FAIL;
IRowset* pIRowset = NULL;
//GetRowPosition
hr = pIRowPosition->GetRowPosition(phChapter, phRow, pdwPosFlags);
//Need to release the extra row handle reference (if successful)
if(SUCCEEDED(hr) && phRow && *phRow != DB_NULL_HROW)
{
//GetRowset
TESTC_(GetRowset(pIRowPosition, IID_IRowset, (IUnknown**)&pIRowset),S_OK);
TESTC_(pIRowset->ReleaseRows(1, phRow, NULL, NULL, NULL),S_OK);
}
CLEANUP:
SAFE_RELEASE(pIRowset);
return hr;
}
BOOL TCRowPosition::VerifyGetRowPosition(IRowPosition* pIRowPosition, HCHAPTER hChapter, HROW hRow, DBPOSITIONFLAGS dwPosFlags)
{
TBEGIN
ASSERT(pIRowPosition);
HRESULT hr = E_FAIL;
HCHAPTER hChapter2 = INVALID(HCHAPTER);
HROW hRow2 = INVALID(HROW);
DBPOSITIONFLAGS dwPosFlags2 = INVALID(DBPOSITIONFLAGS);
//GetRowPosition (delegate)
TESTC_(hr = GetRowPosition(pIRowPosition, &hChapter2, &hRow2, &dwPosFlags2),S_OK);
//Verify results
TESTC(hChapter == hChapter2);
TESTC(hRow == hRow2);
TESTC(dwPosFlags== dwPosFlags2);
CLEANUP:
TRETURN
}
BOOL TCRowPosition::VerifySetRowPosition(IRowPosition* pIRowPosition, HCHAPTER hChapter, HROW hRow, DBPOSITIONFLAGS dwPosFlags)
{
TBEGIN
ASSERT(pIRowPosition);
HRESULT hr = E_FAIL;
//SetRowPosition (delegate)
TESTC_(hr = SetRowPosition(pIRowPosition, hChapter, hRow, dwPosFlags),S_OK);
//Delegate to our Get Method
TESTC(VerifyGetRowPosition(pIRowPosition, hChapter, hRow, dwPosFlags));
CLEANUP:
TRETURN
}
IRowPosition* const TCRowPosition::pIRowPos()
{
ASSERT(m_pIRowPosition);
return m_pIRowPosition;
}
IConnectionPointContainer* const TCRowPosition::pICPC()
{
ASSERT(m_pIConnectionPointContainer);
return m_pIConnectionPointContainer;
}
IConnectionPoint* const TCRowPosition::pICP()
{
ASSERT(m_pIConnectionPoint);
return m_pIConnectionPoint;
}
IEnumConnectionPoints* const TCRowPosition::pIEnumCP()
{
ASSERT(m_pIEnumConnectionPoints);
return m_pIEnumConnectionPoints;
}
BOOL TCRowPosition::VerifyDiffCookies(ULONG cCookies, DWORD* rgCookie) const
{
//NOTE: When calling this method you should only be checking Cookies from
//the same Container, since Cookies may not be unqiue accross Containers.
//verify different connection cookies
for(ULONG i=0; i<cCookies; i++)
for(ULONG j=i+1; j<cCookies; j++)
if(rgCookie[i] == rgCookie[j])
return FALSE;
return TRUE;
}
BOOL TCRowPosition::AdviseAll(ULONG* rgCookies, IRowPosition* pIRowPosition)
{
TBEGIN
if(pIRowPosition== NULL)
pIRowPosition = m_pIRowPosition;
ASSERT(rgCookies);
ASSERT(pIRowPosition);
//Advise all Listeners to the IRowPosition object
for(ULONG i=0; i<m_cListeners; i++)
{
TESTC(m_rgpListeners[i]->Restart());
TESTC_(m_rgpListeners[i]->Advise(&rgCookies[i], pIRowPosition),S_OK);
TESTC(rgCookies[i] != 0);
}
//Make sure all Cookies are unique
TESTC(VerifyDiffCookies(m_cListeners, rgCookies));
CLEANUP:
TRETURN
}
BOOL TCRowPosition::UnadviseAll(ULONG* rgCookies, IRowPosition* pIRowPosition)
{
TBEGIN
if(pIRowPosition== NULL)
pIRowPosition = m_pIRowPosition;
ASSERT(rgCookies);
ASSERT(pIRowPosition);
//Unadvise all Listeners from the IRowPosition object
for(ULONG i=0; i<m_cListeners; i++)
{
TESTC(rgCookies[i] != 0);
TESTC_(m_rgpListeners[i]->Unadvise(rgCookies[i], pIRowPosition),S_OK);
}
CLEANUP:
TRETURN
}
BOOL TCRowPosition::VerifyTimesNotified(ULONG cTimes, DBREASON eReason, DBEVENTPHASE ePhase)
{
TBEGIN
//Determine the number of times notified for this notification
for(ULONG i=0; i<m_cListeners; i++)
{
QTESTC(m_rgpListeners[i]->GetTimesNotified(eReason, ePhase) == cTimes);
}
CLEANUP:
TRETURN
}
BOOL TCRowPosition::RestartListeners()
{
TBEGIN
//Determine the number of times notified for this notification
for(ULONG i=0; i<m_cListeners; i++)
{
TESTC(m_rgpListeners[i]->Restart());
}
CLEANUP:
TRETURN
}
BOOL TCRowPosition::ResetTimesNotified()
{
TBEGIN
//Determine the number of times notified for this notification
for(ULONG i=0; i<m_cListeners; i++)
{
TESTC(m_rgpListeners[i]->ResetTimesNotified());
}
CLEANUP:
TRETURN
}
BOOL TCRowPosition::VerifyFailedTodo(DBREASON eReason, DBEVENTPHASE ePhase)
{
TBEGIN
ULONG i=0;
//This is kind of a difficult method.
//We need to verify that there was a FAILEDTODO on the particular reason/phase
//The problem is the we also need to verify all previous phases.
//The interesting issue, is that depending upon the order, (who sent the FAILEDTODO)
//Some listeners may have received more notiifcations than others.
//Also if it was the OKTODO phase, some listeners may never receive a FAILEDTODO
//phase, since they were never notified of an event to begin with...
//First just verify that everyone did in fact see a FAILEDTODO
if(ePhase == DBEVENTPHASE_OKTODO)
{
//If started receiveing notifications, then they should have FAILEDTODO
for(i=0; i<m_cListeners; i++)
{
if(m_rgpListeners[i]->GetTimesNotified(eReason))
{
TESTC(m_rgpListeners[i]->GetTimesNotified(eReason, DBEVENTPHASE_FAILEDTODO)==1);
}
}
}
else
{
//Simple, just verify everyone saw a FAILEDTODO
TESTC(VerifyTimesNotified(1, eReason, DBEVENTPHASE_FAILEDTODO));
}
//Now verify the listeners received all phases upto the FAILEDTODO
//For the first Notifications...
switch(ePhase)
{
case DBEVENTPHASE_ABOUTTODO:
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
break;
case DBEVENTPHASE_SYNCHAFTER:
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
break;
case DBEVENTPHASE_DIDEVENT:
case DBEVENTPHASE_FAILEDTODO:
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
break;
};
CLEANUP:
TRETURN
}
BOOL TCRowPosition::VerifyConnectData(ULONG cConnectData, CONNECTDATA* rgConnectData, ULONG cCookies, IUnknown** rgpListeners, DWORD* rgCookies)
{
ASSERT(rgConnectData);
ASSERT(rgpListeners);
ASSERT(rgCookies);
//Need to verify rgConnectData array contains the correct information
//NOTE: rgConnectData doesn't have to be ordered direclty with the order
//that the connections were established.
//NOTE: this function assumes that rgCookies is in the same order as rgpListeners.
ULONG ulFound = 0;
//Loop over the ConnectData
for(ULONG i=0; i<cConnectData; i++)
{
//Must at least be in the valid range for Sink/Cookie!
if(rgConnectData[i].pUnk == NULL || rgConnectData[i].dwCookie == 0)
return FALSE;
//Try to find the cookie in the list of cookies.
//Once the cookie is found, lookup the corresponding listener
for(ULONG j=0; j<cCookies; j++)
{
if(rgConnectData[i].dwCookie==rgCookies[j])
{
if(!VerifyEqualInterface(rgConnectData[i].pUnk, rgpListeners[j]))
return FALSE;
ulFound++;
}
}
}
return ulFound == cConnectData;
}
BOOL TCRowPosition::FreeConnectData(ULONG cConnectData, CONNECTDATA* rgConnectData)
{
//Loop over the ConnectData
for(ULONG i=0; i<cConnectData; i++)
{
SAFE_RELEASE(rgConnectData[i].pUnk);
}
return TRUE;
}
ULONG TCRowPosition::Thread_CreateRowPosition(LPVOID pv)
{
THREAD_BEGIN
CRowset* pThis = (TCRowPosition*)THREAD_FUNC;
ASSERT(pThis);
//Local stack variables
IRowPosition* pIRowPosition = NULL;
ThreadSwitch(); //Let the other thread(s) catch up
//CreateInstance
TESTC_(CreateRowPosition(pThis->pIRowset(), &pIRowPosition),S_OK);
ThreadSwitch(); //Let the other thread(s) catch up
CLEANUP:
SAFE_RELEASE(pIRowPosition);
THREAD_RETURN
}
ULONG TCRowPosition::Thread_Initialize(LPVOID pv)
{
THREAD_BEGIN
TCRowPosition* pThis = (TCRowPosition*)THREAD_FUNC;
IRowPosition* pIRowPosition = (IRowPosition*)THREAD_ARG1;
ASSERT(pThis && pIRowPosition);
HRESULT hr = E_FAIL;
ThreadSwitch(); //Let the other thread(s) catch up
hr = Initialize(pIRowPosition, pThis->pIRowset());
TESTC(hr==S_OK || hr==DB_E_ALREADYINITIALIZED);
ThreadSwitch(); //Let the other thread(s) catch up
CLEANUP:
THREAD_RETURN
}
ULONG TCRowPosition::Thread_GetRowset(LPVOID pv)
{
THREAD_BEGIN
TCRowPosition* pThis = (TCRowPosition*)THREAD_FUNC;
IRowPosition* pIRowPosition = (IRowPosition*)THREAD_ARG1;
ASSERT(pThis && pIRowPosition);
IRowset* pIRowset = NULL;
ThreadSwitch(); //Let the other thread(s) catch up
TESTC_(GetRowset(pIRowPosition, IID_IRowset, (IUnknown**)&pIRowset),S_OK);
ThreadSwitch(); //Let the other thread(s) catch up
CLEANUP:
SAFE_RELEASE(pIRowset);
THREAD_RETURN
}
ULONG TCRowPosition::Thread_GetRowPosition(LPVOID pv)
{
THREAD_BEGIN
TCRowPosition* pThis = (TCRowPosition*)THREAD_FUNC;
IRowPosition* pIRowPosition = (IRowPosition*)THREAD_ARG1;
ASSERT(pThis && pIRowPosition);
HRESULT hr = S_OK;
HCHAPTER hChapter = NULL;
HROW hRow = NULL;
DBPOSITIONFLAGS dwPositionFlags = 0;
ThreadSwitch(); //Let the other thread(s) catch up
//GetRowPosition
TESTC_(hr = GetRowPosition(pIRowPosition, &hChapter, &hRow, &dwPositionFlags),S_OK);
//TODO what should I be checking here for results?
ThreadSwitch(); //Let the other thread(s) catch up
CLEANUP:
THREAD_RETURN
}
ULONG TCRowPosition::Thread_ClearSetGetCombo(LPVOID pv)
{
THREAD_BEGIN
TCRowPosition* pThis = (TCRowPosition*)THREAD_FUNC;
IRowPosition* pIRowPosition = (IRowPosition*)THREAD_ARG1;
HROW* phRow = (HROW*)THREAD_ARG2;
ASSERT(pThis && pIRowPosition && phRow && *phRow);
HRESULT hr = S_OK;
HROW hRow = *phRow;
HCHAPTER hChapter = NULL;
DBPOSITIONFLAGS dwPositionFlags;
ThreadSwitch(); //Let the other thread(s) catch up
//ClearRowPosition
hr = ClearRowPosition(pIRowPosition);
//SetRowPosition
hr = SetRowPosition(pIRowPosition, NULL, hRow, DBPOSITION_OK);
//GetRowPosition
hr = GetRowPosition(pIRowPosition, &hChapter, &hRow, &dwPositionFlags);
ThreadSwitch(); //Let the other thread(s) catch up
THREAD_RETURN
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Test Case Section
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// {{ TCW_TEST_CASE_MAP(TCInitialize)
//--------------------------------------------------------------------
// @class Initializes the IRowPosition
//
class TCInitialize : public TCRowPosition {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCInitialize,TCRowPosition);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember General - Call Initialize with all valid rowset interfaces
int Variation_1();
// @cmember General - Call Initialize with something that does not support IRowset
int Variation_2();
// @cmember Empty
int Variation_3();
// @cmember Boundary - Initialize with a null pointer
int Variation_4();
// @cmember Boundary - Call with an IDispatch
int Variation_5();
// @cmember Boundary - Other non rowset objects
int Variation_6();
// @cmember Empty
int Variation_7();
// @cmember Sequence - Call Initialize twice in a row
int Variation_8();
// @cmember Sequence - Call Initialize the second time with an IUnknown
int Variation_9();
// @cmember Empty
int Variation_10();
// @cmember Stress - Initialize with 3 IRowPositions to the same SourceRowset
int Variation_11();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(TCInitialize)
#define THE_CLASS TCInitialize
BEG_TEST_CASE(TCInitialize, TCRowPosition, L"Initializes the IRowPosition")
TEST_VARIATION(1, L"General - Call Initialize with all valid rowset interfaces")
TEST_VARIATION(2, L"General - Call Initialize with something that does not support IRowset")
TEST_VARIATION(3, L"Empty")
TEST_VARIATION(4, L"Boundary - Initialize with a null pointer")
TEST_VARIATION(5, L"Boundary - Call with an IDispatch")
TEST_VARIATION(6, L"Boundary - Other non rowset objects")
TEST_VARIATION(7, L"Empty")
TEST_VARIATION(8, L"Sequence - Call Initialize twice in a row")
TEST_VARIATION(9, L"Sequence - Call Initialize the second time with an IUnknown")
TEST_VARIATION(10, L"Empty")
TEST_VARIATION(11, L"Stress - Initialize with 3 IRowPositions to the same SourceRowset")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCGetRowset)
//--------------------------------------------------------------------
// @class Returns the current underlying Rowset
//
class TCGetRowset : public TCRowPosition {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCGetRowset,TCRowPosition);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember General - After Initialization, call GetRowset with riid valid.
int Variation_1();
// @cmember General - Call GetRowset with IUnknown
int Variation_2();
// @cmember Empty
int Variation_3();
// @cmember Boundary - Before initialization, call GetRowset with riid null.
int Variation_4();
// @cmember Boundary - Before initialization call GetRowset with riid valid
int Variation_5();
// @cmember Boundary - After Initialization, call GetRowset with riid invalid
int Variation_6();
// @cmember Boundary - Make sure the rowset was AddReffed, by killing the IRowPos, and making sure the Rowset is still valid.
int Variation_7();
// @cmember Empty
int Variation_8();
// @cmember Related - Initialize another IRowPosition with GetRowset from the first one
int Variation_9();
// @cmember Empty
int Variation_10();
// @cmember Multithreaded - CoCreateInstance, Initialize
int Variation_11();
// @cmember Multithreaded - Initialize
int Variation_12();
// @cmember Multithreaded - GetRowset
int Variation_13();
// @cmember Multithreaded - GetRowPosition
int Variation_14();
// @cmember Multithreaded - Clear,Set,Get RowPosition Combo
int Variation_15();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(TCGetRowset)
#define THE_CLASS TCGetRowset
BEG_TEST_CASE(TCGetRowset, TCRowPosition, L"Returns the current underlying Rowset")
TEST_VARIATION(1, L"General - After Initialization, call GetRowset with riid valid.")
TEST_VARIATION(2, L"General - Call GetRowset with IUnknown")
TEST_VARIATION(3, L"Empty")
TEST_VARIATION(4, L"Boundary - Before initialization, call GetRowset with riid null.")
TEST_VARIATION(5, L"Boundary - Before initialization call GetRowset with riid valid")
TEST_VARIATION(6, L"Boundary - After Initialization, call GetRowset with riid invalid")
TEST_VARIATION(7, L"Boundary - Make sure the rowset was AddReffed, by killing the IRowPos, and making sure the Rowset is still valid.")
TEST_VARIATION(8, L"Empty")
TEST_VARIATION(9, L"Related - Initialize another IRowPosition with GetRowset from the first one")
TEST_VARIATION(10, L"Empty")
TEST_VARIATION(11, L"Multithreaded - CoCreateInstance, Initialize")
TEST_VARIATION(12, L"Multithreaded - Initialize")
TEST_VARIATION(13, L"Multithreaded - GetRowset")
TEST_VARIATION(14, L"Multithreaded - GetRowPosition")
TEST_VARIATION(15, L"Multithreaded - Clear,Set,Get RowPosition Combo")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCClearRowPosition)
//--------------------------------------------------------------------
// @class Clears the value of the current hRow
//
class TCClearRowPosition : public TCRowPosition {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCClearRowPosition,TCRowPosition);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember General - Call ClearRowPosition after a call to SetRowPosition
int Variation_1();
// @cmember General - Call ClearRowPosition directly after an Init.
int Variation_2();
// @cmember Empty
int Variation_3();
// @cmember Boundary - Call ClearRowPosition before any calls to Init
int Variation_4();
// @cmember Empty
int Variation_5();
// @cmember Sequence - Call ClearRowPosition twice in a row
int Variation_6();
// @cmember Sequence - Call ClearRowPosition, then a GetRowPosition
int Variation_7();
// @cmember Sequence - Call ClearRowPosition, then a GetnextRows
int Variation_8();
// @cmember Empty
int Variation_9();
// @cmember Multiuser - ClearRowPosition should not affect other IRowPosition's
int Variation_10();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(TCClearRowPosition)
#define THE_CLASS TCClearRowPosition
BEG_TEST_CASE(TCClearRowPosition, TCRowPosition, L"Clears the value of the current hRow")
TEST_VARIATION(1, L"General - Call ClearRowPosition after a call to SetRowPosition")
TEST_VARIATION(2, L"General - Call ClearRowPosition directly after an Init.")
TEST_VARIATION(3, L"Empty")
TEST_VARIATION(4, L"Boundary - Call ClearRowPosition before any calls to Init")
TEST_VARIATION(5, L"Empty")
TEST_VARIATION(6, L"Sequence - Call ClearRowPosition twice in a row")
TEST_VARIATION(7, L"Sequence - Call ClearRowPosition, then a GetRowPosition")
TEST_VARIATION(8, L"Sequence - Call ClearRowPosition, then a GetnextRows")
TEST_VARIATION(9, L"Empty")
TEST_VARIATION(10, L"Multiuser - ClearRowPosition should not affect other IRowPosition's")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCSetRowPosition)
//--------------------------------------------------------------------
// @class Sets the current row position
//
class TCSetRowPosition : public TCRowPosition {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCSetRowPosition,TCRowPosition);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember General - SetRowPosition to an hRow in the middle of many hRows
int Variation_1();
// @cmember General - SetRowPosition to an hRow in the middle of many hRows with DBPOSITION_NOROW
int Variation_2();
// @cmember General - test all the invalid flag values on valid hRows
int Variation_3();
// @cmember Empty
int Variation_4();
// @cmember Boundary - SetRowPosition to null with no rows and DBPOSITION_OK
int Variation_5();
// @cmember Boundary - SetRowPosition to null with no rows and DBPOSITION_NOROW
int Variation_6();
// @cmember Boundary - SetRowPosition to null with no rows and DBPOSITION_BOF
int Variation_7();
// @cmember Boundary - SetRowPosition to null with no rows and DBPOSITION_EOF
int Variation_8();
// @cmember Boundary - SetRowPosition to some hRow with no rows
int Variation_9();
// @cmember Boundary - SetRowPosition to null with one row and DBPOSITION_OK
int Variation_10();
// @cmember Boundary - SetRowPosition to null with one row and DBPOSITION_NOROW
int Variation_11();
// @cmember Boundary - SetRowPosition to null with one row and DBPOSITION_BOF
int Variation_12();
// @cmember Boundary - SetRowPosition to the last row of many
int Variation_13();
// @cmember Boundary - SetRowPosition to the first row of many
int Variation_14();
// @cmember Boundary - SetRowPosition to an invalid (nonexistent
int Variation_15();
// @cmember Boundary - SetRowPosition with a null row handle
int Variation_16();
// @cmember Boundary - SetRowPosition with a deleted row handle
int Variation_17();
// @cmember Empty
int Variation_18();
// @cmember Sequence - Call a valid SetRowPosition in a multi-row scenario after a valid SetRowPosition
int Variation_19();
// @cmember Empty
int Variation_20();
// @cmember Multiuser - SetRowPosition with different IRowPositions but with the same sourcerowset
int Variation_21();
// @cmember Multiuser - SetRowPosition with different IRowPositions and with different sourcerowsets
int Variation_22();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(TCSetRowPosition)
#define THE_CLASS TCSetRowPosition
BEG_TEST_CASE(TCSetRowPosition, TCRowPosition, L"Sets the current row position")
TEST_VARIATION(1, L"General - SetRowPosition to an hRow in the middle of many hRows")
TEST_VARIATION(2, L"General - SetRowPosition to an hRow in the middle of many hRows with DBPOSITION_NOROW")
TEST_VARIATION(3, L"General - test all the invalid flag values on valid hRows")
TEST_VARIATION(4, L"Empty")
TEST_VARIATION(5, L"Boundary - SetRowPosition to null with no rows and DBPOSITION_OK")
TEST_VARIATION(6, L"Boundary - SetRowPosition to null with no rows and DBPOSITION_NOROW")
TEST_VARIATION(7, L"Boundary - SetRowPosition to null with no rows and DBPOSITION_BOF")
TEST_VARIATION(8, L"Boundary - SetRowPosition to null with no rows and DBPOSITION_EOF")
TEST_VARIATION(9, L"Boundary - SetRowPosition to some hRow with no rows")
TEST_VARIATION(10, L"Boundary - SetRowPosition to null with one row and DBPOSITION_OK")
TEST_VARIATION(11, L"Boundary - SetRowPosition to null with one row and DBPOSITION_NOROW")
TEST_VARIATION(12, L"Boundary - SetRowPosition to null with one row and DBPOSITION_BOF")
TEST_VARIATION(13, L"Boundary - SetRowPosition to the last row of many")
TEST_VARIATION(14, L"Boundary - SetRowPosition to the first row of many")
TEST_VARIATION(15, L"Boundary - SetRowPosition to an invalid (nonexistent")
TEST_VARIATION(16, L"Boundary - SetRowPosition with a null row handle")
TEST_VARIATION(17, L"Boundary - SetRowPosition with a deleted row handle")
TEST_VARIATION(18, L"Empty")
TEST_VARIATION(19, L"Sequence - Call a valid SetRowPosition in a multi-row scenario after a valid SetRowPosition")
TEST_VARIATION(20, L"Empty")
TEST_VARIATION(21, L"Multiuser - SetRowPosition with different IRowPositions but with the same sourcerowset")
TEST_VARIATION(22, L"Multiuser - SetRowPosition with different IRowPositions and with different sourcerowsets")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCGetRowPosition)
//--------------------------------------------------------------------
// @class Returns the current row possition
//
class TCGetRowPosition : public TCRowPosition {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCGetRowPosition,TCRowPosition);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember General - GetRowPosition with one row, hRow set.
int Variation_1();
// @cmember General - Make sure it AddRefs the hRows.
int Variation_2();
// @cmember General - GetRowPosition immediately after an Initialize.
int Variation_3();
// @cmember General - GetRowPosition before an Initialize.
int Variation_4();
// @cmember General - GetRowPosition after a ClearRowPosition.
int Variation_5();
// @cmember Empty
int Variation_6();
// @cmember Parameters - GetRowPosition with hChapter NULL
int Variation_7();
// @cmember Parameters - GetRowPosition with phRow NULL
int Variation_8();
// @cmember Parameters - GetRowPosition with pdwPositionFlags NULL
int Variation_9();
// @cmember Parameters - GetRowPosition with all params NULL
int Variation_10();
// @cmember Empty
int Variation_11();
// @cmember Multiuser - Call GetNextRows with multiple IRowPositions.
int Variation_12();
// @cmember Empty
int Variation_13();
// @cmember Related - Make sure GetnextRows is not being interfered with
int Variation_14();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(TCGetRowPosition)
#define THE_CLASS TCGetRowPosition
BEG_TEST_CASE(TCGetRowPosition, TCRowPosition, L"Returns the current row possition")
TEST_VARIATION(1, L"General - GetRowPosition with one row, hRow set.")
TEST_VARIATION(2, L"General - Make sure it AddRefs the hRows.")
TEST_VARIATION(3, L"General - GetRowPosition immediately after an Initialize.")
TEST_VARIATION(4, L"General - GetRowPosition before an Initialize.")
TEST_VARIATION(5, L"General - GetRowPosition after a ClearRowPosition.")
TEST_VARIATION(6, L"Empty")
TEST_VARIATION(7, L"Parameters - GetRowPosition with hChapter NULL")
TEST_VARIATION(8, L"Parameters - GetRowPosition with phRow NULL")
TEST_VARIATION(9, L"Parameters - GetRowPosition with pdwPositionFlags NULL")
TEST_VARIATION(10, L"Parameters - GetRowPosition with all params NULL")
TEST_VARIATION(11, L"Empty")
TEST_VARIATION(12, L"Multiuser - Call GetNextRows with multiple IRowPositions.")
TEST_VARIATION(13, L"Empty")
TEST_VARIATION(14, L"Related - Make sure GetnextRows is not being interfered with")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCAddRelease)
//--------------------------------------------------------------------
// @class Testing AddRef, Release, and QI
//
class TCAddRelease : public TCRowPosition {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCAddRelease,TCRowPosition);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember AddRef - Make sure it increments
int Variation_1();
// @cmember AddRef - 100 times, and make sure it increments
int Variation_2();
// @cmember AddRef - and Release combo 100 times
int Variation_3();
// @cmember Empty
int Variation_4();
// @cmember Release - Make sure it decrements
int Variation_5();
// @cmember Release - 100 times and make sure it decrements
int Variation_6();
// @cmember Empty
int Variation_7();
// @cmember QI - for IRowPosition
int Variation_8();
// @cmember QI - for someting non-existent
int Variation_9();
// @cmember QI - for IUnknown
int Variation_10();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(TCAddRelease)
#define THE_CLASS TCAddRelease
BEG_TEST_CASE(TCAddRelease, TCRowPosition, L"Testing AddRef, Release, and QI")
TEST_VARIATION(1, L"AddRef - Make sure it increments")
TEST_VARIATION(2, L"AddRef - 100 times, and make sure it increments")
TEST_VARIATION(3, L"AddRef - and Release combo 100 times")
TEST_VARIATION(4, L"Empty")
TEST_VARIATION(5, L"Release - Make sure it decrements")
TEST_VARIATION(6, L"Release - 100 times and make sure it decrements")
TEST_VARIATION(7, L"Empty")
TEST_VARIATION(8, L"QI - for IRowPosition")
TEST_VARIATION(9, L"QI - for someting non-existent")
TEST_VARIATION(10, L"QI - for IUnknown")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCOnRowPositionChange)
//--------------------------------------------------------------------
// @class Functions that are called when a row changes
//
class TCOnRowPositionChange : public TCRowPosition {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCOnRowPositionChange,TCRowPosition);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember General - return S_OK
int Variation_1();
// @cmember General - return S_FALSE
int Variation_2();
// @cmember General - return S_FALSE on an fCantDeny.
int Variation_3();
// @cmember General - return DB_S_UNWANTEDPHASE
int Variation_4();
// @cmember General - return DB_S_UNWANTEDREASON
int Variation_5();
// @cmember General - return E_FAIL
int Variation_6();
// @cmember General - return E_OUTOFMEMORY
int Variation_7();
// @cmember Empty
int Variation_8();
// @cmember Test in all four phases
int Variation_9();
// @cmember Empty
int Variation_10();
// @cmember Sequence - Advise inbetween seperate notifications
int Variation_11();
// @cmember Sequence - Advise during a notification
int Variation_12();
// @cmember Sequence - Unadvise inbetween seperate notification
int Variation_13();
// @cmember Sequence - Unadvise during a notification
int Variation_14();
// @cmember Empty
int Variation_15();
// @cmember SetRowPosition - Error Cases - FAILEDTODO
int Variation_16();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(TCOnRowPositionChange)
#define THE_CLASS TCOnRowPositionChange
BEG_TEST_CASE(TCOnRowPositionChange, TCRowPosition, L"Functions that are called when a row changes")
TEST_VARIATION(1, L"General - return S_OK")
TEST_VARIATION(2, L"General - return S_FALSE")
TEST_VARIATION(3, L"General - return S_FALSE on an fCantDeny.")
TEST_VARIATION(4, L"General - return DB_S_UNWANTEDPHASE")
TEST_VARIATION(5, L"General - return DB_S_UNWANTEDREASON")
TEST_VARIATION(6, L"General - return E_FAIL")
TEST_VARIATION(7, L"General - return E_OUTOFMEMORY")
TEST_VARIATION(8, L"Empty")
TEST_VARIATION(9, L"Test in all four phases")
TEST_VARIATION(10, L"Empty")
TEST_VARIATION(11, L"Sequence - Advise inbetween seperate notifications")
TEST_VARIATION(12, L"Sequence - Advise during a notification")
TEST_VARIATION(13, L"Sequence - Unadvise inbetween seperate notification")
TEST_VARIATION(14, L"Sequence - Unadvise during a notification")
TEST_VARIATION(15, L"Empty")
TEST_VARIATION(16, L"SetRowPosition - Error Cases - FAILEDTODO")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCConnectionStuff)
//--------------------------------------------------------------------
// @class Testing all the connection routines
//
class TCConnectionStuff : public TCRowPosition {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCConnectionStuff,TCRowPosition);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember General: Container: QI for IID_IConnectionPointContainer
int Variation_1();
// @cmember Container: AddRef
int Variation_2();
// @cmember Container: Release
int Variation_3();
// @cmember Container: FindConnectionPoint for a connection
int Variation_4();
// @cmember Container EnumConnectionPoints
int Variation_5();
// @cmember Container: Next should work until there are no more
int Variation_6();
// @cmember Container: Clone
int Variation_7();
// @cmember Container: Reset should go to the beginning
int Variation_8();
// @cmember Container: The Second one should still be on the end
int Variation_9();
// @cmember Container: Skip should skip one
int Variation_10();
// @cmember Connections: EnumConnections
int Variation_11();
// @cmember Connections: Next should work until there are no more
int Variation_12();
// @cmember Connections: Clone
int Variation_13();
// @cmember Conenctions: Reset should go to the beginning
int Variation_14();
// @cmember Connections: Skip should skip one
int Variation_15();
// @cmember Point: GetConnectionInterface should return succesful
int Variation_16();
// @cmember Point: GetConnectionPointContainer should work with a valid pointer
int Variation_17();
// @cmember B/NULL: Container: QI for IID_NULL
int Variation_18();
// @cmember Container: FindConnectionPoint for IID_NULL
int Variation_19();
// @cmember Container: FindConnectionPoint for ppCP is NULL
int Variation_20();
// @cmember Enum: Next with a rgpcd NULL
int Variation_21();
// @cmember Enum: Skip on the second one should still be at the end
int Variation_22();
// @cmember Container: Enum should fail for a NULL pointer
int Variation_23();
// @cmember Enum: reset twice in a row
int Variation_24();
// @cmember Enum: clone where ppIEnum is NULL
int Variation_25();
// @cmember Point: GetConectionInterface with pIID NULL
int Variation_26();
// @cmember Point: GetConectionPointContainer with ppCPC null
int Variation_27();
// @cmember Point: Unadvise before advising should fail
int Variation_28();
// @cmember Point: advise with pointers NULL
int Variation_29();
// @cmember point: Unadvise with pointers NULL
int Variation_30();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(TCConnectionStuff)
#define THE_CLASS TCConnectionStuff
BEG_TEST_CASE(TCConnectionStuff, TCRowPosition, L"Testing all the connection routines")
TEST_VARIATION(1, L"General: Container: QI for IID_IConnectionPointContainer")
TEST_VARIATION(2, L"Container: AddRef")
TEST_VARIATION(3, L"Container: Release")
TEST_VARIATION(4, L"Container: FindConnectionPoint for a connection")
TEST_VARIATION(5, L"Container EnumConnectionPoints")
TEST_VARIATION(6, L"Container: Next should work until there are no more")
TEST_VARIATION(7, L"Container: Clone")
TEST_VARIATION(8, L"Container: Reset should go to the beginning")
TEST_VARIATION(9, L"Container: The Second one should still be on the end")
TEST_VARIATION(10, L"Container: Skip should skip one")
TEST_VARIATION(11, L"Connections: EnumConnections")
TEST_VARIATION(12, L"Connections: Next should work until there are no more")
TEST_VARIATION(13, L"Connections: Clone")
TEST_VARIATION(14, L"Conenctions: Reset should go to the beginning")
TEST_VARIATION(15, L"Connections: Skip should skip one")
TEST_VARIATION(16, L"Point: GetConnectionInterface should return succesful")
TEST_VARIATION(17, L"Point: GetConnectionPointContainer should work with a valid pointer")
TEST_VARIATION(18, L"B/NULL: Container: QI for IID_NULL")
TEST_VARIATION(19, L"Container: FindConnectionPoint for IID_NULL")
TEST_VARIATION(20, L"Container: FindConnectionPoint for ppCP is NULL")
TEST_VARIATION(21, L"Enum: Next with a rgpcd NULL")
TEST_VARIATION(22, L"Enum: Skip on the second one should still be at the end")
TEST_VARIATION(23, L"Container: Enum should fail for a NULL pointer")
TEST_VARIATION(24, L"Enum: reset twice in a row")
TEST_VARIATION(25, L"Enum: clone where ppIEnum is NULL")
TEST_VARIATION(26, L"Point: GetConectionInterface with pIID NULL")
TEST_VARIATION(27, L"Point: GetConectionPointContainer with ppCPC null")
TEST_VARIATION(28, L"Point: Unadvise before advising should fail")
TEST_VARIATION(29, L"Point: advise with pointers NULL")
TEST_VARIATION(30, L"point: Unadvise with pointers NULL")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCTransactions)
//*-----------------------------------------------------------------------
// @class Testing RowPos within transactions
//
class TCTransactions : public CTransaction {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCTransactions,CTransaction);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember COMMIT - fRetaning == TRUE
int Variation_1();
// @cmember COMMIT - fRetaning == FALSE
int Variation_2();
// @cmember ABORT - fRetaning == TRUE
int Variation_3();
// @cmember ABORT - fRetaning == FALSE
int Variation_4();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(TCTransactions)
#define THE_CLASS TCTransactions
BEG_TEST_CASE(TCTransactions, CTransaction, L"Testing RowPos within transactions")
TEST_VARIATION(1, L"COMMIT - fRetaning == TRUE")
TEST_VARIATION(2, L"COMMIT - fRetaning == FALSE")
TEST_VARIATION(3, L"ABORT - fRetaning == TRUE")
TEST_VARIATION(4, L"ABORT - fRetaning == FALSE")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// }} END_DECLARE_TEST_CASES()
// {{ TCW_TESTMODULE(ThisModule)
TEST_MODULE(9, ThisModule, gwszModuleDescrip)
TEST_CASE(1, TCInitialize)
TEST_CASE(2, TCGetRowset)
TEST_CASE(3, TCClearRowPosition)
TEST_CASE(4, TCSetRowPosition)
TEST_CASE(5, TCGetRowPosition)
TEST_CASE(6, TCAddRelease)
TEST_CASE(7, TCOnRowPositionChange)
TEST_CASE(8, TCConnectionStuff)
TEST_CASE(9, TCTransactions)
END_TEST_MODULE()
// }} TCW_TESTMODULE_END
// {{ TCW_TC_PROTOTYPE(TCInitialize)
//*-----------------------------------------------------------------------
//| Test Case: TCInitialize - Initializes the IRowPosition
//| Created: 06/10/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCInitialize::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCRowPosition::Init())
// }}
{
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc General - Call Initialize with all valid rowset interfaces
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCInitialize::Variation_1()
{
TBEGIN
IUnknown* pIUnkRowset = NULL;
//Initialize the RowPosition. It should return S_OK.
TESTC_(CreateRowPosition(pIRowset()),S_OK);
//Rowset IUnknown
TESTC_(QI(pIRowset(), IID_IUnknown, (void**)&pIUnkRowset),S_OK);
TESTC_(CreateRowPosition(pIUnkRowset), S_OK);
CLEANUP:
SAFE_RELEASE(pIUnkRowset);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc General - Call Initialize with something that does not support IRowset
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCInitialize::Variation_2()
{
TBEGIN
IUnknown* pIUnkPos = NULL;
//Non-rowset IUnknown
TESTC_(QI(pIRowPos(), IID_IUnknown, (void**)&pIUnkPos),S_OK);
TESTC_(CreateRowPosition(pIUnkPos), E_NOINTERFACE);
CLEANUP:
SAFE_RELEASE(pIUnkPos);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCInitialize::Variation_3()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Boundary - Initialize with a null pointer
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCInitialize::Variation_4()
{
TBEGIN
TESTC_(CreateRowPosition(NULL), E_INVALIDARG);
TESTC_(CreateRowPosition(g_pIDBInitialize),E_NOINTERFACE);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Boundary - Call with an IDispatch
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCInitialize::Variation_5()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
IDispatch* pIDispatch = NULL;
IRowset* pIRowsetUnk = NULL;
HRESULT hr = E_FAIL;
//Create RowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
hr = pIRowPosition->GetRowset(IID_IDispatch, (IUnknown**)&pIDispatch);
//Verify results
//Not all providers rowsets have to support IDispatch
if( hr == E_NOINTERFACE )
{
TESTC(pIDispatch == NULL);
}
if( hr == S_OK )
{
TESTC( pIDispatch != NULL);
TESTC_(QI(pIDispatch, IID_IRowset, (void**)&pIRowsetUnk),S_OK);
TESTC( pIRowsetUnk != NULL);
}
CLEANUP:
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIRowsetUnk);
SAFE_RELEASE(pIDispatch);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Boundary - Other non rowset objects
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCInitialize::Variation_6()
{
//Since we are using Schema and Sources Rowsets, this variation will be different.
TBEGIN
ISourcesRowset* pISourcesRowset= NULL;
IRowsetInfo* pIRowsetInfo = NULL;
//Get a SchemaRowset and test it.
CRowset RowsetA;
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_DBSCHEMA_TABLE)==S_OK);
TESTC_(CreateRowPosition(RowsetA()),S_OK);
//How about with a pointer to the Enumerator...
TESTC_(CoCreateInstance(CLSID_OLEDB_ENUMERATOR, NULL, CLSCTX_INPROC_SERVER, IID_ISourcesRowset, (void**)&pISourcesRowset),S_OK);
TESTC_(CreateRowPosition(pISourcesRowset),E_NOINTERFACE);
//But the rowset from the Enumerator should be successful
TESTC_(pISourcesRowset->GetSourcesRowset(NULL, IID_IRowsetInfo, 0, NULL, (IUnknown**)&pIRowsetInfo),S_OK);
TESTC_(CreateRowPosition(pIRowsetInfo),S_OK);
CLEANUP:
SAFE_RELEASE(pISourcesRowset);
SAFE_RELEASE(pIRowsetInfo);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCInitialize::Variation_7()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc Sequence - Call Initialize twice in a row
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCInitialize::Variation_8()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(pIRowPosition->Initialize(pIRowset()),DB_E_ALREADYINITIALIZED);
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc Sequence - Call Initialize the second time with an IUnknown
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCInitialize::Variation_9()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
IRowPosition* pIRowPosition2 = NULL;
//get the IUnknown off of the other pIRowPosition.
TESTC_(QI(pIRowPos(), IID_IRowPosition, (void**)&pIRowPosition),S_OK);
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition2),S_OK);
//Second Init... .should fail
TESTC_(pIRowPos()->Initialize(pIRowPosition),DB_E_ALREADYINITIALIZED);
CLEANUP:
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIRowPosition2);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCInitialize::Variation_10()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc Stress - Initialize with 3 IRowPositions to the same SourceRowset
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCInitialize::Variation_11()
{
//Can we init 3 RowPosition's to one Rowset?
TBEGIN
IRowPosition* rgpIRowPosition[3] = {NULL,NULL,NULL};
ULONG i;
for(i=0; i<3; i++)
{
TESTC_(CreateRowPosition(pIRowset(), &rgpIRowPosition[i]),S_OK);
}
CLEANUP:
for(i=0; i<3; i++ )
SAFE_RELEASE(rgpIRowPosition[i]);
TRETURN
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCInitialize::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCRowPosition::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(TCGetRowset)
//*-----------------------------------------------------------------------
//| Test Case: TCGetRowset - Returns the current underlying Rowset
//| Created: 06/10/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCGetRowset::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCRowPosition::Init())
// }}
{
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc General - After Initialization, call GetRowset with riid valid.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_1()
{
TBEGIN
IUnknown* pIUnknown = NULL;
//Call GetRowset for the IRowset
TESTC_(pIRowPos()->GetRowset(IID_IRowset, &pIUnknown),S_OK);
TESTC(pIUnknown == pIRowset());
CLEANUP:
SAFE_RELEASE(pIUnknown);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc General - Call GetRowset with IUnknown
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_2()
{
TBEGIN
IUnknown* pIUnknown = NULL;
IUnknown* pIUnknown2 = NULL;
TESTC_(pIRowPos()->GetRowset(IID_IUnknown, &pIUnknown),S_OK);
TESTC_(QI(pIRowset(), IID_IUnknown, (void**)&pIUnknown2),S_OK);
TESTC(pIUnknown == pIUnknown2);
CLEANUP:
SAFE_RELEASE(pIUnknown);
SAFE_RELEASE(pIUnknown2);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_3()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Boundary - Before initialization, call GetRowset with riid null.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_4()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
IUnknown* pIUnknown = NULL;
//Create new instance
TESTC_(CoCreateInstance(CLSID_OLEDB_ROWPOSITIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, IID_IRowPosition, (LPVOID *)&pIRowPosition),S_OK);
TESTC_(pIRowPosition->GetRowset(IID_NULL, &pIUnknown),E_UNEXPECTED);
TESTC(pIUnknown == NULL);
TESTC_(pIRowPosition->GetRowset(IID_IRowset, &pIUnknown),E_UNEXPECTED);
TESTC(pIUnknown == NULL);
//Valid cases with CoCreateInstance
TESTC_(CoCreateInstance(CLSID_OLEDB_ROWPOSITIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (LPVOID *)&pIUnknown),S_OK);
TESTC(pIUnknown != NULL);
SAFE_RELEASE(pIUnknown);
//Invalid cases with CoCreateInstance
TESTC_(CoCreateInstance(CLSID_OLEDB_ROWPOSITIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, IID_IRowset, (LPVOID *)&pIUnknown), E_NOINTERFACE);
TESTC_(CoCreateInstance(CLSID_OLEDB_ROWPOSITIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (LPVOID *)&pIUnknown), E_NOINTERFACE);
TESTC_(CoCreateInstance(CLSID_OLEDB_ROWPOSITIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, IID_IRowPositionChange, (LPVOID *)&pIUnknown), E_NOINTERFACE);
TESTC_(CoCreateInstance(CLSID_OLEDB_ROWPOSITIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, IID_IConnectionPointContainer, (LPVOID *)&pIUnknown), S_OK);
CLEANUP:
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIUnknown);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Boundary - Before initialization call GetRowset with riid valid
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_5()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
IUnknown* pIUnknown= NULL;
TESTC_(CoCreateInstance(CLSID_OLEDB_ROWPOSITIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, IID_IRowPosition, (LPVOID *)&pIRowPosition),S_OK);
TESTC_(pIRowPosition->GetRowset(IID_IRowset, &pIUnknown),E_UNEXPECTED);
TESTC(pIUnknown == NULL);
CLEANUP:
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIUnknown);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Boundary - After Initialization, call GetRowset with riid invalid
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_6()
{
TBEGIN
IUnknown* pIUnknown = NULL;
TESTC_(pIRowPos()->GetRowset(IID_ICommand, &pIUnknown),E_NOINTERFACE);
TESTC(pIUnknown == NULL);
CLEANUP:
SAFE_RELEASE(pIUnknown);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Boundary - Make sure the rowset was AddReffed, by killing the IRowPos, and making sure the Rowset is still valid.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_7()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
IRowset* pIRowsetUnk = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(pIRowPosition->GetRowset(IID_IRowset, (IUnknown**)&pIRowsetUnk),S_OK);
//Make sure rowset is still valid after RowPosition release!
SAFE_RELEASE(pIRowPosition);
TEST2C_(pIRowsetUnk->RestartPosition(NULL),S_OK,DB_S_COMMANDREEXECUTED);
CLEANUP:
SAFE_RELEASE(pIRowsetUnk);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_8()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc Related - Initialize another IRowPosition with GetRowset from the first one
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_9()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
IUnknown* pIRowset = NULL;
TESTC_(pIRowPos()->GetRowset(IID_IRowset, &pIRowset),S_OK);
TESTC_(CreateRowPosition(pIRowset, &pIRowPosition),S_OK);
CLEANUP:
SAFE_RELEASE(pIRowset);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_10()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc Multithreaded - CoCreateInstance, Initialize
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_11()
{
TBEGIN
INIT_THREADS(THREE_THREADS);
//Setup Thread Arguments
//There are none in this case.
THREADARG T1Arg = { this };
THREADARG T2Arg = { this };
THREADARG T3Arg = { this };
//Create Threads
CREATE_THREAD(THREAD_ONE, Thread_CreateRowPosition,&T1Arg);
CREATE_THREAD(THREAD_TWO, Thread_CreateRowPosition,&T2Arg);
CREATE_THREAD(THREAD_THREE, Thread_CreateRowPosition,&T3Arg);
START_THREADS();
END_THREADS();
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc Multithreaded - Initialize
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_12()
{
INIT_THREADS(10);
//Setup Thread Arguments
//There are none in this case.
THREADARG T1Arg = { this, pIRowPos() };
//Create Threads
CREATE_THREADS(Thread_Initialize, &T1Arg);
START_THREADS();
END_THREADS();
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(13)
//*-----------------------------------------------------------------------
// @mfunc Multithreaded - GetRowset
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_13()
{
INIT_THREADS(10);
//Setup Thread Arguments
//There are none in this case.
THREADARG T1Arg = { this, pIRowPos() };
//Create Threads
CREATE_THREADS(Thread_GetRowset, &T1Arg);
START_THREADS();
END_THREADS();
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(14)
//*-----------------------------------------------------------------------
// @mfunc Multithreaded - GetRowPosition
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_14()
{
INIT_THREADS(10);
//Setup Thread Arguments
//There are none in this case.
THREADARG T1Arg = { this, pIRowPos() };
//Create Threads
CREATE_THREADS(Thread_GetRowPosition, &T1Arg);
START_THREADS();
END_THREADS();
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(15)
//*-----------------------------------------------------------------------
// @mfunc Multithreaded - Clear,Set,Get RowPosition Combo
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowset::Variation_15()
{
TBEGIN
HROW hRow = DB_NULL_HROW;
INIT_THREADS(10);
//Setup Thread Arguments
//There are none in this case.
THREADARG T1Arg = { this, pIRowPos(), &hRow };
TESTC_(RestartPosition(),S_OK);
TESTC_(GetNextRows(&hRow),S_OK);
//Create Threads
CREATE_THREADS(Thread_ClearSetGetCombo, &T1Arg);
START_THREADS();
END_THREADS();
CLEANUP:
ReleaseRows(hRow);
TRETURN
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCGetRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCRowPosition::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(TCClearRowPosition)
//*-----------------------------------------------------------------------
//| Test Case: TCClearRowPosition - Clears the value of the current hRow
//| Created: 06/13/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCClearRowPosition::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCRowPosition::Init())
// }}
{
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc General - Call ClearRowPosition after a call to SetRowPosition
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCClearRowPosition::Variation_1()
{
TBEGIN
HROW hRow = 101; //Random start value
TESTC_(ClearRowPosition(pIRowPos()),S_OK);
//Make sure we're at the beginning, and then set to that first row.
TESTC_(RestartPosition(),S_OK);
TESTC_(GetNextRows(&hRow),S_OK);
TESTC_(SetRowPosition(pIRowPos(), DB_NULL_HCHAPTER, hRow, DBPOSITION_OK),S_OK);
TESTC_(ClearRowPosition(pIRowPos()),S_OK);
TESTC(VerifyGetRowPosition(pIRowPos(), DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
CLEANUP:
ReleaseRows(hRow);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc General - Call ClearRowPosition directly after an Init.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCClearRowPosition::Variation_2()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCClearRowPosition::Variation_3()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Boundary - Call ClearRowPosition before any calls to Init
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCClearRowPosition::Variation_4()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
TESTC_(CoCreateInstance(CLSID_OLEDB_ROWPOSITIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, IID_IRowPosition, (LPVOID *)&pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),E_UNEXPECTED);
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCClearRowPosition::Variation_5()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Sequence - Call ClearRowPosition twice in a row
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCClearRowPosition::Variation_6()
{
TBEGIN
//Use Local to make sure we know what state it started in.
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),E_UNEXPECTED);
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Sequence - Call ClearRowPosition, then a GetRowPosition
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCClearRowPosition::Variation_7()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc Sequence - Call ClearRowPosition, then a GetnextRows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCClearRowPosition::Variation_8()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
HROW hRow1=DB_NULL_HROW;
HROW hRow2=DB_NULL_HROW;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(RestartPosition(),S_OK);
TESTC_(GetNextRows(&hRow1),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(GetNextRows(&hRow2),S_OK);
TESTC(hRow1 != hRow2);
CLEANUP:
ReleaseRows(hRow1);
ReleaseRows(hRow2);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCClearRowPosition::Variation_9()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc Multiuser - ClearRowPosition should not affect other IRowPosition's
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCClearRowPosition::Variation_10()
{
TBEGIN
HROW hRow;
IRowPosition* pIRowPosition = NULL;
IRowPosition* pIRowPosition2 = NULL;
IRowPosition* pIRowPosition3 = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition2),S_OK);
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition3),S_OK);
TESTC_(RestartPosition(),S_OK);
TESTC_(GetNextRows(&hRow),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition2),S_OK);
TESTC_(ClearRowPosition(pIRowPosition3),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,hRow,DBPOSITION_OK),S_OK);
TESTC_(SetRowPosition(pIRowPosition2, DB_NULL_HCHAPTER,hRow,DBPOSITION_OK),S_OK);
TESTC_(SetRowPosition(pIRowPosition3, DB_NULL_HCHAPTER,hRow,DBPOSITION_OK),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(SetRowPosition(pIRowPosition2, DB_NULL_HCHAPTER,hRow,DBPOSITION_OK),E_UNEXPECTED);
TESTC_(SetRowPosition(pIRowPosition3, DB_NULL_HCHAPTER,hRow,DBPOSITION_OK),E_UNEXPECTED);
CLEANUP:
ReleaseRows(hRow);
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIRowPosition2);
SAFE_RELEASE(pIRowPosition3);
TRETURN
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCClearRowPosition::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCRowPosition::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(TCSetRowPosition)
//*-----------------------------------------------------------------------
//| Test Case: TCSetRowPosition - Sets the current row position
//| Created: 06/13/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCSetRowPosition::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCRowPosition::Init())
// }}
{
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc General - SetRowPosition to an hRow in the middle of many hRows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_1()
{
TBEGIN
HROW hRow = DB_NULL_HROW;
//Obtain second row
TESTC_(ClearRowPosition(pIRowPos()),S_OK);
TESTC_(GetRow(SECOND_ROW, &hRow),S_OK);
TESTC(VerifySetRowPosition(pIRowPos(), DB_NULL_HCHAPTER, hRow, DBPOSITION_OK));
CLEANUP:
ReleaseRows(hRow);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc General - SetRowPosition to an hRow in the middle of many hRows with DBPOSITION_NOROW
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_2()
{
TBEGIN
HROW hRow = DB_NULL_HROW;
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(GetRow(SECOND_ROW, &hRow),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow, DBPOSITION_NOROW), E_INVALIDARG);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
CLEANUP:
ReleaseRows(hRow);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc General - test all the invalid flag values on valid hRows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_3()
{
// NOTE: Tests both BOF and EOF in one variation
TBEGIN
IRowPosition* pIRowPosition = NULL;
HROW hRow = DB_NULL_HROW;
ULONG i=0;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(RestartPosition(),S_OK);
TESTC_(GetRow(SECOND_ROW, &hRow),S_OK);
//DBPOSITION_BOF
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,hRow,DBPOSITION_BOF),E_INVALIDARG);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
//DBPOSITION_EOF
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,hRow,DBPOSITION_EOF),E_INVALIDARG);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
//ULONG_MAX
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,hRow,ULONG_MAX),E_INVALIDARG);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
CLEANUP:
ReleaseRows(hRow);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_4()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition to null with no rows and DBPOSITION_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_5()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
//Create Empty rowset
CRowset EmptyRowset;
TESTC_PROVIDER(EmptyRowset.CreateRowset(SELECT_EMPTYROWSET)==S_OK);
TESTC_(CreateRowPosition(EmptyRowset.pIRowset(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifySetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_NOROW));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition to null with no rows and DBPOSITION_NOROW
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_6()
{
TBEGIN
HROW hRow = DB_NULL_HROW;
IRowPosition* pIRowPosition = NULL;
//Create Empty rowset
CRowset EmptyRowset;
TESTC_PROVIDER(EmptyRowset.CreateRowset(SELECT_EMPTYROWSET)==S_OK);
TESTC_(CreateRowPosition(EmptyRowset.pIRowset(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifySetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_NOROW));
CLEANUP:
EmptyRowset.ReleaseRows(hRow);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition to null with no rows and DBPOSITION_BOF
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_7()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
//Create Empty rowset
CRowset EmptyRowset;
TESTC_PROVIDER(EmptyRowset.CreateRowset(SELECT_EMPTYROWSET)==S_OK);
TESTC_(CreateRowPosition(EmptyRowset.pIRowset(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifySetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_BOF));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition to null with no rows and DBPOSITION_EOF
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_8()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
//Create Empty rowset
CRowset EmptyRowset;
TESTC_PROVIDER(EmptyRowset.CreateRowset(SELECT_EMPTYROWSET)==S_OK);
TESTC_(CreateRowPosition(EmptyRowset.pIRowset(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifySetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_EOF));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition to some hRow with no rows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_9()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
//Create Empty rowset
CRowset EmptyRowset;
TESTC_PROVIDER(EmptyRowset.CreateRowset(SELECT_EMPTYROWSET)==S_OK);
TESTC_(CreateRowPosition(EmptyRowset.pIRowset(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,ULONG_MAX,DBPOSITION_OK),DB_E_BADROWHANDLE);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,ULONG_MAX,DBPOSITION_EOF),E_UNEXPECTED);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition to null with one row and DBPOSITION_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_10()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
//Create 1 row rowset
CRowset Rowset1Row;
TESTC_(Rowset1Row.CreateRowset(SELECT_ALLFROMTBL, IID_IRowset, g_p1RowTable),S_OK);
TESTC_(CreateRowPosition(Rowset1Row(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_OK),E_INVALIDARG);
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition to null with one row and DBPOSITION_NOROW
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_11()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
//Create 1 row rowset
CRowset Rowset1Row;
TESTC_(Rowset1Row.CreateRowset(SELECT_ALLFROMTBL, IID_IRowset, g_p1RowTable),S_OK);
TESTC_(CreateRowPosition(Rowset1Row(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifySetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_NOROW));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition to null with one row and DBPOSITION_BOF
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_12()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
//Create 1 row rowset
CRowset Rowset1Row;
TESTC_(Rowset1Row.CreateRowset(SELECT_ALLFROMTBL, IID_IRowset, g_p1RowTable),S_OK);
TESTC_(CreateRowPosition(Rowset1Row(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifySetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_BOF));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(13)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition to the last row of many
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_13()
{
TBEGIN
HROW hRow = NULL;
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(RestartPosition(),S_OK);
TESTC_(GetRow(m_ulTotalRows, &hRow),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifySetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow, DBPOSITION_OK));
CLEANUP:
ReleaseRows(hRow);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(14)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition to the first row of many
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_14()
{
TBEGIN
HROW hRow = NULL;
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(RestartPosition(),S_OK);
TESTC_(GetRow(FIRST_ROW, &hRow),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifySetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow, DBPOSITION_OK));
CLEANUP:
ReleaseRows(hRow);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(15)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition to an invalid (nonexistent
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_15()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,123,DBPOSITION_OK),DB_E_BADROWHANDLE);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,123,DBPOSITION_EOF),E_UNEXPECTED);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(16)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition with a null row handle
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_16()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_NOROW),S_OK);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(17)
//*-----------------------------------------------------------------------
// @mfunc Boundary - SetRowPosition with a deleted row handle
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_17()
{
TBEGIN
HROW hRow = NULL;
IRowPosition* pIRowPosition = NULL;
//Create rowset with IRowsetChange
CRowsetChange RowsetChangeA;
TESTC_PROVIDER(RowsetChangeA.CreateRowset()==S_OK);
TESTC_(CreateRowPosition(RowsetChangeA.pIRowset(), &pIRowPosition),S_OK);
TESTC_(RowsetChangeA.RestartPosition(),S_OK);
//Delete the last row so we don't mess up the first row for the other
//variations. Since some provider may have REMOVEDELETED=FALSE and GetNextRows
//would then return a deleted row...
TESTC_(RowsetChangeA.GetRow(m_ulTotalRows, &hRow),S_OK);
TESTC_(RowsetChangeA.DeleteRow(hRow),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow,DBPOSITION_OK), DB_E_BADROWHANDLE);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
CLEANUP:
RowsetChangeA.ReleaseRows(hRow);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(18)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_18()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(19)
//*-----------------------------------------------------------------------
// @mfunc Sequence - Call a valid SetRowPosition in a multi-row scenario after a valid SetRowPosition
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_19()
{
TBEGIN
HROW hRow = DB_NULL_HROW;
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(RestartPosition(NULL),S_OK);
TESTC_(GetRow(SECOND_ROW, &hRow),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow, DBPOSITION_OK),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow, DBPOSITION_OK),E_UNEXPECTED);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow, DBPOSITION_OK));
CLEANUP:
ReleaseRows(hRow);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(20)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_20()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(21)
//*-----------------------------------------------------------------------
// @mfunc Multiuser - SetRowPosition with different IRowPositions but with the same sourcerowset
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_21()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
IRowPosition* pIRowPosition2 = NULL;
HROW hRow = NULL;
HROW hRow2 = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition2),S_OK);
TESTC_(RestartPosition(NULL),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(GetNextRows(&hRow),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow,DBPOSITION_OK),S_OK);
TESTC_(ClearRowPosition(pIRowPosition2),S_OK);
TESTC_(GetNextRows(&hRow2),S_OK);
TESTC_(SetRowPosition(pIRowPosition2, DB_NULL_HCHAPTER,hRow2,DBPOSITION_OK),S_OK);
//Verify RowPositons
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow, DBPOSITION_OK));
TESTC(VerifyGetRowPosition(pIRowPosition2, DB_NULL_HCHAPTER, hRow2, DBPOSITION_OK));
CLEANUP:
ReleaseRows(hRow);
ReleaseRows(hRow2);
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIRowPosition2);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(22)
//*-----------------------------------------------------------------------
// @mfunc Multiuser - SetRowPosition with different IRowPositions and with different sourcerowsets
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCSetRowPosition::Variation_22()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
IRowPosition* pIRowPosition2 = NULL;
HROW hRow = NULL;
HROW hRow2 = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition2),S_OK);
TESTC_(RestartPosition(NULL),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(GetNextRows(&hRow),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow,DBPOSITION_OK),S_OK);
TESTC_(ClearRowPosition(pIRowPosition2),S_OK);
TESTC_(GetNextRows(&hRow2),S_OK);
TESTC_(SetRowPosition(pIRowPosition2, DB_NULL_HCHAPTER,hRow2,DBPOSITION_OK),S_OK);
//Verify RowPositons
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow, DBPOSITION_OK));
TESTC(VerifyGetRowPosition(pIRowPosition2, DB_NULL_HCHAPTER, hRow2, DBPOSITION_OK));
CLEANUP:
ReleaseRows(hRow);
ReleaseRows(hRow2);
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIRowPosition2);
TRETURN
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCSetRowPosition::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCRowPosition::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(TCGetRowPosition)
//*-----------------------------------------------------------------------
//| Test Case: TCGetRowPosition - Returns the current row possition
//| Created: 06/16/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCGetRowPosition::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCRowPosition::Init())
// }}
{
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc General - GetRowPosition with one row, hRow set.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_1()
{
TBEGIN
HROW hRow = DB_NULL_HROW;
IRowPosition* pIRowPosition = NULL;
//Create Rowset
CRowset RowsetA;
RowsetA.SetProperty(DBPROP_CANHOLDROWS);
TESTC_(RowsetA.CreateRowset(SELECT_ALLFROMTBL, IID_IRowset, g_p1RowTable),S_OK);
TESTC_(CreateRowPosition(RowsetA(), &pIRowPosition),S_OK);
TESTC_(RowsetA.GetRow(FIRST_ROW, &hRow),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifySetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow, DBPOSITION_OK));
CLEANUP:
RowsetA.ReleaseRows(hRow);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc General - Make sure it AddRefs the hRows.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_2()
{
TBEGIN
HROW hRow = NULL;
IRowPosition* pIRowPosition = NULL;
void* pData = NULL;
HCHAPTER hChapter = NULL;
DBPOSITIONFLAGS dwPositionFlags = 0;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(RestartPosition(NULL),S_OK);
TESTC_(GetRow(SECOND_ROW, &hRow),S_OK);
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow, DBPOSITION_OK),S_OK);
TESTC_(GetRowPosition(pIRowPosition, &hChapter, &hRow, &dwPositionFlags),S_OK);
TESTC_(GetRowData(hRow, &pData),S_OK);
CLEANUP:
SAFE_RELEASE(pIRowPosition);
ReleaseRows(hRow);
PROVIDER_FREE(pData);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc General - GetRowPosition immediately after an Initialize.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_3()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC(VerifyGetRowPosition(pIRowPos(), DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc General - GetRowPosition before an Initialize.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_4()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
TESTC_(CoCreateInstance(CLSID_OLEDB_ROWPOSITIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, IID_IRowPosition, (LPVOID *)&pIRowPosition),S_OK);
TESTC(VerifyGetRowPosition(pIRowPos(), DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc General - GetRowPosition after a ClearRowPosition.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_5()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_NOROW));
CLEANUP:
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_6()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Parameters - GetRowPosition with hChapter NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_7()
{
TBEGIN
HROW hRow = 101; //Random values.
DBPOSITIONFLAGS dwPositionFlags = 101;
//Spec allow phChapter to be null if is not interested in the hChapter
TESTC_(GetRowPosition(pIRowPos(), NULL, &hRow, &dwPositionFlags), S_OK);
TESTC(hRow == DB_NULL_HROW && dwPositionFlags == DBPOSITION_NOROW);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc Parameters - GetRowPosition with phRow NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_8()
{
TBEGIN
HCHAPTER hChapter = 101; //Random values.
DBPOSITIONFLAGS dwPositionFlags = 101;
//E_INVALIDARG - Spec requires phRow
TESTC_(GetRowPosition(pIRowPos(), &hChapter, NULL, &dwPositionFlags),E_INVALIDARG);
TESTC(hChapter == DB_NULL_HCHAPTER && dwPositionFlags == DBPOSITION_NOROW);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc Parameters - GetRowPosition with pdwPositionFlags NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_9()
{
TBEGIN
HROW hRow = 101;
HCHAPTER hChapter = 101; //Random values.
//Spec allows pdwPositionFlags = NULL if not interested in dwPosFlags...
TESTC_(GetRowPosition(pIRowPos(), &hChapter, &hRow, NULL), S_OK);
TESTC(hChapter == DB_NULL_HCHAPTER && hRow == DB_NULL_HROW);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc Parameters - GetRowPosition with all params NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_10()
{
TBEGIN
TESTC_(GetRowPosition(pIRowPos(), NULL, NULL, NULL),E_INVALIDARG);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_11()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc Multiuser - Call GetNextRows with multiple IRowPositions.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_12()
{
TBEGIN
HROW hRow=DB_NULL_HROW;
HROW hRow2=DB_NULL_HROW;
IRowPosition* pIRowPosition = NULL;
IRowPosition* pIRowPosition2 = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition2),S_OK);
TESTC_(RestartPosition(NULL),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(ClearRowPosition(pIRowPosition2),S_OK);
TESTC_(GetNextRows(&hRow),S_OK);
TESTC_(SetRowPosition(pIRowPosition2, DB_NULL_HCHAPTER,hRow,DBPOSITION_OK),S_OK);
TESTC_(GetNextRows(&hRow2),S_OK);
TESTC(VerifyGetRowPosition(pIRowPosition2, DB_NULL_HCHAPTER, hRow, DBPOSITION_OK));
CLEANUP:
ReleaseRows(hRow);
ReleaseRows(hRow2);
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIRowPosition2);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(13)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_13()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(14)
//*-----------------------------------------------------------------------
// @mfunc Related - Make sure GetnextRows is not being interfered with
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCGetRowPosition::Variation_14()
{
TBEGIN
HROW hRow=DB_NULL_HROW;
HROW hRow2=DB_NULL_HROW;
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC_(RestartPosition(NULL),S_OK);
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC_(GetNextRows(&hRow),S_OK);
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,hRow,DBPOSITION_OK),S_OK);
TESTC_(GetNextRows(&hRow2),S_OK);
TESTC(VerifyGetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, hRow, DBPOSITION_OK));
CLEANUP:
ReleaseRows(hRow);
ReleaseRows(hRow2);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCGetRowPosition::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCRowPosition::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(TCAddRelease)
//*-----------------------------------------------------------------------
//| Test Case: TCAddRelease - Testing AddRef, Release, and QI
//| Created: 06/23/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCAddRelease::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCRowPosition::Init())
// }}
{
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc AddRef - Make sure it increments
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCAddRelease::Variation_1()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC(pIRowPosition->AddRef() > 0);
TESTC(pIRowPosition->Release() > 0);
TESTC(VerifyRefCounts(pIRowPosition->Release(), 0));
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc AddRef - 100 times, and make sure it increments
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCAddRelease::Variation_2()
{
TBEGIN
ULONG i=0;
IRowPosition* pIRowPosition = NULL;
//Create RowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
for(i=0; i<100; i++)
{
TESTC(pIRowPosition->AddRef() > 0);
}
for(i=0; i<100; i++)
{
TESTC(pIRowPosition->Release() > 0);
}
TESTC(VerifyRefCounts(pIRowPosition->Release(), 0));
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc AddRef - and Release combo 100 times
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCAddRelease::Variation_3()
{
TBEGIN
ULONG i=0;
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
for(i=0; i<100; i++)
{
TESTC(pIRowPosition->AddRef() > 0);
TESTC(pIRowPosition->Release() > 0);
}
TESTC(VerifyRefCounts(pIRowPosition->Release(), 0));
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCAddRelease::Variation_4()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Release - Make sure it decrements
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCAddRelease::Variation_5()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC(pIRowPosition->AddRef() > 0);
TESTC(pIRowPosition->Release() > 0);
TESTC(VerifyRefCounts(pIRowPosition->Release(), 0));
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Release - 100 times and make sure it decrements
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCAddRelease::Variation_6()
{
TBEGIN
ULONG i=0;
IRowPosition* pIRowPosition = NULL;
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
for(i=0; i<100; i++)
{
TESTC(pIRowPosition->AddRef() > 0);
}
for(i=0; i<100; i++)
{
TESTC(pIRowPosition->Release() > 0);
}
TESTC(VerifyRefCounts(pIRowPosition->Release(), 0));
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCAddRelease::Variation_7()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc QI - for IRowPosition
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCAddRelease::Variation_8()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
IRowPosition* pIRowPosition2 = NULL;
TESTC_(QI(pIRowPos(), IID_IRowPosition, (void**)&pIRowPosition),S_OK);
TESTC_(QI(pIRowPosition, IID_IRowPosition, (void**)&pIRowPosition2),S_OK);
CLEANUP:
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIRowPosition2);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc QI - for someting non-existent
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCAddRelease::Variation_9()
{
TBEGIN
IUnknown* pIUnknown = NULL;
TESTC_(QI(pIRowPos(), IID_NULL, (void**)&pIUnknown), E_NOINTERFACE);
TESTC(pIUnknown== NULL);
CLEANUP:
SAFE_RELEASE(pIUnknown);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc QI - for IUnknown
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCAddRelease::Variation_10()
{
TBEGIN
IUnknown* pIUnknown = NULL;
IUnknown* pIUnknown2 = NULL;
TESTC_(QI(pIRowPos(), IID_IUnknown, (void**)&pIUnknown),S_OK);
TESTC_(QI(pIUnknown, IID_IUnknown, (void**)&pIUnknown2),S_OK);
TESTC(pIUnknown == pIUnknown2);
CLEANUP:
SAFE_RELEASE(pIUnknown);
SAFE_RELEASE(pIUnknown2);
TRETURN
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCAddRelease::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCRowPosition::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(TCOnRowPositionChange)
//*-----------------------------------------------------------------------
//| Test Case: TCOnRowPositionChange - Functions that are called when a row changes
//| Created: 06/23/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCOnRowPositionChange::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCRowPosition::Init())
// }}
{
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc General - return S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_1()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
IRowPosition* pIRowPosition = NULL;
//CreateRowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
//Advise all Listeners
TESTC(AdviseAll(rgCookies, pIRowPosition));
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
//Set RowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(4));
TESTC(ResetTimesNotified());
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
//Set RowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(4));
TESTC(ResetTimesNotified());
CLEANUP:
UnadviseAll(rgCookies, pIRowPosition);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc General - return S_FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_2()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
IRowPosition* pIRowPosition = NULL;
//CreateRowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
//Advise all Listeners
TESTC(AdviseAll(rgCookies, pIRowPosition));
//Clear RowPosition
TESTC(m_rgpListeners[0]->SetCancel(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC_(ClearRowPosition(pIRowPosition),DB_E_CANCELED);
//Verify Results
TESTC(VerifyFailedTodo(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(ResetTimesNotified());
//SetRowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_EOF),E_UNEXPECTED);
TESTC(VerifyTimesNotified(0));
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),DB_E_CANCELED);
TESTC(VerifyFailedTodo(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
CLEANUP:
UnadviseAll(rgCookies, pIRowPosition);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc General - return S_FALSE on an fCantDeny.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_3()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
IRowPosition* pIRowPosition = NULL;
//CreateRowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
//Advise all Listeners
TESTC(AdviseAll(rgCookies, pIRowPosition));
TESTC(m_rgpListeners[0]->SetCancel(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
//SetRowPosition
//You cannot veto SYNCHAFTER and DIDEVENT phases of DBREASON_ROWPOSITION_CHANGED
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(4));
//Clear RowPosition
TESTC(ResetTimesNotified());
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
CLEANUP:
UnadviseAll(rgCookies, pIRowPosition);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc General - return DB_S_UNWANTEDPHASE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_4()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
IRowPosition* pIRowPosition = NULL;
//CreateRowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC(AdviseAll(rgCookies, pIRowPosition));
//Set which Phases as unwanted (DB_S_UNWANTEDPHASE)
TESTC(m_rgpListeners[0]->SetEvent(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO, FALSE));
TESTC(m_rgpListeners[1]->SetEvent(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO, FALSE));
TESTC(m_rgpListeners[2]->SetEvent(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER, FALSE));
TESTC(m_rgpListeners[0]->SetEvent(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT, FALSE));
TESTC(m_rgpListeners[1]->SetEvent(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_FAILEDTODO, FALSE));
//ClearRowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
//The first time all should have been notified.
//You have to be notified first before you can return DB_S_UNWANTEDPHASE
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
//SetRowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(4));
TESTC(ResetTimesNotified());
//Now that all phases have been notified, the Provider Should make a
//note of which phases I wasn't interested in and not fire them this time...
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(0 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(0 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
//Now that all phases have been notified, the Provider Should make a
//note of which phases I wasn't interested in and not fire them this time...
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_EOF),S_OK);
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(0 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(0 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
//Now we need to generate the FAILEDTODO phase as well...
TESTC(RestartListeners());
TESTC(m_rgpListeners[0]->SetCancel(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(m_rgpListeners[0]->SetEvent(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_FAILEDTODO, FALSE));
//Verify results, should all have received FAILEDTODO for the first time
TESTC_(ClearRowPosition(pIRowPosition),DB_E_CANCELED);
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_FAILEDTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_FAILEDTODO));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_FAILEDTODO));
TESTC(ResetTimesNotified());
//Now that all phases have been notified, the Provider Should make a
//note of which phases I wasn't interested in and not fire them this time...
TESTC_(ClearRowPosition(pIRowPosition),DB_E_CANCELED);
TESTC(0 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_FAILEDTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_FAILEDTODO));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_FAILEDTODO));
CLEANUP:
UnadviseAll(rgCookies, pIRowPosition);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc General - return DB_S_UNWANTEDREASON
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_5()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
IRowPosition* pIRowPosition = NULL;
//CreateRowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
TESTC(AdviseAll(rgCookies, pIRowPosition));
//Set which reasons as unwanted (DB_S_UNWANTEDREASON)
TESTC(m_rgpListeners[0]->SetEvent(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ALL, FALSE));
TESTC(m_rgpListeners[0]->SetEvent(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_ALL, FALSE));
TESTC(m_rgpListeners[2]->SetEvent(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_ALL, FALSE));
//ClearRowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
//The first time all should have been notified, for only the first phase
//You have to be notified first before you can return DB_S_UNWANTEDREASON
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(0 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(ResetTimesNotified());
//SetRowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_EOF),S_OK);
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(0 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(0 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(ResetTimesNotified());
//Now that all phases have been notified, the Provider Should make a
//note of which reasons I wasn't interested in and not fire them this time...
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(0 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(0 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(ResetTimesNotified());
//Now that all phases have been notified, the Provider Should make a
//note of which phases I wasn't interested in and not fire them this time...
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER,DB_NULL_HROW,DBPOSITION_EOF),S_OK);
TESTC(0 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(0 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(0 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(0 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(ResetTimesNotified());
//Now we need to generate the FAILEDTODO phase as well...
TESTC(ResetTimesNotified());
TESTC(m_rgpListeners[1]->SetCancel(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC_(ClearRowPosition(pIRowPosition),DB_E_CANCELED);
//Verify results, should not have been notified FAILEDTODO for the one not interested
TESTC(ResetTimesNotified());
TESTC_(ClearRowPosition(pIRowPosition),DB_E_CANCELED);
TESTC(0 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_FAILEDTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_FAILEDTODO));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_FAILEDTODO));
CLEANUP:
UnadviseAll(rgCookies, pIRowPosition);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc General - return E_FAIL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_6()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
IRowPosition* pIRowPosition = NULL;
//CreateRowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
//Advise all Listeners
TESTC(AdviseAll(rgCookies, pIRowPosition));
//Set E_FAIL
TESTC(m_rgpListeners[0]->SetError(E_FAIL));
TESTC(m_rgpListeners[1]->SetError(E_FAIL));
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
//Set RowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(4));
TESTC(ResetTimesNotified());
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
//Set RowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(4));
TESTC(ResetTimesNotified());
CLEANUP:
UnadviseAll(rgCookies, pIRowPosition);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc General - return E_OUTOFMEMORY
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_7()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
IRowPosition* pIRowPosition = NULL;
//CreateRowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
//Advise all Listeners
TESTC(AdviseAll(rgCookies, pIRowPosition));
//Set E_FAIL
TESTC(m_rgpListeners[0]->SetError(E_OUTOFMEMORY));
TESTC(m_rgpListeners[1]->SetError(E_OUTOFMEMORY));
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
//Set RowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(4));
TESTC(ResetTimesNotified());
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
//Set RowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(4));
TESTC(ResetTimesNotified());
CLEANUP:
UnadviseAll(rgCookies, pIRowPosition);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_8()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc Test in all four phases
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_9()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
IRowPosition* pIRowPosition = NULL;
//CreateRowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
//Advise all Listeners
TESTC(AdviseAll(rgCookies, pIRowPosition));
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
//Set RowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(4));
TESTC(ResetTimesNotified());
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
//Set RowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(4));
TESTC(ResetTimesNotified());
CLEANUP:
UnadviseAll(rgCookies, pIRowPosition);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_10()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(11)
//--------------------------------------------------------------------
// @mfunc Sequence - Advise inbetween seperate notifications
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_11()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS*2];
IRowPosition* pIRowPosition = NULL;
//CreateRowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
//Advise all Listeners
TESTC(AdviseAll(rgCookies, pIRowPosition));
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
//Set RowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(4));
//Advise all Listeners (again)
TESTC(AdviseAll(&rgCookies[MAX_LISTENERS], pIRowPosition));
//Clear RowPosition
TESTC(ResetTimesNotified());
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(2, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(2, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(4));
//Set RowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(2, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(2, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(8));
TESTC(ResetTimesNotified());
CLEANUP:
UnadviseAll(rgCookies, pIRowPosition);
UnadviseAll(&rgCookies[MAX_LISTENERS], pIRowPosition);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc Sequence - Advise during a notification
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_12()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
//Advise all Listeners
TESTC(AdviseAll(rgCookies, pIRowPos()));
//Indicate this is the Listener to Advise during the Callback
m_rgpListeners[2]->SetAdvise(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO);
//Clear RowPosition
//Listeners advised in the middle should not receive notifications
TESTC_(ClearRowPosition(pIRowPos()),S_OK);
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(ResetTimesNotified());
//Set RowPosition
TESTC_(SetRowPosition(pIRowPos(), DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(ResetTimesNotified());
m_rgpListeners[2]->SetUnadvise(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT);
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPos()),S_OK);
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(ResetTimesNotified());
//Set RowPosition
TESTC_(SetRowPosition(pIRowPos(), DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(ResetTimesNotified());
CLEANUP:
UnadviseAll(rgCookies, pIRowPos());
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(13)
//--------------------------------------------------------------------
// @mfunc Sequence - Unadvise inbetween seperate notification
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_13()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS*2];
IRowPosition* pIRowPosition = NULL;
//CreateRowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
//Advise all Listeners
TESTC(AdviseAll(rgCookies, pIRowPosition));
//Advise all Listeners (again)
TESTC(AdviseAll(&rgCookies[MAX_LISTENERS], pIRowPosition));
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(2, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(2, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(4));
//Set RowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(2, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(2, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(8));
//Unadvise inbetween notifications
UnadviseAll(rgCookies, pIRowPosition);
//Clear RowPosition
TESTC(ResetTimesNotified());
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(VerifyTimesNotified(2));
//Set RowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(VerifyTimesNotified(1, DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(VerifyTimesNotified(4));
TESTC(ResetTimesNotified());
CLEANUP:
UnadviseAll(&rgCookies[MAX_LISTENERS], pIRowPosition);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(14)
//*-----------------------------------------------------------------------
// @mfunc Sequence - Unadvise during a notification
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_14()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
//Advise all Listeners
TESTC(AdviseAll(rgCookies, pIRowPos()));
//Indicate this is the Listener to Advise during the Callback
m_rgpListeners[2]->SetAdvise(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO);
//Clear RowPosition
//Listeners advised in the middle should not receive notifications
TESTC_(ClearRowPosition(pIRowPos()),S_OK);
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(ResetTimesNotified());
//Set RowPosition
TESTC_(SetRowPosition(pIRowPos(), DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(ResetTimesNotified());
m_rgpListeners[2]->SetUnadvise(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT);
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPos()),S_OK);
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_OKTODO));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CLEARED, DBEVENTPHASE_ABOUTTODO));
TESTC(ResetTimesNotified());
//Set RowPosition
TESTC_(SetRowPosition(pIRowPos(), DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_EOF),S_OK);
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[0]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[1]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(2 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_SYNCHAFTER));
TESTC(1 == m_rgpListeners[2]->GetTimesNotified(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_DIDEVENT));
TESTC(ResetTimesNotified());
CLEANUP:
UnadviseAll(rgCookies, pIRowPos());
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(15)
//*-----------------------------------------------------------------------
// @mfunc Empty
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_15()
{
// TO DO: Add your own code here
return TRUE;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(16)
//*-----------------------------------------------------------------------
// @mfunc SetRowPosition - Error Cases - FAILEDTODO
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCOnRowPositionChange::Variation_16()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
IRowPosition* pIRowPosition = NULL;
//CreateRowPosition
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
//Advise all Listeners
TESTC(AdviseAll(rgCookies, pIRowPosition));
//Clear RowPosition
TESTC_(ClearRowPosition(pIRowPosition),S_OK);
//SetRowPosition
TESTC_(SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, DB_NULL_HROW, DBPOSITION_OK),E_INVALIDARG);
TESTC(VerifyFailedTodo(DBREASON_ROWPOSITION_CHANGED, DBEVENTPHASE_ABOUTTODO));
CLEANUP:
UnadviseAll(rgCookies, pIRowPosition);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCOnRowPositionChange::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCRowPosition::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(TCConnectionStuff)
//*-----------------------------------------------------------------------
//| Test Case: TCConnectionStuff - Testing all the connection routines
//| Created: 06/26/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCConnectionStuff::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCRowPosition::Init())
// }}
{
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc General: Container: QI for IID_IConnectionPointContainer
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_1()
{
TBEGIN
IConnectionPointContainer* pICPC= NULL;
IUnknown* pIUnknown= NULL;
TESTC_(QI(pIRowPos(), IID_IConnectionPointContainer, (void**)&pICPC),S_OK);
TESTC_(QI(pICPC, IID_IConnectionPointContainer, (void**)&pIUnknown),S_OK);
TESTC(pICPC != NULL && pIUnknown != NULL);
SAFE_RELEASE(pIUnknown);
TESTC_(pICPC->QueryInterface(IID_IUnknown,(void**)&pIUnknown),S_OK);
TESTC(pIUnknown != NULL);
CLEANUP:
SAFE_RELEASE(pIUnknown);
SAFE_RELEASE(pICPC);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Container: AddRef
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_2()
{
TBEGIN
IConnectionPointContainer* pICPC = NULL;
//Get Current RefCount
ULONG ulOrgRefCount = GetRefCount(pIRowPos());
TESTC_(QI(pIRowPos(), IID_IConnectionPointContainer, (void**)&pICPC),S_OK);
TESTC(VerifyRefCounts(GetRefCount(pICPC), ulOrgRefCount+1));
CLEANUP:
SAFE_RELEASE(pICPC);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Container: Release
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_3()
{
TBEGIN
IConnectionPointContainer* pICPC = NULL;
//Get Current RefCount
ULONG ulOrgRefCount = GetRefCount(pIRowPos());
TESTC_(QI(pIRowPos(), IID_IConnectionPointContainer, (void**)&pICPC),S_OK);
TESTC(VerifyRefCounts(GetRefCount(pICPC), ulOrgRefCount+1));
TESTC(VerifyRefCounts(pICPC->Release(), ulOrgRefCount));
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Container: FindConnectionPoint for a connection
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_4()
{
TBEGIN
IConnectionPoint* pIConnectionPoint= NULL;
TESTC_(pICPC()->FindConnectionPoint(IID_IRowPositionChange, &pIConnectionPoint),S_OK);
CLEANUP:
SAFE_RELEASE(pIConnectionPoint);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Container EnumConnectionPoints
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_5()
{
TBEGIN
IEnumConnectionPoints* pIEnum= NULL;
TESTC_(pICPC()->EnumConnectionPoints(&pIEnum),S_OK);
TESTC(pIEnum != NULL);
CLEANUP:
SAFE_RELEASE(pIEnum);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Container: Next should work until there are no more
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_6()
{
TBEGIN
IConnectionPoint* pIConnectionPoint;
IConnectionPoint* pIConnectionPoint2 = INVALID(IConnectionPoint*);
ULONG cFetched = 505; //A random start value.
//Reset
TESTC_(pIEnumCP()->Reset(),S_OK);
//Should only be 1 connectionpoint
TESTC_(pIEnumCP()->Next(1, &pIConnectionPoint, &cFetched),S_OK);
TESTC(cFetched == 1 && pIConnectionPoint != NULL);
TESTC_(pIEnumCP()->Next(1, &pIConnectionPoint2, &cFetched),S_FALSE);
TESTC(cFetched == 0);
CLEANUP:
SAFE_RELEASE(pIConnectionPoint);
if(pIConnectionPoint2 != INVALID(IConnectionPoint*))
SAFE_RELEASE(pIConnectionPoint2);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Container: Clone
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_7()
{
TBEGIN
IConnectionPoint* pIConnectionPoint = NULL;
IConnectionPoint* pIConnectionPoint2 = NULL;
IEnumConnectionPoints* pIEnumCP2 = NULL;
ULONG cFetched=505;//A random start value.
//Obtain first connectionpoint
TESTC_(pIEnumCP()->Reset(),S_OK);
TESTC_(pIEnumCP()->Next(1, &pIConnectionPoint, &cFetched),S_OK);
TESTC(cFetched == 1);
//Clone
TESTC_(pIEnumCP()->Clone(&pIEnumCP2),S_OK);
TESTC_(pIEnumCP2->Next(1, &pIConnectionPoint2, &cFetched),S_FALSE);
TESTC(cFetched == 0 && pIConnectionPoint2 == NULL);
//Verify actually works though
TESTC_(pIEnumCP2->Reset(),S_OK);
TESTC_(pIEnumCP2->Next(1, &pIConnectionPoint2, &cFetched),S_OK);
TESTC(cFetched == 1 && pIConnectionPoint == pIConnectionPoint2);
CLEANUP:
SAFE_RELEASE(pIConnectionPoint);
SAFE_RELEASE(pIConnectionPoint2);
SAFE_RELEASE(pIEnumCP2);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc Container: Reset should go to the beginning
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_8()
{
TBEGIN
IConnectionPoint* pIConnectionPoint= NULL;
ULONG cFetched=505;//A random start value.
TESTC_(pIEnumCP()->Reset(),S_OK);
TESTC_(pIEnumCP()->Next(1,&pIConnectionPoint,&cFetched),S_OK);
TESTC(cFetched == 1);
SAFE_RELEASE(pIConnectionPoint);
TESTC_(pIEnumCP()->Reset(),S_OK);
TESTC_(pIEnumCP()->Next(1,&pIConnectionPoint,&cFetched),S_OK);
TESTC(cFetched == 1);
CLEANUP:
SAFE_RELEASE(pIConnectionPoint);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc Container: The Second one should still be on the end
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_9()
{
TBEGIN
IConnectionPoint* pIConnectionPoint= NULL;
IEnumConnectionPoints* pIEnumCP2= NULL;
ULONG cFetched=505;//A random start value.
//Go to the end
TESTC_(pIEnumCP()->Reset(),S_OK);
TESTC_(pIEnumCP()->Next(1,&pIConnectionPoint,&cFetched),S_OK);
TESTC(cFetched == 1);
SAFE_RELEASE(pIConnectionPoint);
//Clone
TESTC_(pIEnumCP()->Clone(&pIEnumCP2),S_OK);
TESTC_(pIEnumCP()->Reset(),S_OK);
TESTC_(pIEnumCP2->Next(1,&pIConnectionPoint,&cFetched),S_FALSE);
TESTC(cFetched == 0 && pIConnectionPoint == NULL);
CLEANUP:
SAFE_RELEASE(pIEnumCP2);
SAFE_RELEASE(pIConnectionPoint);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc Container: Skip should skip one
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_10()
{
TBEGIN
IConnectionPoint* pIConnectionPoint= NULL;
ULONG cFetched=505;//A random start value.
TESTC_(pIEnumCP()->Reset(),S_OK);
TESTC_(pIEnumCP()->Skip(1),S_OK);
TESTC_(pIEnumCP()->Next(1, &pIConnectionPoint, &cFetched),S_FALSE);
TESTC(cFetched == 0);
TESTC_(pIEnumCP()->Reset(),S_OK);
TESTC_(pIEnumCP()->Skip(ULONG_MAX),S_FALSE);
TESTC_(pIEnumCP()->Next(1,&pIConnectionPoint,&cFetched),S_FALSE);
TESTC(cFetched == 0);
CLEANUP:
SAFE_RELEASE(pIConnectionPoint);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc Connections: EnumConnections
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_11()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
CONNECTDATA rgConnData[MAX_LISTENERS];
memset(rgConnData, 0, sizeof(CONNECTDATA)*MAX_LISTENERS);
IEnumConnections* pIEnumConnections = NULL;
ULONG cFetched = 101;
//Advise all listeners
AdviseAll(rgCookies);
//Obtain enumerator over listeners (connections)
TESTC_(pICP()->EnumConnections(&pIEnumConnections),S_OK);
//Just quickly sanity check
TESTC_(pIEnumConnections->Next(MAX_LISTENERS, rgConnData, &cFetched),S_OK);
TESTC(cFetched == MAX_LISTENERS);
//Verify CONNECTDATA array
TESTC(VerifyConnectData(MAX_LISTENERS, rgConnData, m_cListeners, (IUnknown**)m_rgpListeners, rgCookies));
CLEANUP:
UnadviseAll(rgCookies);
FreeConnectData(MAX_LISTENERS, rgConnData);
SAFE_RELEASE(pIEnumConnections);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc Connections: Next should work until there are no more
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_12()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
CONNECTDATA rgConnData[MAX_LISTENERS];
memset(rgConnData, 0, sizeof(CONNECTDATA)*MAX_LISTENERS);
IEnumConnections* pIEnumConnections = NULL;
ULONG cFetched = 101;
//Advise all listeners
AdviseAll(rgCookies);
//Obtain enumerator over listeners (connections)
TESTC_(pICP()->EnumConnections(&pIEnumConnections),S_OK);
//Obtain connection 1 at a time
TESTC_(pIEnumConnections->Reset(),S_OK);
TESTC_(pIEnumConnections->Next(1, &rgConnData[0], &cFetched),S_OK);
TESTC(cFetched == 1);
TESTC(VerifyConnectData(1, &rgConnData[0], m_cListeners, (IUnknown**)m_rgpListeners, rgCookies));
TESTC_(pIEnumConnections->Next(1, &rgConnData[1], &cFetched),S_OK);
TESTC(cFetched == 1);
TESTC(VerifyConnectData(1, &rgConnData[1], m_cListeners, (IUnknown**)m_rgpListeners, rgCookies));
TESTC_(pIEnumConnections->Next(1, &rgConnData[2], &cFetched),S_OK);
TESTC(cFetched == 1);
TESTC(VerifyConnectData(1, &rgConnData[2], m_cListeners, (IUnknown**)m_rgpListeners, rgCookies));
FreeConnectData(MAX_LISTENERS, rgConnData);
//Try to onbtain more than in the list
TESTC_(pIEnumConnections->Next(MAX_LISTENERS, rgConnData,&cFetched),S_FALSE);
TESTC(cFetched == MAX_LISTENERS-3);
CLEANUP:
UnadviseAll(rgCookies);
FreeConnectData(MAX_LISTENERS, rgConnData);
SAFE_RELEASE(pIEnumConnections);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(13)
//*-----------------------------------------------------------------------
// @mfunc Connections: Clone
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_13()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
CONNECTDATA rgConnData[MAX_LISTENERS];
memset(rgConnData, 0, sizeof(CONNECTDATA)*MAX_LISTENERS);
IEnumConnections* pIEnumConnections = NULL;
IEnumConnections* pIEnumConnections2 = NULL;
ULONG cFetched = 101;
//Advise all listeners
AdviseAll(rgCookies);
//Obtain enumerator over listeners (connections)
TESTC_(pICP()->EnumConnections(&pIEnumConnections),S_OK);
//Obtain connection all at a time
TESTC_(pIEnumConnections->Reset(),S_OK);
TESTC_(pIEnumConnections->Next(MAX_LISTENERS, &rgConnData[0], &cFetched),S_OK);
TESTC(cFetched == MAX_LISTENERS);
TESTC(VerifyConnectData(MAX_LISTENERS, rgConnData, m_cListeners, (IUnknown**)m_rgpListeners, rgCookies));
FreeConnectData(MAX_LISTENERS, rgConnData);
//Clone
TESTC_(pIEnumConnections->Clone(&pIEnumConnections2),S_OK);
TESTC_(pIEnumConnections2->Next(1, rgConnData, &cFetched),S_FALSE);
TESTC(cFetched == 0);
//Obtain connection all at a time
TESTC_(pIEnumConnections2->Reset(),S_OK);
TESTC_(pIEnumConnections2->Next(MAX_LISTENERS, &rgConnData[0], &cFetched),S_OK);
TESTC(cFetched == MAX_LISTENERS);
TESTC(VerifyConnectData(MAX_LISTENERS, rgConnData, m_cListeners, (IUnknown**)m_rgpListeners, rgCookies));
FreeConnectData(MAX_LISTENERS, rgConnData);
CLEANUP:
UnadviseAll(rgCookies);
FreeConnectData(MAX_LISTENERS, rgConnData);
SAFE_RELEASE(pIEnumConnections);
SAFE_RELEASE(pIEnumConnections2);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(14)
//*-----------------------------------------------------------------------
// @mfunc Conenctions: Reset should go to the beginning
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_14()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
CONNECTDATA rgConnData[MAX_LISTENERS];
memset(rgConnData, 0, sizeof(CONNECTDATA)*MAX_LISTENERS);
IEnumConnections* pIEnumConnections = NULL;
ULONG cFetched = 101;
//Obtain enumerator over listeners (connections)
TESTC_(pICP()->EnumConnections(&pIEnumConnections),S_OK);
//Before Advising, should have none
TESTC_(pIEnumConnections->Reset(),S_OK);
TESTC_(pIEnumConnections->Next(MAX_LISTENERS, &rgConnData[0], &cFetched),S_FALSE);
TESTC(cFetched == 0);
SAFE_RELEASE(pIEnumConnections);
//Advise all listeners
AdviseAll(rgCookies);
//Obtain enumerator over listeners (connections)
TESTC_(pICP()->EnumConnections(&pIEnumConnections),S_OK);
//Obtain connection all at a time
TESTC_(pIEnumConnections->Reset(),S_OK);
TESTC_(pIEnumConnections->Next(MAX_LISTENERS, &rgConnData[0], &cFetched),S_OK);
TESTC(cFetched == MAX_LISTENERS);
TESTC(VerifyConnectData(MAX_LISTENERS, rgConnData, m_cListeners, (IUnknown**)m_rgpListeners, rgCookies));
FreeConnectData(MAX_LISTENERS, rgConnData);
//Reset should start work correctly
TESTC_(pIEnumConnections->Reset(),S_OK);
TESTC_(pIEnumConnections->Next(MAX_LISTENERS, &rgConnData[0], &cFetched),S_OK);
TESTC(cFetched == MAX_LISTENERS);
TESTC(VerifyConnectData(MAX_LISTENERS, rgConnData, m_cListeners, (IUnknown**)m_rgpListeners, rgCookies));
CLEANUP:
UnadviseAll(rgCookies);
FreeConnectData(MAX_LISTENERS, rgConnData);
SAFE_RELEASE(pIEnumConnections);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(15)
//*-----------------------------------------------------------------------
// @mfunc Connections: Skip should skip one
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_15()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
CONNECTDATA rgConnData[MAX_LISTENERS];
memset(rgConnData, 0, sizeof(CONNECTDATA)*MAX_LISTENERS);
IEnumConnections* pIEnumConnections = NULL;
IEnumConnections* pIEnumConnections2 = NULL;
ULONG cFetched = 101;
//Advise all listeners
AdviseAll(rgCookies);
//Obtain enumerator over listeners (connections)
TESTC_(pICP()->EnumConnections(&pIEnumConnections),S_OK);
//Obtain connection all at a time
TESTC_(pIEnumConnections->Reset(),S_OK);
TESTC_(pIEnumConnections->Skip(1),S_OK);
//Obtain the rest
TESTC_(pIEnumConnections->Next(MAX_LISTENERS, &rgConnData[0], &cFetched),S_FALSE);
TESTC(cFetched == MAX_LISTENERS-1);
TESTC(VerifyConnectData(cFetched, rgConnData, m_cListeners, (IUnknown**)m_rgpListeners, rgCookies));
FreeConnectData(cFetched, rgConnData);
//Skip ULONG_MAX
TESTC_(pIEnumConnections->Reset(),S_OK);
TESTC_(pIEnumConnections->Skip(ULONG_MAX),S_FALSE);
TESTC_(pIEnumConnections->Next(1, rgConnData, &cFetched),S_FALSE);
TESTC(cFetched == 0);
//Skip none
TESTC_(pIEnumConnections->Reset(),S_OK);
TESTC_(pIEnumConnections->Skip(0),E_INVALIDARG);
CLEANUP:
UnadviseAll(rgCookies);
FreeConnectData(MAX_LISTENERS, rgConnData);
SAFE_RELEASE(pIEnumConnections);
SAFE_RELEASE(pIEnumConnections2);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(16)
//*-----------------------------------------------------------------------
// @mfunc Point: GetConnectionInterface should return succesful
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_16()
{
TBEGIN
IConnectionPoint* pIConnectionPoint= NULL;
IID iid;
TESTC_(pICPC()->FindConnectionPoint(IID_IRowPositionChange, &pIConnectionPoint),S_OK);
TESTC_(pIConnectionPoint->GetConnectionInterface(&iid),S_OK);
TESTC(iid == IID_IRowPositionChange);
CLEANUP:
SAFE_RELEASE(pIConnectionPoint);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(17)
//*-----------------------------------------------------------------------
// @mfunc Point: GetConnectionPointContainer should work with a valid pointer
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_17()
{
TBEGIN
IRowPosition* pIRowPosition = NULL;
IConnectionPoint* pIConnectionPoint = NULL;
IConnectionPointContainer* pICPC = NULL;
IConnectionPointContainer* pICPC2 = NULL;
//Create RowPosition Object
TESTC_(CreateRowPosition(pIRowset(), &pIRowPosition),S_OK);
//Obtain the ConnectionPoint...
TESTC_(QI(pIRowPosition, IID_IConnectionPointContainer, (void**)&pICPC),S_OK);
TESTC_(pICPC->FindConnectionPoint(IID_IRowPositionChange, &pIConnectionPoint),S_OK);
//Obtain the container from the ConnectionPoint
TESTC_(pIConnectionPoint->GetConnectionPointContainer(&pICPC2),S_OK);
TESTC(pICPC == pICPC2);
CLEANUP:
SAFE_RELEASE(pIConnectionPoint);
SAFE_RELEASE(pICPC);
SAFE_RELEASE(pICPC2);
SAFE_RELEASE(pIRowPosition);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(18)
//*-----------------------------------------------------------------------
// @mfunc B/NULL: Container: QI for IID_NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_18()
{
IUnknown* pIUnknown= NULL;
TESTC_(QI(pICPC(), IID_NULL, (void**)&pIUnknown),E_NOINTERFACE);
TESTC(pIUnknown == NULL);
CLEANUP:
SAFE_RELEASE(pIUnknown);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(19)
//*-----------------------------------------------------------------------
// @mfunc Container: FindConnectionPoint for IID_NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_19()
{
TBEGIN
IConnectionPoint* pIConnectionPoint= NULL;
TESTC_(pICPC()->FindConnectionPoint(IID_NULL, &pIConnectionPoint),CONNECT_E_NOCONNECTION);
TESTC(pIConnectionPoint == NULL);
CLEANUP:
SAFE_RELEASE(pIConnectionPoint);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(20)
//*-----------------------------------------------------------------------
// @mfunc Container: FindConnectionPoint for ppCP is NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_20()
{
TBEGIN
TESTC_(pICPC()->FindConnectionPoint(IID_IRowPositionChange, NULL),E_POINTER);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(21)
//*-----------------------------------------------------------------------
// @mfunc Enum: Next with a rgpcd NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_21()
{
TBEGIN
ULONG cFetched=505;//A random start value.
TESTC_(pIEnumCP()->Next(1, NULL, &cFetched),E_POINTER);
TESTC(cFetched == 0);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(22)
//*-----------------------------------------------------------------------
// @mfunc Enum: Skip on the second one should still be at the end
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_22()
{
TBEGIN
IConnectionPoint* pIConnectionPoint= NULL;
ULONG cFetched=505;//A random start value.
TESTC_(pIEnumCP()->Reset(),S_OK);
TESTC_(pIEnumCP()->Skip(1),S_OK);
TESTC_(pIEnumCP()->Skip(1),S_FALSE);
TESTC_(pIEnumCP()->Next(1, &pIConnectionPoint, &cFetched),S_FALSE);
TESTC(cFetched == 0 && pIConnectionPoint == NULL);
CLEANUP:
SAFE_RELEASE(pIConnectionPoint);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(23)
//*-----------------------------------------------------------------------
// @mfunc Container: Enum should fail for a NULL pointer
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_23()
{
TBEGIN
TESTC_(pICPC()->EnumConnectionPoints(NULL),E_POINTER);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(24)
//*-----------------------------------------------------------------------
// @mfunc Enum: reset twice in a row
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_24()
{
TBEGIN
IConnectionPoint* pIConnectionPoint= NULL;
IConnectionPoint* pIConnectionPoint2= NULL;
ULONG cFetched=505;//A random start value.
TESTC_(pIEnumCP()->Reset(),S_OK);
TESTC_(pIEnumCP()->Reset(),S_OK); //DOUBLE RESET
TESTC_(pIEnumCP()->Next(1, &pIConnectionPoint, &cFetched),S_OK);
TESTC(cFetched == 1 && pIConnectionPoint != NULL);
TESTC_(pICPC()->FindConnectionPoint(IID_IRowPositionChange, &pIConnectionPoint2),S_OK);
TESTC(pIConnectionPoint == pIConnectionPoint2);
CLEANUP:
SAFE_RELEASE(pIConnectionPoint);
SAFE_RELEASE(pIConnectionPoint2);
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(25)
//*-----------------------------------------------------------------------
// @mfunc Enum: clone where ppIEnum is NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_25()
{
TBEGIN
TESTC_(pIEnumCP()->Clone(NULL),E_POINTER);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(26)
//*-----------------------------------------------------------------------
// @mfunc Point: GetConectionInterface with pIID NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_26()
{
TBEGIN
TESTC_(pICP()->GetConnectionInterface(NULL),E_POINTER);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(27)
//*-----------------------------------------------------------------------
// @mfunc Point: GetConectionPointContainer with ppCPC null
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_27()
{
TBEGIN
TESTC_(pICP()->GetConnectionPointContainer(NULL),E_POINTER);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(28)
//*-----------------------------------------------------------------------
// @mfunc Point: Unadvise before advising should fail
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_28()
{
TBEGIN
TESTC_(pICP()->Unadvise(PtrToUlong(m_rgpListeners[0])),CONNECT_E_NOCONNECTION);
TESTC_(pICP()->Unadvise(1),CONNECT_E_NOCONNECTION);
TESTC_(pICP()->Unadvise(ULONG_MAX),CONNECT_E_NOCONNECTION);
TESTC_(pICP()->Unadvise(0),CONNECT_E_NOCONNECTION);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(29)
//*-----------------------------------------------------------------------
// @mfunc Point: advise with pointers NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_29()
{
TBEGIN
ULONG dwCookie1 = 101;
ULONG dwCookie2 = 101;
TESTC_(pICP()->Advise(pIRowset(), &dwCookie1),CONNECT_E_CANNOTCONNECT);
TESTC_(pICP()->Advise(NULL, &dwCookie2),E_POINTER);
TESTC(dwCookie1 == 0);
TESTC(dwCookie2 == 0);
CLEANUP:
TRETURN
}
// }}
// {{ TCW_VAR_PROTOTYPE(30)
//*-----------------------------------------------------------------------
// @mfunc point: Unadvise with pointers NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCConnectionStuff::Variation_30()
{
TBEGIN
ULONG rgCookies[MAX_LISTENERS];
//Advise all listeners
AdviseAll(rgCookies);
TESTC_(pICP()->Unadvise(0),CONNECT_E_NOCONNECTION);
TESTC_(pICP()->Unadvise(PtrToUlong(m_rgpListeners[0])+1),CONNECT_E_NOCONNECTION);
TESTC_(pICP()->Unadvise(ULONG_MAX),CONNECT_E_NOCONNECTION);
CLEANUP:
UnadviseAll(rgCookies);
TRETURN
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCConnectionStuff::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCRowPosition::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(TCTransactions)
//*-----------------------------------------------------------------------
//| Test Case: TCTransactions - Testing RowPos within transactions
//| Created: 7/6/98
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCTransactions::Init()
{
if(CTransaction::Init())
{
//register interface to be tested
if(RegisterInterface(ROWSET_INTERFACE, IID_IRowset, 0, NULL))
return TRUE;
}
//Not all providers have to support transactions
//If a required interface, an error would have been posted by VerifyInterface
TEST_PROVIDER(m_pITransactionLocal != NULL);
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc COMMIT - fRetaning == TRUE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCTransactions::Variation_1()
{
DBCOUNTITEM cRowsObtained = 0;
HROW* rghRows = NULL;
IRowPosition* pIRowPosition = NULL;
IRowset* pIRowset = NULL;
HCHAPTER hChapter = NULL;
HROW hRow = NULL;
ULONG ulPosition = NULL;
HRESULT hrExpected = S_OK;
//start a transaction
TESTC(StartTransaction(SELECT_ALLFROMTBL, NULL, 0, NULL));
//get a row handle
TESTC_(m_pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows),S_OK);
//Create RowPosition object
TESTC_(TCRowPosition::CreateRowPosition(m_pIRowset, &pIRowPosition),S_OK);
CHECK(TCRowPosition::ClearRowPosition(pIRowPosition), S_OK);
CHECK(TCRowPosition::SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, rghRows[0], DBPOSITION_OK), S_OK);
//commit the transaction with fRetaining==TRUE
TESTC(GetCommit(TRUE))
if(!m_fCommitPreserve)
hrExpected = E_UNEXPECTED;
//After Commit
CHECK(TCRowPosition::GetRowPosition(pIRowPosition, &hChapter, &hRow, &ulPosition), hrExpected);
CHECK(TCRowPosition::ClearRowPosition(pIRowPosition), S_OK);
CHECK(TCRowPosition::SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, rghRows[0], DBPOSITION_OK), hrExpected);
//Allowed to Call IUnknown methods in Zombie (QueryInterface)
CHECK(TCRowPosition::GetRowset(pIRowPosition, IID_IRowset, (IUnknown**)&pIRowset), S_OK);
CHECK(TCRowPosition::CreateRowPosition(m_pIRowset), S_OK);
// 1. When IRowset::GetNextRows is called row ref count = 1
// 2. When TCRowPosition::SetRowPosition is called, if row position is successfully set, it will
// do an IRowset::ReleaseRows() on the HROW so after the call the ref count for row will still
// be 1.
// 3. TCRowPosition::GetRowPosition returns failure because rowset is in zombie state, so
// ref count for row still remains 1.
// 4. TCRowPosition::ClearRowPosition clears the row handle and calls IRowset::ReleaseRows on the
// row handle decrementing the row handle count to zero and thus releasing the row.
// So, when IRowset::ReleaseRows() is called here, the row handle is already in invalid
// state so expect a failure DB_E_ERRORSOCCURRED instead.
TESTC_(m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL), DB_E_ERRORSOCCURRED);
CLEANUP:
PROVIDER_FREE(rghRows);
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIRowset);
//clean up. Expected S_OK.
CleanUpTransaction(S_OK);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc COMMIT - fRetaning == FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCTransactions::Variation_2()
{
DBCOUNTITEM cRowsObtained = 0;
HROW* rghRows = NULL;
IRowPosition* pIRowPosition = NULL;
IRowset* pIRowset = NULL;
HCHAPTER hChapter = NULL;
HROW hRow = NULL;
ULONG ulPosition = NULL;
HRESULT hrExpected = S_OK;
//start a transaction
TESTC(StartTransaction(SELECT_ALLFROMTBL, NULL, 0, NULL));
//get a row handle
TESTC_(m_pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows),S_OK);
//Create RowPosition object
TESTC_(TCRowPosition::CreateRowPosition(m_pIRowset, &pIRowPosition),S_OK);
CHECK(TCRowPosition::ClearRowPosition(pIRowPosition), S_OK);
CHECK(TCRowPosition::SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, rghRows[0], DBPOSITION_OK), S_OK);
//commit the transaction with fRetaining==FALSE
TESTC(GetCommit(FALSE))
if(!m_fCommitPreserve)
hrExpected = E_UNEXPECTED;
//After Commit
CHECK(TCRowPosition::GetRowPosition(pIRowPosition, &hChapter, &hRow, &ulPosition), hrExpected);
CHECK(TCRowPosition::ClearRowPosition(pIRowPosition), S_OK);
CHECK(TCRowPosition::SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, rghRows[0], DBPOSITION_OK), hrExpected);
//Allowed to Call IUnknown methods in Zombie (QueryInterface)
CHECK(TCRowPosition::GetRowset(pIRowPosition, IID_IRowset, (IUnknown**)&pIRowset), S_OK);
CHECK(TCRowPosition::CreateRowPosition(m_pIRowset), S_OK);
TESTC_(m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL), DB_E_ERRORSOCCURRED);
CLEANUP:
PROVIDER_FREE(rghRows);
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIRowset);
//clean up. Expected S_OK.
CleanUpTransaction(XACT_E_NOTRANSACTION);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc ABORT - fRetaning == TRUE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCTransactions::Variation_3()
{
DBCOUNTITEM cRowsObtained = 0;
HROW* rghRows = NULL;
IRowPosition* pIRowPosition = NULL;
IRowset* pIRowset = NULL;
HCHAPTER hChapter = NULL;
HROW hRow = NULL;
ULONG ulPosition = NULL;
HRESULT hrExpected = S_OK;
//start a transaction
TESTC(StartTransaction(SELECT_ALLFROMTBL, NULL, 0, NULL));
//get a row handle
TESTC_(m_pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows),S_OK);
//Create RowPosition object
TESTC_(TCRowPosition::CreateRowPosition(m_pIRowset, &pIRowPosition),S_OK);
CHECK(TCRowPosition::ClearRowPosition(pIRowPosition), S_OK);
CHECK(TCRowPosition::SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, rghRows[0], DBPOSITION_OK), S_OK);
//Abort the transaction with fRetaining==TRUE
TESTC(GetAbort(TRUE))
if(!m_fAbortPreserve)
hrExpected = E_UNEXPECTED;
//After Abort
CHECK(TCRowPosition::GetRowPosition(pIRowPosition, &hChapter, &hRow, &ulPosition), hrExpected);
CHECK(TCRowPosition::ClearRowPosition(pIRowPosition), S_OK);
CHECK(TCRowPosition::SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, rghRows[0], DBPOSITION_OK), hrExpected);
//Allowed to Call IUnknown methods in Zombie (QueryInterface)
CHECK(TCRowPosition::GetRowset(pIRowPosition, IID_IRowset, (IUnknown**)&pIRowset), S_OK);
CHECK(TCRowPosition::CreateRowPosition(m_pIRowset), S_OK);
TESTC_(m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL), DB_E_ERRORSOCCURRED);
CLEANUP:
PROVIDER_FREE(rghRows);
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIRowset);
//clean up. Expected S_OK.
CleanUpTransaction(S_OK);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc ABORT - fRetaning == FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCTransactions::Variation_4()
{
DBCOUNTITEM cRowsObtained = 0;
HROW* rghRows = NULL;
IRowPosition* pIRowPosition = NULL;
IRowset* pIRowset = NULL;
HCHAPTER hChapter = NULL;
HROW hRow = NULL;
ULONG ulPosition = NULL;
HRESULT hrExpected = S_OK;
//start a transaction
TESTC(StartTransaction(SELECT_ALLFROMTBL, NULL, 0, NULL));
//get a row handle
TESTC_(m_pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows),S_OK);
//Create RowPosition object
TESTC_(TCRowPosition::CreateRowPosition(m_pIRowset, &pIRowPosition),S_OK);
CHECK(TCRowPosition::ClearRowPosition(pIRowPosition), S_OK);
CHECK(TCRowPosition::SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, rghRows[0], DBPOSITION_OK), S_OK);
//Abort the transaction with fRetaining==FALSE
TESTC(GetAbort(FALSE))
if(!m_fCommitPreserve)
hrExpected = E_UNEXPECTED;
//After Abort
CHECK(TCRowPosition::GetRowPosition(pIRowPosition, &hChapter, &hRow, &ulPosition), hrExpected);
CHECK(TCRowPosition::ClearRowPosition(pIRowPosition), S_OK);
CHECK(TCRowPosition::SetRowPosition(pIRowPosition, DB_NULL_HCHAPTER, rghRows[0], DBPOSITION_OK), hrExpected);
//Allowed to Call IUnknown methods in Zombie (QueryInterface)
CHECK(TCRowPosition::GetRowset(pIRowPosition, IID_IRowset, (IUnknown**)&pIRowset), S_OK);
CHECK(TCRowPosition::CreateRowPosition(m_pIRowset), S_OK);
TESTC_(m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL), DB_E_ERRORSOCCURRED);
CLEANUP:
PROVIDER_FREE(rghRows);
SAFE_RELEASE(pIRowPosition);
SAFE_RELEASE(pIRowset);
//clean up. Expected S_OK.
CleanUpTransaction(XACT_E_NOTRANSACTION);
TRETURN
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL TCTransactions::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(CTransaction::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END