os/graphics/windowing/windowserver/test/tauto/TMODCHG.CPP
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// Coverted from TMan test code (TMMODCHG.CPP) August 2000
sl@0
    15
// Test modifier changed message
sl@0
    16
// 
sl@0
    17
//
sl@0
    18
sl@0
    19
/**
sl@0
    20
 @file
sl@0
    21
 @test
sl@0
    22
 @internalComponent - Internal Symbian test code
sl@0
    23
*/
sl@0
    24
sl@0
    25
#include "TMODCHG.H"
sl@0
    26
sl@0
    27
#define LOGGING on	//Uncoment this line to get extra logging
sl@0
    28
sl@0
    29
struct TModifierChangedTestsParams
sl@0
    30
	{
sl@0
    31
	TText *txt;			// Text message telling user what to do
sl@0
    32
	TUint changed;
sl@0
    33
	TUint state;
sl@0
    34
	TUint stateMask;
sl@0
    35
	};
sl@0
    36
sl@0
    37
LOCAL_D TModifierChangedTestsParams ModifierChangedTests[]={
sl@0
    38
	{(TText *)_S("Press Caps"),EModifierCapsLock,EModifierCapsLock,EModifierCapsLock},
sl@0
    39
	{(TText *)_S("Press Caps (again)"),EModifierCapsLock,0,EModifierCapsLock},
sl@0
    40
	{(TText *)_S("Press left shift"),EModifierShift|EModifierLeftShift,EModifierShift|EModifierLeftShift,EModifierShift|EModifierLeftShift},
sl@0
    41
	{(TText *)_S("Release left shift"),EModifierShift|EModifierLeftShift,0,EModifierShift|EModifierLeftShift},
sl@0
    42
	{(TText *)_S("Press right shift"),EModifierShift|EModifierRightShift,EModifierShift|EModifierRightShift,EModifierShift|EModifierRightShift},
sl@0
    43
	{(TText *)_S("Release right shift"),EModifierShift|EModifierRightShift,0,EModifierShift|EModifierRightShift},
sl@0
    44
	{(TText *)_S("Press (left) func"),EModifierFunc|EModifierLeftFunc,EModifierFunc|EModifierLeftFunc,EModifierFunc|EModifierLeftFunc},
sl@0
    45
	{(TText *)_S("Release (left) func"),EModifierFunc|EModifierLeftFunc,0,EModifierFunc|EModifierLeftFunc},
sl@0
    46
	{(TText *)_S("Press (left) control"),EModifierCtrl|EModifierLeftCtrl,EModifierCtrl|EModifierLeftCtrl,EModifierCtrl|EModifierLeftCtrl},
sl@0
    47
	{(TText *)_S("Release (left) control"),EModifierCtrl|EModifierLeftCtrl,0,EModifierCtrl|EModifierLeftCtrl},
sl@0
    48
	};
sl@0
    49
sl@0
    50
// list of ModifierEvents that should be monitored
sl@0
    51
LOCAL_D TInt ModifierChangedEvents=EModifierShift|EModifierLeftShift|EModifierRightShift|
sl@0
    52
	EModifierCapsLock|EModifierFunc|EModifierLeftFunc|EModifierCtrl|EModifierLeftCtrl;
sl@0
    53
sl@0
    54
const TInt numTests=sizeof(ModifierChangedTests)/sizeof(ModifierChangedTests[0]);
sl@0
    55
sl@0
    56
sl@0
    57
//
sl@0
    58
// CTEventWindowGroup class //
sl@0
    59
//
sl@0
    60
sl@0
    61
CTEventWindowGroup::CTEventWindowGroup(CTClient *aClient, CTModifiersChanged *aTest) : CTWindowGroup(aClient), iTest(aTest)
sl@0
    62
	{}
sl@0
    63
sl@0
    64
void CTEventWindowGroup::ConstructL()
sl@0
    65
	{
sl@0
    66
	CTWindowGroup::ConstructL();
sl@0
    67
	iGroupWin.EnableModifierChangedEvents(ModifierChangedEvents,EEventControlAlways);
sl@0
    68
	}
sl@0
    69
sl@0
    70
void CTEventWindowGroup::ModifiersChanged(const TModifiersChangedEvent &aModifiersChanged, const TTime &)
sl@0
    71
	{
sl@0
    72
	iTest->TestModifiersState(aModifiersChanged); // tests if event is correct
sl@0
    73
	}
