--- /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);
+ }