kerneltest/e32test/datetime/t_time.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:26:05 +0100
branchRCL_3
changeset 29 743008598095
parent 4 56f325a607ea
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "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:
// e32test\datetime\t_time.cpp
// Overview:
// Date & time tests
// API Information:
// TDateTime, TTimeInterval...
// Details:
// - Set various locale settings to known values.
// - Test the TDateTime class by checking year, month, day, hour, minute,
// second and microsecond ranges then verify setting individual ranges.
// - Test TTimeIntervalMicroSeconds class: verify construction and initialization.
// Verify the "=", "<", ">", "!=", ">=" and "<=" operators.
// - Test TTimeIntervalSeconds class: verify construction and initialization.
// Verify the "=", "<", ">", "!=", ">=" and "<=" operators.
// - Test TTimeIntervalMinutes, TTimeIntervalHours, TTimeIntervalDays, 
// TTimeIntervalMonths and TTimeIntervalYears classes: verify construction,
// initialization and "=" operator.
// - Test conversions between TDateTime and TTime objects.
// - Test adding and differencing between TDateTime and TTime objects. Including
// the methods: YearsFrom, MonthsFrom, DaysFrom, HoursFrom, MinutesFrom, 
// SecondsFrom and MicroSecondsFrom. Also specific tests for adding months, 
// adding days, adding hours, adding minutes, adding seconds, adding microseconds 
// and invalid differences. 
// - Test adding and subtracting different TTimeIntervals and verify the results.
// - Test TTime's date property functions. Verify results are as expected.
// - Test different date formats and string parsing. Verify results are as expected.
// - Test a variety of time change scenarios and verify results are as expected.
// - Test the TTime::Set() method with different combinations of data, verify the
// results are as expected.
// - Test a variety of operations involving negative times. Verify results are 
// as expected.
// - Test year 2000 and print the results.
// - Test secure clock is not affected by changes 
// Platforms/Drives/Compatibility:
// All.
// Assumptions/Requirement/Pre-requisites:
// Failures and causes:
// Base Port information:
// 
//

#define __E32TEST_EXTENSION__
#include <e32test.h>
#include <e32debug.h>
#include <hal.h>

LOCAL_D RTest test(_L("T_TIME"));

//
// duplication of local variable in UC_TIME
LOCAL_D const TInt8 mTab[2][12]=
    {
    {31,28,31,30,31,30,31,31,30,31,30,31}, // 28 days in Feb
    {31,29,31,30,31,30,31,31,30,31,30,31}  // 29 days in Feb
    };
const TInt64 KDaysToMicroSeconds(MAKE_TINT64(20,500654080));
const TInt64 KHoursToMicroSeconds(3600000000u);
const TInt KSecondsToMicroSeconds=1000000;

class TestTTime
	{
public:
	void Test1(void);
    void Test2(void);
	void Test3(void);
	void Test4(void);
	void Test5(void);
	void Test6(void);
	void Test7(void);
	void Test8(void);
	void Test9(void);
	void Test10(void);
	void Test11(void);
	void Test12(void);
 	void Test13(void);
	void TestSecureClock(void);
	};


void PrintTime(char* sz, TTime& t)
{
	TDateTime dateTime(t.DateTime());
	RDebug::Printf("%s%+02d/%+02d/%+04d %+02d:%+02d:%+02d.%+06d", sz, dateTime.Day()+1,dateTime.Month()+1,dateTime.Year(),dateTime.Hour(),dateTime.Minute(),dateTime.Second(),dateTime.MicroSecond());
}

void TestTTime::Test1(void)
//
// Tests for TDateTime
//
	{
	TInt year=1980; //leap year
	TMonth month=EJanuary;
	TInt day=0;
	TInt hour=0;
	TInt minute=0;
	TInt second=0;
	TInt microSecond=10;

	TDateTime dateTime(year,month,day,hour,minute,second,microSecond);

	test.Next(_L("Testing year ranges"));
    TInt ii;
	for (ii=1970; ii<2100; ii++)
		{
		test(dateTime.Set(ii,ENovember,day,hour,minute,second,microSecond)==KErrNone);
		TTime time(dateTime);
		TDateTime dateTime2(time.DateTime());
		test(dateTime2.Year()==ii);
		test(dateTime2.Month()==ENovember);
		test(dateTime2.Day()==day);
		test(dateTime2.Hour()==hour);
		test(dateTime2.Minute()==minute);
		test(dateTime2.Second()==second);
		test(dateTime2.MicroSecond()==microSecond);
		}

	test.Next(_L("Testing month ranges"));
 	for (ii=0; ii<12; ii++)
		test(dateTime.Set(year,TMonth(ii),day,hour,minute,second,microSecond)==0);
	test(dateTime.Set(year,TMonth(12),day,hour,minute,second,microSecond)!=0);

	test.Next(_L("Testing day ranges"));
	for (ii=0; ii<12; ii++)
		{
		test(dateTime.Set(year,TMonth(ii),(mTab[1][ii]-1),hour,minute,second,microSecond)==0);
		test(dateTime.Set(year+1,TMonth(ii),(mTab[0][ii]-1),hour,minute,second,microSecond)==0);
		test(dateTime.Set(year+1,TMonth(ii),(mTab[0][ii]),hour,minute,second,microSecond)!=0);
		}
	test(dateTime.Set(year,month,-1,hour,minute,second,microSecond)!=0);

	test.Next(_L("Testing hour ranges"));
	for (ii=0; ii<24; ii++)
		test(dateTime.Set(year,EMarch,10,ii,minute,second,microSecond)==0);
	test(dateTime.Set(year,EMarch,10,-1,minute,second,microSecond)!=0); 
	test(dateTime.Set(year,EMarch,10,24,minute,second,microSecond)!=0); 

	test.Next(_L("Testing minute ranges"));
	for (ii=0; ii<60; ii++)
		test(dateTime.Set(year,EMarch,0,0,ii,second,microSecond)==0);
	test(dateTime.Set(year,EMarch,0,0,-1,second,microSecond)!=0);
	test(dateTime.Set(year,EMarch,0,0,60,second,microSecond)!=0);

	test.Next(_L("Testing second ranges"));
	for (ii=0; ii<60; ii++)
		test(dateTime.Set(year,EMarch,0,0,0,ii,microSecond)==0);
	test(dateTime.Set(year,EMarch,0,0,0,-1,microSecond)!=0);
	test(dateTime.Set(year,EMarch,0,0,0,60,microSecond)!=0);

	test.Next(_L("Testing microsecond ranges"));
	for (ii=0; ii<100; ii++)
		test(dateTime.Set(year,EMarch,0,0,0,0,ii)==0);
	test(dateTime.Set(year,EMarch,0,0,0,0,-1)!=0);
	test(dateTime.Set(year,EMarch,0,0,0,0,1000000)!=0);

	test.Next(_L("Testing setting individual ranges"));

	dateTime.Set(year,month,day,hour,minute,second,microSecond);
	year=1984;
	test(dateTime.SetYear(year)==0);
	test(dateTime.Year()==year);
	test(dateTime.Month()==month);
	test(dateTime.Day()==day);
	test(dateTime.Hour()==hour);
	test(dateTime.Minute()==minute);
	test(dateTime.Second()==second);
	test(dateTime.MicroSecond()==microSecond);
	month=EFebruary;
	test(dateTime.SetMonth(month)==0);
	test(dateTime.SetYear(year)==0);
	test(dateTime.Year()==year);
	test(dateTime.Month()==month);
	test(dateTime.Day()==day);
	test(dateTime.Hour()==hour);
	test(dateTime.Minute()==minute);
	test(dateTime.Second()==second);
	test(dateTime.MicroSecond()==microSecond);
	day=28;
	test(dateTime.SetDay(day)==0);
	test(dateTime.SetYear(year)==0);
	test(dateTime.Year()==year);
	test(dateTime.Month()==month);
	test(dateTime.Day()==day);
	test(dateTime.Hour()==hour);
	test(dateTime.Minute()==minute);
	test(dateTime.Second()==second);
	test(dateTime.MicroSecond()==microSecond);
	hour=12;
	test(dateTime.SetHour(hour)==0);
	test(dateTime.SetYear(year)==0);
	test(dateTime.Year()==year);
	test(dateTime.Month()==month);
	test(dateTime.Day()==day);
	test(dateTime.Hour()==hour);
	test(dateTime.Minute()==minute);
	test(dateTime.Second()==second);
	test(dateTime.MicroSecond()==microSecond);
	minute=57;
	test(dateTime.SetMinute(minute)==0);
	test(dateTime.SetYear(year)==0);
	test(dateTime.Year()==year);
	test(dateTime.Month()==month);
	test(dateTime.Day()==day);
	test(dateTime.Hour()==hour);
	test(dateTime.Minute()==minute);
	test(dateTime.Second()==second);
	test(dateTime.MicroSecond()==microSecond);
	second=2;
	test(dateTime.SetSecond(second)==0);
	test(dateTime.SetYear(year)==0);
	test(dateTime.Year()==year);
	test(dateTime.Month()==month);
	test(dateTime.Day()==day);
	test(dateTime.Hour()==hour);
	test(dateTime.Minute()==minute);
	test(dateTime.Second()==second);
	test(dateTime.MicroSecond()==microSecond);
	microSecond=99999;
	test(dateTime.SetMicroSecond(microSecond)==0);
	test(dateTime.SetYear(year)==0);
	test(dateTime.Year()==year);
	test(dateTime.Month()==month);
	test(dateTime.Day()==day);
	test(dateTime.Hour()==hour);
	test(dateTime.Minute()==minute);
	test(dateTime.Second()==second);
	test(dateTime.MicroSecond()==microSecond);

	test(dateTime.SetYear(1981)!=0);
	test(dateTime.SetMonth((TMonth)15)!=0);
	test(dateTime.SetDay(-1)!=0);
	test(dateTime.SetHour(100)!=0);
	test(dateTime.SetMinute(-15)!=0);
	test(dateTime.SetSecond(60)!=0);
	test(dateTime.SetMicroSecond(-2)!=0);
	test(dateTime.Year()==year);
	test(dateTime.Month()==month);
	test(dateTime.Day()==day);
	test(dateTime.Hour()==hour);
	test(dateTime.Minute()==minute);
	test(dateTime.Second()==second);
	test(dateTime.MicroSecond()==microSecond);
	}

 void TestTTime::Test2(void)
 //
 // Tests for TTimeIntervalMicroSeconds
 //
	{
	test.Next(_L("Construction"));
	TTimeIntervalMicroSeconds t1; // uninitialised
	TTimeIntervalMicroSeconds t2(0);
	test(t2.Int64()==0 );
	TTimeIntervalMicroSeconds t3(1000000);
	test(t3.Int64()==1000000 );
	TTimeIntervalMicroSeconds t4(-452);
	test(t4.Int64()==-452 );				

	TTimeIntervalMicroSeconds  t5(MAKE_TINT64(0x7fffffff,0xffffffff));
    t5.Int64();

	test.Next(_L("operator ="));
	TInt num(1234);
	t1=num;
	t2=t1;
	test(t1.Int64()==t2.Int64());

	test.Next(_L("operator <"));
	test((t4<t1)!=0);
	test((t3<t2)==0);
	test((t2<t3)!=0);

	test.Next(_L("operator >"));
	test((t1>t4)!=0);
	test((t2>t3)==0);
	test((t2>t1)==0);

	test.Next(_L("operator !="));
	test((t1!=t3)!=0);
	test((t1!=t2)==0);

	test.Next(_L("operator >="));
	test((t3>=t4)!=0);
	test((t1>=t2)!=0);
	test((t1>=t3)==0);

	test.Next(_L("operator <="));
	test((t4<=t3)!=0);
	test((t1<=t2)!=0);
	test((t3<=t2)==0);
	}

void TestTTime::Test3(void)
//
// Tests for TTimeIntervaSeconds (and therefore TTimeIntervalBase)
//
	{
	test.Next(_L("Construction"));
    TTimeIntervalSeconds s1; // uninitialised
    TTimeIntervalSeconds s2(0);
    test(s2.Int()==0 );

    TTimeIntervalSeconds s3(1);
    test(s3.Int()==1 );
    test(s3.Int()!=0 );

    TTimeIntervalSeconds s4(-1);
    test(s4.Int()==-1 );				

 	TTimeIntervalSeconds s8(2147483647);
    test(s8.Int()== 2147483647);		

    test.Next(_L("operator ="));
    s1=0;
   	test(s1.Int()==0 );
    TTimeIntervalSeconds s5(5),s6;
    s6=s5;
    test(s5.Int()==s6.Int());
	s6=3;
	test(s5.Int()!=s6.Int());

	test.Next(_L("operator <"));
	test((s6<s3)==0);
	test((s3<s5)!=0);
	test((s4<s1)!=0);

	test.Next(_L("operator >"));
	test((s3>s6)==0);
	test((s5>s3)!=0);
	test((s1>s4)!=0);

	test.Next(_L("operator !="));
	s6=s5;
	test((s6!=s5)==0);
	test((s3!=s4)!=0);
	test((s1!=s2)==0);

	test.Next(_L("operator >="));
	test((s1>=s6)==0);
	test((s3>=s5)==0);
	test((s5>=s3)!=0);
	test((s6>=s5)!=0);
	test((s1>=s2)!=0);

	test.Next(_L("operator <="));
	test((s6<=s1)==0);
	test((s5<=s3)==0);
	test((s3<=s5)!=0);
	test((s6<=s5)!=0); 
	test((s1<=s2)!=0);
	}