sl@0
    74
sl@0
    75
void CTEventWindowGroup::KeyL(const TKeyEvent &aKey,const TTime &)
sl@0
    76
	{
sl@0
    77
	if (aKey.iCode==EKeyEscape || (aKey.iCode==' ' && iTest->iModSetTest))
sl@0
    78
		iTest->EndTest(); // not really needed, because timer cancels long running tests
sl@0
    79
	}
sl@0
    80
sl@0
    81
//
sl@0
    82
// CMCWindow, class //
sl@0
    83
//
sl@0
    84
sl@0
    85
CMCWindow::CMCWindow(CTModifiersChanged *aTest) : CTWin(), iTest(aTest)
sl@0
    86
	{
sl@0
    87
	iBack=TRgb::Gray256(230);
sl@0
    88
	}
sl@0
    89
sl@0
    90
void CMCWindow::SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
sl@0
    91
	{
sl@0
    92
	ConstructExtLD(*parent,pos,size);
sl@0
    93
	iWin.SetBackgroundColor(iBack);
sl@0
    94
	Activate();
sl@0
    95
	AssignGC(aGc);
sl@0
    96
	iLineHeight=iFont->HeightInPixels()*5/4;
sl@0
    97
	iFontAscent=iFont->AscentInPixels();
sl@0
    98
	iXpos1=4;
sl@0
    99
	iXpos2=iXpos1+12*iFont->TextWidthInPixels(_L("M"));
sl@0
   100
	}
sl@0
   101
sl@0
   102
void CMCWindow::DrawModSetLine(const TDesC &aDes,TInt aModifier,TInt iSettableModifiers)
sl@0
   103
	{
sl@0
   104
	iYpos+=iLineHeight;
sl@0
   105
	iGc->DrawText(aDes, TPoint(iXpos1,iYpos));
sl@0
   106
	iGc->DrawText(aModifier&iSettableModifiers ? _L("Yes"):_L("No"), TPoint(iXpos2,iYpos));
sl@0
   107
	}
sl@0
   108
sl@0
   109
void CMCWindow::Draw()
sl@0
   110
	{
sl@0
   111
	iGc->Clear();
sl@0
   112
	if (iTest->iModSetTest)
sl@0
   113
		{
sl@0
   114
		iYpos=iFontAscent+3;
sl@0
   115
		TBuf<32> buf;
sl@0
   116
		buf.Format(TRefByValue<const TDesC>(_L("Settable? [0x%4x]")), iTest->iSettable);
sl@0
   117
		iGc->DrawText(_L("Modifier"), TPoint(iXpos1,iYpos));
sl@0
   118
		iGc->DrawText(buf, TPoint(iXpos2,iYpos));
sl@0
   119
		DrawModSetLine(_L("Shift"),EModifierShift,iTest->iSettable);
sl@0
   120
		DrawModSetLine(_L("Left Shift"),EModifierLeftShift,iTest->iSettable);
sl@0
   121
		DrawModSetLine(_L("Func"),EModifierFunc,iTest->iSettable);
sl@0
   122
		DrawModSetLine(_L("Caps"),EModifierCapsLock,iTest->iSettable);
sl@0
   123
		DrawModSetLine(_L("NumLock"),EModifierNumLock,iTest->iSettable);
sl@0
   124
		DrawModSetLine(_L("Double Click"),EModifierDoubleClick,iTest->iSettable);
sl@0
   125
		}
sl@0
   126
	else
sl@0
   127
		iGc->DrawText(TPtrC(ModifierChangedTests[iTest->SubState()].txt), TPoint(10,20));
sl@0
   128
	}
sl@0
   129
sl@0
   130
//
sl@0
   131
sl@0
   132
CTModifiersChanged::CTModifiersChanged(CTestStep* aStep): CTWsGraphicsBase(aStep), 
sl@0
   133
	iSkipFirstModifierEvents(EFalse), iSubSchedulerRunning(EFalse)
sl@0
   134
	{
sl@0
   135
	}
sl@0
   136
sl@0
   137
CTModifiersChanged::~CTModifiersChanged()
sl@0
   138
	{
sl@0
   139
	delete iTimeOut;
sl@0
   140
	delete iWin;
sl@0
   141
	delete iEventGroup;
sl@0
   142
	}
sl@0
   143
sl@0
   144
