[PATCH 6/8] msado15: Implement _Recordset_MoveFirst and _Recordset_MoveLast.
Hans Leidekker
hans at codeweavers.com
Fri Dec 13 08:52:29 CST 2019
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/msado15/recordset.c | 16 +++++--
dlls/msado15/tests/msado15.c | 84 +++++++++++++++++++++++++++++++++++-
2 files changed, 95 insertions(+), 5 deletions(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c
index b2bc93bb9c..cd623d0dc8 100644
--- a/dlls/msado15/recordset.c
+++ b/dlls/msado15/recordset.c
@@ -987,14 +987,22 @@ static HRESULT WINAPI recordset_MovePrevious( _Recordset *iface )
static HRESULT WINAPI recordset_MoveFirst( _Recordset *iface )
{
- FIXME( "%p\n", iface );
- return E_NOTIMPL;
+ struct recordset *recordset = impl_from_Recordset( iface );
+
+ TRACE( "%p\n", recordset );
+
+ recordset->index = 0;
+ return S_OK;
}
static HRESULT WINAPI recordset_MoveLast( _Recordset *iface )
{
- FIXME( "%p\n", iface );
- return E_NOTIMPL;
+ struct recordset *recordset = impl_from_Recordset( iface );
+
+ TRACE( "%p\n", recordset );
+
+ recordset->index = (recordset->count > 0) ? recordset->count - 1 : 0;
+ return S_OK;
}
static HRESULT WINAPI recordset_Open( _Recordset *iface, VARIANT source, VARIANT active_connection,
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index 992fb4e8ce..61040f691e 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -61,8 +61,9 @@ static void test_Recordset(void)
{
_Recordset *recordset;
Fields *fields, *fields2;
+ Field *field;
LONG refs, count, state;
- VARIANT missing;
+ VARIANT missing, val, index;
BSTR name;
HRESULT hr;
@@ -131,6 +132,11 @@ static void test_Recordset(void)
name = SysAllocString( L"field" );
hr = Fields__Append( fields, name, adInteger, 4, adFldUnspecified );
ok( hr == S_OK, "got %08x\n", hr );
+
+ V_VT( &index ) = VT_BSTR;
+ V_BSTR( &index ) = name;
+ hr = Fields_get_Item( fields, index, &field );
+ ok( hr == S_OK, "got %08x\n", hr );
SysFreeString( name );
hr = _Recordset_Open( recordset, missing, missing, adOpenStatic, adLockBatchOptimistic, adCmdUnspecified );
@@ -158,6 +164,81 @@ static void test_Recordset(void)
ok( hr == S_OK, "got %08x\n", hr );
ok( count == 1, "got %d\n", count );
+ /* get_Fields still returns the same object */
+ hr = _Recordset_get_Fields( recordset, &fields2 );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( fields2 == fields, "expected same object\n" );
+ Fields_Release( fields2 );
+
+ count = -1;
+ hr = Fields_get_Count( fields2, &count );
+ ok( count == 1, "got %d\n", count );
+
+ hr = Field_get_Value( field, &val );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( V_VT( &val ) == VT_EMPTY, "got %u\n", V_VT( &val ) );
+
+ V_VT( &val ) = VT_I4;
+ V_I4( &val ) = -1;
+ hr = Field_put_Value( field, val );
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ V_VT( &val ) = VT_ERROR;
+ V_ERROR( &val ) = DISP_E_PARAMNOTFOUND;
+ hr = Field_get_Value( field, &val );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( V_VT( &val ) == VT_I4, "got %u\n", V_VT( &val ) );
+ ok( V_I4( &val ) == -1, "got %d\n", V_I4( &val ) );
+
+ hr = _Recordset_AddNew( recordset, missing, missing );
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ /* field object returns different value after AddNew */
+ V_VT( &val ) = VT_ERROR;
+ V_ERROR( &val ) = DISP_E_PARAMNOTFOUND;
+ hr = Field_get_Value( field, &val );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( V_VT( &val ) == VT_EMPTY, "got %u\n", V_VT( &val ) );
+
+ ok( !is_eof( recordset ), "eof\n" );
+ ok( !is_bof( recordset ), "bof\n" );
+ hr = _Recordset_MoveFirst( recordset );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !is_eof( recordset ), "eof\n" );
+ ok( !is_bof( recordset ), "bof\n" );
+
+ V_VT( &val ) = VT_ERROR;
+ V_ERROR( &val ) = DISP_E_PARAMNOTFOUND;
+ hr = Field_get_Value( field, &val );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( V_VT( &val ) == VT_I4, "got %u\n", V_VT( &val ) );
+ ok( V_I4( &val ) == -1, "got %d\n", V_I4( &val ) );
+
+ hr = _Recordset_MoveNext( recordset );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !is_eof( recordset ), "eof\n" );
+ ok( !is_bof( recordset ), "not bof\n" );
+
+ hr = _Recordset_MoveNext( recordset );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( is_eof( recordset ), "not eof\n" );
+ ok( !is_bof( recordset ), "bof\n" );
+
+ hr = _Recordset_MoveFirst( recordset );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !is_eof( recordset ), "eof\n" );
+ ok( !is_bof( recordset ), "bof\n" );
+
+ hr = _Recordset_MovePrevious( recordset );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !is_eof( recordset ), "eof\n" );
+ ok( is_bof( recordset ), "not bof\n" );
+
+ /* try get value at BOF */
+ VariantInit( &val );
+ hr = Field_get_Value( field, &val );
+ ok( hr == MAKE_ADO_HRESULT( adErrNoCurrentRecord ), "got %08x\n", hr );
+
hr = _Recordset_Close( recordset );
ok( hr == S_OK, "got %08x\n", hr );
@@ -166,6 +247,7 @@ static void test_Recordset(void)
ok( hr == S_OK, "got %08x\n", hr );
ok( state == adStateClosed, "got %d\n", state );
+ Field_Release( field );
Fields_Release( fields );
_Recordset_Release( recordset );
}
--
2.20.1
More information about the wine-devel
mailing list