void TestTTime::Test4()
//
// Tests for all other time intervals
//
	{
	test.Next(_L("TTimeIntervalMinutes"));
    test.Next(_L("Construction"));
    TTimeIntervalMinutes m1; // uninitialised
    TTimeIntervalMinutes m2(0);
    test(m2.Int()==0 );
    TTimeIntervalMinutes m3(1);
    test(m3.Int()==1 );
    test(m3.Int()!=0 );
    TTimeIntervalMinutes m4a(-1);
    test(m4a.Int()==-1 );				
    TTimeIntervalMinutes m4(0xffffffff);
    test((TUint)m4.Int()==0xffffffff);
    test.Next(_L("operator ="));
    m1=0;
   	test(m1.Int()==0 ); 
    TTimeIntervalMinutes m5(5),m6;
    m6=m5;
    test(m5.Int()==m6.Int());
    m6=3;
    m5=m6;
    test(m5.Int()==m6.Int());

	test.Next(_L("TTimeIntervalHours"));
    test.Next(_L("Construction"));
    TTimeIntervalHours h1; // uninitialised
    TTimeIntervalHours h2(0);
    test(h2.Int()==0 );
    TTimeIntervalHours h3(1);
    test(h3.Int()==1 );
    test(h3.Int()!=0 );
    TTimeIntervalHours h4a(-1);
    test(h4a.Int()==-1 );				
    TTimeIntervalHours h4(0xffffffff);
    test((TUint)h4.Int()==0xffffffff);
    test.Next(_L("operator ="));
    h1=0;
    test(h1.Int()==0 );
    TTimeIntervalHours h5(5),h6;
    h6=h5;
    test(h5.Int()==h6.Int());

	test.Next(_L("TTImeIntervalDays"));
    test.Next(_L("Construction"));
    TTimeIntervalDays d1; // uninitialised
   	TTimeIntervalDays d2(0);
    test(d2.Int()==0 );
    TTimeIntervalDays d3(1);
    test(d3.Int()==1 );
    test(d3.Int()!=0 );
    TTimeIntervalDays d4a(-1);
    test(d4a.Int()==-1 );				
    TTimeIntervalDays d4(0xffffffff);
    test((TUint)d4.Int()==0xffffffff);
    test.Next(_L("operator ="));
    d1=0;
   	test(d1.Int()==0 ); 
    TTimeIntervalDays d5(5),d6;
    d6=d5;
    test(d5.Int()==d6.Int());

    test.Next(_L("TTimeIntervalMonths"));
    test.Next(_L("Construction"));
    TTimeIntervalMonths mo1; // uninitialised
    TTimeIntervalMonths mo2(0);
    test(mo2.Int()==0 );
    TTimeIntervalMonths mo3(1);
    test(mo3.Int()==1 );
    test(mo3.Int()!=0 );
    TTimeIntervalMonths mo4a(-1);
    test(mo4a.Int()==-1 );				
    TTimeIntervalMonths mo4(0xffffffff);
    test((TUint)mo4.Int()==0xffffffff);
    test.Next(_L("operator ="));
    mo1=0;
   	test(mo1.Int()==0 );
    TTimeIntervalMonths mo5(5),mo6;
    mo6=mo5;
    test(mo5.Int()==mo6.Int());

    test.Next(_L("TTimeIntervalYears"));
    test.Next(_L("Construction"));
    TTimeIntervalYears y1; // uninitialised
    TTimeIntervalYears y2(0);
    test(y2.Int()==0 );
    TTimeIntervalYears y3(1);
    test(y3.Int()==1 );
    test(y3.Int()!=0 );
    TTimeIntervalYears y4a(-1);
    test(y4a.Int()==-1 );				
    TTimeIntervalYears y4(0xffffffff);
    test((TUint)y4.Int()==0xffffffff);
    test.Next(_L("operator ="));
    y1=0;
   	test(y1.Int()==0 );
    TTimeIntervalYears y5(17),y6;
    y6=y5;
    test(y5.Int()==y6.Int());
	y6=16;
	test(y5.Int()!=y6.Int());
	y5=16;
    test(y5.Int()==y6.Int());
    }


void TestTTime::Test5()
//
// TDateTime to TTime convertions and vice versa, very large loop, so in own function for easy removal
//
	{
	TInt microSecond=500000;
	TDateTime dateTime(0,EJanuary,0,0,0,0,microSecond);
    TInt year;
	for(year=1590;year<1710;year+=2)
		{
		dateTime.SetYear(year);
		for(TInt m=0;m<6;m++)
			{
			static TInt months[]={0,1,2,8,9,11};
			TInt month=months[m];
			dateTime.SetDay(0); // to make sure next line always suceeds
			dateTime.SetMonth((TMonth)month);
			for(TInt d=0;d<6;d++)
				{
				static TInt days[]={0,1,27,28,29,30};
				TInt day=days[d];
				if (day>=mTab[Time::IsLeapYear(year)][month])
					break;
				dateTime.SetDay(day);
				for(TInt h=0;h<4;h++)
					{
					static TInt hours[]={0,11,12,23};
					TInt hour=hours[h];
					dateTime.SetHour(hour);
					for(TInt minute=0;minute<60;minute+=59)
						{
						dateTime.SetMinute(minute);
						for(TInt second=0;second<60;second+=59)
							{
							dateTime.SetSecond(second);
							TTime tim(dateTime);
							dateTime = tim.DateTime();  
							test(dateTime.Year()==year);
							test(dateTime.Month()==(TMonth)month);
							test(dateTime.Day()==day);
							test(dateTime.Hour()==hour);
							test(dateTime.Minute()==minute);
							test(dateTime.Second()==second);
							test(dateTime.MicroSecond()==microSecond);
							}
						}
					}
				}
			}
		}

// smaller loop for -ve dates
	for (year=-150; year<5; year+=15)
		{
		dateTime.SetYear(year);
		for(TInt month=0; month<12; month+=5)
			{
			dateTime.SetDay(0); // to make sure next line always suceeds
			dateTime.SetMonth((TMonth)month);
			for(TInt day=0; day<30; day+=7)
				{
				if (day>=mTab[Time::IsLeapYear(year)][month])
					break;
				dateTime.SetDay(day);
				for(TInt hour=0; hour<24; hour+=6)
					{
					dateTime.SetHour(hour);
					for(TInt minute=0; minute<60; minute+=15)
						{
						dateTime.SetMinute(minute);
						for(TInt second=0; second<60; second+=20)
							{
							dateTime.SetSecond(second);
							TTime tim(dateTime);
							dateTime = tim.DateTime();  
							test(dateTime.Year()==year);
							test(dateTime.Month()==(TMonth)month);
							test(dateTime.Day()==day);
							test(dateTime.Hour()==hour);
							test(dateTime.Minute()==minute);
							test(dateTime.Second()==second);
							test(dateTime.MicroSecond()==microSecond);
							}
						}
					}
				}
			}
		}

	TTime tim(MAKE_TINT64(0x7fffffff,0xffffffff));
	dateTime = tim.DateTime();
	tim = dateTime;
	test(tim.Int64()==MAKE_TINT64(0x7fffffff,0xffffffff));
	}

