contentstorage/castorage/tsrc/t_castorage/src/castoragetestorganize.cpp
changeset 117 c63ee96dbe5f
--- /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);
+}