kerneltest/e32test/y2k/t_y2k.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/y2k/t_y2k.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,1021 @@
+// Copyright (c) 1998-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\y2k\t_y2k.cpp
+// Overview:
+// Year 2000 compliance tests for E32
+// API Information:
+// TTime, TDateTime, RTimer
+// Details:
+// - Test the T_Time & TDateTime classes in accordance with the test spec for Y2K
+// Section 4.1.1.1. Set a variety of date and time values, calculate using different
+// TTimeInterval methods, verify results are as expected.
+// - Test the input of valid and invalid dates to TDateTime and TTime. Verify results.
+// - Test operators <=, >=, >, <, +, - on TDateTime and TTime objects. Verify results.
+// - Test days of the week, verify results are as expected.
+// - Test various timer alarms, verify results are as expected.
+// Platforms/Drives/Compatibility:
+// All.
+// Assumptions/Requirement/Pre-requisites:
+// Failures and causes:
+// Base Port information:
+// 
+//
+
+#include <e32test.h>
+
+// Use this to test all the elements, and still give useful line numbers
+#define dttest(q,x,y,z,a,b,c,d) test(q.Year()==x), test(q.Month()==(y)-1), \
+ test(q.Day()==(z)-1), test(q.Hour()==a), test(q.Minute()==b), test(q.Second()==c),\
+ test(q.MicroSecond()==d)
+
+LOCAL_D RTest test(_L("T_Y2K"));
+
+#define __TRACE_LINE	test.Printf(_L("line %d\n"),__LINE__)
+
+// test fields in TDateTime, using sensible dates (ie 1/1/1999 not 0/0/1999)
+
+class TestY2K
+	{
+public:
+	void Test1();  // test TTime for Y2K compliance
+	void Test2();
+	void Test3();
+	void Test4();
+	void Test5();
+	};
+
+void PrintTime(const TDesC& aName, const TTime& aTime)
+	{
+	TDateTime dt(aTime.DateTime());
+	test.Printf(_L("%S = %02d:%02d:%02d:%06d\n"),&aName,dt.Hour(),dt.Minute(),dt.Second(),dt.MicroSecond());
+	}
+
+void TestY2K::Test1()
+	{
+	// Test the T_Time & TDateTime classes in accordance with the test spec for Y2K
+	// Section 4.1.1.1
+	
+	// 31/12/1998 and 1/1/1999
+	test.Next(_L("Testing existing functionality"));
+	TTime t1;
+	TTime t2;
+	TDateTime dt;
+
+	test(t1.Set(_L("19981130:235959.999999"))==KErrNone);
+	test(t2.Set(_L("19990000:000000."))==KErrNone);
+
+	dt=t1.DateTime();
+
+	test(dt.Year()==1998);
+	test(dt.Month()==EDecember);
+	test(dt.Day()==30);
+	
+	t1+=TTimeIntervalMicroSeconds(1);
+	dt=t1.DateTime();
+
+	dttest(dt,1999,1,1,0,0,0,0);
+	test(t1==t2);
+	
+	test(t1.Set(_L("19981130:235900.000000"))==KErrNone);
+	test(t2.Set(_L("19990000:000001.000000"))==KErrNone);
+	
+	
+	t1+=TTimeIntervalSeconds(61);
+	dt=t1.DateTime();
+
+	dttest(dt,1999,1,1,0,0,1,0);
+	test(t1==t2);
+
+	t1.Set(_L("19981130:234500.000100"));
+	t2.Set(_L("19990000:000100.000100"));
+	t1+=TTimeIntervalMinutes(16);
+	dt=t1.DateTime();
+
+	dttest(dt,1999,1,1,0,1,0,100);
+	test(t1==t2);
+
+	t1.Set(_L("19981130:230000.000001"));
+	t2.Set(_L("19990000:000000.000001"));
+	t1+=TTimeIntervalHours(1);
+	dt=t1.DateTime();
+
+	dttest(dt,1999,1,1,0,0,0,1);
+	test(t1==t2);
+
+	t1.Set(_L("19990000:164523.101000"));
+	t2.Set(_L("19981130:164523.101000"));
+	t1-=TTimeIntervalDays(1);
+	dt=t1.DateTime();
+
+	dttest(dt,1998,12,31,16,45,23,101000);
+	test(t1==t2);
+
+	t1.Set(_L("19990030:164523.999999"));
+	t2.Set(_L("19981130:164523.999999"));
+	t1-=TTimeIntervalMonths(1);
+	dt=t1.DateTime();
+
+	dttest(dt,1998,12,31,16,45,23,999999);
+	test(t1==t2);
+
+	t1.Set(_L("19990000:235959.999999"));
+	t2.Set(_L("19980000:235959.999999"));
+	t1-=TTimeIntervalYears(1);
+	dt=t1.DateTime();
+
+	dttest(dt,1998,1,1,23,59,59,999999);
+	test(t1==t2);
+
+	// Direct setting
+	t1.Set(_L("19981130:235959.999999"));
+	test(dt.SetYear(1998)==KErrNone);
+	test(dt.SetMonth(EDecember)==KErrNone);
+	test(dt.SetDay(30)==KErrNone);
+	test(dt.SetHour(23)==KErrNone);
+	test(dt.SetMinute(59)==KErrNone);
+	test(dt.SetSecond(59)==KErrNone);
+	test(dt.SetMicroSecond(999999)==KErrNone);
+	test(t1==dt);
+
+	t1.Set(_L("19990000:101010.101000"));
+	test(dt.SetYear(1999)==KErrNone);
+	test(dt.SetMonth(EJanuary)==KErrNone);
+	test(dt.SetDay(0)==KErrNone);
+	test(dt.SetHour(10)==KErrNone);
+	test(dt.SetMinute(10)==KErrNone);
+	test(dt.SetSecond(10)==KErrNone);
+	test(dt.SetMicroSecond(101000)==KErrNone);
+	test(t1==dt);
+
+	
+	// 27/2/1998 & 28/2/1998
+
+	t1.Set(_L("19980126:144559.101000"));
+	t2.Set(_L("19980127:144559.101000"));
+
+	dt=t1.DateTime();
+	dttest(dt,1998,2,27,14,45,59,101000);
+		
+	t1+=TTimeIntervalDays(1);
+	test(t1==t2);
+	dt=t2.DateTime();
+
+	dttest(dt,1998,2,28,14,45,59,101000);
+
+	// 28/2/1998 & 1/3/1998
+
+	t1.Set(_L("19980127:"));
+	t2.Set(_L("19980200:"));
+	dt=t1.DateTime();
+	
+	dttest(dt,1998,2,28,0,0,0,0);
+
+	t1+=TTimeIntervalDays(1);
+	test(t1==t2);
+	dt=t2.DateTime();
+
+	dttest(dt,1998,3,1,0,0,0,0);
+
+	// 31/8/1999 & 1/9/1999
+
+	t1.Set(_L("19990730:235959.121200"));
+	t2.Set(_L("19990800:000000.121200"));
+	dt=t1.DateTime();
+
+	dttest(dt,1999,8,31,23,59,59,121200);
+	
+	t1+=TTimeIntervalSeconds(1);
+	test(t1==t2);
+	dt=t2.DateTime();
+
+	dttest(dt,1999,9,1,0,0,0,121200);
+
+	// 8/9/1999 & 9/9/1999
+
+	t1.Set(_L("19990807:233434."));
+	t2.Set(_L("19990808:003434."));
+	dt=t1.DateTime();
+
+	dttest(dt,1999,9,8,23,34,34,0);
+
+	t1+=TTimeIntervalHours(1);
+	test(t1==t2);
+	dt=t2.DateTime();
+
+	dttest(dt,1999,9,9,0,34,34,0);
+
+	// 9/9/1999 & 10/9/1999
+
+	t1.Set(_L("19990808:235934."));
+	t2.Set(_L("19990809:000034."));
+   	dt=t1.DateTime();
+	
+	dttest(dt,1999,9,9,23,59,34,0);
+	
+	t1+=TTimeIntervalMinutes(1);
+	test(t1==t2);
+	dt=t2.DateTime();
+
+	dttest(dt,1999,9,10,0,0,34,0);
+ 
+	// 31/12/1999 & 1/1/2000
+
+	test(t1.Set(_L("19991130:"))==KErrNone);
+	test(t2.Set(_L("20000000:"))==KErrNone);
+	dt=t1.DateTime();
+
+	dttest(dt,1999,12,31,0,0,0,0);
+	
+	t1+=TTimeIntervalDays(1);
+	test(t1==t2);
+	dt=t2.DateTime();
+
+	dttest(dt,2000,1,1,0,0,0,0);
+
+	test(dt.SetYear(2000)==KErrNone);
+	test(dt.SetMonth(EJanuary)==KErrNone);
+	test(dt.SetDay(0)==KErrNone);
+	test(dt.SetHour(0)==KErrNone);
+	test(dt.SetMinute(0)==KErrNone);
+	test(dt.SetSecond(0)==KErrNone);
+	test(dt.SetMicroSecond(0)==KErrNone);
+
+	test(t1==dt);
+	test(t1.DayNoInYear()==1);
+	test(t1.WeekNoInYear(EFirstWeek)==1);
+	test(t2.DaysInMonth()==31);
+
+	// 27/2/2000 to 28/2/2000
+
+	test(t1.Set(_L("20000126:235958.999999"))==KErrNone);
+	test(t2.Set(_L("20000127:"))==KErrNone);
+	dt=t1.DateTime();
+
+	dttest(dt,2000,2,27,23,59,58,999999);
+
+	t1+=TTimeIntervalSeconds(1);
+	t1+=TTimeIntervalMicroSeconds(1);
+	test(t1==t2);
+	test(t1.DaysInMonth()==29);
+	dt=t2.DateTime();
+
+	dttest(dt,2000,2,28,0,0,0,0);
+
+	// 28/2/2000 & 29/2/2000
+
+    test(t2.Set(_L("20000128:"))==KErrNone);
+	test(dt.Set(2000,EFebruary,28,0,0,0,0)==KErrNone);
+
+	t1+=TTimeIntervalDays(1);
+	test(t1==t2);
+	test(t1==dt);
+	test(Time::IsLeapYear(t2.DateTime().Year()));
+	test(t1.DayNoInMonth()==28);
+	test(t1.DaysFrom(t2)==TTimeIntervalDays(0));
+	t2.Set(_L("20000200:"));
+	test(t1.DaysFrom(t2)==TTimeIntervalDays(-1));
+	test(t2.DaysFrom(t1)==TTimeIntervalDays(1));
+	
+	// 29/2/2000 to 1/3/2000
+
+	t1.Set(_L("20000128:"));
+	t2.Set(_L("20000200:"));
+
+	dt=t1.DateTime();
+	dttest(dt,2000,2,29,0,0,0,0);
+	t1+=TTimeIntervalHours(24);
+	test(t1==t2);
+	dt=t1.DateTime();
+	dttest(dt,2000,3,1,0,0,0,0);
+
+	// 31/12/2000 & 1/1/2001
+
+	t1.Set(_L("20001130:"));
+	t2.Set(_L("20010000:235945."));
+	dt=t1.DateTime();
+	dttest(dt,2000,12,31,0,0,0,0);
+	test(t1!=t2);
+	t1+=TTimeIntervalHours(24);
+	t1+=TTimeIntervalMinutes(60*23);
+	t1+=TTimeIntervalSeconds(59*60+45);
+	test(t1==t2);
+	
+	dt=t1.DateTime();
+	dttest(dt,2001,1,1,23,59,45,0);
+
+	// 28/2/2001 & 1/3/2001
+	test(t1.Set(_L("20010127:"))==KErrNone);
+	test(t2.Set(_L("20010200:"))==KErrNone);
+	test(t2.DaysFrom(t1)==TTimeIntervalDays(1));
+	test(t2.MonthsFrom(t1)==TTimeIntervalMonths(0));
+	dt=t1.DateTime();
+	dttest(dt,2001,2,28,0,0,0,0);
+	t1+=TTimeIntervalDays(1);
+	test(t1==t2);
+
+	dt=t1.DateTime();
+	dttest(dt,2001,3,1,0,0,0,0);
+
+	// 28/2/2004 29/2/2004
+	t1.Set(_L("20040127:"));
+	test(t2.Set(_L("20040128:"))==KErrNone);
+	test(Time::IsLeapYear(t1.DateTime().Year()));
+	test(t2.DaysFrom(t1)==TTimeIntervalDays(1));
+	dt=t1.DateTime();
+	dttest(dt,2004,2,28,0,0,0,0);
+	t1+=TTimeIntervalMinutes(60*24);
+	test(t1==t2);
+	dt=t2.DateTime();
+	dttest(dt,2004,2,29,0,0,0,0);
+
+	// 29/2/2004 & 1/3/2004
+	test(t1.Set(_L("20040128:"))==KErrNone);
+	test(t2.Set(_L("20040200:"))==KErrNone);
+	test(Time::IsLeapYear(t2.DateTime().Year()));
+	dt=t1.DateTime();
+	dttest(dt,2004,2,29,0,0,0,0);
+	t1+=TTimeIntervalSeconds(60*60*24);
+	test(t1==t2);
+	dt=t1.DateTime();
+	dttest(dt,2004,3,1,0,0,0,0);
+	
+	}
+
+void TestY2K::Test2()
+	{
+	// Test the input of valid and invalid dates to TDateTime and TTime
+	// Section 4.2
+
+	TTime t1,t2;
+	TDateTime dt;
+	// 31/12/1998
+	test(dt.Set(1998,EDecember,30,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("19981130:"))==KErrNone);
+	dttest(dt,1998,12,31,0,0,0,0);
+
+	// 1/3/1999
+	test(dt.Set(1999,EMarch,0,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("19990200:"))==KErrNone);
+	dttest(dt,1999,3,1,0,0,0,0);
+
+	// 27/2/2000
+	test(dt.Set(2000,EFebruary,26,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("20000126:"))==KErrNone);
+	dttest(dt,2000,2,27,0,0,0,0);
+
+	// 31/12/2000
+	test(dt.Set(2000,EDecember,30,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("20001130:225645."))==KErrNone);
+	dttest(dt,2000,12,31,0,0,0,0);
+
+	// 28/2/2004
+	test(dt.Set(2004,EFebruary,27,1,2,3,4)==KErrNone);
+	test(t1.Set(_L("20040127:"))==KErrNone);
+	dttest(dt,2004,2,28,1,2,3,4);
+
+	// 1/1/1999
+	test(dt.Set(1999,EJanuary,0,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("19990000:"))==KErrNone);
+	dttest(dt,1999,1,1,0,0,0,0);
+
+	// 9/9/1999
+	test(dt.Set(1999,ESeptember,8,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("19990808:"))==KErrNone);
+	dttest(dt,1999,9,9,0,0,0,0);
+
+	// 28/2/2000
+	test(dt.Set(2000,EFebruary,27,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("20000127:"))==KErrNone);
+	dttest(dt,2000,2,28,0,0,0,0);
+
+	// 1/1/2001
+	test(dt.Set(2001,EJanuary,0,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("20010000:"))==KErrNone);
+	dttest(dt,2001,1,1,0,0,0,0);
+
+	// 29/2/2004
+	test(dt.Set(2004,EFebruary,28,2,3,4,5)==KErrNone);
+	test(t1.Set(_L("20040128:"))==KErrNone);
+	dttest(dt,2004,2,29,2,3,4,5);
+
+	// 27/2/1999
+	test(dt.Set(1999,EFebruary,26,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("19990126:"))==KErrNone);
+	dttest(dt,1999,2,27,0,0,0,0);
+
+	// 31/12/1999
+	test(dt.Set(1999,EDecember,30,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("19991130:"))==KErrNone);
+	dttest(dt,1999,12,31,0,0,0,0);
+
+	// 29/2/2000
+	test(dt.Set(2000,EFebruary,28,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("20000128:"))==KErrNone);
+	dttest(dt,2000,2,29,0,0,0,0);
+
+	// 28/2/2001
+	test(dt.Set(2001,EFebruary,27,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("20010127:"))==KErrNone);
+	dttest(dt,2001,2,28,0,0,0,0);
+
+	// 1/3/2004
+	test(dt.Set(2004,EMarch,0,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("20040200:"))==KErrNone);
+	dttest(dt,2004,3,1,0,0,0,0);
+
+	// 28/2/1999
+	test(dt.Set(1999,EFebruary,27,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("19990127:"))==KErrNone);
+	dttest(dt,1999,2,28,0,0,0,0);
+
+	// 1/1/2000
+	test(dt.Set(2000,EJanuary,0,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("20000000:"))==KErrNone);
+	dttest(dt,2000,1,1,0,0,0,0);
+
+	// 1/3/2000
+	test(dt.Set(2000,EMarch,0,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("20000200:"))==KErrNone);
+	dttest(dt,2000,3,1,0,0,0,0);
+
+	// 1/3/2001
+	test(dt.Set(2001,EMarch,0,0,0,0,0)==KErrNone);
+	test(t1.Set(_L("20010200:"))==KErrNone);
+	dttest(dt,2001,3,1,0,0,0,0);
+
+	// Invalid dates
+	// 31/4/1998
+	test(dt.Set(1998,EApril,30,0,0,0,0)!=KErrNone);
+	test(t1.Set(_L("19980330:"))!=KErrNone);
+	dt=t1.DateTime();
+	dttest(dt,2001,3,1,0,0,0,0);
+
+	// 30/2/2000
+	test(dt.Set(2000,EFebruary,29,0,0,0,0)!=KErrNone);
+	test(t1.Set(_L("20000129:"))!=KErrNone);
+	dt=t1.DateTime();
+	dttest(dt,2001,3,1,0,0,0,0);
+
+	// 29/2/2001
+	test(dt.Set(2001,EFebruary,28,0,0,0,0)!=KErrNone);
+	test(t1.Set(_L("20010128:"))!=KErrNone);
+	dt=t1.DateTime();
+	dttest(dt,2001,3,1,0,0,0,0);
+
+	// 29/2/1999
+	test(dt.Set(1999,EFebruary,28,0,0,0,0)!=KErrNone);
+	test(t1.Set(_L("19990128:"))!=KErrNone);
+	dt=t1.DateTime();
+	dttest(dt,2001,3,1,0,0,0,0);
+
+	// 30/2/2004
+	test(dt.Set(2004,EFebruary,29,0,0,0,0)!=KErrNone);
+	test(t1.Set(_L("20040129:"))!=KErrNone);
+	dt=t1.DateTime();
+	dttest(dt,2001,3,1,0,0,0,0);
+
+	// test of TTime::Parse
+	// Set UniversalTime to C19 first
+	TTime oldtime;
+	oldtime.UniversalTime();
+	t1.Set(_L("19990303:"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	
+	test(t1.Parse(_L("1/1/00"))>=0);
+	dt=t1.DateTime();
+	dttest(dt,1900,1,1,0,0,0,0);
+	test(t1.Parse(_L("1/1/00"),1)>=0);
+	dt=t1.DateTime();
+	dttest(dt,2000,1,1,0,0,0,0);
+
+	test(t1.Parse(_L("2/3/2000"),20)>=0);
+	dt=t1.DateTime();
+	dttest(dt,2000,3,2,0,0,0,0);
+
+	test(t1.Parse(_L("31/12/99"),50)>=0);
+	dt=t1.DateTime();
+	dttest(dt,1999,12,31,0,0,0,0);
+
+	test(t1.Parse(_L("1/1/99"))>=0);
+	dt=t1.DateTime();
+	dttest(dt,1999,1,1,0,0,0,0);
+
+	test(t1.Parse(_L("1/1/99"),98)>=0);
+	dt=t1.DateTime();
+	TBuf<100> str;
+	t1.FormatL(str,_L("%F %D %M %Y %H:%T:%S.%C"));
+	test.Printf(str);
+	test.Printf(_L("\n"));
+	dttest(dt,1999,1,1,0,0,0,0);
+
+	// Reset UniversalTime
+	test(User::SetUTCTime(oldtime) == KErrNone);
+
+	// Year lengths
+	t1.Set(_L("20000000:"));
+	t2.Set(_L("20001130:"));
+	test(t2.DaysFrom(t1)==TTimeIntervalDays(365));
+	test(Time::IsLeapYear(t1.DateTime().Year()));
+	test(Time::IsLeapYear(t2.DateTime().Year()));
+	t1.Set(_L("20000100:"));
+	test(t1.DaysInMonth()==29);
+
+	t1.Set(_L("19990000:"));
+	t2.Set(_L("19991130:"));
+	test(t2.DaysFrom(t1)==TTimeIntervalDays(364));
+	test(Time::IsLeapYear(t1.DateTime().Year())==EFalse);
+	test(Time::IsLeapYear(t2.DateTime().Year())==EFalse);
+	t1.Set(_L("19990100:"));
+	test(t1.DaysInMonth()==28);
+
+	t1.Set(_L("20040000:"));
+	t2.Set(_L("20041130:"));
+	test(t2.DaysFrom(t1)==TTimeIntervalDays(365));
+	test(Time::IsLeapYear(t2.DateTime().Year()));
+	test(Time::IsLeapYear(t1.DateTime().Year()));
+	t1.Set(_L("20040100:"));
+	test(t1.DaysInMonth()==29);
+		   
+	}
+
+
+void TestY2K::Test3()
+	{
+	TTime t1,t2;
+	TDateTime dt;
+
+	// Test operator <=, >=, >, <, +, -
+
+	// mid 1999 to 31/12/1999
+	t1.Set(_L("19990620:145459."));
+	t2.Set(_L("19991130:"));
+	test(!(t1>t2));
+	test(t1<t2);
+	test(t1<=t2);
+	test(!(t1>=t2));
+	test(!(t1==t2));
+
+	t1-=TTimeIntervalSeconds(59);
+	t1-=TTimeIntervalMinutes(54);
+	t1-=TTimeIntervalHours(14);
+	t1=t1+TTimeIntervalDays(10);
+	t1+=TTimeIntervalMonths(5);
+	test(t1==t2);
+	t2.Set(_L("19990730:"));
+	t1-=TTimeIntervalMonths(4);
+	test(t1==t2);
+
+	// Mid 1999 to 1/1/2000
+	t1.Set(_L("19990500:"));
+	t2.Set(_L("20000000:"));
+	test(t2>t1);
+	test(t2>=t1);
+	test(!(t2<t1));
+	test(!(t2<=t1));
+	t1+=TTimeIntervalMonths(7);
+	test(t1==t2);
+	t2.Set(_L("19990707:020202.2"));
+	t1+=TTimeIntervalMicroSeconds(2);
+	t1=t1+TTimeIntervalSeconds(2)+TTimeIntervalMinutes(2)+TTimeIntervalHours(2);
+	t1-=TTimeIntervalDays(24);
+	t1-=TTimeIntervalMonths(4);
+	dt=t1.DateTime();
+	test(t1==t2);
+
+	// Mid 1999 to 20/2/2000
+	t1.Set(_L("19990819:"));
+	t2.Set(_L("20000119:"));
+	test(t1<t2);
+	test(t1<=t2);
+	test(!(t1>t2));
+	test(!(t1>=t2));
+	test(!(t1==t2));
+	t1+=TTimeIntervalMonths(5);
+	test(t1==t2);
+	t2.Set(_L("19990600:"));
+	t1-=TTimeIntervalMonths(7);
+	t1-=TTimeIntervalDays(19);
+	test(t1==t2);
+
+	// Mid 1999 to 1/3/2000
+	t1.Set(_L("19990700:122345."));
+	t2.Set(_L("20000200:122345."));
+	test(t1<t2);
+	test(t1<=t2);
+	test(!(t1>t2));
+	test(!(t1>=t2));
+	test(!(t1==t2));
+	t1+=TTimeIntervalMonths(7);
+	test(t1==t2);
+	t2.Set(_L("19990800:"));
+	t1-=TTimeIntervalMonths(6);
+	t1=t1-TTimeIntervalHours(12)-TTimeIntervalMinutes(23)-TTimeIntervalSeconds(45);
+	test(t1==t2);
+
+	// mid 1999 to 1/4/2000
+	t1.Set(_L("19990500:"));
+	t2.Set(_L("20000300:"));
+	test(t1<t2);
+	test(t1<=t2);
+	test(!(t1>t2));
+	test(!(t1>=t2));
+	test(!(t1==t2));
+	t1+=TTimeIntervalMonths(10);
+	test(t1==t2);
+	t2.Set(_L("19990600:"));
+	t1-=TTimeIntervalMonths(9);
+	test(t1==t2);
+
+	// Mid 1999 to Mid 2001
+	t1.Set(_L("19990620:"));
+	t2.Set(_L("20010620:"));
+	test(t1<t2);
+	test(t1<=t2);
+	test(!(t1>t2));
+	test(!(t1>=t2));
+	test(!(t1==t2));
+	t1+=TTimeIntervalMonths(24);
+	test(t1==t2);
+	t2.Set(_L("19990720:"));
+	t1-=TTimeIntervalMonths(23);
+	test(t1==t2);
+
+	// Mid 2000 to Mid 2001
+	t1.Set(_L("20000620:"));
+	t2.Set(_L("20010620:"));
+	test(t1<t2);
+	test(t1<=t2);
+	test(!(t1>t2));
+	test(!(t1>=t2));
+	test(!(t1==t2));
+	t1+=TTimeIntervalMonths(12);
+	test(t1==t2);
+	t2.Set(_L("20000720:"));
+	t1-=TTimeIntervalMonths(11);
+	test(t1==t2);
+		
+	}
+	
+	
+void TestY2K::Test4()
+	{
+	TTime t1;
+	TLocale loc;
+
+	loc.SetStartOfWeek(EMonday);
+	
+	// 1/1/1900 was Mon
+	t1.Set(_L("19000000:"));
+	test(t1.DayNoInWeek()==EMonday);
+
+	// 28/2/1900 was Wed
+	t1.Set(_L("19000127:"));
+	test(t1.DayNoInWeek()==EWednesday);
+
+	// 1/3/1900 was Thur
+	t1.Set(_L("19000200:"));
+	test(t1.DayNoInWeek()==EThursday);
+
+	// 28/2/1999 is sun
+	t1.Set(_L("19990127:"));
+	test(t1.DayNoInWeek()==ESunday);
+
+	// 1/3/1999 is mon
+	t1.Set(_L("19990200:"));
+	test(t1.DayNoInWeek()==EMonday);
+
+	// 31/12/1999
+	t1.Set(_L("19991130:"));
+	test(t1.DayNoInWeek()==EFriday);
+
+	// 1/1/2000
+	t1.Set(_L("20000000:"));
+	test(t1.DayNoInWeek()==ESaturday);
+
+	// 28/2/2000
+	t1.Set(_L("20000127:"));
+	test(t1.DayNoInWeek()==EMonday);
+
+	// 29/2/2000
+	t1.Set(_L("20000128:"));
+	test(t1.DayNoInWeek()==ETuesday);
+
+	// 1/3/2000
+	t1.Set(_L("20000200:"));
+	test(t1.DayNoInWeek()==EWednesday);
+
+	// 1/1/2001
+	t1.Set(_L("20010000:"));
+	test(t1.DayNoInWeek()==EMonday);
+
+	// 28/2/2004
+	t1.Set(_L("20040127:"));
+	test(t1.DayNoInWeek()==ESaturday);
+
+	// 29/2/2004
+	t1.Set(_L("20040128:"));
+	test(t1.DayNoInWeek()==ESunday);
+
+	// 1/3/2004
+	t1.Set(_L("20040200:"));
+	test(t1.DayNoInWeek()==EMonday);
+		
+	}
+
+void TestY2K::Test5()
+	{
+	// Test various timer alarms -
+	// User::At, User::After, RTimer::At, RTimer::After
+	TTime t1,t2, oldtime;
+	TRequestStatus stat;
+	RTimer timer;
+	timer.CreateLocal();
+	const TInt sec=1000000;
+	oldtime.UniversalTime();
+
+	// Check that timers across the boundary work
+	// 31/12/1998 to 1/1/1999
+	t1.Set(_L("19981130:235959."));
+	t2.Set(_L("19990000:000001."));
+	test(User::SetUTCTime(t1)==KErrNone);
+	timer.At(stat,t2);
+	__TRACE_LINE;
+	User::WaitForRequest(stat);
+	t1.UniversalTime();
+	PrintTime(_L("t1"),t1);
+	PrintTime(_L("t2"),t2);
+	test(t1 >= t2);
+	test(stat==KErrNone);
+	timer.At(stat,t1);
+	__TRACE_LINE;
+	User::WaitForRequest(stat);
+	test(stat==KErrUnderflow);
+	t1.Set(_L("19981130:235959."));
+	t2.Set(_L("19990000:000001."));
+	test(User::SetUTCTime(t1)==KErrNone);
+	test(User::At(t2)==KErrNone);
+	t1.UniversalTime();
+	test(t1 >= t2);
+	test(User::At(t1) == KErrUnderflow);
+
+	// 31/12/1999 1/1/2000
+	t1.Set(_L("19991130:235959."));
+	t2.Set(_L("20000000:000000.0"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	timer.At(stat,t2);
+	__TRACE_LINE;
+	User::WaitForRequest(stat);
+	test(stat==KErrNone);
+	t1.UniversalTime();
+	TBuf<100> str;
+	t1.FormatL(str,_L("%F %D %M %Y %H:%T:%S.%C"));
+	test.Printf(str);
+	test.Printf(_L("\n"));
+	test(t1>=t2);
+	timer.At(stat,t1);
+	__TRACE_LINE;
+	User::WaitForRequest(stat);
+	test(stat==KErrUnderflow);
+	t1.Set(_L("19991130:235959."));
+	t2.Set(_L("20000000:000000.00000"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	test(User::At(t2)==KErrNone);
+	t1.UniversalTime();
+	test(t1>=t2);
+
+	// 31/12/2000 to 1/1/2001
+	t1.Set(_L("20001130:235958."));
+	t2.Set(_L("20010000:"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	timer.At(stat,t2);
+	__TRACE_LINE;
+	User::WaitForRequest(stat);
+	test(stat==KErrNone);
+	t1.UniversalTime();
+	test(t1>=t2);
+	timer.At(stat,t1);
+	__TRACE_LINE;
+	User::WaitForRequest(stat);
+	test(stat==KErrUnderflow);
+	t1.Set(_L("20001130:235958."));
+	t2.Set(_L("20010000:"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	test(User::At(t2)==KErrNone);
+	t1.UniversalTime();
+	test(t1>=t2);
+	
+	// Check that tick timers across the C work
+
+	// 31/12/1998 & 1/1/1999
+	t1.Set(_L("19981130:235959."));
+	t2.Set(_L("19990000:"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	timer.After(stat,sec*2);
+	__TRACE_LINE;
+	User::WaitForRequest(stat);
+	test(stat==KErrNone);
+	t1.UniversalTime();
+	test(t1>=t2);
+	t1.Set(_L("19981130:235959."));
+	t2.Set(_L("19990000:"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	User::After(sec*2);
+	t1.UniversalTime();
+	test(t1>=t2);
+	t1.Set(_L("19981130:235959."));
+	t2.Set(_L("19990000:"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	test(User::At(t2)==KErrNone);
+	t1.UniversalTime();
+	test(t1>=t2);
+
+	// 31/12/1999 & 1/1/2000
+	t1.Set(_L("19991130:235959."));
+	t2.Set(_L("20000000:"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	timer.After(stat,sec*2);
+	__TRACE_LINE;
+	User::WaitForRequest(stat);
+	test(stat==KErrNone);
+	t1.UniversalTime();
+	test(t1>=t2);
+	t1.Set(_L("19991130:235959."));
+	t2.Set(_L("20000000:"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	User::After(sec*2);
+	t1.UniversalTime();
+	test(t1>=t2);
+	t1.Set(_L("19991130:235959."));
+	t2.Set(_L("20000000:"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	test(User::At(t2)==KErrNone);
+	t1.UniversalTime();
+	test(t1>=t2);
+
+	//31/12/2000 and 1/1/2001
+	t1.Set(_L("20001130:235959."));
+	t2.Set(_L("20010000:"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	timer.After(stat, sec*5);
+	__TRACE_LINE;
+	User::WaitForRequest(stat);
+	test(stat==KErrNone);
+	t1.UniversalTime();
+	test(t1>=t2);
+	t1.Set(_L("20001130:235959."));
+	t2.Set(_L("20010000:"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	User::After(sec*5);
+	t1.UniversalTime();
+	test(t1>=t2);
+	t1.Set(_L("20001130:235959."));
+	t2.Set(_L("20010000:"));
+	test(User::SetUTCTime(t1)==KErrNone);
+	test(User::At(t2)==KErrNone);
+	t1.UniversalTime();
+	test(t1>=t2);
+
+	// check that timers abort across the C, with timer b4 and after
+	// date changed to.
+	TTime times[4];
+	RTimer timers[3];
+	TRequestStatus stats[3];
+	TInt i;
+	
+	for(i=0;i<3;i++)
+		timers[i].CreateLocal();
+	
+	// 31/12/1998 & 1/1/1999
+	times[0].Set(_L("19981129:"));
+	times[1].Set(_L("19981130:235959.999999"));
+	times[2].Set(_L("19990203:234500."));
+	times[3].Set(_L("19990506:"));
+	
+	test(User::SetUTCTime(times[0])==KErrNone);
+	for(i=1;i<4;i++)
+		timers[i-1].At(stats[i-1], times[i]);
+	User::SetUTCTime(times[2]);
+	// Should all abort
+	for(i=0;i<3;i++)
+		{
+		__TRACE_LINE;
+		User::WaitForRequest(stats[i]);
+		test(stats[1]==KErrAbort);
+		}
+
+	// 31/12/1999 & 1/1/2000
+	times[0].Set(_L("19991029:"));
+	times[1].Set(_L("19991130:235959.999999"));
+	times[2].Set(_L("20000203:234500."));
+	times[3].Set(_L("20000506:"));
+	
+	test(User::SetUTCTime(times[0])==KErrNone);
+	for(i=1;i<4;i++)
+		timers[i-1].At(stats[i-1], times[i]);
+	User::SetUTCTime(times[2]);
+	// Should all abort
+	for(i=0;i<3;i++)
+		{
+		__TRACE_LINE;
+		User::WaitForRequest(stats[i]);
+		test(stats[1]==KErrAbort);
+		}
+
+	// 31/12/2000 and 1/1/2001
+	times[0].Set(_L("20001129:"));
+	times[1].Set(_L("20001130:235959.999999"));
+	times[2].Set(_L("20010203:234500."));
+	times[3].Set(_L("20010506:"));
+	
+	test(User::SetUTCTime(times[0])==KErrNone);
+	for(i=1;i<4;i++)
+		timers[i-1].At(stats[i-1], times[i]);
+	User::SetUTCTime(times[2]);
+	// Should all abort
+	for(i=0;i<3;i++)
+		{
+		__TRACE_LINE;
+		User::WaitForRequest(stats[i]);
+		test(stats[1]==KErrAbort);
+		}
+
+	// Check that overflow works
+	t1.Set(_L("99991130:"));
+	test(User::At(t1)==KErrOverflow);
+	test(User::SetUTCTime(oldtime)==KErrNone);
+	}
+
+GLDEF_C TInt E32Main()	
+	{
+
+	TTime oldtime;
+	oldtime.UniversalTime();
+	test.Title();
+	test.Start(_L("Testing Y2K behaviour"));
+	TestY2K T;
+	TLocale currentLocale;
+
+	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 oldOffset = User::UTCOffset();
+	User::SetUTCOffset(0);
+
+	test.Next(_L("Testing TTime & TDateTime class (section 4.1.1.1)"));
+	T.Test1();
+	test.Next(_L("Testing TDateTime & TTime with valid and invalid dates (Section 4.2)"));
+	T.Test2();
+	test.Next(_L("Testing TDateTime & TTime with sorts/calculations (Section 4.2.5)"));
+	T.Test3();
+	test.Next(_L("Testing week days (Section 4.2.6)"));
+	T.Test4();
+	test.Next(_L("Testing timers"));
+	T.Test5();
+	test.Next(_L("Checking we can set to 31/12/1999 and 29/2/2000"));
+	TTime t1;
+	t1.Set(_L("19991130:"));
+	User::SetUTCTime(t1);
+	t1.UniversalTime();
+	TBuf<100> str;
+	t1.FormatL(str,_L("%F %D %M %Y %H:%T:%S.%C"));
+	test.Printf(str);
+	test.Printf(_L("\n"));
+	t1.Set(_L("20000128:"));
+	User::SetUTCTime(t1);
+	t1.UniversalTime();
+	t1.FormatL(str,_L("%F %D %M %Y %H:%T:%S.%C"));
+	test.Printf(str);
+	test.Printf(_L("\n"));
+	//test.Printf(_L("Press a key"));
+	//test.Getch();
+	User::SetUTCTime(oldtime);
+	currentLocale.Set();
+	User::SetUTCOffset(oldOffset);
+	test.End();
+	return (0);
+	}