photosgallery/viewframework/medialists/tsrc/ut_cglxitemlist/ut_cglxitemlist.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:45:44 +0200
changeset 0 4e91876724a2
child 18 bcb43dc84c44
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* 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
*
*/




//  CLASS HEADER
#include "ut_cglxitemlist.h"

//  EXTERNAL INCLUDES
#include <digia/eunit/eunitmacros.h>
#include <digia/eunit/eunitdecorators.h>
#include <mpxcollectionpath.h>
#include <glxpanic.h>
    
//  INTERNAL INCLUDES
#include "glxitemlist.h"
#include "_glxnotification.h"

// -----------------------------------------------------------------------------
// Constructors 
// -----------------------------------------------------------------------------
//
CGlxItemListReconstruction* CGlxItemListReconstruction::NewL( TInt aReservationCount )
    {
    CGlxItemListReconstruction* self = new (ELeave) CGlxItemListReconstruction();
    CleanupStack::PushL( self );
    self->ConstructL( aReservationCount );
    CleanupStack::Pop( self );
    return self;
    }
    
// -----------------------------------------------------------------------------
// Test reconstruction
// -----------------------------------------------------------------------------
//
TBool CGlxItemListReconstruction::ReconstructionEquals() const
    {
    return ItemsEqual();
    }
    
// -----------------------------------------------------------------------------
// Constructors & destructors
// -----------------------------------------------------------------------------
//
ut_CGlxItemList* ut_CGlxItemList::NewL()
    {
    ut_CGlxItemList* self = ut_CGlxItemList::NewLC();
    CleanupStack::Pop();

    return self;
    }

ut_CGlxItemList* ut_CGlxItemList::NewLC()
    {
    ut_CGlxItemList* self = new( ELeave ) ut_CGlxItemList();
    CleanupStack::PushL( self );

    self->ConstructL();

    return self;
    }

// Destructor (virtual by CBase)
ut_CGlxItemList::~ut_CGlxItemList()
    {
    }

// Default constructor
ut_CGlxItemList::ut_CGlxItemList()
    {
    }

// Second phase construct
void ut_CGlxItemList::ConstructL()
    {
    // The ConstructL from the base class CEUnitTestSuiteClass must be called.
    // It generates the test case table.
    CEUnitTestSuiteClass::ConstructL();
    }
        
// -----------------------------------------------------------------------------
// Setup & teardown
// -----------------------------------------------------------------------------
//
void ut_CGlxItemList::SetupL(  )
    {
    }

void ut_CGlxItemList::Teardown(  )
    {
    DeleteMembers();
    }
    
