kerneltest/e32test/datetime/t_time.cpp
changeset 0 a41df078684a
child 4 56f325a607ea
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/datetime/t_time.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,2447 @@
+// 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);
+
+	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));
+		r = User::SetUTCTimeSecure(securetime-TTimeIntervalSeconds(30));
+		test(r == KErrNone);
+		// The timer should not have been aborted by the secure time change
+		User::WaitForRequest(stat[0]);
+		test(stat[0] == KErrNone);
+		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);
+    }