photosgallery/viewframework/medialists/tsrc/src/glxlisttestbase.inl
changeset 0 4e91876724a2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/viewframework/medialists/tsrc/src/glxlisttestbase.inl	Thu Dec 17 08:45:44 2009 +0200
@@ -0,0 +1,893 @@
+/*
+* Copyright (c) 2007 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:    Unit tests
+*
+*/
+
+
+
+
+#include "glxlistreconstruction.h"
+
+#include <digia/eunit/eunitmacros.h>
+#include <digia/eunit/eunitdecorators.h>
+#include <mpxcollectionpath.h>
+#include <glxlistdefs.h>
+#include <glxpanic.h>
+
+#include "glxmediastaticitemdefs.h"
+
+const TGlxIdSpaceId KListIdSpace( 1 );
+      
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+CGlxListTestBase< _List, _Reconstruction >::~CGlxListTestBase() 
+    {
+    DeleteMembers();
+    }
+    
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+void CGlxListTestBase< _List, _Reconstruction >::DeleteMembers()
+    {
+    delete iReconstruction;
+    iReconstruction = NULL;
+    delete iList;
+    iList = NULL;
+    iMediaPool.ResetAndDestroy();
+    }
+    
+// -----------------------------------------------------------------------------
+// Ignore
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >::GetRequiredAttributesL( 
+        TInt /*aIndex*/, RArray< TMPXAttribute >& /*aAttributes*/ )
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// Ignore
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >
+        ::HandleAttributesAvailableL(TInt /*aIndex*/, 
+            const RArray< TMPXAttribute >& /*aAttributes*/ )
+    {
+    }    
+    
+// -----------------------------------------------------------------------------
+// Ignore
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >
+        ::RemoveReference( TInt /*aIndex*/ )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// Ignore
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >
+        ::HandleError( TInt /*aError*/ )
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// MGlxMediaPool::Media implementation
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+CGlxMedia* CGlxListTestBase< _List, _Reconstruction >
+        ::Media( const TGlxIdSpaceId& /*aIdSpaceId*/, const TGlxMediaId& /*aId*/) const  
+    {
+    return NULL;
+    }
+    
+// -----------------------------------------------------------------------------
+// Create a list from string
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >
+        ::CreateListL( const TDesC8& aString )
+    {
+    CMPXCollectionPath* path = CreatePathLC( aString );
+
+    // Create reconstruction
+    CreateReconstructionL();
+    
+    // Delete media items
+    iMediaPool.ResetAndDestroy();
+    
+    // Create list
+    delete iList;
+    iList = NULL;
+    iList = _List::NewL( KListIdSpace, *iReconstruction, *this );
+    iReconstruction->SetList( *iList );
+    // Set the contents of the old list
+    iList->SetContentsL( *path, *this );
+    // Reset for test
+    iReconstruction->ClearNotifications();
+
+    CleanupStack::PopAndDestroy(path );
+    }
+
+// -----------------------------------------------------------------------------
+// Create a list from string
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >
+        ::CreateListL( const TDesC8& aString, const TDesC8& aLinkedToMedia )
+    {
+    // Create list
+    CreateListL( aString );
+
+    // Link to media
+    for ( TInt i = 0; i < aLinkedToMedia.Length(); i++)
+        {
+        if ( aLinkedToMedia[ i ] == 't' )
+            {
+            CGlxMedia* media = new (ELeave) CGlxMedia( iList->Item( i ).Id() );
+            CleanupStack::PushL( media );
+            iMediaPool.AppendL( media );
+            CleanupStack::Pop( media );
+
+            media->ReserveUsersL( 1 );
+            iList->Item(i).SetMedia( media, *this);
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Create a list from string
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >
+        ::CreateListL( const TDesC8& aString, TBool aStaticItemsEnabled,
+            NGlxListTestHelpers::TStaticItemInfo::TData* aStaticItemInfos )
+    {
+    // Create list
+    CreateListL( aString );
+    // Add static items, if any
+    AddStaticItemsL( aStaticItemInfos );
+    // Enable/disable static items
+    iList->SetStaticItemsEnabled( aStaticItemsEnabled );
+    // Reset for test
+    iReconstruction->ClearNotifications();
+    }
+
+// -----------------------------------------------------------------------------
+// Create reconstruction
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >::CreateReconstructionL()
+    {
+    delete iReconstruction;
+    iReconstruction = NULL;
+    iReconstruction = _Reconstruction::NewL();
+    }
+    
+// -----------------------------------------------------------------------------
+// Test if list equals the list in the string
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >::Equals( const TDesC8& aNewString )
+    {
+    ASSERT( iList && iReconstruction );
+    // length of list and string must match
+    TBool fail = ( iList->Count() != aNewString.Length() );
+
+    for ( TInt i = 0; i < iList->Count(); i++ )
+        {
+        fail |= ( iList->Item( i ).Id() != TGlxMediaId( aNewString[ i ] ) );
+        }
+        
+    // Test reconstruction 
+    fail |= !iReconstruction->ReconstructionEquals();
+    
+    return !fail;
+    }
+    
+// -----------------------------------------------------------------------------
+// Test if list matches the string and reconstruction matches original
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+TBool CGlxListTestBase< _List, _Reconstruction >::Equals( const TDesC8& aNewString, 
+        const TNotification::TData* aNotificationList )
+    {
+    ASSERT( iList && iReconstruction );
+    // Test if list contents match the new intended contents
+    TBool fail = !Equals( aNewString );
+
+    // Test notifications and reconstruction match
+    fail |= !iReconstruction->NotificationListEquals( aNotificationList );
+    
+    return !fail;
+    }
+ 
+// -----------------------------------------------------------------------------
+// Test match
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+TBool CGlxListTestBase< _List, _Reconstruction >
+    ::Equals( const TDesC8& aStringWithoutStaticItems, 
+        const TDesC8& aStringWithStaticItems, 
+            TBool aStaticItemsEnabled, 
+                const TNotification::TData* aNotificationList)
+    {
+    TBool fail = EFalse;
+    if ( aStaticItemsEnabled )
+        {
+        fail |= !Equals( aStringWithStaticItems, aNotificationList );
+        }
+    else
+        {
+        fail |= !Equals( aStringWithoutStaticItems, aNotificationList );
+        }
+    
+    return !fail;
+    }
+
+// -----------------------------------------------------------------------------
+// Test if items are linked to media objects correctly
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::IsLinkedToMedia( const TDesC8& aAnswers ) const
+    {
+    TBool fail = EFalse;
+    for ( TInt i = 0; i < aAnswers.Length(); i++)
+        {
+        TBool shouldBeLinked = ( aAnswers[ i ] == 't' ); 
+        TBool isLinked = ( iList->Item( i ).Properties() != NULL );
+        // Test via not, just in case true is not always exactly 1
+        fail |= ( !shouldBeLinked != !isLinked );       
+        }
+    return !fail;
+    }   
+    
+// -----------------------------------------------------------------------------
+// Try linking to media item
+// -----------------------------------------------------------------------------
+//
+/*template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::TryOfferMedia( TChar aId, const TDesC8& aAnswers, TBool aShouldAccept )
+    {
+    ASSERT( iList );
+
+    CGlxMedia* media = new (ELeave) CGlxMedia( TGlxMediaId( aId ) );
+    CleanupStack::PushL( media );
+    iMediaPool.AppendL( media );
+    CleanupStack::Pop( media );
+    media->ReserveUsersL( 1 );
+    // Offer media and test acceptance. Compare via not, to since True might be not be 1
+    TBool fail = ( !iList->OfferMedia(KListIdSpace,  *media ) != !aShouldAccept );    
+    fail |= !IsLinkedToMedia( aAnswers );
+    return !fail;
+    }*/
+
+// -----------------------------------------------------------------------------
+// Try removing link from media item
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::TryRemoveReference( TInt aIndex, const TDesC8& aAnswers )
+    {
+    ASSERT( iList );
+
+    // Remove reference
+    iList->RemoveReference( aIndex );
+    TBool fail = !IsLinkedToMedia( aAnswers );
+    return !fail;
+    }
+
+// -----------------------------------------------------------------------------
+// Test OfferMedia(...)
+// -----------------------------------------------------------------------------
+//
+/*template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >::TestOfferMediaL()
+    {
+    // Create the item list
+    CreateListL( _L8("abcdefg") );
+
+    EUNIT_ASSERT( IsLinkedToMedia( _L8("fffffff") ) );
+    EUNIT_ASSERT( TryOfferMedia( '0', _L8("fffffff"), EFalse ) ); // reject
+    EUNIT_ASSERT( TryOfferMedia( 'a', _L8("tffffff"), ETrue ) );  
+    EUNIT_ASSERT( TryOfferMedia( 'c', _L8("tftffff"), ETrue ) );  
+    EUNIT_ASSERT( TryOfferMedia( 'd', _L8("tfttfff"), ETrue ) );  
+    EUNIT_ASSERT( TryOfferMedia( 'g', _L8("tfttfft"), ETrue ) );  
+    EUNIT_ASSERT( TryOfferMedia( '1', _L8("tfttfft"), EFalse ) ); // reject
+    }*/
+
+// -----------------------------------------------------------------------------
+// Test RemoveReference(...)
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >::TestRemoveReferenceL()
+    {
+    // Create the item list
+    CreateListL( _L8("abcdefg"), _L8("tfttfft") );
+    EUNIT_ASSERT( IsLinkedToMedia( _L8("tfttfft") ) );
+
+    // Add static items
+    // Static items are linked to media
+    AddStaticItemL( '0', NGlxListDefs::EInsertFirst );
+    AddStaticItemL( '1', NGlxListDefs::EInsertLast );
+    EUNIT_ASSERT( IsLinkedToMedia( _L8("ttfttfftt") ) );
+
+    EUNIT_ASSERT( TryRemoveReference( 1, _L8("tffttfftt") ) );
+    EUNIT_ASSERT( TryRemoveReference( 3, _L8("tffftfftt") ) );
+    EUNIT_ASSERT( TryRemoveReference( 4, _L8("tfffffftt") ) );
+    EUNIT_ASSERT( TryRemoveReference( 7, _L8("tffffffft") ) );
+    EUNIT_ASSERT_PANIC_DESC( TryRemoveReference( 8, _L8("tffffffft") ), 
+                             "Images & videos", EGlxPanicIllegalArgument, 
+                             "Incorrect panic" );
+    }
+
+// -----------------------------------------------------------------------------
+// Test setting new contents
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::SetContentsL( const TDesC8& aString )
+    {
+    ASSERT( iList );
+
+    // Create source
+    CMPXCollectionPath* path = CreatePathLC( aString );
+    // Copy source for comparison
+    TInt originalIndex = path->Index();
+    // Set the source 
+    iList->SetContentsL( *path, *this );
+    
+    // Test path was not modified
+    TBool fail = !( !path->Levels() || originalIndex == path->Index() );
+    
+    CleanupStack::PopAndDestroy( path );
+    return !fail;
+    }
+
+// -----------------------------------------------------------------------------
+// Test reordering contents
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::ReorderContentsL( const TDesC8& aString )
+    {
+    ASSERT( iList );
+
+    // Create source
+    CMPXCollectionPath* path = CreatePathLC( aString );
+    // Copy source for comparison
+    TInt originalIndex = path->Index();
+    // Set the source 
+    iList->ReorderContentsL( *path, *this );
+    
+    // Test path was not modified
+    TBool fail = !( !path->Levels() || originalIndex == path->Index() );
+    
+    CleanupStack::PopAndDestroy( path );
+    return !fail;
+    }
+
+// -----------------------------------------------------------------------------
+// Test setting new contents
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::TrySetContentsL(  const TDesC8& aOldString, const TDesC8& aNewString )
+    {
+    // Create the item list
+    CreateListL( aOldString );
+    // Set the contents
+    TBool fail = !SetContentsL( aNewString );
+    // Test if list contents match the new intended contents
+    fail |= !Equals( aNewString );
+    
+    return !fail;
+    }
+    
+// -----------------------------------------------------------------------------
+// Test setting contents and test notifications also
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::TrySetContentsL(  const TDesC8& aOldString, const TDesC8& aNewString, 
+            const TNotification::TData* aNotificationList )
+    {
+    // Test list creation
+    TBool fail = !TrySetContentsL( aOldString, aNewString );
+    // Test if notification list matches expected
+    fail |= !Equals( aNewString, aNotificationList );
+    
+    return !fail;
+    }
+    
+// -----------------------------------------------------------------------------
+// Test setting contents and test notifications also
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::TrySetContentsL(  const TDesC8& aOldString, const TDesC8& aNewString, 
+            const TDesC8& aNewStringWithStaticItems, 
+                const TNotification::TData* aNotificationList, 
+                    TBool aStaticItemsEnabled, 
+                        NGlxListTestHelpers::TStaticItemInfo::TData* aStaticItemInfos )
+    {
+    // Create list
+    CreateListL( aOldString, aStaticItemsEnabled, aStaticItemInfos );
+
+    TBool fail = !SetContentsL( aNewString );
+    fail |= !Equals( aNewString, aNewStringWithStaticItems, aStaticItemsEnabled,
+        aNotificationList );
+    
+    return !fail;
+    }
+    
+// -----------------------------------------------------------------------------
+// Test setting contents and test notifications also with and without static items
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::TrySetContentsL( const TDesC8& aOldString, const TDesC8& aNewString, 
+            const TDesC8& aNewStringWithStaticItems, 
+                const TNotification::TData* aNotificationListStaticItemsEnabled,
+                    const TNotification::TData* aNotificationListStaticItemsDisabled, 
+                        NGlxListTestHelpers::TStaticItemInfo::TData* aStaticItemInfos )
+    {
+    // without adding static items, while static items are enabled
+    TBool fail = !TrySetContentsL( aOldString, aNewString, aNewString,
+        aNotificationListStaticItemsDisabled, ETrue, NULL );
+
+    // without adding static items, while static items are disabled
+    fail |= !TrySetContentsL( aOldString, aNewString, aNewStringWithStaticItems, 
+        aNotificationListStaticItemsDisabled, EFalse, NULL );
+        
+    // with adding static items, while static items are enabled
+     fail |= !TrySetContentsL( aOldString, aNewString, aNewStringWithStaticItems,
+        aNotificationListStaticItemsEnabled, ETrue, aStaticItemInfos );
+
+    // with adding static items, while static items are disabled    
+    fail |= !TrySetContentsL( aOldString, aNewString, aNewStringWithStaticItems, 
+        aNotificationListStaticItemsDisabled, EFalse, aStaticItemInfos );
+    
+    return !fail;
+    }
+
+// -----------------------------------------------------------------------------
+// Test Adding a static item
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::TryAddStaticItemL( const TDesC8& aInitString, TChar aStaticItemId, 
+            NGlxListDefs::TInsertionPosition aInsertPos,
+                const TDesC8& aStringAfter,
+                    const TNotification::TData* aNotificationList,
+                        TBool aStaticItemsEnabled,
+                            NGlxListTestHelpers::TStaticItemInfo::TData* aStaticItemInfos )
+    {
+    CreateListL( aInitString, aStaticItemsEnabled, aStaticItemInfos );
+    CGlxMedia* media = new (ELeave) CGlxMedia( TGlxMediaId ( aStaticItemId ) );
+    CleanupStack::PushL( media );
+    iList->AddStaticItemL( media, aInsertPos );
+    CleanupStack::Pop( media );
+
+    TBool fail = !Equals( aInitString, aStringAfter, aStaticItemsEnabled,
+        aNotificationList );
+    
+    return !fail;
+    }
+
+// -----------------------------------------------------------------------------
+// Test Adding a static item
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::TryAddStaticItemL( const TDesC8& aInitString, 
+            TChar aStaticItemId, NGlxListDefs::TInsertionPosition aInsertPos,
+                const TDesC8& aStringAfter, const TNotification::TData* aNotificationListForAdd,
+                    const TNotification::TData* aNotificationListForAllStatic,
+                        NGlxListTestHelpers::TStaticItemInfo::TData* aStaticItemInfos )
+    {
+    TNotification::TData noNotifications[] = 
+                           { { END_MARKER } };
+    
+    // with adding static items, while static items are enabled
+    TBool fail = !TryAddStaticItemL( aInitString, aStaticItemId, aInsertPos, 
+        aStringAfter, aNotificationListForAdd, ETrue, aStaticItemInfos );
+
+    // with adding static items, while static items are disabled    
+    fail |= !TryAddStaticItemL( aInitString, aStaticItemId, aInsertPos,
+        aInitString, noNotifications, EFalse, aStaticItemInfos );
+        
+    // turn on static items, to make sure items were added in disabled state
+    iReconstruction->ClearNotifications();
+    iList->SetStaticItemsEnabled( ETrue );
+    fail |= !Equals( aStringAfter, aNotificationListForAllStatic );
+    
+    return !fail;
+    }
+            
+
+// -----------------------------------------------------------------------------
+// Test removing an item
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::TryRemoveL( const TDesC8& aOldString, const TChar aItemToRemove, 
+            const TDesC8& aNewString, const TNotification::TData* aNotificationList )
+    {
+    CreateListL( aOldString );
+    iList->Remove( KListIdSpace, TGlxMediaId( aItemToRemove ) );
+    // Test if notification list matches expected
+    return Equals( aNewString, aNotificationList );
+    }
+
+// -----------------------------------------------------------------------------
+// Test removing an item
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::TryRemoveL( const TDesC8& aOldString, const TChar aItemToRemove, 
+            TBool aIsStaticId, const TDesC8& aNewString, 
+                    const TNotification::TData* aNotificationList,
+                        TBool aStaticItemsEnabled,
+                            NGlxListTestHelpers::TStaticItemInfo::TData* aStaticItemInfos )
+    {
+    CreateListL( aOldString, aStaticItemsEnabled, aStaticItemInfos );
+
+    iList->Remove( aIsStaticId ? KGlxStaticItemIdSpaceId : KListIdSpace, 
+        TGlxMediaId( aItemToRemove ) );
+    TBool fail = !Equals( aNewString, aNotificationList );
+    
+    return !fail;
+    }
+
+// -----------------------------------------------------------------------------
+// Test setting contents and test notifications also
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+TBool CGlxListTestBase< _List, _Reconstruction >
+    ::TryRemoveL( const TDesC8& aOldString, const TChar aItemToRemove, TBool aIsStaticId, 
+        const TDesC8& aNewStringWithoutStaticItems, 
+            const TDesC8& aNewStringWithStaticItems, 
+                const TNotification::TData* aNotificationListStaticItemsDisabled,
+                    const TNotification::TData* aNotificationListStaticItemsEnabled, 
+                        NGlxListTestHelpers::TStaticItemInfo::TData* aStaticItemInfos)
+    {
+    // without adding static items, while static items are enabled
+    TBool fail = !TryRemoveL( aOldString, aItemToRemove, aIsStaticId, 
+        aNewStringWithoutStaticItems, aNotificationListStaticItemsDisabled, 
+            ETrue, NULL );
+
+    // without adding static items, while static items are disabled
+    fail |= !TryRemoveL( aOldString, aItemToRemove, aIsStaticId, 
+        aNewStringWithoutStaticItems, aNotificationListStaticItemsDisabled, 
+            EFalse, NULL );
+        
+    // with adding static items, while static items are enabled
+     fail |= !TryRemoveL( aOldString, aItemToRemove, aIsStaticId, 
+         aNewStringWithStaticItems, aNotificationListStaticItemsEnabled, 
+            ETrue, aStaticItemInfos );
+
+    // with adding static items, while static items are disabled    
+    fail |= !TryRemoveL( aOldString, aItemToRemove, aIsStaticId, 
+        aNewStringWithoutStaticItems, aNotificationListStaticItemsDisabled, 
+            EFalse, aStaticItemInfos );
+    
+    return !fail;
+    }
+
+// -----------------------------------------------------------------------------
+// MGlxMediaPool::Media implementation
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    CMPXCollectionPath* CGlxListTestBase< _List, _Reconstruction >
+        ::CreatePathLC( const TDesC8& aString )
+    {
+    // Populate array from the string
+    RArray<TMPXItemId> ids;
+    CleanupClosePushL( ids );
+    TInt count = aString.Length();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        ids.AppendL( aString[ i ] );
+        }
+    // Populate path from the array
+    CMPXCollectionPath* path = CMPXCollectionPath::NewL();
+    CleanupStack::PushL( path );
+    path->AppendL( ids.Array() );
+    CleanupStack::Pop( path ); // ids
+    CleanupStack::PopAndDestroy(); // ids
+    CleanupStack::PushL( path );
+    return path;
+    }
+    
+// -----------------------------------------------------------------------------
+// Add a static item
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >::AddStaticItemL( 
+        TChar aId, NGlxListDefs::TInsertionPosition aPosition )
+    {
+    ASSERT( iList );
+    CGlxMedia* item = new (ELeave) CGlxMedia( TGlxMediaId( aId ) );
+    CleanupStack::PushL( item );
+    iList->AddStaticItemL( item, aPosition );
+    CleanupStack::Pop( item );
+    }
+
+// -----------------------------------------------------------------------------
+// Add a static items
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >
+        ::AddStaticItemsL( NGlxListTestHelpers::TStaticItemInfo::TData* aInfos )
+    {
+    if ( aInfos )
+        {
+        TInt i = 0;
+        while ( NGlxListTestHelpers::KEndMarker != aInfos[ i ] )
+            {
+            AddStaticItemL( aInfos[ i ].iId, aInfos[ i ].iPosition );
+            i++; 
+            }
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// Check if counts equal
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >::CountEqualsL( TInt aAll, 
+        TInt aNonStatic, TInt aAllStatic, TInt aPreStatic, TInt aPostStatic )
+    {
+    TBool enabled = iList->IsStaticItemsEnabled();
+
+    // static items disabled
+    iList->SetStaticItemsEnabled( EFalse );
+    TBool fail = ( iList->Count( NGlxListDefs::ECountAll ) != aNonStatic );
+    fail |= ( iList->Count( NGlxListDefs::ECountNonStatic ) != aNonStatic );
+    fail |= ( iList->Count( NGlxListDefs::ECountAllStatic ) != 0 );
+    fail |= ( iList->Count( NGlxListDefs::ECountPreStatic ) != 0 );
+    fail |= ( iList->Count( NGlxListDefs::ECountPostStatic ) != 0 );
+    fail |= ( iList->Count() != iList->Count( NGlxListDefs::ECountAll ) );
+    
+    // static items enabled
+    iList->SetStaticItemsEnabled( ETrue );
+    fail |= ( iList->Count( NGlxListDefs::ECountAll ) != aAll );
+    fail |= ( iList->Count( NGlxListDefs::ECountNonStatic ) != aNonStatic );
+    fail |= ( iList->Count( NGlxListDefs::ECountAllStatic ) != aAllStatic );
+    fail |= ( iList->Count( NGlxListDefs::ECountPreStatic ) != aPreStatic );
+    fail |= ( iList->Count( NGlxListDefs::ECountPostStatic ) != aPostStatic );
+    fail |= ( iList->Count() != iList->Count( NGlxListDefs::ECountAll ) );
+
+    // Reset to original state
+    iList->SetStaticItemsEnabled( enabled );
+    return !fail;
+    }
+    
+// -----------------------------------------------------------------------------
+// Try enabling static items
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    TBool CGlxListTestBase< _List, _Reconstruction >
+        ::TrySetStaticItemsEnabledL( const TDesC8& aStringWithoutStaticItems, 
+            const TDesC8& aStringWithStaticItems, 
+                NGlxListTestHelpers::TStaticItemInfo::TData* aInfos,
+                    const TNotification::TData* aNotificationListForEnable,
+                        const TNotification::TData* aNotificationListForDisable )
+    {
+    CreateListL( aStringWithoutStaticItems );
+    AddStaticItemsL( aInfos );
+    iList->SetStaticItemsEnabled( EFalse );
+    TBool fail = iList->IsStaticItemsEnabled();
+    // test enabling static items
+    iReconstruction->ClearNotifications();
+    iList->SetStaticItemsEnabled( ETrue );
+    fail |= !iList->IsStaticItemsEnabled();
+    fail |= !Equals( aStringWithStaticItems, aNotificationListForEnable );
+    // test disabling static items 
+    iReconstruction->ClearNotifications();
+    iList->SetStaticItemsEnabled( EFalse );
+    fail |= iList->IsStaticItemsEnabled();
+    fail |= !Equals( aStringWithoutStaticItems, aNotificationListForDisable );
+    
+    return !fail;
+    }
+    
+// -----------------------------------------------------------------------------
+// Test Count(...)
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >::TestCountL()
+    {
+    // Test list with no normal items
+    CreateListL( _L8("") );
+    EUNIT_ASSERT( CountEqualsL( 0, 0, 0, 0, 0 ) ); // All, non-static, static, pre-static, post-static
+
+    AddStaticItemL( '0', NGlxListDefs::EInsertFirst );
+    EUNIT_ASSERT( CountEqualsL( 1, 0, 1, 1, 0 ) ); // All, non-static, static, pre-static, post-static
+
+    AddStaticItemL( '1', NGlxListDefs::EInsertFirst );
+    EUNIT_ASSERT( CountEqualsL( 2, 0, 2, 2, 0 ) ); // All, non-static, static, pre-static, post-static
+
+    AddStaticItemL( '2', NGlxListDefs::EInsertLast );
+    EUNIT_ASSERT( CountEqualsL( 3, 0, 3, 2, 1 ) ); // All, non-static, static, pre-static, post-static
+
+    // Test list with normal items
+    CreateListL( _L8("abcdefg") );
+    // test items
+    EUNIT_ASSERT( CountEqualsL( 7, 7, 0, 0, 0 ) ); // All, non-static, static, pre-static, post-static
+    
+    AddStaticItemL( '0', NGlxListDefs::EInsertFirst );
+    EUNIT_ASSERT( CountEqualsL( 8, 7, 1, 1, 0 ) ); // All, non-static, static, pre-static, post-static
+
+    AddStaticItemL( '1', NGlxListDefs::EInsertFirst );
+    EUNIT_ASSERT( CountEqualsL( 9, 7, 2, 2, 0 ) ); // All, non-static, static, pre-static, post-static
+
+    AddStaticItemL( '2', NGlxListDefs::EInsertLast );
+    EUNIT_ASSERT( CountEqualsL( 10, 7, 3, 2, 1 ) ); // All, non-static, static, pre-static, post-static
+    }
+    
+// -----------------------------------------------------------------------------
+// Test Item(...)
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >::TestItemL(  )
+    {
+    // Test list with no normal items
+    CreateListL( _L8("") );
+    AddStaticItemL( '0', NGlxListDefs::EInsertFirst );
+    EUNIT_ASSERT( iList->Item(0).Id() == TGlxMediaId( '0' ) );
+
+    AddStaticItemL( '1', NGlxListDefs::EInsertFirst );
+    EUNIT_ASSERT( iList->Item(0).Id() == TGlxMediaId( '1' ) );
+    EUNIT_ASSERT( iList->Item(1).Id() == TGlxMediaId( '0' ) );
+
+    AddStaticItemL( '2', NGlxListDefs::EInsertLast );
+    EUNIT_ASSERT( iList->Item(0).Id() == TGlxMediaId( '1' ) );
+    EUNIT_ASSERT( iList->Item(1).Id() == TGlxMediaId( '0' ) );
+    EUNIT_ASSERT( iList->Item(2).Id() == TGlxMediaId( '2' ) );
+
+    // Test list with normal items
+    CreateListL( _L8("abcdefg") );
+    // test items
+    EUNIT_ASSERT( iList->Item(0).Id() == TGlxMediaId( 'a' ) );
+    EUNIT_ASSERT( iList->Item(2).Id() == TGlxMediaId( 'c' ) );
+    EUNIT_ASSERT( iList->Item(6).Id() == TGlxMediaId( 'g' ) );
+    
+    AddStaticItemL( '0', NGlxListDefs::EInsertFirst );
+    EUNIT_ASSERT( iList->Item(0).Id() == TGlxMediaId( '0' ) );
+    EUNIT_ASSERT( iList->Item(1).Id() == TGlxMediaId( 'a' ) );
+    EUNIT_ASSERT( iList->Item(3).Id() == TGlxMediaId( 'c' ) );
+    EUNIT_ASSERT( iList->Item(7).Id() == TGlxMediaId( 'g' ) );
+
+    AddStaticItemL( '1', NGlxListDefs::EInsertFirst );
+    EUNIT_ASSERT( iList->Item(0).Id() == TGlxMediaId( '1' ) );
+    EUNIT_ASSERT( iList->Item(1).Id() == TGlxMediaId( '0' ) );
+    EUNIT_ASSERT( iList->Item(2).Id() == TGlxMediaId( 'a' ) );
+    EUNIT_ASSERT( iList->Item(4).Id() == TGlxMediaId( 'c' ) );
+    EUNIT_ASSERT( iList->Item(8).Id() == TGlxMediaId( 'g' ) );
+
+    AddStaticItemL( '2', NGlxListDefs::EInsertLast );
+    EUNIT_ASSERT( iList->Item(0).Id() == TGlxMediaId( '1' ) );
+    EUNIT_ASSERT( iList->Item(1).Id() == TGlxMediaId( '0' ) );
+    EUNIT_ASSERT( iList->Item(2).Id() == TGlxMediaId( 'a' ) );
+    EUNIT_ASSERT( iList->Item(4).Id() == TGlxMediaId( 'c' ) );
+    EUNIT_ASSERT( iList->Item(8).Id() == TGlxMediaId( 'g' ) );
+    EUNIT_ASSERT( iList->Item(9).Id() == TGlxMediaId( '2' ) );
+    }
+    
+// -----------------------------------------------------------------------------
+// Test Index(...)
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >::TestIndexL()
+    {
+    // Test list with no normal items
+    CreateListL( _L8("") );
+    AddStaticItemL( '0', NGlxListDefs::EInsertFirst );
+    EUNIT_ASSERT( iList->Index(KGlxStaticItemIdSpaceId, TGlxMediaId( '0' ) ) == 0 );
+
+    AddStaticItemL( '1', NGlxListDefs::EInsertFirst );
+    EUNIT_ASSERT( iList->Index(KGlxStaticItemIdSpaceId, TGlxMediaId( '1' ) ) == 0 );
+    EUNIT_ASSERT( iList->Index(KGlxStaticItemIdSpaceId, TGlxMediaId( '0' ) ) == 1 );
+
+    AddStaticItemL( '2', NGlxListDefs::EInsertLast );
+    EUNIT_ASSERT( iList->Index(KGlxStaticItemIdSpaceId, TGlxMediaId( '1' ) ) == 0 );
+    EUNIT_ASSERT( iList->Index(KGlxStaticItemIdSpaceId, TGlxMediaId( '0' ) ) == 1 );
+    EUNIT_ASSERT( iList->Index(KGlxStaticItemIdSpaceId, TGlxMediaId( '2' ) ) == 2 );
+
+    // Test list with normal items
+    CreateListL( _L8("abcdefg") );
+    EUNIT_ASSERT( iList->Index(KListIdSpace, TGlxMediaId( 'a' ) ) == 0 );
+    EUNIT_ASSERT( iList->Index(KListIdSpace, TGlxMediaId( 'c' ) ) == 2 );
+    EUNIT_ASSERT( iList->Index(KListIdSpace, TGlxMediaId( 'g' ) ) == 6 );
+    
+    AddStaticItemL( '0', NGlxListDefs::EInsertFirst );
+    EUNIT_ASSERT( iList->Index(KGlxStaticItemIdSpaceId, TGlxMediaId( '0' ) ) == 0 );
+    EUNIT_ASSERT( iList->Index(KListIdSpace, TGlxMediaId( 'a' ) ) == 1 );
+    EUNIT_ASSERT( iList->Index(KListIdSpace, TGlxMediaId( 'c' ) ) == 3 );
+    EUNIT_ASSERT( iList->Index(KListIdSpace, TGlxMediaId( 'g' ) ) == 7 );
+
+    AddStaticItemL( '1', NGlxListDefs::EInsertFirst );
+    EUNIT_ASSERT( iList->Index(KGlxStaticItemIdSpaceId, TGlxMediaId( '1' ) ) == 0 );
+    EUNIT_ASSERT( iList->Index(KGlxStaticItemIdSpaceId, TGlxMediaId( '0' ) ) == 1 );
+    EUNIT_ASSERT( iList->Index(KListIdSpace, TGlxMediaId( 'a' ) ) == 2 );
+    EUNIT_ASSERT( iList->Index(KListIdSpace, TGlxMediaId( 'c' ) ) == 4 );
+    EUNIT_ASSERT( iList->Index(KListIdSpace, TGlxMediaId( 'g' ) ) == 8 );
+
+    AddStaticItemL( '2', NGlxListDefs::EInsertLast );
+    EUNIT_ASSERT( iList->Index(KGlxStaticItemIdSpaceId, TGlxMediaId( '1' ) ) == 0 );
+    EUNIT_ASSERT( iList->Index(KGlxStaticItemIdSpaceId, TGlxMediaId( '0' ) ) == 1 );
+    EUNIT_ASSERT( iList->Index(KListIdSpace, TGlxMediaId( 'a' ) ) == 2 );
+    EUNIT_ASSERT( iList->Index(KListIdSpace, TGlxMediaId( 'c' ) ) == 4 );
+    EUNIT_ASSERT( iList->Index(KListIdSpace, TGlxMediaId( 'g' ) ) == 8 );
+    EUNIT_ASSERT( iList->Index(KGlxStaticItemIdSpaceId, TGlxMediaId( '2' ) ) == 9 );
+    }
+    
+// -----------------------------------------------------------------------------
+// Test IdSpaceId
+// -----------------------------------------------------------------------------
+//
+template < class _List, class _Reconstruction >
+    void CGlxListTestBase< _List, _Reconstruction >::TestIdSpaceIdL()
+    {
+    CreateReconstructionL();
+    iList = _List::NewL( KListIdSpace, *iReconstruction, *this );
+    EUNIT_ASSERT( iList->IdSpaceId() == TGlxIdSpaceId( 1 ) );
+    }