datasourcemodules/simulationpositioningmodule/test/te_lbssimulationpsy/src/simpsynmeapositionerstep.cpp
changeset 36 b47902b73a93
parent 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datasourcemodules/simulationpositioningmodule/test/te_lbssimulationpsy/src/simpsynmeapositionerstep.cpp	Fri Jun 04 10:34:15 2010 +0100
@@ -0,0 +1,2234 @@
+// Copyright (c) 2005-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:
+// Example CTestStep derived implementation
+// 
+//
+
+/**
+ @file SimPsyNmeaPositionerStep.cpp
+ @internalTechnology
+*/
+#include "simpsynmeapositionerstep.h"
+#include "te_lbssimulationpsysuitedefs.h"
+
+#include "CSimPsyMultiNmeaPosRequester.h"
+
+
+#include <lbs.h>
+#include <lbssatellite.h>
+
+// A few useful macros
+#define MAX(x,y)      ((x)<(y))?(y):(x)
+#define MIN(x,y)      ((x)<(y))?(x):(y)
+
+// CONSTANTS
+_LIT(KNmeaFile, "c:\\system\\data\\nmea.nme");
+_LIT(KNmeaShortFile, "c:\\system\\data\\nmea_short.nme");
+_LIT(KWrongFileType, "c:\\system\\data\\simfile.wng");
+_LIT(KNmeaSatelliteFile, "c:\\system\\data\\nmea_garmin3plus.nme");
+_LIT(KNmeaMagellanFile, "c:\\system\\data\\nmea_Magellantracker.nme");
+_LIT(KNmeaPdopMissingFile, "c:\\system\\data\\nmea_pdopmissing.nme");
+_LIT(KNmeaPartialUpdateFile, "c:\\system\\data\\nmea_partial_updates.nme");
+_LIT(KNmeaError1, "c:\\system\\data\\nmea_error1.nme");
+_LIT(KNmeaError2, "c:\\system\\data\\nmea_error2.nme");
+_LIT(KNmeaError3, "c:\\system\\data\\nmea_error3.nme");
+_LIT(KNmeaSpecialCase, "c:\\system\\data\\nmea_special_case.nme");
+
+const TInt32 KSimModuleId = 270498433;
+
+
+CSimPsyNmeaPositionerStep::~CSimPsyNmeaPositionerStep()
+/**
+ * Destructor
+ */
+	{
+    iFileReader->CloseResources();    
+    delete iSimDataArray; 
+    iSimDataArray = NULL;
+    delete iFileReader;
+    iFileReader = NULL;
+
+#ifdef __CTC__ 
+    #pragma CTC APPEND
+#endif
+	}
+
+CSimPsyNmeaPositionerStep::CSimPsyNmeaPositionerStep()
+/**
+ * Constructor
+ */
+	{
+	// **MUST** call SetTestStepName in the constructor as the controlling
+	// framework uses the test step name immediately following construction to set
+	// up the step's unique logging ID.
+	SetTestStepName(KSimPsyNmeaPositionerStep);
+	}
+
+TVerdict CSimPsyNmeaPositionerStep::doTestStepPreambleL()
+/**
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+	{
+	// uncomment the following 3 lines if you have common pre setting to all the test steps in there
+	CTe_LbsSimulationPSYSuiteStepBase::doTestStepPreambleL();
+	// if (TestStepResult()!=EPass)
+	//    return   TestStepResult();
+	// process some pre setting to this test step then set SetTestStepResult to EFail or Epass.
+	SetTestStepResult(EPass);
+	TTime time;
+	time.UniversalTime();            
+	iSeed = time.Int64();            
+	iFileReader = CPosFileReader::NewL();  
+	return TestStepResult();
+	}
+
+
+TVerdict CSimPsyNmeaPositionerStep::doTestStepL()
+/**
+ * @return - TVerdict code
+ * Override of base class pure virtual
+ * Our implementation only gets called if the base class doTestStepPreambleL() did
+ * not leave. That being the case, the current test result value will be EPass.
+ */
+	{
+	  if (TestStepResult()==EPass)
+		{
+		TInt test;
+		if(!GetIntFromConfig(ConfigSection(),KTe_LbsSimulationPSYSuiteInt,test)
+			)
+			{
+			// Leave if there's any error.
+			User::Leave(KErrNotFound);
+			}
+		SetTestStepResult(EPass);
+		StartL(test);
+		}
+	  return TestStepResult();
+	}
+
+
+
+TVerdict CSimPsyNmeaPositionerStep::doTestStepPostambleL()
+/**
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+	{
+	// process something post setting to the test step
+	// uncomment the following line if you have common post setting to all the test steps in there
+	// CTe_LbsSimulationPSYSuiteStepBase::doTestStepPostambleL();
+	// uncomment the following line if you have post process or remove the following line if no post process
+	// SetTestStepResult(EPass);		// or EFail
+	return TestStepResult();
+	}
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::FixSettingsForSimPSY
+// (other items were commented in a header).
+// ---------------------------------------------------------
+// 
+void CSimPsyNmeaPositionerStep::FixSettingsForSimPSY(const TDesC& aFileName) 
+	{	
+    // Third version of settings simulation psy file
+	TFileName fileName = aFileName;
+    CRepository* repository = CRepository::NewLC(KCRUidSimulationPSY);
+    User::LeaveIfError(repository->Set(KCRKeySimPSYSimulationFile, fileName));
+    CleanupStack::PopAndDestroy(repository);
+	}
+
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::StartL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//    
+void CSimPsyNmeaPositionerStep::StartL(TInt aIndex)
+    {
+    switch (aIndex)
+        {                   
+        case 0:
+        	_LIT(KSingleNmeaRequestTest, "**** Single nmea request test ****");
+        	INFO_PRINTF1(KSingleNmeaRequestTest);
+        	FixSettingsForSimPSY(KNmeaFile); 
+        	//TestSingleNmeaRequestL(); 
+        	HeapTestL(aIndex);
+        	break;                        
+        case 1:
+        	_LIT(KSingleNmeaCancelTest, "**** Single nmea cancel test ****");
+        	INFO_PRINTF1(KSingleNmeaCancelTest);
+        	FixSettingsForSimPSY(KNmeaFile); 
+        	CancelSingleNmeaRequestL(); 
+        	break;  
+        case 2: 
+        	_LIT(KMultCancelTest, "****  Multiple cancel test 1 ****");
+        	INFO_PRINTF1(KMultCancelTest);
+        	FixSettingsForSimPSY(KNmeaFile); 
+        	TestMultipleNmeaCancelTestL(EFalse, EFalse, ETrue); 
+        	break;  
+        case 3: 
+        	_LIT(KMultCancelTest2, "**** Multiple cancel test 2 ****");
+        	INFO_PRINTF1(KMultCancelTest2);
+        	FixSettingsForSimPSY(KNmeaFile); 
+        	TestMultipleNmeaCancelTestL(ETrue, EFalse, ETrue); 
+        	break;
+        case 4: 
+        	_LIT(KMultCancelTest3, "**** Multiple cancel test 3 ****");
+            INFO_PRINTF1(KMultCancelTest3);
+        	FixSettingsForSimPSY(KNmeaFile); 
+        	TestMultipleNmeaCancelTestL(ETrue, ETrue, ETrue); 
+        	break;                        
+        case 5:
+        	_LIT(KMultipleRequestsMemoryTestName, "**** Multiple req memory leak test ****");
+        	INFO_PRINTF1(KMultipleRequestsMemoryTestName);
+        	FixSettingsForSimPSY(KNmeaFile); 
+        	//TestMultipleRequestsL(10); 
+        	HeapTestL(aIndex);
+        	break;        
+        case 6: 
+        	_LIT(KMultipleRequestsAndCancelMemoryTestName, "**** Multiple req and cancel memory leak test ****");
+            INFO_PRINTF1(KMultipleRequestsAndCancelMemoryTestName);
+        	FixSettingsForSimPSY(KNmeaFile); 
+        	TestMultipleRequestsAndCancelL(5, EFalse, ETrue, EFalse); 
+        	break;        
+        case 7:	
+        	_LIT(KRequestNmeaData, "**** Request Nmea data ****");
+        	INFO_PRINTF1(KRequestNmeaData);
+        	FixSettingsForSimPSY(KNmeaFile); 
+        	//TestRequestNmeaDataL(); 
+        	HeapTestL(aIndex);
+        	break;                        
+        case 8: 
+        	_LIT(KReadUntilEof, "**** Read until eof ****");
+        	INFO_PRINTF1(KReadUntilEof);
+        	//TestReadUntilEofL(); 
+        	HeapTestL(aIndex);
+        	break;                        
+        case 9:
+        	_LIT(KWrongPsyMode, "**** Unknown PSY mode ****"); 
+        	INFO_PRINTF1(KWrongPsyMode);
+        	TestWrongSimModeL(); 
+        	break;  
+        case 10: 
+        	_LIT(KRequestCourseInfo, "**** Request course info ****");
+        	INFO_PRINTF1(KRequestCourseInfo);
+        	TestRequestCourseInfoL(); 
+        	break;    
+        case 11: 
+        	_LIT(KRequestSatelliteInfo, "**** Request satellite info ****");
+        	INFO_PRINTF1(KRequestSatelliteInfo);
+        	TestRequestSatelliteInfoL(); 
+        	break;
+        case 12: 
+        	_LIT(KRequestGenericInfo, "**** Request generic info ****");
+        	INFO_PRINTF1(KRequestGenericInfo);
+        	//TestRequestGenericInfoL(); 
+        	HeapTestL(aIndex);
+        	break;
+        case 13: 
+        	_LIT(KRequestBasicInfo, "**** Request basic info ****");
+        	INFO_PRINTF1(KRequestBasicInfo);
+        	TestRequestBasicInfoL(); 
+        	break;
+        case 14: 
+        	_LIT(KRequestMagellan, "**** Request Magellan ****");
+        	INFO_PRINTF1(KRequestMagellan);
+        	TestRequestMagellanL(); 
+        	break;
+        case 15: 
+        	_LIT(KRequestPartialGenericInfo, "**** Request partial generic info ****");
+        	INFO_PRINTF1(KRequestPartialGenericInfo);
+        	TestRequestPartialGenericInfoL(); 
+        	break;
+        case 16: 
+        	_LIT(KRequestClearAndSetDefaultPositionData, "**** Test Clear Position Data ****");
+        	INFO_PRINTF1(KRequestClearAndSetDefaultPositionData);
+        	//TestClearAndSetDefaultPositionDataL(); 
+        	HeapTestL(aIndex);
+        	break;
+        case 17: 
+        	_LIT(KTestPartialUpdate, "**** Test Partial Update ****");
+        	INFO_PRINTF1(KTestPartialUpdate);
+        	TestPartialUpdateL(); 
+        	break;
+        case 18: 
+        	_LIT(KTestErrorSituations, "**** Test wrong situations ****");
+        	INFO_PRINTF1(KTestErrorSituations);
+        	TestErrorSituationsL(); 
+        	break;
+        case 19: 
+        	_LIT(KTestSpecialCase, "**** Test Special Case ****");
+        	INFO_PRINTF1(KTestSpecialCase);
+        	TestSpecialCasesL(); 
+        	break;
+
+        // Not a real test only a helper method for printing checksums
+        default: 
+        	break;
+        }
+    }
+  
+void CSimPsyNmeaPositionerStep::DoTestL(TInt aIndex)
+    {
+    switch (aIndex)
+        {                   
+        case 0: TestSingleNmeaRequestL(); break;                        
+        case 1: CancelSingleNmeaRequestL(); break;  
+        case 2: TestMultipleNmeaCancelTestL(EFalse, EFalse, ETrue); break;  
+        case 3: TestMultipleNmeaCancelTestL(ETrue, EFalse, ETrue); break;
+        case 4: TestMultipleNmeaCancelTestL(ETrue, ETrue, ETrue); break;                        
+        case 5: TestMultipleRequestsL(10); break;        
+        case 6: TestMultipleRequestsAndCancelL(5, EFalse, ETrue, EFalse); break;        
+        case 7: TestRequestNmeaDataL(); break;                        
+        case 8: TestReadUntilEofL(); break;                        
+        case 9: TestWrongSimModeL(); break;  
+        case 10: TestRequestCourseInfoL(); break;    
+        case 11: TestRequestSatelliteInfoL(); break;
+        case 12: TestRequestGenericInfoL(); break;
+        case 13: TestRequestBasicInfoL(); break;
+        case 14: TestRequestMagellanL(); break;
+        case 15: TestRequestPartialGenericInfoL(); break;
+        case 16: TestClearAndSetDefaultPositionDataL(); break;
+        case 17: TestPartialUpdateL(); break;
+        case 18: TestErrorSituationsL(); break;
+        case 19: TestSpecialCasesL(); break;
+
+        // Not a real test only a helper method for printing checksums
+        default: break;
+        }
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestSingleNmeaRequestL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestSingleNmeaRequestL()
+    {
+    CSimPsyMultiNmeaPosRequester* requester = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status;    
+    TTimeIntervalMicroSeconds requestTime;
+
+    for (TInt i = 0; i < 5; i++)
+        {
+		if (i <= 2) 
+			{
+			TPositionInfo position = TPositionInfo();    
+			requester->MakeRequests(&position);
+			requester->GetResult(status, requestTime);
+			CheckRequestResultL(status, position);
+
+			if (!&position)
+				{
+				User::Leave(KErrGeneral);
+				}
+			TPosition pos;			
+			position.GetPosition(pos);
+			TTime time = pos.Time();
+			TDateTime dtime = time.DateTime();
+			if (pos.Latitude() < 0 || pos.Longitude() < 0 || dtime.Year() < 2000)
+				{
+				User::Leave(KErrGeneral);
+				}
+			}
+		else
+			{
+			HPositionGenericInfo* genposition = HPositionGenericInfo::NewLC();    
+            User::LeaveIfError(genposition->SetRequestedField(EPositionFieldNMEASentences));
+			requester->MakeRequests(genposition);
+			requester->GetResult(status, requestTime); 
+			CheckRequestResultL(status, *genposition);
+			if (!&genposition && status == KErrNone)
+				{
+				User::Leave(KErrGeneral);
+				}			
+			TPosition genpos;			
+			genposition->GetPosition(genpos);
+			TTime time = genpos.Time();
+			TDateTime dtime = time.DateTime();
+			if (genpos.Latitude() < 0 || genpos.Longitude() < 0 || dtime.Year() < 2000)
+				{
+				User::Leave(KErrGeneral);
+				}
+
+            // Check that the burst starts with the same sentence all the time.
+            // In the nmea test file, the first burst will be GLL.
+            _LIT8(KExpectedFirstSentence, "$GPGLL");
+            TPtrC8 firstNmeaString(NULL, 0);
+            User::LeaveIfError(genposition->GetValue(EPositionFieldNMEASentencesStart, firstNmeaString));
+            if (firstNmeaString.Left(6).Compare(KExpectedFirstSentence) != 0)
+                {
+                _LIT(KError, "Expected GPGLL sentence at the beginning of the burst");
+                LogErrorAndFail(KError);
+                }
+
+			CleanupStack::PopAndDestroy(genposition);
+			}
+        }
+
+    CleanupStack::PopAndDestroy(); // requester        
+    _LIT(KSingleNmeaRequestTest, "Ended: **** Single nmea request test ****");
+    INFO_PRINTF1(KSingleNmeaRequestTest);
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::CancelSingleNmeaRequestL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::CancelSingleNmeaRequestL()
+    {        
+    CSimPsyMultiNmeaPosRequester* requester = CSimPsyMultiNmeaPosRequester::NewLC();
+    requester->SetRequesterWillCancelL();
+
+    TPositionInfo position = TPositionInfo();
+    TInt status;
+    TTimeIntervalMicroSeconds requestTime;
+    
+    requester->StopRequests();
+    requester->MakeRequests(&position);
+    requester->GetResult(status, requestTime);
+
+    if (status != KErrCancel)
+        {
+        _LIT(KReqWasNotCancelled, "The request was not cancelled");
+        LogErrorAndFail(KReqWasNotCancelled);
+        }
+
+    CleanupStack::PopAndDestroy(requester); // requester  
+	_LIT(KSingleNmeaCancelTest, "Ended: **** Single nmea cancel test ****");
+	INFO_PRINTF1(KSingleNmeaCancelTest);
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestMultipleNmeaCancelTestL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestMultipleNmeaCancelTestL(
+    TBool aFirstWillCancel,
+    TBool aSecondWillCancel,
+    TBool aThirdWillCancel)
+    {    
+    CSimPsyMultiNmeaPosRequester* requester = CSimPsyMultiNmeaPosRequester::NewLC(3);
+    if (aFirstWillCancel)
+        {
+        requester->SetRequesterWillCancelL(0);
+        }
+    if (aSecondWillCancel)
+        {
+        requester->SetRequesterWillCancelL(1);
+        }
+    if (aThirdWillCancel)
+        {
+        requester->SetRequesterWillCancelL(2);
+        }
+
+    TPositionInfo position = TPositionInfo();    
+    TInt status;
+    TTimeIntervalMicroSeconds requestTime;
+    
+    requester->MakeRequests(&position);
+
+    for (TInt i = 0; i < 3; i++)
+        {
+        requester->GetResult(status, requestTime, i);
+
+        TBool shouldHaveCancelled = 
+            (i == 0) ? aFirstWillCancel
+            : (i == 1) ? aSecondWillCancel
+            : aThirdWillCancel;
+
+        if (shouldHaveCancelled)
+            {
+            if (status != KErrCancel)
+                {
+                _LIT(KReqWasNotCancelled, "The request was not cancelled");                
+                LogErrorAndFail(KReqWasNotCancelled);
+                }
+			}
+        else
+            {
+            if (status != KErrNone)
+                {
+                _LIT(KReqFailed, "The request failed");
+                LogErrorAndFail(KReqFailed);
+                }
+            if (!&position)
+                {
+                _LIT(KHasNoPosition, "The request did not return a position");
+                LogErrorAndFail(KHasNoPosition);        
+                }            
+            }
+        }
+
+    CleanupStack::PopAndDestroy(); // requester    
+	_LIT(KMultCancelTest, "Ended: ****  Multiple cancel test ****");
+	INFO_PRINTF1(KMultCancelTest);
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestMultipleRequestsL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestMultipleRequestsL(TInt aNumberOfRequests)
+    {
+    CSimPsyMultiNmeaPosRequester* requester = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status;
+    TPositionInfo position = TPositionInfo();        
+    TTimeIntervalMicroSeconds requestTime;    
+    for (TInt i = 0; i < aNumberOfRequests; i++)
+        {
+        // RDebug::Print(_L("TestMultipleRequestsL making request"));
+        requester->MakeRequests(&position);
+        requester->GetResult(status, requestTime);   
+		CheckRequestResultL(status, position);		
+        }
+    CleanupStack::PopAndDestroy(); // requester        
+    requester = NULL;  
+	_LIT(KMultipleRequestsMemoryTestName, "Ended: **** Multiple req memory leak test ****");
+	INFO_PRINTF1(KMultipleRequestsMemoryTestName);
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestMultipleRequestsAndCancelL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//      
+void CSimPsyNmeaPositionerStep::TestMultipleRequestsAndCancelL(
+    TInt aNumberOfRequests, TBool aFirstWillCancel,
+    TBool aSecondWillCancel, TBool aThirdWillCancel)
+    {    
+    CSimPsyMultiNmeaPosRequester* requester = CSimPsyMultiNmeaPosRequester::NewLC(3);
+    if (aFirstWillCancel)
+        {
+        requester->SetRequesterWillCancelL(0);
+        }
+    if (aSecondWillCancel)
+        {
+        requester->SetRequesterWillCancelL(1);
+        }
+    if (aThirdWillCancel)
+        {
+        requester->SetRequesterWillCancelL(2);
+        }
+
+    TPositionInfo position = TPositionInfo();
+    TInt status;    
+    TTimeIntervalMicroSeconds requestTime;        
+
+    for (TInt i = 0; i < aNumberOfRequests; i++)
+        {
+        requester->MakeRequests(&position);
+
+        for (TInt j = 0; j < 3; j++)
+            {
+            requester->GetResult(status, requestTime, j);
+            if (status == KErrNoMemory)
+                {
+                User::Leave(status);
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy(); // requester  
+	_LIT(KMultipleRequestsAndCancelMemoryTestName, "Ended: **** Multiple req and cancel memory leak test ****");
+    INFO_PRINTF1(KMultipleRequestsAndCancelMemoryTestName);
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestRequestNmeaDataL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestRequestNmeaDataL()
+    {
+	CSimPsyMultiNmeaPosRequester* req = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status;
+    TTimeIntervalMicroSeconds requestTime;
+    for (TInt i = 0; i < 3; i++)
+        {
+		HPositionGenericInfo* position = HPositionGenericInfo::NewLC();
+		TReal32 trueCourse = TReal32(30.00);
+		TInt err = position->SetValue(EPositionFieldTrueCourse, trueCourse);
+		
+		position->SetRequestedField(EPositionFieldNMEASentences);
+		req->MakeRequests(position);
+        req->GetResult(status, requestTime);          
+		
+		err = position->GetValue(EPositionFieldTrueCourse, trueCourse);
+		if (err != KErrNotFound) 
+			{
+			User::Leave(KErrGeneral);	
+			}
+		CheckRequestResultL(status, *position);
+
+		if (status != KErrNone)
+			{
+			User::Leave(KErrGeneral);
+			}	
+		TUint8 sentences;
+		err = position->GetValue(EPositionFieldNMEASentences, sentences); 
+		User::LeaveIfError(err);
+		if (sentences <= 0)
+			{
+			User::Leave(KErrGeneral);
+			}
+
+		TUint8 upper;
+		TUint16 sent = static_cast<TUint16> (EPositionFieldNMEASentencesStart+sentences); 
+		err = position->GetValue(sent, upper);
+		if (err != KErrNotFound)
+			{
+			User::Leave(KErrGeneral);
+			}
+
+		TBuf8<200> buf;
+		for (TInt j = 0; j < sentences; j++)
+			{
+			TUint16 sentnr = static_cast<TUint16> (EPositionFieldNMEASentencesStart+j); 
+			err = position->GetValue(sentnr, buf); 
+			User::LeaveIfError(err);
+		    if (buf.Compare(KNullDesC8) == 0) 
+				{
+				User::Leave(KErrGeneral);
+				}
+			}	
+		TBool mustbetrue = position->IsFieldAvailable(EPositionFieldNMEASentences); 
+		if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+		CleanupStack::PopAndDestroy(position);
+		}
+    CleanupStack::PopAndDestroy(req); // requester   
+	_LIT(KRequestNmeaData, "Ended: **** Request Nmea data ****");
+	INFO_PRINTF1(KRequestNmeaData);
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestReadUntilEofL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestReadUntilEofL()
+    {
+	FixSettingsForSimPSY(KNmeaShortFile);
+    CSimPsyMultiNmeaPosRequester* requester = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status;    
+    TTimeIntervalMicroSeconds requestTime;
+
+	// TPositionInfo position = TPositionInfo();    
+	HPositionGenericInfo* position = HPositionGenericInfo::NewLC();    
+    for (TInt i = 0; i < 3; i++)
+        {
+		requester->MakeRequests(position);
+		requester->GetResult(status, requestTime); 
+        if (status == KErrNoMemory)
+			{
+			User::Leave(status);
+			}
+        else if (status != KErrNotSupported)
+			{
+			User::Leave(KErrGeneral);
+			}
+        }
+    CleanupStack::PopAndDestroy(2, requester); // position
+	_LIT(KReadUntilEof, "Ended: **** Read until eof ****");
+	INFO_PRINTF1(KReadUntilEof);
+    }
+
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestWrongSimModeL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestWrongSimModeL()
+    {
+	FixSettingsForSimPSY(KWrongFileType);
+	CSimPsyMultiNmeaPosRequester* req = NULL;
+    TRAPD(err, req = CSimPsyMultiNmeaPosRequester::NewLC());
+
+	if ((err != KErrNotSupported) || (req!= NULL))
+		{
+		User::Leave(KErrGeneral);
+		}
+	_LIT(KWrongPsyMode, "Ended: **** Unknown PSY mode ****"); 
+	INFO_PRINTF1(KWrongPsyMode);
+    }
+
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestRequestCourseInfoL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestRequestCourseInfoL()
+    {
+    // correct NMEA file
+    FixSettingsForSimPSY(KNmeaSatelliteFile);
+    
+    const TInt KNORequests = 3;
+	CSimPsyMultiNmeaPosRequester* req = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status;
+    TTimeIntervalMicroSeconds requestTime;
+
+    //expected values for course info parsed from nmea.nme
+    const TReal32 KKnotsToMetrePerSecFactor = 1.852F / 3.6F;
+    const TReal32 KExpectedCourse = 360.0F;
+    const TReal32 KExpectedSpeed = KKnotsToMetrePerSecFactor * 0.0F; 
+
+    for (TInt i = 0; i < KNORequests; i++)
+        {
+		TPositionCourseInfo position = TPositionCourseInfo();
+		
+		req->MakeRequests(&position);
+        req->GetResult(status, requestTime);  
+        
+        CheckRequestResultL(status, position);
+
+        // check data from returned course-info object
+        TCourse course;
+        position.GetCourse(course);
+
+        if (course.Speed() != KExpectedSpeed)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (course.Heading() != KExpectedCourse)
+            {
+            User::Leave(KErrGeneral);                
+            }
+		}
+    CleanupStack::PopAndDestroy(req); // requester        
+	_LIT(KRequestCourseInfo, "Ended: **** Request course info ****");
+	INFO_PRINTF1(KRequestCourseInfo);
+    }
+
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestRequestSatelliteInfoL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestRequestSatelliteInfoL()
+    {
+    // correct NMEA file
+    FixSettingsForSimPSY(KNmeaSatelliteFile);
+
+    const TInt KNORequests = 3;
+	CSimPsyMultiNmeaPosRequester* req = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status;
+    TTimeIntervalMicroSeconds requestTime;
+
+    // expected values for satellite info parsed from KNmeaSatelliteFile
+    // RMC
+    const TInt KExpectedYear = 2003;
+    const TMonth KExpectedMonth = EApril;
+    const TInt KExpectedDay = 1;
+    const TInt KExpectedHour = 14;
+    const TInt KExpectedMin[KNORequests] = {18, 19, 19};
+    const TInt KExpectedSec[KNORequests] = {59, 1, 3};
+    const TReal32 KKnotsToMetrePerSecFactor = 1.852F / 3.6F;
+    const TReal32 KExpectedCourse = 360.0F;
+    const TReal32 KExpectedSpeed = KKnotsToMetrePerSecFactor * 0.0F; 
+    // GSA    
+    const TInt KExpectedSatUsed = 6;
+    const TInt KExpectedSatInView = 10;
+        // IDs of satellites used in solution
+    const TInt KExpectedUsedSatId[KExpectedSatUsed] = {7,9,11,18,23,28};
+    const TReal32 KExpectedHDOP= 2.2F;
+    const TReal32 KExpectedVDOP= 2.7F;
+    // GSV
+        // IDs of satellites in view
+    const TInt KExpectedInViewSatId[KExpectedSatInView] = {7,9,11,18,23,28,3,14,20,31};
+    const TReal32 KExpectedElevation[KExpectedSatInView] = {2,16,57,8,3,19,10,51,9,30};
+    const TReal32 KExpectedAzimuth[KNORequests][KExpectedSatInView] = 
+        {
+        {331,26,267,66,64,301,179,106,240,196},
+        {331,26,267,66,64,301,179,105,240,196},
+        {331,26,267,66,64,301,179,105,240,196}
+        };
+
+    const TInt KExpectedSR[KNORequests][KExpectedSatInView] = 
+        {
+        {42,47,44,39,38,46,0,33,0,0},
+        {42,48,44,39,38,45,0,33,0,0}, 
+        {42,48,44,39,38,45,0,34,0,0}
+        };
+
+
+    for (TInt i = 0; i < KNORequests; i++)
+        {
+		TPositionSatelliteInfo position = TPositionSatelliteInfo();
+
+		req->MakeRequests(&position);
+        req->GetResult(status, requestTime);  
+        
+        CheckRequestResultL(status, position);
+        
+        // check data from returned satellite-info object...
+        // from RMC
+        TTime sattime = position.SatelliteTime();
+        TDateTime dtime = sattime.DateTime();
+        TInt year = dtime.Year();
+        TMonth month = dtime.Month();
+        TInt day = dtime.Day();
+        TInt hour = dtime.Hour();
+        TInt min = dtime.Minute();
+        TInt sec = dtime.Second();
+
+        if (year != KExpectedYear)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (month != KExpectedMonth)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (day != KExpectedDay)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (hour != KExpectedHour)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (min != KExpectedMin[i])
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (sec != KExpectedSec[i])
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        TCourse course;
+        position.GetCourse(course);
+
+        if (course.Speed() != KExpectedSpeed)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (course.Heading() != KExpectedCourse)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        // from GSA
+        TInt satused = position.NumSatellitesUsed();
+        TInt satinview = position.NumSatellitesInView();
+        if (satused != KExpectedSatUsed)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (satinview != KExpectedSatInView)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        TSatelliteData satdata;
+        TInt k = 0;
+        TInt j;
+        for (j = 0; j < satinview; j++)
+            {
+            TInt err = position.GetSatelliteData(j, satdata);
+            if (err != KErrNone)
+                {
+                User::Leave(KErrGeneral);                
+                }
+            if (satdata.SatelliteId() == KExpectedUsedSatId[k] && satdata.IsUsed())
+                {
+                k++; 
+                }
+            }
+        if (k != satused)
+            {
+            User::Leave(KErrGeneral); // correct n.o Ids used for fix NOT present
+            }
+
+        if (position.HorizontalDoP() != KExpectedHDOP)
+            {
+            User::Leave(KErrGeneral);
+            }
+        if (position.VerticalDoP() != KExpectedVDOP)
+            {
+            User::Leave(KErrGeneral);
+            }
+
+        // from GSV
+        for (j = 0; j < satinview; j++)
+            {
+            TInt err = position.GetSatelliteData(j, satdata);
+            if (err != KErrNone)
+                {
+                User::Leave(KErrGeneral);                
+                }
+            if (satdata.SatelliteId() != KExpectedInViewSatId[j])
+                {
+                User::Leave(KErrGeneral); 
+                }
+            if (satdata.Azimuth() != KExpectedAzimuth[i][j])
+                {
+                User::Leave(KErrGeneral); 
+                }
+            if (satdata.Elevation() != KExpectedElevation[j])
+                {
+                User::Leave(KErrGeneral); 
+                }      
+            if (satdata.SignalStrength() != KExpectedSR[i][j])
+                {
+                User::Leave(KErrGeneral); 
+                }
+            }
+		}
+    CleanupStack::PopAndDestroy(req); // requester        
+	_LIT(KRequestSatelliteInfo, "Ended: **** Request satellite info ****");
+	INFO_PRINTF1(KRequestSatelliteInfo);
+    }
+
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestRequestGenericInfoL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestRequestGenericInfoL()
+    {
+    // correct NMEA file
+    FixSettingsForSimPSY(KNmeaSatelliteFile);
+
+    const TInt KNORequests = 3;
+	CSimPsyMultiNmeaPosRequester* req = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status;
+    TTimeIntervalMicroSeconds requestTime;
+
+    // expected values for satellite info parsed from nmea.nme
+    // GGA
+    const TReal32 KExpectedWGS84Alt[KNORequests] = 
+        {169.5F, 169.8F, 169.6F}; 
+    const TReal32 KExpectedGeodialSep = 20.7F;
+    // RMC
+    const TInt KExpectedYear = 2003;
+    const TMonth KExpectedMonth = EApril;
+    const TInt KExpectedDay = 1;
+    const TInt KExpectedHour = 14;
+    const TInt KExpectedMin[KNORequests] = {18, 19, 19};
+    const TInt KExpectedSec[KNORequests] = {59, 1, 3};
+    const TReal32 KKnotsToMetrePerSecFactor = 1.852F / 3.6F;
+    const TReal32 KExpectedCourse = 360.0F;
+    const TReal32 KExpectedSpeed = KKnotsToMetrePerSecFactor * 0.0F; 
+    const TReal32 KExpectedMagCourse = 354.0F;
+    // GSA
+    const TInt KExpectedSatUsed = 6;
+    const TReal32 KExpectedPDOP= 3.5F;
+    const TReal32 KExpectedHDOP= 2.2F;
+    const TReal32 KExpectedVDOP= 2.7F;
+    // GSV
+    const TInt8 KExpectedSatInView = 10;
+
+
+    for (TInt i = 0; i < KNORequests; i++)
+        {
+		HPositionGenericInfo* position = HPositionGenericInfo::NewLC();
+		
+        // set requested fields..
+        // GGA
+		position->SetRequestedField(EPositionFieldSatelliteSeaLevelAltitude);		
+        position->SetRequestedField(EPositionFieldSatelliteGeoidalSeparation);
+        // RMC
+        position->SetRequestedField(EPositionFieldSatelliteTime);
+        position->SetRequestedField(EPositionFieldTrueCourse);
+        position->SetRequestedField(EPositionFieldHorizontalSpeed);
+        // position->SetRequestedField(EPositionFieldMagneticVariation);        
+        position->SetRequestedField(EPositionFieldMagneticCourse);        
+        // GSA
+        position->SetRequestedField(EPositionFieldSatelliteNumUsed);
+        position->SetRequestedField(EPositionFieldSatelliteHorizontalDoP);
+        position->SetRequestedField(EPositionFieldSatelliteVerticalDoP);
+        position->SetRequestedField(EPositionFieldSatellitePositionDoP);
+        // GSV
+        position->SetRequestedField(EPositionFieldSatelliteNumInView);
+
+        req->MakeRequests(position);
+        req->GetResult(status, requestTime);          
+
+        CheckRequestResultL(status, *position);
+        
+        // check data from returned generic-info object...
+        // from GGA
+        TBool mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteSeaLevelAltitude); 
+		if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TReal32 wgs84alt;
+        position->GetValue(EPositionFieldSatelliteSeaLevelAltitude, 
+                        wgs84alt);
+        if (wgs84alt != KExpectedWGS84Alt[i])
+                {
+                User::Leave(KErrGeneral); 
+                }
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteGeoidalSeparation);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TReal32 geosep;
+        position->GetValue(EPositionFieldSatelliteGeoidalSeparation, 
+                        geosep);
+        if (geosep != KExpectedGeodialSep)
+                {
+                User::Leave(KErrGeneral); 
+                }
+
+        // from RMC
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteTime);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TTime sattime;
+        position->GetValue(EPositionFieldSatelliteTime, 
+                        sattime);
+        TDateTime dtime = sattime.DateTime();
+        TInt year = dtime.Year();
+        TMonth month = dtime.Month();
+        TInt day = dtime.Day();
+        TInt hour = dtime.Hour();
+        TInt min = dtime.Minute();
+        TInt sec = dtime.Second();
+        if (year != KExpectedYear)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (month != KExpectedMonth)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (day != KExpectedDay)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (hour != KExpectedHour)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (min != KExpectedMin[i])
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (sec != KExpectedSec[i])
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldTrueCourse);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TReal32 trueCourse;
+        position->GetValue(EPositionFieldTrueCourse, 
+                        trueCourse);
+        if (trueCourse != KExpectedCourse)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldHorizontalSpeed);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TReal32 speed;
+        position->GetValue(EPositionFieldHorizontalSpeed, 
+                        speed);
+        if (speed != KExpectedSpeed)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        mustbetrue = position->IsFieldAvailable(EPositionFieldMagneticCourse);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        // TReal32 magvar;
+        TReal32 magCourse;
+        position->GetValue(EPositionFieldMagneticCourse, 
+                        magCourse);
+        if (magCourse != KExpectedMagCourse)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        // from GSA
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteNumUsed);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TInt8 numUsedSatellites;
+        position->GetValue(EPositionFieldSatelliteNumUsed, 
+                        numUsedSatellites);
+        if (numUsedSatellites != KExpectedSatUsed)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteHorizontalDoP);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TReal32 hdop;
+        position->GetValue(EPositionFieldSatelliteHorizontalDoP, 
+                        hdop);
+        if (hdop != KExpectedHDOP)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteVerticalDoP);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TReal32 vdop;
+        position->GetValue(EPositionFieldSatelliteVerticalDoP, 
+                        vdop);
+        if (vdop != KExpectedVDOP)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatellitePositionDoP);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TReal32 pdop;
+        position->GetValue(EPositionFieldSatellitePositionDoP, 
+                        pdop);
+        if (pdop != KExpectedPDOP)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        // from GSV
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteNumInView);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TInt8 satinview;
+        position->GetValue(EPositionFieldSatelliteNumInView, 
+                        satinview);
+        if (satinview != KExpectedSatInView)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+
+        CleanupStack::PopAndDestroy(position); // position 
+		}
+    CleanupStack::PopAndDestroy(req); // requester    
+	_LIT(KRequestGenericInfo, "Ended: **** Request generic info ****");
+	INFO_PRINTF1(KRequestGenericInfo);
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestRequestBasicInfoL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestRequestBasicInfoL()
+    {
+    // correct NMEA file
+    FixSettingsForSimPSY(KNmeaSatelliteFile);
+
+    const TInt KNORequests = 3;
+	CSimPsyMultiNmeaPosRequester* requester = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status;
+    TTimeIntervalMicroSeconds requestTime;
+
+    // expected values for basic info parsed from nmea.nme
+    // GGA
+    const TReal32 KExpectedAlt[KNORequests] = 
+    {169.5F + 20.7F, 169.8F + 20.7F, 169.6F + 20.7F}; 
+    // GSA
+    const TReal32 KPosUERE = 10.0;
+    const TReal32 KExpectedHDOP= 2.2F;
+    const TReal32 KExpectedHAcc = KPosUERE * KExpectedHDOP;
+    const TReal32 KExpectedVAcc = 1.5F * KPosUERE * KExpectedHDOP;
+
+    for (TInt i = 0; i < KNORequests; i++)
+        {
+        TPositionInfo position = TPositionInfo();    
+		
+        requester->MakeRequests(&position);
+		requester->GetResult(status, requestTime);
+		CheckRequestResultL(status, position);
+
+		if (!&position)
+			{
+			User::Leave(KErrGeneral);
+			}
+
+		TPosition pos;			
+		position.GetPosition(pos);
+
+        TTime time = pos.Time();
+		TDateTime dtime = time.DateTime();
+
+        if (pos.Altitude() != KExpectedAlt[i])
+            {
+            User::Leave(KErrGeneral);                
+            }
+		TTime now;
+		now.UniversalTime();
+		TInt year = now.DateTime().Year();
+        if (dtime.Year() != year)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        // from GSA        
+        if (pos.HorizontalAccuracy() != KExpectedHAcc)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (pos.VerticalAccuracy() != KExpectedVAcc)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        }
+    CleanupStack::PopAndDestroy(requester); // requester 
+	_LIT(KRequestBasicInfo, "Ended: **** Request basic info ****");
+	INFO_PRINTF1(KRequestBasicInfo);
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestRequestMagellanL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestRequestMagellanL()
+    {
+    // correct NMEA file
+    FixSettingsForSimPSY(KNmeaMagellanFile);
+
+    const TInt KNORequests = 3;
+	CSimPsyMultiNmeaPosRequester* req = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status;
+    TTimeIntervalMicroSeconds requestTime;
+    TRealX nan;
+    nan.SetNaN();
+
+    // expected values for satellite info parsed from KNmeaSatelliteFile
+    // RMC
+    const TInt KExpectedYear = 2001;
+    const TMonth KExpectedMonth = EMay;
+    const TInt KExpectedDay = 14;
+    const TInt KExpectedHour = 9;
+    const TInt KExpectedMin[KNORequests] = {24, 24, 24};
+    const TInt KExpectedSec[KNORequests] = {38, 40, 42};
+    const TInt KExpectedMSec[KNORequests] = {620000, 770000, 50000};
+    const TReal32 KKnotsToMetrePerSecFactor = 1.852F / 3.6F;
+    const TReal32 KExpectedCourse = 0.0F;
+    const TReal32 KExpectedSpeed = KKnotsToMetrePerSecFactor * 0.0F; 
+    // GSA    
+    const TInt KExpectedSatUsed = 3;
+    const TInt KExpectedSatInView = 12;
+        // IDs of satellites used in solution
+    const TInt KExpectedUsedSatId[KExpectedSatUsed] = {18,15,17};
+    const TReal32 KExpectedHDOP= 4.5F;
+    const TReal32 KExpectedVDOP= nan;
+    // GSV
+        // IDs of satellites in view
+    const TInt KExpectedInViewSatId[KExpectedSatInView] = {18,15,17,3,22,28,26,27,21,6,8,10};
+    const TReal32 KExpectedElevation[KExpectedSatInView] = 
+        {40,78,62,48,43,32,18,16,13,10,10,6};
+    const TReal32 KExpectedAzimuth[KNORequests][KExpectedSatInView] = 
+        {
+        {150,143,85,279,224,308,70,332,182,119,356,30},
+        {150,143,85,279,224,308,70,332,182,119,356,30},
+        {150,143,85,279,224,308,70,332,182,119,356,30}
+        };
+    const TInt KExpectedSR[KNORequests][KExpectedSatInView] = 
+        {
+        {49,54,53,49,47,46,44,44,0,0,0,0},
+        {49,54,53,49,47,46,43,43,0,0,0,0},
+        {49,54,53,49,47,46,44,42,0,0,0,0}
+        };
+
+
+    for (TInt i = 0; i < KNORequests; i++)
+        {
+		TPositionSatelliteInfo position = TPositionSatelliteInfo();
+
+		req->MakeRequests(&position);
+        req->GetResult(status, requestTime);  
+        
+        CheckRequestResultL(status, position);
+        
+        // check data from returned satellite-info object...
+        // from RMC
+        TTime sattime = position.SatelliteTime();
+        TDateTime dtime = sattime.DateTime();
+        TInt year = dtime.Year();
+        TMonth month = dtime.Month();
+        TInt day = dtime.Day();
+        TInt hour = dtime.Hour();
+        TInt min = dtime.Minute();
+        TInt sec = dtime.Second();
+        TInt msec = dtime.MicroSecond();
+
+        if (year != KExpectedYear)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (month != KExpectedMonth)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (day != KExpectedDay)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (hour != KExpectedHour)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (min != KExpectedMin[i])
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (sec != KExpectedSec[i])
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (msec != KExpectedMSec[i])
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        TCourse course;
+        position.GetCourse(course);
+
+        if (course.Speed() != KExpectedSpeed)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (course.Heading() != KExpectedCourse)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        // from GSA
+        TInt satused = position.NumSatellitesUsed();
+        TInt satinview = position.NumSatellitesInView();
+        if (satused != KExpectedSatUsed)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (satinview != KExpectedSatInView)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        TSatelliteData satdata;
+        TInt k = 0;
+        TInt j;
+        for (j = 0; j < satinview; j++)
+            {
+            TInt err = position.GetSatelliteData(j, satdata);
+            if (err != KErrNone)
+                {
+                User::Leave(KErrGeneral);                
+                }
+            if (satdata.SatelliteId() == KExpectedUsedSatId[k] && satdata.IsUsed())
+                {
+                k++; 
+                }
+            }
+        if (k != satused)
+            {
+            User::Leave(KErrGeneral); // correct n.o Ids used for fix NOT present
+            }
+
+        if (position.HorizontalDoP() != KExpectedHDOP)
+            {
+            User::Leave(KErrGeneral);
+            }        
+        if (!Math::IsNaN(position.VerticalDoP()))
+            {
+            User::Leave(KErrGeneral);
+            }
+
+        // from GSV
+        for (j = 0; j < satinview; j++)
+            {
+            TInt err = position.GetSatelliteData(j, satdata);
+            if (err != KErrNone)
+                {
+                User::Leave(KErrGeneral);                
+                }
+            if (satdata.SatelliteId() != KExpectedInViewSatId[j])
+                {
+                User::Leave(KErrGeneral); 
+                }
+            if (satdata.Azimuth() != KExpectedAzimuth[i][j])
+                {
+                User::Leave(KErrGeneral); 
+                }
+            if (satdata.Elevation() != KExpectedElevation[j])
+                {
+                User::Leave(KErrGeneral); 
+                }      
+            if (satdata.SignalStrength() != KExpectedSR[i][j])
+                {
+                User::Leave(KErrGeneral); 
+                }
+            }
+		}
+	
+	CleanupStack::PopAndDestroy(req); // requester
+
+    // correct NMEA file
+    FixSettingsForSimPSY(KNmeaPdopMissingFile);
+
+    // No pdop value in .nme file
+	req = CSimPsyMultiNmeaPosRequester::NewLC();
+    for (TInt j = 0; j < KNORequests; j++)
+        {
+		HPositionGenericInfo* genPos = HPositionGenericInfo::NewL();
+		CleanupStack::PushL(genPos);
+
+        // GSA
+        genPos->SetRequestedField(EPositionFieldSatelliteNumUsed);
+        genPos->SetRequestedField(EPositionFieldSatelliteHorizontalDoP);
+        genPos->SetRequestedField(EPositionFieldSatelliteVerticalDoP);
+        genPos->SetRequestedField(EPositionFieldSatellitePositionDoP);
+
+		req->MakeRequests(genPos);
+        req->GetResult(status, requestTime);  
+        
+        CheckRequestResultL(status, *genPos);
+
+        TReal32 vdop;
+		const TReal32 KExpectedVDOP= 0.9F;
+        genPos->GetValue(EPositionFieldSatelliteVerticalDoP, vdop);
+        if (vdop != KExpectedVDOP)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        TReal32 hdop;
+		const TReal32 KExpectedHDOP= 4.0F;
+        genPos->GetValue(EPositionFieldSatelliteHorizontalDoP, hdop);
+        if (hdop != KExpectedHDOP)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        TReal32 pdop;
+		TReal expectedPDOP;
+		TInt err = Math::Sqrt(expectedPDOP, hdop * hdop + vdop * vdop);
+		User::LeaveIfError(err);
+        genPos->GetValue(EPositionFieldSatellitePositionDoP, pdop);
+		TReal32 expectedPDOPreal32 = TReal32(expectedPDOP); 
+        if (TRealX(pdop) != TRealX(expectedPDOPreal32))
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+		CleanupStack::PopAndDestroy(genPos);
+		}
+
+	CleanupStack::PopAndDestroy(req); // requester
+	_LIT(KRequestMagellan, "Ended: **** Request Magellan ****");
+	INFO_PRINTF1(KRequestMagellan);
+	}
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestRequestPartialGenericInfoL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestRequestPartialGenericInfoL()
+    {
+    // correct NMEA file
+    FixSettingsForSimPSY(KNmeaSatelliteFile);
+
+    const TInt KNORequests = 3;
+	CSimPsyMultiNmeaPosRequester* req = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status;
+    TTimeIntervalMicroSeconds requestTime;
+
+    // expected values for satellite info parsed from nmea.nme
+    // GGA
+    const TReal32 KExpectedWGS84Alt[KNORequests] = 
+        {169.5F, 169.8F, 169.6F}; 
+    //const TReal32 KExpectedGeodialSep = 20.7F;
+    // RMC
+    const TInt KExpectedYear = 2003;
+    const TMonth KExpectedMonth = EApril;
+    const TInt KExpectedDay = 1;
+    const TInt KExpectedHour = 14;
+    const TInt KExpectedMin[KNORequests] = {18, 19, 19};
+    const TInt KExpectedSec[KNORequests] = {59, 1, 3};
+    //const TReal32 KKnotsToMetrePerSecFactor = 1.852F / 3.6F;
+    const TReal32 KExpectedCourse = 360.0F;
+    //const TReal32 KExpectedSpeed = KKnotsToMetrePerSecFactor * 0.0F; 
+    const TReal32 KExpectedMagCourse = 354.0F;
+    // GSA
+    const TInt KExpectedSatUsed = 6;
+    const TReal32 KExpectedPDOP= 3.5F;
+    const TReal32 KExpectedHDOP= 2.2F;
+    //const TReal32 KExpectedVDOP= 2.7F;
+    // GSV
+    const TInt8 KExpectedSatInView = 10;
+
+
+    for (TInt i = 0; i < KNORequests; i++)
+        {
+		HPositionGenericInfo* position = HPositionGenericInfo::NewLC();
+		
+        // set requested fields..
+        // GGA
+		position->SetRequestedField(EPositionFieldSatelliteSeaLevelAltitude);		
+
+        // RMC
+        position->SetRequestedField(EPositionFieldSatelliteTime);
+        position->SetRequestedField(EPositionFieldTrueCourse);
+      
+        position->SetRequestedField(EPositionFieldMagneticCourse);        
+        // GSA
+        position->SetRequestedField(EPositionFieldSatelliteNumUsed);
+        position->SetRequestedField(EPositionFieldSatelliteHorizontalDoP);
+        position->SetRequestedField(EPositionFieldSatellitePositionDoP);
+        // GSV
+        position->SetRequestedField(EPositionFieldSatelliteNumInView);
+
+        req->MakeRequests(position);
+        req->GetResult(status, requestTime);          
+
+        CheckRequestResultL(status, *position);
+        
+        // check data from returned generic-info object...
+        // from GGA
+        TBool mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteSeaLevelAltitude); 
+		if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TReal32 wgs84alt;
+        position->GetValue(EPositionFieldSatelliteSeaLevelAltitude, 
+                        wgs84alt);
+        if (wgs84alt != KExpectedWGS84Alt[i])
+                {
+                User::Leave(KErrGeneral); 
+                }
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteGeoidalSeparation);
+        if (mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+
+        // from RMC
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteTime);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TTime sattime;
+        position->GetValue(EPositionFieldSatelliteTime, 
+                        sattime);
+        TDateTime dtime = sattime.DateTime();
+        TInt year = dtime.Year();
+        TMonth month = dtime.Month();
+        TInt day = dtime.Day();
+        TInt hour = dtime.Hour();
+        TInt min = dtime.Minute();
+        TInt sec = dtime.Second();
+        if (year != KExpectedYear)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (month != KExpectedMonth)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (day != KExpectedDay)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (hour != KExpectedHour)
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (min != KExpectedMin[i])
+            {
+            User::Leave(KErrGeneral);                
+            }
+        if (sec != KExpectedSec[i])
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldTrueCourse);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TReal32 trueCourse;
+        position->GetValue(EPositionFieldTrueCourse, 
+                        trueCourse);
+        if (trueCourse != KExpectedCourse)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldHorizontalSpeed);
+        if (mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldMagneticCourse);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TReal32 magCourse;
+        position->GetValue(EPositionFieldMagneticCourse, 
+                        magCourse);
+        if (magCourse != KExpectedMagCourse)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        // from GSA
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteNumUsed);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TInt8 numUsedSatellites;
+        position->GetValue(EPositionFieldSatelliteNumUsed, 
+                        numUsedSatellites);
+        if (numUsedSatellites != KExpectedSatUsed)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteHorizontalDoP);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TReal32 hdop;
+        position->GetValue(EPositionFieldSatelliteHorizontalDoP, 
+                        hdop);
+        if (hdop != KExpectedHDOP)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteVerticalDoP);
+        if (mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatellitePositionDoP);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TReal32 pdop;
+        position->GetValue(EPositionFieldSatellitePositionDoP, 
+                        pdop);
+        if (pdop != KExpectedPDOP)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+        // from GSV
+        mustbetrue = position->IsFieldAvailable(EPositionFieldSatelliteNumInView);
+        if (!mustbetrue)
+			{
+			User::Leave(KErrGeneral);
+			}
+        TInt8 satinview;
+        position->GetValue(EPositionFieldSatelliteNumInView, 
+                        satinview);
+        if (satinview != KExpectedSatInView)
+            {
+            User::Leave(KErrGeneral);                
+            }
+
+
+        CleanupStack::PopAndDestroy(position); // position 
+		}
+    CleanupStack::PopAndDestroy(req); // requester  
+	_LIT(KRequestPartialGenericInfo, "Ended: **** Request partial generic info ****");
+	INFO_PRINTF1(KRequestPartialGenericInfo);
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestClearAndSetDefaultPositionDataL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestClearAndSetDefaultPositionDataL()
+    {
+    const TReal32 KExpectedMagCourse = 354.0F;
+    const TReal32 KKnotsToMetrePerSecFactor = 1.852F / 3.6F;
+    const TReal32 KExpectedSpeed = KKnotsToMetrePerSecFactor * 0.0F; 
+    const TReal32 KExpectedHeading = 360; 
+
+    // correct NMEA file
+    FixSettingsForSimPSY(KNmeaSatelliteFile);
+
+    CSimPsyMultiNmeaPosRequester* req = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status;
+    TTimeIntervalMicroSeconds requestTime;
+    
+    //
+    // Make a request with a HPositionGenericInfo object
+	HPositionGenericInfo* position = HPositionGenericInfo::NewLC();
+	TReal32 trueCourse = TReal32(30.00);
+	TInt err = position->SetValue(EPositionFieldTrueCourse, trueCourse);
+        // set position
+    TPosition pos;
+    TReal lat(66.6);
+    TReal lon(77.7);
+    TReal32 alt(100);
+	pos.SetCoordinate(lat, lon, alt);
+	pos.SetCurrentTime();
+	position->SetPosition(pos);
+
+    // make request
+
+	position->SetRequestedField(EPositionFieldMagneticCourse);
+	req->MakeRequests(position);
+    req->GetResult(status, requestTime);   
+    
+    CheckRequestResultL(status, *position);
+	if (status != KErrNone)
+		{
+		User::Leave(KErrGeneral);
+		}
+
+        // Check data from returned generic-info object...
+	err = position->GetValue(EPositionFieldTrueCourse, trueCourse);
+	if (err != KErrNotFound) // value previously set should be cleared
+		{
+		User::Leave(KErrGeneral);	
+		}		
+
+    position->GetPosition(pos);
+    TReal returnedLat = pos.Latitude();
+    TReal returnedLon = pos.Longitude();
+    TReal32 returnedAlt= pos.Altitude();
+
+    if (returnedLat == lat)
+        {
+        User::Leave(KErrGeneral);
+        }
+    if (returnedLon == lon)
+        {
+        User::Leave(KErrGeneral);
+        }
+    if (returnedAlt == alt)
+        {
+        User::Leave(KErrGeneral);
+        }
+
+    TInt mustbetrue = position->IsFieldAvailable(EPositionFieldMagneticCourse);
+    if (!mustbetrue)
+		{
+		User::Leave(KErrGeneral);
+		}
+    TReal32 magCourse;
+    position->GetValue(EPositionFieldMagneticCourse, 
+                    magCourse);
+    if (magCourse != KExpectedMagCourse)
+        {
+        User::Leave(KErrGeneral);                
+        }
+	CleanupStack::PopAndDestroy(position);
+    
+    //
+    // Make a request with a TPositionCourseInfo object
+    TPositionCourseInfo positionCourse = TPositionCourseInfo();
+		
+    // set course
+    TCourse course;
+    TReal32 headingAccuracy(38);
+    course.SetHeadingAccuracy(headingAccuracy);
+    positionCourse.SetCourse(course);
+        
+        // make request
+	req->MakeRequests(&positionCourse);
+    req->GetResult(status, requestTime);  
+            
+    CheckRequestResultL(status, positionCourse);
+
+        // check data from returned course-info object
+    positionCourse.GetCourse(course);
+    TReal32 returnedHeadingAccuracy = course.HeadingAccuracy();
+
+	// TRealX nan;
+	// nan.SetNaN();
+    if (!Math::IsNaN(returnedHeadingAccuracy))
+        {
+        User::Leave(KErrGeneral);                
+        }
+    if (course.Heading() != KExpectedHeading)
+        {
+        User::Leave(KErrGeneral);                
+        } 
+    if (course.Speed() != KExpectedSpeed)
+        {
+        User::Leave(KErrGeneral);                
+        } 
+
+    //
+    // Make a request with a TPositionSatelliteInfo object
+    TPositionSatelliteInfo positionSatellite = TPositionSatelliteInfo();
+        
+        // set sat data
+    TSatelliteData satData;
+    TInt satelliteId(26);
+    satData.SetSatelliteId(satelliteId);
+    satData.SetIsUsed(ETrue);
+    positionSatellite.AppendSatelliteData(satData);
+    
+    TCourse courseSat;
+    headingAccuracy = 85;
+    courseSat.SetHeadingAccuracy(headingAccuracy);
+    positionSatellite.SetCourse(course);
+
+        // make request
+	req->MakeRequests(&positionSatellite);
+    req->GetResult(status, requestTime);  
+            
+    CheckRequestResultL(status, positionSatellite);
+
+        // check data from returned satellite-info object
+    positionSatellite.GetCourse(courseSat);
+    returnedHeadingAccuracy = courseSat.HeadingAccuracy();
+    positionSatellite.GetSatelliteData(0, satData);
+    TInt returnedSatId = satData.SatelliteId();
+
+    if (!Math::IsNaN(returnedHeadingAccuracy))
+        {
+        User::Leave(KErrGeneral);                
+        }
+    if (course.Speed() != KExpectedSpeed)
+        {
+        User::Leave(KErrGeneral);                
+        }
+    if (returnedSatId == satelliteId)
+        {
+        User::Leave(KErrGeneral);                
+        }
+    
+    //
+    // Make a request with a TPositionInfo object
+
+    TPositionInfo positionInfo = TPositionInfo();    
+        // set pos info
+    TPosition posInfo;
+    TReal latInfo(26.6);
+    TReal lonInfo(47.7);
+    TReal32 altInfo(300);
+	posInfo.SetCoordinate(latInfo, lonInfo, altInfo);
+    TUid datumId = {0x01010101};
+    posInfo.SetDatum(datumId);
+	positionInfo.SetPosition(posInfo);
+
+         // make request
+	req->MakeRequests(&positionInfo);
+    req->GetResult(status, requestTime);  
+            
+    CheckRequestResultL(status, positionInfo);
+
+    positionInfo.GetPosition(posInfo);
+    returnedLat = posInfo.Latitude();
+    returnedLon = posInfo.Longitude();
+    returnedAlt= posInfo.Altitude();
+    TUid returnedDatumId = posInfo.Datum();
+
+    if (returnedLat == latInfo)
+        {
+        User::Leave(KErrGeneral);
+        }
+    if (returnedLon == lonInfo)
+        {
+        User::Leave(KErrGeneral);
+        }
+    if (returnedAlt == altInfo)
+        {
+        User::Leave(KErrGeneral);
+        }
+    if (returnedDatumId == datumId)
+        {
+        User::Leave(KErrGeneral);
+        }
+
+
+    CleanupStack::PopAndDestroy(req); // requester 
+	_LIT(KRequestClearAndSetDefaultPositionData, "Ended: **** Test Clear Position Data ****");
+	INFO_PRINTF1(KRequestClearAndSetDefaultPositionData);
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestPartialUpdateL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestPartialUpdateL()
+    {
+	FixSettingsForSimPSY(KNmeaPartialUpdateFile);
+    CSimPsyMultiNmeaPosRequester* requester = CSimPsyMultiNmeaPosRequester::NewLC();
+    requester->SetPartialUpdateRestriction(ETrue);
+
+    TInt status;
+    TTimeIntervalMicroSeconds requestTime;
+
+    TInt KNrOfRequests = 10;
+
+    for (TInt i = 0; i < KNrOfRequests; i++)
+        {
+		TPositionInfo position = TPositionInfo();    
+		requester->MakeRequests(&position);
+		requester->GetResult(status, requestTime); 
+
+        _LIT(KReq, "Request %d completed with %d.");
+		TBuf<128> buf;
+		buf.Format(KReq, i, status);
+        INFO_PRINTF1(buf);
+        RDebug::Print(buf);
+
+        if (status == KPositionPartialUpdate && !IsPartialPosition(position) ||
+            status != KPositionPartialUpdate && IsPartialPosition(position))
+            {
+            User::Leave(KErrGeneral);
+            }
+        else if (status == KErrNone && IsPartialPosition(position))
+            {
+            User::Leave(KErrGeneral);
+            }
+
+        // Fix 0, 2 and 5 is partial
+        if (status == KPositionPartialUpdate && 
+            i != 0 && i != 2 && i != 5)
+            {
+            User::Leave(KErrGeneral);            
+            }
+        // Fix 1, 3, 4 and 6 more is full fixes
+        else if (status == KErrNone && 
+            i != 1 && i != 3 && i != 4 && 
+            i != 6 && i != 7 && i != 8 && i != 9)
+            {
+            User::Leave(KErrGeneral);            
+            }
+
+        }
+    CleanupStack::PopAndDestroy(requester); // requester   
+	_LIT(KTestPartialUpdate, "Ended: **** Test Partial Update ****");
+	INFO_PRINTF1(KTestPartialUpdate);
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestErrorSituationsL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestErrorSituationsL()
+    {
+	FixSettingsForSimPSY(KNmeaError1);
+    CSimPsyMultiNmeaPosRequester* req = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status = KErrNone;
+    TTimeIntervalMicroSeconds requestTime;
+
+    TInt KNrOfRequests = 5;
+
+    req->SetRequesterWillCancelL(0, 4 * 1000000);  // 4 seconds timeout
+
+    for (TInt i = 0; i < KNrOfRequests; i++)
+        {
+		TPositionSatelliteInfo position = TPositionSatelliteInfo();    
+		req->MakeRequests(&position);
+		req->GetResult(status, requestTime); 
+        
+        if (status != KErrCancel)
+            {
+            User::Leave(status);
+            }
+    
+        }
+    CleanupStack::PopAndDestroy(req); // req
+
+	FixSettingsForSimPSY(KNmeaError2);
+    req = CSimPsyMultiNmeaPosRequester::NewLC();
+    req->SetRequesterWillCancelL(0, 4 * 1000000);  // 4 seconds timeout
+    
+    KNrOfRequests = 2;
+
+    for (TInt j = 0; j < KNrOfRequests; j++)
+        {
+		TPositionSatelliteInfo position = TPositionSatelliteInfo();    
+		req->MakeRequests(&position);
+		req->GetResult(status, requestTime); 
+        
+        if (status != KErrNone || 
+            position.NumSatellitesInView() != 15 ||
+            position.NumSatellitesUsed() != 4 ||
+            position.HorizontalDoP() != 2.0 ||
+            position.VerticalDoP() != 2.0)
+            {
+            User::Leave(KErrGeneral);
+            }
+        
+        }
+    CleanupStack::PopAndDestroy(req); // req
+
+    // Check that correct fix is made when NMEA sentence has wrong checksum
+	FixSettingsForSimPSY(KNmeaError3);
+    req = CSimPsyMultiNmeaPosRequester::NewLC();
+    
+    KNrOfRequests = 2;
+
+    for (TInt k = 0; k < KNrOfRequests; k++)
+        {
+		TPositionInfo position = TPositionInfo();    
+		req->MakeRequests(&position);
+		req->GetResult(status, requestTime); 
+
+        TPosition pos;
+        position.GetPosition(pos);
+        
+        if (status != KErrNone)
+            {
+            User::Leave(KErrGeneral);
+            }
+        if (k == 1 && 
+            pos.Altitude() != 200 && 
+            pos.Latitude() != -6 && 
+            pos.Longitude() != -61)
+            {
+            User::Leave(KErrGeneral);
+            }
+        }
+    CleanupStack::PopAndDestroy(req); // req
+
+    // Add more error situations here is applicable
+	_LIT(KTestErrorSituations, "Ended: **** Test wrong situations ****");
+	INFO_PRINTF1(KTestErrorSituations);
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::TestSpecialCasesL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//       
+void CSimPsyNmeaPositionerStep::TestSpecialCasesL()
+    {
+	FixSettingsForSimPSY(KNmeaSpecialCase);
+    CSimPsyMultiNmeaPosRequester* req = CSimPsyMultiNmeaPosRequester::NewLC();
+
+    TInt status = KErrNone;
+    TTimeIntervalMicroSeconds requestTime;
+
+    TInt KNrOfRequests = 4;
+
+    for (TInt i = 0; i < KNrOfRequests; i++)
+        {
+    	HPositionGenericInfo* position = HPositionGenericInfo::NewLC();
+        User::LeaveIfError(position->SetRequestedField(EPositionFieldNMEASentences));
+        
+        req->MakeRequests(position);
+		req->GetResult(status, requestTime); 
+
+        CheckRequestResultL(status, *position);
+
+        TPosition pos;
+        position->GetPosition(pos);
+
+        TUint8 sentences;
+        TInt err = KErrNone;
+        TPtrC8 nmeaString(NULL, 0);
+        
+        if (i == 0)
+            {
+            if (pos.Altitude() != 200)
+                {
+                User::Leave(KErrGeneral);
+                }
+
+	        err = position->GetValue(EPositionFieldNMEASentences, sentences); 
+	        User::LeaveIfError(err);
+	        if (sentences != 7)
+		        {
+		        User::Leave(KErrGeneral);
+		        }
+
+            _LIT8(KExpectedFirstSentence, "$GPGLL,6459.86");
+            User::LeaveIfError(position->GetValue(EPositionFieldNMEASentencesStart, nmeaString));
+            if (nmeaString.Left(14).Compare(KExpectedFirstSentence) != 0)
+                {
+                _LIT(KError, "Expected ,$GPGLL,6459.86*, sentence at the beginning of the burst");
+                LogErrorAndFail(KError);
+                }
+            }
+        if (i == 1)
+            {
+            if (!Math::IsNaN(pos.Altitude()))
+                {
+                User::Leave(KErrGeneral);
+                }            
+	        err = position->GetValue(EPositionFieldNMEASentences, sentences); 
+	        User::LeaveIfError(err);
+	        if (sentences != 9)
+		        {
+		        User::Leave(KErrGeneral);
+		        }
+            }
+        if (i == 2)
+            {
+            if (pos.Altitude() != 200)
+                {
+                User::Leave(KErrGeneral);
+                }            
+            if (pos.Latitude() != -6)
+                {
+                User::Leave(KErrGeneral);
+                }            
+            if (pos.Longitude() != -61)
+                {
+                User::Leave(KErrGeneral);
+                }            
+            err = position->GetValue(EPositionFieldNMEASentences, sentences); 
+	        User::LeaveIfError(err);
+	        if (sentences != 6)
+		        {
+		        User::Leave(KErrGeneral);
+		        }
+
+            _LIT8(KExpectedFirstSentence, "$GPGLL,6459.8250");
+            User::LeaveIfError(position->GetValue(EPositionFieldNMEASentencesStart, nmeaString));
+            if (nmeaString.Left(16).Compare(KExpectedFirstSentence) != 0)
+                {
+                _LIT(KError, "Expected ,$GPGLL,6459.8250*, sentence at the beginning of the burst");
+                LogErrorAndFail(KError);
+                }
+            }
+
+        CleanupStack::PopAndDestroy(position); // position
+        }
+    CleanupStack::PopAndDestroy(req); // req
+	_LIT(KTestSpecialCase, "Ended: **** Test Special Case ****");
+	INFO_PRINTF1(KTestSpecialCase);
+    }
+
+
+
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::CheckRequestResultL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CSimPsyNmeaPositionerStep::CheckRequestResultL(
+	TInt aStatus, TPositionInfo& aPosition)
+    {
+    _LIT(KReq, "Checking status: %d.");
+	TBuf<128> statusSuf;
+	statusSuf.Format(KReq, aStatus);
+    INFO_PRINTF1(statusSuf);
+    RDebug::Print(statusSuf);
+
+    if (aStatus != KErrNone)
+       {
+       User::Leave(aStatus);
+       }
+   
+    TPosition position;		
+	aPosition.GetPosition(position);
+
+    TBuf<30> buf;
+    if (aPosition.ModuleId().iUid != KSimModuleId)
+        {
+        _LIT(KWrongUid, "Expected simulationpsy uid");
+        LogErrorAndFail(KWrongUid);
+        }
+    if (aPosition.UpdateType() != EPositionUpdateGeneral)
+        {
+        _LIT(KWrongUpType, "Expected Update Type General");
+        LogErrorAndFail(KWrongUpType);
+        }
+
+    }
+
+// ---------------------------------------------------------
+// CSimPsyNmeaPositionerStep::IsPartialPosition
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CSimPsyNmeaPositionerStep::IsPartialPosition(
+	TPositionInfoBase& aPosInfo)
+	{
+	TPositionInfo& posInfo = static_cast<TPositionInfo&> (aPosInfo);
+	TPosition pos;
+	posInfo.GetPosition(pos);
+
+	// Check if time is set
+	// Check if longitude is a number
+	// Check if latitude is a number
+	if (pos.Time().Int64() == 0 || 
+		Math::IsNaN(TRealX(pos.Longitude())) ||
+		Math::IsNaN(TRealX(pos.Latitude())))
+		{
+		return ETrue;
+		}
+
+	return EFalse;
+	}
+
+
+// End of File