void TestTTime::Test6()
//
// Adding and differencing
//
	{
	TDateTime dateTime(4,EJanuary,30,0,0,0,0);

	test.Next(_L("TTimeIntervalYears"));
	TTime base=dateTime;
	TTimeIntervalYears year(1);
	TTime result=base+year;
	dateTime=result.DateTime();																 												
	test(dateTime.Year()==5);
	test(dateTime.Month()==EJanuary);
	test(dateTime.Day()==30);
	test(result.YearsFrom(base)==year);
	year=2000;
	result+=year;
	dateTime=result.DateTime();
	test(dateTime.Year()==2005);
	test(dateTime.Month()==EJanuary);
	test(dateTime.Day()==30);
	test(result.YearsFrom(base)==TTimeIntervalYears(2001));
	test(base.YearsFrom(result)==TTimeIntervalYears(-2001));

	test.Next(_L("YearsFrom"));
	TTime timeNow;
	timeNow.HomeTime();
	TTime timeFuture=timeNow+TTimeIntervalYears(10);
	test(timeFuture.YearsFrom(timeNow).Int()==10);
	test(timeNow.YearsFrom(timeFuture).Int()==-10);
	TTime mintime = Time::MinTTime();
	test(timeNow.YearsFrom(mintime).Int()>0);//must be positive value
	test(mintime.YearsFrom(timeNow).Int()<0);//must be negative value
	TTime maxtime = Time::MaxTTime();
	test(timeNow.YearsFrom(maxtime).Int()<0);//must be negative value
	test(maxtime.YearsFrom(timeNow).Int()>0);//must be positive value

	test.Next(_L("Adding months"));
	TTimeIntervalMonths month(1);
	result=base+month;
	dateTime=result.DateTime();
	test(dateTime.Year()==4);
	test(dateTime.Month()==EFebruary);
	test(dateTime.Day()==28); // leap year
	test(result.YearsFrom(base)==TTimeIntervalYears(0));
	test(base.YearsFrom(result)==TTimeIntervalYears(0));
	test(result.MonthsFrom(base)==month);
	test(base.MonthsFrom(result)==TTimeIntervalMonths(-month.Int()));
	month=12;
	result+=month;
	dateTime=result.DateTime();
	test(dateTime.Year()==5);
	test(dateTime.Month()==EFebruary);
	test(dateTime.Day()==27); // not aleap year
	test(result.YearsFrom(base)==TTimeIntervalYears(1));
	test(base.YearsFrom(result)==TTimeIntervalYears(-1));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(13));
	test(base.MonthsFrom(result)==TTimeIntervalYears(-13));

	test.Next(_L("MonthsFrom"));
	timeNow.HomeTime();
	timeFuture=timeNow+TTimeIntervalMonths(10);
	test(timeFuture.MonthsFrom(timeNow).Int()==10);
	test(timeNow.MonthsFrom(timeFuture).Int()==-10);
	test(timeNow.MonthsFrom(mintime).Int()>0);//must be positive value
	test(mintime.MonthsFrom(timeNow).Int()<0);//must be negative value
	test(timeNow.MonthsFrom(maxtime).Int()<0);//must be negative value
	test(maxtime.MonthsFrom(timeNow).Int()>0);//must be positive value

	test.Next(_L("Adding days"));
	TTimeIntervalDays day(1);
	result=base+day;
	dateTime=result.DateTime();
	test(dateTime.Year()==4);
	test(dateTime.Month()==EFebruary);
	test(dateTime.Day()==0);
	test(result.YearsFrom(base)==TTimeIntervalYears(0));
	test(base.YearsFrom(result)==TTimeIntervalYears(0));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(0));
	test(base.MonthsFrom(result)==TTimeIntervalMonths(0));
	test(result.DaysFrom(base)==day);
	test(base.DaysFrom(result)==TTimeIntervalDays(-day.Int()));
	day=60;
	result+=day;
	dateTime=result.DateTime();
	test(dateTime.Year()==4);
	test(dateTime.Month()==EApril);
	test(dateTime.Day()==0);
	test(result.YearsFrom(base)==TTimeIntervalYears(0));
	test(base.YearsFrom(result)==TTimeIntervalYears(0));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(2));
	test(base.MonthsFrom(result)==TTimeIntervalMonths(-2));
	test(result.DaysFrom(base)==TTimeIntervalDays(61));
	test(base.DaysFrom(result)==TTimeIntervalDays(-61));

	test.Next(_L("DaysFrom"));
	timeNow.HomeTime();
	timeFuture=timeNow+TTimeIntervalDays(10);
	test(timeFuture.DaysFrom(timeNow).Int()==10);
	test(timeNow.DaysFrom(timeFuture).Int()==-10);
	test(timeNow.DaysFrom(mintime).Int()>0);//must be positive value
	test(mintime.DaysFrom(timeNow).Int()<0);//must be negative value	
	test(timeNow.DaysFrom(maxtime).Int()<0);//must be negative value
	test(maxtime.DaysFrom(timeNow).Int()>0);//must be positive value

	test.Next(_L("Adding hours"));
	TTimeIntervalHours hour(6);
	result=base+hour;
	dateTime=result.DateTime();
	test(dateTime.Year()==4);
	test(dateTime.Month()==EJanuary);
	test(dateTime.Day()==30);
	test(dateTime.Hour()==6);
	test(result.YearsFrom(base)==TTimeIntervalYears(0));
	test(base.YearsFrom(result)==TTimeIntervalYears(0));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(0));
	test(base.MonthsFrom(result)==TTimeIntervalMonths(0));
	test(result.DaysFrom(base)==TTimeIntervalDays(0));
	test(base.DaysFrom(result)==TTimeIntervalDays(0));
	TInt ret=result.HoursFrom(base,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(6));
	ret=base.HoursFrom(result,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(-6));
	hour=20;
	result+=hour;
	dateTime=result.DateTime();
	test(dateTime.Year()==4);
	test(dateTime.Month()==EFebruary);
	test(dateTime.Day()==0);
	test(dateTime.Hour()==2);
	test(result.YearsFrom(base)==TTimeIntervalYears(0));
	test(base.YearsFrom(result)==TTimeIntervalYears(0));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(0));
	test(base.MonthsFrom(result)==TTimeIntervalMonths(0));
	test(result.DaysFrom(base)==TTimeIntervalDays(1));
	test(base.DaysFrom(result)==TTimeIntervalDays(-1));
	ret=result.HoursFrom(base,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(26));
	ret=base.HoursFrom(result,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(-26));

	test.Next(_L("HoursFrom"));
	timeNow.HomeTime();
	timeFuture=timeNow+TTimeIntervalHours(10);
	test(timeFuture.HoursFrom(timeNow,hour)==KErrNone);
	test(hour.Int()==10);
	test(timeNow.HoursFrom(timeFuture,hour)==KErrNone);
	test(hour.Int()==-10); // fails this in 059
	timeFuture=timeNow+TTimeIntervalHours(KMaxTInt);
	test(timeFuture.HoursFrom(timeNow,hour)==KErrNone);
	test(hour.Int()==KMaxTInt);
	test(timeNow.HoursFrom(timeFuture,hour)==KErrNone);
	test(hour.Int()==-KMaxTInt);
	timeFuture=timeFuture+TTimeIntervalHours(1);
	test(timeFuture.HoursFrom(timeNow,hour)==KErrOverflow);
	test(timeNow.HoursFrom(timeFuture,hour)==KErrNone);
	test(hour.Int()==KMinTInt);
	timeFuture=timeFuture+TTimeIntervalHours(1);
	test(timeFuture.HoursFrom(timeNow,hour)==KErrOverflow);
	test(timeNow.HoursFrom(timeFuture,hour)==KErrOverflow);

	test.Next(_L("Adding minutes"));
	TTimeIntervalMinutes minute(73);
	result=base+minute;
	dateTime=result.DateTime();
	test(dateTime.Year()==4);
	test(dateTime.Month()==EJanuary);
	test(dateTime.Day()==30);
	test(dateTime.Hour()==1);
	test(dateTime.Minute()==13);
	test(result.YearsFrom(base)==TTimeIntervalYears(0));
	test(base.YearsFrom(result)==TTimeIntervalYears(0));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(0));
	test(base.MonthsFrom(result)==TTimeIntervalMonths(0));
	test(result.DaysFrom(base)==TTimeIntervalDays(0));
	test(base.DaysFrom(result)==TTimeIntervalDays(0));
	ret=result.HoursFrom(base,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(1));
	ret=base.HoursFrom(result,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(-1));
	ret=result.MinutesFrom(base,minute);
	test(ret==0);
	test(minute==TTimeIntervalMinutes(73));
	ret=base.MinutesFrom(result,minute);
	test(ret==0);
	test(minute==TTimeIntervalMinutes(-73));
	minute=1367;
	result+=minute;
	dateTime=result.DateTime();
	test(dateTime.Year()==4);
	test(dateTime.Month()==EFebruary);
	test(dateTime.Day()==0);
	test(dateTime.Hour()==0);
	test(dateTime.Minute()==0);
	test(result.YearsFrom(base)==TTimeIntervalYears(0));
	test(base.YearsFrom(result)==TTimeIntervalYears(0));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(0));
	test(base.MonthsFrom(result)==TTimeIntervalMonths(0));
	test(result.DaysFrom(base)==TTimeIntervalDays(1));
	test(base.DaysFrom(result)==TTimeIntervalDays(-1));
	ret=result.HoursFrom(base,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(24));
	ret=base.HoursFrom(result,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(-24));
	ret=result.MinutesFrom(base,minute);
	test(ret==0);
	test(minute==TTimeIntervalMinutes(1440));
	ret=base.MinutesFrom(result,minute);
	test(ret==0);
	test(minute==TTimeIntervalMinutes(-1440));

	test.Next(_L("MinutesFrom"));
	timeNow.HomeTime();
	timeFuture=timeNow+TTimeIntervalMinutes(10);
	test(timeFuture.MinutesFrom(timeNow,minute)==KErrNone);
	test(minute.Int()==10);
	test(timeNow.MinutesFrom(timeFuture,minute)==KErrNone);
	test(minute.Int()==-10); // fails this	in 059
	timeFuture=timeNow+TTimeIntervalMinutes(KMaxTInt);
	test(timeFuture.MinutesFrom(timeNow,minute)==KErrNone);
	test(minute.Int()==KMaxTInt);
	test(timeNow.MinutesFrom(timeFuture,minute)==KErrNone);
	test(minute.Int()==-KMaxTInt);
	timeFuture=timeFuture+TTimeIntervalMinutes(1);
	test(timeFuture.MinutesFrom(timeNow,minute)==KErrOverflow);
	test(timeNow.MinutesFrom(timeFuture,minute)==KErrNone);
	test(minute.Int()==KMinTInt);
	timeFuture=timeFuture+TTimeIntervalMinutes(1);
	test(timeFuture.MinutesFrom(timeNow,minute)==KErrOverflow);
	test(timeNow.MinutesFrom(timeFuture,minute)==KErrOverflow);

	test.Next(_L("Adding seconds"));
	TTimeIntervalSeconds second(305222);
	result=base+second;
	dateTime=result.DateTime();
	test(dateTime.Year()==4);
	test(dateTime.Month()==EFebruary);
	test(dateTime.Day()==2);
	test(dateTime.Hour()==12);
	test(dateTime.Minute()==47);
	test(dateTime.Second()==2);
	test(result.YearsFrom(base)==TTimeIntervalYears(0));
	test(base.YearsFrom(result)==TTimeIntervalYears(0));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(0));
	test(base.MonthsFrom(result)==TTimeIntervalMonths(0));
	test(result.DaysFrom(base)==TTimeIntervalDays(3));
	test(base.DaysFrom(result)==TTimeIntervalDays(-3));
	ret=result.HoursFrom(base,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(84));
	ret=base.HoursFrom(result,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(-84));
	ret=result.MinutesFrom(base,minute);
	test(ret==0);
	test(minute==TTimeIntervalMinutes(5087));
	ret=base.MinutesFrom(result,minute);
	test(ret==0);
	test(minute==TTimeIntervalMinutes(-5087));
	ret=result.SecondsFrom(base,second);
	test(ret==0);
	test(second==TTimeIntervalSeconds(305222));
	ret=base.SecondsFrom(result,second);
	test(ret==0);
	test(second==TTimeIntervalSeconds(-305222));
	second=58;
	result+=second;
	dateTime=result.DateTime();
	test(dateTime.Year()==4);
	test(dateTime.Month()==EFebruary);
	test(dateTime.Day()==2);
	test(dateTime.Hour()==12);
	test(dateTime.Minute()==48);
	test(dateTime.Second()==0);
	test(result.YearsFrom(base)==TTimeIntervalYears(0));
	test(base.YearsFrom(result)==TTimeIntervalYears(0));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(0));
	test(base.MonthsFrom(result)==TTimeIntervalMonths(0));
	test(result.DaysFrom(base)==TTimeIntervalDays(3));
	test(base.DaysFrom(result)==TTimeIntervalDays(-3));
	ret=result.HoursFrom(base,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(84));
	ret=base.HoursFrom(result,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(-84));
	ret=result.MinutesFrom(base,minute);
	test(ret==0);
	test(minute==TTimeIntervalMinutes(5088));
	ret=base.MinutesFrom(result,minute);
	test(ret==0);
	test(minute==TTimeIntervalMinutes(-5088));
	ret=result.SecondsFrom(base,second);
	test(ret==0);
	test(second==TTimeIntervalSeconds(305280));
	ret=base.SecondsFrom(result,second);
	test(ret==0);
	test(second==TTimeIntervalSeconds(-305280));

	test.Next(_L("SecondsFrom"));
	timeNow.HomeTime();
	timeFuture=timeNow+TTimeIntervalSeconds(10);
	test(timeFuture.SecondsFrom(timeNow,second)==KErrNone);
	test(second.Int()==10);
	test(timeNow.SecondsFrom(timeFuture,second)==KErrNone);
	test(second.Int()==-10);
	timeFuture=timeNow+TTimeIntervalSeconds(KMaxTInt);
	test(timeFuture.SecondsFrom(timeNow,second)==KErrNone);
	test(second.Int()==KMaxTInt);
	test(timeNow.SecondsFrom(timeFuture,second)==KErrNone);
	test(second.Int()==-KMaxTInt);
	timeFuture=timeFuture+TTimeIntervalSeconds(1);
	test(timeFuture.SecondsFrom(timeNow,second)==KErrOverflow);
	test(timeNow.SecondsFrom(timeFuture,second)==KErrNone);
	test(second.Int()==KMinTInt);
	timeFuture=timeFuture+TTimeIntervalSeconds(1);
	test(timeFuture.SecondsFrom(timeNow,second)==KErrOverflow);
	test(timeNow.SecondsFrom(timeFuture,second)==KErrOverflow);

	test.Next(_L("Adding microseconds"));
	TTimeIntervalMicroSeconds microsecond=KDaysToMicroSeconds+KHoursToMicroSeconds+MAKE_TINT64(0,5000);
	result=base+microsecond;
	dateTime=result.DateTime();
	test(dateTime.Year()==4);
	test(dateTime.Month()==EFebruary);
	test(dateTime.Day()==0);
	test(dateTime.Hour()==1);
	test(dateTime.Minute()==0);
	test(dateTime.Second()==0);
	test(dateTime.MicroSecond()==5000);
	test(result.YearsFrom(base)==TTimeIntervalYears(0));
	test(base.YearsFrom(result)==TTimeIntervalYears(0));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(0));
	test(base.MonthsFrom(result)==TTimeIntervalMonths(0));
	test(result.DaysFrom(base)==TTimeIntervalDays(1));
	test(base.DaysFrom(result)==TTimeIntervalDays(-1));
	ret=result.HoursFrom(base,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(25));
	ret=base.HoursFrom(result,hour);
	test(ret==0);
	test(hour==TTimeIntervalHours(-25));
	ret=result.MinutesFrom(base,minute);
	test(ret==0);
	test(minute==TTimeIntervalMinutes(1500));
	ret=base.MinutesFrom(result,minute);
	test(ret==0);
	test(minute==TTimeIntervalMinutes(-1500));
	ret=result.SecondsFrom(base,second);
	test(ret==0);
	test(second==TTimeIntervalSeconds(90000));
	ret=base.SecondsFrom(result,second);
	test(ret==0);
	test(second==TTimeIntervalSeconds(-90000));
	test(result.MicroSecondsFrom(base)==microsecond);
	microsecond=5008;
	result+=microsecond;
	dateTime=result.DateTime();
	test(dateTime.Year()==4);
	test(dateTime.Month()==EFebruary);
	test(dateTime.Day()==0);
	test(dateTime.Hour()==1);
	test(dateTime.Minute()==0);
	test(dateTime.Second()==0);
	test(dateTime.MicroSecond()==10008);

	test.Next(_L("MicroSecondsFrom"));
	timeNow.HomeTime();
	timeFuture=timeNow+TTimeIntervalMicroSeconds(10);
	test(timeFuture.MicroSecondsFrom(timeNow).Int64()==10);
	test(timeNow.MicroSecondsFrom(timeFuture).Int64()==-10);

	test.Next(_L("Testing invalid differences"));
	TInt64 overflow(KMaxTInt);
	overflow++;
	overflow*=KSecondsToMicroSeconds;
	result=base+TTimeIntervalMicroSeconds(overflow);
	ret=result.SecondsFrom(base,second);
	test(ret==KErrOverflow);
	overflow*=60;
	result=base+TTimeIntervalMicroSeconds(overflow);
	ret=result.MinutesFrom(base,minute);
	test(ret==KErrOverflow);
	overflow*=60;
	result=base+TTimeIntervalMicroSeconds(overflow);
	ret=result.HoursFrom(base,hour);
	test(ret==KErrOverflow);

	test.Next(_L("Specific MonthsFrom() tests"));

	base=TDateTime(1995,EJanuary,30,0,0,0,0);
	result=TDateTime(1995,EFebruary,27,0,0,0,0);
	test(result.MonthsFrom(base)==TTimeIntervalMonths(1));

	base=TDateTime(1995,EJanuary,27,0,0,0,0);
	result=TDateTime(1995,EFebruary,27,0,0,0,0);
	test(result.MonthsFrom(base)==TTimeIntervalMonths(1));

	base=TDateTime(1995,EJanuary,29,0,0,0,0);
	result=TDateTime(1995,EFebruary,27,0,0,0,0);
	test(result.MonthsFrom(base)==TTimeIntervalMonths(1));

	base=TDateTime(1995,EJanuary,30,0,0,0,0);
	result=TDateTime(1995,EFebruary,27,0,0,0,0);
	test(base.MonthsFrom(result)==TTimeIntervalMonths(-1));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(1));

	base=TDateTime(1995,EJanuary,27,0,0,0,0);
	result=TDateTime(1995,EFebruary,27,0,0,0,0);
	test(base.MonthsFrom(result)==TTimeIntervalMonths(-1));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(1));

	base=TDateTime(1995,EJanuary,29,0,0,0,0);
	result=TDateTime(1995,EFebruary,27,0,0,0,0);
	test(base.MonthsFrom(result)==TTimeIntervalMonths(-1));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(1));

	base=TDateTime(1995,EJanuary,26,0,0,0,0);
	result=TDateTime(1995,EFebruary,27,0,0,0,0);
	test(base.MonthsFrom(result)==TTimeIntervalMonths(-1));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(1));

	base=TDateTime(1995,EFebruary,27,0,0,0,0);
	result=TDateTime(1995,EMarch,29,0,0,0,0);
	test(base.MonthsFrom(result)==TTimeIntervalMonths(-1));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(1));

	base=TDateTime(1995,EFebruary,27,0,0,0,0);
	result=TDateTime(1995,EMarch,30,0,0,0,0);
	test(base.MonthsFrom(result)==TTimeIntervalMonths(-1));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(1));

	base=TDateTime(1995,EFebruary,27,13,0,0,0);
	result=TDateTime(1995,EJanuary,29,12,0,0,0);
	test(base.MonthsFrom(result)==TTimeIntervalMonths(1));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(-1));

	base=TDateTime(1995,EFebruary,27,12,0,0,0);
	result=TDateTime(1995,EJanuary,29,13,0,0,0);
	test(base.MonthsFrom(result)==TTimeIntervalMonths(0));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(0));

	base=TDateTime(1995,EJanuary,27,12,0,0,0);
	result=TDateTime(1995,EJanuary,29,13,0,0,0);
	test(base.MonthsFrom(result)==TTimeIntervalMonths(0));
	test(result.MonthsFrom(base)==TTimeIntervalMonths(0));

	test.Next(_L("Looped MonthsFrom() test"));
	const TTime endBase=MAKE_TINT64(74334524,25422354);
	const TTime endResult=MAKE_TINT64(154334524,25422354);
	const TTimeIntervalMicroSeconds plus=MAKE_TINT64(1234567,23453452);
	for (base=MAKE_TINT64(3563656,3456235623u);base<endBase;base+=plus)
		for (result=MAKE_TINT64(3563656,3456235623u);result<endResult;result+=plus)
			test(base.MonthsFrom(result).Int()==-result.MonthsFrom(base).Int()); 
	}

