public void Test4103271() {
SimpleDateFormat sdf = new SimpleDateFormat();
int numYears=40, startYear=1997, numDays=15;
String output, testDesc;
GregorianCalendar testCal = (GregorianCalendar)Calendar.getInstance();
testCal.clear();
sdf.setCalendar(testCal);
sdf.applyPattern("d MMM yyyy");
boolean fail = false;
for (int firstDay=1; firstDay<=2; firstDay++) {
for (int minDays=1; minDays<=7; minDays++) {
testCal.setMinimalDaysInFirstWeek(minDays);
testCal.setFirstDayOfWeek(firstDay);
testDesc = ("Test" + String.valueOf(firstDay) + String.valueOf(minDays));
logln(testDesc + " => 1st day of week=" +
String.valueOf(firstDay) +
", minimum days in first week=" +
String.valueOf(minDays));
for (int j=startYear; j<=startYear+numYears; j++) {
testCal.set(j,11,25);
for(int i=0; i<numDays; i++) {
testCal.add(Calendar.DATE,1);
String calWOY;
int actWOY = testCal.get(Calendar.WEEK_OF_YEAR);
if (actWOY < 1 || actWOY > 53) {
Date d = testCal.getTime();
calWOY = String.valueOf(actWOY);
output = testDesc + " - " + sdf.format(d) + "\t";
output = output + "\t" + calWOY;
logln(output);
fail = true;
}
}
}
}
}
int[] DATA = {
3, 52, 52, 52, 52, 52, 52, 52,
1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2,
4, 52, 52, 52, 52, 52, 52, 52,
53, 53, 53, 53, 53, 53, 53,
1, 1, 1, 1, 1, 1, 1,
};
testCal.setFirstDayOfWeek(Calendar.SUNDAY);
for (int j=0; j<DATA.length; j+=22) {
logln("Minimal days in first week = " + DATA[j] +
" Week starts on Sunday");
testCal.setMinimalDaysInFirstWeek(DATA[j]);
testCal.set(1997, Calendar.DECEMBER, 21);
for (int i=0; i<21; ++i) {
int woy = testCal.get(Calendar.WEEK_OF_YEAR);
log(testCal.getTime() + " " + woy);
if (woy != DATA[j + 1 + i]) {
log(" ERROR");
fail = true;
}
//logln();
// Now compute the time from the fields, and make sure we
// get the same answer back. This is a round-trip test.
Date save = testCal.getTime();
testCal.clear();
testCal.set(Calendar.YEAR, DATA[j+1+i] < 25 ? 1998 : 1997);
testCal.set(Calendar.WEEK_OF_YEAR, DATA[j+1+i]);
testCal.set(Calendar.DAY_OF_WEEK, (i%7) + Calendar.SUNDAY);
if (!testCal.getTime().equals(save)) {
logln(" Parse failed: " + testCal.getTime());
fail= true;
}
testCal.setTime(save);
testCal.add(Calendar.DAY_OF_MONTH, 1);
}
}
Date d[] = new Date[8];
java.util.Calendar tempcal = java.util.Calendar.getInstance();
tempcal.clear();
tempcal.set(1997, Calendar.DECEMBER, 28);
d[0] = tempcal.getTime();
tempcal.set(1998, Calendar.JANUARY, 10);
d[1] = tempcal.getTime();
tempcal.set(1998, Calendar.DECEMBER, 31);
d[2] = tempcal.getTime();
tempcal.set(1999, Calendar.JANUARY, 1);
d[3] = tempcal.getTime();
// Test field disambiguation with a few special hard-coded cases.
// This shouldn't fail if the above cases aren't failing.
Object[] DISAM = {
new Integer(1998), new Integer(1), new Integer(Calendar.SUNDAY),
d[0],
new Integer(1998), new Integer(2), new Integer(Calendar.SATURDAY),
d[1],
new Integer(1998), new Integer(53), new Integer(Calendar.THURSDAY),
d[2],
new Integer(1998), new Integer(53), new Integer(Calendar.FRIDAY),
d[3],
};
testCal.setMinimalDaysInFirstWeek(3);
testCal.setFirstDayOfWeek(Calendar.SUNDAY);
for (int i=0; i<DISAM.length; i+=4) {
int y = ((Integer)DISAM[i]).intValue();
int woy = ((Integer)DISAM[i+1]).intValue();
int dow = ((Integer)DISAM[i+2]).intValue();
Date exp = (Date)DISAM[i+3];
testCal.clear();
testCal.set(Calendar.YEAR, y);
testCal.set(Calendar.WEEK_OF_YEAR, woy);
testCal.set(Calendar.DAY_OF_WEEK, dow);
log(y + "-W" + woy +
"-DOW" + dow + " expect:" + exp +
" got:" + testCal.getTime());
if (!testCal.getTime().equals(exp)) {
log(" FAIL");
fail = true;
}
//logln();
}
// Now try adding and rolling
Object ADD = new Object();
Object ROLL = new Object();
tempcal.set(1998, Calendar.DECEMBER, 25);
d[0] = tempcal.getTime();
tempcal.set(1999, Calendar.JANUARY, 1);
d[1] = tempcal.getTime();
tempcal.set(1997, Calendar.DECEMBER, 28);
d[2] = tempcal.getTime();
tempcal.set(1998, Calendar.JANUARY, 4);
d[3] = tempcal.getTime();
tempcal.set(1998, Calendar.DECEMBER, 27);
d[4] = tempcal.getTime();
tempcal.set(1997, Calendar.DECEMBER, 28);
d[5] = tempcal.getTime();
tempcal.set(1999, Calendar.JANUARY, 2);
d[6] = tempcal.getTime();
tempcal.set(1998, Calendar.JANUARY, 3);
d[7] = tempcal.getTime();
Object[] ADDROLL = {
ADD, new Integer(1), d[0], d[1],
ADD, new Integer(1), d[2], d[3],
ROLL, new Integer(1), d[4], d[5],
ROLL, new Integer(1), d[6], d[7],
};
testCal.setMinimalDaysInFirstWeek(3);
testCal.setFirstDayOfWeek(Calendar.SUNDAY);
for (int i=0; i<ADDROLL.length; i+=4) {
int amount = ((Integer)ADDROLL[i+1]).intValue();
Date before = (Date)ADDROLL[i+2];
Date after = (Date)ADDROLL[i+3];
testCal.setTime(before);
if (ADDROLL[i] == ADD) testCal.add(Calendar.WEEK_OF_YEAR, amount);
else testCal.roll(Calendar.WEEK_OF_YEAR, amount);
log((ADDROLL[i]==ADD?"add(WOY,":"roll(WOY,") +
amount + ") " + before + " => " +
testCal.getTime());
if (!after.equals(testCal.getTime())) {
logln(" exp:" + after + " FAIL");
fail = true;
}
else logln(" ok");
testCal.setTime(after);
if (ADDROLL[i] == ADD) testCal.add(Calendar.WEEK_OF_YEAR, -amount);
else testCal.roll(Calendar.WEEK_OF_YEAR, -amount);
log((ADDROLL[i]==ADD?"add(WOY,":"roll(WOY,") +
(-amount) + ") " + after + " => " +
testCal.getTime());
if (!before.equals(testCal.getTime())) {
logln(" exp:" + before + " FAIL");
fail = true;
}
else logln(" ok");
}