windowing/windowserver/tauto/tdirecta2.cpp
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 11:31:11 +0100
branchNewGraphicsArchitecture
changeset 47 48b924ae7197
parent 0 5d03bc08d59c
permissions -rw-r--r--
Applied patch 1, to provide a syborg specific minigui oby file. Need to compare this with the "stripped" version currently in the tree. This supplied version applies for Nokia builds, but need to repeat the test for SF builds to see if pruning is needed, or if the file needs to be device-specific.

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