void TestTTime::Test7()
//
// subtracting
//
	{
	TDateTime dateTime(1996,EApril,3,0,0,0,0);
	TTime base(dateTime);
	TTime tim(base);

	tim+=TTimeIntervalYears(7);
	tim+=TTimeIntervalMonths(3);
	tim+=TTimeIntervalDays(40);
	tim+=TTimeIntervalHours(-3);
	tim+=TTimeIntervalMinutes(1234);
	tim+=TTimeIntervalSeconds(666);
	tim+=TTimeIntervalMicroSeconds(-876540);
	tim-=TTimeIntervalMicroSeconds(-876540);
	tim-=TTimeIntervalSeconds(666);
	tim-=TTimeIntervalMinutes(1234);
	tim-=TTimeIntervalHours(-3);
	tim-=TTimeIntervalDays(40);
	tim-=TTimeIntervalMonths(3);
	tim-=TTimeIntervalYears(7);
	test (base==tim);

	tim-=TTimeIntervalMicroSeconds(9999999);
	tim-=TTimeIntervalSeconds(52);
	tim-=TTimeIntervalMinutes(-13);
	tim-=TTimeIntervalHours(-337);
	tim-=TTimeIntervalDays(1010);
	tim-=TTimeIntervalMonths(-150);
	tim-=TTimeIntervalYears(337);
	tim+=TTimeIntervalYears(337);
	tim+=TTimeIntervalMonths(-150);
	tim+=TTimeIntervalDays(1010);
	tim+=TTimeIntervalHours(-337);
	tim+=TTimeIntervalMinutes(-13);
	tim+=TTimeIntervalSeconds(52);
	tim+=TTimeIntervalMicroSeconds(9999999);
	test (base==tim);

	tim=TDateTime(-50,EMarch,6,14,45,3,100);
	dateTime=tim.DateTime();
	test(dateTime.Year()==-50);
	test(dateTime.Month()==EMarch);
	test(dateTime.Day()==6);
	test(dateTime.Hour()==14);
	test(dateTime.Minute()==45);
	test(dateTime.Second()==3);
	test(dateTime.MicroSecond()==100);

	tim=TDateTime(-241,EJanuary,0,0,0,0,0);
	tim-=TTimeIntervalMicroSeconds(1);
	dateTime=tim.DateTime();
	test(dateTime.Year()==-242);
	test(dateTime.Month()==EDecember);
	test(dateTime.Day()==30);
	test(dateTime.Hour()==23);
	test(dateTime.Minute()==59);
	test(dateTime.Second()==59);
	test(dateTime.MicroSecond()==999999);

	tim=Time::MaxTTime();
	dateTime=tim.DateTime();
	tim=dateTime;
	test(tim==Time::MaxTTime());

	tim=Time::MinTTime();
	dateTime=tim.DateTime();
	tim=dateTime;
	test(tim==Time::MinTTime());
	}

void TestTTime::Test8()
//
// Test TTime's date property functions
// this implicitly tests Time's date property functions.
//
	{
	test.Next(_L("Thorough Test with 4 day week rule"));

	TInt year=4;
	TMonth month=EJanuary;
	TInt day=30;
	TInt hour=0;
	TInt minute=0;
	TInt second=0;
	TInt microSecond=0;
	TDateTime dateTime(year,month,day,hour,minute,second,microSecond);
	TTime tim(dateTime);			

	test(tim.DayNoInWeek()==0);
	test(tim.DayNoInYear()==31);
	test(tim.WeekNoInYear()==5);

	dateTime.SetDay(29);
	tim=dateTime;
	test(tim.DayNoInWeek()==6);
	test(tim.DayNoInYear()==30);
	test(tim.WeekNoInYear()==4);

	dateTime.SetMonth(EJanuary);
	dateTime.SetDay(0);
    TInt y;
	for (y=1990;y<2020;y++)
		{
		dateTime.SetYear(y);
		tim=dateTime;
		test(tim.DayNoInYear()==1);
		TInt r=tim.WeekNoInYear();
		if (tim.DayNoInWeek()<=3)
			test(r==1);
		else
			test(r==52 || r==53);
		}

	dateTime.SetMonth(EDecember);
	dateTime.SetDay(30);
    TInt m(0);
    TInt d(0);
    TInt dn(0);
    TInt wkn(0);
    TInt wk(0);
    for (y=1900;y<1921;y++)          // MUST BEGIN 0N 1900 (been run to 2500)
		{
        dateTime.SetYear(y);
        for (m=0;m<12;m++)
            {
            dateTime.SetMonth(TMonth(m));
            for (d=0;d<Time::DaysInMonth(y,TMonth(m));d++)
                {
                dateTime.SetDay(d);
           		tim=dateTime;
                wk=tim.WeekNoInYear();
                dn++;
                if (dn>6)
                dn=0;
                if (dn==1)
                    {
                    wkn++;
                    if((m==11 && d>=28) | (m==0 && d<=3))
                    wkn=1;
                    }
              	test(wkn==wk);
                }
            dateTime.SetDay(0);
            }
        }

	test.Next(_L("Testing wk53 in a year with 4 days in last week"));
	dateTime.SetYear(2009);
	dateTime.SetMonth(EDecember);
	dateTime.SetDay(27); // 28th, day is 0-based
	dateTime.SetHour(8); // Ensure the remaining days are 3.somefraction to test rounding
	tim=dateTime;
	test(tim.DayNoInWeek()==0);
	test(tim.DayNoInMonth()==27);
	test(tim.DayNoInYear()==362);
	test(tim.WeekNoInYear()==53);
	dateTime.SetYear(2010);
	dateTime.SetMonth(EJanuary);
	dateTime.SetDay(3); // 4th, day is 0-based
	tim=dateTime;
	test(tim.DayNoInWeek()==0);
	test(tim.DayNoInMonth()==3);
	test(tim.DayNoInYear()==4);
	test(tim.WeekNoInYear()==1);
	dateTime.SetHour(0);

    test.Next(_L("Testing other week no. rules"));
	dateTime.SetYear(1995);
	dateTime.SetDay(14);
	dateTime.SetMonth(ENovember);
	tim=dateTime;
	test(tim.DayNoInWeek()==2);
	test(tim.DayNoInYear()==319);
	test(tim.WeekNoInYear()==46);

// Different First Week rules
	test.Next(_L("Test week no in year by different rules"));
	test(tim.WeekNoInYear(EFirstFullWeek)==46);
	test(tim.WeekNoInYear(EFirstWeek)==47);
	test(tim.WeekNoInYear(EFirstFourDayWeek)==46);

	dateTime.SetYear(1997);
	dateTime.SetMonth(EJanuary);
	dateTime.SetDay(6);
	tim=dateTime;
	test(tim.WeekNoInYear()==2);
	test(tim.WeekNoInYear(EFirstFullWeek)==1);
	test(tim.WeekNoInYear(EFirstWeek)==2);
	test(tim.WeekNoInYear(EFirstFourDayWeek)==2);


	dateTime.SetYear(1999);
	tim=dateTime;
	test(tim.WeekNoInYear()==1);
	test(tim.WeekNoInYear(EFirstFullWeek)==1);
	test(tim.WeekNoInYear(EFirstWeek)==2);
	test(tim.WeekNoInYear(EFirstFourDayWeek)==1);

// Year start dates different from jan 1st
	dateTime.SetYear(1995);
	dateTime.SetMonth(ENovember);
	dateTime.SetDay(14);
	TTime tim2(dateTime);  // cTime
	dateTime.SetMonth(EJune);
	tim=dateTime;	 //dTime

	test(tim2.DayNoInYear(tim)==154);
	test(tim2.WeekNoInYear(tim)==23);
	test(tim2.WeekNoInYear(tim,EFirstFullWeek)==22);
	test(tim.DayNoInYear(tim2)==213);
	test(tim.WeekNoInYear(tim2)==31);
	test(tim.WeekNoInYear(tim2,EFirstFullWeek)==30);

	dateTime.SetYear(1999);
	dateTime.SetMonth(EJanuary);
	dateTime.SetDay(6);
	tim2=dateTime;
	test(tim2.WeekNoInYear(tim,EFirstFullWeek)==30);
	test(tim2.WeekNoInYear(tim,EFirstWeek)==30);
	test(tim2.WeekNoInYear(tim,EFirstFourDayWeek)==30);

    dateTime.SetYear(1904);
	dateTime.SetMonth(EFebruary);
	dateTime.SetDay(28);
    tim=dateTime;
    dateTime.SetYear(1955);
    dateTime.SetMonth(EJanuary);
    tim2=dateTime;
    test(tim2.WeekNoInYear(tim,EFirstFullWeek)==48);
    test(tim2.WeekNoInYear(tim,EFirstWeek)==49);
    test(tim2.WeekNoInYear(tim,EFirstFourDayWeek)==48);
    dateTime.SetMonth(EMarch);
    tim2=dateTime;
    test(tim2.WeekNoInYear(tim,EFirstFourDayWeek)==5);
    test(tim2.WeekNoInYear(tim,EFirstFullWeek)==5);
    dateTime.SetYear(1994);
    dateTime.SetMonth(EMarch);
    dateTime.SetDay(0);
    dateTime.SetHour(12);
    tim2=dateTime;
    test(tim2.WeekNoInYear(tim,EFirstFullWeek)==1);
    test(tim2.WeekNoInYear(tim,EFirstWeek)==1);
    test(tim2.WeekNoInYear(tim,EFirstFourDayWeek)==1);
    dateTime.SetYear(1991);
    dateTime.SetMonth(EMarch);
    dateTime.SetDay(0);
    dateTime.SetHour(12);
    tim2=dateTime;
    test(tim2.WeekNoInYear(tim,EFirstFullWeek)==52);
    test(tim2.WeekNoInYear(tim,EFirstWeek)==1);
    test(tim2.WeekNoInYear(tim,EFirstFourDayWeek)==1);
    }