void CTModifiersChanged::ConstructL()
sl@0
   145
	{
sl@0
   146
	iTimeOut=new(ELeave) CTimeOut();
sl@0
   147
	iTimeOut->ConstructL();
sl@0
   148
	iWin=new(ELeave) CMCWindow(this);
sl@0
   149
	iWin->SetUpL(TPoint(10,10),TSize(240,200),Client()->iGroup, *Client()->iGc);
sl@0
   150
	}
sl@0
   151
sl@0
   152
TInt CTModifiersChanged::TimeOut(TAny* aTest) // static
sl@0
   153
	{
sl@0
   154
	static_cast<CTModifiersChanged*>(aTest)->TimeOut();
sl@0
   155
	return(KErrNone);
sl@0
   156
	}
sl@0
   157
sl@0
   158
void CTModifiersChanged::TimeOut()
sl@0
   159
	{
sl@0
   160
	#if defined(LOGGING)
sl@0
   161
		_LIT(KLogTimeOut,"Test timed out after %d secs.");
sl@0
   162
		LOG_MESSAGE2(KLogTimeOut,KTimeOutAfter/1000000);
sl@0
   163
	#endif
sl@0
   164
	EndTest();
sl@0
   165
	}
sl@0
   166
sl@0
   167
void CTModifiersChanged::EndTest() 
sl@0
   168
	{
sl@0
   169
	TEST(EFalse); // test failed (timeout or manually cancelled)
sl@0
   170
	if (iModSetTest)
sl@0
   171
		{
sl@0
   172
		iModSetTest=EFalse;
sl@0
   173
		iWin->Invalidate();
sl@0
   174
		}
sl@0
   175
	_LIT(KLogEndTest,"EndTest - State %d - SubState %d");
sl@0
   176
	LOG_MESSAGE3(KLogEndTest,iTest->iState,iSubState);
sl@0
   177
	if (iSubSchedulerRunning) 
sl@0
   178
		{
sl@0
   179
		iSubSchedulerRunning = EFalse;
sl@0
   180
		CActiveScheduler::Stop(); // stop the sub-scheduler, so test-framework can execute the next test
sl@0
   181
		}		
sl@0
   182
	}
sl@0
   183
sl@0
   184
TInt CTModifiersChanged::SubState() const
sl@0
   185
	{
sl@0
   186
	return(iSubState);
sl@0
   187
	}
sl@0
   188
sl@0
   189
void CTModifiersChanged::IncSubState()
sl@0
   190
	{
sl@0
   191
	if (iSubState<numTests-1)
sl@0
   192
		{
sl@0
   193
		iSubState++;
sl@0
   194
		iWin->Invalidate();
sl@0
   195
		TheClient->WaitForRedrawsToFinish();
sl@0
   196
		SendEvents();
sl@0
   197
		}
sl@0
   198
	else if (iSubState>=numTests-1) // test finished successfully
sl@0
   199
		{
sl@0
   200
		if (iSubSchedulerRunning)
sl@0
   201
			{
sl@0
   202
			iSubSchedulerRunning = EFalse;
sl@0
   203
			CActiveScheduler::Stop(); // stop the sub-scheduler, so test-framework can execute the next test
sl@0
   204
			}
sl@0
   205
		}
sl@0
   206
	}
sl@0
   207
sl@0
   208
