photosgallery/viewframework/medialists/tsrc/ut_cglxattributecontext/ut_cglxattributecontext.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:    CGlxAttributeContext unit tests
*
*/




//  CLASS HEADER
#include "UT_CGlxAttributeContext.h"

//  EXTERNAL INCLUDES
#include <digia/eunit/eunitmacros.h>

#include <e32std.h>

#include <mpxmediageneraldefs.h>

#include <glxdrmutility.h>

//  INTERNAL INCLUDES
#include "glxattributecontext.h"

const TInt KNumberOfMedia = 9;
const TInt KFrontOffset = 2;
const TInt KRearOffset = 2;
const TInt KItemsInRange = 1 + KFrontOffset + KRearOffset;
const TInt KOneItem = 1;
const TInt KGranularityLessThanRange = 2;
const TInt KGranularityGreaterThanRange = KItemsInRange + 2;

void CGlxDRMUtility::Close()
    {
    delete this;
    }
    
TBool CGlxDRMUtility::CheckOpenRightsL(const TDesC&, TBool)
    {
    return ETrue;
    }
    
CGlxDRMUtility* CGlxDRMUtility::InstanceL()
    {
    CGlxDRMUtility* drm = new(ELeave)CGlxDRMUtility();
    return drm;
    }
    
TSize CGlxDRMUtility::DRMThumbnailSize(TSize& aSize)
    {
    return aSize;
    }
    
CGlxDRMUtility::CGlxDRMUtility()
    {
    
    }
    
CGlxDRMUtility::~CGlxDRMUtility()
    {
    
    }

// CONSTRUCTION
UT_CGlxAttributeContext* UT_CGlxAttributeContext::NewL()
    {
    UT_CGlxAttributeContext* self = UT_CGlxAttributeContext::NewLC();
    CleanupStack::Pop();

    return self;
    }

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

    self->ConstructL();

    return self;
    }

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

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

// Second phase construct
void UT_CGlxAttributeContext::ConstructL()
    {
    // The ConstructL from the base class CEUnitTestSuiteClass must be called.
    // It generates the test case table.
    CEUnitTestSuiteClass::ConstructL();
    }

//  METHODS

void UT_CGlxAttributeContext::SetupL(  )
    {
    iAttributeContext = CGlxDefaultAttributeContext::NewL();
    }

void UT_CGlxAttributeContext::Teardown(  )
    {
    delete iAttributeContext;
    iAttributeContext = NULL;
    }

void UT_CGlxAttributeContext::UT_CGlxAttributeContext_CGlxAttributeContextL(  )
    {
    EUNIT_ASSERT( EFalse );
    }

void UT_CGlxAttributeContext::UT_CGlxAttributeContext_AddAttributeLL(  )
    {
    EUNIT_ASSERT( EFalse );
    }

void UT_CGlxAttributeContext::UT_CGlxAttributeContext_RemoveAttributeL(  )
    {
    EUNIT_ASSERT( EFalse );
    }

void UT_CGlxAttributeContext::UT_CGlxAttributeContext_AllAttributesLL(  )
    {
    EUNIT_ASSERT( EFalse );
    }

void UT_CGlxAttributeContext::UT_CGlxAttributeContext_AttributeRequestLL(  )
    {
    // Setup test
    SetupAttributeRequestTestL();

    FetchItems_NoMediaL();
    FetchOneItem_IndexZeroL();
    FetchOneItem_IndexOneL();
    FetchOneItem_IndexTwoL();
    FetchOneItem_IndexThreeL();
    FetchOneItem_IndexFourL();
    FetchItems_GranularityLessThanRange_IndexZeroL();
    FetchItems_GranularityLessThanRange_IndexOneL();
    FetchItems_GranularityLessThanRange_IndexTwoL();
    FetchItems_GranularityLessThanRange_IndexThreeL();
    FetchItems_GranularityLessThanRange_IndexFourL();
    FetchItems_GranularityLessThanRange_IndexFiveL();
    FetchItems_GranularityGreaterThanRangeL();
    }

void UT_CGlxAttributeContext::SetupAttributeRequestTestL()
    {
    // Initial offsets, rear is 2 and front is 2
    EUNIT_PRINT(_L("Initial offsets: rear is 2 and front is 2"));
    iAttributeContext->SetRangeOffsets(KRearOffset, KFrontOffset);

    // Initial attributes to fetch
    EUNIT_PRINT(_L("Initial attributes: Title and date"));
    iAttributeContext->AddAttributeL(KMPXMediaGeneralTitle);
    iAttributeContext->AddAttributeL(KMPXMediaGeneralDate);
    }