void TestTTime::Test9()
//
// string handling
//
	{
	TInt lyear =1993;
	TInt lmonth =6;
	TInt lday	=3;
	TInt lhour	=13;
	TInt lminute =53;
	TInt lsecond =20;
	TInt lmicroSecond =12345;
	TDateTime aDate(lyear,TMonth(lmonth),lday,lhour,lminute,lsecond,lmicroSecond);
	test.Next(_L("Different DateFormats"));
	TTime aTime(aDate);
	TBuf<0x80> testString;
	TDateTime aDateTime=aTime.DateTime();
    aDateTime.Month();
	aTime.FormatL(testString,(_L("%E")));
	if (testString.Compare(_L("Sunday")))
		test.Panic(_L("%%E"));
	aTime.FormatL(testString,(_L("%*E")));
	if (testString.Compare(_L("Sun")))
		test.Panic(_L("%%*E"));
	TLocale local;
	local.SetDateFormat(EDateEuropean);
	local.Set();
	aTime.FormatL(testString,(_L("%D%M%Y%/0%1%/1%2%/2%3%/3"))); 
	if (testString.Compare(_L("04/07/1993")))
		test.Panic(_L("%%D%%M%%Y"));
	local.SetDateFormat(EDateAmerican);
	local.Set();
	aTime.FormatL(testString,(_L("%*D%X%N%Y%1 %2 '%*3")));
	if (testString.Compare(_L("July 4th '93")))
		test.Panic(_L("%%*D%%X%%N'%%*Y, American"));
	local.SetDateFormat(EDateJapanese);
	local.Set();
	aTime.FormatL(testString,(_L("%*D%*N%4 %5")));
	if (testString.Compare(_L("Jul 4")))
		test.Panic(_L("%%*D%%*N, Japanese"));
	aTime.FormatL(testString,(_L("%F%Y %D%X %N"))); 
	if (testString.Compare(_L("1993 04th July")))
		test.Panic(_L("%%F%%Y %%D%%X %%N"));
	test.Next(_L("Times"));
	aTime.FormatL(testString,(_L("%*I%:1%T%A")));
	if (testString.Compare(_L("1:53 pm")))
		test.Panic(_L("%%*I%%:1%%T%%A"));
	local.SetAmPmSymbolPosition(ELocaleBefore);
	local.Set();
	aTime.FormatL(testString,(_L("%*I%:1%T%A")));
	if (testString.Compare(_L("1:53pm ")))
		test.Panic(_L("%%*I%%:1%%T%%A Bef"));
	local.SetAmPmSpaceBetween(EFalse);
	local.Set();
	aTime.FormatL(testString,(_L("%*I%:1%T%A")));
	if (testString.Compare(_L("1:53pm")))
		test.Panic(_L("%%*I%%:1%%T%%A Bef NoSp"));
	local.SetAmPmSymbolPosition(ELocaleAfter);
	local.Set();
	aTime.FormatL(testString,(_L("%*I%:1%T%A")));
	if (testString.Compare(_L("1:53pm")))
		test.Panic(_L("%%*I%%:1%%T%%A NoSp"));

	aTime.FormatL(testString,(_L("%-A%*I%:1%T%+A")));
	if (testString.Compare(_L("1:53pm")))
		test.Panic(_L("%%-A%%*I%%:1%%T%%+A NoSp"));
	local.SetAmPmSymbolPosition(ELocaleBefore);
	local.Set();
	aTime.FormatL(testString,(_L("%-A%*I%:1%T%+A")));
	if (testString.Compare(_L("pm1:53")))
		test.Panic(_L("%%-A%%*I%%:1%%T%%+A Bef NoSp"));
	local.SetAmPmSpaceBetween(ETrue);
	local.Set();
	aTime.FormatL(testString,(_L("%-A%*I%:1%T%+A")));
	if (testString.Compare(_L("pm 1:53")))
		test.Panic(_L("%%-A%%*I%%:1%%T%%+A Bef"));
	local.SetAmPmSymbolPosition(ELocaleAfter);
	local.Set();
	aTime.FormatL(testString,(_L("%-A%*I%:1%T%+A")));
	if (testString.Compare(_L("1:53 pm")))
		test.Panic(_L("%%-A%%*I%%:1%%T%%+A"));

	aTime.FormatL(testString,(_L("%:0%H%:1%T%:2%S%.%C%:3"))); 
	if (testString.Compare(_L("13:53:20.012345")))
		test.Panic(_L("%%:0%%H%%:1%%T%%:2%%S%%.%%C%%:3 1"));
	local.SetDecimalSeparator(',');
	local.Set();
	aTime.FormatL(testString,(_L("%:0%H%:1%T%:2%S%.%C%:3"))); 
	if (testString.Compare(_L("13:53:20,012345")))
		test.Panic(_L("%%:0%%H%%:1%%T%%:2%%S%%.%%C%%:3 2"));
	local.SetDecimalSeparator('.');
	local.Set();

	aTime.FormatL(testString,(_L("%T%:2%S%.%*C0"))); 
	if (testString.Compare(_L("53:20.")))
		test.Panic(_L("%%T%%:2%%S.%%*C0"));
	aTime.FormatL(testString,(_L("%S%.%*C1"))); 
	if (testString.Compare(_L("20.0")))
		test.Panic(_L("%%S.%%*C1"));
	aTime.FormatL(testString,(_L(".%*C3"))); 
	if (testString.Compare(_L(".012")))
		test.Panic(_L(".%%*C3"));
	aTime.FormatL(testString,(_L("%*C6"))); 
	if (testString.Compare(_L("012345")))
		test.Panic(_L("%%*C6"));
	aTime.FormatL(testString,(_L(".%*CZTest"))); 
	if (testString.Compare(_L(".012345Test")))
		test.Panic(_L("%%*C6"));
	aTime.FormatL(testString,(_L("%J%:1%T%B")));
	if (testString.Compare(_L("1:53 pm")))
		test.Panic(_L("%%J%%:1%%T%%B"));
	aTime.FormatL(testString,(_L("%J%:1%T%*B")));
	if (testString.Compare(_L("1:53pm")))
		test.Panic(_L("%%J%%:1%%T%%*B"));
	local.SetTimeFormat(ETime24);
	local.Set();
	aTime.FormatL(testString,(_L("%J%:1%T%B")));
	if (testString.Compare(_L("13:53")))
		test.Panic(_L("%%J%%:1%%T%%B, ETime24"));
	aTime.FormatL(testString,(_L("%J%:1%T%*B")));
	if (testString.Compare(_L("13:53")))
		test.Panic(_L("%%J%%:1%%T%%*B, ETime24"));
	test.Next(_L("Miscellaneous"));
	aTime.FormatL(testString,(_L("%W")));
	if (testString.Compare(_L("26")))
		test.Panic(_L("%%W"));
	aTime.FormatL(testString,(_L("%*Z")));
	if (testString.Compare(_L("185")))
		test.Panic(_L("%%*Z"));
	test.Next(_L("Junk strings"));
	aTime.FormatL(testString,(_L("%F %M%O%N%D%A%Y")));
	if (testString.Compare(_L(" 07OJuly04 pm1993")))
		test.Panic(_L(" MONDAY"));
	aTime.FormatL(testString,(_L("%*D%X %N '%*Y")));
	if (testString.Compare(_L("  '")))
		test.Panic(_L("  '"));
	aTime.FormatL(testString,(_L("%G%K%L%O%P%Q%R%U%V%%")));
	if (testString.Compare(_L("GKLOPQRUV%")))
		test.Panic(_L("GKLOPQRUV%%"));
	aDate.Set(1993,TMonth(6),3,0,0,0,0);
	aTime=aDate;
	aTime.FormatL(testString,(_L("%*I%:1%T%A")));
	if (testString.Compare(_L("12:00 am")))
		test.Panic(_L("testDate->time"));
	aTime.FormatL(testString,(_L("%*I%:1%T%*A")));
	if (testString.Compare(_L("12:00am")))
		test.Panic(_L("testDate->time 2"));
	aTime.FormatL(testString,(_L("unformatted string")));  // test added 25/08/95
	if (testString.Compare(_L("unformatted string")))		
		test.Panic(_L("unformatted string"));
	TBuf<8> buf;
	TRAPD(r,aTime.FormatL(buf,_L("%F %M%O%N%D%A%Y")));
	test(r==KErrOverflow);
	TRAP(r,aTime.FormatL(buf,_L("qwertyuiop")));
	test(r==KErrOverflow);
	TRAP(r,aTime.FormatL(testString,_L("%:4")));
	test(r==KErrGeneral);
 	TRAP(r,aTime.FormatL(testString,_L("%/4")));
	test(r==KErrGeneral);
 	TRAP(r,aTime.FormatL(testString,_L("%:/")));
	test(r==KErrGeneral);
 	TRAP(r,aTime.FormatL(testString,_L("%//")));
	test(r==KErrGeneral);
 	TRAP(r,aTime.FormatL(testString,_L("%:z")));
	test(r==KErrGeneral);
 	TRAP(r,aTime.FormatL(testString,_L("%/z")));
	test(r==KErrGeneral);
 	TRAP(r,aTime.FormatL(testString,_L("%: ")));
	test(r==KErrGeneral);
 	TRAP(r,aTime.FormatL(testString,_L("%/ ")));
	test(r==KErrGeneral);
 	TRAP(r,aTime.FormatL(testString,_L("%- ")));
	test(r==KErrGeneral);
 	TRAP(r,aTime.FormatL(testString,_L("%+ ")));
	test(r==KErrGeneral);

	// HA - 258
	aTime.Set(_L("19991231:000000.0000"));
	local.SetTimeFormat(ETime24);
	local.Set();
	aTime.FormatL(testString, _L("%*J%BX"));
	test(testString==_L("0X"));
	local.SetTimeFormat(ETime12);
	local.Set();
	aTime.FormatL(testString, _L("%*J%BX"));
	test(testString==_L("12 amX"));
	aTime.FormatL(testString, _L("%IX"));
	test(testString==_L("12X"));
	aTime.FormatL(testString, _L("%HX"));
	test(testString==_L("00X"));

	//Reset so it can be run twice
	local.SetDateFormat(EDateEuropean);
	local.SetTimeFormat(ETime12);
	local.Set();

	// Test for overload of TTime::FormatL(TDes& aDes,const TDesC& aFormat,const TLocale& aLocale);
	// Reset Time and dates
	aDate.Set(lyear,TMonth(lmonth),lday,lhour,lminute,lsecond,lmicroSecond);
	test.Next(_L("Different DateFormats with specified locale"));
	TTime aTimeLocale(aDate);

	local.SetDateFormat(EDateAmerican);
	aTimeLocale.FormatL(testString,(_L("%*D%X%N%Y%1 %2 '%*3")),local);
	if (testString.Compare(_L("July 4th '93")))
		test.Panic(_L("%%*D%%X%%N'%%*Y, American"));
	local.SetDateFormat(EDateJapanese);
	aTimeLocale.FormatL(testString,(_L("%*D%*N%4 %5")),local);
	if (testString.Compare(_L("Jul 4")))
		test.Panic(_L("%%*D%%*N, Japanese"));
	aTimeLocale.FormatL(testString,(_L("%F%Y %D%X %N")),local); 
	if (testString.Compare(_L("1993 04th July")))
		test.Panic(_L("%%F%%Y %%D%%X %%N"));

	test.Next(_L("Times with specified locale"));
	aTimeLocale.FormatL(testString,(_L("%*I%:1%T%A")),local);
	if (testString.Compare(_L("1:53 pm")))
		test.Panic(_L("%%*I%%:1%%T%%A"));
	local.SetAmPmSymbolPosition(ELocaleBefore);
	aTimeLocale.FormatL(testString,(_L("%*I%:1%T%A")),local);
	if (testString.Compare(_L("1:53pm ")))
		test.Panic(_L("%%*I%%:1%%T%%A Bef"));
	local.SetAmPmSpaceBetween(EFalse);
	aTimeLocale.FormatL(testString,(_L("%*I%:1%T%A")),local);
	if (testString.Compare(_L("1:53pm")))
		test.Panic(_L("%%*I%%:1%%T%%A Bef NoSp"));
	local.SetAmPmSymbolPosition(ELocaleAfter);
	aTimeLocale.FormatL(testString,(_L("%*I%:1%T%A")),local);
	if (testString.Compare(_L("1:53pm")))
		test.Panic(_L("%%*I%%:1%%T%%A NoSp"));
	aTimeLocale.FormatL(testString,(_L("%-A%*I%:1%T%+A")),local);
	if (testString.Compare(_L("1:53pm")))
		test.Panic(_L("%%-A%%*I%%:1%%T%%+A NoSp"));
	local.SetAmPmSymbolPosition(ELocaleBefore);
	aTimeLocale.FormatL(testString,(_L("%-A%*I%:1%T%+A")),local);
	if (testString.Compare(_L("pm1:53")))
		test.Panic(_L("%%-A%%*I%%:1%%T%%+A Bef NoSp"));
	local.SetAmPmSpaceBetween(ETrue);
	aTimeLocale.FormatL(testString,(_L("%-A%*I%:1%T%+A")),local);
	if (testString.Compare(_L("pm 1:53")))
		test.Panic(_L("%%-A%%*I%%:1%%T%%+A Bef"));
	local.SetAmPmSymbolPosition(ELocaleAfter);
	aTimeLocale.FormatL(testString,(_L("%-A%*I%:1%T%+A")),local);
	if (testString.Compare(_L("1:53 pm")))
		test.Panic(_L("%%-A%%*I%%:1%%T%%+A"));
	aTimeLocale.FormatL(testString,(_L("%:0%H%:1%T%:2%S%.%C%:3")),local); 
	if (testString.Compare(_L("13:53:20.012345")))
		test.Panic(_L("%%:0%%H%%:1%%T%%:2%%S%%.%%C%%:3 1"));
	local.SetDecimalSeparator(',');
	aTimeLocale.FormatL(testString,(_L("%:0%H%:1%T%:2%S%.%C%:3")),local); 
	if (testString.Compare(_L("13:53:20,012345")))
		test.Panic(_L("%%:0%%H%%:1%%T%%:2%%S%%.%%C%%:3 2"));
	local.SetDecimalSeparator('.');
	aTimeLocale.FormatL(testString,(_L("%T%:2%S%.%*C0")),local); 
	if (testString.Compare(_L("53:20.")))
		test.Panic(_L("%%T%%:2%%S.%%*C0"));
	aTimeLocale.FormatL(testString,(_L("%S%.%*C1")),local); 
	if (testString.Compare(_L("20.0")))
		test.Panic(_L("%%S.%%*C1"));
	aTimeLocale.FormatL(testString,(_L(".%*C3")),local); 
	if (testString.Compare(_L(".012")))
		test.Panic(_L(".%%*C3"));
	aTimeLocale.FormatL(testString,(_L("%*C6")),local); 
	if (testString.Compare(_L("012345")))
		test.Panic(_L("%%*C6"));
	aTimeLocale.FormatL(testString,(_L(".%*CZTest")),local); 
	if (testString.Compare(_L(".012345Test")))
		test.Panic(_L("%%*C6"));
	aTimeLocale.FormatL(testString,(_L("%J%:1%T%B")),local);
	if (testString.Compare(_L("1:53 pm")))
		test.Panic(_L("%%J%%:1%%T%%B"));
	aTimeLocale.FormatL(testString,(_L("%J%:1%T%*B")),local);
	if (testString.Compare(_L("1:53pm")))
		test.Panic(_L("%%J%%:1%%T%%*B"));
	local.SetTimeFormat(ETime24);
	aTimeLocale.FormatL(testString,(_L("%J%:1%T%B")),local);
	if (testString.Compare(_L("13:53")))
		test.Panic(_L("%%J%%:1%%T%%B, ETime24"));
	aTimeLocale.FormatL(testString,(_L("%J%:1%T%*B")),local);
	if (testString.Compare(_L("13:53")))
		test.Panic(_L("%%J%%:1%%T%%*B, ETime24"));

	test.Next(_L("Miscellaneous with specified locale"));
	aTimeLocale.FormatL(testString,(_L("%W")),local);
	if (testString.Compare(_L("26")))
		test.Panic(_L("%%W"));
	aTimeLocale.FormatL(testString,(_L("%*Z")),local);
	if (testString.Compare(_L("185")))
		test.Panic(_L("%%*Z"));

	test.Next(_L("Junk strings with specified locale"));
	aTimeLocale.FormatL(testString,(_L("%F %M%O%N%D%A%Y")),local);
	if (testString.Compare(_L(" 07OJuly04 pm1993")))
		test.Panic(_L(" MONDAY"));
	aTimeLocale.FormatL(testString,(_L("%*D%X %N '%*Y")),local);
	if (testString.Compare(_L("  '")))
		test.Panic(_L("  '"));
	aTimeLocale.FormatL(testString,(_L("%G%K%L%O%P%Q%R%U%V%%")),local);
	if (testString.Compare(_L("GKLOPQRUV%")))
		test.Panic(_L("GKLOPQRUV%%"));
	aDate.Set(1993,TMonth(6),3,0,0,0,0);
	aTimeLocale=aDate;
	aTimeLocale.FormatL(testString,(_L("%*I%:1%T%A")),local);
	if (testString.Compare(_L("12:00 am")))
		test.Panic(_L("testDate->time"));
	aTimeLocale.FormatL(testString,(_L("%*I%:1%T%*A")),local);
	if (testString.Compare(_L("12:00am")))
		test.Panic(_L("testDate->time 2"));
	aTimeLocale.FormatL(testString,(_L("unformatted string")),local);  // test added 25/08/95
	if (testString.Compare(_L("unformatted string")))		
		test.Panic(_L("unformatted string"));
	TRAP(r,aTimeLocale.FormatL(buf,_L("%F %M%O%N%D%A%Y"),local));
	test(r==KErrOverflow);
	TRAP(r,aTimeLocale.FormatL(buf,_L("qwertyuiop"),local));
	test(r==KErrOverflow);
	TRAP(r,aTimeLocale.FormatL(testString,_L("%:4"),local));
	test(r==KErrGeneral);
 	TRAP(r,aTimeLocale.FormatL(testString,_L("%/4"),local));
	test(r==KErrGeneral);
 	TRAP(r,aTimeLocale.FormatL(testString,_L("%:/"),local));
	test(r==KErrGeneral);
 	TRAP(r,aTimeLocale.FormatL(testString,_L("%//"),local));
	test(r==KErrGeneral);
 	TRAP(r,aTimeLocale.FormatL(testString,_L("%:z"),local));
	test(r==KErrGeneral);
 	TRAP(r,aTimeLocale.FormatL(testString,_L("%/z"),local));
	test(r==KErrGeneral);
 	TRAP(r,aTimeLocale.FormatL(testString,_L("%: "),local));
	test(r==KErrGeneral);
 	TRAP(r,aTimeLocale.FormatL(testString,_L("%/ "),local));
	test(r==KErrGeneral);
 	TRAP(r,aTimeLocale.FormatL(testString,_L("%- "),local));
	test(r==KErrGeneral);
 	TRAP(r,aTimeLocale.FormatL(testString,_L("%+ "),local));
	test(r==KErrGeneral);
	aTimeLocale.Set(_L("19991231:000000.0000"));
	local.SetTimeFormat(ETime24);
	aTimeLocale.FormatL(testString, _L("%*J%BX"),local);
	test(testString==_L("0X"));
	local.SetTimeFormat(ETime12);
	aTimeLocale.FormatL(testString, _L("%*J%BX"),local);
	test(testString==_L("12 amX"));
	aTimeLocale.FormatL(testString, _L("%IX"),local);
	test(testString==_L("12X"));
	aTimeLocale.FormatL(testString, _L("%HX"),local);
	test(testString==_L("00X"));	
	}


