--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tauto/tdirecta2.cpp Tue Feb 02 01:47:50 2010 +0200
@@ -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<CTDirect2*>(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)
+