1999-08-16 21:50:52 +00:00
|
|
|
/*
|
|
|
|
********************************************************************
|
|
|
|
* COPYRIGHT:
|
|
|
|
* (C) Copyright int32_ternational Business Machines Corporation, 1998
|
|
|
|
* Licensed Material - Program-Property of IBM - All Rights Reserved.
|
|
|
|
* US Government Users Restricted Rights - Use, duplication, or disclosure
|
|
|
|
* restricted by GSA ADP Schedule Contract with IBM Corp.
|
|
|
|
*
|
|
|
|
********************************************************************
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "tzregts.h"
|
|
|
|
|
|
|
|
#include "calregts.h"
|
|
|
|
|
|
|
|
#include "simpletz.h"
|
|
|
|
#include "smpdtfmt.h"
|
|
|
|
|
|
|
|
#include <limits.h>
|
|
|
|
|
|
|
|
// *****************************************************************************
|
|
|
|
// class TimeZoneRegressionTest
|
|
|
|
// *****************************************************************************
|
|
|
|
|
|
|
|
#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break;
|
|
|
|
|
|
|
|
void
|
|
|
|
TimeZoneRegressionTest::runIndexedTest( int32_t index, bool_t exec, char* &name, char* par )
|
|
|
|
{
|
|
|
|
// if (exec) logln((UnicodeString)"TestSuite NumberFormatRegressionTest");
|
|
|
|
switch (index) {
|
|
|
|
|
|
|
|
CASE(0, Test4052967)
|
|
|
|
CASE(1, Test4073209)
|
|
|
|
CASE(2, Test4073215)
|
|
|
|
CASE(3, Test4084933)
|
|
|
|
CASE(4, Test4096952)
|
|
|
|
CASE(5, Test4109314)
|
|
|
|
CASE(6, Test4126678)
|
|
|
|
CASE(7, Test4151406)
|
|
|
|
CASE(8, Test4151429)
|
|
|
|
CASE(9, Test4154537)
|
|
|
|
CASE(10, Test4154542)
|
|
|
|
CASE(11, Test4154650)
|
|
|
|
CASE(12, Test4154525)
|
|
|
|
CASE(13, Test4162593)
|
|
|
|
CASE(14, TestJDK12API)
|
|
|
|
|
|
|
|
default: name = ""; break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool_t
|
|
|
|
TimeZoneRegressionTest::failure(UErrorCode status, const char* msg)
|
|
|
|
{
|
|
|
|
if(FAILURE(status)) {
|
|
|
|
errln(UnicodeString("FAIL: ") + msg + " failed, error " + errorName(status));
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4052967
|
|
|
|
*/
|
|
|
|
void TimeZoneRegressionTest:: Test4052967() {
|
|
|
|
// {sfb} not applicable in C++ ?
|
|
|
|
/*logln("*** CHECK TIMEZONE AGAINST HOST OS SETTING ***");
|
|
|
|
logln("user.timezone:" + System.getProperty("user.timezone", "<not set>"));
|
|
|
|
logln(new Date().toString());
|
|
|
|
logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");*/
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4073209
|
|
|
|
*/
|
|
|
|
void TimeZoneRegressionTest:: Test4073209() {
|
|
|
|
TimeZone *z1 = TimeZone::createTimeZone("PST");
|
|
|
|
TimeZone *z2 = TimeZone::createTimeZone("PST");
|
|
|
|
if (z1 == z2)
|
|
|
|
errln("Fail: TimeZone should return clones");
|
|
|
|
delete z1;
|
|
|
|
delete z2;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4073215
|
|
|
|
*/
|
|
|
|
// {sfb} will this work using a Calendar?
|
|
|
|
void TimeZoneRegressionTest:: Test4073215()
|
|
|
|
{
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
SimpleTimeZone *z = (SimpleTimeZone*) TimeZone::createTimeZone("GMT");
|
|
|
|
if (z->useDaylightTime())
|
|
|
|
errln("Fail: Fix test to start with non-DST zone");
|
|
|
|
z->setStartRule(Calendar::FEBRUARY, 1, Calendar::SUNDAY, 0, status);
|
|
|
|
failure(status, "z->setStartRule()");
|
|
|
|
z->setEndRule(Calendar::MARCH, -1, Calendar::SUNDAY, 0, status);
|
|
|
|
failure(status, "z->setStartRule()");
|
|
|
|
if (!z->useDaylightTime())
|
|
|
|
errln("Fail: DST not active");
|
|
|
|
GregorianCalendar *cal = new GregorianCalendar(97, Calendar::JANUARY, 31, status);
|
|
|
|
failure(status, "new GregorianCalendar");
|
|
|
|
if (z->inDaylightTime(cal->getTime(status), status) || FAILURE(status) ) {
|
|
|
|
errln("Fail: DST not working as expected");
|
|
|
|
}
|
|
|
|
cal->set(97, Calendar::MARCH, 1);
|
|
|
|
failure(status, "GregorianCalendar->set()");
|
|
|
|
if (! z->inDaylightTime(cal->getTime(status), status) || FAILURE(status) ) {
|
|
|
|
errln("Fail: DST not working as expected");
|
|
|
|
}
|
|
|
|
cal->set(97, Calendar::MARCH, 31);
|
|
|
|
failure(status, "GregorianCalendar->set()");
|
|
|
|
if (z->inDaylightTime(cal->getTime(status), status) || FAILURE(status)) {
|
|
|
|
errln("Fail: DST not working as expected");
|
|
|
|
}
|
|
|
|
|
|
|
|
delete z;
|
|
|
|
delete cal;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4084933
|
|
|
|
* The expected behavior of TimeZone around the boundaries is:
|
|
|
|
* (Assume transition time of 2:00 AM)
|
|
|
|
* day of onset 1:59 AM STD = display name 1:59 AM ST
|
|
|
|
* 2:00 AM STD = display name 3:00 AM DT
|
|
|
|
* day of end 0:59 AM STD = display name 1:59 AM DT
|
|
|
|
* 1:00 AM STD = display name 1:00 AM ST
|
|
|
|
*/
|
|
|
|
void TimeZoneRegressionTest:: Test4084933() {
|
|
|
|
TimeZone *tz = TimeZone::createTimeZone("PST");
|
|
|
|
|
|
|
|
int32_t offset1 = tz->getOffset(1,
|
|
|
|
1997, Calendar::OCTOBER, 26, Calendar::SUNDAY, (2*60*60*1000));
|
|
|
|
int32_t offset2 = tz->getOffset(1,
|
|
|
|
1997, Calendar::OCTOBER, 26, Calendar::SUNDAY, (2*60*60*1000)-1);
|
|
|
|
|
|
|
|
int32_t offset3 = tz->getOffset(1,
|
|
|
|
1997, Calendar::OCTOBER, 26, Calendar::SUNDAY, (1*60*60*1000));
|
|
|
|
int32_t offset4 = tz->getOffset(1,
|
|
|
|
1997, Calendar::OCTOBER, 26, Calendar::SUNDAY, (1*60*60*1000)-1);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The following was added just for consistency. It shows that going *to* Daylight
|
|
|
|
* Savings Time (PDT) does work at 2am.
|
|
|
|
*/
|
|
|
|
|
|
|
|
int32_t offset5 = tz->getOffset(1,
|
|
|
|
1997, Calendar::APRIL, 6, Calendar::SUNDAY, (2*60*60*1000));
|
|
|
|
int32_t offset6 = tz->getOffset(1,
|
|
|
|
1997, Calendar::APRIL, 6, Calendar::SUNDAY, (2*60*60*1000)-1);
|
|
|
|
|
|
|
|
int32_t offset7 = tz->getOffset(1,
|
|
|
|
1997, Calendar::APRIL, 6, Calendar::SUNDAY, (1*60*60*1000));
|
|
|
|
int32_t offset8 = tz->getOffset(1,
|
|
|
|
1997, Calendar::APRIL, 6, Calendar::SUNDAY, (1*60*60*1000)-1);
|
|
|
|
|
|
|
|
int32_t SToffset = -8 * 60*60*1000L;
|
|
|
|
int32_t DToffset = -7 * 60*60*1000L;
|
|
|
|
if (offset1 != SToffset || offset2 != SToffset ||
|
|
|
|
offset3 != SToffset || offset4 != DToffset ||
|
|
|
|
offset5 != DToffset || offset6 != SToffset ||
|
|
|
|
offset7 != SToffset || offset8 != SToffset)
|
|
|
|
errln("Fail: TimeZone misbehaving");
|
|
|
|
|
|
|
|
delete tz;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4096952
|
|
|
|
*/
|
|
|
|
void TimeZoneRegressionTest:: Test4096952() {
|
|
|
|
// {sfb} serialization not applicable
|
|
|
|
/*
|
|
|
|
UnicodeString ZONES [] = { UnicodeString("GMT"), UnicodeString("MET"), UnicodeString("IST") };
|
|
|
|
bool_t pass = TRUE;
|
|
|
|
//try {
|
|
|
|
for (int32_t i=0; i < ZONES.length; ++i) {
|
|
|
|
TimeZone *zone = TimeZone::createTimeZone(ZONES[i]);
|
|
|
|
UnicodeString id;
|
|
|
|
if (zone->getID(id) != ZONES[i])
|
|
|
|
errln("Fail: Test broken; zones not instantiating");
|
|
|
|
|
|
|
|
ByteArrayOutputStream baos;
|
|
|
|
ObjectOutputStream ostream =
|
|
|
|
new ObjectOutputStream(baos = new
|
|
|
|
ByteArrayOutputStream());
|
|
|
|
ostream.writeObject(zone);
|
|
|
|
ostream.close();
|
|
|
|
baos.close();
|
|
|
|
ObjectInputStream istream =
|
|
|
|
new ObjectInputStream(new
|
|
|
|
ByteArrayInputStream(baos.toByteArray()));
|
|
|
|
TimeZone frankenZone = (TimeZone) istream.readObject();
|
|
|
|
//logln("Zone: " + zone);
|
|
|
|
//logln("FrankenZone: " + frankenZone);
|
|
|
|
if (!zone.equals(frankenZone)) {
|
|
|
|
logln("TimeZone " + zone.getID() +
|
|
|
|
" not equal to serialized/deserialized one");
|
|
|
|
pass = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!pass) errln("Fail: TimeZone serialization/equality bug");
|
|
|
|
}
|
|
|
|
catch (IOException e) {
|
|
|
|
errln("Fail: " + e);
|
|
|
|
e.print32_tStackTrace();
|
|
|
|
}
|
|
|
|
catch (ClassNotFoundException e) {
|
|
|
|
errln("Fail: " + e);
|
|
|
|
e.print32_tStackTrace();
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4109314
|
|
|
|
*/
|
|
|
|
void TimeZoneRegressionTest:: Test4109314() {
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
GregorianCalendar *testCal = (GregorianCalendar*)Calendar::createInstance(status);
|
|
|
|
failure(status, "Calendar::createInstance");
|
|
|
|
TimeZone *PST = TimeZone::createTimeZone("PST");
|
|
|
|
/*Object[] testData = {
|
|
|
|
PST, new Date(98,Calendar.APRIL,4,22,0), new Date(98, Calendar.APRIL, 5,6,0),
|
|
|
|
PST, new Date(98,Calendar.OCTOBER,24,22,0), new Date(98,Calendar.OCTOBER,25,6,0),
|
|
|
|
};*/
|
|
|
|
UDate testData [] = {
|
|
|
|
CalendarRegressionTest::makeDate(98,Calendar::APRIL,4,22,0),
|
|
|
|
CalendarRegressionTest::makeDate(98, Calendar::APRIL,5,6,0),
|
|
|
|
CalendarRegressionTest::makeDate(98,Calendar::OCTOBER,24,22,0),
|
|
|
|
CalendarRegressionTest::makeDate(98,Calendar::OCTOBER,25,6,0)
|
|
|
|
};
|
|
|
|
bool_t pass = TRUE;
|
|
|
|
for (int32_t i = 0; i < 4; i+=2) {
|
|
|
|
//testCal->setTimeZone((TimeZone) testData[i]);
|
|
|
|
testCal->setTimeZone(*PST);
|
|
|
|
UDate t = testData[i];
|
|
|
|
UDate end = testData[i+1];
|
|
|
|
while(testCal->getTime(status) < end) {
|
|
|
|
testCal->setTime(t, status);
|
|
|
|
if ( ! checkCalendar314(testCal, PST))
|
|
|
|
pass = FALSE;
|
|
|
|
t += 60*60*1000.0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( ! pass)
|
|
|
|
errln("Fail: TZ API inconsistent");
|
|
|
|
|
|
|
|
delete testCal;
|
|
|
|
delete PST;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool_t
|
|
|
|
TimeZoneRegressionTest::checkCalendar314(GregorianCalendar *testCal, TimeZone *testTZ)
|
|
|
|
{
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
// GregorianCalendar testCal = (GregorianCalendar)aCal.clone();
|
|
|
|
|
|
|
|
int32_t tzOffset, tzRawOffset;
|
|
|
|
float tzOffsetFloat,tzRawOffsetFloat;
|
|
|
|
// Here is where the user made an error. They were passing in the value of
|
|
|
|
// the MILLSECOND field; you need to pass in the millis in the day in STANDARD
|
|
|
|
// time.
|
|
|
|
UDate millis = testCal->get(Calendar::MILLISECOND, status) +
|
|
|
|
1000.0 * (testCal->get(Calendar::SECOND, status) +
|
|
|
|
60.0 * (testCal->get(Calendar::MINUTE, status) +
|
|
|
|
60.0 * (testCal->get(Calendar::HOUR_OF_DAY, status)))) -
|
|
|
|
testCal->get(Calendar::DST_OFFSET, status);
|
|
|
|
|
|
|
|
/* Fix up millis to be in range. ASSUME THAT WE ARE NOT AT THE
|
|
|
|
* BEGINNING OR END OF A MONTH. We must add this code because
|
|
|
|
* getOffset() has been changed to be more strict about the parameters
|
|
|
|
* it receives -- it turns out that this test was passing in illegal
|
|
|
|
* values. */
|
|
|
|
int32_t date = testCal->get(Calendar::DATE, status);
|
|
|
|
int32_t dow = testCal->get(Calendar::DAY_OF_WEEK, status);
|
|
|
|
while(millis < 0) {
|
|
|
|
millis += kMillisPerDay;
|
|
|
|
--date;
|
|
|
|
dow = Calendar::SUNDAY + ((dow - Calendar::SUNDAY + 6) % 7);
|
|
|
|
}
|
|
|
|
while (millis >= kMillisPerDay) {
|
|
|
|
millis -= kMillisPerDay;
|
|
|
|
++date;
|
|
|
|
dow = Calendar::SUNDAY + ((dow - Calendar::SUNDAY + 1) % 7);
|
|
|
|
}
|
|
|
|
|
|
|
|
tzOffset = testTZ->getOffset((uint8_t)testCal->get(Calendar::ERA, status),
|
|
|
|
testCal->get(Calendar::YEAR, status),
|
|
|
|
testCal->get(Calendar::MONTH, status),
|
|
|
|
date,
|
|
|
|
(uint8_t)dow,
|
|
|
|
(int32_t)millis,
|
|
|
|
status);
|
|
|
|
tzRawOffset = testTZ->getRawOffset();
|
|
|
|
tzOffsetFloat = (float)tzOffset/(float)3600000;
|
|
|
|
tzRawOffsetFloat = (float)tzRawOffset/(float)3600000;
|
|
|
|
|
|
|
|
UDate testDate = testCal->getTime(status);
|
|
|
|
|
|
|
|
bool_t inDaylightTime = testTZ->inDaylightTime(testDate, status);
|
|
|
|
SimpleDateFormat *sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm", status);
|
|
|
|
sdf->setCalendar(*testCal);
|
|
|
|
UnicodeString inDaylightTimeString;
|
|
|
|
|
|
|
|
bool_t passed;
|
|
|
|
|
|
|
|
if(inDaylightTime)
|
|
|
|
{
|
|
|
|
inDaylightTimeString = " DST ";
|
|
|
|
passed = (tzOffset == (tzRawOffset + 3600000));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
inDaylightTimeString = " ";
|
|
|
|
passed = (tzOffset == tzRawOffset);
|
|
|
|
}
|
|
|
|
|
|
|
|
UnicodeString output;
|
|
|
|
FieldPosition pos(0);
|
|
|
|
output = testTZ->getID(output) + " " + sdf->format(testDate, output, pos) +
|
|
|
|
" Offset(" + tzOffsetFloat + ")" +
|
|
|
|
" RawOffset(" + tzRawOffsetFloat + ")" +
|
|
|
|
" " + millis/(float)3600000 + " " +
|
|
|
|
inDaylightTimeString;
|
|
|
|
|
|
|
|
if (passed)
|
|
|
|
output += " ";
|
|
|
|
else
|
|
|
|
output += "ERROR";
|
|
|
|
|
|
|
|
if (passed)
|
|
|
|
logln(output);
|
|
|
|
else
|
|
|
|
errln(output);
|
|
|
|
|
|
|
|
delete sdf;
|
|
|
|
return passed;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4126678
|
|
|
|
* CANNOT REPRODUDE
|
|
|
|
*
|
|
|
|
* Yet another _alleged_ bug in TimeZone::getOffset(), a method that never
|
|
|
|
* should have been made public. It's simply too hard to use correctly.
|
|
|
|
*
|
|
|
|
* The original test code failed to do the following:
|
|
|
|
* (1) Call Calendar::setTime() before getting the fields!
|
|
|
|
* (2) Use the right millis (as usual) for getOffset(); they were passing
|
|
|
|
* in the MILLIS field, instead of the STANDARD MILLIS IN DAY.
|
|
|
|
* When you fix these two problems, the test passes, as expected.
|
|
|
|
*/
|
|
|
|
void TimeZoneRegressionTest:: Test4126678()
|
|
|
|
{
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
Calendar *cal = Calendar::createInstance(status);
|
|
|
|
failure(status, "Calendar::createInstance");
|
|
|
|
TimeZone *tz = TimeZone::createTimeZone("PST");
|
|
|
|
cal->adoptTimeZone(tz);
|
|
|
|
|
|
|
|
cal->set(1998 - 1900, Calendar::APRIL, 5, 10, 0);
|
|
|
|
//Date dt = new Date(1998-1900, Calendar::APRIL, 5, 10, 0);
|
|
|
|
|
|
|
|
if (! tz->inDaylightTime(cal->getTime(status), status) || FAILURE(status))
|
|
|
|
errln("We're not in Daylight Savings Time and we should be.\n");
|
|
|
|
|
|
|
|
//cal.setTime(dt);
|
|
|
|
int32_t era = cal->get(Calendar::ERA, status);
|
|
|
|
int32_t year = cal->get(Calendar::YEAR, status);
|
|
|
|
int32_t month = cal->get(Calendar::MONTH, status);
|
|
|
|
int32_t day = cal->get(Calendar::DATE, status);
|
|
|
|
int32_t dayOfWeek = cal->get(Calendar::DAY_OF_WEEK, status);
|
|
|
|
int32_t millis = cal->get(Calendar::MILLISECOND, status) +
|
|
|
|
(cal->get(Calendar::SECOND, status) +
|
|
|
|
(cal->get(Calendar::MINUTE, status) +
|
|
|
|
(cal->get(Calendar::HOUR, status) * 60) * 60) * 1000) -
|
|
|
|
cal->get(Calendar::DST_OFFSET, status);
|
|
|
|
|
|
|
|
failure(status, "cal->get");
|
|
|
|
int32_t offset = tz->getOffset((uint8_t)era, year, month, day, (uint8_t)dayOfWeek, millis);
|
|
|
|
int32_t raw_offset = tz->getRawOffset();
|
|
|
|
if (offset == raw_offset)
|
|
|
|
errln("Offsets should not match when in DST");
|
|
|
|
|
|
|
|
delete cal;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4151406
|
|
|
|
* TimeZone::getAvailableIDs(int32_t) throws exception for certain values,
|
|
|
|
* due to a faulty constant in TimeZone::java.
|
|
|
|
*/
|
|
|
|
void TimeZoneRegressionTest:: Test4151406() {
|
|
|
|
int32_t max = 0;
|
|
|
|
for (int32_t h=-28; h<=30; ++h) {
|
|
|
|
// h is in half-hours from GMT; rawoffset is in millis
|
|
|
|
int32_t rawoffset = h * 1800000;
|
|
|
|
int32_t hh = (h<0) ? -h : h;
|
|
|
|
UnicodeString hname = ((h<0) ? UnicodeString("GMT-") : UnicodeString("GMT+")) +
|
|
|
|
((hh/2 < 10) ? "0" : "") +
|
|
|
|
(hh/2) + ':' +
|
|
|
|
((hh%2==0) ? "00" : "30");
|
|
|
|
//try {
|
|
|
|
int32_t count;
|
|
|
|
const UnicodeString **ids = TimeZone::createAvailableIDs(rawoffset, count);
|
|
|
|
if (count> max)
|
|
|
|
max = count;
|
|
|
|
logln(hname + ' ' + count +
|
|
|
|
((count > 0) ? (" e.g. " + *ids[0]) : UnicodeString("")));
|
|
|
|
delete [] ids;
|
|
|
|
/*} catch (Exception e) {
|
|
|
|
errln(hname + ' ' + "Fail: " + e);
|
|
|
|
}*/
|
|
|
|
}
|
|
|
|
logln("Maximum zones per offset = " + max);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4151429
|
|
|
|
*/
|
|
|
|
void TimeZoneRegressionTest:: Test4151429() {
|
|
|
|
// {sfb} silly test in C++, since we are using an enum and not an int
|
|
|
|
//try {
|
|
|
|
/*TimeZone *tz = TimeZone::createTimeZone("GMT");
|
|
|
|
UnicodeString name;
|
|
|
|
tz->getDisplayName(TRUE, TimeZone::LONG,
|
|
|
|
Locale.getDefault(), name);
|
|
|
|
errln("IllegalArgumentException not thrown by TimeZone::getDisplayName()");*/
|
|
|
|
//} catch(IllegalArgumentException e) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4154537
|
|
|
|
* SimpleTimeZone::hasSameRules() doesn't work for zones with no DST
|
|
|
|
* and different DST parameters.
|
|
|
|
*/
|
|
|
|
void TimeZoneRegressionTest:: Test4154537() {
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
// tz1 and tz2 have no DST and different rule parameters
|
|
|
|
SimpleTimeZone *tz1 = new SimpleTimeZone(0, "1", 0, 0, 0, 0, 2, 0, 0, 0, status);
|
|
|
|
SimpleTimeZone *tz2 = new SimpleTimeZone(0, "2", 1, 0, 0, 0, 3, 0, 0, 0, status);
|
|
|
|
// tza and tzA have the same rule params
|
|
|
|
SimpleTimeZone *tza = new SimpleTimeZone(0, "a", 0, 1, 0, 0, 3, 2, 0, 0, status);
|
|
|
|
SimpleTimeZone *tzA = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 3, 2, 0, 0, status);
|
|
|
|
// tzb differs from tza
|
|
|
|
SimpleTimeZone *tzb = new SimpleTimeZone(0, "b", 0, 1, 0, 0, 3, 1, 0, 0, status);
|
|
|
|
|
|
|
|
if(FAILURE(status))
|
|
|
|
errln("Couldn't create TimeZones");
|
|
|
|
|
|
|
|
if (tz1->useDaylightTime() || tz2->useDaylightTime() ||
|
|
|
|
!tza->useDaylightTime() || !tzA->useDaylightTime() ||
|
|
|
|
!tzb->useDaylightTime()) {
|
|
|
|
errln("Test is broken -- rewrite it");
|
|
|
|
}
|
|
|
|
if (!tza->hasSameRules(*tzA) || tza->hasSameRules(*tzb)) {
|
|
|
|
errln("Fail: hasSameRules() broken for zones with rules");
|
|
|
|
}
|
|
|
|
if (!tz1->hasSameRules(*tz2)) {
|
|
|
|
errln("Fail: hasSameRules() returns false for zones without rules");
|
|
|
|
//errln("zone 1 = " + tz1);
|
|
|
|
//errln("zone 2 = " + tz2);
|
|
|
|
}
|
|
|
|
|
|
|
|
delete tz1;
|
|
|
|
delete tz2;
|
|
|
|
delete tza;
|
|
|
|
delete tzA;
|
|
|
|
delete tzb;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4154542
|
|
|
|
* SimpleTimeZOne constructors, setStartRule(), and setEndRule() don't
|
|
|
|
* check for out-of-range arguments.
|
|
|
|
*/
|
|
|
|
void TimeZoneRegressionTest:: Test4154542()
|
|
|
|
{
|
|
|
|
const int32_t GOOD = 1;
|
|
|
|
const int32_t BAD = 0;
|
|
|
|
|
|
|
|
const int32_t GOOD_MONTH = Calendar::JANUARY;
|
|
|
|
const int32_t GOOD_DAY = 1;
|
|
|
|
const int32_t GOOD_DAY_OF_WEEK = Calendar::SUNDAY;
|
|
|
|
const int32_t GOOD_TIME = 0;
|
|
|
|
|
|
|
|
int32_t DATA [] = {
|
|
|
|
GOOD, INT_MIN, 0, INT_MAX, INT_MIN,
|
|
|
|
GOOD, Calendar::JANUARY, -5, Calendar::SUNDAY, 0,
|
|
|
|
GOOD, Calendar::DECEMBER, 5, Calendar::SATURDAY, 24*60*60*1000,
|
|
|
|
BAD, Calendar::DECEMBER, 5, Calendar::SATURDAY, 24*60*60*1000+1,
|
|
|
|
BAD, Calendar::DECEMBER, 5, Calendar::SATURDAY, -1,
|
|
|
|
BAD, Calendar::JANUARY, -6, Calendar::SUNDAY, 0,
|
|
|
|
BAD, Calendar::DECEMBER, 6, Calendar::SATURDAY, 24*60*60*1000,
|
|
|
|
GOOD, Calendar::DECEMBER, 1, 0, 0,
|
|
|
|
GOOD, Calendar::DECEMBER, 31, 0, 0,
|
|
|
|
BAD, Calendar::APRIL, 31, 0, 0,
|
|
|
|
BAD, Calendar::DECEMBER, 32, 0, 0,
|
|
|
|
BAD, Calendar::JANUARY-1, 1, Calendar::SUNDAY, 0,
|
|
|
|
BAD, Calendar::DECEMBER+1, 1, Calendar::SUNDAY, 0,
|
|
|
|
GOOD, Calendar::DECEMBER, 31, -Calendar::SUNDAY, 0,
|
|
|
|
GOOD, Calendar::DECEMBER, 31, -Calendar::SATURDAY, 0,
|
|
|
|
BAD, Calendar::DECEMBER, 32, -Calendar::SATURDAY, 0,
|
|
|
|
BAD, Calendar::DECEMBER, -32, -Calendar::SATURDAY, 0,
|
|
|
|
BAD, Calendar::DECEMBER, 31, -Calendar::SATURDAY-1, 0,
|
|
|
|
};
|
|
|
|
SimpleTimeZone *zone = new SimpleTimeZone(0, "Z");
|
|
|
|
for (int32_t i=0; i < 18*5; i+=5) {
|
|
|
|
bool_t shouldBeGood = (DATA[i] == GOOD);
|
|
|
|
int32_t month = DATA[i+1];
|
|
|
|
int32_t day = DATA[i+2];
|
|
|
|
int32_t dayOfWeek = DATA[i+3];
|
|
|
|
int32_t time = DATA[i+4];
|
|
|
|
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
|
|
|
|
//Exception ex = null;
|
|
|
|
//try {
|
|
|
|
zone->setStartRule(month, day, dayOfWeek, time, status);
|
|
|
|
//} catch (IllegalArgumentException e) {
|
|
|
|
// ex = e;
|
|
|
|
//}
|
|
|
|
if (SUCCESS(status) != shouldBeGood) {
|
|
|
|
errln(UnicodeString("setStartRule(month=") + month + ", day=" + day +
|
|
|
|
", dayOfWeek=" + dayOfWeek + ", time=" + time +
|
|
|
|
(shouldBeGood ? (") should work")
|
|
|
|
: ") should fail but doesn't"));
|
|
|
|
}
|
|
|
|
|
|
|
|
//ex = null;
|
|
|
|
//try {
|
1999-10-07 00:07:53 +00:00
|
|
|
status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
zone->setEndRule(month, day, dayOfWeek, time, status);
|
|
|
|
//} catch (IllegalArgumentException e) {
|
|
|
|
// ex = e;
|
|
|
|
//}
|
|
|
|
if (SUCCESS(status) != shouldBeGood) {
|
|
|
|
errln(UnicodeString("setEndRule(month=") + month + ", day=" + day +
|
|
|
|
", dayOfWeek=" + dayOfWeek + ", time=" + time +
|
|
|
|
(shouldBeGood ? (") should work")
|
|
|
|
: ") should fail but doesn't"));
|
|
|
|
}
|
|
|
|
|
|
|
|
//ex = null;
|
|
|
|
//try {
|
|
|
|
// {sfb} need to look into ctor problems! (UErrorCode vs. dst signature confusion)
|
1999-10-07 00:07:53 +00:00
|
|
|
status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
SimpleTimeZone *temp = new SimpleTimeZone(0, "Z",
|
|
|
|
(int8_t)month, (int8_t)day, (int8_t)dayOfWeek, time,
|
|
|
|
(int8_t)GOOD_MONTH, (int8_t)GOOD_DAY, (int8_t)GOOD_DAY_OF_WEEK,
|
|
|
|
GOOD_TIME,status);
|
|
|
|
//} catch (IllegalArgumentException e) {
|
|
|
|
// ex = e;
|
|
|
|
//}
|
|
|
|
if (SUCCESS(status) != shouldBeGood) {
|
|
|
|
errln(UnicodeString("SimpleTimeZone(month=") + month + ", day=" + day +
|
|
|
|
", dayOfWeek=" + dayOfWeek + ", time=" + time +
|
|
|
|
(shouldBeGood ? (", <end>) should work")// + ex)
|
|
|
|
: ", <end>) should fail but doesn't"));
|
|
|
|
}
|
|
|
|
|
|
|
|
delete temp;
|
|
|
|
//ex = null;
|
|
|
|
//try {
|
1999-10-07 00:07:53 +00:00
|
|
|
status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
temp = new SimpleTimeZone(0, "Z",
|
|
|
|
(int8_t)GOOD_MONTH, (int8_t)GOOD_DAY, (int8_t)GOOD_DAY_OF_WEEK,
|
|
|
|
GOOD_TIME,
|
|
|
|
(int8_t)month, (int8_t)day, (int8_t)dayOfWeek, time,status);
|
|
|
|
//} catch (IllegalArgumentException e) {
|
|
|
|
// ex = e;
|
|
|
|
//}
|
|
|
|
if (SUCCESS(status) != shouldBeGood) {
|
|
|
|
errln(UnicodeString("SimpleTimeZone(<start>, month=") + month + ", day=" + day +
|
|
|
|
", dayOfWeek=" + dayOfWeek + ", time=" + time +
|
|
|
|
(shouldBeGood ? (") should work")// + ex)
|
|
|
|
: ") should fail but doesn't"));
|
|
|
|
}
|
|
|
|
delete temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4154525
|
|
|
|
* SimpleTimeZone accepts illegal DST savings values. These values
|
|
|
|
* must be non-zero. There is no upper limit at this time.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
TimeZoneRegressionTest::Test4154525()
|
|
|
|
{
|
|
|
|
const int32_t GOOD = 1, BAD = 0;
|
|
|
|
|
|
|
|
int32_t DATA [] = {
|
|
|
|
1, GOOD,
|
|
|
|
0, BAD,
|
|
|
|
-1, BAD,
|
|
|
|
60*60*1000, GOOD,
|
|
|
|
LONG_MIN, BAD,
|
|
|
|
// Integer.MAX_VALUE, ?, // no upper limit on DST savings at this time
|
|
|
|
};
|
|
|
|
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
for(int32_t i = 0; i < 10; i+=2) {
|
|
|
|
int32_t savings = DATA[i];
|
|
|
|
bool_t valid = DATA[i+1] == GOOD;
|
|
|
|
UnicodeString method;
|
|
|
|
for(int32_t j=0; j < 2; ++j) {
|
|
|
|
SimpleTimeZone *z;
|
|
|
|
switch (j) {
|
|
|
|
case 0:
|
|
|
|
method = "constructor";
|
|
|
|
z = new SimpleTimeZone(0, "id",
|
|
|
|
Calendar::JANUARY, 1, 0, 0,
|
|
|
|
Calendar::MARCH, 1, 0, 0,
|
|
|
|
savings, status); // <- what we're interested in
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
method = "setDSTSavings()";
|
|
|
|
z = new SimpleTimeZone(0, "GMT");
|
|
|
|
z->setDSTSavings(savings, status);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(FAILURE(status)) {
|
|
|
|
if(valid) {
|
|
|
|
errln(UnicodeString("Fail: DST savings of ") + savings + " to " + method + " gave " + errorName(status));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
logln(UnicodeString("Pass: DST savings of ") + savings + " to " + method + " gave " + errorName(status));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if(valid) {
|
|
|
|
logln(UnicodeString("Pass: DST savings of ") + savings + " accepted by " + method);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
errln(UnicodeString("Fail: DST savings of ") + savings + " accepted by " + method);
|
|
|
|
}
|
|
|
|
}
|
1999-10-07 00:07:53 +00:00
|
|
|
status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
delete z;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4154650
|
|
|
|
* SimpleTimeZone.getOffset accepts illegal arguments.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
TimeZoneRegressionTest::Test4154650()
|
|
|
|
{
|
|
|
|
const int32_t GOOD = 1, BAD = 0;
|
|
|
|
const int32_t GOOD_ERA = GregorianCalendar::AD, GOOD_YEAR = 1998, GOOD_MONTH = Calendar::AUGUST;
|
|
|
|
const int32_t GOOD_DAY = 2, GOOD_DOW = Calendar::SUNDAY, GOOD_TIME = 16*3600000;
|
|
|
|
|
|
|
|
int32_t DATA []= {
|
|
|
|
GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
|
|
|
|
|
|
|
|
GOOD, GregorianCalendar::BC, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
|
|
|
|
GOOD, GregorianCalendar::AD, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
|
|
|
|
BAD, GregorianCalendar::BC-1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
|
|
|
|
BAD, GregorianCalendar::AD+1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
|
|
|
|
|
|
|
|
GOOD, GOOD_ERA, GOOD_YEAR, Calendar::JANUARY, GOOD_DAY, GOOD_DOW, GOOD_TIME,
|
|
|
|
GOOD, GOOD_ERA, GOOD_YEAR, Calendar::DECEMBER, GOOD_DAY, GOOD_DOW, GOOD_TIME,
|
|
|
|
BAD, GOOD_ERA, GOOD_YEAR, Calendar::JANUARY-1, GOOD_DAY, GOOD_DOW, GOOD_TIME,
|
|
|
|
BAD, GOOD_ERA, GOOD_YEAR, Calendar::DECEMBER+1, GOOD_DAY, GOOD_DOW, GOOD_TIME,
|
|
|
|
|
|
|
|
GOOD, GOOD_ERA, GOOD_YEAR, Calendar::JANUARY, 1, GOOD_DOW, GOOD_TIME,
|
|
|
|
GOOD, GOOD_ERA, GOOD_YEAR, Calendar::JANUARY, 31, GOOD_DOW, GOOD_TIME,
|
|
|
|
BAD, GOOD_ERA, GOOD_YEAR, Calendar::JANUARY, 0, GOOD_DOW, GOOD_TIME,
|
|
|
|
BAD, GOOD_ERA, GOOD_YEAR, Calendar::JANUARY, 32, GOOD_DOW, GOOD_TIME,
|
|
|
|
|
|
|
|
GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, Calendar::SUNDAY, GOOD_TIME,
|
|
|
|
GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, Calendar::SATURDAY, GOOD_TIME,
|
|
|
|
BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, Calendar::SUNDAY-1, GOOD_TIME,
|
|
|
|
BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, Calendar::SATURDAY+1, GOOD_TIME,
|
|
|
|
|
|
|
|
GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 0,
|
|
|
|
GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000-1,
|
|
|
|
BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, -1,
|
|
|
|
BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000,
|
|
|
|
};
|
|
|
|
|
|
|
|
int32_t dataLen = sizeof(DATA) / sizeof(DATA[0]);
|
|
|
|
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
TimeZone *tz = TimeZone::createDefault();
|
|
|
|
for(int32_t i = 0; i < dataLen; i += 7) {
|
|
|
|
bool_t good = DATA[i] == GOOD;
|
|
|
|
//IllegalArgumentException e = null;
|
|
|
|
//try {
|
|
|
|
int32_t offset = tz->getOffset((uint8_t)DATA[i+1], DATA[i+2], DATA[i+3],
|
|
|
|
DATA[i+4], (uint8_t)DATA[i+5], DATA[i+6], status);
|
|
|
|
//} catch (IllegalArgumentException ex) {
|
|
|
|
// e = ex;
|
|
|
|
//}
|
|
|
|
if(good != SUCCESS(status)) {
|
|
|
|
errln(UnicodeString("Fail: getOffset(") +
|
|
|
|
DATA[i+1] + ", " + DATA[i+2] + ", " + DATA[i+3] + ", " +
|
|
|
|
DATA[i+4] + ", " + DATA[i+5] + ", " + DATA[i+6] +
|
|
|
|
(good ? (UnicodeString(") threw ") + errorName(status)) : UnicodeString(") accepts invalid args")));
|
|
|
|
}
|
1999-10-07 00:07:53 +00:00
|
|
|
status = U_ZERO_ERROR; // reset
|
1999-08-16 21:50:52 +00:00
|
|
|
}
|
|
|
|
delete tz;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @bug 4162593
|
|
|
|
* TimeZone broken at midnight. The TimeZone code fails to handle
|
|
|
|
* transitions at midnight correctly.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
TimeZoneRegressionTest::Test4162593()
|
|
|
|
{
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
SimpleDateFormat *fmt = new SimpleDateFormat("z", Locale::US, status);
|
|
|
|
const int32_t ONE_HOUR = 60*60*1000;
|
|
|
|
|
|
|
|
SimpleTimeZone *asuncion = new SimpleTimeZone(-4*ONE_HOUR, "America/Asuncion" /*PY%sT*/,
|
|
|
|
Calendar::OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR,
|
|
|
|
Calendar::MARCH, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR, status);
|
|
|
|
|
|
|
|
/* Zone
|
|
|
|
* Starting time
|
|
|
|
* Transition expected between start+1H and start+2H
|
|
|
|
*/
|
|
|
|
TimeZone *DATA_TZ [] = {
|
|
|
|
0, 0, 0 };
|
|
|
|
|
|
|
|
int32_t DATA_INT [] [5] = {
|
|
|
|
{98, Calendar::SEPTEMBER, 30, 22, 0},
|
|
|
|
{100, Calendar::FEBRUARY, 28, 22, 0},
|
|
|
|
{100, Calendar::FEBRUARY, 29, 22, 0},
|
|
|
|
};
|
|
|
|
|
|
|
|
bool_t DATA_BOOL [] = {
|
|
|
|
TRUE,
|
|
|
|
FALSE,
|
|
|
|
TRUE,
|
|
|
|
};
|
|
|
|
|
|
|
|
UnicodeString zone [4];// = new String[4];
|
|
|
|
DATA_TZ[0] =
|
|
|
|
new SimpleTimeZone(2*ONE_HOUR, "Asia/Damascus" /*EE%sT*/,
|
|
|
|
Calendar::APRIL, 1, 0 /*DOM*/, 0*ONE_HOUR,
|
|
|
|
Calendar::OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR, status);
|
|
|
|
DATA_TZ[1] = asuncion; DATA_TZ[2] = asuncion;
|
|
|
|
|
|
|
|
for(int32_t j = 0; j < 3; j++) {
|
|
|
|
TimeZone *tz = (TimeZone*)DATA_TZ[j];
|
|
|
|
TimeZone::setDefault(*tz);
|
|
|
|
fmt->setTimeZone(*tz);
|
|
|
|
|
|
|
|
// Must construct the Date object AFTER setting the default zone
|
|
|
|
int32_t *p = (int32_t*)DATA_INT[j];
|
|
|
|
UDate d = CalendarRegressionTest::makeDate(p[0], p[1], p[2], p[3], p[4]);
|
|
|
|
bool_t transitionExpected = DATA_BOOL[j];
|
|
|
|
|
|
|
|
UnicodeString temp;
|
|
|
|
logln(tz->getID(temp) + ":");
|
|
|
|
for (int32_t i = 0; i < 4; ++i) {
|
|
|
|
FieldPosition pos(0);
|
|
|
|
zone[i].remove();
|
|
|
|
zone[i] = fmt->format(d, zone[i], pos);
|
|
|
|
logln(UnicodeString("") + i + ": " + d + " / " + zone[i]);
|
|
|
|
d += (double) ONE_HOUR;
|
|
|
|
}
|
|
|
|
if(zone[0] == zone[1] &&
|
|
|
|
(zone[1] == zone[2]) != transitionExpected &&
|
|
|
|
zone[2] == zone[3]) {
|
|
|
|
logln(UnicodeString("Ok: transition ") + transitionExpected);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
errln("Fail: boundary transition incorrect");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
delete fmt;
|
|
|
|
delete asuncion;
|
|
|
|
delete DATA_TZ[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
// test new API for JDK 1.2 8/31 putback
|
|
|
|
void
|
|
|
|
TimeZoneRegressionTest::TestJDK12API()
|
|
|
|
{
|
|
|
|
TimeZone *pst = TimeZone::createTimeZone("PST");
|
|
|
|
TimeZone *cst1 = TimeZone::createTimeZone("CST");
|
|
|
|
|
|
|
|
SimpleTimeZone *cst = 0;
|
|
|
|
|
|
|
|
if(cst1->getDynamicClassID() == SimpleTimeZone::getStaticClassID())
|
|
|
|
cst = (SimpleTimeZone*) cst1;
|
|
|
|
|
|
|
|
if(pst->hasSameRules(*cst)) {
|
|
|
|
errln("FAILURE: PST and CST have same rules");
|
|
|
|
}
|
|
|
|
|
1999-10-07 00:07:53 +00:00
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
int32_t offset1 = pst->getOffset(1,
|
|
|
|
1997, Calendar::OCTOBER, 26, Calendar::SUNDAY, (2*60*60*1000), status);
|
|
|
|
failure(status, "getOffset() failed");
|
|
|
|
|
|
|
|
|
|
|
|
int32_t offset2 = cst->getOffset(1,
|
|
|
|
1997, Calendar::OCTOBER, 26, Calendar::SUNDAY, (2*60*60*1000), 31, status);
|
|
|
|
failure(status, "getOffset() failed");
|
|
|
|
|
|
|
|
if(offset1 == offset2)
|
|
|
|
errln("FAILURE: Sunday Oct. 26 1997 2:00 has same offset for PST and CST");
|
|
|
|
|
|
|
|
// verify error checking
|
|
|
|
int32_t offset3 = pst->getOffset(1,
|
|
|
|
1997, (Calendar::EDateFields)-1, 26, Calendar::SUNDAY, (2*60*60*1000), status);
|
|
|
|
if(SUCCESS(status))
|
|
|
|
errln("FAILURE: getOffset() succeeded with -1 for month");
|
|
|
|
|
1999-10-07 00:07:53 +00:00
|
|
|
status = U_ZERO_ERROR;
|
1999-08-16 21:50:52 +00:00
|
|
|
cst->setDSTSavings(60*60*1000, status);
|
|
|
|
failure(status, "setDSTSavings() failed");
|
|
|
|
|
|
|
|
int32_t savings = cst->getDSTSavings();
|
|
|
|
if(savings != 60*60*1000) {
|
|
|
|
errln("setDSTSavings() failed");
|
|
|
|
}
|
|
|
|
|
|
|
|
delete pst;
|
|
|
|
delete cst;
|
|
|
|
}
|