void TestTTime::Test10()
//
// The Time functions that aren't called/tested above.
//
	{
	test.Next(_L("IsLeapYear()"));
	TDateTime date;
	date.Set(1200,EFebruary,28,13,58,59,245322);
	test(date.SetYear(1980)==KErrNone);
	TBool isLeap = Time::IsLeapYear(1580);
	TInt noUpTo = Time::LeapYearsUpTo(1580);
	test(isLeap==1);
	test(noUpTo==395); 
	isLeap = Time::IsLeapYear(1750);
	noUpTo = Time::LeapYearsUpTo(1750);
	test(isLeap==0);
	test(noUpTo==437); 
	isLeap = Time::IsLeapYear(1980);
	noUpTo = Time::LeapYearsUpTo(1980);  
	test(isLeap==1);
	test(noUpTo==492); 
	isLeap = Time::IsLeapYear(2000);
	noUpTo = Time::LeapYearsUpTo(2000);  
	test(isLeap==1);
	test(noUpTo==497); 
	isLeap = Time::IsLeapYear(25000);
	noUpTo = Time::LeapYearsUpTo(25000);  
	test(isLeap==0);
	test(noUpTo==6075);

	test.Next(_L("TTime::RoundUpToNextMinute()"));
	TTime time;
	time.RoundUpToNextMinute();
	TDateTime dateTime=time.DateTime();
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==0);

	TDateTime dateTime2(2004,EFebruary,28,12,48,59,999999);
	time=dateTime2;
	time.RoundUpToNextMinute();
	dateTime=time.DateTime();
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==0);
	test(dateTime.Minute()==dateTime2.Minute()+1);
	test(dateTime.Hour()==dateTime2.Hour());
	test(dateTime.Day()==dateTime2.Day());
	test(dateTime.Month()==dateTime2.Month());
	test(dateTime.Year()==dateTime2.Year());

	dateTime2.Set(2004,EFebruary,28,12,48,0,0);
	time=dateTime2;
	time.RoundUpToNextMinute();
	dateTime=time.DateTime();
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==0);
	test(dateTime.MicroSecond()==dateTime2.MicroSecond());
	test(dateTime.Second()==dateTime2.Second());
	test(dateTime.Minute()==dateTime2.Minute());
	test(dateTime.Hour()==dateTime2.Hour());
	test(dateTime.Day()==dateTime2.Day());
	test(dateTime.Month()==dateTime2.Month());
	test(dateTime.Year()==dateTime2.Year());

	dateTime2.Set(2004,EFebruary,28,12,48,0,1);
	time=dateTime2;
	time.RoundUpToNextMinute();
	dateTime=time.DateTime();
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==0);
	test(dateTime.Minute()==dateTime2.Minute()+1);
	test(dateTime.Hour()==dateTime2.Hour());
	test(dateTime.Day()==dateTime2.Day());
	test(dateTime.Month()==dateTime2.Month());
	test(dateTime.Year()==dateTime2.Year());

	dateTime2.Set(2037,EDecember,30,23,59,1,45341);
	time=dateTime2;
	time.RoundUpToNextMinute();
	dateTime=time.DateTime();
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==0);
	test(dateTime.Minute()==0);
	test(dateTime.Hour()==0);
	test(dateTime.Day()==0);
	test(dateTime.Month()==EJanuary);
	test(dateTime.Year()==dateTime2.Year()+1);

	test.Next(_L("HomeTime and UniversalTime"));
	time.HomeTime();
	dateTime=time.DateTime();
	test.Printf(_L("     Local Time is - %+02d/%+02d/%+04d %+02d:%+02d:%+02d.%+06d\n"),dateTime.Day()+1,dateTime.Month()+1,dateTime.Year(),dateTime.Hour(),dateTime.Minute(),dateTime.Second(),dateTime.MicroSecond());
	time.UniversalTime();
	dateTime=time.DateTime();
	test.Printf(_L(" Universal Time is - %+02d/%+02d/%+04d %+02d:%+02d:%+02d.%+06d\n"),dateTime.Day()+1,dateTime.Month()+1,dateTime.Year(),dateTime.Hour(),dateTime.Minute(),dateTime.Second(),dateTime.MicroSecond());

	test.Next(_L("SetUTCTime"));
	time.UniversalTime();
	time+=TTimeIntervalMinutes(30);
	TInt r=User::SetUTCTime(time);
	test(r==KErrNone);
	time.HomeTime();
	dateTime=time.DateTime();
	test.Printf(_L("     Local Time is - %+02d/%+02d/%+04d %+02d:%+02d:%+02d.%+06d\n"),dateTime.Day()+1,dateTime.Month()+1,dateTime.Year(),dateTime.Hour(),dateTime.Minute(),dateTime.Second(),dateTime.MicroSecond());
	time.UniversalTime();
	dateTime=time.DateTime();
	test.Printf(_L(" Universal Time is - %+02d/%+02d/%+04d %+02d:%+02d:%+02d.%+06d\n"),dateTime.Day()+1,dateTime.Month()+1,dateTime.Year(),dateTime.Hour(),dateTime.Minute(),dateTime.Second(),dateTime.MicroSecond());

	r=User::SetUTCTime(TTime(TDateTime(2090,EJanuary,0,0,0,0,0)));
//#if defined (__MARM__)
	test(r==KErrOverflow);
//#else
//	test(r==KErrNone);
//	time.HomeTime();
//	test(time.DateTime().Second()==0);
//	test(time.DateTime().Minute()==0);
//	test(time.DateTime().Day()==0);
//	test(time.DateTime().Month()==EJanuary);
//	test(time.DateTime().Year()==2090);
//	test(time.DateTime().Hour()==0);
//#endif

	time.UniversalTime();
	time-=TTimeIntervalMinutes(30);
	r=User::SetUTCTime(time);
	test(r==KErrNone);
	time.HomeTime();
	dateTime=time.DateTime();
	test.Printf(_L("     Local Time is - %+02d/%+02d/%+04d %+02d:%+02d:%+02d.%+06d\n"),dateTime.Day()+1,dateTime.Month()+1,dateTime.Year(),dateTime.Hour(),dateTime.Minute(),dateTime.Second(),dateTime.MicroSecond());
	time.UniversalTime();
	dateTime=time.DateTime();
	test.Printf(_L(" Universal Time is - %+02d/%+02d/%+04d %+02d:%+02d:%+02d.%+06d\n"),dateTime.Day()+1,dateTime.Month()+1,dateTime.Year(),dateTime.Hour(),dateTime.Minute(),dateTime.Second(),dateTime.MicroSecond());
	test.Printf(_L("does this come out"));
	}

void TestTTime::Test11()
//
//
//
	{
	TTime now;
	now.UniversalTime();
	TTimeIntervalSeconds offset;
	offset = User::UTCOffset();
	RTimer timer[5];
	TRequestStatus stat[5];

	test.Start(_L("Create timers"));
	TInt i;
	for (i=0; i<5; i++)
		test(timer[i].CreateLocal()==KErrNone);

	test.Next(_L("Change the time"));
	TInt r=User::SetUTCTime(now-TTimeIntervalMinutes(120));
	test_Equal(r, KErrNone);

	test.Next(_L("Start an absolute timer"));
	timer[0].AtUTC(stat[0], now+TTimeIntervalMinutes(60));
	test.Next(_L("Change the system time"));
	r=User::SetUTCTime(now-TTimeIntervalMinutes(120));
 	test(r==KErrNone);
	User::WaitForRequest(stat[0]);
	test.Next(_L("Test timer aborted"));
	test(stat[0]==KErrAbort);

	test.Next(_L("Set UTC offset to zero"));
	User::SetUTCOffset(0);
	test.Next(_L("Start an absolute timer"));
	timer[0].AtUTC(stat[0], now+TTimeIntervalMinutes(120));
	test.Next(_L("Change the UTC offset to +1 hour"));
	User::SetUTCOffset(3600);
	User::WaitForRequest(stat[0]);
	test.Next(_L("Test timer aborted"));
	test(stat[0]==KErrAbort);
	test.Next(_L("Start another absolute timer"));
	timer[0].AtUTC(stat[0], now+TTimeIntervalMinutes(120));
	test.Next(_L("Re-set the UTC offset to +1 hour"));
	User::SetUTCOffset(3600);
	test.Next(_L("Test timer NOT aborted (no actual time change)"));
	test(stat[0]==KRequestPending);
	test.Next(_L("Cancel timer"));
	timer[0].Cancel();
	User::WaitForRequest(stat[0]);
	test(stat[0]==KErrCancel);

/*
//	This code fails intermitantly
	FOREVER
		{
		timer[0].AtUTC(stat[0], now+TTimeIntervalMinutes(60));
		test(stat[0]==KRequestPending);
		timer[1].AtUTC(stat[1], now+TTimeIntervalMinutes(30));
		test(stat[1]==KRequestPending);
		test.Next(_L("ABCDEFGHIJKLMNOPQRS D FD FDDFGDF ABCDEFGHIJ ABCDEFGHIJKGL"));
		timer[1].Cancel();
		timer[0].Cancel();
		User::WaitForRequest(stat[0]);
		User::WaitForRequest(stat[1]);
		test.Next(_L("ABCDEFGH"));
		test(stat[0]==KErrCancel);
		test(stat[1]==KErrCancel);
		}
*/

	test.Next(_L("Start 3 absolute timers and a relative timer"));
	timer[0].AtUTC(stat[0], now+TTimeIntervalMinutes(60));
	test_Equal(KRequestPending, stat[0].Int());
	timer[1].AtUTC(stat[1], now+TTimeIntervalMinutes(30));
	test_Equal(KRequestPending, stat[1].Int());
	timer[2].After(stat[2], 9000000);
	test_Equal(KRequestPending, stat[2].Int());
	timer[3].AtUTC(stat[3], now+TTimeIntervalMinutes(10));
	test_Equal(KRequestPending, stat[3].Int());
	TInt s=stat[2].Int();
	test.Next(_L("Change system time"));
	r=User::SetUTCTime(now-TTimeIntervalMinutes(100));
	test(r==KErrNone);
	User::WaitForRequest(stat[0]);
	User::WaitForRequest(stat[1]);
	User::WaitForRequest(stat[3]);
	test.Next(_L("Test absolute timers aborted"));
	test(stat[0]==KErrAbort);
	test(stat[1]==KErrAbort);
	test(stat[3]==KErrAbort);
	test(stat[2]==s);
	test.Next(_L("Cancel relative timer"));
	timer[2].Cancel();
	User::WaitForRequest(stat[2]);
	test(stat[2]==KErrCancel);

	test.Next(_L("Start 3 relative timers and 1 absolute timer"));
	timer[0].After(stat[0], 10000);
	timer[1].After(stat[1], 20000);
	timer[2].After(stat[2], 20100);
	timer[3].AtUTC(stat[3], now+TTimeIntervalMinutes(10));
	test.Next(_L("Wait for 1 relative timer to complete"));
	User::WaitForRequest(stat[0]);
	test(stat[0]==KErrNone);
	test.Next(_L("Change the time"));
	r=User::SetUTCTime(now-TTimeIntervalMinutes(100));
	test(r==KErrNone);
	User::WaitForRequest(stat[3]);
	test(stat[3]==KErrAbort);
	stat[3]=-999;
	test.Next(_L("Change the time again"));
	r=User::SetUTCTime(now-TTimeIntervalMinutes(110));
	test(r==KErrNone);
	test.Next(_L("Wait for other relative timers to complete"));
	User::WaitForRequest(stat[1]);
	User::WaitForRequest(stat[2]);
	test(stat[1]==KErrNone);
	test(stat[2]==KErrNone);
	test(stat[3]==-999);

	test.Next(_L("Start 2 absolute timers"));
	timer[0].AtUTC(stat[0], now+TTimeIntervalMinutes(60));
	timer[1].AtUTC(stat[1], now+TTimeIntervalMinutes(30));
	test.Next(_L("Cancel one"));
	timer[0].Cancel();
	User::WaitForRequest(stat[0]);
	test(stat[0]==KErrCancel);
	test.Next(_L("Change the time"));
	r=User::SetUTCTime(now-TTimeIntervalMinutes(110));
	test(r==KErrNone);
	User::WaitForRequest(stat[1]);
	test(stat[1]==KErrAbort);
	test(stat[0]==KErrCancel);

	// The platform may or may not support SecureTime, and even if it does,
	// it may not have a secure time set. So we start this test by making
	// sure that the NonSecureOffset is set (which may fail, if it's not
	// supported OR if it's already set); then read and write the secure
	// time, to make sure that it's supported and we have permission.
	User::SetUTCTime(now);
	HAL::Set(HAL::ETimeNonSecureOffset, 0);
	test.Next(_L("Test absolute timers with secure time change"));
	TTime securetime;
	if ((r = securetime.UniversalTimeSecure()) == KErrNone)
		r = User::SetUTCTimeSecure(securetime);
	if (r != KErrNone)
		{
		RDebug::Printf("WARNING: Secure clock change test skipped because secure time could not be changed!");
		}
	else
		{
		timer[0].AtUTC(stat[0], now+TTimeIntervalSeconds(5));
		r = User::SetUTCTimeSecure(securetime+TTimeIntervalSeconds(30));
		test_Equal(KErrNone, r);
		r = User::SetUTCTimeSecure(securetime-TTimeIntervalSeconds(30));
		test_Equal(KErrNone, r);
		// The absolute timer should not have been aborted by the secure time change,
		test_Equal(KRequestPending, stat[0].Int());

		// The outstanding absolute timer should complete before this new relative timer
		timer[1].After(stat[1], 20000000);
		User::WaitForRequest(stat[0], stat[1]);
		timer[1].Cancel();
		test_Equal(KErrNone, stat[0].Int());
		test_Equal(KErrCancel, stat[1].Int());
		User::SetUTCTimeSecure(securetime+TTimeIntervalSeconds(5));
		}

	test.Next(_L("Close the timers"));
	for (i=0; i<5; i++)
		timer[i].Close();

	r=User::SetUTCTimeAndOffset(now,offset);
	test(r==KErrNone);
	test.End();
	}

