diff -r bf7481649c98 -r 7f25ef56562d windowing/windowserver/test/tauto/tdirecta2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/test/tauto/tdirecta2.cpp Wed Jun 23 19:41:15 2010 +0300 @@ -0,0 +1,185 @@ +// Copyright (c) 2008-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: +// Test Direct Screen Access on a screen that supports transparency +// +// + +#include "tdirecta2.h" + +const TInt KMainTestOrdinalPriority=65535; +const TInt KOntopOfAllOthersTestOrdinalPriority=65537; + +CTDirect2::CTDirect2(CTestStep* aStep): + CTWsGraphicsBase(aStep) + { + } + +CTDirect2::~CTDirect2() + { + delete iDsa; + delete iUnderWindow; + delete iOverWindow; + delete iScreenDevice; + delete iWindowGroup; + delete iTimer; + + // put focus back to current screen as this test changed the focus screen to primary screen + TheClient->iWs.SetFocusScreen(iTest->iScreenNumber); + } + +void CTDirect2::ConstructL() + { + // the following line makes sure that a console object hidden outside of + // screens range doesn't affect test results being on top of tested objects + TheClient->iGroup->GroupWin()->SetOrdinalPosition(0, KMainTestOrdinalPriority); + } + +TInt CTDirect2::Timeout(TAny* aDirect2) + { + static_cast(aDirect2)->HandleTimeout(); + return KErrNone; + } + +void CTDirect2::HandleTimeout() + { + // Send window group to back to avoid possibility of it + // interfering with other parts of this test + iWindowGroup->GroupWin()->SetOrdinalPosition(0, -1); + + iTimer->Cancel(); // Don't call back again + TEST(EFalse); // Fail the test, as we didn't get a DSA abort within timeout period + iTestCaseComplete = ETrue; // Move to next test case + } + +void CTDirect2::AbortNow(RDirectScreenAccess::TTerminationReasons /*aReason*/) + { + iTimer->Cancel(); // As soon as abort is received, we don't need the timer anymore + } + +void CTDirect2::Restart(RDirectScreenAccess::TTerminationReasons /*aReason*/) + { + // Send window group to back to avoid possibility of it + // interfering with other tests + iWindowGroup->GroupWin()->SetOrdinalPosition(0, -1); + + iTestCaseComplete = ETrue; // Move to next test case + + // Don't bother restarting DSA, we were only interested in making sure the abort was sent by wserv + } + +// Starts DSA on a topmost window, then puts a translucent window ontop of it +// to make sure wserv sends a DSA Abort even though the translucent window +// hasn't changed the visible area of the DSA window +void CTDirect2::StartTranslucentWindowOverDsaL() + { + // Use a new window group so we can put windows ontop of all others + iWindowGroup = new(ELeave) CTWindowGroup(TheClient); + iWindowGroup->ConstructL(); + + // Create new blank window + iUnderWindow = new(ELeave) CTBlankWindow(); + iUnderWindow->SetUpL(TPoint(10,10), TSize(100,100), iWindowGroup, *TheClient->iGc); + iUnderWindow->SetColor(TRgb(0,192,0)); + + // Make window group visible ontop of all others + User::LeaveIfError(iWindowGroup->GroupWin()->SetOrdinalPositionErr(0, KOntopOfAllOthersTestOrdinalPriority)); + TheClient->Flush(); + + // Call Finish() to wait until under window has been rendered. + // Once window has been rendered, we can be sure window server has + // calculated the "top visible" region of the window. + TheClient->iWs.Finish(); + + // Start DSA on under window + iScreenDevice = new(ELeave) CWsScreenDevice(TheClient->iWs); + User::LeaveIfError(iScreenDevice->Construct(iTest->iScreenNumber)); + iDsa = CDirectScreenAccess::NewL(TheClient->iWs, *iScreenDevice, *iUnderWindow->BaseWin(), *this); + iDsa->StartL(); + + // Put translucent window ontop so as to reduce the top visible area, but leave the + // visible area unchanged (as the translucent window doesn't change the visible area + // of the window underneath it). + iOverWindow = new(ELeave) CTTitledWindow(); + _LIT(KTranslucentWindowTitle, "Translucent window"); + iOverWindow->SetUpL(TPoint(60,60), TSize(150,100), iWindowGroup, *TheClient->iGc, NULL, ETrue); + TWindowTitle windowTitle(KTranslucentWindowTitle); + iOverWindow->SetTitle(windowTitle); + iOverWindow->SetColor(TRgb(192, 0, 0, 128)); + TheClient->Flush(); + + // Start a timer, if the timeout triggers, fail the test, as we should get + // an abort DSA from wserv within the timeout + iTimer = CPeriodic::NewL(CActive::EPriorityStandard); + const TInt KTimeoutPeriod = 5000000; // 5 seconds should give the client plenty of time to respond to the abort + iTimer->Start(KTimeoutPeriod, 0, TCallBack(CTDirect2::Timeout, this)); + + // Do nothing more here, once over win is rendered, wserv should cause CAbortTest::AbortNow + // to be called + } + +void CTDirect2::RunTestCaseL(TInt aCurTestCase) + { + ((CTDirect2Step*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName); + switch(aCurTestCase) + { +/** +@SYMTestCaseID GRAPHICS-WSERV-0176 + +@SYMDEF PDEF116863 + +@SYMTestCaseDesc Overlapping a translucent window ontop of a DSA window should abort DSA + +@SYMTestPriority High + +@SYMTestStatus Implemented + +@SYMTestActions Start DSA on a blank window. + Then place a translucent window so that it partially overlaps the DSA window. + +@SYMTestExpectedResults Wserv should send a DSA abort when the translucent window is placed ontop of the DSA window. +*/ + case 1: + ((CTDirect2Step*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0176")); + if (!iOnceOnly) + { + _LIT(DSA1,"Translucent window overlaping DSA window"); + INFO_PRINTF1(DSA1); + StartTranslucentWindowOverDsaL(); // call this only once + iOnceOnly = ETrue; + } + if (!iTestCaseComplete) + { + // Keep calling this test case until iTestCaseComplete is true + ResetCounter(aCurTestCase-1); + } + else + { + iOnceOnly = EFalse; + // Move to next test case in sequence + iTestCaseComplete = EFalse; + } + break; + + default: + INFO_PRINTF1(_L("Test complete\n")); + ((CTDirect2Step*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName); + ((CTDirect2Step*)iStep)->CloseTMSGraphicsStep(); + TestComplete(); + break; + } + ((CTDirect2Step*)iStep)->RecordTestResultL(); + } + +__WS_CONSTRUCT_STEP__(Direct2) +