// -----------------------------------------------------------------------------
// Test SetContentsL
// -----------------------------------------------------------------------------
//
void ut_CGlxItemList::T_SetContentsLL(  )
    {
        // Test population of empty list with empty list
        {
        TNotification::TData notifications[] = { { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8(""),
                                        _L8(""),
                                        notifications ) );  
        } 

        // Test additions /////////////////////////////////////////////////////////                                    

        // Test population of empty list
        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 0, 3 }, 
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8(""),
                                        _L8("abc"),
                                        notifications ) ); 
        }

        // Test population of empty list
        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 0, 1 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8(""),
                                        _L8("a"),
                                        notifications ) ); 
        }
        // Test insert at end of list
        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 1, 1 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("a"),
                                        _L8("ab"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 1, 2 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("a"),
                                        _L8("abc"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 2, 1 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("ab"),
                                        _L8("abc"),
                                        notifications ) ); 
        }
        // Test insert at the beginning of the list
        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 0, 1 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("b"),
                                        _L8("ab"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 0, 2 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("c"),
                                        _L8("abc"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 0, 1 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("bc"),
                                        _L8("abc"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 0, 3 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("de"),
                                        _L8("abcde"),
                                        notifications ) ); 
        }

        // Test insert at the middle of the list
        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 1, 1 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("ac"),
                                        _L8("abc"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 1, 2 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("ad"),
                                        _L8("abcd"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 2, 3 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("abf"),
                                        _L8("abcdef"),
                                        notifications ) ); 
        }

        
        // Test multiple insertions
        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 0, 1 }, // a
                               { TNotification::EAdd, 2, 1 }, // c
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("b"),
                                        _L8("abc"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 0, 2 }, // ab
                               { TNotification::EAdd, 3, 2 }, // de
                               { TNotification::EAdd, 6, 2 }, // gh
                               { TNotification::EAdd, 9, 1 }, // j
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("cfi"),
                                        _L8("abcdefghij"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::EAdd, 2, 3 }, // cde
                               { TNotification::EAdd, 6, 1 }, // g
                               { TNotification::EAdd, 8, 1 }, // i
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("abfhj"),
                                        _L8("abcdefghij"),
                                        notifications ) ); 
        }

        
        // Test removals //////////////////////////////////////////////////////////
                                          
        // Test list being made empty
        {
        TNotification::TData notifications[] = 
                             { { TNotification::ERemove, 0, 1 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("a"),
                                        _L8(""),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::ERemove, 0, 3 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("abc"),
                                        _L8(""),
                                        notifications ) ); 
        }

        
        // Remove from end
        {
        TNotification::TData notifications[] = 
                             { { TNotification::ERemove, 1, 1 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("ab"),
                                        _L8("a"),
                                        notifications ) ); 
        }

        
        // Remove from end
        {
        TNotification::TData notifications[] = 
                             { { TNotification::ERemove, 1, 5 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("abcdef"),
                                        _L8("a"),
                                        notifications ) ); 
        }

        
        // Remove from beginning
        {
        TNotification::TData notifications[] = 
                             { { TNotification::ERemove, 0, 5 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("abcdef"),
                                        _L8("f"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::ERemove, 0, 1 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("af"),
                                        _L8("f"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::ERemove, 0, 3 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("abcdef"),
                                        _L8("def"),
                                        notifications ) ); 
        }

        // Remove from middle
        {
        TNotification::TData notifications[] = 
                             { { TNotification::ERemove, 1, 4 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("abcdef"),
                                        _L8("af"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::ERemove, 2, 2 },
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("abcdef"),
                                        _L8("abef"),
                                        notifications ) ); 
        }

        // Test multiple removals
        {
        TNotification::TData notifications[] = 
                             { { TNotification::ERemove, 1, 2 }, // bc
                               { TNotification::ERemove, 2, 1 }, // e
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("abcdef"),
                                        _L8("adf"),
                                        notifications ) ); 
        }

        {
        TNotification::TData notifications[] = 
                             { { TNotification::ERemove, 0, 1 }, // a
                               { TNotification::ERemove, 1, 1 }, // c
                               { TNotification::ERemove, 3, 3 }, // fgh
                               { TNotification::ERemove, 5, 1 }, // k
                               { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("abcdefghijk"),
                                        _L8("bdeij"),
                                        notifications ) ); 
        }
        
        // Test simultaneous additions and removals ///////////////////////////////
        {
        TNotification::TData notifications[] = 
                                { { TNotification::ERemove, 0, 1 }, // a
                                  { TNotification::EAdd,    0, 3 }, // 123
                                  { TNotification::EAdd,    4, 2 }, // 45
                                  { TNotification::ERemove, 7, 1 }, // d
                                  { TNotification::ERemove, 8, 2 }, // fg
                                  { TNotification::EAdd,    8, 3 }, // 678
                                  { TNotification::ERemove, 13, 2 }, // jk
                                  { TNotification::EAdd,    13, 5 }, // 90#¤%
                                  { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("abcdefghijk"),
                                        _L8("123b45ce678hi90#¤%"),
                                        notifications ) );
        }

        // Test replacement ///////////////////////////////////////////////////////
        {
        TNotification::TData notifications[] = 
                                 { { TNotification::ERemove, 0, 26 }, // abcdefghijkolmnopqrstuvwxyz
                                   { TNotification::EAdd,    0, 10 }, // 1234567890
                                   { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("abcdefghijklmnopqrstuvwxyz"),
                                        _L8("1234567890"),
                                        notifications ) );
        }
        
        {
        TNotification::TData notifications[] = 
                               { { TNotification::ERemove,    0, 10 }, // 1234567890
                                 { TNotification::EAdd, 0, 26 }, // abcdefghijkolmnopqrstuvwxyz
                                 { END_MARKER } };
        EUNIT_ASSERT( TrySetContentsL ( _L8("1234567890"),
                                        _L8("abcdefghijklmnopqrstuvwxyz"),
                                        notifications ) );
        }
    // Test reorder ///////////////////////////////////////////////////////////
    // don't really care about the order of notifications, only that reconstruction 
    // matches the original during sync and at the end. During sync is checked by 
    // HandleItemsAdded and HandleItemsRemoved. After sync is checked here.
    EUNIT_ASSERT( TrySetContentsL ( _L8("abcdefghijklmnopqrstuvwxyz"),
                                    _L8("akjipebvwzcd") ) );
    EUNIT_ASSERT( TrySetContentsL ( _L8("akjipebvwzcd"),
                                    _L8("abcdefghijklmnopqrstuvwxyz") ) );
    EUNIT_ASSERT( TrySetContentsL ( _L8("cdabkoljnpqsrihyzx"),
                                    _L8("abcdefghijklmnopqrstuvwxyz") ) );
    EUNIT_ASSERT( TrySetContentsL ( _L8("abcdefghijklmnopqrstuvwxyz"),
                                    _L8("cdabkoljnpqsrihyzx") ) );
    EUNIT_ASSERT( TrySetContentsL ( _L8("abcdefghijklmnopqrstuvwxyz"),
                                    _L8("qrscdehizyjabklmnoptuvfgwx") ) );
    }