void TestTTime::Test12()
    {

    TInt err;
    TDateTime dateTime;
	test.Start(_L("Setting date using YYYYMMDD:HHMMSS.MMMMMM"));
    TTime now(_L("19960201:122341.1234"));
    dateTime=now.DateTime();
	test(dateTime.MicroSecond()==1234);
	test(dateTime.Second()==41);
	test(dateTime.Minute()==23);
	test(dateTime.Hour()==12);
	test(dateTime.Day()==1);
	test(dateTime.Month()==2);
	test(dateTime.Year()==1996);
	test.Next(_L("Setting date using YYYYMMDD:"));
    err=now.Set(_L("19901129:")); // Just set the date
    dateTime=now.DateTime();
    test(err==KErrNone);
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==0);
	test(dateTime.Minute()==0);
	test(dateTime.Hour()==0);
	test(dateTime.Day()==29);
	test(dateTime.Month()==11);
	test(dateTime.Year()==1990);
	test.Next(_L("Setting date using :HHMMSS."));
    err=now.Set(_L(":105614.")); // Just the time
    dateTime=now.DateTime();
    test(err==KErrNone);
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==14);
	test(dateTime.Minute()==56);
	test(dateTime.Hour()==10);
	test(dateTime.Day()==0);
	test(dateTime.Month()==0);
	test(dateTime.Year()==0);
	test.Next(_L("Setting date using .MMMMMM"));
    err=now.Set(_L(".999999")); // Just the microseconds
    dateTime=now.DateTime();
    test(err==KErrNone);
	test(dateTime.MicroSecond()==999999);
	test(dateTime.Second()==0);
	test(dateTime.Minute()==0);
	test(dateTime.Hour()==0);
	test(dateTime.Day()==0);
	test(dateTime.Month()==0);
	test(dateTime.Year()==0);
	test.Next(_L("Setting date using HHMMSS should fail"));
    err=now.Set(_L("104520")); // Invalid - no separator
    dateTime=now.DateTime();
    test(err==KErrGeneral);
	test(dateTime.MicroSecond()==999999);
	test(dateTime.Second()==0);
	test(dateTime.Minute()==0);
	test(dateTime.Hour()==0);
	test(dateTime.Day()==0);
	test(dateTime.Month()==0);
	test(dateTime.Year()==0);
	test.Next(_L("Setting date using :HHMMSS"));
    err=now.Set(_L(":054531")); // Set time with no dot
    dateTime=now.DateTime();
    test(err==KErrNone);
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==31);
	test(dateTime.Minute()==45);
	test(dateTime.Hour()==5);
	test(dateTime.Day()==0);
	test(dateTime.Month()==0);
	test(dateTime.Year()==0);
	test.Next(_L("Setting invalid date using YYYYMMSS:HHMMSS.MMMM"));
    err=now.Set(_L("19910130:023210.1234")); // invalid date
    dateTime=now.DateTime();
    test(err==KErrGeneral);
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==31);
	test(dateTime.Minute()==45);
	test(dateTime.Hour()==5);
	test(dateTime.Day()==0);
	test(dateTime.Month()==0);
	test(dateTime.Year()==0);
	test.Next(_L("Setting date using YYYYMMDD:.MMMM"));
    err=now.Set(_L("19960730:.123456")); // Set date and microseconds
    dateTime=now.DateTime();
    test(err==KErrNone);
	test(dateTime.MicroSecond()==123456);
	test(dateTime.Second()==0);
	test(dateTime.Minute()==0);
	test(dateTime.Hour()==0);
	test(dateTime.Day()==30);
	test(dateTime.Month()==7);
	test(dateTime.Year()==1996);
	test.Next(_L("Setting date using ."));
    err=now.Set(_L("."));
    dateTime=now.DateTime();
    test(err==KErrNone);
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==0);
	test(dateTime.Minute()==0);
	test(dateTime.Hour()==0);
	test(dateTime.Day()==0);
	test(dateTime.Month()==0);
	test(dateTime.Year()==0);
	test.Next(_L("Setting date using :."));
    err=now.Set(_L(":."));
    dateTime=now.DateTime();
    test(err==KErrNone);
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==0);
	test(dateTime.Minute()==0);
	test(dateTime.Hour()==0);
	test(dateTime.Day()==0);
	test(dateTime.Month()==0);
	test(dateTime.Year()==0);
	test.Next(_L("Setting date using :"));
    err=now.Set(_L(":"));
    dateTime=now.DateTime();
    test(err==KErrNone);
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==0);
	test(dateTime.Minute()==0);
	test(dateTime.Hour()==0);
	test(dateTime.Day()==0);
	test(dateTime.Month()==0);
	test(dateTime.Year()==0);
	test.Next(_L("Setting date using YYYYMMDD.HHMMSS:MMMM should fail"));
    err=now.Set(_L("19900101.105630:1234")); // Wrong way round
    dateTime=now.DateTime();
    test(err==KErrGeneral);
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==0);
	test(dateTime.Minute()==0);
	test(dateTime.Hour()==0);
	test(dateTime.Day()==0);
	test(dateTime.Month()==0);
	test(dateTime.Year()==0);
	test.Next(_L("Setting date using YYYYMMDD:HHMMSS.MMMMMMM should fail"));
    err=now.Set(_L("19900101:105630.1234567")); // Microseconds too long
    dateTime=now.DateTime();
    test(err==KErrGeneral);
	test(dateTime.MicroSecond()==0);
	test(dateTime.Second()==0);
	test(dateTime.Minute()==0);
	test(dateTime.Hour()==0);
	test(dateTime.Day()==0);
	test(dateTime.Month()==0);
	test(dateTime.Year()==0);
    test.End();
    }

struct TestInfo
	{
	TestInfo (TTime aTime,TInt aMicroSec,TInt aSec,TInt aMin,TInt aHour,TInt aDay,TInt aMonth,TInt aYear,TText* aDayString,TTime aNextMin)
		{
		iTime=aTime;
		iMicroSec=aMicroSec;
		iSec=aSec;
		iMin=aMin;
		iHour=aHour;
		iDay=aDay;
		iMonth=aMonth;
		iYear=aYear;
		iDayString=aDayString;
		iNextMin=aNextMin;
		}
	TTime iTime;
	TInt iMicroSec;
	TInt iSec;
	TInt iMin;
	TInt iHour;
	TInt iDay;
	TInt iMonth;
	TInt iYear;
	TText* iDayString;
	TTime iNextMin;
	};

const TestInfo KTestArray[]=
	{
	TestInfo(TTime(KDaysToMicroSeconds*31+1),1,0,0,0,0,EFebruary,0,(TText*)_S("!Thu!am!00!02!"),TTime(KDaysToMicroSeconds*31+60000000)),
	TestInfo(TTime(KDaysToMicroSeconds*31),0,0,0,0,0,EFebruary,0,(TText*)_S("!Thu!am!00!02!"),TTime(KDaysToMicroSeconds*31)),
	TestInfo(TTime(KDaysToMicroSeconds*31-1),999999,59,59,23,30,EJanuary,0,(TText*)_S("!Wed!pm!59!01!"),TTime(KDaysToMicroSeconds*31)),
	TestInfo(TTime(60000001),1,0,1,0,0,EJanuary,0,(TText*)_S("!Mon!am!01!01!"),TTime(120000000)),
	TestInfo(TTime(60000000),0,0,1,0,0,EJanuary,0,(TText*)_S("!Mon!am!01!01!"),TTime(60000000)),
	TestInfo(TTime(59999999),999999,59,0,0,0,EJanuary,0,(TText*)_S("!Mon!am!00!01!"),TTime(60000000)),
	TestInfo(TTime(1000001),1,1,0,0,0,EJanuary,0,(TText*)_S("!Mon!am!00!01!"),TTime(60000000)),
	TestInfo(TTime(1000000),0,1,0,0,0,EJanuary,0,(TText*)_S("!Mon!am!00!01!"),TTime(60000000)),
	TestInfo(TTime(999999),999999,0,0,0,0,EJanuary,0,(TText*)_S("!Mon!am!00!01!"),TTime(60000000)),
	TestInfo(TTime(1),1,0,0,0,0,EJanuary,0,(TText*)_S("!Mon!am!00!01!"),TTime(60000000)),
	TestInfo(TTime(0),0,0,0,0,0,EJanuary,0,(TText*)_S("!Mon!am!00!01!"),TTime(0)),
	TestInfo(TTime(-1),999999,59,59,23,30,EDecember,-1,(TText*)_S("!Sun!pm!59!12!"),TTime(0)),
	TestInfo(TTime(-1000000),0,59,59,23,30,EDecember,-1,(TText*)_S("!Sun!pm!59!12!"),TTime(0)),
	TestInfo(TTime(-999999),1,59,59,23,30,EDecember,-1,(TText*)_S("!Sun!pm!59!12!"),TTime(0)),
	TestInfo(TTime(-1000001),999999,58,59,23,30,EDecember,-1,(TText*)_S("!Sun!pm!59!12!"),TTime(0)),
	TestInfo(TTime(-60000000),0,0,59,23,30,EDecember,-1,(TText*)_S("!Sun!pm!59!12!"),TTime(-60000000)),
	TestInfo(TTime(-59999999),1,0,59,23,30,EDecember,-1,(TText*)_S("!Sun!pm!59!12!"),TTime(0)),
	TestInfo(TTime(-60000001),999999,59,58,23,30,EDecember,-1,(TText*)_S("!Sun!pm!58!12!"),TTime(-60000000)),
	TestInfo(TTime(-180000000),0,0,57,23,30,EDecember,-1,(TText*)_S("!Sun!pm!57!12!"),TTime(-180000000)),
	TestInfo(TTime(-179999999),1,0,57,23,30,EDecember,-1,(TText*)_S("!Sun!pm!57!12!"),TTime(-120000000)),
	TestInfo(TTime(-180000001),999999,59,56,23,30,EDecember,-1,(TText*)_S("!Sun!pm!56!12!"),TTime(-180000000)),
	TestInfo(TTime(-KDaysToMicroSeconds+1),1,0,0,0,30,EDecember,-1,(TText*)_S("!Sun!am!00!12!"),TTime(-KDaysToMicroSeconds+60000000)),
	TestInfo(TTime(-KDaysToMicroSeconds),0,0,0,0,30,EDecember,-1,(TText*)_S("!Sun!am!00!12!"),TTime(-KDaysToMicroSeconds)),
	TestInfo(TTime(-KDaysToMicroSeconds-1),999999,59,59,23,29,EDecember,-1,(TText*)_S("!Sat!pm!59!12!"),TTime(-KDaysToMicroSeconds)),
	TestInfo(TTime(-KDaysToMicroSeconds*7),0,0,0,0,24,EDecember,-1,(TText*)_S("!Mon!am!00!12!"),TTime(-KDaysToMicroSeconds*7)),
	TestInfo(TTime(-KDaysToMicroSeconds*14),0,0,0,0,17,EDecember,-1,(TText*)_S("!Mon!am!00!12!"),TTime(-KDaysToMicroSeconds*14)),
	TestInfo(TTime(-KDaysToMicroSeconds*14+1),1,0,0,0,17,EDecember,-1,(TText*)_S("!Mon!am!00!12!"),TTime(-KDaysToMicroSeconds*14+60000000)),
	TestInfo(TTime(-KDaysToMicroSeconds*14-1),999999,59,59,23,16,EDecember,-1,(TText*)_S("!Sun!pm!59!12!"),TTime(-KDaysToMicroSeconds*14)),
	TestInfo(TTime(-KDaysToMicroSeconds*92),0,0,0,0,0,EOctober,-1,(TText*)_S("!Sun!am!00!10!"),TTime(-KDaysToMicroSeconds*92)),
	TestInfo(TTime(-KDaysToMicroSeconds*92+1),1,0,0,0,0,EOctober,-1,(TText*)_S("!Sun!am!00!10!"),TTime(-KDaysToMicroSeconds*92+60000000)),
	TestInfo(TTime(-KDaysToMicroSeconds*92-1),999999,59,59,23,29,ESeptember,-1,(TText*)_S("!Sat!pm!59!09!"),TTime(-KDaysToMicroSeconds*92)),
	TestInfo(Time::NullTTime(),224192,5,59,19,21,EDecember,-292272,(TText*)_S("!Thu!pm!59!12!"),TTime(Time::NullTTime().Int64()-Time::NullTTime().Int64()%60000000))
	};

