--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/contentstorage/castorage/tsrc/t_castorage/src/castoragetestorganize.cpp Thu Sep 16 12:11:40 2010 +0100
@@ -0,0 +1,366 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+/*
+ * castoragetestorganize.cpp
+ *
+ * Created on: 2009-08-14
+ * Author: maciej.walczynski
+ */
+
+#include "castoragetest.h"
+#include "caoperationparams.h"
+#include "castorage.h"
+#include "caarraycleanup.inl"
+#include "castoragetestsqlcommands.h"
+#include "casqlcommands.h"
+#include "cainnerentry.h"
+#include "casqlitestorage.h"
+#include "casqlquery.h"
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCAStorageTest::testOrganizeRemove()
+{
+ TInt err(KErrNone);
+
+ __UHEAP_MARK;
+ TRAP(err,
+ RArray<TInt> entryIds;
+ CleanupClosePushL(entryIds);
+ entryIds.AppendL(15);
+ entryIds.AppendL(16);
+
+ TCaOperationParams organizeParams;
+ organizeParams.iGroupId = 12;
+ organizeParams.iOperationType = TCaOperationParams::ERemove;
+ mStorage->OrganizeL(entryIds, organizeParams);
+
+ CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC();
+ innerQuery->SetParentId(12);
+ RPointerArray<CCaInnerEntry> resultArray;
+ CleanupResetAndDestroyPushL(resultArray);
+ mStorage->GetEntriesL(innerQuery, resultArray);
+
+ // Check that entries with ids 15 and 16 are not in group 12
+ for (TInt j = 0; j < entryIds.Count(); j++) {
+ for (TInt i = 0; i < resultArray.Count(); i++) {
+ if (resultArray[i]->GetId() == entryIds[j]) {
+ err = KErrWrongData;
+ break;
+ }
+ }
+ }
+
+ CleanupStack::PopAndDestroy(&resultArray);
+ CleanupStack::PopAndDestroy(innerQuery);
+ CleanupStack::PopAndDestroy(&entryIds);
+ );
+ __UHEAP_MARKEND;
+
+ QCOMPARE(err, KErrNone);
+}
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCAStorageTest::testOrganizeAppend()
+{
+ TInt err(KErrNone);
+
+ __UHEAP_MARK;
+ TRAP(err,
+ RArray<TInt> entryIds;
+ CleanupClosePushL(entryIds);
+ entryIds.AppendL(8);
+ entryIds.AppendL(7);
+
+ TCaOperationParams organizeParams;
+ organizeParams.iGroupId = 3;
+ organizeParams.iOperationType = TCaOperationParams::EAppend;
+ mStorage->OrganizeL(entryIds,organizeParams);
+
+ CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC();
+ innerQuery->SetParentId(3);
+ innerQuery->SetSort(CCaInnerQuery::Default);
+ RPointerArray<CCaInnerEntry> resultArray;
+ CleanupResetAndDestroyPushL(resultArray);
+ mStorage->GetEntriesL(innerQuery, resultArray);
+
+ TInt j = resultArray.Count() - 1;
+ for (TInt i = entryIds.Count() - 1; i >= 0; i--, j--) {
+ if (resultArray[j]->GetId() != entryIds[i]) {
+ err = KErrWrongData;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(&resultArray);
+ CleanupStack::PopAndDestroy(innerQuery);
+ CleanupStack::PopAndDestroy(&entryIds);
+ );
+
+ __UHEAP_MARKEND;
+
+ QCOMPARE(err, KErrNone);
+}
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCAStorageTest::testOrganizePrepend()
+{
+ TInt err(KErrNone);
+
+ __UHEAP_MARK;
+ TRAP(err,
+ RArray<TInt> entryIds;
+ CleanupClosePushL(entryIds);
+ entryIds.AppendL(8);
+ entryIds.AppendL(7);
+
+ TCaOperationParams organizeParams;
+ organizeParams.iGroupId = 3;
+ organizeParams.iOperationType = TCaOperationParams::EPrepend;
+ mStorage->OrganizeL(entryIds,organizeParams);
+
+ CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC();
+ innerQuery->SetParentId(3);
+ innerQuery->SetSort(CCaInnerQuery::Default);
+ RPointerArray<CCaInnerEntry> resultArray;
+ CleanupResetAndDestroyPushL(resultArray);
+ mStorage->GetEntriesL(innerQuery, resultArray);
+
+ TInt j = 0;
+ for (TInt i = 0; i < entryIds.Count(); i++, j++) {
+ if (resultArray[j]->GetId() != entryIds[i]) {
+ err = KErrWrongData;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(&resultArray);
+ CleanupStack::PopAndDestroy(innerQuery);
+ CleanupStack::PopAndDestroy(&entryIds);
+ );
+ __UHEAP_MARKEND;
+
+ QCOMPARE(err, KErrNone);
+}
+
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCAStorageTest::testOrganizeInsertNewIntoGroup()
+{
+ TInt err(KErrNone);
+
+ __UHEAP_MARK;
+ TRAP(err,
+ //insert somewhere in the middle
+ RArray<TInt> entryIds;
+ CleanupClosePushL(entryIds);
+ TInt newInsertEntryId = 7;
+
+ entryIds.AppendL(newInsertEntryId);
+
+ CCaInnerQuery *innerQuery = CCaInnerQuery::NewLC();
+ innerQuery->SetParentId(2);
+ innerQuery->SetSort(CCaInnerQuery::Default);
+
+ RPointerArray<CCaInnerEntry> resultArray1;
+ CleanupResetAndDestroyPushL(resultArray1);
+ mStorage->GetEntriesL(innerQuery, resultArray1);
+
+ TInt count = resultArray1.Count();
+ TInt insertPosition = count / 2;
+ TInt beforeId = resultArray1[insertPosition - 1]->GetId();
+
+ TCaOperationParams organizeParams;
+ organizeParams.iGroupId = 2;
+ organizeParams.iBeforeEntryId = beforeId;
+ organizeParams.iOperationType = TCaOperationParams::EInsert;
+ mStorage->OrganizeL(entryIds,organizeParams);
+
+ RPointerArray<CCaInnerEntry> resultArray2;
+ CleanupResetAndDestroyPushL(resultArray2);
+ mStorage->GetEntriesL(innerQuery, resultArray2);
+
+ TInt idNew = resultArray2[ insertPosition - 1 ]->GetId();
+ err = (resultArray2[ insertPosition - 1 ]->GetId() == newInsertEntryId) ? err : KErrWrongData;
+ err = (resultArray2[ insertPosition ]->GetId() == beforeId) ? err : KErrWrongData;
+
+ //insert into 1st position (prepend)
+
+ CCaSqLiteStorage *storage = STATIC_CAST(CCaSqLiteStorage *,mStorage);
+ CCaSqlQuery *query = CCaSqlQuery::NewLC(storage->iSqlDb);
+ query->SetQueryL(KSQLGetUnexistingIdFromGroup);
+ query->PrepareL();
+ query->BindIntL(query->iStatement.ParameterIndex(KSQLGEIdGroup), KAllCollectionsGroupId);
+ TInt unexistingIdInGroup;
+ query->ExecuteL(unexistingIdInGroup);
+ query->CloseStatement();
+ entryIds.Reset();
+ entryIds.AppendL(unexistingIdInGroup);
+ TInt idFirst = resultArray2[ 0 ]->GetId();
+ organizeParams.iBeforeEntryId = idFirst;
+ mStorage->OrganizeL(entryIds,organizeParams);
+
+ RPointerArray<CCaInnerEntry> resultArray3;
+ CleanupResetAndDestroyPushL(resultArray3);
+ mStorage->GetEntriesL(innerQuery, resultArray3);
+
+ err = (resultArray3[ 0 ]->GetId() == unexistingIdInGroup) ? err : KErrWrongData;
+
+ //insert before unexisting item
+ TInt unexistingIdInGroup1;
+ TInt unexistingIdInGroup2;
+ query->SetQueryL(KSQLGetUnexistingIdFromGroup);
+ query->PrepareL();
+ query->BindIntL(query->iStatement.ParameterIndex(KSQLGEIdGroup), KAllCollectionsGroupId);
+ query->ExecuteL(unexistingIdInGroup1);
+ unexistingIdInGroup2 = unexistingIdInGroup1 + 1;
+ query->CloseStatement();
+ organizeParams.iBeforeEntryId = unexistingIdInGroup1;
+ entryIds.Reset();
+ entryIds.AppendL(unexistingIdInGroup2);
+
+ TInt unexistingBeforeIdError(KErrNone);
+ TRAP(unexistingBeforeIdError, mStorage->OrganizeL(entryIds,organizeParams));
+ if (KErrNone == unexistingBeforeIdError) {
+ err = KErrBadParams;
+}
+
+CleanupStack::PopAndDestroy(&resultArray3);
+CleanupStack::PopAndDestroy(query);
+CleanupStack::PopAndDestroy(&resultArray2);
+CleanupStack::PopAndDestroy(&resultArray1);
+CleanupStack::PopAndDestroy(innerQuery);
+CleanupStack::PopAndDestroy(&entryIds);
+ );
+ __UHEAP_MARKEND;
+ QCOMPARE(err, KErrNone);
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCAStorageTest::testOrganizeBadParams()
+{
+ TInt err(KErrNone);
+ __UHEAP_MARK;
+ TRAP(err,
+ RArray<TInt> errorArray;
+ CleanupClosePushL(errorArray);
+ RArray<TInt> entryIds;
+ CleanupClosePushL(entryIds);
+ TCaOperationParams organizeParams;
+ CCaSqLiteStorage *storage = STATIC_CAST(CCaSqLiteStorage *,mStorage);
+ CCaSqlQuery *query = CCaSqlQuery::NewLC(storage->iSqlDb);
+
+ query->SetQueryL(KSQLGetUnexistingIdFromGroup);
+ query->PrepareL();
+ query->BindIntL(query->iStatement.ParameterIndex(KSQLGEIdGroup), KAllCollectionsGroupId);
+ TInt unexistingIdInGroup;
+ query->ExecuteL(unexistingIdInGroup);
+ query->CloseStatement();
+ organizeParams.iOperationType = TCaOperationParams::ERemove;
+ entryIds.Append(unexistingIdInGroup);
+ entryIds.Append(unexistingIdInGroup + 1);
+ TRAP(err, mStorage->OrganizeL(entryIds,organizeParams));
+ errorArray.AppendL(err);
+ err = KErrNone;
+ entryIds.Reset();
+
+ organizeParams.iOperationType = TCaOperationParams::EInsert;
+ organizeParams.iBeforeEntryId = unexistingIdInGroup;
+ entryIds.Append(unexistingIdInGroup + 1);
+ TRAP(err, mStorage->OrganizeL(entryIds,organizeParams));
+ errorArray.AppendL(err);
+ err = KErrNone;
+
+ for (TInt i = 0; i < errorArray.Count(); i++) {
+ if (errorArray[i] == 0) {
+ err = KErrBadParams;
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(query);
+ CleanupStack::PopAndDestroy(&entryIds);
+ CleanupStack::PopAndDestroy(&errorArray);
+ );
+ __UHEAP_MARKEND;
+ QCOMPARE(err, KErrNone);
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CCAStorageTest::testCustomSort()
+{
+ TInt err(KErrNone);
+ __UHEAP_MARK;
+ TRAP(err,
+ const TInt KGroupId = 12;
+
+ RArray<TInt> entryIds;
+ CleanupClosePushL(entryIds);
+ RArray<TInt> entryIdsFromDb;
+ CleanupClosePushL(entryIdsFromDb);
+
+ // array with custom sorted ids
+ entryIds.AppendL(14); // 13
+ entryIds.AppendL(15); // 14
+ entryIds.AppendL(13); // 15
+ entryIds.AppendL(16); // 16
+ entryIds.AppendL(17); // 17
+
+ // test
+ mStorage->CustomSortL(entryIds, KGroupId);
+
+ // check results
+ CCaSqLiteStorage *storage = STATIC_CAST(CCaSqLiteStorage *, mStorage);
+ CCaSqlQuery *query = CCaSqlQuery::NewLC(storage->iSqlDb);
+ query->SetQueryL(KSQLGetEntryIdsFromGroupInPositionOrder);
+ query->PrepareL();
+ query->BindIntL(query->iStatement.ParameterIndex(KSQLGEIdGroup), KGroupId);
+ TInt count = query->ExecuteL(entryIdsFromDb, CCaSqlQuery::EGroupTable);
+ query->CloseStatement();
+
+ for (TInt i=0; i<entryIds.Count(); i++) {
+ if (entryIds[i] != entryIdsFromDb[i]) {
+ err = KErrBadParams;
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(query);
+ CleanupStack::PopAndDestroy(&entryIdsFromDb);
+ CleanupStack::PopAndDestroy(&entryIds);
+ );
+ __UHEAP_MARKEND;
+ QCOMPARE(err, KErrNone);
+}