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

9934 lines
261 KiB
C++

//--------------------------------------------------------------------
// Microsoft OLE DB Test
//
// Copyright 1995-2000 Microsoft Corporation.
//
// @doc
//
// @module IRSCROLL.CPP | IRSCROLL source file for all test modules.
//
#include "modstandard.hpp"
#define DBINITCONSTANTS // Must be defined to initialize constants in OLEDB.H
#define INITGUID
#include "IROWSCRL.h"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Module Values
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// {{ TCW_MODULE_GLOBALS
DECLARE_MODULE_CLSID = { 0xd010f3e1, 0x2017, 0x11d1, { 0xa8, 0x83, 0x00, 0xc0, 0x4f, 0xd7, 0xa0, 0xf5 }};
DECLARE_MODULE_NAME("IRowsetScroll");
DECLARE_MODULE_OWNER("Microsoft");
DECLARE_MODULE_DESCRIP("Test Module for IRowsetScroll Interface");
DECLARE_MODULE_VERSION(795921705);
// }}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Globals
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CTable *g_pCTable=NULL; // Pointer to the global table
DBROWCOUNT g_lRowLast = 0; // Keep track of rows in g_pCTable
CTable *g_p1RowTable=NULL; // one row table;
CTable *g_pEmptyTable=NULL; // empty table
BOOL g_fIsDBCreateCommandSupported = TRUE;
BOOL g_fIsDBSchemaRowsetSupported = TRUE;
DBROWCOUNT g_cMaxOpenRowsCount=0; // Record the number of max open rows in the rowset
DBCOUNTITEM g_cVerifyRows=0, g_cVerifyApproxPos=0, g_ulWeightedError=0, g_ulWeightedPosError=0;
enum ePrptIdx {IDX_Bookmarks=0, IDX_CanFetchBackwards, IDX_ScrollBackwards,
IDX_CanHoldRows, IDX_MaxOpenRows,IDX_RemoveDeleted, IDX_BookmarkSkipped,
IDX_OtherUpdateDelete, IDX_OtherInsert, IDX_IRowsetChange};
enum eRowsetType { USECOMMAND=0, USEOPENROWSET, USESCHEMAR };
#undef TESTC_PROVIDER
#define TESTC_PROVIDER(fPass) {if(!fPass) { odtLog << L"NotSupported by Provider, skipping Variation" << ENDL; fTestPass = TEST_SKIPPED; goto END; } }
#define PROPERTY_COUNT (IDX_IRowsetChange+1)
#define EXACT TRUE
#define INEXACT FALSE
#define VerifyApproximatePosition(cPos, cRows, cExpectedPos) _VerifyApproximatePosition((cPos),(cRows),(cExpectedPos), LONGSTRING(__FILE__), __LINE__)
#define VerifyRowPosition(hRow, cRow, pCTable, fExact) _VerifyRowPosition((hRow), (cRow), (pCTable), (fExact),LONGSTRING(__FILE__), __LINE__)
// Record the properties default values
struct DBPrptRecord
{
BOOL fSupported;
BOOL fDefault;
BOOL fSettable;
} g_rgDBPrpt[PROPERTY_COUNT];
//--------------------------------------------------------------------
// @func Print out message on the screen that a particular property
// is not supported.
//--------------------------------------------------------------------
BOOL PrintNotSupported(ULONG cProperties)
{
BOOL fPass=TRUE;
switch(cProperties)
{
case IDX_Bookmarks:
odtLog<<L"DBPROP_BOOKMARKS is not supported!\n";
break;
case IDX_CanFetchBackwards:
odtLog<<L"DBPROP_CANFETCHBACKWARDS is not supported!\n";
break;
case IDX_ScrollBackwards:
odtLog<<L"DBPROP_SCROLLBACKWARDS is not supported!\n";
break;
case IDX_CanHoldRows:
odtLog<<L"DBPROP_CANHOLDROWS is not supported!\n";
break;
case IDX_MaxOpenRows:
odtLog<<L"DBPROP_MAXOPENROWS is not supported!\n";
break;
case IDX_RemoveDeleted:
odtLog<<L"DBPROP_REMOVEDELETED is not supported!\n";
break;
case IDX_BookmarkSkipped:
odtLog<<L"DBPROP_BOOKMARKSKIPPED is not supported!\n";
break;
case IDX_OtherUpdateDelete:
odtLog<<L"DBPROP_OTHERUPDATEDELETE is not supported!\n";
break;
case IDX_OtherInsert:
odtLog<<"DBPROP_OTHERINSERT is not supported!\n";
break;
case IDX_IRowsetChange:
odtLog<<L"IID_IRowsetChange is not supported!\n";
break;
default:
odtLog<<L"Index to the property array is incorrect!\n";
fPass=FALSE;
break;
}
return fPass;
}
//-------------------------------------------------------------------------
// @func Func. Check whether provider allows to set DBPROP_MAXOPENROWS.
//
//-------------------------------------------------------------------------
void InitProp(IUnknown * pIDataSourceUnknown)
{
ULONG i=0;
IDBProperties* pIDBProperties =NULL;
DBPROPIDSET rgPropertyIDSets;
DBPROPID rgDBPrpt[PROPERTY_COUNT];
WCHAR* pDescBuffer =NULL;
ULONG cPropertyInfoSets=0;
DBPROPINFOSET *pPropertyInfoSets=NULL;
rgPropertyIDSets.rgPropertyIDs=rgDBPrpt;
rgPropertyIDSets.cPropertyIDs=PROPERTY_COUNT;
rgPropertyIDSets.guidPropertySet=DBPROPSET_ROWSET;
//Check if properites are supported
//Init all the properties
rgDBPrpt[IDX_Bookmarks]= DBPROP_BOOKMARKS;
rgDBPrpt[IDX_CanFetchBackwards]= DBPROP_CANFETCHBACKWARDS;
rgDBPrpt[IDX_ScrollBackwards]= DBPROP_CANSCROLLBACKWARDS;
rgDBPrpt[IDX_CanHoldRows]= DBPROP_CANHOLDROWS;
rgDBPrpt[IDX_MaxOpenRows]= DBPROP_MAXOPENROWS;
rgDBPrpt[IDX_RemoveDeleted]= DBPROP_REMOVEDELETED;
rgDBPrpt[IDX_BookmarkSkipped]= DBPROP_BOOKMARKSKIPPED;
rgDBPrpt[IDX_OtherUpdateDelete]=DBPROP_OTHERUPDATEDELETE;
rgDBPrpt[IDX_OtherInsert]=DBPROP_OTHERINSERT;
rgDBPrpt[IDX_IRowsetChange]= DBPROP_IRowsetChange;
//Verify and Create the Interface pointer for IRowsetScroll.
if(!VerifyInterface(pIDataSourceUnknown, IID_IDBProperties,
DATASOURCE_INTERFACE,(IUnknown **)&pIDBProperties))
goto END;
//GetPropertyID
if(!SUCCEEDED(pIDBProperties->GetPropertyInfo(1,&rgPropertyIDSets,
&cPropertyInfoSets,&pPropertyInfoSets,&pDescBuffer)))
goto END;
for(i=0; i<PROPERTY_COUNT; i++)
{
if(pPropertyInfoSets->rgPropertyInfos[i].dwFlags & DBPROPFLAGS_WRITE)
g_rgDBPrpt[i].fSettable=TRUE;
else
g_rgDBPrpt[i].fSettable=FALSE;
}
END:
SAFE_RELEASE(pIDBProperties);
COMPARE(FreeProperties(&cPropertyInfoSets,&pPropertyInfoSets,&pDescBuffer),TRUE);
}
//--------------------------------------------------------------------
// @func Module level initialization routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleInit(CThisTestModule * pThisTestModule)
{
HRESULT hr;
ULONG cProperties;
ULONG cCnt;
DBPROPID rgDBPrpt[PROPERTY_COUNT];
DBPROPIDSET rgPropertyIDSets;
BOOL fInit=FALSE;
IUnknown *pIRowset=NULL;
DBPROPSET *prgProperties=NULL;
IRowsetInfo *pIRowsetInfo=NULL;
IDBCreateCommand *pIDBCreateCommand=NULL;
IDBSchemaRowset *pIDBSchemaRowset=NULL;
// Store a IDBCreateCommand pointer to pThisTestModule->m_pIUnknown
if(!ModuleCreateDBSession(pThisTestModule))
return FALSE;
// Reset global counters of Scroll accuracy
g_cVerifyRows=g_ulWeightedError=g_cVerifyApproxPos=g_ulWeightedPosError=0;
// Create the tables
g_pCTable = new CTable(pThisTestModule->m_pIUnknown2, (WCHAR *)gwszModuleName, USENULLS);
g_p1RowTable = new CTable(pThisTestModule->m_pIUnknown2, (WCHAR *)gwszModuleName, USENULLS);
g_pEmptyTable = new CTable(pThisTestModule->m_pIUnknown2, (WCHAR *)gwszModuleName, USENULLS);
if(!g_pCTable || !SUCCEEDED(g_pCTable->CreateTable(TABLE_ROW_COUNT)) )
{
if(g_pCTable)
delete g_pCTable;
g_pCTable=NULL;
odtLog<<wszCreateTableFailed;
return FALSE;
}
g_lRowLast = g_pCTable->GetRowsOnCTable();
if ( g_lRowLast < 8 )
{
odtLog<<L"Need at least an 8 row table for this test!\n";
return FALSE;
}
if(!g_p1RowTable || !SUCCEEDED(g_p1RowTable->CreateTable(1,1,NULL,PRIMARY,TRUE)) )
{
if(g_p1RowTable)
delete g_p1RowTable;
g_p1RowTable = NULL;
}
if ( g_p1RowTable->GetRowsOnCTable() != 1 )
{
delete g_p1RowTable;
g_p1RowTable = NULL;
}
if(!g_pEmptyTable || !SUCCEEDED(g_pEmptyTable->CreateTable(0,1,NULL,PRIMARY,TRUE)) )
{
if(g_pEmptyTable)
delete g_pEmptyTable;
g_pEmptyTable = NULL;
}
if ( g_pEmptyTable->GetRowsOnCTable() != 0 )
{
delete g_pEmptyTable;
g_pEmptyTable = NULL;
}
// Make sure IRowsetScroll interface is supported by opening a rowset
hr = g_pCTable->CreateRowset(USE_OPENROWSET,IID_IRowsetScroll,0,NULL,&pIRowset,
NULL, NULL);
// If E_NOINTERFACE is returned, IRowsetScroll is not supported by the provider
if(hr==E_NOINTERFACE)
{
odtLog<<wszIRowsetScrollNotSupported;
return TEST_SKIPPED;
}
if(hr!=S_OK)
{
odtLog<<wszExcuteCommandFailed;
return FALSE;
}
rgPropertyIDSets.rgPropertyIDs=rgDBPrpt;
rgPropertyIDSets.cPropertyIDs=PROPERTY_COUNT;
rgPropertyIDSets.guidPropertySet=DBPROPSET_ROWSET;
// Check if properites are supported
// Init all the properties
rgDBPrpt[IDX_Bookmarks]= DBPROP_BOOKMARKS;
rgDBPrpt[IDX_CanFetchBackwards]= DBPROP_CANFETCHBACKWARDS;
rgDBPrpt[IDX_ScrollBackwards]= DBPROP_CANSCROLLBACKWARDS;
rgDBPrpt[IDX_CanHoldRows]= DBPROP_CANHOLDROWS;
rgDBPrpt[IDX_MaxOpenRows]= DBPROP_MAXOPENROWS;
rgDBPrpt[IDX_RemoveDeleted]= DBPROP_REMOVEDELETED;
rgDBPrpt[IDX_BookmarkSkipped]= DBPROP_BOOKMARKSKIPPED;
rgDBPrpt[IDX_OtherUpdateDelete]=DBPROP_OTHERUPDATEDELETE;
rgDBPrpt[IDX_OtherInsert]=DBPROP_OTHERINSERT;
rgDBPrpt[IDX_IRowsetChange]= DBPROP_IRowsetChange;
// Get the properties
if(!VerifyInterface(pIRowset, IID_IRowsetInfo, ROWSET_INTERFACE, (IUnknown**)&pIRowsetInfo))
return FALSE;
if(!SUCCEEDED(hr=pIRowsetInfo->GetProperties(1,&rgPropertyIDSets, &cProperties, &prgProperties)))
goto END;
// cProperties has to be PROPERTY_COUNT
if(prgProperties->cProperties!=PROPERTY_COUNT)
goto END;
// Mark the properties
for(cCnt=0;cCnt<prgProperties->cProperties;cCnt++)
{
// Mark the properties not supported.
if(prgProperties->rgProperties[cCnt].dwStatus==DBPROPSTATUS_NOTSUPPORTED)
{
g_rgDBPrpt[cCnt].fSupported=FALSE;
PrintNotSupported(cCnt);
}
else
{
g_rgDBPrpt[cCnt].fSupported=TRUE;
if(cCnt!=IDX_MaxOpenRows)
g_rgDBPrpt[cCnt].fDefault=V_BOOL(&prgProperties->rgProperties[cCnt].vValue);
else
g_cMaxOpenRowsCount=prgProperties->rgProperties[IDX_MaxOpenRows].vValue.lVal;
}
}
InitProp((IUnknown *)pThisTestModule->m_pIUnknown);
fInit=TRUE;
//IDBCreateCommand
if(!VerifyInterface(pThisTestModule->m_pIUnknown2, IID_IDBCreateCommand, SESSION_INTERFACE, (IUnknown**)&pIDBCreateCommand))
{
// Note the limitation and continue.
g_fIsDBCreateCommandSupported = FALSE;
odtLog << L"IDBCreateCommand is not supported by Provider." << ENDL;
}
else
{
g_fIsDBCreateCommandSupported = TRUE;
}
//IDBSchemaRowset
if(!VerifyInterface(pThisTestModule->m_pIUnknown2, IID_IDBSchemaRowset, SESSION_INTERFACE, (IUnknown**)&pIDBSchemaRowset))
{
// Note the limitation and continue.
g_fIsDBSchemaRowsetSupported = FALSE;
odtLog << L"IDBSchemaRowset is not supported by Provider." << ENDL;
}
else
{
g_fIsDBSchemaRowsetSupported = TRUE;
}
END:
// Release interfaces
SAFE_RELEASE(pIRowsetInfo);
SAFE_RELEASE(pIRowset);
SAFE_RELEASE(pIDBCreateCommand);
SAFE_RELEASE(pIDBSchemaRowset);
// Free the memory
if(prgProperties)
{
for(cCnt=0; cCnt<cProperties; cCnt++)
{
if(prgProperties[cCnt].rgProperties)
PROVIDER_FREE(prgProperties[cCnt].rgProperties);
}
PROVIDER_FREE(prgProperties);
}
return fInit;
}
//--------------------------------------------------------------------
// @func Module level termination routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleTerminate(CThisTestModule * pThisTestModule)
{
// Drop the tables
if(g_pCTable)
{
g_pCTable->DropTable();
SAFE_DELETE(g_pCTable);
}
if(g_p1RowTable)
{
g_p1RowTable->DropTable();
SAFE_DELETE(g_p1RowTable);
}
if(g_pEmptyTable)
{
g_pEmptyTable->DropTable();
SAFE_DELETE(g_pEmptyTable);
}
odtLog << "The number row verifications: "<<g_cVerifyRows<<".\n";
odtLog << "The weighted error count for row verification: "<<g_ulWeightedError<<".\n";
odtLog << "The number Approximate Position verifications: "<<g_cVerifyApproxPos<<".\n";
odtLog << "The weighted error count for approximate row verifications: "<<g_ulWeightedPosError<<".\n";
// Release IDBCreateCommand interface
return (ModuleReleaseDBSession(pThisTestModule));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Test Case Section
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//
// TCIRowsetScroll: The base class for the rest of the test cases in
// this test module.
//
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//class TCIRowsetScroll : public COLEDB
class TCIRowsetScroll : public CRowsetObject
{
private:
protected:
//@cmember: Interface pointer for IRowsetScroll
IRowsetScroll *m_pIRowsetScroll;
//@cmember: Interface pointer for IRowset
IRowset *m_pIRowset;
//@cmember: Interface pointer for IRowsetIdentity
IRowsetIdentity *m_pIRowsetIdentity;
//@cmember: Accessory handle
HACCESSOR m_hAccessor;
//@cmember: The size of a row
ULONG_PTR m_cRowSize;
//@cmember: The count of binding structure
DBCOUNTITEM m_cBinding;
//@cmember: The array of binding strucuture
DBBINDING *m_rgBinding;
//@cmember: The pointer to the row buffer
void *m_pData;
//@cmember
DBCOUNTITEM m_ulRowCount;
//@cmember flag indicating how to openrowset.
BOOL m_eRowsetType;
BOOL m_fCanHoldRows;
HROW *m_pHRows;
//@mfunc: Initialialize interface pointers
BOOL Init();
//@mfunc: Terminate
BOOL Terminate();
//@mfunc: Create a command object, set properties, execute a sql statement,
// and create a rowset object. Create an accessor on the rowset
BOOL GetRowsetAndAccessor
(
CTable *pCTable,
EQUERY eSQLStmt,
IID riid,
ULONG cProperties=0,
const DBPROPID *rgProperties=NULL,
ULONG cPropertiesUnset=0,
const DBPROPID *rgPropertiesUnset=NULL,
DBACCESSORFLAGS dwAccessorFlags=DBACCESSOR_ROWDATA,
DBPART dwPart=DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,
ECOLS_BOUND eColsToBind=ALL_COLS_BOUND,
ECOLUMNORDER eBindingOrder=FORWARD,
ECOLS_BY_REF eColsByRef=NO_COLS_BY_REF,
WCHAR *pwszTableName=NULL,
EEXECUTE eExecute=EXECUTE_IFNOERROR,
DBTYPE dbTypeModifier=DBTYPE_EMPTY
);
//@mfun: Get the bookmark for the row
BOOL GetBookmark
(
DBCOUNTITEM ulRow,
ULONG_PTR *pcbBookmark,
BYTE **ppBookmark
);
//@mfunc: Release the memory referenced by the consumer's buffer
void FreeMemory(CTable *pCTable=g_pCTable,
ECOMPARE_FREE eReadColumnsByRef=FREE_ONLY);
//@mfunc: Release a rowset object and accessor created on it
BOOL ReleaseRowsetAndAccessor();
//@mfunc: Verify the position of the row handle in the row set
BOOL _VerifyRowPosition
( HROW hRow, // Row handle
DBCOUNTITEM cRow, // Position expected
CTable *pCTable, // Pointer to the CTable
BOOL fExact=FALSE, // Does verification need to be exact?
WCHAR *wszFile=L"",
UDWORD udwLine = 0
);
//@mfunc: Verify the position of the cursor in the row set
BOOL VerifyCursorPosition
(
DBCOUNTITEM cRow, // The cursor position expected
CTable *pCTable, // Pointer to the CTable
BOOL fMoveBack=FALSE, // Whether to move the cursor back to its original postion
// If fMoveBack==FALSE; the cursor will be positioned one row
// after the original position. If fMoveBack==TRUE,
// DBPROP_CANSCROLLBACKWARDS needs to be set.
EVALUE eValue=PRIMARY, // eValue for MakeData
ECOMPARE_FREE eReadColumnsByRef=FREE_ONLY // If the accessor is ReadColumnsByRef
);
BOOL _VerifyApproximatePosition
(
DBCOUNTITEM ulPosition,
DBCOUNTITEM cRows,
DBCOUNTITEM ulExpectedPosition,
WCHAR *wszFile = L"",
UDWORD udwLine = 0
);
BOOL PopulateTable();
BOOL AlteringRowsIsOK();
BOOL IsPropertyActive(DBPROPID DBPropID);
BOOL SetRowsetType(eRowsetType RType);
static DBCOUNTITEM GetRatio
(
DBCOUNTITEM cRows,
DBCOUNTITEM ulNumerator,
DBCOUNTITEM ulDenominator
);
public:
// Constructor
TCIRowsetScroll(WCHAR *wstrTestCaseName);
// Destructor
~TCIRowsetScroll();
};
//--------------------------------------------------------------------
// @mfunc Base class TCIRowsetScroll constructor, must take testcase name
// as parameter.
//
TCIRowsetScroll::TCIRowsetScroll(WCHAR * wstrTestCaseName) //Takes TestCase Class name as parameter
: CRowsetObject (wstrTestCaseName)
{
// Initialize member data
m_pIRowsetScroll = NULL;
m_pIRowset = NULL;
m_pIRowsetIdentity = NULL;
m_hAccessor = NULL;
m_cRowSize = 0;
m_cBinding = 0;
m_rgBinding = NULL;
m_pData = NULL;
m_pHRows = NULL;
m_ulRowCount = 0;
m_fCanHoldRows = FALSE;
m_eRowsetType = USEOPENROWSET;
}
//--------------------------------------------------------------------
// @mfunc Base class TCIRowsetScroll destructor
//
TCIRowsetScroll::~TCIRowsetScroll()
{
}
//--------------------------------------------------------------------
//@mfunc: Create a command object and set properties, execute a sql statement,
// and create a rowset object. Create an accessor on the rowset
//
//--------------------------------------------------------------------
BOOL TCIRowsetScroll::GetRowsetAndAccessor
(
CTable *pCTable, //The pointer to the table object
EQUERY eSQLStmt, //The SQL Statement to create
IID riid, //The interface pointer to return
ULONG cProperties, //The count of properties
const DBPROPID *rgProperties, //The array of properties to be set
ULONG cPropertiesUnset, //The count of properties to be unset
const DBPROPID *rgPropertiesUnset, //The array of properties to be unset
DBACCESSORFLAGS dwAccessorFlags, //The accessor flags
DBPART dwPart, //The type of binding
ECOLS_BOUND eColsToBind, //The columns in accessor
ECOLUMNORDER eBindingOrder, //The order to bind columns
ECOLS_BY_REF eColsByRef, //Which columns to bind by reference
WCHAR *pwszTableName, //The table name for the join statement
EEXECUTE eExecute, //Execute only if all properties are set
DBTYPE dbTypeModifier //The type modifier used for accessor
)
{
BOOL fSucceed=FALSE;
ULONG cCnt=0;
DBPROPSET DBPropSet;
IRowsetInfo *pIRowsetInfo=NULL;
BOOL fIsCanHoldRowsRequired = FALSE;
//Init DBPropSet
DBPropSet.rgProperties=NULL;
DBPropSet.cProperties=cProperties+cPropertiesUnset+2;
DBPropSet.guidPropertySet=DBPROPSET_ROWSET;
//Allocate, add one for IRowsetScroll, IRowsetIdentity and one for CANHOLDROWS (cheap)
DBPropSet.rgProperties=(DBPROP *)PROVIDER_ALLOC(sizeof(DBPROP) * ((DBPropSet.cProperties)+3));
if(!DBPropSet.rgProperties && cProperties==0)
goto END;
//Go through the loop to set every DB Property required
for(cCnt=0;cCnt<cProperties;cCnt++)
{
DBPropSet.rgProperties[cCnt].dwPropertyID=rgProperties[cCnt];
DBPropSet.rgProperties[cCnt].dwOptions=DBPROPOPTIONS_REQUIRED;
DBPropSet.rgProperties[cCnt].colid=DB_NULLID;
if (rgProperties[cCnt]==DBPROP_UPDATABILITY)
{
DBPropSet.rgProperties[cCnt].vValue.vt=VT_I4;
DBPropSet.rgProperties[cCnt].vValue.lVal=
DBPROPVAL_UP_CHANGE| DBPROPVAL_UP_DELETE | DBPROPVAL_UP_INSERT;
}
else if (rgProperties[cCnt]==DBPROP_MAXOPENROWS)
{
DBPropSet.rgProperties[cCnt].vValue.vt=VT_I4;
ASSERT(g_cMaxOpenRowsCount <= INT_MAX );
DBPropSet.rgProperties[cCnt].vValue.lVal=(int)g_cMaxOpenRowsCount;
}
else
{
if ( rgProperties[cCnt] == DBPROP_CANHOLDROWS )
fIsCanHoldRowsRequired = TRUE;
DBPropSet.rgProperties[cCnt].vValue.vt=VT_BOOL;
V_BOOL(&DBPropSet.rgProperties[cCnt].vValue)=VARIANT_TRUE;
}
}
//Go through the loop to unset every DB Property required
for(cCnt=cProperties;cCnt<cProperties+cPropertiesUnset;cCnt++)
{
DBPropSet.rgProperties[cCnt].dwPropertyID=rgPropertiesUnset[cCnt-cProperties];
DBPropSet.rgProperties[cCnt].dwOptions=DBPROPOPTIONS_REQUIRED;
DBPropSet.rgProperties[cCnt].vValue.vt=VT_BOOL;
DBPropSet.rgProperties[cCnt].colid=DB_NULLID;
V_BOOL(&DBPropSet.rgProperties[cCnt].vValue)=VARIANT_FALSE;
}
//Set IRowsetScroll Property
DBPropSet.rgProperties[cProperties+cPropertiesUnset].dwPropertyID=DBPROP_IRowsetScroll;
DBPropSet.rgProperties[cProperties+cPropertiesUnset].dwOptions=DBPROPOPTIONS_REQUIRED;
DBPropSet.rgProperties[cProperties+cPropertiesUnset].vValue.vt=VT_BOOL;
DBPropSet.rgProperties[cProperties+cPropertiesUnset].colid=DB_NULLID;
V_BOOL(&DBPropSet.rgProperties[cProperties+cPropertiesUnset].vValue)=VARIANT_TRUE;
//Set IRowsetIdentity Property
DBPropSet.rgProperties[cProperties+cPropertiesUnset+1].dwPropertyID=DBPROP_IRowsetIdentity;
DBPropSet.rgProperties[cProperties+cPropertiesUnset+1].dwOptions=DBPROPOPTIONS_REQUIRED;
DBPropSet.rgProperties[cProperties+cPropertiesUnset+1].vValue.vt=VT_BOOL;
DBPropSet.rgProperties[cProperties+cPropertiesUnset+1].colid=DB_NULLID;
V_BOOL(&DBPropSet.rgProperties[cProperties+cPropertiesUnset+1].vValue)=VARIANT_TRUE;
//Set CanHoldRows (if not set already)
if ( !fIsCanHoldRowsRequired )
{
DBPropSet.rgProperties[cProperties+cPropertiesUnset+2].dwPropertyID=DBPROP_CANHOLDROWS;
DBPropSet.rgProperties[cProperties+cPropertiesUnset+2].dwOptions=DBPROPOPTIONS_REQUIRED;
DBPropSet.rgProperties[cProperties+cPropertiesUnset+2].vValue.vt=VT_BOOL;
DBPropSet.rgProperties[cProperties+cPropertiesUnset+2].colid=DB_NULLID;
V_BOOL(&DBPropSet.rgProperties[cProperties+cPropertiesUnset+2].vValue)=VARIANT_TRUE;
(DBPropSet.cProperties)++;
}
//Set the properties
SetRowsetProperties(&DBPropSet, 1);
//Get a rowset
if ( m_eRowsetType == USECOMMAND )
{
if(!g_fIsDBCreateCommandSupported)
{
odtLog << L"Command is not supported on MakeTable." << ENDL;
goto END;
}
//Set CTable object
SetTable(pCTable, DELETETABLE_NO);
//Create the rowset object. Fail if properties are not supported.
if (!SUCCEEDED(m_hr=CreateRowsetObject(eSQLStmt,IID_IAccessor, EXECUTE_IFNOERROR)) )
goto END;
}
else if( m_eRowsetType == USEOPENROWSET )
{
//Set CTable object
SetTable(pCTable, DELETETABLE_NO);
//Create the rowset object. Fail if properties are not supported.
if ( !SUCCEEDED(m_hr=CreateRowsetObject(USE_OPENROWSET)) )
goto END;
}
else if(m_eRowsetType == USESCHEMAR)
{
//Create the rowset object. Fail if properties are not supported.
if ( !SUCCEEDED(m_hr=CreateRowsetObject(SELECT_DBSCHEMA_PROVIDER_TYPES)) )
goto END;
}
else
ASSERT(!"Need more support");
//Verify and Create the Interface pointer for IRowsetScroll.
if(!VerifyInterface(m_pIAccessor, IID_IRowsetScroll,
ROWSET_INTERFACE,(IUnknown **)&m_pIRowsetScroll))
{
odtLog << L"IRowsetScroll is not supported." << ENDL;
goto END;
}
//Verify and Create the Interface pointer for IRowset.
if(!VerifyInterface(m_pIAccessor, IID_IRowset,
ROWSET_INTERFACE,(IUnknown **)&m_pIRowset))
{
odtLog << L"IRowset is not supported." << ENDL;
goto END;
}
//Verify and Create the Interface pointer for IRowset.
if(!VerifyInterface(m_pIAccessor, IID_IRowsetIdentity,
ROWSET_INTERFACE,(IUnknown **)&m_pIRowsetIdentity))
{
odtLog << L"IRowsetIdentity is not supported." << ENDL;
goto END;
}
if(FAILED(CountRowsOnRowset(m_pIRowset, &m_ulRowCount)))
goto END;
odtLog<<L" Count of rows in the rowset = "<<m_ulRowCount<<L".\n";
if ( m_hr == DB_S_ERRORSOCCURRED )
{
goto END;
}
else
{
DBCOUNTITEM cRowsObtained = 0;
m_fCanHoldRows = TRUE;
// pre-fetch all rows.
if ( !CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, m_ulRowCount, &cRowsObtained, &m_pHRows), S_OK) )
goto END;
if (!COMPARE(cRowsObtained, m_ulRowCount))
goto END;
if ( !CHECK(m_pIRowset->RestartPosition(DB_NULL_HCHAPTER), S_OK) )
goto END;
}
//If dwAccessorFlags=DBACCESSOR_PASSBYREF, no need to create an accessor
if(dwAccessorFlags==DBACCESSOR_PASSBYREF)
{
fSucceed = TRUE;
goto END;
}
//Create an accessor on the rowset
if(!CHECK(GetAccessorAndBindings(m_pIRowset,dwAccessorFlags,&m_hAccessor,
&m_rgBinding,&m_cBinding,&m_cRowSize,dwPart,eColsToBind,eBindingOrder,
eColsByRef,NULL,NULL,NULL,dbTypeModifier),S_OK))
goto END;
//Allocate memory for the row
m_pData=PROVIDER_ALLOC(m_cRowSize);
if(!m_pData)
goto END;
fSucceed = TRUE;
END:
//Free memory
if(DBPropSet.rgProperties)
PROVIDER_FREE(DBPropSet.rgProperties);
SAFE_RELEASE(pIRowsetInfo);
return fSucceed;
}
//--------------------------------------------------------------------
//@mfun: Get the bookmark for the row. The function has to be called
// after the GetRowsetAndAccessor that creates an accessor on the
// rowset.
//
//--------------------------------------------------------------------
BOOL TCIRowsetScroll::GetBookmark
(
DBCOUNTITEM ulRow,
ULONG_PTR *pcbBookmark,
BYTE **ppBookmark
)
{
BOOL fPass=FALSE;
HROW * pHRow=NULL;
DBCOUNTITEM cCount;
// ulRow has to start with 1
ASSERT(m_pIRowset && pcbBookmark && ppBookmark && ulRow);
// Restart the cursor position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
return FALSE;
// Fetch the row
if(!CHECK(m_pIRowset->GetNextRows(NULL, // Chapter handle.
(ulRow-1), // Count of rows to skip before reading.
1, // The number of rows to fetch.
&cCount, // Actual number of fetched rows.
&pHRow), // Array of handles of retrieved rows.
S_OK))
goto END;
// Only one row handle is retrieved
COMPARE(cCount, 1);
// Get the data
if(!CHECK(m_pIRowset->GetData(*pHRow, m_hAccessor, m_pData),S_OK))
goto END;
// Make sure the 0 column is for bookmark
if(!COMPARE(m_rgBinding[0].iOrdinal, 0))
{
FreeMemory();
goto END;
}
// Get the length of the bookmark
*pcbBookmark= *((ULONG *)((BYTE *)m_pData+m_rgBinding[0].obLength));
// Allocate memory for bookmark
*ppBookmark=(BYTE *)PROVIDER_ALLOC(*pcbBookmark);
if(!(*ppBookmark))
goto END;
// Copy the value of the bookmark into the consumer's buffer
memcpy(*ppBookmark, (void *)((BYTE *)m_pData+m_rgBinding[0].obValue), *pcbBookmark);
// Free the memory referenced by the consumer's buffer
FreeMemory();
fPass=TRUE;
END:
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//restart the cursor position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
return FALSE;
return fPass;
}
//--------------------------------------------------------------------
//@mfunc: Free the memory referenced by the consumer's buffer
// The function has to be called after IRowset::GetData()
//
//--------------------------------------------------------------------
void TCIRowsetScroll::FreeMemory(CTable *pCTable,ECOMPARE_FREE eReadColumnsByRef)
{
// Make sure m_pData is not NULL
if(!COMPARE(!m_pData, NULL))
return;
//make sure the columns are bound
if(!m_rgTableColOrds)
return;
// Call CompareData with the option to free the memory referenced by the consumer's
// buffer without comparing data
//CompareData(m_cColumns,m_rgColumns,1,m_pData,m_cBinding,m_rgBinding,pCTable,
CompareData(m_cRowsetCols, m_rgTableColOrds,1,m_pData,m_cBinding,m_rgBinding,pCTable,
NULL,PRIMARY,FREE_ONLY);
return;
}
//--------------------------------------------------------------------
//@mfunc: Release a rowset object and accessor created on it
//
//--------------------------------------------------------------------
BOOL TCIRowsetScroll::ReleaseRowsetAndAccessor()
{
BOOL fPass=TRUE;
m_ulRowCount=0;
// Free the consumer's buffer
PROVIDER_FREE(m_pData);
// Free binding structure
PROVIDER_FREE(m_rgBinding);
// Free accessor handle
if(m_hAccessor)
{
if(!m_pIAccessor)
// Get an IAccessor pointer if it was not yet a valid pointer
if(VerifyInterface(m_pIRowset,IID_IAccessor,
ROWSET_INTERFACE,(IUnknown **)&m_pIAccessor))
fPass=FALSE;
if(m_pIAccessor)
{
if(!CHECK(m_pIAccessor->ReleaseAccessor(m_hAccessor,NULL), S_OK))
fPass=FALSE;
}
m_hAccessor=NULL;
}
if ( m_fCanHoldRows && m_pIRowset && m_pHRows )
{
if (!CHECK(m_pIRowset->ReleaseRows(m_ulRowCount, m_pHRows, NULL, NULL, NULL), S_OK))
fPass=FALSE;
PROVIDER_FREE(m_pHRows);
}
SAFE_RELEASE(m_pIRowset);
SAFE_RELEASE(m_pIRowsetScroll);
SAFE_RELEASE(m_pIRowsetIdentity);
ReleaseRowsetObject(); //releases m_pIAccessor
ReleaseCommandObject(); //releases m_pICommand
ReleaseDBSession();
ReleaseDataSourceObject();
return fPass;
}
//--------------------------------------------------------------------
//
//@mfunc: Verify the position of the row handle in the row set
//
// Precondition: The function has to be called after GetRowsetAndAccessor that
// creates a rowset and an accessor
//
//--------------------------------------------------------------------
BOOL TCIRowsetScroll::_VerifyRowPosition
(
HROW hRow, // Row handle
DBCOUNTITEM cRow, // Position expected
CTable * pCTable, // Pointer to the CTable
BOOL fExact, // Enforce exactness
WCHAR * wszFile,
UDWORD udwLine
)
{
// Input validation
if(!pCTable)
return FALSE;
// m_pIRowset has to be valid
if(!m_pIRowset || !m_pData || !m_pIRowsetIdentity)
return FALSE;
g_cVerifyRows++;
if ( m_fCanHoldRows )
{
if ( FAILED(m_hr = m_pIRowsetIdentity->IsSameRow(hRow, m_pHRows[cRow-1])) )
return FALSE;
if ( m_hr == S_OK )
return TRUE;
if ( m_hr == S_FALSE )
{
// sequentially search until a match.
for ( ULONG i = 1; i<=m_ulRowCount; i++ )
{
if ( FAILED(m_hr = m_pIRowsetIdentity->IsSameRow(hRow, m_pHRows[i-1])) )
{
if( m_hr == DB_E_DELETEDROW )
continue;
else
return FALSE;
}
if ( m_hr == S_OK )
{
odtLog<<" Inexact Position occurred. Recieved: "<<i<<". Ideally expecting row: "<<cRow<<".\n";
odtLog<<" Called from "<<wszFile<<", Line: "<<udwLine<<".\n";
g_ulWeightedError += (i-cRow)*(i-cRow);
if ( fExact )
return FALSE;
else
return TRUE;
}
}
}
// no match, should never happen
odtLog << "Compare row didn't exist in rowset!\n";
return FALSE;
}
// Get Data for the row
if(!CHECK(m_pIRowset->GetData(hRow,m_hAccessor,m_pData),S_OK))
return FALSE;
// Compare the data with the row expected in the rowset
//if(!CompareData(m_cColumns,m_rgColumns,cRow,m_pData,m_cBinding,m_rgBinding,pCTable,
if(!CompareData(m_cRowsetCols, m_rgTableColOrds,cRow,m_pData,m_cBinding,m_rgBinding,pCTable,
NULL,PRIMARY,FREE_ONLY,COMPARE_UNTIL_ERROR))
return FALSE;
return TRUE;
}
//--------------------------------------------------------------------
//
//@mfunc: Verify the position of the cursor in the row set
//
// Precondition: The function has to be called after GetRowsetAndAccessor that
// creates a rowset and an accessor.
//
//--------------------------------------------------------------------
BOOL TCIRowsetScroll::VerifyCursorPosition
(
DBCOUNTITEM cRow, // The cursor position expected
CTable *pCTable, // Pointer to the CTable
BOOL fMoveBack, // Whether to move the cursor back to its original postion
// If fMoveBack==FALSE; the cursor will be positioned one row
// after the original position. If fMoveBack==TRUE,
// DBPROP_CANSCROLLBACKWARDS needs to be set.
EVALUE eValue, // eValue for MakeData
ECOMPARE_FREE eReadColumnsByRef // If the accessor is ReadColumnsByRef
)
{
HROW hRow[1];
HROW * pHRow=hRow;
DBCOUNTITEM cRows;
BOOL fTestPass=TRUE;
// Input validation
if(COMPARE(pCTable, NULL))
return FALSE;
// m_pIRowset has to be valid
if(COMPARE(m_pIRowset, NULL) ||
COMPARE(m_pData,NULL))
return FALSE;
// Get a row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRows,&pHRow),S_OK))
return FALSE;
if(!VerifyRowPosition(hRow[0],cRow,pCTable,EXACT))
fTestPass=FALSE;
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(1,hRow,NULL,NULL,NULL),S_OK);
// Reposition the cursor to its original position
if(fMoveBack)
{
if(!CHECK(m_pIRowset->GetNextRows(NULL,-1,0,&cRows,&pHRow),S_OK))
fTestPass=FALSE;
}
return (fTestPass);
}
BOOL TCIRowsetScroll::_VerifyApproximatePosition
(
DBCOUNTITEM ulPosition,
DBCOUNTITEM cRows,
DBCOUNTITEM ulExpectedPosition,
WCHAR * wszFile,
UDWORD udwLine
)
{
BOOL fWarning = FALSE, fPass = TRUE;
g_cVerifyApproxPos++;
if (!COMPARE((cRows >= ulPosition), TRUE))
{
fPass = FALSE;
fWarning = TRUE;
goto END;
}
if ( ulPosition != ulExpectedPosition )
{
odtLog << wszInexactPositionWarning;
odtLog << "Expected *pulPosition: "<<ulExpectedPosition<<" Received: "<<ulPosition<<".\n";
fWarning = TRUE;
g_ulWeightedPosError+=(ulPosition-ulExpectedPosition)*(ulPosition-ulExpectedPosition);
}
if ( cRows != m_ulRowCount )
{
odtLog << wszInexactRowCountWarning;
odtLog << "Expected *pcRows: "<<m_ulRowCount<<" Received: "<<cRows<<".\n";
fWarning = TRUE;
g_ulWeightedPosError+=(cRows-m_ulRowCount)*(cRows-m_ulRowCount);
}
END:
if ( fWarning )
odtLog << L"Called from "<<wszFile<<". Line: "<<udwLine<<L".\n";
return fPass;
}
//--------------------------------------------------------------------
//
//@mfunc: Replenish the table
//
//--------------------------------------------------------------------
BOOL TCIRowsetScroll::PopulateTable()
{
//delete all rows in the table.
if(!CHECK(g_pCTable->DeleteRows(ALLROWS),S_OK))
return FALSE;
// Regenerate the rowset
if(!CHECK(g_pCTable->Insert(PRIMARY, 1, g_lRowLast),S_OK))
return FALSE;
return TRUE;
}
//--------------------------------------------------------------------
//
//@mfunc: verify that updating / deleting rows is OK against this provider.
//
// The result of this particular function is independant of whether the provider
// allows updates/deletes. The focus is rather whether deleting a row will
// cause the table to fall into an "unknown" state.
//
//--------------------------------------------------------------------
BOOL TCIRowsetScroll::AlteringRowsIsOK()
{
// If a specific table was set on the backend, assume we cannot alter it.
if ( GetModInfo()->GetTableName() && !GetModInfo()->GetFileName() )
return FALSE;
else
return TRUE;
}
//--------------------------------------------------------------------
//@mfunc: Check if a property is supported on a rowset
//--------------------------------------------------------------------
BOOL TCIRowsetScroll::IsPropertyActive(DBPROPID DBPropID)
{
IRowsetInfo *pIRowsetInfo=NULL;
ULONG cProperty;
DBPROPIDSET DBPropIDSet;
DBPROPSET *pDBPropSet=NULL;
BOOL fSupported=FALSE;
//initialize
DBPropIDSet.guidPropertySet=DBPROPSET_ROWSET;
DBPropIDSet.cPropertyIDs=1;
DBPropIDSet.rgPropertyIDs=&DBPropID;
//QI for IRowsetInfo interface
if(!CHECK(m_pIRowset->QueryInterface(IID_IRowsetInfo,(LPVOID *)&pIRowsetInfo),S_OK))
goto CLEANUP;
//ask for DBPROP_BOOKMARKSKIPPED
if(!CHECK(pIRowsetInfo->GetProperties(1,&DBPropIDSet,&cProperty,
&pDBPropSet),S_OK))
goto CLEANUP;
if(V_BOOL(&pDBPropSet->rgProperties->vValue)==VARIANT_TRUE)
fSupported=TRUE;
CLEANUP:
if(pDBPropSet)
{
if(pDBPropSet->rgProperties)
PROVIDER_FREE(pDBPropSet->rgProperties);
PROVIDER_FREE(pDBPropSet);
}
SAFE_RELEASE(pIRowsetInfo);
return fSupported;
}
BOOL TCIRowsetScroll::SetRowsetType(eRowsetType RType)
{
m_eRowsetType = RType;
switch ( RType )
{
case USECOMMAND:
return g_fIsDBCreateCommandSupported;
case USESCHEMAR:
return g_fIsDBSchemaRowsetSupported;
default:
return TRUE;
}
}
DBCOUNTITEM TCIRowsetScroll::GetRatio
(
DBCOUNTITEM cRows,
DBCOUNTITEM ulNumerator,
DBCOUNTITEM ulDenominator
)
{
return (DBCOUNTITEM)(((double) ulNumerator * cRows) / ulDenominator);
}
//--------------------------------------------------------------------
//@mfunc: Init creates a Data Source object, a DB Session object,
// a command object and initialize corresponding interface pointers.
//
//--------------------------------------------------------------------
BOOL TCIRowsetScroll::Init()
{
return (CRowsetObject::Init());
}
//--------------------------------------------------------------------
//@mfunc: Terminate release the data source object, DB Session object, Command object
//
//--------------------------------------------------------------------
BOOL TCIRowsetScroll::Terminate()
{
return (CRowsetObject::Terminate());
}
//--------------------------------------------------------------------
// @class test DBPROP_BOOKMARKS
//
class Bookmarks : public TCIRowsetScroll {
private:
public:
~Bookmarks (void) {};
Bookmarks ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember *pBookmark=DBBMK_FIRST, S_OK
int Variation_1();
// @cmember *pBookmark=DBBMK_LAST. S_OK is returned
int Variation_2();
// @cmember *pBookmark=DBBMK_INVALID, DB_E_BADBOOKMARK
int Variation_3();
// @cmember Get one row handle at a time
int Variation_4();
};
// {{ TCW_TEST_CASE_MAP(Bookmarks_cmd)
//--------------------------------------------------------------------
// @class test DBPROP_BOOKMARKS
//
class Bookmarks_cmd : public Bookmarks {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Bookmarks_cmd,Bookmarks);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Bookmarks_cmd)
#define THE_CLASS Bookmarks_cmd
BEG_TEST_CASE(Bookmarks_cmd, Bookmarks, L"test DBPROP_BOOKMARKS")
TEST_VARIATION(1, L"*pBookmark=DBBMK_FIRST, S_OK")
TEST_VARIATION(2, L"*pBookmark=DBBMK_LAST. S_OK is returned")
TEST_VARIATION(3, L"*pBookmark=DBBMK_INVALID, DB_E_BADBOOKMARK")
TEST_VARIATION(4, L"Get one row handle at a time")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Bookmarks_SchemaR)
//--------------------------------------------------------------------
// @class Using Schema Rowsets
//
class Bookmarks_SchemaR : public Bookmarks {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Bookmarks_SchemaR,Bookmarks);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Bookmarks_SchemaR)
#define THE_CLASS Bookmarks_SchemaR
BEG_TEST_CASE(Bookmarks_SchemaR, Bookmarks, L"Using Schema Rowsets")
TEST_VARIATION(1, L"*pBookmark=DBBMK_FIRST, S_OK")
TEST_VARIATION(2, L"*pBookmark=DBBMK_LAST. S_OK is returned")
TEST_VARIATION(3, L"*pBookmark=DBBMK_INVALID, DB_E_BADBOOKMARK")
TEST_VARIATION(4, L"Get one row handle at a time")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Bookmarks_OpenRowset)
//--------------------------------------------------------------------
// @class In Context of IOpenRowset
//
class Bookmarks_OpenRowset : public Bookmarks {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Bookmarks_OpenRowset,Bookmarks);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Bookmarks_OpenRowset)
#define THE_CLASS Bookmarks_OpenRowset
BEG_TEST_CASE(Bookmarks_OpenRowset, Bookmarks, L"In Context of IOpenRowset")
TEST_VARIATION(1, L"*pBookmark=DBBMK_FIRST, S_OK")
TEST_VARIATION(2, L"*pBookmark=DBBMK_LAST. S_OK is returned")
TEST_VARIATION(3, L"*pBookmark=DBBMK_INVALID, DB_E_BADBOOKMARK")
TEST_VARIATION(4, L"Get one row handle at a time")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Test DBPROP_CANHOLDROWS property
//
class CanHoldRows : public TCIRowsetScroll {
private:
public:
~CanHoldRows (void) {};
CanHoldRows ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember Get first two rows, get next three rows, pass bookmark of second row. S_OK returned.
int Variation_1();
// @cmember Get first two rows, *pBookmark=second row bookmark. S_OK returned.
int Variation_2();
// @cmember Get first 5 rows, get last 5 rows, ulNumerator=1, ulDenominator=2, S_OK and 10th row returned.
int Variation_3();
};
// {{ TCW_TEST_CASE_MAP(CanHoldRows_cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class CanHoldRows_cmd : public CanHoldRows {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CanHoldRows_cmd,CanHoldRows);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(CanHoldRows_cmd)
#define THE_CLASS CanHoldRows_cmd
BEG_TEST_CASE(CanHoldRows_cmd, CanHoldRows, L"In context of commands")
TEST_VARIATION(1, L"Get first two rows, get next three rows, pass bookmark of second row. S_OK returned.")
TEST_VARIATION(2, L"Get first two rows, *pBookmark=second row bookmark. S_OK returned.")
TEST_VARIATION(3, L"Get first 5 rows, get last 5 rows, ulNumerator=1, ulDenominator=2, S_OK and middle row returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(CanHoldRows_SchemaR)
//--------------------------------------------------------------------
// @class In context of Schema rowsets
//
class CanHoldRows_SchemaR : public CanHoldRows {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CanHoldRows_SchemaR,CanHoldRows);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(CanHoldRows_SchemaR)
#define THE_CLASS CanHoldRows_SchemaR
BEG_TEST_CASE(CanHoldRows_SchemaR, CanHoldRows, L"In context of Schema rowsets")
TEST_VARIATION(1, L"Get first two rows, get next three rows, pass bookmark of second row. S_OK returned.")
TEST_VARIATION(2, L"Get first two rows, *pBookmark=second row bookmark. S_OK returned.")
TEST_VARIATION(3, L"Get first 5 rows, get last 5 rows, ulNumerator=1, ulDenominator=2, S_OK and middle row returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(CanHoldRows_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class CanHoldRows_OpenRowset : public CanHoldRows {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CanHoldRows_OpenRowset,CanHoldRows);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(CanHoldRows_OpenRowset)
#define THE_CLASS CanHoldRows_OpenRowset
BEG_TEST_CASE(CanHoldRows_OpenRowset, CanHoldRows, L"In context of IOpenRowset")
TEST_VARIATION(1, L"Get first two rows, get next three rows, pass bookmark of second row. S_OK returned.")
TEST_VARIATION(2, L"Get first two rows, *pBookmark=second row bookmark. S_OK returned.")
TEST_VARIATION(3, L"Get first 5 rows, get last 5 rows, ulNumerator=1, ulDenominator=2, S_OK and middle row returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Test DBPROP_CANFETCHBACKWARDS
//
class CanFetchBackwards : public TCIRowsetScroll {
private:
public:
~CanFetchBackwards (void) {};
CanFetchBackwards ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember ulNumerator=1, ulDenominator=20, cRows=-2
int Variation_1();
// @cmember ulNumerator=1, ulDenominator=4, cRows=-6
int Variation_2();
// @cmember ulNumerator=3, ulDenominator=5, cRows=-2
int Variation_3();
// @cmember ulNumerator=lastrow-1, ulDenominator=lastrow, cRows=2. DB_S_ENDOFROWSET.
int Variation_4();
};
// {{ TCW_TEST_CASE_MAP(CanFetchBackwards_Cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class CanFetchBackwards_Cmd : public CanFetchBackwards {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CanFetchBackwards_Cmd,CanFetchBackwards);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(CanFetchBackwards_Cmd)
#define THE_CLASS CanFetchBackwards_Cmd
BEG_TEST_CASE(CanFetchBackwards_Cmd, CanFetchBackwards, L"In context of commands")
TEST_VARIATION(1, L"ulNumerator=1, ulDenominator=RowCount, cRows=-2")
TEST_VARIATION(2, L"ulNumerator=1, ulDenominator=4, cRows=-6")
TEST_VARIATION(3, L"ulNumerator=3, ulDenominator=5, cRows=-2")
TEST_VARIATION(4, L"ulNumerator=lastrow-1, ulDenominator=lastrow, cRows=2. DB_S_ENDOFROWSET.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(CanFetchBackwards_SchemaR)
//--------------------------------------------------------------------
// @class In context of a Schema Rowset
//
class CanFetchBackwards_SchemaR : public CanFetchBackwards {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CanFetchBackwards_SchemaR,CanFetchBackwards);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(CanFetchBackwards_SchemaR)
#define THE_CLASS CanFetchBackwards_SchemaR
BEG_TEST_CASE(CanFetchBackwards_SchemaR, CanFetchBackwards, L"In context of a Schema Rowset")
TEST_VARIATION(1, L"ulNumerator=1, ulDenominator=RowCount, cRows=-2")
TEST_VARIATION(2, L"ulNumerator=1, ulDenominator=4, cRows=-6")
TEST_VARIATION(3, L"ulNumerator=3, ulDenominator=5, cRows=-2")
TEST_VARIATION(4, L"ulNumerator=lastrow-1, ulDenominator=lastrow, cRows=2. DB_S_ENDOFROWSET.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(CanFetchBackwards_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class CanFetchBackwards_OpenRowset : public CanFetchBackwards {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CanFetchBackwards_OpenRowset,CanFetchBackwards);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(CanFetchBackwards_OpenRowset)
#define THE_CLASS CanFetchBackwards_OpenRowset
BEG_TEST_CASE(CanFetchBackwards_OpenRowset, CanFetchBackwards, L"In context of IOpenRowset")
TEST_VARIATION(1, L"ulNumerator=1, ulDenominator=RowCount, cRows=-2")
TEST_VARIATION(2, L"ulNumerator=1, ulDenominator=4, cRows=-6")
TEST_VARIATION(3, L"ulNumerator=3, ulDenominator=5, cRows=-2")
TEST_VARIATION(4, L"ulNumerator=lastrow-1, ulDenominator=lastrow, cRows=2. DB_S_ENDOFROWSET.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Test DBPROP_CANFETCHBACKWARDS + DBPROP_CANHOLDROWS
//
class CanFetchBackwards_CanHoldRows : public TCIRowsetScroll {
private:
public:
~CanFetchBackwards_CanHoldRows (void) {};
CanFetchBackwards_CanHoldRows ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember ulNumerator=1, ulDenominator=20, cRows=-1
int Variation_1();
// @cmember ulNumerator=3, ulDenominator=20, cRows=-3
int Variation_2();
};
// {{ TCW_TEST_CASE_MAP(CanFetchBackwards_CanHoldRows_Cmd)
//--------------------------------------------------------------------
// @class In context of Commands
//
class CanFetchBackwards_CanHoldRows_Cmd : public CanFetchBackwards_CanHoldRows {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CanFetchBackwards_CanHoldRows_Cmd,CanFetchBackwards_CanHoldRows);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(CanFetchBackwards_CanHoldRows_Cmd)
#define THE_CLASS CanFetchBackwards_CanHoldRows_Cmd
BEG_TEST_CASE(CanFetchBackwards_CanHoldRows_Cmd, CanFetchBackwards_CanHoldRows, L"In context of Commands")
TEST_VARIATION(1, L"ulNumerator=1, ulDenominator=RowCount, cRows=-1")
TEST_VARIATION(2, L"ulNumerator=3, ulDenominator=RowCount, cRows=-3")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(CanFetchBackwards_CanHoldRows_SchemaR)
//--------------------------------------------------------------------
// @class In context of a Schema Rowset
//
class CanFetchBackwards_CanHoldRows_SchemaR : public CanFetchBackwards_CanHoldRows {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CanFetchBackwards_CanHoldRows_SchemaR,CanFetchBackwards_CanHoldRows);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(CanFetchBackwards_CanHoldRows_SchemaR)
#define THE_CLASS CanFetchBackwards_CanHoldRows_SchemaR
BEG_TEST_CASE(CanFetchBackwards_CanHoldRows_SchemaR, CanFetchBackwards_CanHoldRows, L"In context of a Schema Rowset")
TEST_VARIATION(1, L"ulNumerator=1, ulDenominator=RowCount, cRows=-1")
TEST_VARIATION(2, L"ulNumerator=3, ulDenominator=RowCount, cRows=-3")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(CanFetchBackwards_CanHoldRows_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class CanFetchBackwards_CanHoldRows_OpenRowset : public CanFetchBackwards_CanHoldRows {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CanFetchBackwards_CanHoldRows_OpenRowset,CanFetchBackwards_CanHoldRows);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(CanFetchBackwards_CanHoldRows_OpenRowset)
#define THE_CLASS CanFetchBackwards_CanHoldRows_OpenRowset
BEG_TEST_CASE(CanFetchBackwards_CanHoldRows_OpenRowset, CanFetchBackwards_CanHoldRows, L"In context of IOpenRowset")
TEST_VARIATION(1, L"ulNumerator=1, ulDenominator=RowCount, cRows=-1")
TEST_VARIATION(2, L"ulNumerator=3, ulDenominator=RowCount, cRows=-3")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Test DBPROP_MAXOPENROWS
//
class MaxOpenRows : public TCIRowsetScroll {
private:
public:
~MaxOpenRows (void) {};
MaxOpenRows ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember MAXOPENROWS=3, ratio=9/10, and cRows=4. DB_S_ENDOFROWSET is returned.
int Variation_1();
// @cmember MAXOPENROWS=2, ulNumerator=1, ulDenominator=3, and cRows=3. DB_S_ROWLIMITEXCEEDED is returned.
int Variation_2();
// @cmember MAXOPENROWS=2, ulNumerator=1, ulDenominator=3, and cRows=3. DB_S_ROWLIMITEXCEEDED is returned.
int Variation_3();
};
// {{ TCW_TEST_CASE_MAP(MaxOpenRows_Cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class MaxOpenRows_Cmd : public MaxOpenRows {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(MaxOpenRows_Cmd,MaxOpenRows);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(MaxOpenRows_Cmd)
#define THE_CLASS MaxOpenRows_Cmd
BEG_TEST_CASE(MaxOpenRows_Cmd, MaxOpenRows, L"In context of commands")
TEST_VARIATION(1, L"MAXOPENROWS=3, ratio=9/10, and cRows=4. DB_S_ENDOFROWSET is returned.")
TEST_VARIATION(2, L"MAXOPENROWS=2, ulNumerator=1, ulDenominator=3, and cRows=3. DB_S_ROWLIMITEXCEEDED is returned.")
TEST_VARIATION(3, L"MAXOPENROWS=2, ulNumerator=1, ulDenominator=3, and cRows=3. DB_S_ROWLIMITEXCEEDED is returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(MaxOpenRows_SchemaR)
//--------------------------------------------------------------------
// @class In context of a Schema Rowset
//
class MaxOpenRows_SchemaR : public MaxOpenRows {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(MaxOpenRows_SchemaR,MaxOpenRows);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(MaxOpenRows_SchemaR)
#define THE_CLASS MaxOpenRows_SchemaR
BEG_TEST_CASE(MaxOpenRows_SchemaR, MaxOpenRows, L"In context of a Schema Rowset")
TEST_VARIATION(1, L"MAXOPENROWS=3, ratio=9/10, and cRows=4. DB_S_ENDOFROWSET is returned.")
TEST_VARIATION(2, L"MAXOPENROWS=2, ulNumerator=1, ulDenominator=3, and cRows=3. DB_S_ROWLIMITEXCEEDED is returned.")
TEST_VARIATION(3, L"MAXOPENROWS=2, ulNumerator=1, ulDenominator=3, and cRows=3. DB_S_ROWLIMITEXCEEDED is returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(MaxOpenRows_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class MaxOpenRows_OpenRowset : public MaxOpenRows {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(MaxOpenRows_OpenRowset,MaxOpenRows);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(MaxOpenRows_OpenRowset)
#define THE_CLASS MaxOpenRows_OpenRowset
BEG_TEST_CASE(MaxOpenRows_OpenRowset, MaxOpenRows, L"In context of IOpenRowset")
TEST_VARIATION(1, L"MAXOPENROWS=3, ratio=9/10, and cRows=4. DB_S_ENDOFROWSET is returned.")
TEST_VARIATION(2, L"MAXOPENROWS=2, ulNumerator=1, ulDenominator=3, and cRows=3. DB_S_ROWLIMITEXCEEDED is returned.")
TEST_VARIATION(3, L"MAXOPENROWS=2, ulNumerator=1, ulDenominator=3, and cRows=3. DB_S_ROWLIMITEXCEEDED is returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Delete rows from the rowset
//
class DeleteRows : public TCIRowsetScroll {
private:
public:
~DeleteRows (void) {};
DeleteRows ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember *pBookmark=second row bookmark, delete second row. DB_E_DELETEDROW is returned.
int Variation_1();
// @cmember *pBookmark=DBBMK_LAST, delete last row. S_OK is returned.
int Variation_2();
// @cmember Ratio points to deleted row. DB_E_DELETEDROW and no row handles returned.
int Variation_3();
// @cmember Delete 10th row. ulNumerator=1, ulDenominator=2, and cRows=1. S_OK and middle handle returned.
int Variation_4();
// @cmember Delete last row. ulNumerator=RowCount, ulDenominator=RowCount, S_OK and 20th row handle returned.
int Variation_5();
};
// {{ TCW_TEST_CASE_MAP(DeleteRows_cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class DeleteRows_cmd : public DeleteRows {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(DeleteRows_cmd,DeleteRows);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(DeleteRows_cmd)
#define THE_CLASS DeleteRows_cmd
BEG_TEST_CASE(DeleteRows_cmd, DeleteRows, L"In context of commands")
TEST_VARIATION(1, L"*pBookmark=second row bookmark, delete second row. DB_E_DELETEDROW is returned.")
TEST_VARIATION(2, L"*pBookmark=DBBMK_LAST, delete last row. S_OK is returned.")
TEST_VARIATION(3, L"Ratio points to deleted row. DB_E_DELETEDROW and no row handles returned.")
TEST_VARIATION(4, L"Delete 10th row. ulNumerator=1, ulDenominator=2, and cRows=1. S_OK and middle handle returned.")
TEST_VARIATION(5, L"Delete last row. ulNumerator=RowCount, ulDenominator=RowCount, S_OK and 20th row handle returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(DeleteRows_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class DeleteRows_OpenRowset : public DeleteRows {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(DeleteRows_OpenRowset,DeleteRows);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(DeleteRows_OpenRowset)
#define THE_CLASS DeleteRows_OpenRowset
BEG_TEST_CASE(DeleteRows_OpenRowset, DeleteRows, L"In context of IOpenRowset")
TEST_VARIATION(1, L"*pBookmark=second row bookmark, delete second row. DB_E_DELETEDROW is returned.")
TEST_VARIATION(2, L"*pBookmark=DBBMK_LAST, delete last row. S_OK is returned.")
TEST_VARIATION(3, L"Ratio points to deleted row. DB_E_DELETEDROW and no row handles returned.")
TEST_VARIATION(4, L"Delete 10th row. ulNumerator=1, ulDenominator=2, and cRows=1. S_OK and middle handle returned.")
TEST_VARIATION(5, L"Delete last row. ulNumerator=RowCount, ulDenominator=RowCount, S_OK and 20th row handle returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class test DBPROP_REMOVEDELETED
//
class RemoveDeleted : public TCIRowsetScroll {
private:
public:
~RemoveDeleted (void) {};
RemoveDeleted ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember *pBookmark points to a deleted row. DB_E_BADBOOKMARD is returned.
int Variation_1();
// @cmember Delete the 3rd row. *pBookmark points to the second row. S_OK is returned.
int Variation_2();
// @cmember Ratio points to deleted row. DB_E_DELETEDROW and no row handles returned.
int Variation_3();
// @cmember Delete 18th row. ulNumerator=9, ulDenominator=10, and cRows=3. DB_S_ENDOFROWSET is returned.
int Variation_4();
// @cmember Delete 19th row. ulNumerator=19, ulDenominator=RowCount, and cRows=1. S_OK and 20th row handle returned.
int Variation_5();
// @cmember Delete Half the row. Use ratio of 3/4
int Variation_6();
};
// {{ TCW_TEST_CASE_MAP(RemoveDeleted_Cmd)
//--------------------------------------------------------------------
// @class In context of Commands
//
class RemoveDeleted_Cmd : public RemoveDeleted {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(RemoveDeleted_Cmd,RemoveDeleted);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(RemoveDeleted_Cmd)
#define THE_CLASS RemoveDeleted_Cmd
BEG_TEST_CASE(RemoveDeleted_Cmd, RemoveDeleted, L"In context of Commands")
TEST_VARIATION(1, L"*pBookmark points to a deleted row. DB_E_BADBOOKMARD is returned.")
TEST_VARIATION(2, L"Delete the 3rd row. *pBookmark points to the second row. S_OK is returned. ")
TEST_VARIATION(3, L"Ratio points to deleted row. DB_E_DELETEDROW and no row handles returned.")
TEST_VARIATION(4, L"Delete 18th row. ulNumerator=9, ulDenominator=10, and cRows=3. DB_S_ENDOFROWSET is returned.")
TEST_VARIATION(5, L"Delete 19th row. ulNumerator=19, ulDenominator=RowCount, and cRows=1. S_OK and 20th row handle returned.")
TEST_VARIATION(6, L"Delete half the row. Use ratio of 3/4. Verify ratio applies to undeleted rows.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(RemoveDeleted_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class RemoveDeleted_OpenRowset : public RemoveDeleted {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(RemoveDeleted_OpenRowset,RemoveDeleted);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(RemoveDeleted_OpenRowset)
#define THE_CLASS RemoveDeleted_OpenRowset
BEG_TEST_CASE(RemoveDeleted_OpenRowset, RemoveDeleted, L"In context of IOpenRowset")
TEST_VARIATION(1, L"*pBookmark points to a deleted row. DB_E_BADBOOKMARD is returned.")
TEST_VARIATION(2, L"Delete the 3rd row. *pBookmark points to the second row. S_OK is returned. ")
TEST_VARIATION(3, L"Ratio points to deleted row. DB_E_DELETEDROW and no row handles returned.")
TEST_VARIATION(4, L"Delete 18th row. ulNumerator=9, ulDenominator=10, and cRows=3. DB_S_ENDOFROWSET is returned.")
TEST_VARIATION(5, L"Delete 19th row. ulNumerator=19, ulDenominator=RowCount, and cRows=1. S_OK and 20th row handle returned.")
TEST_VARIATION(6, L"Delete half the row. Use ratio of 3/4. Verify ratio applies to undeleted rows.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Test single row rowset
//
class Rowset_SingleRow : public TCIRowsetScroll {
private:
public:
~Rowset_SingleRow (void) {};
Rowset_SingleRow ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember *pBookmark=first row bookmark. S_OK is returned.
int Variation_1();
// @cmember ulNumerator=1, ulDenominator=1, cRows=-1. S_OK returned.
int Variation_2();
// @cmember ulNumerator=0, ulDenominator=1, cRows=1. S_OK returned.
int Variation_3();
// @cmember *pBookmark=DBBMK_LAST. S_OK is returned.
int Variation_4();
// @cmember *pBookmark=DBBMK_FIRST S_OK is returned.
int Variation_5();
// @cmember ulNumerator=1, ulDenominator=3, cRows=1. S_OK returned.
int Variation_6();
};
// {{ TCW_TEST_CASE_MAP(Rowset_SingleRow_Cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class Rowset_SingleRow_Cmd : public Rowset_SingleRow {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Rowset_SingleRow_Cmd,Rowset_SingleRow);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Rowset_SingleRow_Cmd)
#define THE_CLASS Rowset_SingleRow_Cmd
BEG_TEST_CASE(Rowset_SingleRow_Cmd, Rowset_SingleRow, L"In context of commands")
TEST_VARIATION(1, L"*pBookmark=first row bookmark. S_OK is returned.")
TEST_VARIATION(2, L"ulNumerator=1, ulDenominator=1, cRows=-1. S_OK returned.")
TEST_VARIATION(3, L"ulNumerator=0, ulDenominator=1, cRows=1. S_OK returned.")
TEST_VARIATION(4, L"*pBookmark=DBBMK_LAST. S_OK is returned.")
TEST_VARIATION(5, L"*pBookmark=DBBMK_FIRST S_OK is returned.")
TEST_VARIATION(6, L"ulNumerator=1, ulDenominator=3, cRows=1. S_OK returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Rowset_SingleRow_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class Rowset_SingleRow_OpenRowset : public Rowset_SingleRow {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Rowset_SingleRow_OpenRowset,Rowset_SingleRow);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Rowset_SingleRow_OpenRowset)
#define THE_CLASS Rowset_SingleRow_OpenRowset
BEG_TEST_CASE(Rowset_SingleRow_OpenRowset, Rowset_SingleRow, L"In context of IOpenRowset")
TEST_VARIATION(1, L"*pBookmark=first row bookmark. S_OK is returned.")
TEST_VARIATION(2, L"ulNumerator=1, ulDenominator=1, cRows=-1. S_OK returned.")
TEST_VARIATION(3, L"ulNumerator=0, ulDenominator=1, cRows=1. S_OK returned.")
TEST_VARIATION(4, L"*pBookmark=DBBMK_LAST. S_OK is returned.")
TEST_VARIATION(5, L"*pBookmark=DBBMK_FIRST S_OK is returned.")
TEST_VARIATION(6, L"ulNumerator=1, ulDenominator=3, cRows=1. S_OK returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Test empty rowset
//
class Rowset_Empty : public TCIRowsetScroll {
private:
public:
~Rowset_Empty (void) {};
Rowset_Empty ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember *pBookmark=DBBMK_FIRST. S_OK is returned.
int Variation_1();
// @cmember ulNumerator=1, ulDenominator=1, cRows=1. DB_S_ENDOFROWSET and no row handle returned.
int Variation_2();
// @cmember ulNumerator=1, ulDenominator=1, cRows=0. S_OK and no row handle returned.
int Variation_3();
// @cmember ulNumerator=0, ulDenominator=1, cRows=1. DB_S_ENDOFROWSET
int Variation_4();
// @cmember *pBookmark=DBBMK_LAST. S_OK is returned.
int Variation_5();
};
// {{ TCW_TEST_CASE_MAP(Rowset_Empty_Cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class Rowset_Empty_Cmd : public Rowset_Empty {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Rowset_Empty_Cmd,Rowset_Empty);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Rowset_Empty_Cmd)
#define THE_CLASS Rowset_Empty_Cmd
BEG_TEST_CASE(Rowset_Empty_Cmd, Rowset_Empty, L"In context of commands")
TEST_VARIATION(1, L"*pBookmark=DBBMK_FIRST. S_OK is returned.")
TEST_VARIATION(2, L"ulNumerator=1, ulDenominator=1, cRows=1. DB_S_ENDOFROWSET and no row handle returned.")
TEST_VARIATION(3, L"ulNumerator=1, ulDenominator=1, cRows=0. S_OK and no row handle returned.")
TEST_VARIATION(4, L"ulNumerator=0, ulDenominator=1, cRows=1. DB_S_ENDOFROWSET")
TEST_VARIATION(5, L"*pBookmark=DBBMK_LAST. S_OK is returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Rowset_Empty_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class Rowset_Empty_OpenRowset : public Rowset_Empty {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Rowset_Empty_OpenRowset,Rowset_Empty);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Rowset_Empty_OpenRowset)
#define THE_CLASS Rowset_Empty_OpenRowset
BEG_TEST_CASE(Rowset_Empty_OpenRowset, Rowset_Empty, L"In context of IOpenRowset")
TEST_VARIATION(1, L"*pBookmark=DBBMK_FIRST. S_OK is returned.")
TEST_VARIATION(2, L"ulNumerator=1, ulDenominator=1, cRows=1. DB_S_ENDOFROWSET and no row handle returned.")
TEST_VARIATION(3, L"ulNumerator=1, ulDenominator=1, cRows=0. S_OK and no row handle returned.")
TEST_VARIATION(4, L"ulNumerator=0, ulDenominator=1, cRows=1. DB_S_ENDOFROWSET")
TEST_VARIATION(5, L"*pBookmark=DBBMK_LAST. S_OK is returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Boundary conditions for GetApproximatePosition
//
class Boundary_GetApproximatePosition : public TCIRowsetScroll {
private:
ULONG_PTR m_cbBookmark;
BYTE *m_pBookmark;
DBBOOKMARK m_DBBookmark;
DBCOUNTITEM m_pulPosition;
DBCOUNTITEM m_pcRows;
public:
~Boundary_GetApproximatePosition(void) {};
Boundary_GetApproximatePosition ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember pBookmark==Null pointer. E_INVALIDARG is returned.
int Variation_1();
// @cmember pBookmark==NULL. DB_E_BADBOOKMARK is returned.
int Variation_2();
// @cmember pBookmark points to a invalid bookmark. DB_E_BADBOOKMARK is returned.
int Variation_3();
// @cmember pcRows==Null pointer. S_OK and no count of rows returned.
int Variation_4();
// @cmember pulPosition is NULL, S_OK
int Variation_5();
// @cmember cbBookmark = 0, pBookmark = NULL
int Variation_6();
};
// {{ TCW_TEST_CASE_MAP(Boundary_GetApproximatePosition_Cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class Boundary_GetApproximatePosition_Cmd : public Boundary_GetApproximatePosition {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Boundary_GetApproximatePosition_Cmd,Boundary_GetApproximatePosition);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Boundary_GetApproximatePosition_Cmd)
#define THE_CLASS Boundary_GetApproximatePosition_Cmd
BEG_TEST_CASE(Boundary_GetApproximatePosition_Cmd, Boundary_GetApproximatePosition, L"In context of commands")
TEST_VARIATION(1, L"pBookmark==Null pointer. E_INVALIDARG is returned.")
TEST_VARIATION(2, L"pBookmark==NULL. DB_E_BADBOOKMARK is returned.")
TEST_VARIATION(3, L"pBookmark points to a invalid bookmark. DB_E_BADBOOKMARK is returned.")
TEST_VARIATION(4, L"pcRows==Null pointer. S_OK and no count of rows returned.")
TEST_VARIATION(5, L"pulPosition is NULL, S_OK")
TEST_VARIATION(6, L"cbBookmark = 0, pBookmark = NULL")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Boundary_GetApproximatePosition_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class Boundary_GetApproximatePosition_OpenRowset : public Boundary_GetApproximatePosition {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Boundary_GetApproximatePosition_OpenRowset,Boundary_GetApproximatePosition);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Boundary_GetApproximatePosition_OpenRowset)
#define THE_CLASS Boundary_GetApproximatePosition_OpenRowset
BEG_TEST_CASE(Boundary_GetApproximatePosition_OpenRowset, Boundary_GetApproximatePosition, L"In context of IOpenRowset")
TEST_VARIATION(1, L"pBookmark==Null pointer. E_INVALIDARG is returned.")
TEST_VARIATION(2, L"pBookmark==NULL. DB_E_BADBOOKMARK is returned.")
TEST_VARIATION(3, L"pBookmark points to a invalid bookmark. DB_E_BADBOOKMARK is returned.")
TEST_VARIATION(4, L"pcRows==Null pointer. S_OK and no count of rows returned.")
TEST_VARIATION(5, L"pulPosition is NULL, S_OK")
TEST_VARIATION(6, L"cbBookmark = 0, pBookmark = NULL")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Boundary_GetApproximatePosition_SchemaR)
//--------------------------------------------------------------------
// @class In context of a Schema Rowset
//
class Boundary_GetApproximatePosition_SchemaR : public Boundary_GetApproximatePosition {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Boundary_GetApproximatePosition_SchemaR,Boundary_GetApproximatePosition);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Boundary_GetApproximatePosition_SchemaR)
#define THE_CLASS Boundary_GetApproximatePosition_SchemaR
BEG_TEST_CASE(Boundary_GetApproximatePosition_SchemaR, Boundary_GetApproximatePosition, L"In context of a Schema Rowset")
TEST_VARIATION(1, L"pBookmark==Null pointer. E_INVALIDARG is returned.")
TEST_VARIATION(2, L"pBookmark==NULL. DB_E_BADBOOKMARK is returned.")
TEST_VARIATION(3, L"pBookmark points to a invalid bookmark. DB_E_BADBOOKMARK is returned.")
TEST_VARIATION(4, L"pcRows==Null pointer. S_OK and no count of rows returned.")
TEST_VARIATION(5, L"pulPosition is NULL, S_OK")
TEST_VARIATION(6, L"cbBookmark = 0, pBookmark = NULL")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Boundary conditions for GetRowsAtRatio
//
class Boundary_GetRowsAtRatio : public TCIRowsetScroll {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
DBCOUNTITEM m_cRowsObtained;
HROW m_hRows;
HROW *m_prghRows;
public:
~Boundary_GetRowsAtRatio(void) {};
Boundary_GetRowsAtRatio ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember pcRowsObtained=Null pointer. E_INVALIDARG is returned.
int Variation_1();
// @cmember prghRows=NULL pointer. E_INVALIDARG is returned.
int Variation_2();
};
// {{ TCW_TEST_CASE_MAP(Boundary_GetRowsAtRatio_Cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class Boundary_GetRowsAtRatio_Cmd : public Boundary_GetRowsAtRatio {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Boundary_GetRowsAtRatio_Cmd,Boundary_GetRowsAtRatio);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Boundary_GetRowsAtRatio_Cmd)
#define THE_CLASS Boundary_GetRowsAtRatio_Cmd
BEG_TEST_CASE(Boundary_GetRowsAtRatio_Cmd, Boundary_GetRowsAtRatio, L"In context of commands")
TEST_VARIATION(1, L"pcRowsObtained=Null pointer. E_INVALIDARG is returned.")
TEST_VARIATION(2, L"prghRows=NULL pointer. E_INVALIDARG is returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Boundary_GetRowsAtRatio_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class Boundary_GetRowsAtRatio_OpenRowset : public Boundary_GetRowsAtRatio {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Boundary_GetRowsAtRatio_OpenRowset,Boundary_GetRowsAtRatio);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Boundary_GetRowsAtRatio_OpenRowset)
#define THE_CLASS Boundary_GetRowsAtRatio_OpenRowset
BEG_TEST_CASE(Boundary_GetRowsAtRatio_OpenRowset, Boundary_GetRowsAtRatio, L"In context of IOpenRowset")
TEST_VARIATION(1, L"pcRowsObtained=Null pointer. E_INVALIDARG is returned.")
TEST_VARIATION(2, L"prghRows=NULL pointer. E_INVALIDARG is returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Boundary_GetRowsAtRatio_SchemaR)
//--------------------------------------------------------------------
// @class In context of a Schema Rowset
//
class Boundary_GetRowsAtRatio_SchemaR : public Boundary_GetRowsAtRatio {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Boundary_GetRowsAtRatio_SchemaR,Boundary_GetRowsAtRatio);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Boundary_GetRowsAtRatio_SchemaR)
#define THE_CLASS Boundary_GetRowsAtRatio_SchemaR
BEG_TEST_CASE(Boundary_GetRowsAtRatio_SchemaR, Boundary_GetRowsAtRatio, L"In context of a Schema Rowset")
TEST_VARIATION(1, L"pcRowsObtained=Null pointer. E_INVALIDARG is returned.")
TEST_VARIATION(2, L"prghRows=NULL pointer. E_INVALIDARG is returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Valid and invalid parameters passed into methods
//
class Parameters : public TCIRowsetScroll {
private:
public:
~Parameters(void) {};
Parameters ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember GetApproximatePosition: cbBookmark=0, pBookmark=null pointer, S_OK is returned.
int Variation_1();
// @cmember GetApproximatePosition: cbBookmark=0, pulPosition=null pointer, S_OK is returned.
int Variation_2();
// @cmember GetRowsAtRatio: cRows=0, *prghRows not NULL on input. *prghRows not null on output. S_OK is returned.
int Variation_3();
// @cmember GetRowsAtRatio: cRows=0, *prghRows=NULL on input, *prghRows null on output. S_OK is returned.
int Variation_4();
// @cmember GetRowsAtRatio: ulNumerator=0, ulDenominator=4, cRows=5. S_OK and first 5 rows returned.
int Variation_5();
// @cmember GetRowsAtRatio: ulNumerator=5, ulDenominator=0, cRows=5. DB_E_BADRATIO is returned.
int Variation_6();
// @cmember GetRowsAtRatio: ulNumerator=0, ulDenominator=0, cRows=5. DB_E_BADRATIO is returned.
int Variation_7();
// @cmember GetRowsAtRatio: ulNumerator=ULONG_MAX, ulDenominator=1, cRows=1. DB_E_BADRATIO is returned.
int Variation_8();
// @cmember GetRowsAtRatio: ulNumerator=ULONG_MAX, ulDenominator=ULONG_MAX, cRows=1. S_OK and last row returned.
int Variation_9();
// @cmember GetRowsAtRatio: ulNumerator=ULONG_MAX-1, ulDenominator=ULONG_MAX, cRows=1. S_OK and last row returned.
int Variation_10();
// @cmember GetRowsAtRatio: ulNumerator=1, ulDenominator=1, cRows=1. DB_S_ENDOFROWSET
int Variation_11();
// @cmember GetRowsAtRatio: ulNumerator=LONG_MAX/2, ulDenominator=LONG_MAX+1, cRows=1. middle row.
int Variation_12();
};
// {{ TCW_TEST_CASE_MAP(Parameters_Cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class Parameters_Cmd : public Parameters {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Parameters_Cmd,Parameters);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Parameters_Cmd)
#define THE_CLASS Parameters_Cmd
BEG_TEST_CASE(Parameters_Cmd, Parameters, L"In context of commands")
TEST_VARIATION(1, L"GetApproximatePosition: cbBookmark=0, pBookmark=null pointer, S_OK is returned.")
TEST_VARIATION(2, L"GetApproximatePosition: cbBookmark=0, pulPosition=null pointer, S_OK is returned.")
TEST_VARIATION(3, L"GetRowsAtRatio: cRows=0, *prghRows not NULL on input. *prghRows not null on output. S_OK is returned.")
TEST_VARIATION(4, L"GetRowsAtRatio: cRows=0, *prghRows=NULL on input, *prghRows null on output. S_OK is returned.")
TEST_VARIATION(5, L"GetRowsAtRatio: ulNumerator=0, ulDenominator=4, cRows=5. S_OK and first 5 rows returned.")
TEST_VARIATION(6, L"GetRowsAtRatio: ulNumerator=5, ulDenominator=0, cRows=5. DB_E_BADRATIO is returned.")
TEST_VARIATION(7, L"GetRowsAtRatio: ulNumerator=0, ulDenominator=0, cRows=5. DB_E_BADRATIO is returned.")
TEST_VARIATION(8, L"GetRowsAtRatio: ulNumerator=ULONG_MAX, ulDenominator=1, cRows=1. DB_E_BADRATIO is returned.")
TEST_VARIATION(9, L"GetRowsAtRatio: ulNumerator=ULONG_MAX, ulDenominator=ULONG_MAX, cRows=1. S_OK and last row returned.")
TEST_VARIATION(10, L"GetRowsAtRatio: ulNumerator=ULONG_MAX-1, ulDenominator=ULONG_MAX, cRows=1. S_OK and last row returned.")
TEST_VARIATION(11, L"GetRowsAtRatio: ulNumerator=1, ulDenominator=1, cRows=1. DB_S_ENDOFROWSET.")
TEST_VARIATION(12, L"GetRowsAtRatio: ulNumerator=LONG_MAX/2, ulDenominator=LONG_MAX+1, cRows=1. middle row.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Parameters_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class Parameters_OpenRowset : public Parameters {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Parameters_OpenRowset,Parameters);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Parameters_OpenRowset)
#define THE_CLASS Parameters_OpenRowset
BEG_TEST_CASE(Parameters_OpenRowset, Parameters, L"In context of IOpenRowset")
TEST_VARIATION(1, L"GetApproximatePosition: cbBookmark=0, pBookmark=null pointer, S_OK is returned.")
TEST_VARIATION(2, L"GetApproximatePosition: cbBookmark=0, pulPosition=null pointer, S_OK is returned.")
TEST_VARIATION(3, L"GetRowsAtRatio: cRows=0, *prghRows not NULL on input. *prghRows not null on output. S_OK is returned.")
TEST_VARIATION(4, L"GetRowsAtRatio: cRows=0, *prghRows=NULL on input, *prghRows null on output. S_OK is returned.")
TEST_VARIATION(5, L"GetRowsAtRatio: ulNumerator=0, ulDenominator=4, cRows=5. S_OK and first 5 rows returned.")
TEST_VARIATION(6, L"GetRowsAtRatio: ulNumerator=5, ulDenominator=0, cRows=5. DB_E_BADRATIO is returned.")
TEST_VARIATION(7, L"GetRowsAtRatio: ulNumerator=0, ulDenominator=0, cRows=5. DB_E_BADRATIO is returned.")
TEST_VARIATION(8, L"GetRowsAtRatio: ulNumerator=ULONG_MAX, ulDenominator=1, cRows=1. DB_E_BADRATIO is returned.")
TEST_VARIATION(9, L"GetRowsAtRatio: ulNumerator=ULONG_MAX, ulDenominator=ULONG_MAX, cRows=1. S_OK and last row returned.")
TEST_VARIATION(10, L"GetRowsAtRatio: ulNumerator=ULONG_MAX-1, ulDenominator=ULONG_MAX, cRows=1. S_OK and last row returned.")
TEST_VARIATION(11, L"GetRowsAtRatio: ulNumerator=1, ulDenominator=1, cRows=1. DB_S_ENDOFROWSET.")
TEST_VARIATION(12, L"GetRowsAtRatio: ulNumerator=LONG_MAX/2, ulDenominator=LONG_MAX+1, cRows=1. middle row.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Parameters_SchemaR)
//--------------------------------------------------------------------
// @class In context of a Schema Rowset
//
class Parameters_SchemaR : public Parameters {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Parameters_SchemaR,Parameters);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Parameters_SchemaR)
#define THE_CLASS Parameters_SchemaR
BEG_TEST_CASE(Parameters_SchemaR, Parameters, L"In context of a Schema Rowset")
TEST_VARIATION(1, L"GetApproximatePosition: cbBookmark=0, pBookmark=null pointer, S_OK is returned.")
TEST_VARIATION(2, L"GetApproximatePosition: cbBookmark=0, pulPosition=null pointer, S_OK is returned.")
TEST_VARIATION(3, L"GetRowsAtRatio: cRows=0, *prghRows not NULL on input. *prghRows not null on output. S_OK is returned.")
TEST_VARIATION(4, L"GetRowsAtRatio: cRows=0, *prghRows=NULL on input, *prghRows null on output. S_OK is returned.")
TEST_VARIATION(5, L"GetRowsAtRatio: ulNumerator=0, ulDenominator=4, cRows=5. S_OK and first 5 rows returned.")
TEST_VARIATION(6, L"GetRowsAtRatio: ulNumerator=5, ulDenominator=0, cRows=5. DB_E_BADRATIO is returned.")
TEST_VARIATION(7, L"GetRowsAtRatio: ulNumerator=0, ulDenominator=0, cRows=5. DB_E_BADRATIO is returned.")
TEST_VARIATION(8, L"GetRowsAtRatio: ulNumerator=ULONG_MAX, ulDenominator=1, cRows=1. DB_E_BADRATIO is returned.")
TEST_VARIATION(9, L"GetRowsAtRatio: ulNumerator=ULONG_MAX, ulDenominator=ULONG_MAX, cRows=1. S_OK and last row returned.")
TEST_VARIATION(10, L"GetRowsAtRatio: ulNumerator=ULONG_MAX-1, ulDenominator=ULONG_MAX, cRows=1. S_OK and last row returned.")
TEST_VARIATION(11, L"GetRowsAtRatio: ulNumerator=1, ulDenominator=1, cRows=1. DB_S_ENDOFROWSET.")
TEST_VARIATION(12, L"GetRowsAtRatio: ulNumerator=LONG_MAX/2, ulDenominator=LONG_MAX+1, cRows=1. middle row.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Specific sequences of API calls where order is interesting.
//
class Sequence : public TCIRowsetScroll {
private:
public:
~Sequence(void) {};
Sequence ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember Open rowset, fetch all of the rows, *pBookmark=DBBMK_FIRST. S_OK is returned.
int Variation_1();
// @cmember ulNumerator=4, ulDenominator=5, and cRows=-3
int Variation_2();
};
// {{ TCW_TEST_CASE_MAP(Sequence_Cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class Sequence_Cmd : public Sequence {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Sequence_Cmd,Sequence);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Sequence_Cmd)
#define THE_CLASS Sequence_Cmd
BEG_TEST_CASE(Sequence_Cmd, Sequence, L"In context of commands")
TEST_VARIATION(1, L"Open rowset, fetch all of the rows, *pBookmark=DBBMK_FIRST. S_OK is returned.")
TEST_VARIATION(2, L"ulNumerator=4, ulDenominator=5, and cRows=-3")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Sequence_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class Sequence_OpenRowset : public Sequence {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Sequence_OpenRowset,Sequence);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Sequence_OpenRowset)
#define THE_CLASS Sequence_OpenRowset
BEG_TEST_CASE(Sequence_OpenRowset, Sequence, L"In context of IOpenRowset")
TEST_VARIATION(1, L"Open rowset, fetch all of the rows, *pBookmark=DBBMK_FIRST. S_OK is returned.")
TEST_VARIATION(2, L"ulNumerator=4, ulDenominator=5, and cRows=-3")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Sequence_SchemaR)
//--------------------------------------------------------------------
// @class In context of Schema Rowset
//
class Sequence_SchemaR : public Sequence {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Sequence_SchemaR,Sequence);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Sequence_SchemaR)
#define THE_CLASS Sequence_SchemaR
BEG_TEST_CASE(Sequence_SchemaR, Sequence, L"In context of Schema Rowset")
TEST_VARIATION(1, L"Open rowset, fetch all of the rows, *pBookmark=DBBMK_FIRST. S_OK is returned.")
TEST_VARIATION(2, L"ulNumerator=4, ulDenominator=5, and cRows=-3")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Make sure multiple methods can hold the same rows at the same time.
//
class Consistency : public TCIRowsetScroll {
private:
public:
~Consistency(void) {};
Consistency ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember Retrieve three row handles from GetRowsAt,GetRowsByBookmark, and GetRowsAtRatio.
int Variation_1();
// @cmember Verify IRowsetScroll inherits from IRowsetLocate
int Variation_2();
};
// {{ TCW_TEST_CASE_MAP(Consistency_Cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class Consistency_Cmd : public Consistency {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Consistency_Cmd,Consistency);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Consistency_Cmd)
#define THE_CLASS Consistency_Cmd
BEG_TEST_CASE(Consistency_Cmd, Consistency, L"In context of commands")
TEST_VARIATION(1, L"Retrieve three row handles from GetRowsAt,GetRowsByBookmark, and GetRowsAtRatio.")
TEST_VARIATION(2, L"Verify IRowsetScroll inherits from IRowsetLocate")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Consistency_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class Consistency_OpenRowset : public Consistency {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Consistency_OpenRowset,Consistency);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Consistency_OpenRowset)
#define THE_CLASS Consistency_OpenRowset
BEG_TEST_CASE(Consistency_OpenRowset, Consistency, L"In context of IOpenRowset")
TEST_VARIATION(1, L"Retrieve three row handles from GetRowsAt,GetRowsByBookmark, and GetRowsAtRatio.")
TEST_VARIATION(2, L"Verify IRowsetScroll inherits from IRowsetLocate")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Consistency_SchemaR)
//--------------------------------------------------------------------
// @class In context of a schema rowset
//
class Consistency_SchemaR : public Consistency {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Consistency_SchemaR,Consistency);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Consistency_SchemaR)
#define THE_CLASS Consistency_SchemaR
BEG_TEST_CASE(Consistency_SchemaR, Consistency, L"In context of a schema rowset")
TEST_VARIATION(1, L"Retrieve three row handles from GetRowsAt,GetRowsByBookmark, and GetRowsAtRatio.")
TEST_VARIATION(2, L"Verify IRowsetScroll inherits from IRowsetLocate")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Test related interface IRowset.
//
class Related_IRowset : public TCIRowsetScroll {
private:
public:
~Related_IRowset(void) {};
Related_IRowset ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember GetRowsAtRatio does not change the cursor location of the rowset. DB_E_ROWSNOTRELEASED is returned.
int Variation_1();
// @cmember Retrieve rows with GetNextRows and get same rows with GetRowsAtRatio. DB_E_ROWSNOTRELEASED is returned.
int Variation_2();
};
// {{ TCW_TEST_CASE_MAP(Related_IRowset_Cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class Related_IRowset_Cmd : public Related_IRowset {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Related_IRowset_Cmd,Related_IRowset);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Related_IRowset_Cmd)
#define THE_CLASS Related_IRowset_Cmd
BEG_TEST_CASE(Related_IRowset_Cmd, Related_IRowset, L"In context of commands")
TEST_VARIATION(1, L"GetRowsAtRatio does not change the cursor location of the rowset. DB_E_ROWSNOTRELEASED is returned.")
TEST_VARIATION(2, L"Retrieve rows with GetNextRows and get same rows with GetRowsAtRatio. DB_E_ROWSNOTRELEASED is returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Related_IRowset_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class Related_IRowset_OpenRowset : public Related_IRowset {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Related_IRowset_OpenRowset,Related_IRowset);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Related_IRowset_OpenRowset)
#define THE_CLASS Related_IRowset_OpenRowset
BEG_TEST_CASE(Related_IRowset_OpenRowset, Related_IRowset, L"In context of IOpenRowset")
TEST_VARIATION(1, L"GetRowsAtRatio does not change the cursor location of the rowset. DB_E_ROWSNOTRELEASED is returned.")
TEST_VARIATION(2, L"Retrieve rows with GetNextRows and get same rows with GetRowsAtRatio. DB_E_ROWSNOTRELEASED is returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Related_IRowset_SchemaR)
//--------------------------------------------------------------------
// @class In context of a schema Rowset
//
class Related_IRowset_SchemaR : public Related_IRowset {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Related_IRowset_SchemaR,Related_IRowset);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(Related_IRowset_SchemaR)
#define THE_CLASS Related_IRowset_SchemaR
BEG_TEST_CASE(Related_IRowset_SchemaR, Related_IRowset, L"In context of a schema Rowset")
TEST_VARIATION(1, L"GetRowsAtRatio does not change the cursor location of the rowset. DB_E_ROWSNOTRELEASED is returned.")
TEST_VARIATION(2, L"Retrieve rows with GetNextRows and get same rows with GetRowsAtRatio. DB_E_ROWSNOTRELEASED is returned.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Test GetRowsAtRatio via a Keyset Driven cursor.
//
class KeysetCursor : public TCIRowsetScroll {
private:
public:
~KeysetCursor(void) {};
KeysetCursor ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember ulNumerator=1, ulDenominator=20, cRows=-1
int Variation_1();
// @cmember ulNumerator=2, ulDenominator=20, cRows=-3
int Variation_2();
// @cmember ulNumerator=3, ulDenominator=20, cRows=(-3
int Variation_3();
// @cmember Get one row handle at a time.
int Variation_4();
};
// {{ TCW_TEST_CASE_MAP(KeysetCursor_Cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class KeysetCursor_Cmd : public KeysetCursor {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(KeysetCursor_Cmd,KeysetCursor);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(KeysetCursor_Cmd)
#define THE_CLASS KeysetCursor_Cmd
BEG_TEST_CASE(KeysetCursor_Cmd, KeysetCursor, L"In context of commands")
TEST_VARIATION(1, L"ulNumerator=1, ulDenominator=20, cRows=-1")
TEST_VARIATION(2, L"ulNumerator=2, ulDenominator=20, cRows=-3")
TEST_VARIATION(3, L"ulNumerator=3, ulDenominator=20, cRows=(-3")
TEST_VARIATION(4, L"Get one row handle at a time.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(KeysetCursor_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class KeysetCursor_OpenRowset : public KeysetCursor {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(KeysetCursor_OpenRowset,KeysetCursor);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(KeysetCursor_OpenRowset)
#define THE_CLASS KeysetCursor_OpenRowset
BEG_TEST_CASE(KeysetCursor_OpenRowset, KeysetCursor, L"In context of IOpenRowset")
TEST_VARIATION(1, L"ulNumerator=1, ulDenominator=20, cRows=-1")
TEST_VARIATION(2, L"ulNumerator=2, ulDenominator=20, cRows=-3")
TEST_VARIATION(3, L"ulNumerator=3, ulDenominator=20, cRows=(-3")
TEST_VARIATION(4, L"Get one row handle at a time.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(KeysetCursor_SchemaR)
//--------------------------------------------------------------------
// @class In context of a Schema Rowset
//
class KeysetCursor_SchemaR : public KeysetCursor {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(KeysetCursor_SchemaR,KeysetCursor);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(KeysetCursor_SchemaR)
#define THE_CLASS KeysetCursor_SchemaR
BEG_TEST_CASE(KeysetCursor_SchemaR, KeysetCursor, L"In context of a Schema Rowset")
TEST_VARIATION(1, L"ulNumerator=1, ulDenominator=20, cRows=-1")
TEST_VARIATION(2, L"ulNumerator=2, ulDenominator=20, cRows=-3")
TEST_VARIATION(3, L"ulNumerator=3, ulDenominator=20, cRows=(-3")
TEST_VARIATION(4, L"Get one row handle at a time.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
//--------------------------------------------------------------------
// @class Test GetRowsAtRatio via a Dynamic cursor.
//
class DynamicCursor : public TCIRowsetScroll {
private:
public:
~DynamicCursor(void) {};
DynamicCursor ( wchar_t* pwszTestCaseName) : TCIRowsetScroll(pwszTestCaseName) { };
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// @cmember ulNumerator=1, ulDenominator=20, cRows=(-1
int Variation_1();
// @cmember ulNumerator=2, ulDenominator=20, cRows=(-3
int Variation_2();
// @cmember ulNumerator=3, ulDenominator=20, cRows=(-3
int Variation_3();
// @cmember Get one row handle at a time.
int Variation_4();
};
// {{ TCW_TEST_CASE_MAP(DynamicCursor_Cmd)
//--------------------------------------------------------------------
// @class In context of commands
//
class DynamicCursor_Cmd : public DynamicCursor {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(DynamicCursor_Cmd,DynamicCursor);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(DynamicCursor_Cmd)
#define THE_CLASS DynamicCursor_Cmd
BEG_TEST_CASE(DynamicCursor_Cmd, DynamicCursor, L"In context of commands")
TEST_VARIATION(1, L"ulNumerator=1, ulDenominator=20, cRows=(-1")
TEST_VARIATION(2, L"ulNumerator=2, ulDenominator=20, cRows=(-3")
TEST_VARIATION(3, L"ulNumerator=3, ulDenominator=20, cRows=(-3")
TEST_VARIATION(4, L"Get one row handle at a time.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(DynamicCursor_OpenRowset)
//--------------------------------------------------------------------
// @class In context of IOpenRowset
//
class DynamicCursor_OpenRowset : public DynamicCursor {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(DynamicCursor_OpenRowset,DynamicCursor);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(DynamicCursor_OpenRowset)
#define THE_CLASS DynamicCursor_OpenRowset
BEG_TEST_CASE(DynamicCursor_OpenRowset, DynamicCursor, L"In context of IOpenRowset")
TEST_VARIATION(1, L"ulNumerator=1, ulDenominator=20, cRows=(-1")
TEST_VARIATION(2, L"ulNumerator=2, ulDenominator=20, cRows=(-3")
TEST_VARIATION(3, L"ulNumerator=3, ulDenominator=20, cRows=(-3")
TEST_VARIATION(4, L"Get one row handle at a time.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(DynamicCursor_SchemaR)
//--------------------------------------------------------------------
// @class In context of a Schema Rowset
//
class DynamicCursor_SchemaR : public DynamicCursor {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(DynamicCursor_SchemaR,DynamicCursor);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
};
// {{ TCW_TESTCASE(DynamicCursor_SchemaR)
#define THE_CLASS DynamicCursor_SchemaR
BEG_TEST_CASE(DynamicCursor_SchemaR, DynamicCursor, L"In context of a Schema Rowset")
TEST_VARIATION(1, L"ulNumerator=1, ulDenominator=20, cRows=(-1")
TEST_VARIATION(2, L"ulNumerator=2, ulDenominator=20, cRows=(-3")
TEST_VARIATION(3, L"ulNumerator=3, ulDenominator=20, cRows=(-3")
TEST_VARIATION(4, L"Get one row handle at a time.")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// {{ TCW_TEST_CASE_MAP(Zombie)
//--------------------------------------------------------------------
// @class Test zombie states
//
class Zombie : public CTransaction {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
DBPROPSET m_DBPropSet;
ULONG m_cProperty;
DBPROP m_rgProperty[2];
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Zombie,CTransaction);
// }}
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Commit with fRetaining=TRUE.
int Variation_1();
// @cmember Commit with fRetaining=FALSE.
int Variation_2();
// @cmember Abort with fRetaining=TRUE.
int Variation_3();
// @cmember Abort with fRetaining=FALSE
int Variation_4();
// }}
};
// {{ TCW_TESTCASE(Zombie)
#define THE_CLASS Zombie
BEG_TEST_CASE(Zombie, CTransaction, L"Test zombie states")
TEST_VARIATION(1, L"Commit with fRetaining=TRUE.")
TEST_VARIATION(2, L"Commit with fRetaining=FALSE.")
TEST_VARIATION(3, L"Abort with fRetaining=TRUE.")
TEST_VARIATION(4, L"Abort with fRetaining=FALSE")
END_TEST_CASE()
#undef THE_CLASS
// }}
// }}
// }} END_DECLARE_TEST_CASES()
// {{ TCW_TESTMODULE(ThisModule)
TEST_MODULE(48, ThisModule, gwszModuleDescrip)
TEST_CASE(1, Bookmarks_cmd)
TEST_CASE(2, Bookmarks_SchemaR)
TEST_CASE(3, Bookmarks_OpenRowset)
TEST_CASE(4, CanHoldRows_cmd)
TEST_CASE(5, CanHoldRows_SchemaR)
TEST_CASE(6, CanHoldRows_OpenRowset)
TEST_CASE(7, CanFetchBackwards_Cmd)
TEST_CASE(8, CanFetchBackwards_SchemaR)
TEST_CASE(9, CanFetchBackwards_OpenRowset)
TEST_CASE(10, CanFetchBackwards_CanHoldRows_Cmd)
TEST_CASE(11, CanFetchBackwards_CanHoldRows_SchemaR)
TEST_CASE(12, CanFetchBackwards_CanHoldRows_OpenRowset)
TEST_CASE(13, MaxOpenRows_Cmd)
TEST_CASE(14, MaxOpenRows_SchemaR)
TEST_CASE(15, MaxOpenRows_OpenRowset)
TEST_CASE(16, DeleteRows_cmd)
TEST_CASE(17, DeleteRows_OpenRowset)
TEST_CASE(18, RemoveDeleted_Cmd)
TEST_CASE(19, RemoveDeleted_OpenRowset)
TEST_CASE(20, Rowset_SingleRow_Cmd)
TEST_CASE(21, Rowset_SingleRow_OpenRowset)
TEST_CASE(22, Rowset_Empty_Cmd)
TEST_CASE(23, Rowset_Empty_OpenRowset)
TEST_CASE(24, Boundary_GetApproximatePosition_Cmd)
TEST_CASE(25, Boundary_GetApproximatePosition_OpenRowset)
TEST_CASE(26, Boundary_GetApproximatePosition_SchemaR)
TEST_CASE(27, Boundary_GetRowsAtRatio_Cmd)
TEST_CASE(28, Boundary_GetRowsAtRatio_OpenRowset)
TEST_CASE(29, Boundary_GetRowsAtRatio_SchemaR)
TEST_CASE(30, Parameters_Cmd)
TEST_CASE(31, Parameters_OpenRowset)
TEST_CASE(32, Parameters_SchemaR)
TEST_CASE(33, Sequence_Cmd)
TEST_CASE(34, Sequence_OpenRowset)
TEST_CASE(35, Sequence_SchemaR)
TEST_CASE(36, Consistency_Cmd)
TEST_CASE(37, Consistency_OpenRowset)
TEST_CASE(38, Consistency_SchemaR)
TEST_CASE(39, Related_IRowset_Cmd)
TEST_CASE(40, Related_IRowset_OpenRowset)
TEST_CASE(41, Related_IRowset_SchemaR)
TEST_CASE(42, KeysetCursor_Cmd)
TEST_CASE(43, KeysetCursor_OpenRowset)
TEST_CASE(44, KeysetCursor_SchemaR)
TEST_CASE(45, DynamicCursor_Cmd)
TEST_CASE(46, DynamicCursor_OpenRowset)
TEST_CASE(47, DynamicCursor_SchemaR)
TEST_CASE(48, Zombie)
END_TEST_MODULE()
// }}
//*-----------------------------------------------------------------------
//| Test Case: Bookmarks - test DBPROP_BOOKMARKS
//| Created: 08/28/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Bookmarks::Init()
{
if(!TCIRowsetScroll::Init())
return FALSE;
// Create a rowset and accessor. DBPROP_BOOKMARKS should be supported if
// IRowsetScroll is requested on the rowset
if(!GetRowsetAndAccessor(g_pCTable, SELECT_COLLISTFROMTBL, IID_IRowsetScroll))
return FALSE;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_FIRST. S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Bookmarks::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,1,pBookmark,
&pulPosition,&pcRows),S_OK))
return TEST_FAIL;
if(!COMPARE(VerifyApproximatePosition(pulPosition, pcRows, 1), TRUE))
return TEST_FAIL;
return TEST_PASS;
}
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_LAST. S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Bookmarks::Variation_2()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,1,pBookmark,
&pulPosition,&pcRows),S_OK))
return TEST_FAIL;
if(!COMPARE(VerifyApproximatePosition(pulPosition, pcRows, m_ulRowCount), TRUE))
return TEST_FAIL;
return TEST_PASS;
}
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_INVALID. DB_E_BADBOOKMARK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Bookmarks::Variation_3()
{
DBBOOKMARK DBBookmark=DBBMK_INVALID;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM pulPosition=3;
DBCOUNTITEM pcRows=3;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,1,pBookmark,
&pulPosition,&pcRows),DB_E_BADBOOKMARK))
{
return TEST_FAIL;
}
// pulPosition and pcRows should be untouched.
if(!COMPARE(3, pulPosition))
return TEST_FAIL;
if(!COMPARE(3, pcRows))
return TEST_FAIL;
return TEST_PASS;
}
//*-----------------------------------------------------------------------
// @mfunc Get one row handle at a time (cRows==1).
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Bookmarks::Variation_4()
{
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
DBCOUNTITEM cRowCount;
ULONG_PTR cbBookmark;
BYTE * pBookmark=NULL;
BOOL fTestPass=FALSE;
// Get one row handle at a time, from the first row
for(cRowCount=1; cRowCount<=m_ulRowCount; cRowCount++)
{
// Get the bookmark for the first row
if(!GetBookmark(cRowCount, &cbBookmark, &pBookmark))
goto END;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,cbBookmark,pBookmark,
&pulPosition,&pcRows),S_OK))
goto END;
if(!VerifyApproximatePosition(pulPosition, pcRows, cRowCount))
goto END;
// Release the bookmark
PROVIDER_FREE(pBookmark);
pBookmark=NULL;
}
fTestPass=TRUE;
END:
// Release the bookmark
if(pBookmark)
PROVIDER_FREE(pBookmark);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Bookmarks::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(Bookmarks_cmd)
//*-----------------------------------------------------------------------
//| Test Case: Bookmarks_cmd - test DBPROP_BOOKMARKS
//| Created: 08/28/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Bookmarks_cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
return (Bookmarks::Init());
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Bookmarks_cmd::Terminate()
{
return(Bookmarks::Terminate());
}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Bookmarks_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: Bookmarks_SchemaR - Using Schema Rowsets
//| Created: 08/28/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Bookmarks_SchemaR::Init()
{
if (!SetRowsetType(USESCHEMAR))
return TEST_SKIPPED;
return (Bookmarks::Init());
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Bookmarks_SchemaR::Terminate()
{
return(Bookmarks::Terminate());
}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Bookmarks_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: Bookmarks_OpenRowset - In Context of IOpenRowset
//| Created: 08/28/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Bookmarks_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
return (Bookmarks::Init());
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Bookmarks_OpenRowset::Terminate()
{
return(Bookmarks::Terminate());
}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: CanHoldRows - Test DBPROP_CANHOLDROWS property
//| Created: 08/29/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanHoldRows::Init()
{
DBPROPID guidProperty=DBPROP_CANHOLDROWS;
if(!TCIRowsetScroll::Init())
return FALSE;
// Create a rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_COLLISTGROUPBY, IID_IRowsetScroll,
1,&guidProperty))
return FALSE;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc Get first two rows, get next three rows, pass bookmark of second row. S_OK returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanHoldRows::Variation_1()
{
ULONG_PTR cbBookmark=0;
BYTE *pBookmark=NULL;
HROW *pHRow=NULL;
HROW *pHRow2=NULL;
DBCOUNTITEM cCount=0;
DBCOUNTITEM cCount2=0;
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
BOOL fTestPass=FALSE;
// Fetch the first two rows
if(!CHECK(m_pIRowset->GetNextRows(NULL, // Chapter handle.
0, // Count of rows to skip before reading.
2, // The number of rows to fetch.
&cCount, // Actual number of fetched rows.
&pHRow), // Array of handles of retrieved rows.
S_OK))
goto END;
if(!COMPARE(2, cCount))
goto END;
// Get a bookmark for the second row
if(!GetBookmark(2, &cbBookmark, &pBookmark))
goto END;
// Fetch the next three rows
if(!CHECK(m_pIRowset->GetNextRows(NULL, // Chapter handle.
0, // Count of rows to skip before reading.
3, // The number of rows to fetch.
&cCount2, // Actual number of fetched rows.
&pHRow2), // Array of handles of retrieved rows.
S_OK))
goto END;
if(!COMPARE(3, cCount2))
goto END;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,cbBookmark,pBookmark,
&pulPosition,&pcRows),S_OK))
goto END;
if(!VerifyApproximatePosition(pulPosition, pcRows, 2))
goto END;
fTestPass = TEST_PASS;
END:
// Release the bookmarks
PROVIDER_FREE(pBookmark);
// Release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cCount, pHRow, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(pHRow2)
{
CHECK(m_pIRowset->ReleaseRows(cCount2, pHRow2, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(pHRow2);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc Get first two rows, *pBookmark=second row bookmark. S_OK returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanHoldRows::Variation_2()
{
ULONG_PTR cbBookmark=0;
BYTE *pBookmark=NULL;
HROW *pHRow=NULL;
HROW *pHRow2=NULL;
DBCOUNTITEM cCount=0;
DBCOUNTITEM cCount2=0;
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
BOOL fTestPass=FALSE;
//Start from the begining
if(!CHECK(m_pIRowset->RestartPosition(NULL), S_OK))
goto END;
// Get a bookmark for the second row
if(!GetBookmark(2, &cbBookmark, &pBookmark))
goto END;
// Fetch the first two rows
if(!CHECK(m_pIRowset->GetNextRows(NULL, // Chapter handle.
0, // Count of rows to skip before reading.
2, // The number of rows to fetch.
&cCount, // Actual number of fetched rows.
&pHRow), // Array of handles of retrieved rows.
S_OK))
goto END;
if(!COMPARE(2, cCount))
goto END;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,cbBookmark,pBookmark,
&pulPosition,&pcRows),S_OK))
goto END;
if(!VerifyApproximatePosition(pulPosition, pcRows, 2))
goto END;
// Fetch the next row to verify cursor position
if(!CHECK(m_pIRowset->GetNextRows(NULL, // Chapter handle.
0, // Count of rows to skip before reading.
1, // The number of rows to fetch.
&cCount2, // Actual number of fetched rows.
&pHRow2), // Array of handles of retrieved rows.
S_OK))
goto END;
if(!COMPARE(VerifyRowPosition(*pHRow2, 3, g_pCTable, EXACT),TRUE))
goto END;
fTestPass=TRUE;
END:
// Release the bookmarks
PROVIDER_FREE(pBookmark);
// Release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1, pHRow, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(pHRow2)
{
CHECK(m_pIRowset->ReleaseRows(1, pHRow2, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(pHRow2);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc Get first 5 rows, get last 5 rows, ulNumerator=1, ulDenominator=2, S_OK and 10th row returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanHoldRows::Variation_3()
{
DBCOUNTITEM cCount=0;
HROW *prghRows=NULL;
DBCOUNTITEM cCount2=0;
HROW *prghRows2=NULL;
HROW *prghRows3=NULL;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
//Start from the begining
if(!CHECK(m_pIRowset->RestartPosition(NULL), S_OK))
goto END;
// Fetch first few rows
if(!CHECK(m_pIRowset->GetNextRows(NULL, // Chapter handle.
0, // Count of rows to skip before reading.
2, // The number of rows to fetch.
&cCount, // Actual number of fetched rows.
&prghRows), // Array of handles of retrieved rows.
S_OK))
goto END;
if(!COMPARE(2, cCount))
goto END;
// Fetch last five rows
if(!CHECK(m_pIRowset->GetNextRows(NULL, // Chapter handle.
m_ulRowCount-4, // Count of rows to skip before reading.
2, // The number of rows to fetch.
&cCount2, // Actual number of fetched rows.
&prghRows2), // Array of handles of retrieved rows.
S_OK))
goto END;
if(!COMPARE(2, cCount))
goto END;
// ulNumerator=1, ulDenominator=2, cRows=1.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,2,
1,&cRowsObtained,&prghRows3),S_OK))
goto END;
// One row should have been returned
if(!COMPARE(cRowsObtained, 1))
goto END;
if(!VerifyRowPosition(*prghRows3, GetRatio(m_ulRowCount,1,2)+1, g_pCTable, INEXACT))
goto END;
fTestPass=TRUE;
END:
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(2,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if(prghRows2)
{
CHECK(m_pIRowset->ReleaseRows(2,prghRows2,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows2);
}
if(prghRows3)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows3,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows3);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanHoldRows::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(CanHoldRows_cmd)
//*-----------------------------------------------------------------------
//| Test Case: CanHoldRows_cmd - In context of commands
//| Created: 08/29/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanHoldRows_cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (CanHoldRows::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanHoldRows_cmd::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(CanHoldRows::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(CanHoldRows_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: CanHoldRows_SchemaR - In context of Schema rowsets
//| Created: 08/29/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanHoldRows_SchemaR::Init()
{
BOOL fPass;
if (!SetRowsetType(USESCHEMAR))
return TEST_SKIPPED;
fPass = CanHoldRows::Init();
if(TEST_PASS == fPass)
{
if ( m_ulRowCount < 5 )
return TEST_SKIPPED;
else
return TEST_PASS;
}
else
return fPass;
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanHoldRows_SchemaR::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(CanHoldRows::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(CanHoldRows_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: CanHoldRows_OpenRowset - In context of IOpenRowset
//| Created: 08/29/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanHoldRows_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return CanHoldRows::Init();
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanHoldRows_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(CanHoldRows::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: CanFetchBackwards - Test DBPROP_CANFETCHBACKWARDS
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards::Init()
{
DBPROPID guidProperty=DBPROP_CANFETCHBACKWARDS;
if(!TCIRowsetScroll::Init())
return FALSE;
// Create a rowset and an accessor.
// DBPROP_CANFETCHBACKWARDS is requested.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_COLLISTFROMTBL, IID_IRowsetScroll,
1,&guidProperty))
return TEST_SKIPPED;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=0, ulDenominator=last row, cRows=(-2). DB_S_ENDOFROWSET.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanFetchBackwards::Variation_1()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=0, ulDenominator=last row, cRows=(-2).
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,m_ulRowCount,
-2,&cRowsObtained,&prghRows),DB_S_ENDOFROWSET))
goto END;
if(!COMPARE(cRowsObtained, 0))
goto END;
if( !COMPARE(prghRows,NULL) )
goto END;
fTestPass=TRUE;
END:
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=1, ulDenominator=4, cRows=(-6). DB_S_ENDOFROWSET and five row handles returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanFetchBackwards::Variation_2()
{
DBCOUNTITEM cRowsObtained=0;
HROW *rghRows;
BOOL fTestPass=FALSE;
DBCOUNTITEM cRowCount;
HRESULT hr;
rghRows = (HROW *)PROVIDER_ALLOC(sizeof(HROW)*(m_ulRowCount/4+2));
// ulNumerator=1, ulDenominator=4, cRows=(-6).
hr = m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,4,
-(LONG(m_ulRowCount/4)+2),&cRowsObtained,&rghRows);
if (!(COMPARE(SUCCEEDED(hr), TRUE)) )
goto END;
if ( hr == DB_S_ENDOFROWSET )
{
if (!COMPARE(cRowsObtained<(m_ulRowCount/4)+2, TRUE))
goto END;
}
else
{
odtLog << L"Warning, ideally. DB_S_ENDOFROWSET\n";
if(!COMPARE(cRowsObtained, (m_ulRowCount/4)+2))
fTestPass = FALSE;
else
fTestPass = TRUE;
goto END;
}
// Make sure the row handles are returned in the traversal order
for(cRowCount=0; cRowCount<cRowsObtained; cRowCount++)
{
if(!VerifyRowPosition(rghRows[cRowCount],cRowsObtained-cRowCount,g_pCTable,INEXACT))
goto END;
}
fTestPass=TRUE;
END:
// Release the row handles
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(rghRows);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=3, ulDenominator=5, cRows=(-2). S_OK returned and 12th and 11th row handles returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanFetchBackwards::Variation_3()
{
DBCOUNTITEM cRowsObtained=0,iCount;
HROW rghRows[5];
HROW *prghRows=rghRows;
BOOL fTestPass=FALSE;
HRESULT hr = E_FAIL;
// ulNumerator=3, ulDenominator=5, cRows=(-2).
hr = m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,3,5,
-2,&cRowsObtained,&prghRows);
if (!(COMPARE(SUCCEEDED(hr), TRUE)) )
goto END;
if ( hr == S_OK )
{
if(!COMPARE(cRowsObtained, 2))
goto END;
}
else
{
if(!COMPARE(cRowsObtained<2, TRUE))
goto END;
}
for ( iCount = 0; iCount < cRowsObtained; iCount++ )
{
VerifyRowPosition(prghRows[iCount],GetRatio(m_ulRowCount,3,5) + 1 - iCount,g_pCTable,INEXACT);
}
fTestPass=TRUE;
END:
// Release the row handles
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc ulNumerator=lastrow-1,ulDenominator=last row, cRows=2, expect DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanFetchBackwards::Variation_4()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
HRESULT hr = S_OK;
// ulNumerator=lastrow-1, ulDenominator=last row, cRows=(2).
hr = m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,m_ulRowCount-1,m_ulRowCount,
2,&cRowsObtained,&prghRows);
if (!(COMPARE(SUCCEEDED(hr), TRUE)) )
goto END;
if ( hr == DB_S_ENDOFROWSET )
{
if (!COMPARE(cRowsObtained, 1))
goto END;
}
else
{
odtLog << L"Warning, ideally. DB_S_ENDOFROWSET and 1 row should have been returned.\n";
fTestPass = TRUE;
goto END;
}
if( !COMPARE(VerifyRowPosition(*prghRows, m_ulRowCount, g_pCTable, INEXACT), TRUE) )
goto END;
fTestPass=TRUE;
END:
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(CanFetchBackwards_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: CanFetchBackwards_Cmd - In context of commands
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (CanFetchBackwards::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_Cmd::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(CanFetchBackwards::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(CanFetchBackwards_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: CanFetchBackwards_SchemaR - In context of a Schema Rowset
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_SchemaR::Init()
{
if (!SetRowsetType(USESCHEMAR))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (CanFetchBackwards::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_SchemaR::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(CanFetchBackwards::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(CanFetchBackwards_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: CanFetchBackwards_OpenRowset - In context of IOpenRowset
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (CanFetchBackwards::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(CanFetchBackwards::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: CanFetchBackwards_CanHoldRows - Test DBPROP_CANFETCHBACKWARDS + DBPROP_CANHOLDROWS
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_CanHoldRows::Init()
{
DBPROPID guidProperty[2];
ULONG cPrptSet=0;
if(!TCIRowsetScroll::Init())
return FALSE;
guidProperty[cPrptSet++]=DBPROP_CANFETCHBACKWARDS;
guidProperty[cPrptSet++]=DBPROP_CANHOLDROWS;
// Create a rowset and an accessor.
// DBPROP_CANFETCHBACKWARDS and DBPROP_CANHOLDROWS are requested.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_REVCOLLIST, IID_IRowsetScroll,
cPrptSet,guidProperty))
return TEST_SKIPPED;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=1, ulDenominator=last row, cRows=(-1). S_OK and one row handle returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanFetchBackwards_CanHoldRows::Variation_1()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=1, ulDenominator=last row, cRows=(-1).
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,m_ulRowCount,
-1,&cRowsObtained,&prghRows),S_OK))
goto END;
if(!COMPARE(cRowsObtained, 1))
goto END;
if( !COMPARE(VerifyRowPosition(*prghRows, 2, g_pCTable, INEXACT), TRUE) )
goto END;
fTestPass=TRUE;
END:
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=3, ulDenominator=last row, cRows=(-3). Do not release rows, try another combination. S_OK returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanFetchBackwards_CanHoldRows::Variation_2()
{
DBCOUNTITEM cRowsObtained=0;
DBCOUNTITEM cRowsObtained2=0;
HROW rghRows[5];
HROW *prghRows=rghRows;
HROW *prghRows2=NULL;
BOOL fTestPass=FALSE;
DBCOUNTITEM cRowCount;
HRESULT hr = E_FAIL;
// ulNumerator=2, ulDenominator=last row, cRows=(-3).
hr = m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,3,m_ulRowCount,
-3,&cRowsObtained,&prghRows);
if ( !COMPARE(hr==S_OK || hr==DB_S_ENDOFROWSET, TRUE) )
goto END;
// The 3rd, 2nd, and 1st row handles should be retrieved
if ( hr == S_OK )
{
if( !COMPARE(cRowsObtained, 3))
goto END;
}
else
{
if ( !COMPARE(cRowsObtained<3, TRUE) )
goto END;
}
// Make sure the row handles are returned in the traversal order
for(cRowCount=0; cRowCount<cRowsObtained; cRowCount++)
{
if( !COMPARE(VerifyRowPosition(prghRows[cRowCount],cRowsObtained-cRowCount+1,g_pCTable, INEXACT), TRUE) )
goto END;
}
// ulNumerator=1, ulDenominator=4, cRows=(-1).
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,4,
-1,&cRowsObtained2,&prghRows2),S_OK))
goto END;
if(!COMPARE(cRowsObtained2, 1))
goto END;
if( !COMPARE(VerifyRowPosition(*prghRows2, m_ulRowCount/4+1, g_pCTable, INEXACT), TRUE) )
goto END;
fTestPass=TRUE;
END:
if(prghRows2)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained2,prghRows2,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows2);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_CanHoldRows::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(CanFetchBackwards_CanHoldRows_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: CanFetchBackwards_CanHoldRows_Cmd - In context of Commands
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_CanHoldRows_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (CanFetchBackwards_CanHoldRows::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_CanHoldRows_Cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(CanFetchBackwards_CanHoldRows::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(CanFetchBackwards_CanHoldRows_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: CanFetchBackwards_CanHoldRows_SchemaR - In context of a Schema Rowset
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_CanHoldRows_SchemaR::Init()
{
BOOL fPass;
if (!SetRowsetType(USESCHEMAR))
return TEST_SKIPPED;
fPass = CanFetchBackwards_CanHoldRows::Init();
if(TEST_PASS == fPass)
{
if ( m_ulRowCount < 5 )
return TEST_SKIPPED;
else
return TEST_PASS;
}
else
return fPass;
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_CanHoldRows_SchemaR::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(CanFetchBackwards_CanHoldRows::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(CanFetchBackwards_CanHoldRows_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: CanFetchBackwards_CanHoldRows_OpenRowset - In context of IOpenRowset
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_CanHoldRows_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (CanFetchBackwards_CanHoldRows::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanFetchBackwards_CanHoldRows_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(CanFetchBackwards_CanHoldRows::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: MaxOpenRows - Test DBPROP_MAXOPENROWS
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL MaxOpenRows::Init()
{
if(!TCIRowsetScroll::Init())
return FALSE;
//Create a rowset and an accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_REVCOLLIST,
IID_IRowsetScroll))
return FALSE;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc MAXOPENROWS=3, ulNumerator=9, ulDenominator=10, and cRows=4. DB_S_ENDOFROWSET is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int MaxOpenRows::Variation_1()
{
HROW *prghRows=NULL;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
DBPROPID guidProperty=DBPROP_MAXOPENROWS;
ULONG cMaxOpenRowsCount=0;
//remember g_cMaxOpenRowsCount
ASSERT(g_cMaxOpenRowsCount <= UINT_MAX );
cMaxOpenRowsCount=(ULONG)g_cMaxOpenRowsCount;
if(g_rgDBPrpt[IDX_MaxOpenRows].fSettable)
{
//Re-open a rowset with DBPROP_MAXOPENROWSET set to 3
ReleaseRowsetAndAccessor();
g_cMaxOpenRowsCount = 3;
if(!GetRowsetAndAccessor(g_pCTable, SELECT_REVCOLLIST,
IID_IRowsetScroll,1,&guidProperty))
goto END;
}
//If DBPROP_MAXOPENROWS=0 then there is no limit on the number of rows that can be active.
if(g_cMaxOpenRowsCount == 0)
{
//ulNumerator=9, ulDenominator=10
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,9,10,
m_ulRowCount+1,&cRowsObtained,&prghRows), DB_S_ENDOFROWSET))
goto END;
if( !COMPARE(cRowsObtained < m_ulRowCount, TRUE) )
goto END;
if( !COMPARE(VerifyRowPosition(*prghRows, GetRatio(m_ulRowCount,9,10)+1, g_pCTable, INEXACT), TRUE) )
goto END;
}
else if(g_cMaxOpenRowsCount < LONG(m_ulRowCount))
{
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,10,
m_ulRowCount+1,&cRowsObtained,&prghRows), DB_S_ROWLIMITEXCEEDED))
goto END;
//only g_cMaxOpenRowsCount rows could be fetched
if(!COMPARE(cRowsObtained, (ULONG)g_cMaxOpenRowsCount))
goto END;
if( !COMPARE(VerifyRowPosition(*prghRows, 1, g_pCTable, EXACT), TRUE) )
goto END;
}
else
{
//ulNumerator=9, ulDenominator=10
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,9,10,
m_ulRowCount+1,&cRowsObtained,&prghRows), DB_S_ENDOFROWSET))
goto END;
if( !COMPARE(cRowsObtained < m_ulRowCount, TRUE) )
goto END;
if( !COMPARE(VerifyRowPosition(*prghRows, (9*m_ulRowCount)/10+1, g_pCTable, INEXACT), TRUE) )
goto END;
}
fTestPass=TRUE;
END:
//Release the row handles
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows, NULL, NULL, NULL), S_OK);
PROVIDER_FREE(prghRows);
}
//Restore the max open rows
g_cMaxOpenRowsCount=cMaxOpenRowsCount;
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc MAXOPENROWS=2, ulNumerator=1, ulDenominator=3, and cRows=3. DB_S_ROWLIMITEXCEEDED is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int MaxOpenRows::Variation_2()
{
HROW *prghRows=NULL;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
DBPROPID guidProperty=DBPROP_MAXOPENROWS;
DBCOUNTITEM cMaxOpenRowsCount=0;
//remember g_cMaxOpenRowsCount
cMaxOpenRowsCount=g_cMaxOpenRowsCount;
//Re-open a rowset with DBPROP_MAXOPENROWS set
if(g_rgDBPrpt[IDX_MaxOpenRows].fSettable)
{
ReleaseRowsetAndAccessor();
g_cMaxOpenRowsCount = 2;
//Open rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_REVCOLLIST, IID_IRowsetScroll,
1,&guidProperty))
goto END;
}
if(g_cMaxOpenRowsCount==0)
{
//ulNumerator=1, ulDenominator=3, cRows=cRowset/3.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,3,
m_ulRowCount/3,&cRowsObtained,&prghRows), S_OK))
goto END;
if(!COMPARE(cRowsObtained, (ULONG)(m_ulRowCount/3)))
goto END;
}
//ulNumerator=1, ulDenominator=3, cRows=3.
else if( g_cMaxOpenRowsCount < 3 )
{
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,3,
3,&cRowsObtained,&prghRows), DB_S_ROWLIMITEXCEEDED))
goto END;
//Only g_cMaxOpenRowsCount rows can be fetched.
if(!COMPARE(cRowsObtained, (ULONG)g_cMaxOpenRowsCount))
goto END;
}
else
{
//ulNumerator=1, ulDenominator=3, cRows=3.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,3,
3,&cRowsObtained,&prghRows), DB_S_ENDOFROWSET))
if(!COMPARE(cRowsObtained, 3))
goto END;
}
if( !COMPARE(VerifyRowPosition(*prghRows, GetRatio(m_ulRowCount,1,3)+1, g_pCTable, INEXACT), TRUE) )
goto END;
fTestPass=TRUE;
END:
//Release the row handles
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows, NULL, NULL, NULL), S_OK);
PROVIDER_FREE(prghRows);
}
//Restore the max open rows
g_cMaxOpenRowsCount=cMaxOpenRowsCount;
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc Use default MaxOpenRows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int MaxOpenRows::Variation_3()
{
DBPROPID guidProperty=DBPROP_MAXOPENROWS;
HROW *prghRows=NULL;
DBCOUNTITEM cRows;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
//Re-open a rowset with DBPROP_MAXOPENROWS set to default value.
if(g_rgDBPrpt[IDX_MaxOpenRows].fSettable)
{
ReleaseRowsetAndAccessor();
//Open rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_REVCOLLIST, IID_IRowsetScroll,
1,&guidProperty))
goto END;
}
//If MaxOpenRows is default to 0, retrieve # of rows in the rowset,
// else retrieve the MaxOpenRows in the rowset
if( !g_cMaxOpenRowsCount || g_cMaxOpenRowsCount > LONG(m_ulRowCount) )
cRows=m_ulRowCount;
else
cRows=g_cMaxOpenRowsCount;
//ulNumerator=1, ulDenominator=cRows, cRows=cRows.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,cRows,
cRows,&cRowsObtained,&prghRows), S_OK))
goto END;
//All the row handles should be retrieved
if(!COMPARE(cRowsObtained, cRows))
goto END;
if( !COMPARE(VerifyRowPosition(prghRows[cRowsObtained-1],cRows,g_pCTable, EXACT), TRUE) )
goto END;
fTestPass=TRUE;
END:
//Release the row handles
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows, NULL, NULL, NULL), S_OK);
PROVIDER_FREE(prghRows);
}
ReleaseRowsetAndAccessor();
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL MaxOpenRows::Terminate()
{
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(MaxOpenRows_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: MaxOpenRows_Cmd - In context of commands
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL MaxOpenRows_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
//Make sure DBPROP_MAXOPENROWS is supported
if(!g_rgDBPrpt[IDX_MaxOpenRows].fSupported)
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (MaxOpenRows::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL MaxOpenRows_Cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(MaxOpenRows::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(MaxOpenRows_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: MaxOpenRows_SchemaR - In context of a Schema Rowset
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL MaxOpenRows_SchemaR::Init()
{
if (!SetRowsetType(USESCHEMAR))
return TEST_SKIPPED;
//Make sure DBPROP_MAXOPENROWS is supported
if(!g_rgDBPrpt[IDX_MaxOpenRows].fSupported)
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (MaxOpenRows::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL MaxOpenRows_SchemaR::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(MaxOpenRows::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(MaxOpenRows_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: MaxOpenRows_OpenRowset - In context of IOpenRowset
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL MaxOpenRows_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
//Make sure DBPROP_MAXOPENROWS is supported
if(!g_rgDBPrpt[IDX_MaxOpenRows].fSupported)
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (MaxOpenRows::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL MaxOpenRows_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(MaxOpenRows::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: DeleteRows - Delete rows from the rowset
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL DeleteRows::Init()
{
if(!TCIRowsetScroll::Init())
return FALSE;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=second row bookmark, delete second row. DB_E_DELETEDROW is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_1()
{
DBPROPID guidProperty[3];
ULONG cProperties;
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
BOOL fTestPass=FALSE;
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_UPDATABILITY;
guidProperty[2]=DBPROP_OTHERUPDATEDELETE;
/* NOTE:
DBPROP_OTHERINSERT = FALSE, DBPROP_OTHERUPDATEDELETE = FALSE, means static cursor.
Since IRowsetChange is being asked for that implies that the cursor will no longer
be static. Therefore a call to GetProperties will need to be made to see if the
above mentioned properties were set.
*/
// Set DBPROP_OTHERUPDATEDELETE if supported
if(g_rgDBPrpt[IDX_OtherUpdateDelete].fSupported)
cProperties=3;
else
cProperties=2;
// Open rowset, and accessor. Request IRowsetChange and IRowsetScroll
TESTC_PROVIDER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetScroll,
cProperties, guidProperty));
// Get the bookmark for the 2nd row
if(!GetBookmark(2, &cbBookmark, &pBookmark))
goto END;
// Get the row handle for the 2nd row
if(!CHECK(m_pIRowset->GetNextRows(NULL,1,1,&cRowsObtained,&pHRow),S_OK))
goto END;
COMPARE(cRowsObtained, 1);
// QI for IRowsetChange pointer
if(!CHECK(m_pIRowsetScroll->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange),S_OK))
goto END;
// Delete the 2nd row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto END;
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
// *pBookmark points to a deleted row. S_OK (DB_E_BADBOOKMARK is RemoveDeleted property is set.
if ( IsPropertyActive(DBPROP_BOOKMARKSKIPPED) )
{
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,cbBookmark,pBookmark,
&pulPosition,&pcRows), S_OK))
goto END;
if( !COMPARE(VerifyApproximatePosition(pulPosition, pcRows, 3), TRUE) )
goto END;
}
else if ( IsPropertyActive(DBPROP_REMOVEDELETED) )
{
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,cbBookmark,pBookmark,
&pulPosition,&pcRows), DB_E_BADBOOKMARK))
goto END;
}
else
{
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,cbBookmark,pBookmark,
&pulPosition,&pcRows), S_OK))
goto END;
if( !COMPARE(VerifyApproximatePosition(pulPosition, pcRows, 2), TRUE) )
goto END;
}
fTestPass = TEST_PASS;
END:
// Release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
// Release the bookmark
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_LAST, delete last row. S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_2()
{
DBPROPID guidProperty[2];
ULONG cProperties=2;
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
BOOL fTestPass=FALSE;
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_UPDATABILITY;
// Open rowset, and accessor. Request IRowsetChange and IRowsetScroll
TESTC_PROVIDER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetScroll,
cProperties, guidProperty));
// Get the row handle for the last row
if(!CHECK(m_pIRowset->GetNextRows(NULL,m_ulRowCount-1,1,&cRowsObtained,&pHRow),S_OK))
goto END;
COMPARE(cRowsObtained, 1);
// QI for IRowsetChange pointer
if(!CHECK(m_pIRowsetScroll->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange),S_OK))
goto END;
// Delete the last row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto END;
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,1,pBookmark,
&pulPosition,&pcRows), S_OK))
goto END;
if ( IsPropertyActive(DBPROP_REMOVEDELETED) )
{
m_ulRowCount--;
if( !COMPARE(VerifyApproximatePosition(pulPosition, pcRows, m_ulRowCount-1), TRUE) )
goto END;
}
else
{
if( !COMPARE(VerifyApproximatePosition(pulPosition, pcRows, m_ulRowCount), TRUE) )
goto END;
}
fTestPass = TEST_PASS;
END:
// Release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc Ratio points to deleted row. DB_E_DELETEDROW and no row handles returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_3()
{
DBPROPID guidProperty[2];
HROW *prghRows=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
BOOL fTestPass=FALSE;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_UPDATABILITY;
// Open rowset and accessor, request IRowsetChange and IRowsetScroll
TESTC_PROVIDER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetScroll,
2,guidProperty));
// Get the row handle for the 4th row
if(!CHECK(m_pIRowset->GetNextRows(NULL,3,1,&cRowsObtained,&prghRows),S_OK))
goto END;
COMPARE(cRowsObtained, 1);
// QI for IRowsetChange pointer
if(FAILED(m_pIRowsetScroll->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto END;
// Delete the 4th row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,prghRows,NULL),S_OK))
goto END;
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
prghRows=NULL;
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,3,m_ulRowCount,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
if(!COMPARE(cRowsObtained, 1))
goto END;
fTestPass = TEST_PASS;
if ( S_OK == m_pIRowsetIdentity->IsSameRow(prghRows[0], m_pHRows[3]) )
{
//Get Data for the row
if(!CHECK(m_pIRowset->GetData(prghRows[0],m_hAccessor,m_pData),DB_E_DELETEDROW))
fTestPass = TEST_FAIL;
}
END:
// Release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
// Release the row handle
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if( TEST_SKIPPED != fTestPass )
PopulateTable();
ReleaseRowsetAndAccessor();
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc Delete 10th row. ulNumerator=1, ulDenominator=2, and cRows=1. S_OK and 10th row handle returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_4()
{
DBPROPID guidProperty[2];
HROW *prghRows=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
BOOL fTestPass=FALSE;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_UPDATABILITY;
// Open rowset and accessor, request IRowsetChange and IRowsetScroll
TESTC_PROVIDER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetScroll,
2,guidProperty));
// Get a row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,(m_ulRowCount/2),1,&cRowsObtained,&prghRows),S_OK))
goto END;
COMPARE(cRowsObtained, 1);
// QI for IRowsetChange pointer
if(FAILED(m_pIRowsetScroll->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto END;
// Delete the row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,prghRows,NULL),S_OK))
goto END;
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
prghRows=NULL;
// ulNumerator=1, ulDenominator=2, cRows=1.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,2,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
// One row handle should be retrieved
if(!COMPARE(cRowsObtained, 1))
goto END;
fTestPass = TEST_PASS;
if ( S_OK == m_pIRowsetIdentity->IsSameRow(prghRows[0], m_pHRows[m_ulRowCount/2]) )
{
//Get Data for the row
if ( !CHECK(m_pIRowset->GetData(*prghRows,m_hAccessor,m_pData),DB_E_DELETEDROW) )
fTestPass=TEST_FAIL;
}
END:
// Release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
// Release the row handle
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if( TEST_SKIPPED != fTestPass )
PopulateTable();
ReleaseRowsetAndAccessor();
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc Delete 20th row. ulNumerator=20, ulDenominator=20, and cRows=1. S_OK and 20th row handle returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_5()
{
DBPROPID guidProperty[2];
HROW *prghRows=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
BOOL fTestPass=FALSE;
HRESULT hr=S_OK;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_UPDATABILITY;
// Open rowset and accessor, request IRowsetChange and IRowsetScroll
TESTC_PROVIDER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetScroll,
2,guidProperty));
// Get the row handle for the last row
if(!CHECK(m_pIRowset->GetNextRows(NULL,(m_ulRowCount-1),1,&cRowsObtained,&prghRows),S_OK))
goto END;
COMPARE(cRowsObtained, 1);
// QI for IRowsetChange pointer
if(FAILED(m_pIRowsetScroll->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto END;
// Delete the last row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,prghRows,NULL),S_OK))
goto END;
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
prghRows=NULL;
if(g_rgDBPrpt[IDX_CanFetchBackwards].fDefault==VARIANT_FALSE)
hr=DB_E_CANTFETCHBACKWARDS;
// ulNumerator=last, ulDenominator=last, cRows=-1. (this fetch is exact).
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,m_ulRowCount,m_ulRowCount,
-1,&cRowsObtained,&prghRows), hr))
goto END;
if(hr==S_OK)
{
// One row handle should be retrieved
if(!COMPARE(cRowsObtained, 1))
goto END;
if (IsPropertyActive(DBPROP_REMOVEDELETED))
{
if( !COMPARE(VerifyRowPosition(prghRows[0], m_ulRowCount-1, g_pCTable, EXACT), TRUE))
goto END;
}
else
{
//Get Data for the row
if(!CHECK(m_pIRowset->GetData(*prghRows,m_hAccessor,m_pData),DB_E_DELETEDROW))
goto END;
}
}
else
{
if(!COMPARE(cRowsObtained, 0))
goto END;
}
fTestPass=TRUE;
END:
// Release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
// Release the row handle
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if( TEST_SKIPPED != fTestPass )
PopulateTable();
ReleaseRowsetAndAccessor();
return fTestPass;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL DeleteRows::Terminate()
{
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(DeleteRows_cmd)
//*-----------------------------------------------------------------------
//| Test Case: DeleteRows_cmd - In context of commands
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL DeleteRows_cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
if (!AlteringRowsIsOK())
{
odtLog<<L"Skipped, Pre-exisiting table was set; changing would put table in unknown state.\n";
return TEST_SKIPPED;
}
// {{ TCW_INIT_BASECLASS_CHECK
return (DeleteRows::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL DeleteRows_cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(DeleteRows::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(DeleteRows_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: DeleteRows_OpenRowset - In context of IOpenRowset
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL DeleteRows_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET) )
return TEST_SKIPPED;
if (!AlteringRowsIsOK())
{
odtLog<<L"Skipped, Pre-exisiting table was set; changing would put table in unknown state.\n";
return TEST_SKIPPED;
}
// {{ TCW_INIT_BASECLASS_CHECK
return (DeleteRows::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL DeleteRows_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(DeleteRows::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: RemoveDeleted - test DBPROP_REMOVEDELETED
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL RemoveDeleted::Init()
{
if(!TCIRowsetScroll::Init())
return FALSE;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc *pBookmark points to a deleted row. DB_E_BADBOOKMARK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_1()
{
DBPROPID rgguidProperty[4];
ULONG cProperties;
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_UPDATABILITY;
rgguidProperty[3]=DBPROP_OTHERUPDATEDELETE;
/* NOTE:
DBPROP_OTHERINSERT = FALSE, DBPROP_OTHERUPDATEDELETE = FALSE, means static cursor.
Since IRowsetChange is being asked for that implies that the cursor will no longer
be static. Therefore a call to GetProperties will need to be made to see if the
above mentioned properties were set.
*/
// Set DBPROP_OTHERUPDATELETE if supported
if(g_rgDBPrpt[IDX_OtherUpdateDelete].fSupported)
cProperties=4;
else
cProperties=3;
// Open rowset, and accessor. Request IRowsetChange and IRowsetScroll
TESTC_PROVIDER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetScroll,
cProperties,rgguidProperty));
// Get the bookmark for the 3rd row
if(!GetBookmark(3, &cbBookmark, &pBookmark))
goto END;
// Get the row handle for the 3rd row
if(!CHECK(m_pIRowset->GetNextRows(NULL,2,1,&cRowsObtained,&pHRow),S_OK))
goto END;
COMPARE(cRowsObtained, 1);
// QI for IRowsetChange pointer
if(FAILED(m_pIRowsetScroll->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto END;
// Delete the 3rd row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto END;
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
// *pBookmark points to a deleted row.
if ( IsPropertyActive(DBPROP_BOOKMARKSKIPPED) )
{
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,cbBookmark,pBookmark,
&pulPosition,&pcRows), S_OK))
goto END;
if( !COMPARE(VerifyApproximatePosition(pulPosition, pcRows, 3), TRUE) )
goto END;
}
else
{
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,cbBookmark,pBookmark,
&pulPosition,&pcRows), DB_E_BADBOOKMARK))
goto END;
}
fTestPass=TRUE;
END:
// Release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
// Release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
// Release the bookmark
PROVIDER_FREE(pBookmark);
if( TEST_SKIPPED != fTestPass )
PopulateTable();
ReleaseRowsetAndAccessor();
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc Delete the 3rd row. *pBookmark points to the second row. S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_2()
{
DBPROPID rgguidProperty[3];
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_UPDATABILITY;
// Open rowset and accessor, Request IRowsetChange and IRowsetScroll
TESTC_PROVIDER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetScroll,
3,rgguidProperty));
// Get the bookmark for the 2nd row
if(!GetBookmark(2, &cbBookmark, &pBookmark))
goto END;
// Get the row handle for the 3rd row
if(!CHECK(m_pIRowset->GetNextRows(NULL,2,1,&cRowsObtained,&pHRow),S_OK))
goto END;
COMPARE(cRowsObtained, 1);
// QI for IRowsetChange pointer
if(FAILED(m_pIRowsetScroll->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto END;
// Delete the 3rd row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto END;
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
// Should get second row.
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,cbBookmark,pBookmark,
&pulPosition,&pcRows), S_OK))
goto END;
if( !COMPARE(VerifyApproximatePosition(pulPosition, pcRows, 2), TRUE) )
goto END;
fTestPass=TRUE;
END:
// Release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
// Release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
// Release the bookmark
PROVIDER_FREE(pBookmark);
if( TEST_SKIPPED != fTestPass )
PopulateTable();
ReleaseRowsetAndAccessor();
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc Ratio points to deleted row. DB_E_DELETEDROW and no row handles returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_3()
{
DBPROPID rgguidProperty[3];
HROW *prghRows=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_UPDATABILITY;
// Open rowset and accessor, request IRowsetChange and IRowsetScroll
TESTC_PROVIDER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetScroll,
3,rgguidProperty));
// Get the row handle for the 1st row
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained,&prghRows),S_OK))
goto END;
COMPARE(cRowsObtained, 1);
// QI for IRowsetChange pointer
if(FAILED(m_pIRowsetScroll->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto END;
// Delete the 1st row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,prghRows,NULL),S_OK))
goto END;
m_ulRowCount--;
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
prghRows=NULL;
// ulNumerator=0, ulDenominator=20, cRows=1. The second row should be retrieved
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,m_ulRowCount,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
// No row handles should be retrieved
if(!COMPARE(cRowsObtained, 1))
goto END;
if( !COMPARE(VerifyRowPosition(*prghRows, 2, g_pCTable, EXACT), TRUE))
goto END;
fTestPass = TRUE;
END:
// Release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
// Release the row handle
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if( TEST_SKIPPED != fTestPass )
PopulateTable();
ReleaseRowsetAndAccessor();
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc Delete 18th row. ulNumerator=9, ulDenominator=10, and cRows=3. DB_S_ENDOFROWSET is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_4()
{
DBPROPID rgguidProperty[3];
HROW *prghRows=NULL;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
HRESULT hr;
IRowsetChange *pIRowsetChange=NULL;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_UPDATABILITY;
// Open rowset and accessor, request IRowsetChange and IRowsetScroll
TESTC_PROVIDER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetScroll,
3,rgguidProperty));
// Get the row handle for the 9/10 row
if(!CHECK(m_pIRowset->GetNextRows(NULL,GetRatio(m_ulRowCount, 9, 10)-1,1,&cRowsObtained,&prghRows),S_OK))
goto END;
if(!COMPARE(cRowsObtained, 1))
goto END;
// QI for IRowsetChange pointer
if(FAILED(m_pIRowsetScroll->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto END;
// Delete the row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,prghRows,NULL),S_OK))
goto END;
SAFE_RELEASE(pIRowsetChange);
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
prghRows=NULL;
// ulNumerator=9, ulDenominator=10, cRows=3.
hr = m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,9,10,
((m_ulRowCount)/10)+1,&cRowsObtained,&prghRows);
if (!COMPARE(SUCCEEDED(hr), TRUE))
goto END;
if ( hr == DB_S_ENDOFROWSET )
{
if (!COMPARE(cRowsObtained<(m_ulRowCount/10)+1, TRUE))
goto END;
}
else
{
odtLog << L"Warning, ideally. DB_S_ENDOFROWSET\n";
if(!COMPARE(cRowsObtained, (m_ulRowCount/10)+1))
goto END;
}
// The first row handle should be 19th row
if( !COMPARE(VerifyRowPosition(*prghRows, GetRatio(m_ulRowCount, 9, 10)+1, g_pCTable, INEXACT), TRUE))
goto END;
fTestPass=TRUE;
END:
// Release the row handles
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows, NULL, NULL, NULL), S_OK);
PROVIDER_FREE(prghRows);
}
if( TEST_SKIPPED != fTestPass )
PopulateTable();
ReleaseRowsetAndAccessor();
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc Delete 19th row. ulNumerator=19, ulDenominator=20, and cRows=1. S_OK and 20th row handle returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_5()
{
DBPROPID rgguidProperty[3];
HROW *prghRows=NULL;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
HRESULT hr;
IRowsetChange *pIRowsetChange=NULL;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_UPDATABILITY;
// Open rowset and accessor, request IRowsetChange and IRowsetScroll
TESTC_PROVIDER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetScroll,
3,rgguidProperty));
// Get the row handle for the next to last row
if(!CHECK(m_pIRowset->GetNextRows(NULL,(m_ulRowCount-2),1,&cRowsObtained,&prghRows),S_OK))
goto END;
if(!COMPARE(cRowsObtained, 1))
goto END;
// QI for IRowsetChange pointer
if(FAILED(m_pIRowsetScroll->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto END;
// Delete the row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,prghRows,NULL),S_OK))
goto END;
SAFE_RELEASE(pIRowsetChange);
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
prghRows=NULL;
// Use (m_ulRowCount-2)/(m_ulRowCount-1) as the ratio
hr = m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,m_ulRowCount-2,m_ulRowCount-1,
2,&cRowsObtained,&prghRows);
if (!COMPARE(SUCCEEDED(hr), TRUE))
goto END;
if ( hr == DB_S_ENDOFROWSET )
{
if (!COMPARE(cRowsObtained, 1))
goto END;
}
else
{
odtLog << L"Warning, ideally. DB_S_ENDOFROWSET\n";
if(!COMPARE(cRowsObtained, 2))
goto END;
}
if( !COMPARE(VerifyRowPosition(prghRows[0], m_ulRowCount, g_pCTable, INEXACT), TRUE) )
goto END;
fTestPass=TRUE;
END:
// Release the row handles
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows, NULL, NULL, NULL), S_OK);
PROVIDER_FREE(prghRows);
}
if( TEST_SKIPPED != fTestPass )
PopulateTable();
ReleaseRowsetAndAccessor();
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc Delete half the row. Request 3/4. Verify 3/4 row is returned
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_6()
{
DBPROPID rgguidProperty[3];
HROW *prghRows=NULL;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
HRESULT hr;
IRowsetChange *pIRowsetChange=NULL;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_UPDATABILITY;
// Open rowset and accessor, request IRowsetChange and IRowsetScroll
TESTC_PROVIDER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetScroll,
3,rgguidProperty));
// Get the row handle for the last half of the rows
if(!CHECK(m_pIRowset->GetNextRows(NULL,(m_ulRowCount/2)-1,m_ulRowCount,&cRowsObtained,&prghRows),DB_S_ENDOFROWSET))
goto END;
if(!COMPARE(cRowsObtained >=m_ulRowCount/2, TRUE))
goto END;
// QI for IRowsetChange pointer
if(FAILED(m_pIRowsetScroll->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto END;
// Delete the row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,cRowsObtained,prghRows,NULL),S_OK))
goto END;
SAFE_RELEASE(pIRowsetChange);
// Release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
prghRows=NULL;
// Use 3/4 ratio
hr = m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,3,4,
2,&cRowsObtained,&prghRows);
if (!COMPARE(SUCCEEDED(hr), TRUE))
goto END;
if ( hr == DB_S_ENDOFROWSET )
{
odtLog << L"Warning, ideally, S_OK should be returned\n";
if (!COMPARE(cRowsObtained <= 1, TRUE))
goto END;
}
else
{
if(!COMPARE(cRowsObtained, 2))
goto END;
if( !COMPARE(VerifyRowPosition(prghRows[0], GetRatio(m_ulRowCount/2, 3, 4)+1 , g_pCTable, INEXACT), TRUE) )
goto END;
if( !COMPARE(VerifyRowPosition(prghRows[1], GetRatio(m_ulRowCount/2, 3, 4)+2, g_pCTable, INEXACT), TRUE) )
goto END;
}
fTestPass=TRUE;
END:
// Release the row handles
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows, NULL, NULL, NULL), S_OK);
PROVIDER_FREE(prghRows);
}
if( TEST_SKIPPED != fTestPass )
PopulateTable();
ReleaseRowsetAndAccessor();
return fTestPass;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL RemoveDeleted::Terminate()
{
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(RemoveDeleted_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: RemoveDeleted_Cmd - In context of Commands
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL RemoveDeleted_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
if ( !AlteringRowsIsOK() )
{
odtLog<<L"Skipped, Pre-exisiting table was set; changing would put table in unknown state.\n";
return TEST_SKIPPED;
}
// {{ TCW_INIT_BASECLASS_CHECK
return (RemoveDeleted::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL RemoveDeleted_Cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(RemoveDeleted::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(RemoveDeleted_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: RemoveDeleted_OpenRowset - In context of IOpenRowset
//| Created: 09/01/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL RemoveDeleted_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
if ( !AlteringRowsIsOK() )
{
odtLog<<L"Skipped, Pre-exisiting table was set; changing would put table in unknown state.\n";
return TEST_SKIPPED;
}
// {{ TCW_INIT_BASECLASS_CHECK
return (RemoveDeleted::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL RemoveDeleted_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(RemoveDeleted::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: Rowset_SingleRow - Test single row rowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_SingleRow::Init()
{
DBPROPID guidProperty=DBPROP_CANHOLDROWS;
// Create a rowset and accessor
if(!GetRowsetAndAccessor(g_p1RowTable, SELECT_ALLFROMTBL, IID_IRowsetScroll, 1, &guidProperty))
return FALSE;
if ( m_ulRowCount != 1)
{
odtLog<<L"Couldn't obtain a 1 row table.\n";
return FALSE;
}
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=first row bookmark. S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_SingleRow::Variation_1()
{
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
BOOL fTestPass=FALSE;
// Get the bookmark for the first row
if(!GetBookmark(1,&cbBookmark,&pBookmark))
goto END;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,cbBookmark,pBookmark,
&pulPosition,&pcRows),S_OK))
goto END;
if(!COMPARE(VerifyApproximatePosition(pulPosition, pcRows, 1), TRUE))
goto END;
fTestPass = TEST_PASS;
END:
// Release the bookmark
PROVIDER_FREE(pBookmark);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=1, ulDenominator=1, cRows=-1. S_OK returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_SingleRow::Variation_2()
{
DBCOUNTITEM cRowsObtained=0;
DBCOUNTITEM cRowsObtained2=0;
HROW *prghRows=NULL;
HROW *prghRows2=NULL;
BOOL fTestPass=FALSE;
HRESULT hr=S_OK;
if(g_rgDBPrpt[IDX_CanFetchBackwards].fDefault==VARIANT_FALSE)
hr=DB_E_CANTFETCHBACKWARDS;
// ulNumerator=1, ulDenominator=1, cRows=1.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,1,
-1,&cRowsObtained,&prghRows),hr))
goto END;
if(hr==S_OK)
{
if(!COMPARE(cRowsObtained, 1))
goto END;
if(!VerifyRowPosition(prghRows[0], 1, g_p1RowTable, EXACT))
goto END;
// Reset the cursor
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto END;
// Fetch the row and verify reference count
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained2,&prghRows2),S_OK))
goto END;
// Release the row handle and check ref count
if(!CHECK(m_pIRowset->ReleaseRows(1,prghRows,NULL,NULL,NULL),S_OK))
goto END;
}
else
{
if(!COMPARE(cRowsObtained, 0))
goto END;
}
fTestPass=TRUE;
END:
// Release the row handle
PROVIDER_FREE(prghRows);
if(prghRows2)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained2, prghRows2, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows2);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=0, ulDenominator=1, cRows=1. S_OK returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_SingleRow::Variation_3()
{
DBCOUNTITEM cRowsObtained=0;
DBCOUNTITEM cRowsObtained2=0;
HROW *prghRows=NULL;
HROW *prghRows2=NULL;
BOOL fTestPass=FALSE;
HRESULT hr=S_OK;
if(g_rgDBPrpt[IDX_CanFetchBackwards].fDefault==VARIANT_FALSE)
hr=DB_E_CANTFETCHBACKWARDS;
// ulNumerator=1, ulDenominator=1, cRows=1.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,1,
1,&cRowsObtained,&prghRows),hr))
goto END;
if(hr==S_OK)
{
if(!COMPARE(cRowsObtained, 1))
goto END;
if(!VerifyRowPosition(prghRows[0], 1, g_p1RowTable, EXACT))
goto END;
// Reset the cursor
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto END;
// Fetch the row and verify reference count
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained2,&prghRows2),S_OK))
goto END;
// Release the row handle and check ref count
if(!CHECK(m_pIRowset->ReleaseRows(1,prghRows,NULL,NULL,NULL),S_OK))
goto END;
}
else
{
if(!COMPARE(cRowsObtained, 0))
goto END;
}
fTestPass=TRUE;
END:
// Release the row handle
PROVIDER_FREE(prghRows);
if(prghRows2)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained2, prghRows2, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows2);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_LAST. S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_SingleRow::Variation_4()
{
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
DBBOOKMARK dbBookmark = DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&dbBookmark;
BOOL fTestPass=FALSE;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,1,pBookmark,
&pulPosition,&pcRows),S_OK))
goto END;
if(!COMPARE(VerifyApproximatePosition(pulPosition, pcRows, 1), TRUE))
goto END;
fTestPass = TEST_PASS;
END:
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_FIRST S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_SingleRow::Variation_5()
{
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
DBBOOKMARK dbBookmark = DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&dbBookmark;
BOOL fTestPass=FALSE;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,1,pBookmark,
&pulPosition,&pcRows),S_OK))
goto END;
if(!COMPARE(VerifyApproximatePosition(pulPosition, pcRows, 1), TRUE))
goto END;
fTestPass = TEST_PASS;
END:
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=1, ulDenominator=3, cRows=1. S_OK returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_SingleRow::Variation_6()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
HRESULT hr=S_OK;
if(g_rgDBPrpt[IDX_CanFetchBackwards].fDefault==VARIANT_FALSE)
hr=DB_E_CANTFETCHBACKWARDS;
// ulNumerator=1, ulDenominator=1, cRows=1.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,3,
1,&cRowsObtained,&prghRows),hr))
goto END;
if(hr==S_OK)
{
if(!COMPARE(cRowsObtained, 1))
goto END;
if(!VerifyRowPosition(prghRows[0], 1, g_p1RowTable, EXACT))
goto END;
}
else
{
if(!COMPARE(cRowsObtained, 0))
goto END;
}
fTestPass=TRUE;
END:
// Release the row handle
PROVIDER_FREE(prghRows);
return fTestPass;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_SingleRow::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(Rowset_SingleRow_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: Rowset_SingleRow_Cmd - In context of commands
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_SingleRow_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
if (!g_p1RowTable)
{
odtLog<<L"Couldn't obtain a 1 row table.\n";
return TEST_SKIPPED;
}
// {{ TCW_INIT_BASECLASS_CHECK
return (Rowset_SingleRow::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_SingleRow_Cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Rowset_SingleRow::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Rowset_SingleRow_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: Rowset_SingleRow_OpenRowset - In context of IOpenRowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_SingleRow_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
if (!g_p1RowTable)
{
odtLog<<L"Couldn't obtain a 1 row table.\n";
return TEST_SKIPPED;
}
// {{ TCW_INIT_BASECLASS_CHECK
return (Rowset_SingleRow::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_SingleRow_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Rowset_SingleRow::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: Rowset_Empty - Test empty rowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
///--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_Empty::Init()
{
// Create a rowset and accessor
if(!GetRowsetAndAccessor(g_pEmptyTable, SELECT_ALLFROMTBL, IID_IRowsetScroll))
return FALSE;
if ( m_ulRowCount != 0)
{
odtLog<<L"Couldn't obtain an empty row table.\n";
return FALSE;
}
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_FIRST. S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_Empty::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,1,pBookmark,
&pulPosition,&pcRows),S_OK))
return TEST_FAIL;
if((pcRows != 0) || (pulPosition != 0))
return TEST_FAIL;
return TEST_PASS;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=1, ulDenominator=1, cRows=1. DB_S_ENDOFROWSET and no row handle returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_Empty::Variation_2()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=1, ulDenominator=1, cRows=1.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,1,
1,&cRowsObtained,&prghRows),DB_S_ENDOFROWSET))
goto END;
if(!COMPARE(prghRows,NULL))
goto END;
if(COMPARE(cRowsObtained, 0))
fTestPass=TRUE;
END:
// Release the row handle
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=1, ulDenominator=1, cRows=0. S_OK and no row handle returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_Empty::Variation_3()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=1, ulDenominator=1, cRows=0.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,1,
0,&cRowsObtained,&prghRows),S_OK))
goto END;
if(!COMPARE(prghRows, NULL))
goto END;
if(COMPARE(cRowsObtained, 0))
fTestPass=TRUE;
END:
// Release the row handle
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc ulNumerator=0, ulDenominator=1, cRows=1. DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_Empty::Variation_4()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=1, ulDenominator=1, cRows=0.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,1,
1,&cRowsObtained,&prghRows),DB_S_ENDOFROWSET))
goto END;
if(!COMPARE(prghRows, NULL))
goto END;
if(COMPARE(cRowsObtained, 0))
fTestPass=TRUE;
END:
// Release the row handle
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_LAST. S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_Empty::Variation_5()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,1,pBookmark,
&pulPosition,&pcRows),S_OK))
return TEST_FAIL;
if((pcRows != 0) || (pulPosition != 0))
return TEST_FAIL;
return TEST_PASS;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_Empty::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(Rowset_Empty_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: Rowset_Empty_Cmd - In context of commands
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_Empty_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
if (!g_pEmptyTable)
{
odtLog<<L"Couldn't obtain an empty table.\n";
return TEST_SKIPPED;
}
// {{ TCW_INIT_BASECLASS_CHECK
return (Rowset_Empty::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_Empty_Cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Rowset_Empty::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Rowset_Empty_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: Rowset_Empty_OpenRowset - In context of IOpenRowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_Empty_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
if (!g_pEmptyTable)
{
odtLog<<L"Couldn't obtain an empty table.\n";
return TEST_SKIPPED;
}
// {{ TCW_INIT_BASECLASS_CHECK
return (Rowset_Empty::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_Empty_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Rowset_Empty::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: Boundary_GetApproximatePosition - Boundary conditions for GetApproximatePosition
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetApproximatePosition::Init()
{
// Create a rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_REVCOLLIST, IID_IRowsetScroll,
0,NULL))
return FALSE;
// Get a valid bookmark value, points to the first row
m_cbBookmark=1;
m_DBBookmark=DBBMK_FIRST;
m_pBookmark=(BYTE *)&m_DBBookmark;
m_pulPosition=0;
m_pcRows=0;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc pBookmark==Null pointer. E_INVALIDARG is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetApproximatePosition::Variation_1()
{
if(CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,m_cbBookmark,NULL,
&m_pulPosition,&m_pcRows),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc pBookmark==NULL. DB_E_BADBOOKMARK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetApproximatePosition::Variation_2()
{
if(CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,1,NULL,
&m_pulPosition,&m_pcRows),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc pBookmark points to a invalid bookmark. DB_E_BADBOOKMARK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetApproximatePosition::Variation_3()
{
DBBOOKMARK dbBookmark = DBBMK_INVALID;
BYTE *pBookmark = (BYTE *)&dbBookmark;
if(CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,1,pBookmark,
&m_pulPosition,&m_pcRows),DB_E_BADBOOKMARK))
return TEST_PASS;
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc pcRows==Null pointer. S_OK and no count of rows returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetApproximatePosition::Variation_4()
{
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,m_cbBookmark,m_pBookmark,
&m_pulPosition,NULL),S_OK))
return TEST_FAIL;
if(!COMPARE(VerifyApproximatePosition(m_pulPosition, m_ulRowCount, 1), TRUE))
return TEST_FAIL;
return TEST_PASS;
}
//*-----------------------------------------------------------------------
// @mfunc pulPosition is NULL and pcRows is NULL, S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetApproximatePosition::Variation_5()
{
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,m_cbBookmark,m_pBookmark,
NULL,NULL),S_OK))
return TEST_FAIL;
return TEST_PASS;
}
//*-----------------------------------------------------------------------
// @mfunc cbBookmark = 0, pBookmark = NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetApproximatePosition::Variation_6()
{
DBCOUNTITEM ulPosition = MAXDBCOUNTITEM;
DBCOUNTITEM cRows = 0;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,0,NULL,
&ulPosition,&cRows),S_OK))
return TEST_FAIL;
COMPARE(ulPosition, MAXDBCOUNTITEM);
if(!COMPARE(VerifyApproximatePosition(0, cRows, 0), TRUE))
return TEST_FAIL;
return TEST_PASS;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetApproximatePosition::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(Boundary_GetApproximatePosition_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: Boundary_GetApproximatePosition_Cmd - In context of commands
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetApproximatePosition_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Boundary_GetApproximatePosition::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetApproximatePosition_Cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Boundary_GetApproximatePosition::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Boundary_GetApproximatePosition_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: Boundary_GetApproximatePosition_OpenRowset - In context of IOpenRowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetApproximatePosition_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Boundary_GetApproximatePosition::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetApproximatePosition_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Boundary_GetApproximatePosition::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Boundary_GetApproximatePosition_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: Boundary_GetApproximatePosition_SchemaR - In context of a Schema Rowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetApproximatePosition_SchemaR::Init()
{
if (!SetRowsetType(USESCHEMAR))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Boundary_GetApproximatePosition::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetApproximatePosition_SchemaR::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Boundary_GetApproximatePosition::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: Boundary_GetRowsAtRatio - Boundary conditions for GetRowsAtRatio
//| Created: 09/02/97
//*-----------------------------------------------------------------------
///--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetRowsAtRatio::Init()
{
// Create a rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_REVCOLLIST, IID_IRowsetScroll,
0,NULL))
return FALSE;
m_prghRows=&m_hRows;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc pcRowsObtained=Null pointer. E_INVALIDARG is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAtRatio::Variation_1()
{
if(CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,1,
1,NULL,&m_prghRows),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc prghRows=NULL pointer. E_INVALIDARG is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAtRatio::Variation_2()
{
if(CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,1,
1,&m_cRowsObtained,NULL),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetRowsAtRatio::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(Boundary_GetRowsAtRatio_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: Boundary_GetRowsAtRatio_Cmd - In context of commands
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetRowsAtRatio_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Boundary_GetRowsAtRatio::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetRowsAtRatio_Cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Boundary_GetRowsAtRatio::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Boundary_GetRowsAtRatio_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: Boundary_GetRowsAtRatio_OpenRowset - In context of IOpenRowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetRowsAtRatio_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Boundary_GetRowsAtRatio::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetRowsAtRatio_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Boundary_GetRowsAtRatio::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Boundary_GetRowsAtRatio_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: Boundary_GetRowsAtRatio_SchemaR - In context of a Schema Rowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetRowsAtRatio_SchemaR::Init()
{
if (!SetRowsetType(USESCHEMAR))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Boundary_GetRowsAtRatio::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetRowsAtRatio_SchemaR::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Boundary_GetRowsAtRatio::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: Parameters - Valid and invalid parameters passed into methods
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Parameters::Init()
{
IColumnsInfo *pIColumnsInfo=NULL;
DBCOUNTITEM cColumns;
DBCOLUMNINFO *prgInfo=NULL;
WCHAR *pStringsBuffer=NULL;
BOOL fInitPass=FALSE;
if(!TCIRowsetScroll::Init())
return FALSE;
// Create a rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_COLLISTFROMTBL, IID_IRowsetScroll))
return FALSE;
// Make sure IColumnsInfo returns correct infomation on the 0th column,
// which is the bookmark column
if(!CHECK(m_pIRowsetScroll->QueryInterface(IID_IColumnsInfo,
(void **)&pIColumnsInfo),S_OK))
return FALSE;
if(!CHECK(pIColumnsInfo->GetColumnInfo(&cColumns, &prgInfo,&pStringsBuffer),S_OK))
goto END;
// The first element in the array should be the bookmark column
if(!COMPARE(prgInfo->iOrdinal, 0))
goto END;
if(!COMPARE(((prgInfo->dwFlags) & DBCOLUMNFLAGS_ISBOOKMARK),(DBCOLUMNFLAGS_ISBOOKMARK)))
goto END;
fInitPass=TRUE;
END:
// Release the interface pointer
SAFE_RELEASE(pIColumnsInfo);
// Free mem
PROVIDER_FREE(prgInfo);
PROVIDER_FREE(pStringsBuffer);
return fInitPass;
}
//*-----------------------------------------------------------------------
// @mfunc GetApproximatePosition: cbBookmark=0, pBookmark=null pointer, S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_1()
{
ULONG_PTR cbBookmark=0;
BYTE *pBookmark=NULL;
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,cbBookmark,pBookmark,
&pulPosition,&pcRows),S_OK))
return TEST_FAIL;
if(!COMPARE(VerifyApproximatePosition(pulPosition, pcRows, 0), TRUE))
return TEST_FAIL;
return TEST_PASS;
}
//*-----------------------------------------------------------------------
// @mfunc GetApproximatePosition: cbBookmark=0, pulPosition=null pointer, S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_2()
{
ULONG_PTR cbBookmark=0;
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM *pulPosition=NULL;
DBCOUNTITEM pcRows=0;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,cbBookmark,pBookmark,
pulPosition,&pcRows),S_OK))
return TEST_FAIL;
if(!COMPARE(VerifyApproximatePosition(0, pcRows, 0), TRUE))
return TEST_FAIL;
return TEST_PASS;
}
//*-----------------------------------------------------------------------
// @mfunc GetRowsAtRatio: cRows=0, *prghRows not NULL on input. *prghRows not null on output. S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_3()
{
DBCOUNTITEM cRowsObtained=0;
HROW rghRows[5];
HROW *prghRows=rghRows;
BOOL fTestPass=TRUE;
// ulNumerator=1, ulDenominator=2, cRows=0.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,2,
0,&cRowsObtained,&prghRows),S_OK))
goto END;
// No rows should have been returned
if(!COMPARE(cRowsObtained, 0))
goto END;
// prghRows should not be NULL
if(!COMPARE(prghRows, rghRows))
fTestPass=FALSE;
END:
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
//PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc GetRowsAtRatio: cRows=0, *prghRows=NULL on input, *prghRows null on output. S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_4()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=1, ulDenominator=3, cRows=0.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,3,
0,&cRowsObtained,&prghRows),S_OK))
goto END;
if(!COMPARE(prghRows, NULL))
goto END;
if(COMPARE(cRowsObtained, 0))
fTestPass=TRUE;
END:
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc GetRowsAtRatio: ulNumerator=0, ulDenominator=4, cRows=5. S_OK and first 5 rows returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_5()
{
HROW * prghRows=NULL;
DBCOUNTITEM cRowsObtained=0;
DBCOUNTITEM cRowCount;
BOOL fTestPass=FALSE;
// ulNumerator=0, ulDenominator=4, cRows=5.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,4,
5,&cRowsObtained,&prghRows), S_OK))
goto END;
// Five row handles should be retrieved.
if(!COMPARE(cRowsObtained, 5))
goto END;
// Verify the row handle are retrieved correctly
for(cRowCount=0; cRowCount<5; cRowCount++)
{
if(!VerifyRowPosition(prghRows[cRowCount],cRowCount+1,g_pCTable,EXACT))
goto END;
}
fTestPass=TRUE;
END:
// Release the row handles
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows, NULL, NULL, NULL), S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc GetRowsAtRatio: ulNumerator=5, ulDenominator=0, cRows=5. DB_E_BADRATIO is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_6()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=5, ulDenominator=0, cRows=5.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,5,0,
5,&cRowsObtained,&prghRows),DB_E_BADRATIO))
goto END;
if(!COMPARE(prghRows, NULL))
goto END;
if(COMPARE(cRowsObtained, 0))
fTestPass=TRUE;
END:
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc GetRowsAtRatio: ulNumerator=0, ulDenominator=0, cRows=5. DB_E_BADRATIO is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_7()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=0, ulDenominator=0, cRows=5.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,0,
5,&cRowsObtained,&prghRows),DB_E_BADRATIO))
goto END;
if(!COMPARE(prghRows, NULL))
goto END;
if(COMPARE(cRowsObtained, 0))
fTestPass=TRUE;
END:
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc GetRowsAtRatio: ulNumerator=ULONG_MAX, ulDenominator=1, cRows=1. DB_E_BADRATIO is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_8()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=ULONG_MAX, ulDenominator=1, cRows=1.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,MAXDBCOUNTITEM,1,
1,&cRowsObtained,&prghRows),DB_E_BADRATIO))
goto END;
if(!COMPARE(prghRows, NULL))
goto END;
if(COMPARE(cRowsObtained, 0))
fTestPass=TRUE;
END:
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc GetRowsAtRatio: ulNumerator=ULONG_MAX, ulDenominator=ULONG_MAX, cRows=1. S_OK and last row returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_9()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
HRESULT hr=S_OK;
if(g_rgDBPrpt[IDX_CanFetchBackwards].fDefault==VARIANT_FALSE)
hr=DB_E_CANTFETCHBACKWARDS;
// ulNumerator=ULONG_MAX, ulDenominator=ULONG_MAX, cRows=-1.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,MAXDBCOUNTITEM,MAXDBCOUNTITEM,
-1,&cRowsObtained,&prghRows),hr))
goto END;
if(hr==S_OK)
{
// The last row handle should be retrieved
if(!COMPARE(cRowsObtained, 1))
goto END;
// Verify the last row
if(!VerifyRowPosition(prghRows[0],m_ulRowCount,g_pCTable,EXACT))
goto END;
}
else
{
// No row should be retrieved
if(!COMPARE(cRowsObtained, 0))
goto END;
}
fTestPass=TRUE;
END:
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc GetRowsAtRatio: ulNumerator=ULONG_MAX-1, ulDenominator=ULONG_MAX, cRows=1. S_OK and last row returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_10()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
HRESULT hr=S_OK;
if(g_rgDBPrpt[IDX_CanFetchBackwards].fDefault==VARIANT_FALSE)
hr=DB_E_CANTFETCHBACKWARDS;
// ulNumerator=ULONG_MAX-1, ulDenominator=ULONG_MAX, cRows=1
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,MAXDBCOUNTITEM-1,MAXDBCOUNTITEM,
1,&cRowsObtained,&prghRows),hr))
goto END;
if(hr==S_OK)
{
// The last row handle should be retrieved
if(!COMPARE(cRowsObtained, 1))
goto END;
// Verify the last row
if( !COMPARE(VerifyRowPosition(prghRows[0],m_ulRowCount,g_pCTable,INEXACT), TRUE) )
goto END;
}
else
{
// No row should be retrieved
if(!COMPARE(cRowsObtained, 0))
goto END;
}
fTestPass=TRUE;
END:
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
}
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc GetRowsAtRatio: ulNumerator=1, ulDenominator=1 cRows=1. DB_S_ENDOFROWSET.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_11()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=1, ulDenominator=1, cRows=1.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,1,
1,&cRowsObtained,&prghRows),DB_S_ENDOFROWSET))
goto END;
// The last row handle should be retrieved
if(!COMPARE(cRowsObtained, 0))
goto END;
if(!COMPARE(prghRows, NULL))
goto END;
fTestPass=TRUE;
END:
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
}
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc GetRowsAtRatio: ulNumerator=LONG_MAX/2, ulDenominator=LONG_MAX+1 cRows=1. middle row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_12()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=LONG_MAX/2, ulDenominator=LONG_MAX+1 cRows=1. middle row.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,MAXDBROWCOUNT/2,DBCOUNTITEM(MAXDBROWCOUNT)+1,
1,&cRowsObtained,&prghRows),S_OK))
goto END;
// expect one row
if(!COMPARE(cRowsObtained, 1))
goto END;
// Verify the middle row
if( !COMPARE(VerifyRowPosition(prghRows[0],m_ulRowCount/2,g_pCTable,INEXACT), TRUE) )
goto END;
fTestPass=TRUE;
END:
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
}
return fTestPass;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Parameters::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(Parameters_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: Parameters_Cmd - In context of commands
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Parameters_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Parameters::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Parameters_Cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Parameters::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Parameters_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: Parameters_OpenRowset - In context of IOpenRowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Parameters_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return(Parameters::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Parameters_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Parameters::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Parameters_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: Parameters_SchemaR - In context of a Schema Rowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Parameters_SchemaR::Init()
{
if (!SetRowsetType(USESCHEMAR))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Parameters::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Parameters_SchemaR::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Parameters::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: Sequence - Specific sequences of API calls where order is interesting.
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Sequence::Init()
{
if(!TCIRowsetScroll::Init())
return FALSE;
// Create a rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_REVCOLLIST, IID_IRowsetScroll))
return FALSE;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc Open rowset, fetch all of the rows, *pBookmark=DBBMK_FIRST. S_OK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Sequence::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
HROW *pHRow=NULL;
DBCOUNTITEM cCount=0;
DBCOUNTITEM pulPosition=0;
DBCOUNTITEM pcRows=0;
BOOL fTestPass=TEST_FAIL;
// Fetch all the rows
if(!CHECK(m_pIRowset->GetNextRows(NULL, // Chapter handle.
0, // Count of rows to skip before reading.
m_ulRowCount, // The number of rows to fetch.
&cCount, // Actual number of fetched rows.
&pHRow), // Array of handles of retrieved rows.
S_OK))
goto END;
if(!COMPARE(ULONG(m_ulRowCount), cCount))
goto END;
if(!CHECK(m_pIRowsetScroll->GetApproximatePosition(NULL,1,pBookmark,
&pulPosition,&pcRows),S_OK))
goto END;
if(!COMPARE(VerifyApproximatePosition(pulPosition, pcRows, 1), TRUE))
return TEST_FAIL;
fTestPass = TEST_PASS;
END:
// Release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cCount, pHRow, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
}
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=4, ulDenominator=5, and cRows=(-3
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Sequence::Variation_2()
{
DBCOUNTITEM cRowsObtained=0;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
HRESULT hr=S_OK;
if(g_rgDBPrpt[IDX_CanFetchBackwards].fDefault==VARIANT_FALSE)
hr=DB_E_CANTFETCHBACKWARDS;
// ulNumerator=4, ulDenominator=5, cRows=(-3).
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,4,5,
-3,&cRowsObtained,&prghRows),hr))
goto END;
if(hr==S_OK)
{
if(!COMPARE(cRowsObtained,3))
goto END;
if(!VerifyRowPosition(prghRows[0],GetRatio(m_ulRowCount,4,5)+1, g_pCTable,INEXACT))
goto END;
if(!VerifyRowPosition(prghRows[1],GetRatio(m_ulRowCount,4,5), g_pCTable,INEXACT))
goto END;
if(!VerifyRowPosition(prghRows[2],GetRatio(m_ulRowCount,4,5)-1, g_pCTable,INEXACT))
goto END;
}
else
{
if(!COMPARE(prghRows, NULL))
goto END;
if(!COMPARE(cRowsObtained, 0))
goto END;
}
fTestPass=TRUE;
END:
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Sequence::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(Sequence_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: Sequence_Cmd - In context of commands
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Sequence_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Sequence::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Sequence_Cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Sequence::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Sequence_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: Sequence_OpenRowset - In context of IOpenRowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Sequence_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Sequence::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Sequence_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Sequence::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Sequence_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: Sequence_SchemaR - In context of Schema Rowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Sequence_SchemaR::Init()
{
BOOL fPass;
if (!SetRowsetType(USESCHEMAR))
return TEST_SKIPPED;
fPass = Sequence::Init();
if(TEST_PASS == fPass)
{
if ( m_ulRowCount < 5 )
return TEST_SKIPPED;
else
return TEST_PASS;
}
else
return fPass;
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Sequence_SchemaR::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Sequence::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: Consistency - Make sure multiple methods can hold the same rows at the same time.
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Consistency::Init()
{
DBPROPID guidPrpt[1];
guidPrpt[0]=DBPROP_CANHOLDROWS;
if(!TCIRowsetScroll::Init())
return FALSE;
// Create a rowset and accessor, requesting DBPROP_CANHOLDROWS
if(!GetRowsetAndAccessor(g_pCTable, SELECT_REVCOLLIST, IID_IRowsetScroll, NUMELEM(guidPrpt),
guidPrpt))
return FALSE;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc Retrieve three row handles from GetRowsAt,GetRowsByBookmark, and GetRowsAtRatio.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Consistency::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark1=(BYTE *)&DBBookmark;
BYTE *rgpBookmarks2[3];
ULONG_PTR rgcbBookmarks2[3];
DBCOUNTITEM cRowsObtained1=0;
DBCOUNTITEM cRowsObtained2=0;
DBCOUNTITEM cRowsObtained3=0;
HROW rghRows1[3]={NULL,NULL,NULL};
HROW *prghRows1=rghRows1;
HROW rghRows2[3]={NULL,NULL,NULL};
HROW *prghRows3=NULL;
IRowsetLocate *pIRowsetLocate=NULL;
BOOL fTestPass=FALSE;
DBREFCOUNT cRefCount;
// QI for IRowsetLocate pointer
if(!CHECK(m_pIRowsetScroll->QueryInterface(IID_IRowsetLocate,
(void **)&pIRowsetLocate),S_OK))
goto END;
// Retrieve the 3rd, 4th, and 5th row handles by calling GetRowsAt
if(!CHECK(pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark1,2,3,
&cRowsObtained1,&prghRows1),S_OK))
goto END;
COMPARE(cRowsObtained1, 3);
// Get the bookmark for the first row
if(!GetBookmark(1,rgcbBookmarks2,rgpBookmarks2))
goto END;
// Get the bookmark for the 2nd row
if(!GetBookmark(2,&rgcbBookmarks2[1],&rgpBookmarks2[1]))
goto END;
// Get the bookmark for the 3rd row
if(!GetBookmark(3,&rgcbBookmarks2[2],&rgpBookmarks2[2]))
goto END;
// Retrieve the 1st, 2nd, and 3rd row handles by call GetRowsByBookmark.
// The 3rd row handle is being retrieved for the second time.
if(!CHECK(pIRowsetLocate->GetRowsByBookmark(NULL,3,rgcbBookmarks2,
(const BYTE **)rgpBookmarks2,rghRows2,NULL),S_OK))
goto END;
// Now retrieve the 3rd row handle again by calling GetRowsAtRatio.
// ulNumerator=3, ulDenominator=last row, cRows=1.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,3,m_ulRowCount,
1,&cRowsObtained3,&prghRows3), S_OK))
goto END;
COMPARE(cRowsObtained3, 1);
// Make sure the 3rd row handle is retrieved three times
if(!CHECK(m_pIRowset->ReleaseRows(1,prghRows3,NULL,&cRefCount,NULL),S_OK))
goto END;
if(COMPARE(cRefCount >= 1, TRUE))
fTestPass=TRUE;
END:
// Free the Bookmark memory allocated
PROVIDER_FREE(rgpBookmarks2[2]);
PROVIDER_FREE(rgpBookmarks2[1]);
PROVIDER_FREE(rgpBookmarks2[0]);
// Release IRowsetLocate pointer
if(pIRowsetLocate)
pIRowsetLocate->Release();
// Release the row handle
if(cRowsObtained1)
CHECK(m_pIRowset->ReleaseRows(3,prghRows1,NULL,NULL,NULL),S_OK);
if(cRowsObtained2)
CHECK(m_pIRowset->ReleaseRows(3,rghRows2,NULL,NULL,NULL),S_OK);
if(prghRows3)
{
if(fTestPass)
{
PROVIDER_FREE(prghRows3);
}
else
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained3, prghRows3, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows3);
}
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc Retrieve three row handles from GetRowsAt,GetRowsByBookmark, and GetRowsAtRatio.
// Check IRowsetScroll inherits from IRowsetLocate
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Consistency::Variation_2()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark1=(BYTE *)&DBBookmark;
BYTE *rgpBookmarks2[3];
ULONG_PTR rgcbBookmarks2[3];
DBCOUNTITEM cRowsObtained1=0;
DBCOUNTITEM cRowsObtained2=0;
DBCOUNTITEM cRowsObtained3=0;
HROW rghRows1[3]={NULL,NULL,NULL};
HROW *prghRows1=rghRows1;
HROW rghRows2[3]={NULL,NULL,NULL};
HROW *prghRows3=NULL;
BOOL fTestPass=FALSE;
DBREFCOUNT cRefCount;
// Retrieve the 3rd, 4th, and 5th row handles by calling GetRowsAt
if(!CHECK(m_pIRowsetScroll->GetRowsAt(NULL,NULL,1,pBookmark1,2,3,
&cRowsObtained1,&prghRows1),S_OK))
goto END;
COMPARE(cRowsObtained1, 3);
// Get the bookmark for the first row
if(!GetBookmark(1,rgcbBookmarks2,rgpBookmarks2))
goto END;
// Get the bookmark for the 2nd row
if(!GetBookmark(2,&rgcbBookmarks2[1],&rgpBookmarks2[1]))
goto END;
// Get the bookmark for the 3rd row
if(!GetBookmark(3,&rgcbBookmarks2[2],&rgpBookmarks2[2]))
goto END;
// Retrieve the 1st, 2nd, and 3rd row handles by call GetRowsByBookmark.
// The 3rd row handle is being retrieved for the second time.
if(!CHECK(m_pIRowsetScroll->GetRowsByBookmark(NULL,3,rgcbBookmarks2,
(const BYTE **)rgpBookmarks2,rghRows2,NULL),S_OK))
goto END;
// Now retrieve the 3rd row handle again by calling GetRowsAtRatio.
// ulNumerator=3, ulDenominator=last row, cRows=1.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,3,m_ulRowCount,
1,&cRowsObtained3,&prghRows3), S_OK))
goto END;
COMPARE(cRowsObtained3, 1);
// Make sure the 3rd row handle is retrieved three times
if(!CHECK(m_pIRowset->ReleaseRows(1,prghRows3,NULL,&cRefCount,NULL),S_OK))
goto END;
if(COMPARE(cRefCount >= 1, TRUE))
fTestPass=TRUE;
END:
// Free the Bookmark memory allocated
PROVIDER_FREE(rgpBookmarks2[2]);
PROVIDER_FREE(rgpBookmarks2[1]);
PROVIDER_FREE(rgpBookmarks2[0]);
// Release the row handle
if(cRowsObtained1)
CHECK(m_pIRowset->ReleaseRows(3,prghRows1,NULL,NULL,NULL),S_OK);
if(cRowsObtained2)
CHECK(m_pIRowset->ReleaseRows(3,rghRows2,NULL,NULL,NULL),S_OK);
if(prghRows3)
{
if(fTestPass)
{
PROVIDER_FREE(prghRows3);
}
else
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained3, prghRows3, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(prghRows3);
}
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Consistency::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(Consistency_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: Consistency_Cmd - In context of commands
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Consistency_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Consistency::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Consistency_Cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Consistency::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Consistency_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: Consistency_OpenRowset - In context of IOpenRowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Consistency_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Consistency::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Consistency_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Consistency::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Consistency_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: Consistency_SchemaR - In context of a schema rowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Consistency_SchemaR::Init()
{
BOOL fPass;
if (!SetRowsetType(USESCHEMAR))
return TEST_SKIPPED;
fPass = Consistency::Init();
if(TEST_PASS == fPass)
{
if ( m_ulRowCount < 5 )
return TEST_SKIPPED;
else
return TEST_PASS;
}
else
return fPass;
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Consistency_SchemaR::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Consistency::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: Related_IRowset - Test related interface IRowset.
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_IRowset::Init()
{
if(!TCIRowsetScroll::Init())
return FALSE;
// Create a rowset and an accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_COLLISTFROMTBL, IID_IRowsetScroll))
return FALSE;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc GetRowsAtRatio does not change the cursor location of the rowset. DB_E_ROWSNOTRELEASED is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_IRowset::Variation_1()
{
HROW rghRows[1];
HROW *prghRows=rghRows;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
if (IsPropertyActive(DBPROP_CANHOLDROWS))
return TEST_SKIPPED; //skip
// Move the cursor position to before the third row.
if(!CHECK(m_pIRowset->GetNextRows(NULL,2,0,&cRowsObtained,&prghRows),S_OK))
goto END;
// No row should have been retrieved.
if(!COMPARE(cRowsObtained, 0))
goto END;
// ulNumerator=0, ulDenominator=last row, cRows=1.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,m_ulRowCount,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
if(!COMPARE(VerifyRowPosition(prghRows[0], 1, g_pCTable,EXACT), TRUE))
goto END;
// IRowset->GetNextRows returns DB_E_ROWSNOTRELEASED
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained,&prghRows),DB_E_ROWSNOTRELEASED))
goto END;
// No row should be retrieved
if(!COMPARE(cRowsObtained,0))
goto END;
// Release the row handle retrieved by IRowsetScroll::GetRowsAtRatio
if(!CHECK(m_pIRowset->ReleaseRows(1,prghRows,NULL,NULL,NULL),S_OK))
goto END;
// IRowset->GetNextRows to retrieve the third row, return S_OK
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained,&prghRows),S_OK))
goto END;
if(!COMPARE(cRowsObtained, 1))
goto END;
if(!COMPARE(VerifyRowPosition(prghRows[0], 3, g_pCTable, EXACT), TRUE) )
goto END;
fTestPass=TRUE;
END:
// Free the row handle
if(cRowsObtained)
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL, NULL, NULL),S_OK);
return fTestPass;
}
//*-----------------------------------------------------------------------
// @mfunc Retrieve rows with GetNextRows and get same rows with GetRowsAtRatio. DB_E_ROWSNOTRELEASED is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_IRowset::Variation_2()
{
DBCOUNTITEM cRowsObtained=0;
HROW rghRows[1];
HROW *prghRows=rghRows;
BOOL fTestPass=FALSE;
if (IsPropertyActive(DBPROP_CANHOLDROWS))
return TEST_SKIPPED; //skip
// Get the first row handle.
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained,&prghRows),S_OK))
goto END;
// IRowsetScroll::GetRowsAtRatio returns DB_E_ROWSNOTRELEASED.
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,m_ulRowCount,
1,&cRowsObtained,&prghRows), DB_E_ROWSNOTRELEASED))
goto END;
// No row should have been retrieved.
if(!COMPARE(cRowsObtained,0))
goto END;
// Release the row handle
if(!CHECK(m_pIRowset->ReleaseRows(1,prghRows,NULL,NULL,NULL),S_OK))
goto END;
// IRowsetScroll::GetRowsAtRatio returns S_OK
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,0,m_ulRowCount,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
// Verify the first row handle is retrieved
if(!VerifyRowPosition(prghRows[0], 1, g_pCTable, EXACT))
goto END;
fTestPass=TRUE;
END:
if(cRowsObtained)
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_IRowset::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(Related_IRowset_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: Related_IRowset_Cmd - In context of commands
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_IRowset_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Related_IRowset::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_IRowset_Cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Related_IRowset::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Related_IRowset_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: Related_IRowset_OpenRowset - In context of IOpenRowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_IRowset_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return (Related_IRowset::Init());
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_IRowset_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Related_IRowset::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Related_IRowset_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: Related_IRowset_SchemaR - In context of a schema Rowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_IRowset_SchemaR::Init()
{
BOOL fPass;
if (!SetRowsetType(USESCHEMAR))
return TEST_SKIPPED;
fPass = Related_IRowset::Init();
if(TEST_PASS == fPass)
{
if ( m_ulRowCount < 5 )
return TEST_SKIPPED;
else
return TEST_PASS;
}
return fPass;
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_IRowset_SchemaR::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(Related_IRowset::Terminate());
} // }}
// }}
// }}
//*-----------------------------------------------------------------------
//| Test Case: KeysetCursor - Test GetRowsAtRatio via a Keyset Driven cursor.
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL KeysetCursor::Init()
{
DBPROPID guidPropertySet[4];
ULONG cPrptSet=0;
if(!TCIRowsetScroll::Init())
return FALSE;
guidPropertySet[cPrptSet]=DBPROP_CANFETCHBACKWARDS;
cPrptSet++;
guidPropertySet[cPrptSet]=DBPROP_CANSCROLLBACKWARDS;
cPrptSet++;
guidPropertySet[cPrptSet]=DBPROP_CANHOLDROWS;
cPrptSet++;
guidPropertySet[cPrptSet]=DBPROP_OTHERUPDATEDELETE;
cPrptSet++;
// Create a rowset and an accessor.
// DBPROP_CANFETCHBACKWARDS, DBPROP_CANSCROLLBACKWARDS and DBPROP_CANHOLDROWS
// are requested
if(!GetRowsetAndAccessor(g_pCTable, SELECT_REVCOLLIST, IID_IRowsetScroll,
cPrptSet, guidPropertySet))
return TEST_SKIPPED;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=1, ulDenominator=20, cRows=(-1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int KeysetCursor::Variation_1()
{
DBCOUNTITEM cRowsObtained;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=1, ulDenominator=20, cRows=(-1).
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,m_ulRowCount,
-1,&cRowsObtained,&prghRows), S_OK))
goto END;
// Only one row should have been retrieved
if(!COMPARE(cRowsObtained, 1))
goto END;
if(!VerifyRowPosition(*prghRows, 2, g_pCTable,INEXACT))
goto END;
fTestPass=TRUE;
END:
// Release the row handle
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL), S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=2, ulDenominator=20, cRows=(-3
//
// @rdesc TEST_PASS or TEST_FAIL
//
int KeysetCursor::Variation_2()
{
DBCOUNTITEM cRowsObtained;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
HRESULT hr;
// ulNumerator=1, ulDenominator=20, cRows=(-3).
hr = m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,m_ulRowCount,-3,&cRowsObtained,&prghRows);
if (!COMPARE(SUCCEEDED(hr),TRUE))
goto END;
if ( hr == DB_S_ENDOFROWSET )
{
if(!COMPARE(cRowsObtained<3, TRUE))
goto END;
}
else
{
odtLog << L"Warning, ideally. DB_S_ENDOFROWSET\n";
if(!COMPARE(cRowsObtained, 3))
goto END;
}
fTestPass=TEST_PASS;
END:
// Release the row handle
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=3, ulDenominator=20, cRows=(-3
//
// @rdesc TEST_PASS or TEST_FAIL
//
int KeysetCursor::Variation_3()
{
DBCOUNTITEM cFirstRowsObtained;
DBCOUNTITEM cSecondRowsObtained;
HROW *pFirsthRow=NULL;
HROW *pSecondhRow=NULL;
BOOL fTestPass=FALSE;
HRESULT hr = E_FAIL;
// ulNumerator=3, ulDenominator=last row, cRows=(-3).
hr = m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,3,m_ulRowCount,
-3,&cFirstRowsObtained,&pFirsthRow);
if ( !COMPARE(hr==S_OK || hr==DB_S_ENDOFROWSET, TRUE) )
goto END;
// The 3rd, 2nd, and 1st row handles should be retrieved
if ( hr == S_OK )
{
if( !COMPARE(cFirstRowsObtained, 3))
goto END;
}
else
{
if ( !COMPARE(cFirstRowsObtained<3, TRUE) )
goto END;
}
if(cFirstRowsObtained > 0 && !VerifyRowPosition(*pFirsthRow, 4, g_pCTable, INEXACT))
goto END;
// ulNumerator=4, ulDenominator=last row, cRows=(-1).
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,4,m_ulRowCount,
-1,&cSecondRowsObtained,&pSecondhRow), S_OK))
goto END;
// Only one row should have been retrieved
if(!COMPARE(cSecondRowsObtained, 1))
goto END;
if(!VerifyRowPosition(*pSecondhRow, 5, g_pCTable, INEXACT))
goto END;
fTestPass=TRUE;
END:
// Release the row handles
if(pFirsthRow)
{
CHECK(m_pIRowset->ReleaseRows(cFirstRowsObtained,pFirsthRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pFirsthRow);
}
// Release the row handles
if(pSecondhRow)
{
CHECK(m_pIRowset->ReleaseRows(cSecondRowsObtained,pSecondhRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pSecondhRow);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc Get one row handle at a time.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int KeysetCursor::Variation_4()
{
DBCOUNTITEM cRowsObtained;
HROW rghRows[1];
HROW *prghRows=rghRows;
DBCOUNTITEM cRowCount;
BOOL fTestPass = TEST_FAIL;
// Get one row handle at a time from the first row
for(cRowCount=0; cRowCount<ULONG(m_ulRowCount); cRowCount++)
{
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,cRowCount,m_ulRowCount,
1,&cRowsObtained,&prghRows), S_OK))
return TEST_FAIL;
if(!VerifyRowPosition(rghRows[0],cRowCount+1,g_pCTable, (cRowCount==0 ? EXACT : INEXACT)))
goto END;
if(!CHECK(m_pIRowset->ReleaseRows(1,rghRows,NULL,NULL,NULL),S_OK))
goto END;
}
//cRowCount=m_ulRowCount;
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,cRowCount,m_ulRowCount,
1,&cRowsObtained,&prghRows), DB_S_ENDOFROWSET))
goto END;
fTestPass = TEST_PASS;
END:
return fTestPass;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL KeysetCursor::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(KeysetCursor_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: KeysetCursor_Cmd - In context of commands
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL KeysetCursor_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
return KeysetCursor::Init();
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL KeysetCursor_Cmd::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(KeysetCursor::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(KeysetCursor_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: KeysetCursor_OpenRowset - In context of IOpenRowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL KeysetCursor_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return KeysetCursor::Init();
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL KeysetCursor_OpenRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(KeysetCursor::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(KeysetCursor_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: KeysetCursor_SchemaR - In context of a Schema Rowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL KeysetCursor_SchemaR::Init()
{
// wrong to ask for Dynamic cursor on Schema Rowset
return TEST_SKIPPED;
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL KeysetCursor_SchemaR::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(KeysetCursor::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(DynamicCursor)
//*-----------------------------------------------------------------------
//| Test Case: DynamicCursor - Test GetRowsAtRatio via a Dynamic cursor.
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL DynamicCursor::Init()
{
DBPROPID guidPropertySet[4];
ULONG cPrptSet=0;
if(!TCIRowsetScroll::Init())
return FALSE;
guidPropertySet[cPrptSet]=DBPROP_CANFETCHBACKWARDS;
cPrptSet++;
guidPropertySet[cPrptSet]=DBPROP_CANSCROLLBACKWARDS;
cPrptSet++;
guidPropertySet[cPrptSet]=DBPROP_CANHOLDROWS;
cPrptSet++;
guidPropertySet[cPrptSet]=DBPROP_OTHERINSERT;
cPrptSet++;
// Create a rowset and an accessor.
// DBPROP_CANFETCHBACKWARDS, DBPROP_CANSCROLLBACKWARDS and DBPROP_CANHOLDROWS
// are requested.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_REVCOLLIST, IID_IRowsetScroll,
cPrptSet, guidPropertySet))
return TEST_SKIPPED;
return TRUE;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=1, ulDenominator=20, cRows=(-1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DynamicCursor::Variation_1()
{
DBCOUNTITEM cRowsObtained;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=1, ulDenominator=last row, cRows=(-1).
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,m_ulRowCount,
-1,&cRowsObtained,&prghRows), S_OK))
goto END;
// Only one row should have been retrieved
if(!COMPARE(cRowsObtained, 1))
goto END;
// The first row should have been retrieved
if(!VerifyRowPosition(prghRows[0], 2, g_pCTable, INEXACT))
goto END;
fTestPass=TRUE;
END:
// Release the row handle
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL), S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=2, ulDenominator=20, cRows=(-3
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DynamicCursor::Variation_2()
{
DBCOUNTITEM cRowsObtained;
HROW *prghRows=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=2, ulDenominator=m_ulRowCount, cRows=(-3).
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,1,m_ulRowCount,
-3,&cRowsObtained,&prghRows), DB_S_ENDOFROWSET))
goto END;
// Two rows should have been retrieved
if(!COMPARE(cRowsObtained, 2))
goto END;
// Verify the ows
if(!VerifyRowPosition(prghRows[0], 2, g_pCTable, INEXACT))
goto END;
if(!VerifyRowPosition(prghRows[1], 1, g_pCTable, INEXACT))
goto END;
fTestPass=TRUE;
END:
// Release the row handle
if(prghRows)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,prghRows,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(prghRows);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc ulNumerator=3, ulDenominator=20, cRows=(-3
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DynamicCursor::Variation_3()
{
DBCOUNTITEM cFirstRowsObtained;
DBCOUNTITEM cSecondRowsObtained;
HROW *pFirsthRow=NULL;
HROW *pSecondhRow=NULL;
BOOL fTestPass=FALSE;
// ulNumerator=3, ulDenominator=last row, cRows=(-3).
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,3,m_ulRowCount,
-3,&cFirstRowsObtained,&pFirsthRow), S_OK))
goto END;
// Three rows should have been retrieved
if(!COMPARE(cFirstRowsObtained, 3))
goto END;
if(!VerifyRowPosition(*pFirsthRow, 4, g_pCTable, INEXACT))
goto END;
// ulNumerator=4, ulDenominator=last row, cRows=(-1).
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,4,m_ulRowCount,
-1,&cSecondRowsObtained,&pSecondhRow), S_OK))
goto END;
// Only one row should have been retrieved
if(!COMPARE(cSecondRowsObtained, 1))
{
fTestPass = FALSE;
goto END;
}
// The 4th row handle should have been retrieved
if(!VerifyRowPosition(*pSecondhRow, 5, g_pCTable, INEXACT))
goto END;
fTestPass=TRUE;
END:
// Release the row handles
if(pFirsthRow)
{
CHECK(m_pIRowset->ReleaseRows(cFirstRowsObtained,pFirsthRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pFirsthRow);
}
// Release the row handles
if(pSecondhRow)
{
CHECK(m_pIRowset->ReleaseRows(cSecondRowsObtained,pSecondhRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pSecondhRow);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
//*-----------------------------------------------------------------------
// @mfunc Get one row handle at a time.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DynamicCursor::Variation_4()
{
DBCOUNTITEM cRowsObtained;
HROW rghRows[1];
HROW *prghRows=rghRows;
DBCOUNTITEM cRowCount;
BOOL fTestPass = TEST_FAIL;
// Get one row handle at a time from the first row
for(cRowCount=0; cRowCount < m_ulRowCount; cRowCount++)
{
if(!CHECK(m_pIRowsetScroll->GetRowsAtRatio(NULL,NULL,cRowCount,m_ulRowCount,
1,&cRowsObtained,&prghRows), S_OK))
return TEST_FAIL;
// Verify the row position
if(!VerifyRowPosition(rghRows[0],cRowCount+1,g_pCTable,(cRowCount == 0 ? EXACT : INEXACT)))
goto END;
if(!CHECK(m_pIRowset->ReleaseRows(1,rghRows,NULL,NULL,NULL),S_OK))
goto END;
}
fTestPass = TEST_PASS;
END:
return fTestPass;
}
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL DynamicCursor::Terminate()
{
ReleaseRowsetAndAccessor();
return(TCIRowsetScroll::Terminate());
}
// {{ TCW_TC_PROTOTYPE(DynamicCursor_Cmd)
//*-----------------------------------------------------------------------
//| Test Case: DynamicCursor_Cmd - In context of commands
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL DynamicCursor_Cmd::Init()
{
if (!SetRowsetType(USECOMMAND))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return DynamicCursor::Init();
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL DynamicCursor_Cmd::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(DynamicCursor::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(DynamicCursor_OpenRowset)
//*-----------------------------------------------------------------------
//| Test Case: DynamicCursor_OpenRowset - In context of IOpenRowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL DynamicCursor_OpenRowset::Init()
{
if (!SetRowsetType(USEOPENROWSET))
return TEST_SKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
return DynamicCursor::Init();
// }}
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL DynamicCursor_OpenRowset::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(DynamicCursor::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(DynamicCursor_SchemaR)
//*-----------------------------------------------------------------------
//| Test Case: DynamicCursor_SchemaR - In context of a Schema Rowset
//| Created: 09/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL DynamicCursor_SchemaR::Init()
{
// wrong to ask for Dynamic cursor on Schema Rowset
return TEST_SKIPPED;
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL DynamicCursor_SchemaR::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(DynamicCursor::Terminate());
} // }}
// }}
// }}
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Zombie::Init()
{
if(!CTransaction::Init())
return TEST_SKIPPED;
m_cProperty=1;
m_DBPropSet.guidPropertySet=DBPROPSET_ROWSET;
m_DBPropSet.cProperties=m_cProperty;
m_DBPropSet.rgProperties=m_rgProperty;
// Get key cursor & IRowsetChange
m_rgProperty[0].dwPropertyID=DBPROP_IRowsetScroll;
m_rgProperty[0].dwOptions=DBPROPOPTIONS_REQUIRED;
m_rgProperty[0].vValue.vt=VT_BOOL;
V_BOOL(&m_rgProperty[0].vValue)=VARIANT_TRUE;
// Register interface to be tested
if(!RegisterInterface(ROWSET_INTERFACE, IID_IRowsetScroll, 1, &m_DBPropSet))
return TEST_SKIPPED;
return TRUE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Commit with fRetaining=TRUE. Query based.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Zombie::Variation_1()
{
DBCOUNTITEM cRowsObtained;
HROW rghRows[1];
HROW *prghRows=rghRows;
BOOL fTestPass=FALSE;
IRowsetScroll *pIRowsetScroll=NULL;
// Start a transaction. Create a rowset with IRowsetScroll pointer.
if(!StartTransaction(SELECT_ORDERBYNUMERIC, (IUnknown **)&pIRowsetScroll,
1, &m_DBPropSet))
goto END;
// ulNumerator=50, ulDenominator=100, cRows=1.
if(!CHECK(pIRowsetScroll->GetRowsAtRatio(NULL,NULL,50,100,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
if(!CHECK(m_pIRowset->ReleaseRows(1,prghRows,NULL,NULL,NULL),S_OK))
goto END;
prghRows=NULL;
// Commit the transaction with fRetaining==TRUE
if(!GetCommit(TRUE))
goto END;
if(!m_fCommitPreserve)
{
// Test zombie
if(CHECK(pIRowsetScroll->GetRowsAtRatio(NULL,NULL,50,100,
1,&cRowsObtained,&prghRows), E_UNEXPECTED))
{
if((COMPARE(cRowsObtained, 0)) && (COMPARE(prghRows, NULL)))
fTestPass=TRUE;
goto END;
}
}
else // fully functional
{
// ulNumerator=50, ulDenominator=100, cRows=1.
if(!CHECK(pIRowsetScroll->GetRowsAtRatio(NULL,NULL,50,100,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
// One row should have been retrieved
if(COMPARE(cRowsObtained, 1))
fTestPass=TRUE;
}
END:
// Release the row handle
if(prghRows)
CHECK(m_pIRowset->ReleaseRows(1,prghRows,NULL,NULL,NULL),S_OK);
SAFE_RELEASE(pIRowsetScroll);
// Clean up. Expected S_OK.
CleanUpTransaction(S_OK);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Commit with fRetaining=FALSE. Cursor based.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Zombie::Variation_2()
{
DBCOUNTITEM cRowsObtained;
HROW rghRows[1];
HROW *prghRows=rghRows;
BOOL fTestPass=FALSE;
IRowsetScroll *pIRowsetScroll=NULL;
// Start a transaction. Create a rowset with IRowsetScroll pointer.
// Cursor based update
if(!StartTransaction(SELECT_ORDERBYNUMERIC, (IUnknown **)&pIRowsetScroll,
1, &m_DBPropSet))
goto END;
// ulNumerator=77, ulDenominator=435, cRows=1.
if(!CHECK(pIRowsetScroll->GetRowsAtRatio(NULL,NULL,77,435,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
if(!CHECK(m_pIRowset->ReleaseRows(1,prghRows,NULL,NULL,NULL),S_OK))
goto END;
prghRows=NULL;
// Commit the transaction with fRetaining==FALSE
if(!GetCommit(FALSE))
goto END;
if(!m_fCommitPreserve)
{
// Test zombie
if(CHECK(pIRowsetScroll->GetRowsAtRatio(NULL,NULL,50,100,
1,&cRowsObtained,&prghRows), E_UNEXPECTED))
{
if((COMPARE(cRowsObtained, 0)) && (COMPARE(prghRows, NULL)))
fTestPass=TRUE;
goto END;
}
}
else // fully functional
{
// ulNumerator=50, ulDenominator=100, cRows=1.
if(!CHECK(pIRowsetScroll->GetRowsAtRatio(NULL,NULL,50,100,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
// One row should have been retrieved
if(COMPARE(cRowsObtained, 1))
fTestPass=TRUE;
}
END:
// Release the row handle
if(prghRows)
CHECK(m_pIRowset->ReleaseRows(1,prghRows,NULL,NULL,NULL),S_OK);
SAFE_RELEASE(pIRowsetScroll);
// Clean up. Expected XACT_E_NOTRANSACTION.
CleanUpTransaction(XACT_E_NOTRANSACTION);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Abort with fRetaining=TRUE. Cursor based.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Zombie::Variation_3()
{
DBCOUNTITEM cRowsObtained;
HROW rghRows[1];
HROW *prghRows=rghRows;
BOOL fTestPass=FALSE;
IRowsetScroll *pIRowsetScroll=NULL;
// Start a transaction. Create a rowset with IRowsetScroll pointer.
// Cursor based update
if(!StartTransaction(SELECT_ORDERBYNUMERIC, (IUnknown **)&pIRowsetScroll,
1, &m_DBPropSet))
goto END;
// ulNumerator=111, ulDenominator=999, cRows=1.
if(!CHECK(pIRowsetScroll->GetRowsAtRatio(NULL,NULL,111,999,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
if(!CHECK(m_pIRowset->ReleaseRows(1,prghRows,NULL,NULL,NULL),S_OK))
goto END;
prghRows=NULL;
// Abort the transaction with fRetaining==TRUE
if(!GetAbort(TRUE))
goto END;
if(!m_fAbortPreserve)
{
// Test zombie
if(CHECK(pIRowsetScroll->GetRowsAtRatio(NULL,NULL,50,100,
1,&cRowsObtained,&prghRows), E_UNEXPECTED))
{
if((COMPARE(cRowsObtained, 0)) && (COMPARE(prghRows, NULL)))
fTestPass=TRUE;
goto END;
}
}
else // fully functional
{
// ulNumerator=50, ulDenominator=100, cRows=1.
if(!CHECK(pIRowsetScroll->GetRowsAtRatio(NULL,NULL,50,100,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
// One row should have been retrieved
if(COMPARE(cRowsObtained, 1))
fTestPass=TRUE;
}
END:
// Release the row handle
if(prghRows)
CHECK(m_pIRowset->ReleaseRows(1,prghRows,NULL,NULL,NULL),S_OK);
SAFE_RELEASE(pIRowsetScroll);
// Clean up
CleanUpTransaction(S_OK);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Abort with fRetaining=FALSE. Query based.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Zombie::Variation_4()
{
DBCOUNTITEM cRowsObtained;
HROW rghRows[1];
HROW *prghRows=rghRows;
BOOL fTestPass=FALSE;
IRowsetScroll *pIRowsetScroll=NULL;
// Start a transaction. Create a rowset with IRowsetScroll pointer.
// Query based update.
if(!StartTransaction(SELECT_ORDERBYNUMERIC, (IUnknown **)&pIRowsetScroll,
1, &m_DBPropSet))
goto END;
// ulNumerator=555, ulDenominator=1100, cRows=1.
if(!CHECK(pIRowsetScroll->GetRowsAtRatio(NULL,NULL,555,1100,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
if(!CHECK(m_pIRowset->ReleaseRows(1,prghRows,NULL,NULL,NULL),S_OK))
goto END;
prghRows=NULL;
// Abort the transaction with fRetaining==FALSE
if(!GetAbort(FALSE))
goto END;
if(!m_fAbortPreserve)
{
// Test zombie
if(CHECK(pIRowsetScroll->GetRowsAtRatio(NULL,NULL,50,100,
1,&cRowsObtained,&prghRows), E_UNEXPECTED))
{
if((COMPARE(cRowsObtained, 0)) && (COMPARE(prghRows, NULL)))
fTestPass=TRUE;
goto END;
}
}
else // fully functional
{
// ulNumerator=50, ulDenominator=100, cRows=1.
if(!CHECK(pIRowsetScroll->GetRowsAtRatio(NULL,NULL,50,100,
1,&cRowsObtained,&prghRows), S_OK))
goto END;
// One row should have been retrieved
if(COMPARE(cRowsObtained, 1))
fTestPass=TRUE;
}
END:
// Release the row handle
if(prghRows)
CHECK(m_pIRowset->ReleaseRows(1,prghRows,NULL,NULL,NULL),S_OK);
SAFE_RELEASE(pIRowsetScroll);
//clean up
CleanUpTransaction(XACT_E_NOTRANSACTION);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Zombie::Terminate()
{
return(CTransaction::Terminate());
}
// }}