void CTModifiersChanged::TestModifiersState(const TModifiersChangedEvent &aModifiersChanged)
sl@0
   209
	{
sl@0
   210
	if (iTest->iState==1) // only if currently in test 1 (add another if for further tests)
sl@0
   211
		{
sl@0
   212
		TInt getMods=Client()->iWs.GetModifierState();	// double check the modifiers
sl@0
   213
		#if defined(LOGGING)
sl@0
   214
			if (iSkipFirstModifierEvents)
sl@0
   215
				{
sl@0
   216
				_LIT(KLogIgnored,"### This Event is part of the initial setup and is ignored for the test. ###");
sl@0
   217
				LOG_MESSAGE(KLogIgnored);
sl@0
   218
				}			
sl@0
   219
			TLogMessageText buf;
sl@0
   220
			_LIT(KLog1,"##MC1  SS=%x  Test-Modifiers=0x%x  Test-Changed=0x%x  Test-Mask=0x%x");
sl@0
   221
			buf.Format(KLog1,iSubState,ModifierChangedTests[iSubState].state,ModifierChangedTests[iSubState].changed,ModifierChangedTests[iSubState].stateMask);
sl@0
   222
			LOG_MESSAGE(buf);
sl@0
   223
			_LIT(KLog2,"##MC2  Event-Modifiers=0x%x  Event-Changed=0x%x  Get-Modifiers=0x%x");
sl@0
   224
			buf.Format(KLog2,aModifiersChanged.iModifiers,aModifiersChanged.iChangedModifiers,getMods);
sl@0
   225
			LOG_MESSAGE(buf);
sl@0
   226
			_LIT(KLog3,"##MC3  Changed:              (Event) 0x%x==0x%x (Test)");
sl@0
   227
			buf.Format(KLog3,aModifiersChanged.iChangedModifiers,ModifierChangedTests[iSubState].changed);
sl@0
   228
			LOG_MESSAGE(buf);
sl@0
   229
			_LIT(KLog4,"##MC4  Modifier (with mask): (Event) 0x%x==0x%x (Test)");
sl@0
   230
			buf.Format(KLog4,aModifiersChanged.iModifiers&ModifierChangedTests[iSubState].stateMask,ModifierChangedTests[iSubState].state);
sl@0
   231
			LOG_MESSAGE(buf);
sl@0
   232
			_LIT(KLog5,"##MC5  Modifier (with mask):   (Get) 0x%x==0x%x (Test)");
sl@0
   233
			buf.Format(KLog5,getMods&ModifierChangedTests[iSubState].stateMask,ModifierChangedTests[iSubState].state);
sl@0
   234
			LOG_MESSAGE(buf);
sl@0
   235
		#endif
sl@0
   236
		if (iSkipFirstModifierEvents) // skip the events caused by the initialization
sl@0
   237
			{
sl@0
   238
			if(--iSkipCounter<=0)
sl@0
   239
				{
sl@0
   240
				iSkipFirstModifierEvents = EFalse;
sl@0
   241
				}
sl@0
   242
			}
sl@0
   243
		else
sl@0
   244
			{
sl@0
   245
			if (aModifiersChanged.iChangedModifiers==ModifierChangedTests[iSubState].changed && 
sl@0
   246
					(aModifiersChanged.iModifiers&ModifierChangedTests[iSubState].stateMask)==ModifierChangedTests[iSubState].state &&
sl@0
   247
					(getMods&ModifierChangedTests[iSubState].stateMask)==ModifierChangedTests[iSubState].state)
sl@0
   248
				{
sl@0
   249
				IncSubState(); // subtest is successfull
sl@0
   250
				}
sl@0
   251
			else
sl@0
   252
				{				
sl@0
   253
				TEST(EFalse); // subtest failed
sl@0
   254
				_LIT(KLogTestFailed,"Modifier Change test failed.");
sl@0
   255
				LOG_MESSAGE(KLogTestFailed);
sl@0
   256
				}
sl@0
   257
			}
sl@0
   258
		} // if test 1
sl@0
   259
	}
sl@0
   260
sl@0
   261
void CTModifiersChanged::BadParams()
sl@0
   262
	{
sl@0
   263
	}
sl@0
   264
sl@0
   265
/**
sl@0
   266
 * Resets all the modifiers after the test is finished. Make sure that all keys used in the
sl@0
   267
 * test are in the up-state.
sl@0
   268
 */
sl@0
   269
void CTModifiersChanged::ResetModifiers()
sl@0
   270
	{
sl@0
   271
	_LIT(KLogResetModifiersError,"Error %d occured while turning off modifier 0x%x");
sl@0
   272
	TInt err;
sl@0
   273
	if ((err = Client()->iWs.SetModifierState(EModifierCapsLock,ETurnOffModifier)) != KErrNone)
sl@0
   274
		LOG_MESSAGE3(KLogResetModifiersError,err, EModifierCapsLock);
sl@0
   275
	if ((err = Client()->iWs.SetModifierState(EModifierShift,ETurnOffModifier)) != KErrNone)
sl@0
   276
		LOG_MESSAGE3(KLogResetModifiersError,err, EModifierShift);
sl@0
   277
	if ((err = Client()->iWs.SetModifierState(EModifierLeftShift,ETurnOffModifier)) != KErrNone)
sl@0
   278
		LOG_MESSAGE3(KLogResetModifiersError,err, EModifierLeftShift);
sl@0
   279
	if ((err = Client()->iWs.SetModifierState(EModifierRightShift,ETurnOffModifier)) != KErrNone)
sl@0
   280
		LOG_MESSAGE3(KLogResetModifiersError,err, EModifierRightShift);
sl@0
   281
	if ((err = Client()->iWs.SetModifierState(EModifierFunc,ETurnOffModifier)) != KErrNone)
sl@0
   282
		LOG_MESSAGE3(KLogResetModifiersError,err, EModifierFunc);
sl@0
   283
	if ((err = Client()->iWs.SetModifierState(EModifierLeftFunc,ETurnOffModifier)) != KErrNone)
sl@0
   284
		LOG_MESSAGE3(KLogResetModifiersError,err, EModifierLeftFunc);
sl@0
   285
	if ((err = Client()->iWs.SetModifierState(EModifierCtrl,ETurnOffModifier)) != KErrNone)
sl@0
   286
		LOG_MESSAGE3(KLogResetModifiersError,err, EModifierCtrl);
sl@0
   287
	if ((err = Client()->iWs.SetModifierState(EModifierLeftCtrl,ETurnOffModifier)) != KErrNone)
sl@0
   288
		LOG_MESSAGE3(KLogResetModifiersError,err, EModifierLeftCtrl);
sl@0
   289
	}