// -----------------------------------------------------------------------------
// Test Remove(...)
// -----------------------------------------------------------------------------
//
void ut_CGlxItemList::T_RemoveL() 
    {
    // Test by creating a list, and removing items from it
        {
        TNotification::TData notifications[] = 
                               { { TNotification::ERemove, 0, 1 }, 
                                 { END_MARKER } };
        EUNIT_ASSERT( TryRemoveL( _L8("abcdefg"),
                                  'a',
                                  _L8("bcdefg"),
                                  notifications ) );
        }

        {
        TNotification::TData notifications[] = 
                               { { TNotification::ERemove, 2, 1 }, 
                                 { END_MARKER } };
        EUNIT_ASSERT( TryRemoveL( _L8("abcdefg"),
                                  'c',
                                  _L8("abdefg"),
                                  notifications ) );
        }

        {
        TNotification::TData notifications[] = 
                               { { TNotification::ERemove, 6, 1 }, 
                                 { END_MARKER } };
        EUNIT_ASSERT( TryRemoveL( _L8("abcdefg"),
                                  'g',
                                  _L8("abcdef"),
                                  notifications ) );
        }
    }
    
// -----------------------------------------------------------------------------
// Test RemoveReference(...)
// -----------------------------------------------------------------------------
//
void ut_CGlxItemList::T_RemoveReferenceL(  )
    {
    // Create the item list
    CreateListL( _L8("abcdefg"), _L8("tfttfft") );

    EUNIT_ASSERT( IsLinkedToMedia( _L8("tfttfft") ) );
    EUNIT_ASSERT( TryRemoveReference( 0, _L8("ffttfft") ) );
    EUNIT_ASSERT( TryRemoveReference( 2, _L8("ffftfft") ) );
    EUNIT_ASSERT( TryRemoveReference( 3, _L8("fffffft") ) );
    EUNIT_ASSERT( TryRemoveReference( 6, _L8("fffffff") ) );
    EUNIT_ASSERT_PANIC_DESC( TryRemoveReference( KErrNotFound, _L8("tfttfft") ), 
                             "Images & videos", EGlxPanicIllegalArgument, 
                             "Incorrect panic" );
    }

