From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10123 invoked by alias); 12 Apr 2007 12:36:17 -0000 Received: (qmail 10113 invoked by uid 22791); 12 Apr 2007 12:36:15 -0000 X-Spam-Check-By: sourceware.org Received: from gbenson.demon.co.uk (HELO gbenson.demon.co.uk) (80.177.220.214) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 12 Apr 2007 13:36:10 +0100 Date: Thu, 12 Apr 2007 12:36:00 -0000 From: Gary Benson To: mauve-patches@sources.redhat.com Subject: FYI: GregorianCalendar week of year checks Message-ID: <20070412123607.GC25059@redhat.com> Mail-Followup-To: mauve-patches@sources.redhat.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="JP+T4n/bALQSJXh8" Content-Disposition: inline X-IsSubscribed: yes Mailing-List: contact mauve-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: mauve-patches-owner@sourceware.org X-SW-Source: 2007/txt/msg00024.txt.bz2 --JP+T4n/bALQSJXh8 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 52 Hi all, Here be dragons... on crack! Cheers, Gary --JP+T4n/bALQSJXh8 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=patch Content-length: 5904 Index: ChangeLog =================================================================== RCS file: /cvs/mauve/mauve/ChangeLog,v retrieving revision 1.2052 diff -u -r1.2052 ChangeLog --- ChangeLog 12 Apr 2007 08:47:56 -0000 1.2052 +++ ChangeLog 12 Apr 2007 12:33:44 -0000 @@ -1,3 +1,8 @@ +2007-04-12 Gary Benson + + * gnu/testlet/java/util/GregorianCalendar/weekOfYear.java: + New test. + 2007-04-12 Gary Benson * gnu/testlet/java/util/GregorianCalendar/dayOfWeekInMonth.java: Index: gnu/testlet/java/util/GregorianCalendar/weekOfYear.java =================================================================== RCS file: gnu/testlet/java/util/GregorianCalendar/weekOfYear.java diff -N gnu/testlet/java/util/GregorianCalendar/weekOfYear.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/testlet/java/util/GregorianCalendar/weekOfYear.java 12 Apr 2007 12:33:44 -0000 @@ -0,0 +1,154 @@ +// Copyright (C) 2007 Red Hat, Inc. +// Written by Gary Benson + +// This file is part of Mauve. + +// Mauve is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or (at your option) +// any later version. + +// Mauve is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Mauve; see the file COPYING. If not, write to +// the Free Software Foundation, 59 Temple Place - Suite 330, +// Boston, MA 02111-1307, USA. + +// Tags: JDK1.1 + +package gnu.testlet.java.util.GregorianCalendar; + +import java.util.Calendar; +import java.util.GregorianCalendar; + +import gnu.testlet.Testlet; +import gnu.testlet.TestHarness; + +public class weekOfYear implements Testlet +{ + public void test(TestHarness harness) + { + GregorianCalendar d = new GregorianCalendar(); + GregorianCalendar e = new GregorianCalendar(); + + // Years whose first days are the specified weekdays + int testYears[][] = + {{2007, 1996, Calendar.MONDAY}, + {2002, 2008, Calendar.TUESDAY}, + {2003, 1992, Calendar.WEDNESDAY}, + {1998, 2004, Calendar.THURSDAY}, + {1999, 1988, Calendar.FRIDAY}, + {2005, 2000, Calendar.SATURDAY}, + {2006, 1956, Calendar.SUNDAY}}; + + // Months to test. We definitely want January here, + // to check the calculation where January 1 falls + // before week 1 of the year. + int testMonths[] = {Calendar.JANUARY, Calendar.JULY}; + + int monthLengths[] = {31, 28, 31, 30, 31, 30, + 31, 31, 30, 31, 30, 31}; + + for (int minimalDaysInFirstWeek = 1; + minimalDaysInFirstWeek <= 7; minimalDaysInFirstWeek++) { + + d.setMinimalDaysInFirstWeek(minimalDaysInFirstWeek); + e.setMinimalDaysInFirstWeek(minimalDaysInFirstWeek); + + for (int firstDayOfWeek = Calendar.SUNDAY; + firstDayOfWeek <= Calendar.SATURDAY; firstDayOfWeek++) { + + d.setFirstDayOfWeek(firstDayOfWeek); + e.setFirstDayOfWeek(firstDayOfWeek); + + for (int i = 0; i < testYears.length; i++) { + int dayOfFirst = testYears[i][2]; + + for (int leap = 0; leap <= 1; leap++) { + int year = testYears[i][leap]; + + for (int j = 0; j < testMonths.length; j++) { + int month = testMonths[j]; + + for (int day = 1; day <= 31; day++) { + + // First we set YEAR + MONTH + DAY_OF_MONTH and check + // we have DAY_OF_YEAR and WEEK_OF_YEAR correct. + + GregorianCalendar c = new GregorianCalendar(year, month, day); + c.setMinimalDaysInFirstWeek(minimalDaysInFirstWeek); + c.setFirstDayOfWeek(firstDayOfWeek); + + // Which day of the year is this? + int dayOfYear = 0; + for (int k = 0; k < month; k++) + dayOfYear += monthLengths[k]; + if (month > Calendar.FEBRUARY) + dayOfYear += leap; + dayOfYear += day; + + harness.check(c.get(Calendar.DAY_OF_YEAR) == dayOfYear); + + // Which day of the week is it? + int dayOfWeek = (dayOfFirst + dayOfYear - 2) % 7 + 1; + harness.check(c.get(Calendar.DAY_OF_WEEK) == dayOfWeek); + + // Which day of the week is the first of the year, + // relative to firstDayOfWeek. + int relativeDayOfFirst = (7 + dayOfFirst - firstDayOfWeek) % 7; + + // Which day of the year is week one, day one? + int dayOfYearOfWeek1Day1 = 1 - relativeDayOfFirst; + if ((7 - relativeDayOfFirst) < minimalDaysInFirstWeek) + dayOfYearOfWeek1Day1 += 7; + + // If we're before week one, day one then the week + // number will be with respect to the previous year. + // I think this is crack, but there you go. + int checkYear = year; + if (dayOfYear < dayOfYearOfWeek1Day1) + { + checkYear--; + if (checkYear % 4 == 0) + { + relativeDayOfFirst = (relativeDayOfFirst + 5) % 7; + dayOfYear += 366; + } + else + { + relativeDayOfFirst = (relativeDayOfFirst + 6) % 7; + dayOfYear += 365; + } + + dayOfYearOfWeek1Day1 = 1 - relativeDayOfFirst; + if ((7 - relativeDayOfFirst) < minimalDaysInFirstWeek) + dayOfYearOfWeek1Day1 += 7; + } + + // Which week of the year is this day in? + int weekOfYear = (dayOfYear - dayOfYearOfWeek1Day1 + 7) / 7; + + harness.check(c.get(Calendar.WEEK_OF_YEAR) == weekOfYear); + + // Then we set YEAR + DAY_OF_WEEK + WEEK_OF_YEAR and + // check we have MONTH and DAY_OF_MONTH correct. + + d.clear(); + d.set(Calendar.YEAR, checkYear); + d.set(Calendar.DAY_OF_WEEK, dayOfWeek); + d.set(Calendar.WEEK_OF_YEAR, weekOfYear); + harness.check(d.get(Calendar.YEAR) == year); + harness.check(d.get(Calendar.MONTH) == month); + harness.check(d.get(Calendar.DAY_OF_MONTH) == day); + } + } + } + } + } + } + } +} --JP+T4n/bALQSJXh8--