void TestTTime::Test13()
	{
	TBuf<0x80> testString;
	TInt i=0;
	for (;i<(TInt)(sizeof(KTestArray)/sizeof(TestInfo))-1;i++)
		{
		TTime time=KTestArray[i].iTime;
 		TInt r=time.DateTime().MicroSecond();
 		test(r==KTestArray[i].iMicroSec);
		r=time.DateTime().Second();
 		test(r==KTestArray[i].iSec);
		r=time.DateTime().Minute();
 		test(r==KTestArray[i].iMin);
		r=time.DateTime().Hour();
 		test(r==KTestArray[i].iHour);
		r=time.DateTime().Day();
 		test(r==KTestArray[i].iDay);
		r=time.DateTime().Month();
 		test(r==KTestArray[i].iMonth);
		r=time.DateTime().Year();
 		test(r==KTestArray[i].iYear);
		TRAP(r,time.FormatL(testString,_L("!%*E!%*A!%T!%F%M!")));
		test(r==KErrNone);
		test(testString==TPtrC(KTestArray[i].iDayString));
        TTimeIntervalMicroSeconds usFrom;
		usFrom=time.MicroSecondsFrom(TTime(0));
		test(usFrom==time.Int64());
		usFrom=TTime(0).MicroSecondsFrom(time);
		test(usFrom==-time.Int64());
		usFrom=time.MicroSecondsFrom(TTime(-1));
		test(usFrom==time.Int64()+1);
		usFrom=TTime(-1).MicroSecondsFrom(time);
		test(usFrom==-time.Int64()-1);
		usFrom=time.MicroSecondsFrom(TTime(1));
		test(usFrom==time.Int64()-1);
		usFrom=TTime(1).MicroSecondsFrom(time);
		test(usFrom==-time.Int64()+1);
		TTime time2=time+TTimeIntervalYears(0);
		test(time2==time);
		time2=time+TTimeIntervalYears(1);
		r=time2.DateTime().Year();
 		test(r==KTestArray[i].iYear+1);
		time2=time-TTimeIntervalYears(1);
		r=time2.DateTime().Year();
 		test(r==KTestArray[i].iYear-1);
		time2=time+TTimeIntervalMonths(0);
		test(time2==time);
		time2=time+TTimeIntervalMonths(1);
		r=time2.DateTime().Month();
 		test(r==(KTestArray[i].iMonth+1)%12);
		time2=time-TTimeIntervalMonths(1);
		r=time2.DateTime().Month();
 		test(r==(KTestArray[i].iMonth+11)%12);
		time2=time+TTimeIntervalDays(0);
		test(time2==time);
		time2=time+TTimeIntervalHours(0);
		test(time2==time);
		time2=time+TTimeIntervalMinutes(0);
		test(time2==time);
		time2=time+TTimeIntervalSeconds(0);
		test(time2==time);
		time2=time+TTimeIntervalMicroSeconds(0);
		test(time2==time);
		time.RoundUpToNextMinute();
		test(time==TTime(KTestArray[i].iNextMin));
		}

	TTime time=KTestArray[i].iTime;
	test(time==Time::NullTTime());
 	TInt r=time.DateTime().MicroSecond();
 	test(r==KTestArray[i].iMicroSec);
	r=time.DateTime().Second();
 	test(r==KTestArray[i].iSec);
	r=time.DateTime().Minute();
 	test(r==KTestArray[i].iMin);
	r=time.DateTime().Hour();
 	test(r==KTestArray[i].iHour);
	r=time.DateTime().Day();
 	test(r==KTestArray[i].iDay);
	r=time.DateTime().Month();
 	test(r==KTestArray[i].iMonth);
	r=time.DateTime().Year();
 	test(r==KTestArray[i].iYear);
	TRAP(r,time.FormatL(testString,_L("!%*E!%*A!%T!%F%M!")));
	test(r==KErrNone);
	test(testString==TPtrC(KTestArray[i].iDayString));
	TTimeIntervalMicroSeconds usFrom;
	usFrom=time.MicroSecondsFrom(TTime(0));
	test(usFrom==time.Int64());
	usFrom=TTime(0).MicroSecondsFrom(time);
	test(usFrom==-time.Int64());
	usFrom=time.MicroSecondsFrom(TTime(-1));
	test(usFrom==time.Int64()+1);
	usFrom=TTime(-1).MicroSecondsFrom(time);
	test(usFrom==-time.Int64()-1);
	usFrom=time.MicroSecondsFrom(TTime(1));
	test(usFrom==time.Int64()-1);
	usFrom=TTime(1).MicroSecondsFrom(time);
	test(usFrom==-time.Int64()+1);
	TTime time2=time+TTimeIntervalYears(0);
	test(time2==time);
	time2=time+TTimeIntervalYears(1);
	r=time2.DateTime().Year();
 	test(r==KTestArray[i].iYear+1);
	time2=time+TTimeIntervalMonths(0);
	test(time2==time);
	time2=time+TTimeIntervalMonths(1);
	r=time2.DateTime().Month();
 	test(r==(KTestArray[i].iMonth+1)%12);
	time2=time+TTimeIntervalDays(0);
	test(time2==time);
	time2=time+TTimeIntervalHours(0);
	test(time2==time);
	time2=time+TTimeIntervalMinutes(0);
	test(time2==time);
	time2=time+TTimeIntervalSeconds(0);
	test(time2==time);
	time2=time+TTimeIntervalMicroSeconds(0);
	test(time2==time);
	time.RoundUpToNextMinute();
	test(time==TTime(KTestArray[i].iNextMin));

	}


void TestTTime::TestSecureClock()
{
	// See if secure clock present and early exit if its not enabled
	TInt nso = 0;
	TInt r = HAL::Get(HAL::ETimeNonSecureOffset,nso);
	if (r != KErrNone) {
		RDebug::Printf("WARNING: Secure clock test skipped because offset HAL attribute not present!");
		return;
	}

	// Get the secure and nonsecure times
	TTime securetime, now, march2001;
	r = securetime.HomeTimeSecure();
	if (r==KErrNoSecureTime) {
		TDateTime randomdate;
		randomdate.Set(2005, ESeptember, 13, 0,0,0,0);
		r = User::SetHomeTimeSecure(randomdate);
		test_Equal(KErrNone, r);
		r = securetime.HomeTimeSecure();
	}
	test_Equal(KErrNone, r);
	now.HomeTime();
	PrintTime("hometime=", now);
	PrintTime("securetime=", securetime);

	// Set nonsecure time to March 2001
	TDateTime bday;
	bday.Set(2001, EMarch, 6, 0,0,0,0);
	march2001 = bday;
	r = User::SetHomeTime(march2001);
	test(r==KErrNone);

	// Check the nonsecure system time really updated to March 2001
	TTime now2, securetime2;
	TTimeIntervalSeconds seconds_diff(100);
	now2.HomeTime();
	r=now2.SecondsFrom(march2001, seconds_diff);
	test(r==0);
	test(seconds_diff == TTimeIntervalSeconds(0)); 

	// Check the secure system time did not change as a result of changing nonsecure time
	r = securetime2.HomeTimeSecure();
	test(r==KErrNone);
	seconds_diff = TTimeIntervalSeconds(100); 
	r=securetime2.SecondsFrom(securetime, seconds_diff);
	test(r==0);
	test(seconds_diff == TTimeIntervalSeconds(0));

	// Set secure time to March 2001 (this would fail without DRM rights)
	// *** NB: Setting H4's rtc to any time before 1/1/2000 ***
	// *** will not work but no error will be reported!     ***
	securetime2 = march2001;
	r = User::SetHomeTimeSecure(securetime2);
	test(r==KErrNone);

	// Check both secure & nonsecure system times are March 2001
	TTime now3, securetime3;
	now3.HomeTime();
	r = securetime3.HomeTimeSecure();
	test(r==KErrNone);
	r = securetime3.SecondsFrom(march2001, seconds_diff);
	test(seconds_diff == TTimeIntervalSeconds(0));
	r = now3.SecondsFrom(march2001, seconds_diff);
	test(seconds_diff == TTimeIntervalSeconds(0));

	// Verify the offset changes by the right amount when the nonsecure time is changed
	TTime time;
	r = HAL::Get(HAL::ETimeNonSecureOffset,nso);
	test_Equal(KErrNone, r);
	time.UniversalTime();
    time+=TTimeIntervalMinutes(30);
	TInt nso_expected = nso + 30*60;
	r=User::SetUTCTime(time);
	test_Equal(KErrNone, r);
	r = HAL::Get(HAL::ETimeNonSecureOffset,nso);
	test_Equal(KErrNone, r);
	test_Equal(nso_expected, nso);

	// Restore secure clock and system time to what they were at the top of this function
	r = User::SetHomeTimeSecure(securetime);
	test_Equal(KErrNone, r);
	r = User::SetHomeTime(now);
	test_Equal(KErrNone, r);

}

GLDEF_C TInt E32Main()	
	{

	test.Title();
	test.Start(_L("Testing TDateTime classes"));
	TestTTime T;

	TLocale savedLocale;

	TLocale b;
	b.SetDateSeparator('\0',0);
	b.SetDateSeparator('/',1);
	b.SetDateSeparator('/',2);
	b.SetDateSeparator('\0',3);
	b.SetDateFormat(EDateEuropean);
	b.SetTimeFormat(ETime12);
	b.SetTimeSeparator('\0',0);
	b.SetTimeSeparator(':',1);
	b.SetTimeSeparator(':',2);
	b.SetTimeSeparator('\0',3);
	b.SetAmPmSpaceBetween(ETrue);
	b.SetAmPmSymbolPosition(ELocaleAfter);
	b.SetWorkDays(0x1F);
	b.SetStartOfWeek(EMonday);
	b.Set();

	TTimeIntervalSeconds savedOffset = User::UTCOffset();
	User::SetUTCOffset(0);

    test.Next(_L("Testing TDateTime class"));
	T.Test1();
	test.Next(_L("Testing TTimeIntervalMicroSeconds"));
	T.Test2();
    test.Next(_L("Testing TTimeIntervalSeconds"));
	T.Test3();
	test.Next(_L("Testing other time intervals"));
	T.Test4();
	test.Next(_L("Testing TDateTime To TTime conversions"));	
	T.Test5();
	test.Next(_L("Testing adding TTimeIntervals and Subtracting TTimes"));
    T.Test6();
    test.Next(_L("Day numbers in week and year"));
    T.Test7();
	test.Next(_L("week numbers in year"));
	T.Test8();
	test.Next(_L("String parsing"));
	T.Test9();
	T.Test9();
	test.Next(_L("Remaining Time functions"));
	//T.Test10();
	test.Next(_L("Test time change"));
	T.Test11();
	test.Next(_L("Test TTime::Set(TDesC aString)"));
	T.Test12();
	test.Next(_L("Test negative times"));
	T.Test13();
	test.Next(_L("Test secure clock"));
	T.TestSecureClock();
    test.Next(_L("The year 2000"));
    TTime year2000(TDateTime(2000,EJanuary,0,0,0,0,0));
    test.Printf(_L("\tYear 2000 = %016lx\n"),year2000.Int64());
	savedLocale.Set();	//restore locale info
	User::SetUTCOffset(savedOffset);
	test.End();
	return(0);
    }