diff -r 000000000000 -r a41df078684a kerneltest/e32test/y2k/t_y2k.cpp --- /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 + +// 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)); + + 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(!(t2t2)); + 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(t1t2)); + 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(t1t2)); + 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(t1t2)); + 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(t1t2)); + 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); + }