sl@0
   290
sl@0
   291
/**
sl@0
   292
 * Initialises the Modifier state. All tested modifiers must be in the up-state before the
sl@0
   293
 * test starts. The number of sent key simulations needed for initialization is recorded.
sl@0
   294
 * Each key simulation during initialization causes a ModifierChanged event which should be 
sl@0
   295
 * ignored because it's not part of the actual test.
sl@0
   296
 */
sl@0
   297
void CTModifiersChanged::ModifierChangedEventsL()
sl@0
   298
	{
sl@0
   299
	iEventGroup=new(ELeave) CTEventWindowGroup(Client(), this);
sl@0
   300
	iEventGroup->ConstructL();
sl@0
   301
	TInt modifiers=Client()->iWs.GetModifierState();
sl@0
   302
	
sl@0
   303
	if ((ModifierChangedEvents&modifiers)>0) // reset modifiers if they are in the down-state
sl@0
   304
		{
sl@0
   305
		iSkipFirstModifierEvents = ETrue;
sl@0
   306
		if ((modifiers&EModifierCapsLock)>0)
sl@0
   307
			{
sl@0
   308
			iTest->SimulateKeyDownUp(EStdKeyCapsLock);
sl@0
   309
			++iSkipCounter;
sl@0
   310
			modifiers=Client()->iWs.GetModifierState();
sl@0
   311
			}
sl@0
   312
		if ((modifiers&EModifierLeftShift)>0)
sl@0
   313
			{
sl@0
   314
			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftShift);
sl@0
   315
			++iSkipCounter;
sl@0
   316
			modifiers=Client()->iWs.GetModifierState();
sl@0
   317
			}
sl@0
   318
		if ((modifiers&EModifierRightShift)>0)
sl@0
   319
			{
sl@0
   320
			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyRightShift);
sl@0
   321
			++iSkipCounter;
sl@0
   322
			modifiers=Client()->iWs.GetModifierState();
sl@0
   323
			}
sl@0
   324
		if ((modifiers&EModifierLeftFunc)>0)
sl@0
   325
			{
sl@0
   326
			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftFunc);
sl@0
   327
			++iSkipCounter;
sl@0
   328
			modifiers=Client()->iWs.GetModifierState();
sl@0
   329
			}
sl@0
   330
		if ((modifiers&EModifierLeftCtrl)>0)
sl@0
   331
			{
sl@0
   332
			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftCtrl);
sl@0
   333
			++iSkipCounter;
sl@0
   334
			}
sl@0
   335
		}
sl@0
   336
	modifiers=Client()->iWs.GetModifierState();
sl@0
   337
	_LIT(KLog,"Initial Modifiers state 0x%x (ideally should be zero)");
sl@0
   338
	LOG_MESSAGE2(KLog,modifiers);
sl@0
   339
	}
sl@0
   340
sl@0
   341
