// Copyright (c) 1996-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:
// ORDINAL.CPP
// Test ordinal position and priority changes on windows
//
//
/**
@file
@test
@internalComponent - Internal Symbian test code
*/
#include "TORDINAL.H"
_LIT(KLogNextSibling,"NextSibling of iChild%d is not iChild%d");
_LIT(KLogNoNextSibling,"iChild%d has a NextSibling when it shouldn't");
_LIT(KLogPrevSibling,"PrevSibling of iChild%d is not iChild%d");
_LIT(KLogNoPrevSibling,"iChild%d has a PrevSibling when it shouldn't");
CTOrdinal::CTOrdinal(CTestStep* aStep):
CTWsGraphicsBase(aStep)
{
}
COrdinalWindowBase::COrdinalWindowBase(CTClient *aClient, CTestBase* aTest, CTestStep* aTestStep) : iClient(aClient), iTest(aTest), iTestStep(aTestStep)
{
}
COrdinalWindow::COrdinalWindow(CTClient *aClient, CTestBase* aTest, CTestStep* aTestStep) : COrdinalWindowBase(aClient, aTest, aTestStep), iClientWin(aClient->iWs)
{
__DECLARE_NAME(_S("COrdinalWindow"));
}
COrdinalWindowGroup::COrdinalWindowGroup(CTClient *aClient, CTestBase* aTest, CTestStep* aTestStep) : COrdinalWindowBase(aClient, aTest, aTestStep), iGroupWin(aClient->iWs)
{
__DECLARE_NAME(_S("COrdinalWindowGroup"));
}
COrdinalWindowBase::~COrdinalWindowBase()
{
if (iWin)
iWin->Close();
}
void COrdinalWindowBase::Draw()
{}
inline RWindowTreeNode* COrdinalWindowBase::WinTreeNode()
{
return(iWin);
}
inline TUint32 COrdinalWindowBase::Handle()
{
return reinterpret_cast<TUint>(this);
}
COrdinalWindowBase *COrdinalWindowGroup::NewL(CTClient *aClient, CTestBase* aTest, CTestStep* aTestStep)
{
COrdinalWindowGroup *oWin=new(ELeave) COrdinalWindowGroup(aClient, aTest, aTestStep);
TInt err=oWin->iGroupWin.Construct((TUint32)oWin);
if (err<0)
{
delete oWin;
User::Leave(err);
}
oWin->iWin= &oWin->iGroupWin;
return(oWin);
}
COrdinalWindowBase *COrdinalWindow::NewL(CTClient* aClient, RWindowTreeNode* aParent, CTestBase* aTest, CTestStep* aTestStep)
{
COrdinalWindow *oWin=new(ELeave) COrdinalWindow(aClient, aTest, aTestStep);
TInt err=oWin->iClientWin.Construct(*aParent,(TUint32)oWin);
if (err!=KErrNone)
{
delete oWin;
User::Leave(err);
}
oWin->iClientWin.Activate();
oWin->iWin= &oWin->iClientWin;
return(oWin);
}
TInt COrdinalWindowBase::OrdinalPosition()
{
return(iWin->OrdinalPosition());
}
void COrdinalWindowBase::SetOrdinalPosition(TInt aPos)
{
iWin->SetOrdinalPosition(aPos);
}
void COrdinalWindowBase::SetOrdinalPosition(TInt aPos,TInt aPri)
{
iWin->SetOrdinalPosition(aPos,aPri);
}
CTOrdinal::~CTOrdinal()
{
delete iClient;
}
void DZ(COrdinalWindowBase * &aX)
{
delete aX;
aX=NULL;
}
void CTOrdinal::DestroyWindows()
{
DZ(iParent);
DZ(iParent2);
DZ(iParent3);
for(TInt child=0;child<ENumChildren;++child)
DZ(iChild[child]);
}
void COrdinalWindowBase::TestOP(TInt aTestPos)
{
iTestStep->TEST(iWin->OrdinalPosition()==aTestPos);
}
void COrdinalWindowBase::SetAndTestOP(TInt aPos,TInt aTestPos)
{
iWin->SetOrdinalPosition(aPos);
iTestStep->TEST(iWin->OrdinalPosition()==aTestPos);
}
void COrdinalWindowBase::SetAndTestOP(TInt aPos)
{
SetAndTestOP(aPos, aPos);
}
TInt COrdinalWindowBase::SetToLastAndGetOP()
{
iWin->SetOrdinalPosition(-1);
return(iWin->OrdinalPosition());
}
TInt COrdinalWindowBase::SetToLastAndGetOPPri(TInt aPri)
{
iWin->SetOrdinalPosition(-1, aPri);
return(iWin->OrdinalPosition());
}
void COrdinalWindowBase::SetAndTestOPPri(TInt aPos,TInt aPri,TInt aTestPos)
{
iWin->SetOrdinalPosition(aPos,aPri);
iTestStep->TEST(iWin->OrdinalPosition()==aTestPos);
iTestStep->TEST(iWin->OrdinalPriority()==aPri);
}
void COrdinalWindowBase::SetAndTestOPPri(TInt aPos,TInt aPri)
{
SetAndTestOPPri(aPos,aPri,aPos);
}
inline COrdinalWindowBase* COrdinalWindowBase::NextSibling() const
{
return reinterpret_cast<COrdinalWindow*>(iWin->NextSibling());
}
inline COrdinalWindowBase* COrdinalWindowBase::PrevSibling() const
{
return reinterpret_cast<COrdinalWindow*>(iWin->PrevSibling());
}
void CTOrdinal::TestWindowOrderNext(TInt aBefore,TInt aAfter)
{
TInt retVal=(iChild[aBefore]->NextSibling()==iChild[aAfter]);
TEST(retVal);
if (!retVal)
LOG_MESSAGE3(KLogNextSibling,aBefore,aAfter);
}
void CTOrdinal::TestWindowOrderNext(TInt aLast)
{
TInt retVal=(iChild[aLast]->NextSibling()==0);
TEST(retVal);
if (!retVal)
LOG_MESSAGE2(KLogNoNextSibling,aLast);
}
void CTOrdinal::TestWindowOrderPrev(TInt aAfter,TInt aBefore)
{
TInt retVal=(iChild[aAfter]->PrevSibling()==iChild[aBefore]);
TEST(retVal);
if (!retVal)
LOG_MESSAGE3(KLogPrevSibling,aAfter,aBefore);
}
void CTOrdinal::TestWindowOrderPrev(TInt aFirst)
{
TInt retVal=(iChild[aFirst]->PrevSibling()==0);
TEST(retVal);
if (!retVal)
LOG_MESSAGE2(KLogNoPrevSibling,aFirst);
}
void CTOrdinal::OrdinalPos()
{
TInt last=iChild[0]->SetToLastAndGetOP();
iChild[0]->SetAndTestOP(0);
iChild[5]->TestOP(5);
iChild[1]->SetAndTestOP(3);
iChild[0]->SetAndTestOP(0);
iChild[0]->SetAndTestOP(-1,last);
iChild[0]->SetAndTestOP(-1000,last);
iChild[0]->SetAndTestOP(2);
iChild[0]->SetAndTestOP(-1000,last);
iChild[0]->SetAndTestOP(0);
for(TInt index=0;index<=5;index++)
iChild[4]->SetAndTestOP(index,index);
iChild[0]->SetAndTestOP(-1,last);
iChild[1]->SetAndTestOP(-1,last);
iChild[2]->SetAndTestOP(-1,last);
iChild[3]->SetAndTestOP(-1,last);
iChild[4]->SetAndTestOP(-1,last);
iChild[5]->SetAndTestOP(-1,last);
TInt child;
for (child=0;child<ENumChildren-1;++child)
TestWindowOrderNext(child,child+1);
TestWindowOrderNext(5);
}
void CTOrdinal::OrdinalPriority()
{
TBool retVal;
TInt last12=iChild[2]->SetToLastAndGetOPPri(12);
iChild[2]->TestOP(last12);
TInt lastKMax=iChild[2]->SetToLastAndGetOPPri(KMaxTInt32);
iChild[2]->TestOP(lastKMax);
TInt last=iChild[2]->SetToLastAndGetOPPri(0);
iChild[2]->TestOP(last);
iChild[2]->SetAndTestOPPri(-1,12,last12); // One and only pri 12 window
iChild[3]->SetAndTestOPPri(-1,KMaxTInt32,lastKMax); // One and only pri KMaxTInt32 window
iChild[1]->SetAndTestOPPri(0,KMaxTInt32);
iChild[5]->SetAndTestOP(-1,last-3);
iChild[1]->TestOP(0);
iChild[0]->SetAndTestOPPri(0,50);
iChild[1]->SetAndTestOPPri(0,50);
iChild[2]->SetAndTestOPPri(0,50);
iChild[3]->SetAndTestOPPri(0,50);
iChild[1]->TestOP(2);
if (iGroupTest)
{
retVal=(reinterpret_cast<CBase*>(iChild[0]->NextSibling())==iClient->iGroup);
TEST(retVal);
if (!retVal)
{
_LIT(KLog,"iChild0 NextSibling is not the main group window");
LOG_MESSAGE(KLog);
}
retVal=(reinterpret_cast<CBase*>(iClient->iGroup->NextSibling())==iChild[4]);
TEST(retVal);
if (!retVal)
{
_LIT(KLog,"NextSibling of main group window is not iChild4");
LOG_MESSAGE(KLog);
}
}
else
TestWindowOrderNext(0,4);
TestWindowOrderNext(4,5);
TestWindowOrderNext(5);
iChild[2]->SetAndTestOPPri(5,-1,0);
iChild[3]->SetAndTestOPPri(5,-1,1);
TestWindowOrderNext(5,2);
iChild[0]->SetAndTestOPPri(100000,KMinTInt32,0);
iChild[1]->SetAndTestOPPri(200000,KMinTInt32,1);
iChild[2]->SetAndTestOPPri(300000,KMinTInt32,2);
iChild[5]->SetAndTestOPPri(0,0,0);
iChild[3]->TestOP(0);
iChild[0]->SetAndTestOPPri(0,-1);
iChild[1]->SetAndTestOPPri(0,-1);
iChild[2]->SetAndTestOPPri(0,-1);
iChild[3]->SetAndTestOPPri(0,1);
iChild[4]->SetAndTestOPPri(0,1);
iChild[5]->SetAndTestOPPri(0,1);
TestWindowOrderPrev(0,1);
TestWindowOrderPrev(1,2);
if (iGroupTest)
{
retVal=(reinterpret_cast<CBase*>(iChild[2]->PrevSibling())==iClient->iGroup);
TEST(retVal);
if (!retVal)
{
_LIT(KLog,"iChild2 PrevSibling is not the main group window");
LOG_MESSAGE(KLog);
}
retVal=(reinterpret_cast<CBase*>(iClient->iGroup->PrevSibling())==iChild[3]);
TEST(retVal);
if (!retVal)
{
_LIT(KLog,"PrevSibling of main group window is not iChild3");
LOG_MESSAGE(KLog);
}
}
else
TestWindowOrderPrev(2,3);
TestWindowOrderPrev(3,4);
TestWindowOrderPrev(4,5);
TestWindowOrderPrev(5);
}
void CTOrdinal::ConstructL()
{
iClient=new(ELeave) COrdinalClient();
iClient->SetScreenNumber(iTest->iScreenNumber);
iClient->ConstructL();
}
/**
@SYMTestCaseID GRAPHICS-WSERV-0446
@SYMCR CR1164
@SYMTestCaseDesc Test ClientHandle function returns right value
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Call this function on windows at various times
@SYMTestExpectedResults The value set when window was created is returned
*/
void CTOrdinal::CreateWindowsL(TInt aMode)
{
RWindowTreeNode* parent=NULL;
RWindowTreeNode* base=iClient->iGroup->WinTreeNode();
TInt errors=0;
if (base->Child()!=0)
{
_LIT(KErrText,"Main Group Window has children at start of test");
LOG_MESSAGE(KErrText);
AutoPanic(EAutoPanicGroupWinHasChild);
}
if (base->ClientHandle()!=reinterpret_cast<TUint32&>(iClient->iGroup))
++errors;
if (base->Parent()!=0)
++errors;
TEST(errors==0);
if (errors>0)
{
_LIT(KErrText,"Handles of Main Group Window are not as expected");
LOG_MESSAGE2(KErrText,errors);
}
iGroupTest=EFalse;
switch(aMode)
{
case 3:
iParent=COrdinalWindow::NewL(iClient,base,iTest,iStep);
parent=iParent->WinTreeNode();
CheckHandlesOnNewWindow(iClient->iGroup,iParent);
break;
case 1:
parent=iClient->iGroup->WinTreeNode();
break;
case 2:
iParent=COrdinalWindow::NewL(iClient,base,iTest,iStep);
CheckHandlesOnNewWindow(iClient->iGroup,iParent);
iParent2=COrdinalWindow::NewL(iClient,iParent->WinTreeNode(),iTest,iStep);
CheckHandlesOnNewWindow(iParent,iParent2);
iParent3=COrdinalWindow::NewL(iClient,iParent2->WinTreeNode(),iTest,iStep);
parent=iParent3->WinTreeNode();
CheckHandlesOnNewWindow(iParent2,iParent3);
break;
case 0:
iGroupTest=ETrue;
for (TInt child=ENumChildren-1;child>=0;--child)
iChild[child]=COrdinalWindowGroup::NewL(iClient,iTest,iStep);
CheckHandles(0);
return;
}
for (TInt child=ENumChildren-1;child>=0;--child)
{
iChild[child]=COrdinalWindow::NewL(iClient,parent,iTest,iStep);
if (iChild[child]->Handle()!=parent->Child())
++errors;
}
TEST(errors==0);
if (errors>0)
{
_LIT(KErrText,"%d windows were not the first child");
LOG_MESSAGE2(KErrText,errors);
}
CheckHandles(parent->ClientHandle());
}
void CTOrdinal::CheckHandlesOnNewWindow(CTWindowGroup* aParent,COrdinalWindowBase* aWin)
{
TInt errors=0;
if (aParent->WinTreeNode()->Child()!=aWin->Handle())
++errors;
if (aWin->WinTreeNode()->Parent()!=reinterpret_cast<TUint32&>(aParent))
++errors;
CheckHandlesOnNewWindow(errors,aWin);
}
void CTOrdinal::CheckHandlesOnNewWindow(COrdinalWindowBase* aParent,COrdinalWindowBase* aWin)
{
TInt errors=0;
if (aParent->WinTreeNode()->Child()!=aWin->Handle())
++errors;
if (aWin->WinTreeNode()->Parent()!=aParent->Handle())
++errors;
CheckHandlesOnNewWindow(errors,aWin);
}
void CTOrdinal::CheckHandlesOnNewWindow(TInt aErrors,COrdinalWindowBase* aWin)
{
RWindowTreeNode* win=aWin->WinTreeNode();
if (win->ClientHandle()!=aWin->Handle())
++aErrors;
if (win->PrevSibling()!=0)
++aErrors;
if (win->NextSibling()!=0)
++aErrors;
if (win->Child()!=0)
++aErrors;
TEST(aErrors==0);
if (aErrors>0)
{
_LIT(KErrText,"%d errors in handles of newly created window");
LOG_MESSAGE2(KErrText,aErrors);
}
}
void CTOrdinal::CheckHandles(TUint aParent)
{
TInt errors=0;
TInt child;
for (child=0;child<ENumChildren;++child)
{
if (iChild[child]->WinTreeNode()->ClientHandle()!=iChild[child]->Handle())
++errors;
}
TEST(errors==0);
if (errors>0)
{
_LIT(KErrText,"%d windows gave wrong client handle");
LOG_MESSAGE2(KErrText,errors);
errors=0;
}
for (child=0;child<ENumChildren;++child)
{
if (iChild[child]->WinTreeNode()->Parent()!=aParent)
++errors;
}
TEST(errors==0);
if (errors>0)
{
_LIT(KErrText,"%d children gave wrong parent handle");
LOG_MESSAGE2(KErrText,errors);
errors=0;
}
for (child=1;child<ENumChildren;++child)
{
if (iChild[child-1]->WinTreeNode()->NextSibling()!=iChild[child]->Handle())
++errors;
}
if (iChild[5]->WinTreeNode()->NextSibling()!=0 && !iGroupTest)
++errors;
TEST(errors==0);
if (errors>0)
{
_LIT(KErrText,"%d windows gave wrong next sibling handle");
LOG_MESSAGE2(KErrText,errors);
errors=0;
}
if (iChild[0]->WinTreeNode()->PrevSibling()!=0 && !iGroupTest)
++errors;
for (child=1;child<ENumChildren;++child)
{
if (iChild[child]->WinTreeNode()->PrevSibling()!=iChild[child-1]->Handle())
++errors;
}
TEST(errors==0);
if (errors>0)
{
_LIT(KErrText,"%d windows gave wrong prev sibling handle");
LOG_MESSAGE2(KErrText,errors);
}
}
COrdinalClient::COrdinalClient()
{
}
void COrdinalClient::ConstructL()
{
User::LeaveIfError(iWs.Connect());
// change to correct screen
//
iScreen = new (ELeave) CWsScreenDevice(iWs);
User::LeaveIfError(iScreen->Construct(iScreenNumber));
TheClient->iGroup->WinTreeNode()->SetOrdinalPosition(0,-2000000000);
TheClient->iWs.Flush();
iGroup=new(ELeave) CTWindowGroup(this);
iGroup->ConstructL();
}
COrdinalClient::~COrdinalClient()
{
TheClient->iGroup->WinTreeNode()->SetOrdinalPosition(0,0);
}
void COrdinalClient::KeyL(const TKeyEvent &,const TTime &)
{
}
void CTOrdinal::RunTestCaseL(TInt /*aCurTestCase*/)
{
_LIT(KTest1,"Ordinal 1");
((CTOrdinalStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
switch(++iTest->iState)
{
/**
@SYMTestCaseID GRAPHICS-WSERV-0217
@SYMDEF DEF081259
@SYMTestCaseDesc Test ordinal position and priority changes on windows
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Set different ordinal positions and priorities on a
number of windows and check they have been set
correctly
@SYMTestExpectedResults The positions and priorities are set correctly
*/
case 1:
((CTOrdinalStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0217"));
iTest->LogSubTest(KTest1);
{
for(TInt index=0;index<4;index++)
{
((CTOrdinalStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0446"));
CreateWindowsL(index);
((CTOrdinalStep*)iStep)->RecordTestResultL();
OrdinalPos();
OrdinalPriority();
DestroyWindows();
}
}
((CTOrdinalStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0217"));
if (!iStep->TestStepResult() == EPass)
TEST(EFalse);
break;
default:
((CTOrdinalStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
((CTOrdinalStep*)iStep)->CloseTMSGraphicsStep();
TestComplete();
break;
};
((CTOrdinalStep*)iStep)->RecordTestResultL();
}
__WS_CONSTRUCT_STEP__(Ordinal)