LbsApi/src/moduleclassesstep.cpp
branchSymbian3
changeset 54 a4835904093b
equal deleted inserted replaced
53:7f293ed715ec 54:a4835904093b
       
     1 // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // Example CTestStep derived implementation
       
    15 // 
       
    16 //
       
    17 
       
    18 /**
       
    19  @file ModuleClassesStep.cpp
       
    20  @internalTechnology
       
    21 */
       
    22 #include "moduleclassesstep.h"
       
    23 #include "te_lbsapisuitedefs.h"
       
    24 
       
    25 #include "lcfsbucommondefinitions.h"
       
    26 
       
    27 #include <lbs.h>
       
    28 #include <lbssatellite.h>
       
    29 
       
    30 CModuleClassesStep::~CModuleClassesStep()
       
    31 /**
       
    32  * Destructor
       
    33  */
       
    34 	{
       
    35 	}
       
    36 
       
    37 CModuleClassesStep::CModuleClassesStep()
       
    38 /**
       
    39  * Constructor
       
    40  */
       
    41 	{
       
    42 	// **MUST** call SetTestStepName in the constructor as the controlling
       
    43 	// framework uses the test step name immediately following construction to set
       
    44 	// up the step's unique logging ID.
       
    45 	SetTestStepName(KModuleClassesStep);
       
    46 	}
       
    47 
       
    48 TVerdict CModuleClassesStep::doTestStepPreambleL()
       
    49 /**
       
    50  * @return - TVerdict code
       
    51  * Override of base class virtual
       
    52  */
       
    53 	{
       
    54 	CTe_LbsApiSuiteStepBase::doTestStepPreambleL();
       
    55 	 if (TestStepResult()!=EPass)
       
    56 	    return   TestStepResult();
       
    57 	// process some pre setting to this test step then set SetTestStepResult to EFail or Epass.
       
    58 	SetTestStepResult(EPass);
       
    59 	return TestStepResult();
       
    60 	}
       
    61 
       
    62 
       
    63 TVerdict CModuleClassesStep::doTestStepL()
       
    64 /**
       
    65  * @return - TVerdict code
       
    66  * Override of base class pure virtual
       
    67  * Our implementation only gets called if the base class doTestStepPreambleL() did
       
    68  * not leave. That being the case, the current test result value will be EPass.
       
    69  */
       
    70 	{
       
    71 	  if (TestStepResult()==EPass)
       
    72 		{
       
    73 		TInt test;
       
    74 		if(!GetIntFromConfig(ConfigSection(),KTe_LbsApiSuiteInt,test)
       
    75 			)
       
    76 			{
       
    77 			// Leave if there's any error.
       
    78 			User::Leave(KErrNotFound);
       
    79 			}
       
    80 		SetTestStepResult(EPass);
       
    81 		StartL(test);
       
    82 		}
       
    83 	  return TestStepResult();
       
    84 	}
       
    85 
       
    86 
       
    87 
       
    88 TVerdict CModuleClassesStep::doTestStepPostambleL()
       
    89 /**
       
    90  * @return - TVerdict code
       
    91  * Override of base class virtual
       
    92  */
       
    93 	{
       
    94 	return TestStepResult();
       
    95 	}
       
    96 
       
    97 
       
    98 void CModuleClassesStep::StartL(TInt aIndex)
       
    99 	{
       
   100 	switch (aIndex)
       
   101 		{
       
   102 	case 0:
       
   103 		TPositionModuleInfo_ConstructionL ();
       
   104 		break;
       
   105 	case 1:
       
   106 		TPositionModuleInfo_GettersL ();
       
   107 		break;
       
   108 	case 2:
       
   109 		TPositionModuleInfo_InvalidL ();
       
   110 		break;
       
   111 	case 3:
       
   112 		TPositionQuality_ConstructionL ();
       
   113 		break;
       
   114 	case 4:
       
   115 		TPositionQuality_SettersL ();
       
   116 		break;
       
   117 	case 5:
       
   118 		TPositionQuality_InvalidL ();
       
   119 		break;
       
   120 	case 6:
       
   121 		TPositionQuality_ComparisonL ();
       
   122 		break;
       
   123 	case 7:
       
   124 		ModuleClasses_ConstructionL ();
       
   125 		break;
       
   126 	case 8:
       
   127 		ModuleClasses_SettersL ();
       
   128 		break;
       
   129 	case 9:
       
   130 		TPositionUpdateOptions_InvalidL ();
       
   131 		break;
       
   132 	default:
       
   133 		break;
       
   134 		}
       
   135 	}
       
   136 
       
   137 
       
   138 //
       
   139 //
       
   140 // TPositionModuleInfo
       
   141 //
       
   142 //
       
   143 
       
   144 // 6.1.1. Construction
       
   145 void CModuleClassesStep::TPositionModuleInfo_ConstructionL()
       
   146 	{
       
   147     DECLARE_ERROR_LOGGING;
       
   148     StandardPrepareL();
       
   149 
       
   150     TPositionModuleInfo posModInfo;
       
   151 
       
   152     CHECK_EQUAL_(sizeof(TPositionModuleInfo), posModInfo.PositionClassSize());
       
   153     CHECK(EPositionModuleInfoClass == posModInfo.PositionClassType());
       
   154 
       
   155     CHECK(KPositionNullModuleId.iUid == posModInfo.ModuleId().iUid);
       
   156 
       
   157     TPositionQuality posQuality;
       
   158     posModInfo.GetPositionQuality(posQuality);
       
   159     CHECK(Math::IsNaN(posQuality.HorizontalAccuracy())); // new pos quality
       
   160 
       
   161     CHECK(!posModInfo.IsAvailable());
       
   162 
       
   163     TBuf<KPositionMaxModuleName> moduleName;
       
   164     posModInfo.GetModuleName(moduleName);
       
   165     CHECK_EQUAL_(0, moduleName.Length());
       
   166 
       
   167     CHECK_EQUAL_(TPositionModuleInfo::TTechnologyType(TPositionModuleInfo::ETechnologyUnknown),
       
   168                             posModInfo.TechnologyType());
       
   169     CHECK_EQUAL_(TPositionModuleInfo::TDeviceLocation(TPositionModuleInfo::EDeviceUnknown),
       
   170                             posModInfo.DeviceLocation());
       
   171     CHECK_EQUAL_(TPositionModuleInfo::TCapabilities(TPositionModuleInfo::ECapabilityNone),
       
   172                             posModInfo.Capabilities());
       
   173 
       
   174     for(TInt i=0; i<EPositionLastFamily; i++)
       
   175             CHECK(0 == posModInfo.ClassesSupported(TPositionClassFamily(i)));
       
   176 
       
   177     TVersion version = posModInfo.Version();
       
   178     TVersion defaultVersion;
       
   179     CHECK_EQUAL_(version.iMajor, defaultVersion.iMajor);
       
   180     CHECK_EQUAL_(version.iMinor, defaultVersion.iMinor);
       
   181     CHECK_EQUAL_(version.iBuild, defaultVersion.iBuild);
       
   182 
       
   183     StandardCleanup();
       
   184 	}
       
   185 
       
   186 // 6.1.2. Set and Get
       
   187 void CModuleClassesStep::TPositionModuleInfo_GettersL()
       
   188 	{
       
   189     DECLARE_ERROR_LOGGING;
       
   190     StandardPrepareL();
       
   191 
       
   192     TPositionModuleInfo posModInfo;
       
   193 
       
   194     const TPositionModuleId KDummyModuleId = {0x32};
       
   195     posModInfo.SetModuleId(KDummyModuleId);
       
   196     CHECK_EQUAL_(KDummyModuleId.iUid, posModInfo.ModuleId().iUid);
       
   197 
       
   198     posModInfo.SetIsAvailable(ETrue);
       
   199     CHECK(posModInfo.IsAvailable());
       
   200     posModInfo.SetIsAvailable(EFalse);
       
   201     CHECK(!posModInfo.IsAvailable());
       
   202 
       
   203     _LIT(KDummyModuleName, "Testing 1,2,3");
       
   204     posModInfo.SetModuleName(KDummyModuleName);
       
   205     TBuf<KPositionMaxModuleName> tempBuf;
       
   206     posModInfo.GetModuleName(tempBuf);
       
   207     CHECK(0 == tempBuf.Compare(KDummyModuleName));
       
   208 
       
   209     TPositionQuality quality, quality2;
       
   210     const TPositionQuality::TCostIndicator KDummyCostIndicator = TPositionQuality::ECostCharge;
       
   211     quality.SetCostIndicator(KDummyCostIndicator);
       
   212     posModInfo.SetPositionQuality(quality);
       
   213 
       
   214     posModInfo.GetPositionQuality(quality2);
       
   215     CHECK_EQUAL_(KDummyCostIndicator, quality2.CostIndicator());
       
   216 
       
   217     posModInfo.SetTechnologyType(TPositionModuleInfo::ETechnologyNetwork);
       
   218     posModInfo.SetDeviceLocation(TPositionModuleInfo::EDeviceExternal);
       
   219 
       
   220     CHECK_EQUAL_(TPositionModuleInfo::TTechnologyType(TPositionModuleInfo::ETechnologyNetwork),
       
   221                             posModInfo.TechnologyType());
       
   222     CHECK_EQUAL_(TPositionModuleInfo::TDeviceLocation(TPositionModuleInfo::EDeviceExternal),
       
   223                             posModInfo.DeviceLocation());
       
   224 
       
   225     const TPositionModuleInfo::TCapabilities KDummyCaps =
       
   226             TPositionModuleInfo::ECapabilitySpeed |
       
   227             TPositionModuleInfo::ECapabilityNmea;
       
   228 
       
   229     posModInfo.SetCapabilities(KDummyCaps);
       
   230     CHECK_EQUAL_(KDummyCaps, posModInfo.Capabilities());
       
   231 
       
   232     for(TUint i=0; i<EPositionLastFamily; i++)
       
   233             posModInfo.SetClassesSupported(TPositionClassFamily(i), 2*i);
       
   234 
       
   235     for(TUint j=0; j<EPositionLastFamily; j++)
       
   236             CHECK(2*j == posModInfo.ClassesSupported(TPositionClassFamily(j)));
       
   237 
       
   238     TVersion KDummyVersion(12,31,45);        //Should be const, but Name isn't a const method for some reason!
       
   239     posModInfo.SetVersion(KDummyVersion);
       
   240     CHECK(posModInfo.Version().Name()==KDummyVersion.Name());
       
   241 
       
   242     StandardCleanup();
       
   243 	}
       
   244 
       
   245 // 6.1.3. Invalid calls to Setters
       
   246 
       
   247 TInt Set_Bad_Class_Type_TPositionModuleInfo(TAny* /*aPtr*/)
       
   248     {
       
   249     TPositionModuleInfo modInfo;
       
   250     modInfo.SetClassesSupported(EPositionLastFamily, 0);        //This should panic
       
   251     return KErrGeneral;
       
   252     }
       
   253 
       
   254 
       
   255 TInt Get_Bad_Class_Type_TPositionModuleInfo(TAny* /*aPtr*/)
       
   256     {
       
   257     TPositionModuleInfo modInfo;
       
   258     (void)modInfo.ClassesSupported(EPositionLastFamily);        //This should panic
       
   259     return KErrGeneral;
       
   260     }
       
   261 
       
   262 void CModuleClassesStep::TPositionModuleInfo_InvalidL()
       
   263 	{
       
   264     DECLARE_ERROR_LOGGING;
       
   265     StandardPrepareL();
       
   266 
       
   267     DO_PANIC_TEST_L(Set_Bad_Class_Type_TPositionModuleInfo, KPosClientFault,
       
   268                                 EPositionInvalidClassType, KDefaultTestTimeout);
       
   269     DO_PANIC_TEST_L(Get_Bad_Class_Type_TPositionModuleInfo, KPosClientFault,
       
   270                                 EPositionInvalidClassType, KDefaultTestTimeout);
       
   271 
       
   272     StandardCleanup();
       
   273 	}
       
   274 
       
   275 //
       
   276 //
       
   277 // TPositionQuality
       
   278 //
       
   279 //
       
   280 
       
   281 // 6.2.1. Construction
       
   282 void CModuleClassesStep::TPositionQuality_ConstructionL()
       
   283 	{
       
   284     DECLARE_ERROR_LOGGING;
       
   285     StandardPrepareL();
       
   286 
       
   287     TPositionQuality quality;
       
   288 
       
   289     CHECK(Math::IsNaN(quality.HorizontalAccuracy()));
       
   290     CHECK(Math::IsNaN(quality.VerticalAccuracy()));
       
   291 
       
   292     CHECK(quality.PositionClassSize() == sizeof(TPositionQuality));
       
   293     CHECK(quality.PositionClassType() == EPositionQualityClass);
       
   294 
       
   295     CHECK(quality.TimeToFirstFix()   == TTimeIntervalMicroSeconds(TInt64(0)));
       
   296     CHECK(quality.TimeToNextFix()    == TTimeIntervalMicroSeconds(TInt64(0)));
       
   297     CHECK(quality.CostIndicator()    == TPositionQuality::ECostUnknown);
       
   298     CHECK(quality.PowerConsumption() == TPositionQuality::EPowerUnknown);
       
   299 
       
   300     StandardCleanup();
       
   301 	}
       
   302 
       
   303 // 6.2.2. Getter and Setters
       
   304 void CModuleClassesStep::TPositionQuality_SettersL()
       
   305 	{
       
   306     DECLARE_ERROR_LOGGING;
       
   307     StandardPrepareL();
       
   308 
       
   309     TPositionQuality posQuality;
       
   310 
       
   311     // "time to" fixes
       
   312     const TTimeIntervalMicroSeconds KTTFF(3425234);
       
   313     const TTimeIntervalMicroSeconds KTTNF(45256265);
       
   314     const TReal32 KHorizontalAccuracy(TReal32(34252.23452));
       
   315     const TReal32 KVerticalAccuracy(TReal32(423.456563));
       
   316     const TPositionQuality::TCostIndicator KDummyCost(TPositionQuality::ECostPossible);
       
   317     const TPositionQuality::TPowerConsumption KDummyPowerConsumption(TPositionQuality::EPowerMedium);
       
   318 
       
   319     posQuality.SetTimeToFirstFix(KTTFF);
       
   320     posQuality.SetTimeToNextFix(KTTNF);
       
   321     posQuality.SetHorizontalAccuracy(KHorizontalAccuracy);
       
   322     posQuality.SetVerticalAccuracy(KVerticalAccuracy);
       
   323     posQuality.SetCostIndicator(KDummyCost);
       
   324     posQuality.SetPowerConsumption(KDummyPowerConsumption);
       
   325 
       
   326     CHECK_EQUAL_(posQuality.TimeToFirstFix().Int64(),    KTTFF.Int64());
       
   327     CHECK_EQUAL_(posQuality.TimeToNextFix().Int64(),     KTTNF.Int64());
       
   328     CHECK_EQUAL_(posQuality.HorizontalAccuracy(),        KHorizontalAccuracy);
       
   329     CHECK_EQUAL_(posQuality.VerticalAccuracy(),          KVerticalAccuracy);
       
   330     CHECK_EQUAL_(posQuality.CostIndicator(),             KDummyCost);
       
   331     CHECK_EQUAL_(posQuality.PowerConsumption(),          KDummyPowerConsumption);
       
   332 
       
   333     // NaNs
       
   334     TRealX nan;
       
   335     nan.SetNaN();
       
   336 
       
   337     posQuality.SetHorizontalAccuracy(nan);
       
   338     posQuality.SetVerticalAccuracy(nan);
       
   339 
       
   340     CHECK(Math::IsNaN(posQuality.HorizontalAccuracy()));
       
   341     CHECK(Math::IsNaN(posQuality.VerticalAccuracy()));
       
   342 
       
   343     // "Zeroes"
       
   344     posQuality.SetTimeToFirstFix(TTimeIntervalMicroSeconds(0));
       
   345     posQuality.SetTimeToNextFix(TTimeIntervalMicroSeconds(0));
       
   346     posQuality.SetCostIndicator(TPositionQuality::ECostUnknown);
       
   347     posQuality.SetPowerConsumption(TPositionQuality::EPowerUnknown);
       
   348 
       
   349     CHECK_EQUAL_(posQuality.TimeToFirstFix().Int64(),    TInt64(0));
       
   350     CHECK_EQUAL_(posQuality.TimeToNextFix().Int64(),     TInt64(0));
       
   351     CHECK_EQUAL_(posQuality.CostIndicator(),             TPositionQuality::ECostUnknown);
       
   352     CHECK_EQUAL_(posQuality.PowerConsumption(),          TPositionQuality::EPowerUnknown);
       
   353 
       
   354     StandardCleanup();
       
   355 	}
       
   356 
       
   357 // 6.2.3. Invalid Input
       
   358 TInt TPositionQuality_Set_Negative_HAccuracy(TAny* /*aPtr*/)
       
   359 	{
       
   360     TPositionQuality quality;
       
   361     quality.SetHorizontalAccuracy(TReal32(-0.1));
       
   362     return KErrGeneral;
       
   363 	}
       
   364 
       
   365 
       
   366 TInt TPositionQuality_Set_Negative_VAccuracy(TAny* /*aPtr*/)
       
   367 	{
       
   368     TPositionQuality quality;
       
   369     quality.SetVerticalAccuracy(TReal32(-0.1));
       
   370     return KErrGeneral;
       
   371 	}
       
   372 
       
   373 
       
   374 TInt TPositionQuality_Set_Negative_TTFirstFix(TAny* /*aPtr*/)
       
   375 	{
       
   376     TPositionQuality quality;
       
   377     quality.SetTimeToFirstFix(TTimeIntervalMicroSeconds(-1));
       
   378     return KErrGeneral;
       
   379 	}
       
   380 
       
   381 
       
   382 TInt TPositionQuality_Set_Negative_TTNextFix(TAny* /*aPtr*/)
       
   383 	{
       
   384     TPositionQuality quality;
       
   385     quality.SetTimeToNextFix(TTimeIntervalMicroSeconds(-1));
       
   386     return KErrGeneral;
       
   387 	}
       
   388 
       
   389 
       
   390 void CModuleClassesStep::TPositionQuality_InvalidL()
       
   391 	{
       
   392     DECLARE_ERROR_LOGGING;
       
   393     StandardPrepareL();
       
   394 
       
   395     DO_PANIC_TEST_L(TPositionQuality_Set_Negative_HAccuracy,
       
   396             KPosClientFault, EPositionBadAccuracy, KDefaultTestTimeout);
       
   397     DO_PANIC_TEST_L(TPositionQuality_Set_Negative_VAccuracy,
       
   398             KPosClientFault, EPositionBadAccuracy, KDefaultTestTimeout);
       
   399     DO_PANIC_TEST_L(TPositionQuality_Set_Negative_TTFirstFix,
       
   400             KPosClientFault, EPositionBadTime, KDefaultTestTimeout);
       
   401     DO_PANIC_TEST_L(TPositionQuality_Set_Negative_TTNextFix,
       
   402             KPosClientFault, EPositionBadTime, KDefaultTestTimeout);
       
   403 
       
   404     StandardCleanup();
       
   405 	}
       
   406 
       
   407 // 6.2.4 Element Comparison
       
   408 #define SET_ELEMENT(aId, aType, aPref, aData)   \
       
   409     if (aId < KPositionMaxSectionFields) SetElement(aId, aType, aPref, aData);
       
   410 
       
   411 #pragma warning (push)
       
   412 #pragma warning (disable: 4127)
       
   413 
       
   414 void CModuleClassesStep::TPositionQuality_ComparisonL()
       
   415 	{
       
   416     DECLARE_ERROR_LOGGING;
       
   417     StandardPrepareL();
       
   418 
       
   419     TPositionQuality q1, q2;
       
   420     TPositionQualityItem::TResult result;
       
   421 
       
   422     // set high values
       
   423     q1.SetTimeToFirstFix(       TTimeIntervalMicroSeconds(20000));
       
   424     q1.SetTimeToNextFix(        TTimeIntervalMicroSeconds(10000));
       
   425     q1.SetHorizontalAccuracy(   TReal32(1000));
       
   426     q1.SetVerticalAccuracy(     TReal32(2000));
       
   427     q1.SetCostIndicator(        TPositionQuality::ECostCharge);
       
   428     q1.SetPowerConsumption(     TPositionQuality::EPowerHigh);
       
   429 
       
   430     // set low values
       
   431     q2.SetTimeToFirstFix(       TTimeIntervalMicroSeconds(2));
       
   432     q2.SetTimeToNextFix(        TTimeIntervalMicroSeconds(1));
       
   433     q2.SetHorizontalAccuracy(   TReal32(1));
       
   434     q2.SetVerticalAccuracy(     TReal32(2));
       
   435     q2.SetCostIndicator(        TPositionQuality::ECostZero);
       
   436     q2.SetPowerConsumption(     TPositionQuality::EPowerZero);
       
   437 
       
   438     for (TInt i = 0; i < q1.HighWaterMark() + 1; i++)
       
   439     	{
       
   440         q1.Compare(q2, i, result);
       
   441         CHECK_EQUAL_(TPositionQualityItem::EIsBetter, result);
       
   442     	}
       
   443 
       
   444     // more common test :-)
       
   445 
       
   446     class TBigQuality1 : public TPositionQualityBase {
       
   447         public:
       
   448             TBigQuality1()
       
   449             	{
       
   450                 SET_ELEMENT(0, TPositionQualityItem::EUndefined,
       
   451                                                   TPositionQualityItem::EPreferGreaterValues, TInt8(100));
       
   452                 SET_ELEMENT(1, TPositionQualityItem::ETInt8,
       
   453                                                   TPositionQualityItem::EPreferSmallerValues, TInt8(100));
       
   454                 SET_ELEMENT(2, TPositionQualityItem::ETInt16,
       
   455                                                   TPositionQualityItem::EPreferGreaterValues, TInt16(100));
       
   456                 SET_ELEMENT(3, TPositionQualityItem::ETInt32,
       
   457                                                   TPositionQualityItem::EPreferSmallerValues, TInt32(100));
       
   458                 SET_ELEMENT(4, TPositionQualityItem::ETInt64,
       
   459                                                   TPositionQualityItem::EPreferGreaterValues, TInt64(100));
       
   460                 SET_ELEMENT(5, TPositionQualityItem::ETUint8,
       
   461                                                   TPositionQualityItem::EPreferSmallerValues, TUint8(100));
       
   462                 SET_ELEMENT(6, TPositionQualityItem::ETUint16,
       
   463                                                   TPositionQualityItem::EPreferGreaterValues, TUint16(100));
       
   464                 SET_ELEMENT(7, TPositionQualityItem::ETUint32,
       
   465                                                   TPositionQualityItem::EPreferSmallerValues, TUint32(100));
       
   466             	};
       
   467     } bigQ1;
       
   468     class TBigQuality2 : public TPositionQualityBase {
       
   469         public:
       
   470             TBigQuality2()
       
   471             	{
       
   472                 SET_ELEMENT(0, TPositionQualityItem::ETReal32,
       
   473                                                   TPositionQualityItem::EPreferGreaterValues, TReal32(100));
       
   474                 SET_ELEMENT(1, TPositionQualityItem::ETReal64,
       
   475                                                   TPositionQualityItem::EPreferSmallerValues, TReal64(100));
       
   476                 SET_ELEMENT(2,TPositionQualityItem::ETTime,
       
   477                                                   TPositionQualityItem::EPreferGreaterValues, TTime(100));
       
   478                 SET_ELEMENT(3,TPositionQualityItem::ETTimeIntervalMicroSeconds,
       
   479                                                   TPositionQualityItem::EPreferSmallerValues, TTimeIntervalMicroSeconds(100));
       
   480             	};
       
   481     } bigQ2;
       
   482 
       
   483     class TLowQuality1 : public TPositionQualityBase {
       
   484         public:
       
   485             TLowQuality1()
       
   486             	{
       
   487                 SET_ELEMENT(0, TPositionQualityItem::EUndefined,
       
   488                                                   TPositionQualityItem::EPreferGreaterValues, TInt8(1));
       
   489                 SET_ELEMENT(1, TPositionQualityItem::ETInt8,
       
   490                                                   TPositionQualityItem::EPreferSmallerValues, TInt8(1));
       
   491                 SET_ELEMENT(2, TPositionQualityItem::ETInt16,
       
   492                                                   TPositionQualityItem::EPreferGreaterValues, TInt16(1));
       
   493                 SET_ELEMENT(3, TPositionQualityItem::ETInt32,
       
   494                                                   TPositionQualityItem::EPreferSmallerValues, TInt32(1));
       
   495                 SET_ELEMENT(4, TPositionQualityItem::ETInt64,
       
   496                                                   TPositionQualityItem::EPreferGreaterValues, TInt64(1));
       
   497                 SET_ELEMENT(5, TPositionQualityItem::ETUint8,
       
   498                                                   TPositionQualityItem::EPreferSmallerValues, TUint8(1));
       
   499                 SET_ELEMENT(6, TPositionQualityItem::ETUint16,
       
   500                                                   TPositionQualityItem::EPreferGreaterValues, TUint16(1));
       
   501                 SET_ELEMENT(7, TPositionQualityItem::ETUint32,
       
   502                                                   TPositionQualityItem::EPreferSmallerValues, TUint32(1));
       
   503             	};
       
   504     } lowQ1;
       
   505     class TLowQuality2 : public TPositionQualityBase {
       
   506         public:
       
   507             TLowQuality2()
       
   508             	{
       
   509                 SET_ELEMENT(0, TPositionQualityItem::ETReal32,
       
   510                                                    TPositionQualityItem::EPreferGreaterValues, TReal32(1));
       
   511                 SET_ELEMENT(1, TPositionQualityItem::ETReal64,
       
   512                                                    TPositionQualityItem::EPreferSmallerValues, TReal64(1));
       
   513                 SET_ELEMENT(2, TPositionQualityItem::ETTime,
       
   514                                                    TPositionQualityItem::EPreferGreaterValues, TTime(1));
       
   515                 SET_ELEMENT(3, TPositionQualityItem::ETTimeIntervalMicroSeconds,
       
   516                                                    TPositionQualityItem::EPreferSmallerValues, TTimeIntervalMicroSeconds(1));
       
   517             	};
       
   518     } lowQ2;
       
   519 
       
   520     // 1st part
       
   521     TInt j = 0;
       
   522     for (j = 0; j < lowQ1.HighWaterMark() + 1; j++)
       
   523     	{
       
   524         lowQ1.Compare(bigQ1, j, result);
       
   525 
       
   526         if (j % 2 == 0)
       
   527         	{
       
   528             // we prefer greater values here
       
   529             CHECK_EQUAL_(TPositionQualityItem::EIsBetter, result);
       
   530         	}
       
   531         else // odd ids
       
   532         	{
       
   533             // we prefer smaller values here
       
   534             CHECK_EQUAL_(TPositionQualityItem::EIsWorse, result);
       
   535         	}
       
   536     	}
       
   537     // same for the 2nd part
       
   538     for (j = 0; j < lowQ2.HighWaterMark() + 1; j++)
       
   539     	{
       
   540         lowQ2.Compare(bigQ2, j, result);
       
   541         TPositionQualityItem::TResult pref;
       
   542         pref = (j % 2 == 0) ? TPositionQualityItem::EIsBetter : TPositionQualityItem::EIsWorse;
       
   543         CHECK_EQUAL_(pref, result);
       
   544     	}
       
   545 
       
   546     // specific test for different preferences and data types
       
   547 
       
   548     class TQualityGreaterSigned : public TPositionQualityBase {
       
   549         public:
       
   550             TQualityGreaterSigned()
       
   551             	{
       
   552                 SET_ELEMENT(0, TPositionQualityItem::ETInt8,
       
   553                                                    TPositionQualityItem::EPreferGreaterValues, TInt8(1));
       
   554                 SET_ELEMENT(1, TPositionQualityItem::ETInt8,
       
   555                                                    TPositionQualityItem::EPreferGreaterValues, TInt8(2));
       
   556                 SET_ELEMENT(2, TPositionQualityItem::ETInt8,
       
   557                                                    TPositionQualityItem::EPreferGreaterValues, TInt8(3));
       
   558             	};
       
   559     } qGS;
       
   560 
       
   561     class TQualityReverse : public TPositionQualityBase {
       
   562         public:
       
   563             TQualityReverse()
       
   564             	{
       
   565                 SET_ELEMENT(0, TPositionQualityItem::ETInt8,
       
   566                                                    TPositionQualityItem::EPreferSmallerValues, TInt8(1));
       
   567                 SET_ELEMENT(1, TPositionQualityItem::ETUint8,
       
   568                                                    TPositionQualityItem::EPreferGreaterValues, TUint8(2));
       
   569                 SET_ELEMENT(2, TPositionQualityItem::ETUint8,
       
   570                                                    TPositionQualityItem::EPreferSmallerValues, TUint8(3));
       
   571 
       
   572                 SET_ELEMENT(3, TPositionQualityItem::ETUint8,
       
   573                                                    TPositionQualityItem::EPreferSmallerValues, TUint8(3));
       
   574                 ResetElement(3);
       
   575             	};
       
   576     } qR;
       
   577 
       
   578     // in all cases KErrArgument should be returned
       
   579     CHECK_EQUAL_(KErrArgument, qGS.Compare(qR, 0, result));
       
   580     CHECK_EQUAL_(KErrArgument, qGS.Compare(qR, 1, result));
       
   581     CHECK_EQUAL_(KErrArgument, qGS.Compare(qR, 2, result));
       
   582 
       
   583     StandardCleanup();
       
   584 	}
       
   585 #pragma warning (pop)
       
   586 
       
   587 //
       
   588 //
       
   589 // Module Updates, Status, Events classes
       
   590 //
       
   591 //
       
   592 
       
   593 // 7.1.1. Construction
       
   594 void CModuleClassesStep::ModuleClasses_ConstructionL()
       
   595 	{
       
   596     DECLARE_ERROR_LOGGING;
       
   597     StandardPrepareL();
       
   598 
       
   599     // Update Options
       
   600     TPositionUpdateOptions updateOptions;
       
   601 
       
   602     CHECK(updateOptions.PositionClassSize() == sizeof(TPositionUpdateOptions));
       
   603     CHECK(updateOptions.PositionClassType() == EPositionUpdateOptionsClass);
       
   604 
       
   605     CHECK_EQUAL_(TInt64(0), updateOptions.UpdateInterval().Int64());
       
   606     CHECK_EQUAL_(TInt64(0), updateOptions.UpdateTimeOut().Int64());
       
   607     CHECK_EQUAL_(TInt64(0), updateOptions.MaxUpdateAge().Int64());
       
   608     CHECK(!updateOptions.AcceptPartialUpdates());
       
   609 
       
   610     const TBool KDummyAcceptUpdates = ETrue;
       
   611     const TTimeIntervalMicroSeconds KUpdateInterval(23412);
       
   612     const TTimeIntervalMicroSeconds KTimeOut(4123523);
       
   613     const TTimeIntervalMicroSeconds KMaxUpdateAge(3245);
       
   614 
       
   615     TPositionUpdateOptions updateOptions2(
       
   616         KUpdateInterval,
       
   617         KTimeOut,
       
   618         KMaxUpdateAge,
       
   619         KDummyAcceptUpdates);
       
   620 
       
   621     CHECK_EQUAL_(KUpdateInterval, updateOptions2.UpdateInterval());
       
   622     CHECK_EQUAL_(KTimeOut, updateOptions2.UpdateTimeOut().Int64());
       
   623     CHECK_EQUAL_(KMaxUpdateAge, updateOptions2.MaxUpdateAge().Int64());
       
   624     CHECK(updateOptions2.AcceptPartialUpdates());
       
   625 
       
   626     // Module Status
       
   627     TPositionModuleStatus moduleStatus;
       
   628 
       
   629     CHECK(moduleStatus.PositionClassSize()  == sizeof(TPositionModuleStatus));
       
   630     CHECK(moduleStatus.PositionClassType()  == EPositionModuleStatusClass);
       
   631 
       
   632     CHECK(moduleStatus.DeviceStatus()       == TPositionModuleStatus::EDeviceUnknown);
       
   633     CHECK(moduleStatus.DataQualityStatus()  == TPositionModuleStatus::EDataQualityUnknown);
       
   634 
       
   635     // Module status event
       
   636     TPositionModuleStatusEvent posModEvent;
       
   637 
       
   638     CHECK(posModEvent.PositionClassSize()   == sizeof(TPositionModuleStatusEvent));
       
   639     CHECK(posModEvent.PositionClassType()   == EPositionModuleStatusEventClass);
       
   640 
       
   641     CHECK(posModEvent.RequestedEvents()     == TPositionModuleStatusEvent::EEventNone);
       
   642     CHECK(posModEvent.OccurredEvents()      == TPositionModuleStatusEvent::EEventNone);
       
   643 
       
   644     posModEvent.GetModuleStatus(moduleStatus);
       
   645 
       
   646     CHECK(moduleStatus.DeviceStatus()       == TPositionModuleStatus::EDeviceUnknown);
       
   647     CHECK(moduleStatus.DataQualityStatus()  == TPositionModuleStatus::EDataQualityUnknown);
       
   648 
       
   649     //Just do a check here for construction with requested events parameter.
       
   650     TPositionModuleStatusEvent posModEvent2(TPositionModuleStatusEvent::EEventDataQualityStatus);
       
   651     CHECK(posModEvent2.RequestedEvents() == TPositionModuleStatusEvent::EEventDataQualityStatus);
       
   652 
       
   653     StandardCleanup();
       
   654 	}
       
   655 
       
   656 // 7.1.2. Setters/Getters
       
   657 void CModuleClassesStep::ModuleClasses_SettersL()
       
   658 	{
       
   659     DECLARE_ERROR_LOGGING;
       
   660     StandardPrepareL();
       
   661 
       
   662     // Update Options
       
   663     TPositionUpdateOptions updateOptions;
       
   664 
       
   665     const TBool KDummyAcceptUpdates = ETrue;
       
   666     const TTimeIntervalMicroSeconds KUpdateInterval(23412);
       
   667     const TTimeIntervalMicroSeconds KTimeOut(4123523);
       
   668     const TTimeIntervalMicroSeconds KMaxUpdateAge(3245);
       
   669 
       
   670     updateOptions.SetAcceptPartialUpdates(KDummyAcceptUpdates);
       
   671     updateOptions.SetUpdateInterval(KUpdateInterval);
       
   672     updateOptions.SetUpdateTimeOut(KTimeOut);
       
   673     updateOptions.SetMaxUpdateAge(KMaxUpdateAge);
       
   674 
       
   675     CHECK(updateOptions.AcceptPartialUpdates());
       
   676     CHECK_EQUAL_(updateOptions.UpdateInterval().Int64(), KUpdateInterval.Int64());
       
   677     CHECK_EQUAL_(updateOptions.UpdateTimeOut().Int64(),  KTimeOut.Int64());
       
   678     CHECK_EQUAL_(updateOptions.MaxUpdateAge().Int64(),   KMaxUpdateAge.Int64());
       
   679 
       
   680     // Module status
       
   681     TPositionModuleStatus moduleStatus;
       
   682 
       
   683     const TPositionModuleStatus::TDeviceStatus
       
   684             KDummyDeviceStatus(TPositionModuleStatus::EDeviceInactive);
       
   685     const TPositionModuleStatus::TDataQualityStatus
       
   686             KDummyQualityStatus(TPositionModuleStatus::EDataQualityPartial);
       
   687 
       
   688     moduleStatus.SetDeviceStatus(KDummyDeviceStatus);
       
   689     moduleStatus.SetDataQualityStatus(KDummyQualityStatus);
       
   690 
       
   691     CHECK_EQUAL_(KDummyDeviceStatus,     moduleStatus.DeviceStatus());
       
   692     CHECK_EQUAL_(KDummyQualityStatus,    moduleStatus.DataQualityStatus());
       
   693 
       
   694     // Module status event
       
   695     TPositionModuleStatusEvent posModEvent;
       
   696 
       
   697     const TPositionModuleId KDummyModuleId = {0x00355463};
       
   698     const TPositionModuleStatusEvent::TModuleEvent
       
   699             KDummyRequestedEvent(TPositionModuleStatusEvent::EEventDeviceStatus);
       
   700     const TPositionModuleStatusEvent::TModuleEvent
       
   701             KDummyOccurredEvent(TPositionModuleStatusEvent::EEventDataQualityStatus);
       
   702     const TPositionModuleStatusEvent::TSystemModuleEvent
       
   703             KDummySystemEvent(TPositionModuleStatusEvent::ESystemModuleRemoved);
       
   704 
       
   705     posModEvent.SetModuleId(KDummyModuleId);
       
   706     posModEvent.SetRequestedEvents(KDummyRequestedEvent);
       
   707     posModEvent.SetOccurredEvents(KDummyOccurredEvent);
       
   708     posModEvent.SetSystemModuleEvent(KDummySystemEvent);
       
   709 
       
   710     CHECK_EQUAL_(KDummyModuleId.iUid,    posModEvent.ModuleId().iUid);
       
   711     CHECK_EQUAL_(KDummyRequestedEvent,   posModEvent.RequestedEvents());
       
   712     CHECK_EQUAL_(KDummyOccurredEvent,    posModEvent.OccurredEvents());
       
   713     CHECK_EQUAL_(KDummySystemEvent,      posModEvent.SystemModuleEvent());
       
   714 
       
   715     TPositionModuleStatus modStatus2;
       
   716     posModEvent.SetModuleStatus(moduleStatus);
       
   717     posModEvent.GetModuleStatus(modStatus2);
       
   718 
       
   719     CHECK_EQUAL_(modStatus2.DeviceStatus(),      KDummyDeviceStatus);
       
   720     CHECK_EQUAL_(modStatus2.DataQualityStatus(), KDummyQualityStatus);
       
   721 
       
   722     StandardCleanup();
       
   723 	}
       
   724 
       
   725 // 7.2.1. Invalid Input in TPositionUpdateOptions
       
   726 const TInt timeNEG(-1);
       
   727 const TInt timeZero(-1);
       
   728 
       
   729 
       
   730 TInt NegativeTimeConstructionInterval(TAny* /*aPtr*/)
       
   731 	{
       
   732     TPositionUpdateOptions updateOptions(timeNEG, timeZero, timeZero);
       
   733     return KErrGeneral;
       
   734 	}
       
   735 
       
   736 
       
   737 TInt NegativeTimeConstructionTimeOut(TAny* /*aPtr*/)
       
   738 	{
       
   739     TPositionUpdateOptions updateOptions(timeZero, timeNEG, timeZero);
       
   740     return KErrGeneral;
       
   741 	}
       
   742 
       
   743 
       
   744 TInt NegativeTimeConstructionMaxAge(TAny* /*aPtr*/)
       
   745 	{
       
   746     TPositionUpdateOptions updateOptions(timeZero, timeZero, timeNEG);
       
   747     return KErrGeneral;
       
   748 	}
       
   749 
       
   750 
       
   751 TInt NegativeTimeSettingInterval(TAny* /*aPtr*/)
       
   752 	{
       
   753     TPositionUpdateOptions updateOptions;
       
   754     updateOptions.SetUpdateInterval(timeNEG);
       
   755     return KErrGeneral;
       
   756 	}
       
   757 
       
   758 
       
   759 TInt NegativeTimeSettingTimeOut(TAny* /*aPtr*/)
       
   760 	{
       
   761     TPositionUpdateOptions updateOptions;
       
   762     updateOptions.SetUpdateTimeOut(timeNEG);
       
   763     return KErrGeneral;
       
   764 	}
       
   765 
       
   766 
       
   767 TInt NegativeTimeSettingMaxAge(TAny* /*aPtr*/)
       
   768 	{
       
   769     TPositionUpdateOptions updateOptions;
       
   770     updateOptions.SetMaxUpdateAge(timeNEG);
       
   771     return KErrGeneral;
       
   772 	}
       
   773 
       
   774 
       
   775 void CModuleClassesStep::TPositionUpdateOptions_InvalidL()
       
   776 	{
       
   777     DECLARE_ERROR_LOGGING;
       
   778     StandardPrepareL();
       
   779 
       
   780     // construction
       
   781     DO_PANIC_TEST_L(NegativeTimeConstructionInterval, KPosClientFault,
       
   782                                     EPositionBadTime, KDefaultTestTimeout);
       
   783     DO_PANIC_TEST_L(NegativeTimeConstructionTimeOut, KPosClientFault,
       
   784                                     EPositionBadTime, KDefaultTestTimeout);
       
   785     DO_PANIC_TEST_L(NegativeTimeConstructionMaxAge, KPosClientFault,
       
   786                                     EPositionBadTime, KDefaultTestTimeout);
       
   787 
       
   788     // setting
       
   789     DO_PANIC_TEST_L(NegativeTimeSettingInterval, KPosClientFault,
       
   790                                     EPositionBadTime, KDefaultTestTimeout);
       
   791     DO_PANIC_TEST_L(NegativeTimeSettingTimeOut, KPosClientFault,
       
   792                                     EPositionBadTime, KDefaultTestTimeout);
       
   793     DO_PANIC_TEST_L(NegativeTimeSettingMaxAge, KPosClientFault,
       
   794                                     EPositionBadTime, KDefaultTestTimeout);
       
   795 
       
   796     StandardCleanup();
       
   797 	}
       
   798