void CTModifiersChanged::CheckModifier(TEventModifier aModifier)
sl@0
   342
	{
sl@0
   343
	TBool retVal;
sl@0
   344
	TInt oldMods=Client()->iWs.GetModifierState();
sl@0
   345
	Client()->iWs.SetModifierState(aModifier,EToggleModifier);
sl@0
   346
	TInt getMods=Client()->iWs.GetModifierState();
sl@0
   347
	if (oldMods!=getMods)
sl@0
   348
		{
sl@0
   349
		_LIT(KLogOff,"Attempted to turn off modifiers 0x%x, 0x%x still on");
sl@0
   350
		_LIT(KLogOn,"Attempted to turn on modifiers 0x%x, 0x%x still off");
sl@0
   351
		iSettable|=aModifier;
sl@0
   352
		Client()->iWs.SetModifierState(aModifier,ETurnOffModifier);
sl@0
   353
		getMods=Client()->iWs.GetModifierState();
sl@0
   354
		retVal=!(getMods&aModifier);
sl@0
   355
		TEST(retVal);
sl@0
   356
		if (!retVal)
sl@0
   357
			LOG_MESSAGE3(KLogOff,aModifier,getMods&aModifier);
sl@0
   358
		Client()->iWs.SetModifierState(aModifier,ETurnOnModifier);
sl@0
   359
		getMods=Client()->iWs.GetModifierState();
sl@0
   360
		retVal=getMods&aModifier;
sl@0
   361
		TEST(retVal);
sl@0
   362
		if (!retVal)
sl@0
   363
			LOG_MESSAGE3(KLogOn,aModifier,getMods&aModifier);
sl@0
   364
		Client()->iWs.SetModifierState(aModifier,ETurnOffModifier);
sl@0
   365
		getMods=Client()->iWs.GetModifierState();
sl@0
   366
		retVal=!(getMods&aModifier);
sl@0
   367
		TEST(retVal);
sl@0
   368
		if (!retVal)
sl@0
   369
			LOG_MESSAGE3(KLogOff,aModifier,getMods&aModifier);
sl@0
   370
		if (oldMods&aModifier)
sl@0
   371
			Client()->iWs.SetModifierState(aModifier,ETurnOnModifier);
sl@0
   372
		}
sl@0
   373
	else
sl@0
   374
		{
sl@0
   375
		Client()->iWs.SetModifierState(aModifier,ETurnOffModifier);
sl@0
   376
		retVal=oldMods==Client()->iWs.GetModifierState();
sl@0
   377
		TEST(retVal);
sl@0
   378
		if (!retVal)
sl@0
   379
			{
sl@0
   380
			_LIT(KLog,"Attempted to turn off modifiers 0x%x, suceeded when it should have failed");
sl@0
   381
			LOG_MESSAGE2(KLog,aModifier);
sl@0
   382
			}
sl@0
   383
		Client()->iWs.SetModifierState(aModifier,ETurnOnModifier);
sl@0
   384
		retVal=oldMods==Client()->iWs.GetModifierState();
sl@0
   385
		TEST(retVal);
sl@0
   386
		if (!retVal)
sl@0
   387
			{
sl@0
   388
			_LIT(KLog,"Attempted to turn on modifiers 0x%x, suceeded when it should have failed");
sl@0
   389
			LOG_MESSAGE2(KLog,aModifier);
sl@0
   390
			}
sl@0
   391
		}
sl@0
   392
	}
sl@0
   393
sl@0
   394
void CTModifiersChanged::SetModifiers()
sl@0
   395
	{
sl@0
   396
	iModSetTest=ETrue;
sl@0
   397
	for(TInt mod=1;mod!=0;mod<<=1)
sl@0
   398
		CheckModifier((TEventModifier)mod);
sl@0
   399
	iWin->Invalidate();
sl@0
   400
	Client()->iWs.Flush();
sl@0
   401
	}
sl@0
   402
sl@0
   403
void CTModifiersChanged::SendEvents()
sl@0
   404
	{
sl@0
   405
	iTest->LogSubState(iSubState);
sl@0
   406
	switch (iSubState)
sl@0
   407
		{
sl@0
   408
	case 0:
sl@0
   409
		iTest->SimulateKeyDownUp(EStdKeyCapsLock);
sl@0
   410
		break;
sl@0
   411
	case 1:
sl@0
   412
		iTest->SimulateKeyDownUp(EStdKeyCapsLock);
sl@0
   413
		break;
sl@0
   414
	case 2:
sl@0
   415
		iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeyLeftShift);
sl@0
   416
		break;
sl@0
   417
	case 3:
sl@0
   418
		iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftShift);
sl@0
   419
		break;
sl@0
   420
	case 4:
sl@0
   421
		iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeyRightShift);
sl@0
   422
		break;