// -----------------------------------------------------------------------------
// Test Index(...)
// -----------------------------------------------------------------------------
//
void ut_CGlxItemList::T_IndexL(  )
    {
    // Create the item list
    CreateListL( _L8("abcdefg") );
    
    EUNIT_ASSERT_DESC( iList->Index(KListIdSpace, TGlxMediaId('a') ) == 0, "index match a" );
    EUNIT_ASSERT_DESC( iList->Index(KListIdSpace, TGlxMediaId('c') ) == 2, "index match c" );
    EUNIT_ASSERT_DESC( iList->Index(KListIdSpace, TGlxMediaId('g') ) == 6, "index match g" );
    EUNIT_ASSERT_DESC( iList->Index(KListIdSpace, TGlxMediaId('h') ) == KErrNotFound, "index no match" );
    }
    
// -----------------------------------------------------------------------------
// Test Count()
// -----------------------------------------------------------------------------
//
void ut_CGlxItemList::T_CountL(  )
    {
    // test count of new list
    CreateReconstructionL();
    iList = CGlxItemList::NewL( TGlxIdSpaceId( 1 ), *iReconstruction, *this );
    EUNIT_ASSERT_DESC( iList->Count() == 0, "count 0" );
    
    // test count of non-empty list
    CreateListL( _L8("abcdefg") );
    EUNIT_ASSERT_DESC( iList->Count() == 7, "count 7" );
    }
    
// -----------------------------------------------------------------------------
// Test Item(...)
// -----------------------------------------------------------------------------
//
void ut_CGlxItemList::T_ItemL(  )
    {
    // Create the item list
    CreateListL( _L8("abcdefg") );
    // test item
    EUNIT_ASSERT_DESC( iList->Item(0).Id() == TGlxMediaId('a'), "item a" );
    EUNIT_ASSERT_DESC( iList->Item(2).Id() == TGlxMediaId('c'), "item c" );
    EUNIT_ASSERT_DESC( iList->Item(6).Id() == TGlxMediaId('g'), "item g" );
    }
    
// -----------------------------------------------------------------------------
// Test IdSpaceId
// -----------------------------------------------------------------------------
//
void ut_CGlxItemList::T_IdSpaceIdL()
    {
    TestIdSpaceIdL();
    }
    
// -----------------------------------------------------------------------------
// Test table
// -----------------------------------------------------------------------------
//
EUNIT_BEGIN_TEST_TABLE(
    ut_CGlxItemList,
    "Add test suite description here.",
    "UNIT" )
    
EUNIT_TEST(
    "SetContentsL",
    "CGlxItemList",
    "SetContentsL",
    "FUNCTIONALITY",
    SetupL, T_SetContentsLL, Teardown)
    
EUNIT_TEST(
    "Remove",
    "CGlxItemList",
    "Remove",
    "FUNCTIONALITY",
    SetupL, T_RemoveL, Teardown)
    
EUNIT_TEST(
    "RemoveReference",
    "CGlxItemList",
    "RemoveReference",
    "FUNCTIONALITY",
    SetupL, T_RemoveReferenceL, Teardown)
    
EUNIT_TEST(
    "Index",
    "CGlxItemList",
    "Index",
    "FUNCTIONALITY",
    SetupL, T_IndexL, Teardown)    
    
EUNIT_TEST(
    "Count",
    "CGlxItemList",
    "Count",
    "FUNCTIONALITY",
    SetupL, T_CountL, Teardown)
    
EUNIT_TEST(
    "Item",
    "CGlxItemList",
    "Item",
    "FUNCTIONALITY",
    SetupL, T_ItemL, Teardown)
    
EUNIT_TEST(
    "Id space id",
    "CGlxItemList",
    "IdSpaceId",
    "FUNCTIONALITY",
    SetupL, T_IdSpaceIdL, Teardown)

EUNIT_END_TEST_TABLE

//  END OF FILE