void UT_CGlxAttributeContext::FetchItems_NoMediaL()
    {
    // Fetch items with empty media list
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(0);
    CleanupStack::PushL(mediaList);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with empty media list"));
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check no item indices returned"));
    EUNIT_ASSERT(itemIndices.Count() == 0);

    EUNIT_PRINT(_L("Check no attributes returned"));
    EUNIT_ASSERT(attributes.Count() == 0);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

void UT_CGlxAttributeContext::FetchOneItem_IndexZeroL()
    {
    // Fetch 1 item with focus on index 0
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(KNumberOfMedia);
    CleanupStack::PushL(mediaList);

    mediaList->SetFocusL(NGlxListDefs::EAbsolute, 0);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with focus on index 0: granularity is 1"));
    iAttributeContext->SetGranularity(KOneItem);
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check 1 item index is returned: Item index is 0"));
    EUNIT_ASSERT((itemIndices.Count() == KOneItem) && itemIndices[0] == 0);

    TBool titleAttributeFound = FindAttribute(attributes, KMPXMediaGeneralTitle);
    TBool dateAttributeFound = FindAttribute(attributes, KMPXMediaGeneralDate);

    EUNIT_PRINT(_L("Check 2 attributes returned: Title and date"));
    EUNIT_ASSERT((attributes.Count() == 2) && titleAttributeFound && dateAttributeFound);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

void UT_CGlxAttributeContext::FetchOneItem_IndexOneL()
    {
    // Fetch 1 item with focus on index 1
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(KNumberOfMedia);
    CleanupStack::PushL(mediaList);

    mediaList->SetFocusL(NGlxListDefs::EAbsolute, 1);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with focus on index 1: granularity is 1"));
    iAttributeContext->SetGranularity(KOneItem);
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check 1 item index is returned: Item index is 1"));
    EUNIT_ASSERT((itemIndices.Count() == KOneItem) && itemIndices[0] == 1);

    TBool titleAttributeFound = FindAttribute(attributes, KMPXMediaGeneralTitle);
    TBool dateAttributeFound = FindAttribute(attributes, KMPXMediaGeneralDate);

    EUNIT_PRINT(_L("Check 2 attributes returned: Title and date"));
    EUNIT_ASSERT((attributes.Count() == 2) && titleAttributeFound && dateAttributeFound);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

void UT_CGlxAttributeContext::FetchOneItem_IndexTwoL()
    {
    // Fetch 1 item with focus on index 2
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(KNumberOfMedia);
    CleanupStack::PushL(mediaList);

    mediaList->SetFocusL(NGlxListDefs::EAbsolute, 2);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with focus on index 2: granularity is 1"));
    iAttributeContext->SetGranularity(KOneItem);
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check 1 item index is returned: Item index is 2"));
    EUNIT_ASSERT((itemIndices.Count() == KOneItem) && itemIndices[0] == 2);

    TBool titleAttributeFound = FindAttribute(attributes, KMPXMediaGeneralTitle);
    TBool dateAttributeFound = FindAttribute(attributes, KMPXMediaGeneralDate);

    EUNIT_PRINT(_L("Check 1 attribute returned: Date"));
    EUNIT_ASSERT((attributes.Count() == 1) && !titleAttributeFound && dateAttributeFound);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

void UT_CGlxAttributeContext::FetchOneItem_IndexThreeL()
    {
    // Fetch 1 item with focus on index 3
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(KNumberOfMedia);
    CleanupStack::PushL(mediaList);

    mediaList->SetFocusL(NGlxListDefs::EAbsolute, 3);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with focus on index 3: granularity is 1"));
    iAttributeContext->SetGranularity(KOneItem);
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check 1 item index is returned: Item index is 3"));
    EUNIT_ASSERT((itemIndices.Count() == KOneItem) && itemIndices[0] == 3);

    TBool titleAttributeFound = FindAttribute(attributes, KMPXMediaGeneralTitle);
    TBool dateAttributeFound = FindAttribute(attributes, KMPXMediaGeneralDate);

    EUNIT_PRINT(_L("Check 1 attribute returned: Title"));
    EUNIT_ASSERT((attributes.Count() == 1) && titleAttributeFound && !dateAttributeFound);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

void UT_CGlxAttributeContext::FetchOneItem_IndexFourL()
    {
    // Fetch 1 item with focus on index 4
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(KNumberOfMedia);
    CleanupStack::PushL(mediaList);

    mediaList->SetFocusL(NGlxListDefs::EAbsolute, 4);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with focus on index 4: granularity is 1"));
    iAttributeContext->SetGranularity(KOneItem);
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check 1 item index is returned: Item index is 5"));
    EUNIT_ASSERT((itemIndices.Count() == KOneItem) && itemIndices[0] == 5);

    TBool titleAttributeFound = FindAttribute(attributes, KMPXMediaGeneralTitle);
    TBool dateAttributeFound = FindAttribute(attributes, KMPXMediaGeneralDate);

    EUNIT_PRINT(_L("Check 2 attributes returned: Title and date"));
    EUNIT_ASSERT((attributes.Count() == 2) && titleAttributeFound && dateAttributeFound);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

void UT_CGlxAttributeContext::FetchItems_GranularityLessThanRange_IndexZeroL()
    {
    // Fetch items with focus on index 0 (granularity less than range)
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(KNumberOfMedia);
    CleanupStack::PushL(mediaList);

    mediaList->SetFocusL(NGlxListDefs::EAbsolute, 0);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with focus on index 0: granularity is 2"));
    iAttributeContext->SetGranularity(KGranularityLessThanRange);
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check 2 item indices are returned: Item indices 0 and 1"));
    EUNIT_ASSERT((itemIndices.Count() == KGranularityLessThanRange) && itemIndices[0] == 0 && itemIndices[1] == 1);

    TBool titleAttributeFound = FindAttribute(attributes, KMPXMediaGeneralTitle);
    TBool dateAttributeFound = FindAttribute(attributes, KMPXMediaGeneralDate);

    EUNIT_PRINT(_L("Check 2 attributes returned: Title and date"));
    EUNIT_ASSERT((attributes.Count() == 2) && titleAttributeFound && dateAttributeFound);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

void UT_CGlxAttributeContext::FetchItems_GranularityLessThanRange_IndexOneL()
    {
    // Fetch items with focus on index 1 (granularity less than range)
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(KNumberOfMedia);
    CleanupStack::PushL(mediaList);

    mediaList->SetFocusL(NGlxListDefs::EAbsolute, 1);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with focus on index 1: granularity is 2"));
    iAttributeContext->SetGranularity(KGranularityLessThanRange);
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check 2 item indices are returned: Item indices 1 and 2"));
    EUNIT_ASSERT((itemIndices.Count() == KGranularityLessThanRange) && itemIndices[0] == 1 && itemIndices[1] == 2);

    TBool titleAttributeFound = FindAttribute(attributes, KMPXMediaGeneralTitle);
    TBool dateAttributeFound = FindAttribute(attributes, KMPXMediaGeneralDate);

    EUNIT_PRINT(_L("Check 2 attributes returned: Title and date"));
    EUNIT_ASSERT((attributes.Count() == 2) && titleAttributeFound && dateAttributeFound);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

void UT_CGlxAttributeContext::FetchItems_GranularityLessThanRange_IndexTwoL()
    {
    // Fetch items with focus on index 2 (granularity less than range)
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(KNumberOfMedia);
    CleanupStack::PushL(mediaList);

    mediaList->SetFocusL(NGlxListDefs::EAbsolute, 2);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with focus on index 2: granularity is 2"));
    iAttributeContext->SetGranularity(KGranularityLessThanRange);
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check 2 item indices are returned: Item indices 2 and 3"));
    EUNIT_ASSERT((itemIndices.Count() == KGranularityLessThanRange) && itemIndices[0] == 2 && itemIndices[1] == 3);

    TBool titleAttributeFound = FindAttribute(attributes, KMPXMediaGeneralTitle);
    TBool dateAttributeFound = FindAttribute(attributes, KMPXMediaGeneralDate);

    EUNIT_PRINT(_L("Check 2 attributes returned: Title and date"));
    EUNIT_ASSERT((attributes.Count() == 2) && titleAttributeFound && dateAttributeFound);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

void UT_CGlxAttributeContext::FetchItems_GranularityLessThanRange_IndexThreeL()
    {
    // Fetch items with focus on index 3 (granularity less than range)
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(KNumberOfMedia);
    CleanupStack::PushL(mediaList);

    mediaList->SetFocusL(NGlxListDefs::EAbsolute, 3);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with focus on index 3: granularity is 2"));
    iAttributeContext->SetGranularity(KGranularityLessThanRange);
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check 2 item indices are returned: Item indices 3 and 2"));
    EUNIT_ASSERT((itemIndices.Count() == KGranularityLessThanRange) && itemIndices[0] == 3 && itemIndices[1] == 2);

    TBool titleAttributeFound = FindAttribute(attributes, KMPXMediaGeneralTitle);
    TBool dateAttributeFound = FindAttribute(attributes, KMPXMediaGeneralDate);

    EUNIT_PRINT(_L("Check 2 attributes returned: Title and date"));
    EUNIT_ASSERT((attributes.Count() == 2) && titleAttributeFound && dateAttributeFound);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

void UT_CGlxAttributeContext::FetchItems_GranularityLessThanRange_IndexFourL()
    {
    // Fetch items with focus on index 4 (granularity less than range)
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(KNumberOfMedia);
    CleanupStack::PushL(mediaList);

    mediaList->SetFocusL(NGlxListDefs::EAbsolute, 4);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with focus on index 4: granularity is 2"));
    iAttributeContext->SetGranularity(KGranularityLessThanRange);
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check 2 item indices are returned: Item indices 5 and 3"));
    EUNIT_ASSERT((itemIndices.Count() == KGranularityLessThanRange) && itemIndices[0] == 5 && itemIndices[1] == 3);

    TBool titleAttributeFound = FindAttribute(attributes, KMPXMediaGeneralTitle);
    TBool dateAttributeFound = FindAttribute(attributes, KMPXMediaGeneralDate);

    EUNIT_PRINT(_L("Check 2 attributes returned: Title and date"));
    EUNIT_ASSERT((attributes.Count() == 2) && titleAttributeFound && dateAttributeFound);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

void UT_CGlxAttributeContext::FetchItems_GranularityLessThanRange_IndexFiveL()
    {
    // Fetch items with focus on index 5 (granularity less than range)
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(KNumberOfMedia);
    CleanupStack::PushL(mediaList);

    mediaList->SetFocusL(NGlxListDefs::EAbsolute, 5);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with focus on index 5: granularity is 2"));
    iAttributeContext->SetGranularity(KGranularityLessThanRange);
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check 2 item indices are returned: Item indices 5 and 6"));
    EUNIT_ASSERT((itemIndices.Count() == KGranularityLessThanRange) && itemIndices[0] == 5 && itemIndices[1] == 6);

    TBool titleAttributeFound = FindAttribute(attributes, KMPXMediaGeneralTitle);
    TBool dateAttributeFound = FindAttribute(attributes, KMPXMediaGeneralDate);

    EUNIT_PRINT(_L("Check 2 attributes returned: Title and date"));
    EUNIT_ASSERT((attributes.Count() == 2) && titleAttributeFound && dateAttributeFound);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

void UT_CGlxAttributeContext::FetchItems_GranularityGreaterThanRangeL()
    {
    // Fetch items with focus on index 4 (granularity greater than range)
    CGlxMediaListTest* mediaList = CGlxMediaListTest::NewL(KNumberOfMedia);
    CleanupStack::PushL(mediaList);

    mediaList->SetFocusL(NGlxListDefs::EAbsolute, 4);

    RArray<TInt> itemIndices;
    CleanupClosePushL(itemIndices);

    RArray<TMPXAttribute> attributes;
    CleanupClosePushL(attributes);

    CMPXAttributeSpecs* attributeSpecs = NULL;

    EUNIT_PRINT(_L("Fetch items with focus on index 4: granularity is 7"));
    iAttributeContext->SetGranularity(KGranularityGreaterThanRange);
    iAttributeContext->AttributeRequestL(mediaList, itemIndices, attributes, attributeSpecs);

    EUNIT_PRINT(_L("Check 4 item indices are returned: Item indices 5, 3, 6 and 2"));
    EUNIT_ASSERT((itemIndices.Count() == 4) && itemIndices[0] == 5 && itemIndices[1] == 3 && itemIndices[2] == 6 && itemIndices[3] == 2);

    TBool titleAttributeFound = FindAttribute(attributes, KMPXMediaGeneralTitle);
    TBool dateAttributeFound = FindAttribute(attributes, KMPXMediaGeneralDate);

    EUNIT_PRINT(_L("Check 2 attributes returned: Title and date"));
    EUNIT_ASSERT((attributes.Count() == 2) && titleAttributeFound && dateAttributeFound);

    delete attributeSpecs;
    attributeSpecs = NULL;

    CleanupStack::Pop();
    attributes.Close();

    CleanupStack::Pop();
    itemIndices.Close();

    CleanupStack::PopAndDestroy();
    }

TBool UT_CGlxAttributeContext::FindAttribute(RArray<TMPXAttribute>& aAttributes, const TMPXAttribute& aAttribute)
    {
    TIdentityRelation<TMPXAttribute> match(&TMPXAttribute::Match);
    TInt index = aAttributes.Find(aAttribute, match);
    if (index == KErrNotFound)
        {
        return EFalse;
        }

    return ETrue;
    }

UT_CGlxAttributeContext::CGlxMediaListTest* UT_CGlxAttributeContext::CGlxMediaListTest::NewL(TUint aNumberOfMedia)
    {
    CGlxMediaListTest* self = new (ELeave) CGlxMediaListTest();
    CleanupStack::PushL(self);
    self->ConstructL(aNumberOfMedia);
    CleanupStack::Pop();
    return self;
    }

UT_CGlxAttributeContext::CGlxMediaListTest::~CGlxMediaListTest()
    {
    for (TInt count = 0; count < iMedias.Count(); ++count)
        {
        delete iMedias[count];
        }

    iMedias.Close();
    iItems.Close();
    iSelectedItems.Close();
    }

UT_CGlxAttributeContext::CGlxMediaListTest::CGlxMediaListTest() :
        iFocusIndex(KErrNotFound), iMedias(), iItems(), iSelectedItems()
    {
    }

void UT_CGlxAttributeContext::CGlxMediaListTest::ConstructL(TUint aNumberOfMedia)
    {
    for (TInt count = 0; count < aNumberOfMedia; ++count)
        {
        CreateMediaL(count + 1);
        }
    }

void UT_CGlxAttributeContext::CGlxMediaListTest::CreateMediaL(TUint aMediaId)
    {
    TGlxMediaId id(aMediaId);
    CGlxMedia* cGlxMedia = NULL;

    TInt modulo = (aMediaId - 1) % 5;
    if (modulo > 0)
        {
        cGlxMedia = new (ELeave) CGlxMedia(id);
        CleanupStack::PushL(cGlxMedia);

        if (modulo == 1)
            {
            // No attributes
            }
        else if (modulo == 2)
            {
            cGlxMedia->SetTextValueL(KMPXMediaGeneralTitle, _L("Title"));
            }
        else if (modulo == 3)
            {
            cGlxMedia->SetTextValueL(KMPXMediaGeneralDate, _L("Date"));
            }
        else if (modulo == 4)
            {
            cGlxMedia->SetTextValueL(KMPXMediaGeneralTitle, _L("Title"));
            cGlxMedia->SetTextValueL(KMPXMediaGeneralDate, _L("Date"));
            }

        iMedias.AppendL(cGlxMedia);
        CleanupStack::Pop();
        }

    TGlxMedia tGlxMedia(id, cGlxMedia);
    iItems.AppendL(tGlxMedia);
    }

//  TEST TABLE

EUNIT_BEGIN_TEST_TABLE(
    UT_CGlxAttributeContext,
    "Unit tests for CGlxAttributeContext",
    "UNIT" )
/*
EUNIT_TEST(
    "CGlxAttributeContext - test ",
    "CGlxAttributeContext",
    "CGlxAttributeContext",
    "FUNCTIONALITY",
    SetupL, UT_CGlxAttributeContext_CGlxAttributeContextL, Teardown)

EUNIT_TEST(
    "AddAttributeL - test ",
    "CGlxAttributeContext",
    "AddAttributeL",
    "FUNCTIONALITY",
    SetupL, UT_CGlxAttributeContext_AddAttributeLL, Teardown)

EUNIT_TEST(
    "RemoveAttribute - test ",
    "CGlxAttributeContext",
    "RemoveAttribute",
    "FUNCTIONALITY",
    SetupL, UT_CGlxAttributeContext_RemoveAttributeL, Teardown)

EUNIT_TEST(
    "AllAttributesL - test ",
    "CGlxAttributeContext",
    "AllAttributesL",
    "FUNCTIONALITY",
    SetupL, UT_CGlxAttributeContext_AllAttributesLL, Teardown)
*/
EUNIT_TEST(
    "AttributeRequestL - test ",
    "CGlxAttributeContext",
    "AttributeRequestL",
    "FUNCTIONALITY",
    SetupL, UT_CGlxAttributeContext_AttributeRequestLL, Teardown)


EUNIT_END_TEST_TABLE

//  END OF FILE