sl@0
   423
	case 5:
sl@0
   424
		iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyRightShift);
sl@0
   425
		break;
sl@0
   426
	case 6:
sl@0
   427
		iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeyLeftFunc);
sl@0
   428
		break;
sl@0
   429
	case 7:
sl@0
   430
		iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftFunc);
sl@0
   431
		break;
sl@0
   432
	case 8:
sl@0
   433
		iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeyLeftCtrl);
sl@0
   434
		break;
sl@0
   435
	case 9:
sl@0
   436
		iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftCtrl);
sl@0
   437
		break;
sl@0
   438
	default:
sl@0
   439
		TEST(EFalse);
sl@0
   440
		return;
sl@0
   441
		}
sl@0
   442
	TheClient->iWs.Flush();
sl@0
   443
	}
sl@0
   444
sl@0
   445
void CTModifiersChanged::RunTestCaseL(TInt /*aCurTestCase*/)
sl@0
   446
	{
sl@0
   447
	_LIT(KModChange,"Modifier Change");
sl@0
   448
	_LIT(KTestErrors,"Bad Parameter");
sl@0
   449
	((CTModifiersChangedStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
sl@0
   450
	switch(++iTest->iState)
sl@0
   451
		{
sl@0
   452
/**
sl@0
   453
@SYMTestCaseID		GRAPHICS-WSERV-0239
sl@0
   454
sl@0
   455
@SYMDEF             DEF081259
sl@0
   456
sl@0
   457
@SYMTestCaseDesc    Test modifier changed message
sl@0
   458
sl@0
   459
@SYMTestPriority    High
sl@0
   460
sl@0
   461
@SYMTestStatus      Implemented
sl@0
   462
sl@0
   463
@SYMTestActions     Test that modifier changed message functions correctly
sl@0
   464
sl@0
   465
@SYMTestExpectedResults The message functions correctly
sl@0
   466
*/
sl@0
   467
		case 1:
sl@0
   468
			((CTModifiersChangedStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0239"));
sl@0
   469
			iTest->LogSubTest(KModChange);
sl@0
   470
			ModifierChangedEventsL();
sl@0
   471
			// start a timer to cancel the sub-scheduler
sl@0
   472
			iTimeOut->Start(KTimeOutAfter,TCallBack(CTModifiersChanged::TimeOut,this));
sl@0
   473
			SendEvents();
sl@0
   474
			iSubSchedulerRunning = ETrue;
sl@0
   475
			CActiveScheduler::Start(); // sub-scheduler blocks this AO (test-framework) until completion
sl@0
   476
			iTimeOut->Cancel();
sl@0
   477
			((CTModifiersChangedStep*)iStep)->RecordTestResultL();
sl@0
   478
			((CTModifiersChangedStep*)iStep)->CloseTMSGraphicsStep();
sl@0
   479
			break;	
sl@0
   480
/**
sl@0
   481
@SYMTestCaseID		GRAPHICS-WSERV-0240
sl@0
   482
sl@0
   483
@SYMDEF             DEF081259
sl@0
   484
sl@0
   485
@SYMTestCaseDesc    Test bad parameters for modifier changed message
sl@0
   486
sl@0
   487
@SYMTestPriority    High
sl@0
   488
sl@0
   489
@SYMTestStatus      Implemented
sl@0
   490
sl@0
   491
@SYMTestActions     Test using bad parameters for a modifier changed message
sl@0
   492
sl@0
   493
@SYMTestExpectedResults Responds correctly when bad parameters are used
sl@0
   494
*/
sl@0
   495
		case 2:
sl@0
   496
			((CTModifiersChangedStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0240"));
sl@0
   497
			iTest->LogSubTest(KTestErrors);
sl@0
   498
			BadParams();
sl@0
   499
			((CTModifiersChangedStep*)iStep)->RecordTestResultL();			
sl@0
   500
			break;
sl@0
   501
		default:
sl@0
   502
			ResetModifiers(); // reset modifiers, so further tests are not influenced
sl@0
   503
			((CTModifiersChangedStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
sl@0
   504
			((CTModifiersChangedStep*)iStep)->CloseTMSGraphicsStep();
sl@0
   505
			TestComplete();
sl@0
   506
		}
sl@0
   507
	
sl@0
   508
	
sl@0
   509
	}
sl@0
   510
sl@0
   511
__WS_CONSTRUCT_STEP__(ModifiersChanged)