http://git-wip-us.apache.org/repos/asf/wicket/blob/d32dafd6/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatePickerTest.java ---------------------------------------------------------------------- diff --git a/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatePickerTest.java b/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatePickerTest.java index 11d5ab8..a99e77f 100644 --- a/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatePickerTest.java +++ b/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatePickerTest.java @@ -1,747 +1,760 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.wicket.extensions.yui.calendar; - -import java.text.DateFormat; -import java.text.ParseException; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.Locale; -import java.util.TimeZone; - -import org.apache.wicket.Page; -import org.apache.wicket.WicketTestCase; -import org.apache.wicket.datetime.StyleDateConverter; -import org.apache.wicket.extensions.yui.calendar.DateTimeField.AM_PM; -import org.apache.wicket.protocol.http.request.WebClientInfo; -import org.apache.wicket.util.tester.DiffUtil; -import org.apache.wicket.util.tester.FormTester; -import org.joda.time.DateTimeFieldType; -import org.joda.time.DateTimeZone; -import org.joda.time.MutableDateTime; -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.DateTimeFormatter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * - */ -public class DatePickerTest extends WicketTestCase -{ - /** log. */ - private static final Logger log = LoggerFactory.getLogger(DatePickerTest.class); - - private TimeZone defaultTz = TimeZone.getDefault(); - - /** - * @see org.apache.wicket.WicketTestCase#tearDown() - */ - @Override - protected void tearDown() throws Exception - { - TimeZone.setDefault(defaultTz); - DateTimeZone.setDefault(DateTimeZone.forTimeZone(defaultTz)); - - super.tearDown(); - } - - /** - * - * @throws Exception - */ - public void test1() throws Exception - { - log.debug("=========== test1() ================="); - myTestExecution(DatesPage1.class, "DatesPage1_ExpectedResult.html"); - } - - /** - * Tests conversion of input for DateTimeField and DateField. - * - * @throws Exception - */ - public void testDateFieldInput() throws Exception - { - log.debug("=========== testDateFieldInput() ================="); - Class<? extends Page> pageClass = DatesPage2.class; - Date date = new GregorianCalendar(2010, 10, 6, 0, 0).getTime(); - tester.getSession().setLocale(Locale.GERMAN); - tester.startPage(pageClass); - tester.assertRenderedPage(pageClass); - FormTester formTester = tester.newFormTester("form"); - formTester.setValue("dateTimeField:date", "06.11.2010"); - formTester.setValue("dateTimeField:hours", "00"); - formTester.setValue("dateTimeField:minutes", "00"); - formTester.setValue("dateField:date", "06.11.2010"); - formTester.submit(); - DatesPage2 page = (DatesPage2)tester.getLastRenderedPage(); - - log.debug("orig: " + date.getTime() + "; date: " + page.date.getTime() + "; dateTime: " + - page.dateTime.getTime()); - log.debug("orig: " + date + "; date: " + page.date + "; dateTime: " + page.dateTime); - assertEquals(0, date.compareTo(page.dateTime)); - assertEquals(0, date.compareTo(page.date)); - } - - /** - * Tests conversion of input for DateTimeField and DateField when the client and server are in - * different time zones. - * - * @throws Exception - */ - public void testDateFieldInputTimezone() throws Exception - { - log.debug("=========== testDateFieldInputTimezone() ================="); - TimeZone tzClient = TimeZone.getTimeZone("America/Los_Angeles"); - TimeZone tzServer = TimeZone.getTimeZone("Europe/Berlin"); - - TimeZone.setDefault(tzServer); - DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); - - Class<? extends Page> pageClass = DatesPage2.class; - MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); - dt.setDateTime(2010, 11, 6, 0, 0, 0, 0); - Date date = new Date(dt.getMillis()); - - WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); - clientInfo.getProperties().setTimeZone(tzClient); - - tester.getSession().setLocale(Locale.GERMANY); - tester.startPage(pageClass); - tester.assertRenderedPage(pageClass); - FormTester formTester = tester.newFormTester("form"); - formTester.setValue("dateTimeField:date", "06.11.2010"); - formTester.setValue("dateTimeField:hours", "00"); - formTester.setValue("dateTimeField:minutes", "00"); - formTester.setValue("dateField:date", "06.11.2010"); - formTester.submit(); - - DatesPage2 page = (DatesPage2)tester.getLastRenderedPage(); - - log.debug("orig: " + date.getTime() + "; date: " + page.date.getTime() + "; dateTime: " + - page.dateTime.getTime()); - log.debug("orig: " + date + "; date: " + page.date + "; dateTime: " + page.dateTime); - assertEquals(0, date.compareTo(page.dateTime)); - assertEquals(0, date.compareTo(page.date)); - } - - /** - * Tests joda & jvm default time zone handling - */ - public void testJodaTimeDefaultTimeZone() - { - TimeZone origJvmDef = TimeZone.getDefault(); - DateTimeZone origJodaDef = DateTimeZone.getDefault(); - - // lets find a timezone different from current default - String newId = null; - for (String id : TimeZone.getAvailableIDs()) - { - if (!id.equals(origJvmDef.getID())) - { - newId = id; - break; - } - } - - assertNotNull(newId); - - TimeZone.setDefault(TimeZone.getTimeZone(newId)); - - TimeZone newJvmDef = TimeZone.getDefault(); - DateTimeZone newJodaDef = DateTimeZone.getDefault(); - - // if this fails we are under security manager - // and we have no right to set default timezone - assertNotSame(origJvmDef, newJvmDef); - - // this should be true because joda caches the - // default timezone and even for the first - // lookup it uses a System property if possible - // for more info see org.joda.time.DateTimeZone.getDefault() - assertSame(origJodaDef, newJodaDef); - } - - /** - * Test date conversion with the server's time zone having a different current date than the - * client time zone. - * - * @throws ParseException - */ - public void testDifferentDateTimeZoneConversion() throws ParseException - { - log.debug("=========== testDifferentDateTimeZoneConversion() ================="); - TimeZone origJvmDef = TimeZone.getDefault(); - DateTimeZone origJodaDef = DateTimeZone.getDefault(); - TimeZone tzClient = TimeZone.getTimeZone("GMT+14"); - TimeZone tzServer = TimeZone.getTimeZone("GMT-12"); - - TimeZone.setDefault(tzServer); - DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); - - Class<? extends Page> pageClass = DatesPage2.class; - MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); - dt.setDateTime(2010, 11, 6, 0, 0, 0, 0); - Date date = new Date(dt.getMillis()); - - WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); - clientInfo.getProperties().setTimeZone(tzClient); - - tester.getSession().setLocale(Locale.GERMANY); - tester.startPage(pageClass); - tester.assertRenderedPage(pageClass); - FormTester formTester = tester.newFormTester("form"); - formTester.setValue("dateTimeField:date", "06.11.2010"); - formTester.setValue("dateTimeField:hours", "00"); - formTester.setValue("dateTimeField:minutes", "00"); - formTester.setValue("dateField:date", "06.11.2010"); - formTester.submit(); - - DatesPage2 page = (DatesPage2)tester.getLastRenderedPage(); - - log.debug("orig: " + date.getTime() + "; date: " + page.date.getTime() + "; dateTime: " + - page.dateTime.getTime()); - log.debug("orig: " + date + "; date: " + page.date + "; dateTime: " + page.dateTime); - assertEquals(0, date.compareTo(page.dateTime)); - assertEquals(0, date.compareTo(page.date)); - - TimeZone.setDefault(origJvmDef); - DateTimeZone.setDefault(origJodaDef); - } - - /** - * Test date conversion with the server's time zone having a different current date than the - * client time zone using a Locale with am/pm style time. - */ - public void testDifferentDateTimeZoneConversionAMPM() - { - TimeZone origJvmDef = TimeZone.getDefault(); - DateTimeZone origJodaDef = DateTimeZone.getDefault(); - TimeZone tzClient = TimeZone.getTimeZone("GMT+14"); - TimeZone tzServer = TimeZone.getTimeZone("GMT-12"); - - TimeZone.setDefault(tzServer); - DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); - - Class<? extends Page> pageClass = DatesPage2.class; - MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); - dt.setDateTime(2010, 11, 6, 22, 0, 0, 0); - Date date = new Date(dt.getMillis()); - - WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); - clientInfo.getProperties().setTimeZone(tzClient); - - tester.getSession().setLocale(Locale.US); - tester.startPage(pageClass); - tester.assertRenderedPage(pageClass); - FormTester formTester = tester.newFormTester("form"); - formTester.setValue("dateTimeField:date", "11/06/2010"); - formTester.setValue("dateTimeField:hours", "10"); - formTester.setValue("dateTimeField:minutes", "00"); - formTester.setValue("dateTimeField:amOrPmChoice", "1"); - formTester.submit(); - - DatesPage2 page = (DatesPage2)tester.getLastRenderedPage(); - - log.debug("orig: " + date.getTime() + "; dateTime: " + page.dateTime.getTime()); - log.debug("orig: " + date + "; dateTime: " + page.dateTime); - assertEquals(0, date.compareTo(page.dateTime)); - - TimeZone.setDefault(origJvmDef); - DateTimeZone.setDefault(origJodaDef); - } - - /** - * Test time conversion for TimeField. The day, month, year of the TimeField model should not be - * changed. The hours and minutes should be converted to the server's time zone based on the - * day, month and year of the Date model. - */ - public void testTimeFieldDST() - { - TimeZone origJvmDef = TimeZone.getDefault(); - DateTimeZone origJodaDef = DateTimeZone.getDefault(); - TimeZone tzClient = TimeZone.getTimeZone("Canada/Eastern"); - TimeZone tzServer = TimeZone.getTimeZone("GMT"); - - TimeZone.setDefault(tzServer); - DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); - WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); - clientInfo.getProperties().setTimeZone(tzClient); - tester.getSession().setLocale(Locale.GERMAN); - - // Test with standard time (in client time zone) - MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); - dt.setDateTime(2010, 1, 15, 0, 0, 0, 0); - Date date = new Date(dt.getMillis()); - DatesPage2 testPage = new DatesPage2(); - testPage.time = date; - tester.startPage(testPage); - FormTester formTester = tester.newFormTester("form"); - formTester.setValue("timeField:hours", "00"); - formTester.setValue("timeField:minutes", "00"); - formTester.submit(); - assertEquals(date, testPage.time); - - // Test with daylight savings time (in client time zone) - dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); - dt.setDateTime(2010, 7, 15, 0, 0, 0, 0); - date = new Date(dt.getMillis()); - testPage = new DatesPage2(); - testPage.time = date; - tester.startPage(testPage); - formTester = tester.newFormTester("form"); - formTester.setValue("timeField:hours", "00"); - formTester.setValue("timeField:minutes", "00"); - formTester.submit(); - assertEquals(date, testPage.time); - - TimeZone.setDefault(origJvmDef); - DateTimeZone.setDefault(origJodaDef); - } - - /** - * Test StyleDateConverter with the server's time zone having a different current date than the - * client time zone. - * - * @throws ParseException - */ - public void testStyleDateConverterTimeZoneDifference() throws ParseException - { - TimeZone origJvmDef = TimeZone.getDefault(); - DateTimeZone origJodaDef = DateTimeZone.getDefault(); - - TimeZone tzClient = TimeZone.getTimeZone("GMT+14"); - TimeZone tzServer = TimeZone.getTimeZone("GMT-12"); - - TimeZone.setDefault(tzServer); - DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); - - WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); - clientInfo.getProperties().setTimeZone(tzClient); - - StyleDateConverter converter = new StyleDateConverter(true); - - Calendar cal = Calendar.getInstance(tzClient); - cal.set(2011, 10, 5, 0, 0, 0); - cal.set(Calendar.MILLISECOND, 0); - - Date dateRef = cal.getTime(); - Date date = converter.convertToObject("05.11.2011", Locale.GERMANY); - log.debug("ref: " + dateRef.getTime() + "; converted: " + date.getTime()); - log.debug("ref: " + dateRef + "; date: " + date); - assertEquals(dateRef, date); - - TimeZone.setDefault(origJvmDef); - DateTimeZone.setDefault(origJodaDef); - } - - /** - * Validates the "value" tags of the <input> fields for DateTimeField, DateField and - * TimeField when they are given Date models containing Date instances. - */ - public void testDateFieldsWithDateModels() - { - TimeZone origJvmDef = TimeZone.getDefault(); - DateTimeZone origJodaDef = DateTimeZone.getDefault(); - - TimeZone tzClient = TimeZone.getTimeZone("GMT-12"); - TimeZone tzServer = TimeZone.getTimeZone("GMT+14"); - - TimeZone.setDefault(tzServer); - DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); - WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); - clientInfo.getProperties().setTimeZone(tzClient); - - Calendar cal = Calendar.getInstance(tzServer); - cal.set(2011, 5, 15, 10, 30, 0); - cal.set(Calendar.MILLISECOND, 0); - Date date = cal.getTime(); - - DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMAN); - format.setTimeZone(tzClient); - String dateRefString = format.format(date); - cal.setTimeZone(tzClient); - String hoursRefString = Integer.toString(cal.get(Calendar.HOUR_OF_DAY)); - String minutesRefString = Integer.toString(cal.get(Calendar.MINUTE)); - - DatesPage2 testPage = new DatesPage2(); - testPage.dateTime = date; - testPage.date = date; - testPage.time = date; - tester.getSession().setLocale(Locale.GERMAN); - tester.startPage(testPage); - - String dateTimeFieldDateValue = tester.getTagByWicketId("dateTimeField") - .getChild("wicket:id", "date") - .getAttribute("value"); - assertEquals(dateRefString, dateTimeFieldDateValue); - String dateTimeFieldHoursValue = tester.getTagByWicketId("dateTimeField") - .getChild("wicket:id", "hours") - .getAttribute("value"); - assertEquals(hoursRefString, dateTimeFieldHoursValue); - String dateTimeFieldMinutesValue = tester.getTagByWicketId("dateTimeField") - .getChild("wicket:id", "minutes") - .getAttribute("value"); - assertEquals(minutesRefString, dateTimeFieldMinutesValue); - String dateFieldValue = tester.getTagByWicketId("dateField") - .getChild("wicket:id", "date") - .getAttribute("value"); - assertEquals(dateRefString, dateFieldValue); - String timeFieldHoursValue = tester.getTagByWicketId("timeField") - .getChild("wicket:id", "hours") - .getAttribute("value"); - assertEquals(hoursRefString, timeFieldHoursValue); - String timeFieldMinutesValue = tester.getTagByWicketId("timeField") - .getChild("wicket:id", "minutes") - .getAttribute("value"); - assertEquals(minutesRefString, timeFieldMinutesValue); - - TimeZone.setDefault(origJvmDef); - DateTimeZone.setDefault(origJodaDef); - } - - /** - * - * @throws ParseException - */ - public void testDates1() throws ParseException - { - log.debug("=========== testDates1() ================="); - TimeZone tzClient = TimeZone.getTimeZone("America/Los_Angeles"); - TimeZone tzServer = TimeZone.getTimeZone("Europe/Berlin"); - - TimeZone.setDefault(tzServer); - DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); - Locale.setDefault(Locale.GERMANY); - -// Date orig = convertDate("06.11.2010", null, null, null, false, tzClient); -// Date origJoda = convertDateJoda("06.11.2010", null, null, null, false, tzClient); - Date orig3 = convertDateNew("06.11.2010", null, null, null, false, tzClient); - - MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); - dt.setDateTime(2010, 11, 6, 0, 0, 0, 0); - Date date = new Date(dt.getMillis()); - - log.debug(/* "actual: " + orig.getTime() + "; joda: " + origJoda.getTime() + */"; origNew: " + - orig3.getTime() + "; expected: " + date.getTime()); - log.debug(/* "actual: " + orig + "; joda: " + origJoda + */"; origNew: " + orig3 + - "; expected: " + date); - assertEquals(date.getTime(), orig3.getTime()); -// assertEquals(date.getTime(), orig.getTime()); -// assertEquals(origJoda.getTime(), orig.getTime()); - } - - /** - * - * @throws ParseException - */ - public void testDates2() throws ParseException - { - log.debug("=========== testDates2() ================="); - TimeZone tzClient = TimeZone.getTimeZone("America/Los_Angeles"); - TimeZone tzServer = TimeZone.getTimeZone("Europe/Berlin"); - - TimeZone.setDefault(tzServer); - DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); - Locale.setDefault(Locale.GERMANY); - -// Date orig = convertDate("06.11.2010", 0, 0, AM_PM.AM, false, tzClient); -// Date origJoda = convertDateJoda("06.11.2010", 0, 0, AM_PM.AM, false, tzClient); - Date orig3 = convertDateNew("06.11.2010", 0, 0, AM_PM.AM, false, tzClient); - - MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); - dt.setDateTime(2010, 11, 6, 0, 0, 0, 0); - Date date = new Date(dt.getMillis()); - - log.debug(/* "actual: " + orig.getTime() + "; joda: " + origJoda.getTime() + */"; origNew: " + - orig3.getTime() + "; expected: " + date.getTime()); - log.debug(/* "actual: " + orig + "; joda: " + origJoda + */"; origNew: " + orig3 + - "; expected: " + date); - assertEquals(date.getTime(), orig3.getTime()); -// assertEquals(date.getTime(), orig.getTime()); -// assertEquals(origJoda.getTime(), orig.getTime()); - } - - /** - * - * @throws ParseException - */ - public void testDates3() throws ParseException - { - log.debug("=========== testDates3() ================="); - TimeZone tzClient = TimeZone.getTimeZone("America/Los_Angeles"); - TimeZone tzServer = TimeZone.getTimeZone("Europe/Berlin"); - - TimeZone.setDefault(tzServer); - DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); - Locale.setDefault(Locale.GERMANY); - -// Date orig = convertDate("06.11.2010", 12, 0, null, false, tzClient); -// Date origJoda = convertDateJoda("06.11.2010", 12, 0, null, false, tzClient); - Date orig3 = convertDateNew("06.11.2010", 12, 0, null, false, tzClient); - - MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); - dt.setDateTime(2010, 11, 6, 12, 0, 0, 0); - Date date = new Date(dt.getMillis()); - - log.debug(/* "actual: " + orig.getTime() + "; joda: " + origJoda.getTime() + */"; origNew: " + - orig3.getTime() + "; expected: " + date.getTime()); - log.debug(/* "actual: " + orig + "; joda: " + origJoda + */"; origNew: " + orig3 + - "; expected: " + date); - assertEquals(date.getTime(), orig3.getTime()); -// assertEquals(date.getTime(), orig.getTime()); -// assertEquals(origJoda.getTime(), orig.getTime()); - } - - /** - * Simulate what DateTimeField does - * - * @param dateStr - * @param hours - * @param minutes - * @param amOrPm - * @param use12HourFormat - * @param tzClient - * @return Date - * @throws ParseException - */ - public Date convertDate(final String dateStr, final Integer hours, final Integer minutes, - final AM_PM amOrPm, final boolean use12HourFormat, final TimeZone tzClient) - throws ParseException - { - log.debug(">>> convertDate()"); - Date dateFieldInput = (dateStr != null ? DateFormat.getDateInstance().parse(dateStr) : null); - - // Default to today, if date entry was invisible - final MutableDateTime date; - if (dateFieldInput != null) - { - log.debug("1. dateFieldInput: " + dateFieldInput.getTime() + " " + dateFieldInput); - date = new MutableDateTime(dateFieldInput); - } - else - { - log.debug("1. dateFieldInput: null"); - // Current date - date = new MutableDateTime(); - } - log.debug("2. mutable date: " + date.getMillis() + " " + date); - - // always set secs to 0 - date.setSecondOfMinute(0); - log.debug("3. secs = 0: " + date.getMillis() + " " + date); - - // The AM/PM field - if (use12HourFormat) - { - date.set(DateTimeFieldType.halfdayOfDay(), amOrPm == AM_PM.PM ? 1 : 0); - } - log.debug("4. AM/PM: " + date.getMillis() + " " + date); - - // The hours - if (hours == null) - { - date.setHourOfDay(0); - } - else - { - date.set(DateTimeFieldType.hourOfDay(), hours % (use12HourFormat ? 12 : 24)); - } - log.debug("5. hours: " + date.getMillis() + " " + date); - - // The minutes - if (minutes == null) - { - date.setMinuteOfHour(0); - } - else - { - date.setMinuteOfHour(minutes); - } - log.debug("6. minutes: " + date.getMillis() + " " + date); - - // Use the client timezone to properly calculate the millisecs - if (tzClient != null) - { - date.setZoneRetainFields(DateTimeZone.forTimeZone(tzClient)); - log.debug("7. zone: " + date.getMillis() + " " + date); - } - - Date rtn = new Date(date.getMillis()); - log.debug("8. final date: " + rtn.getTime() + " " + rtn); - return rtn; - } - - /** - * Simulate what DateTimeField does - * - * @param dateStr - * @param hours - * @param minutes - * @param amOrPm - * @param use12HourFormat - * @param tzClient - * @return Date - * @throws ParseException - */ - public Date convertDateNew(final String dateStr, final Integer hours, final Integer minutes, - final AM_PM amOrPm, final boolean use12HourFormat, final TimeZone tzClient) - throws ParseException - { - log.debug(">>> convertDateNew()"); - // This is what I get from field.getConvertedInput() - Date dateFieldInput = (dateStr != null ? DateFormat.getDateInstance().parse(dateStr) : null); - - // Default with "now" - if (dateFieldInput == null) - { - dateFieldInput = new Date(); - } - - // Get year, month and day ignoring any timezone of the Date object - Calendar cal = Calendar.getInstance(); - cal.setTime(dateFieldInput); - int year = cal.get(Calendar.YEAR); - int month = cal.get(Calendar.MONTH) + 1; - int day = cal.get(Calendar.DAY_OF_MONTH); - int iHours = (hours == null ? 0 : hours % 24); - int iMins = (minutes == null ? 0 : minutes); - - // Use the input to create a date object with proper timezone - MutableDateTime date = new MutableDateTime(year, month, day, iHours, iMins, 0, 0, - DateTimeZone.forTimeZone(tzClient)); - - // Use the input to create a date object. Ignore the timezone provided by dateFieldInput and - // use tzClient instead. No re-calculation will happen. It should be the same as above. -// MutableDateTime date = new MutableDateTime(dateFieldInput, -// DateTimeZone.forTimeZone(tzClient)); - log.debug("1. date: " + date.getMillis() + " " + date); - - // Adjust for halfday if needed - int halfday; - if (use12HourFormat) - { - halfday = (amOrPm == AM_PM.PM ? 1 : 0); - date.set(DateTimeFieldType.halfdayOfDay(), halfday); - date.set(DateTimeFieldType.hourOfDay(), iHours % 12); - } - log.debug("2. halfday adjustments: " + date.getMillis() + " " + date); - - Date rtn = new Date(date.getMillis()); - log.debug("3. final date: " + rtn.getTime() + " " + rtn); - return rtn; - } - - /** - * Simulate what DateTimeField does - * - * @param dateStr - * @param hours - * @param minutes - * @param amOrPm - * @param use12HourFormat - * @param tzClient - * @return Date - * @throws ParseException - */ - public Date convertDateJoda(final String dateStr, final Integer hours, final Integer minutes, - final AM_PM amOrPm, final boolean use12HourFormat, final TimeZone tzClient) - throws ParseException - { - log.debug(">>> convertDateJoda()"); - - DateTimeFormatter fmt = DateTimeFormat.shortDate(); - // fmt.withZone(timeZone).parseDateTime("10/1/06 5:00 AM"); - MutableDateTime date = (dateStr != null ? fmt.parseMutableDateTime(dateStr) - : new MutableDateTime()); - - log.debug("1. mutable date: " + date.getMillis() + " " + date); - - // always set secs to 0 - date.setSecondOfMinute(0); - log.debug("2. secs = 0: " + date.getMillis() + " " + date); - - // The AM/PM field - if (use12HourFormat) - { - date.set(DateTimeFieldType.halfdayOfDay(), amOrPm == AM_PM.PM ? 1 : 0); - } - log.debug("3. AM/PM: " + date.getMillis() + " " + date); - - // The hours - if (hours == null) - { - date.setHourOfDay(0); - } - else - { - date.set(DateTimeFieldType.hourOfDay(), hours % (use12HourFormat ? 12 : 24)); - } - log.debug("4. hours: " + date.getMillis() + " " + date); - - // The minutes - if (minutes == null) - { - date.setMinuteOfHour(0); - } - else - { - date.setMinuteOfHour(minutes); - } - log.debug("5. minutes: " + date.getMillis() + " " + date); - - // Use the client timezone to properly calculate the millisecs - if (tzClient != null) - { - date.setZoneRetainFields(DateTimeZone.forTimeZone(tzClient)); - } - log.debug("6. timezone: " + date.getMillis() + " " + date); - - Date rtn = new Date(date.getMillis()); - log.debug("7. final date: " + rtn.getTime() + " " + rtn); - return rtn; - } - - /** - * Use <code>-Dwicket.replace.expected.results=true</code> to automatically replace the expected - * output file. - * - * @param <T> - * - * @param pageClass - * @param filename - * @throws Exception - */ - protected <T extends Page> void myTestExecution(final Class<T> pageClass, final String filename) - throws Exception - { - System.out.println("=== " + pageClass.getName() + " ==="); - - tester.getSession().setLocale(Locale.GERMAN); - tester.startPage(pageClass); - tester.assertRenderedPage(pageClass); - - String document = tester.getLastResponseAsString(); - document = document.replaceAll("\\d\\d\\.\\d\\d\\.\\d\\d", "xx.xx.xx"); - document = document.replaceAll("\\d\\d/\\d\\d/\\d\\d\\d\\d", "xx.xx.xxxx"); - document = document.replaceAll("\\d\\d/\\d\\d\\d\\d", "xx.xxxx"); - - DiffUtil.validatePage(document, pageClass, filename, true); - } -} +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.extensions.yui.calendar; + +import java.text.DateFormat; +import java.text.ParseException; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.Locale; +import java.util.TimeZone; + +import org.apache.wicket.Page; +import org.apache.wicket.WicketTestCase; +import org.apache.wicket.datetime.StyleDateConverter; +import org.apache.wicket.extensions.yui.calendar.DateTimeField.AM_PM; +import org.apache.wicket.protocol.http.request.WebClientInfo; +import org.apache.wicket.util.tester.DiffUtil; +import org.apache.wicket.util.tester.FormTester; +import org.joda.time.DateTimeFieldType; +import org.joda.time.DateTimeZone; +import org.joda.time.MutableDateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + */ +public class DatePickerTest extends WicketTestCase +{ + /** log. */ + private static final Logger log = LoggerFactory.getLogger(DatePickerTest.class); + + private TimeZone defaultTz = TimeZone.getDefault(); + + /** + * @see org.apache.wicket.WicketTestCase#tearDown() + */ + @Override + protected void tearDown() throws Exception + { + TimeZone.setDefault(defaultTz); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(defaultTz)); + + super.tearDown(); + } + + /** + * + * @throws Exception + */ + @Test + public void test1() throws Exception + { + log.debug("=========== test1() ================="); + myTestExecution(DatesPage1.class, "DatesPage1_ExpectedResult.html"); + } + + /** + * Tests conversion of input for DateTimeField and DateField. + * + * @throws Exception + */ + @Test + public void testDateFieldInput() throws Exception + { + log.debug("=========== testDateFieldInput() ================="); + Class<? extends Page> pageClass = DatesPage2.class; + Date date = new GregorianCalendar(2010, 10, 6, 0, 0).getTime(); + tester.getSession().setLocale(Locale.GERMAN); + tester.startPage(pageClass); + tester.assertRenderedPage(pageClass); + FormTester formTester = tester.newFormTester("form"); + formTester.setValue("dateTimeField:date", "06.11.2010"); + formTester.setValue("dateTimeField:hours", "00"); + formTester.setValue("dateTimeField:minutes", "00"); + formTester.setValue("dateField:date", "06.11.2010"); + formTester.submit(); + DatesPage2 page = (DatesPage2)tester.getLastRenderedPage(); + + log.debug("orig: " + date.getTime() + "; date: " + page.date.getTime() + "; dateTime: " + + page.dateTime.getTime()); + log.debug("orig: " + date + "; date: " + page.date + "; dateTime: " + page.dateTime); + assertEquals(0, date.compareTo(page.dateTime)); + assertEquals(0, date.compareTo(page.date)); + } + + /** + * Tests conversion of input for DateTimeField and DateField when the client and server are in + * different time zones. + * + * @throws Exception + */ + @Test + public void testDateFieldInputTimezone() throws Exception + { + log.debug("=========== testDateFieldInputTimezone() ================="); + TimeZone tzClient = TimeZone.getTimeZone("America/Los_Angeles"); + TimeZone tzServer = TimeZone.getTimeZone("Europe/Berlin"); + + TimeZone.setDefault(tzServer); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); + + Class<? extends Page> pageClass = DatesPage2.class; + MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); + dt.setDateTime(2010, 11, 6, 0, 0, 0, 0); + Date date = new Date(dt.getMillis()); + + WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); + clientInfo.getProperties().setTimeZone(tzClient); + + tester.getSession().setLocale(Locale.GERMANY); + tester.startPage(pageClass); + tester.assertRenderedPage(pageClass); + FormTester formTester = tester.newFormTester("form"); + formTester.setValue("dateTimeField:date", "06.11.2010"); + formTester.setValue("dateTimeField:hours", "00"); + formTester.setValue("dateTimeField:minutes", "00"); + formTester.setValue("dateField:date", "06.11.2010"); + formTester.submit(); + + DatesPage2 page = (DatesPage2)tester.getLastRenderedPage(); + + log.debug("orig: " + date.getTime() + "; date: " + page.date.getTime() + "; dateTime: " + + page.dateTime.getTime()); + log.debug("orig: " + date + "; date: " + page.date + "; dateTime: " + page.dateTime); + assertEquals(0, date.compareTo(page.dateTime)); + assertEquals(0, date.compareTo(page.date)); + } + + /** + * Tests joda & jvm default time zone handling + */ + @Test + public void testJodaTimeDefaultTimeZone() + { + TimeZone origJvmDef = TimeZone.getDefault(); + DateTimeZone origJodaDef = DateTimeZone.getDefault(); + + // lets find a timezone different from current default + String newId = null; + for (String id : TimeZone.getAvailableIDs()) + { + if (!id.equals(origJvmDef.getID())) + { + newId = id; + break; + } + } + + assertNotNull(newId); + + TimeZone.setDefault(TimeZone.getTimeZone(newId)); + + TimeZone newJvmDef = TimeZone.getDefault(); + DateTimeZone newJodaDef = DateTimeZone.getDefault(); + + // if this fails we are under security manager + // and we have no right to set default timezone + assertNotSame(origJvmDef, newJvmDef); + + // this should be true because joda caches the + // default timezone and even for the first + // lookup it uses a System property if possible + // for more info see org.joda.time.DateTimeZone.getDefault() + assertSame(origJodaDef, newJodaDef); + } + + /** + * Test date conversion with the server's time zone having a different current date than the + * client time zone. + * + * @throws ParseException + */ + @Test + public void testDifferentDateTimeZoneConversion() throws ParseException + { + log.debug("=========== testDifferentDateTimeZoneConversion() ================="); + TimeZone origJvmDef = TimeZone.getDefault(); + DateTimeZone origJodaDef = DateTimeZone.getDefault(); + TimeZone tzClient = TimeZone.getTimeZone("GMT+14"); + TimeZone tzServer = TimeZone.getTimeZone("GMT-12"); + + TimeZone.setDefault(tzServer); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); + + Class<? extends Page> pageClass = DatesPage2.class; + MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); + dt.setDateTime(2010, 11, 6, 0, 0, 0, 0); + Date date = new Date(dt.getMillis()); + + WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); + clientInfo.getProperties().setTimeZone(tzClient); + + tester.getSession().setLocale(Locale.GERMANY); + tester.startPage(pageClass); + tester.assertRenderedPage(pageClass); + FormTester formTester = tester.newFormTester("form"); + formTester.setValue("dateTimeField:date", "06.11.2010"); + formTester.setValue("dateTimeField:hours", "00"); + formTester.setValue("dateTimeField:minutes", "00"); + formTester.setValue("dateField:date", "06.11.2010"); + formTester.submit(); + + DatesPage2 page = (DatesPage2)tester.getLastRenderedPage(); + + log.debug("orig: " + date.getTime() + "; date: " + page.date.getTime() + "; dateTime: " + + page.dateTime.getTime()); + log.debug("orig: " + date + "; date: " + page.date + "; dateTime: " + page.dateTime); + assertEquals(0, date.compareTo(page.dateTime)); + assertEquals(0, date.compareTo(page.date)); + + TimeZone.setDefault(origJvmDef); + DateTimeZone.setDefault(origJodaDef); + } + + /** + * Test date conversion with the server's time zone having a different current date than the + * client time zone using a Locale with am/pm style time. + */ + @Test + public void testDifferentDateTimeZoneConversionAMPM() + { + TimeZone origJvmDef = TimeZone.getDefault(); + DateTimeZone origJodaDef = DateTimeZone.getDefault(); + TimeZone tzClient = TimeZone.getTimeZone("GMT+14"); + TimeZone tzServer = TimeZone.getTimeZone("GMT-12"); + + TimeZone.setDefault(tzServer); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); + + Class<? extends Page> pageClass = DatesPage2.class; + MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); + dt.setDateTime(2010, 11, 6, 22, 0, 0, 0); + Date date = new Date(dt.getMillis()); + + WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); + clientInfo.getProperties().setTimeZone(tzClient); + + tester.getSession().setLocale(Locale.US); + tester.startPage(pageClass); + tester.assertRenderedPage(pageClass); + FormTester formTester = tester.newFormTester("form"); + formTester.setValue("dateTimeField:date", "11/06/2010"); + formTester.setValue("dateTimeField:hours", "10"); + formTester.setValue("dateTimeField:minutes", "00"); + formTester.setValue("dateTimeField:amOrPmChoice", "1"); + formTester.submit(); + + DatesPage2 page = (DatesPage2)tester.getLastRenderedPage(); + + log.debug("orig: " + date.getTime() + "; dateTime: " + page.dateTime.getTime()); + log.debug("orig: " + date + "; dateTime: " + page.dateTime); + assertEquals(0, date.compareTo(page.dateTime)); + + TimeZone.setDefault(origJvmDef); + DateTimeZone.setDefault(origJodaDef); + } + + /** + * Test time conversion for TimeField. The day, month, year of the TimeField model should not be + * changed. The hours and minutes should be converted to the server's time zone based on the + * day, month and year of the Date model. + */ + @Test + public void testTimeFieldDST() + { + TimeZone origJvmDef = TimeZone.getDefault(); + DateTimeZone origJodaDef = DateTimeZone.getDefault(); + TimeZone tzClient = TimeZone.getTimeZone("Canada/Eastern"); + TimeZone tzServer = TimeZone.getTimeZone("GMT"); + + TimeZone.setDefault(tzServer); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); + WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); + clientInfo.getProperties().setTimeZone(tzClient); + tester.getSession().setLocale(Locale.GERMAN); + + // Test with standard time (in client time zone) + MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); + dt.setDateTime(2010, 1, 15, 0, 0, 0, 0); + Date date = new Date(dt.getMillis()); + DatesPage2 testPage = new DatesPage2(); + testPage.time = date; + tester.startPage(testPage); + FormTester formTester = tester.newFormTester("form"); + formTester.setValue("timeField:hours", "00"); + formTester.setValue("timeField:minutes", "00"); + formTester.submit(); + assertEquals(date, testPage.time); + + // Test with daylight savings time (in client time zone) + dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); + dt.setDateTime(2010, 7, 15, 0, 0, 0, 0); + date = new Date(dt.getMillis()); + testPage = new DatesPage2(); + testPage.time = date; + tester.startPage(testPage); + formTester = tester.newFormTester("form"); + formTester.setValue("timeField:hours", "00"); + formTester.setValue("timeField:minutes", "00"); + formTester.submit(); + assertEquals(date, testPage.time); + + TimeZone.setDefault(origJvmDef); + DateTimeZone.setDefault(origJodaDef); + } + + /** + * Test StyleDateConverter with the server's time zone having a different current date than the + * client time zone. + * + * @throws ParseException + */ + @Test + public void testStyleDateConverterTimeZoneDifference() throws ParseException + { + TimeZone origJvmDef = TimeZone.getDefault(); + DateTimeZone origJodaDef = DateTimeZone.getDefault(); + + TimeZone tzClient = TimeZone.getTimeZone("GMT+14"); + TimeZone tzServer = TimeZone.getTimeZone("GMT-12"); + + TimeZone.setDefault(tzServer); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); + + WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); + clientInfo.getProperties().setTimeZone(tzClient); + + StyleDateConverter converter = new StyleDateConverter(true); + + Calendar cal = Calendar.getInstance(tzClient); + cal.set(2011, 10, 5, 0, 0, 0); + cal.set(Calendar.MILLISECOND, 0); + + Date dateRef = cal.getTime(); + Date date = converter.convertToObject("05.11.2011", Locale.GERMANY); + log.debug("ref: " + dateRef.getTime() + "; converted: " + date.getTime()); + log.debug("ref: " + dateRef + "; date: " + date); + assertEquals(dateRef, date); + + TimeZone.setDefault(origJvmDef); + DateTimeZone.setDefault(origJodaDef); + } + + /** + * Validates the "value" tags of the <input> fields for DateTimeField, DateField and + * TimeField when they are given Date models containing Date instances. + */ + @Test + public void testDateFieldsWithDateModels() + { + TimeZone origJvmDef = TimeZone.getDefault(); + DateTimeZone origJodaDef = DateTimeZone.getDefault(); + + TimeZone tzClient = TimeZone.getTimeZone("GMT-12"); + TimeZone tzServer = TimeZone.getTimeZone("GMT+14"); + + TimeZone.setDefault(tzServer); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); + WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); + clientInfo.getProperties().setTimeZone(tzClient); + + Calendar cal = Calendar.getInstance(tzServer); + cal.set(2011, 5, 15, 10, 30, 0); + cal.set(Calendar.MILLISECOND, 0); + Date date = cal.getTime(); + + DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMAN); + format.setTimeZone(tzClient); + String dateRefString = format.format(date); + cal.setTimeZone(tzClient); + String hoursRefString = Integer.toString(cal.get(Calendar.HOUR_OF_DAY)); + String minutesRefString = Integer.toString(cal.get(Calendar.MINUTE)); + + DatesPage2 testPage = new DatesPage2(); + testPage.dateTime = date; + testPage.date = date; + testPage.time = date; + tester.getSession().setLocale(Locale.GERMAN); + tester.startPage(testPage); + + String dateTimeFieldDateValue = tester.getTagByWicketId("dateTimeField") + .getChild("wicket:id", "date") + .getAttribute("value"); + assertEquals(dateRefString, dateTimeFieldDateValue); + String dateTimeFieldHoursValue = tester.getTagByWicketId("dateTimeField") + .getChild("wicket:id", "hours") + .getAttribute("value"); + assertEquals(hoursRefString, dateTimeFieldHoursValue); + String dateTimeFieldMinutesValue = tester.getTagByWicketId("dateTimeField") + .getChild("wicket:id", "minutes") + .getAttribute("value"); + assertEquals(minutesRefString, dateTimeFieldMinutesValue); + String dateFieldValue = tester.getTagByWicketId("dateField") + .getChild("wicket:id", "date") + .getAttribute("value"); + assertEquals(dateRefString, dateFieldValue); + String timeFieldHoursValue = tester.getTagByWicketId("timeField") + .getChild("wicket:id", "hours") + .getAttribute("value"); + assertEquals(hoursRefString, timeFieldHoursValue); + String timeFieldMinutesValue = tester.getTagByWicketId("timeField") + .getChild("wicket:id", "minutes") + .getAttribute("value"); + assertEquals(minutesRefString, timeFieldMinutesValue); + + TimeZone.setDefault(origJvmDef); + DateTimeZone.setDefault(origJodaDef); + } + + /** + * + * @throws ParseException + */ + @Test + public void testDates1() throws ParseException + { + log.debug("=========== testDates1() ================="); + TimeZone tzClient = TimeZone.getTimeZone("America/Los_Angeles"); + TimeZone tzServer = TimeZone.getTimeZone("Europe/Berlin"); + + TimeZone.setDefault(tzServer); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); + Locale.setDefault(Locale.GERMANY); + +// Date orig = convertDate("06.11.2010", null, null, null, false, tzClient); +// Date origJoda = convertDateJoda("06.11.2010", null, null, null, false, tzClient); + Date orig3 = convertDateNew("06.11.2010", null, null, null, false, tzClient); + + MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); + dt.setDateTime(2010, 11, 6, 0, 0, 0, 0); + Date date = new Date(dt.getMillis()); + + log.debug(/* "actual: " + orig.getTime() + "; joda: " + origJoda.getTime() + */"; origNew: " + + orig3.getTime() + "; expected: " + date.getTime()); + log.debug(/* "actual: " + orig + "; joda: " + origJoda + */"; origNew: " + orig3 + + "; expected: " + date); + assertEquals(date.getTime(), orig3.getTime()); +// assertEquals(date.getTime(), orig.getTime()); +// assertEquals(origJoda.getTime(), orig.getTime()); + } + + /** + * + * @throws ParseException + */ + @Test + public void testDates2() throws ParseException + { + log.debug("=========== testDates2() ================="); + TimeZone tzClient = TimeZone.getTimeZone("America/Los_Angeles"); + TimeZone tzServer = TimeZone.getTimeZone("Europe/Berlin"); + + TimeZone.setDefault(tzServer); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); + Locale.setDefault(Locale.GERMANY); + +// Date orig = convertDate("06.11.2010", 0, 0, AM_PM.AM, false, tzClient); +// Date origJoda = convertDateJoda("06.11.2010", 0, 0, AM_PM.AM, false, tzClient); + Date orig3 = convertDateNew("06.11.2010", 0, 0, AM_PM.AM, false, tzClient); + + MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); + dt.setDateTime(2010, 11, 6, 0, 0, 0, 0); + Date date = new Date(dt.getMillis()); + + log.debug(/* "actual: " + orig.getTime() + "; joda: " + origJoda.getTime() + */"; origNew: " + + orig3.getTime() + "; expected: " + date.getTime()); + log.debug(/* "actual: " + orig + "; joda: " + origJoda + */"; origNew: " + orig3 + + "; expected: " + date); + assertEquals(date.getTime(), orig3.getTime()); +// assertEquals(date.getTime(), orig.getTime()); +// assertEquals(origJoda.getTime(), orig.getTime()); + } + + /** + * + * @throws ParseException + */ + @Test + public void testDates3() throws ParseException + { + log.debug("=========== testDates3() ================="); + TimeZone tzClient = TimeZone.getTimeZone("America/Los_Angeles"); + TimeZone tzServer = TimeZone.getTimeZone("Europe/Berlin"); + + TimeZone.setDefault(tzServer); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); + Locale.setDefault(Locale.GERMANY); + +// Date orig = convertDate("06.11.2010", 12, 0, null, false, tzClient); +// Date origJoda = convertDateJoda("06.11.2010", 12, 0, null, false, tzClient); + Date orig3 = convertDateNew("06.11.2010", 12, 0, null, false, tzClient); + + MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); + dt.setDateTime(2010, 11, 6, 12, 0, 0, 0); + Date date = new Date(dt.getMillis()); + + log.debug(/* "actual: " + orig.getTime() + "; joda: " + origJoda.getTime() + */"; origNew: " + + orig3.getTime() + "; expected: " + date.getTime()); + log.debug(/* "actual: " + orig + "; joda: " + origJoda + */"; origNew: " + orig3 + + "; expected: " + date); + assertEquals(date.getTime(), orig3.getTime()); +// assertEquals(date.getTime(), orig.getTime()); +// assertEquals(origJoda.getTime(), orig.getTime()); + } + + /** + * Simulate what DateTimeField does + * + * @param dateStr + * @param hours + * @param minutes + * @param amOrPm + * @param use12HourFormat + * @param tzClient + * @return Date + * @throws ParseException + */ + public Date convertDate(final String dateStr, final Integer hours, final Integer minutes, + final AM_PM amOrPm, final boolean use12HourFormat, final TimeZone tzClient) + throws ParseException + { + log.debug(">>> convertDate()"); + Date dateFieldInput = (dateStr != null ? DateFormat.getDateInstance().parse(dateStr) : null); + + // Default to today, if date entry was invisible + final MutableDateTime date; + if (dateFieldInput != null) + { + log.debug("1. dateFieldInput: " + dateFieldInput.getTime() + " " + dateFieldInput); + date = new MutableDateTime(dateFieldInput); + } + else + { + log.debug("1. dateFieldInput: null"); + // Current date + date = new MutableDateTime(); + } + log.debug("2. mutable date: " + date.getMillis() + " " + date); + + // always set secs to 0 + date.setSecondOfMinute(0); + log.debug("3. secs = 0: " + date.getMillis() + " " + date); + + // The AM/PM field + if (use12HourFormat) + { + date.set(DateTimeFieldType.halfdayOfDay(), amOrPm == AM_PM.PM ? 1 : 0); + } + log.debug("4. AM/PM: " + date.getMillis() + " " + date); + + // The hours + if (hours == null) + { + date.setHourOfDay(0); + } + else + { + date.set(DateTimeFieldType.hourOfDay(), hours % (use12HourFormat ? 12 : 24)); + } + log.debug("5. hours: " + date.getMillis() + " " + date); + + // The minutes + if (minutes == null) + { + date.setMinuteOfHour(0); + } + else + { + date.setMinuteOfHour(minutes); + } + log.debug("6. minutes: " + date.getMillis() + " " + date); + + // Use the client timezone to properly calculate the millisecs + if (tzClient != null) + { + date.setZoneRetainFields(DateTimeZone.forTimeZone(tzClient)); + log.debug("7. zone: " + date.getMillis() + " " + date); + } + + Date rtn = new Date(date.getMillis()); + log.debug("8. final date: " + rtn.getTime() + " " + rtn); + return rtn; + } + + /** + * Simulate what DateTimeField does + * + * @param dateStr + * @param hours + * @param minutes + * @param amOrPm + * @param use12HourFormat + * @param tzClient + * @return Date + * @throws ParseException + */ + private Date convertDateNew(final String dateStr, final Integer hours, final Integer minutes, + final AM_PM amOrPm, final boolean use12HourFormat, final TimeZone tzClient) + throws ParseException + { + log.debug(">>> convertDateNew()"); + // This is what I get from field.getConvertedInput() + Date dateFieldInput = (dateStr != null ? DateFormat.getDateInstance().parse(dateStr) : null); + + // Default with "now" + if (dateFieldInput == null) + { + dateFieldInput = new Date(); + } + + // Get year, month and day ignoring any timezone of the Date object + Calendar cal = Calendar.getInstance(); + cal.setTime(dateFieldInput); + int year = cal.get(Calendar.YEAR); + int month = cal.get(Calendar.MONTH) + 1; + int day = cal.get(Calendar.DAY_OF_MONTH); + int iHours = (hours == null ? 0 : hours % 24); + int iMins = (minutes == null ? 0 : minutes); + + // Use the input to create a date object with proper timezone + MutableDateTime date = new MutableDateTime(year, month, day, iHours, iMins, 0, 0, + DateTimeZone.forTimeZone(tzClient)); + + // Use the input to create a date object. Ignore the timezone provided by dateFieldInput and + // use tzClient instead. No re-calculation will happen. It should be the same as above. +// MutableDateTime date = new MutableDateTime(dateFieldInput, +// DateTimeZone.forTimeZone(tzClient)); + log.debug("1. date: " + date.getMillis() + " " + date); + + // Adjust for halfday if needed + int halfday; + if (use12HourFormat) + { + halfday = (amOrPm == AM_PM.PM ? 1 : 0); + date.set(DateTimeFieldType.halfdayOfDay(), halfday); + date.set(DateTimeFieldType.hourOfDay(), iHours % 12); + } + log.debug("2. halfday adjustments: " + date.getMillis() + " " + date); + + Date rtn = new Date(date.getMillis()); + log.debug("3. final date: " + rtn.getTime() + " " + rtn); + return rtn; + } + + /** + * Simulate what DateTimeField does + * + * @param dateStr + * @param hours + * @param minutes + * @param amOrPm + * @param use12HourFormat + * @param tzClient + * @return Date + * @throws ParseException + */ + private Date convertDateJoda(final String dateStr, final Integer hours, final Integer minutes, + final AM_PM amOrPm, final boolean use12HourFormat, final TimeZone tzClient) + throws ParseException + { + log.debug(">>> convertDateJoda()"); + + DateTimeFormatter fmt = DateTimeFormat.shortDate(); + // fmt.withZone(timeZone).parseDateTime("10/1/06 5:00 AM"); + MutableDateTime date = (dateStr != null ? fmt.parseMutableDateTime(dateStr) + : new MutableDateTime()); + + log.debug("1. mutable date: " + date.getMillis() + " " + date); + + // always set secs to 0 + date.setSecondOfMinute(0); + log.debug("2. secs = 0: " + date.getMillis() + " " + date); + + // The AM/PM field + if (use12HourFormat) + { + date.set(DateTimeFieldType.halfdayOfDay(), amOrPm == AM_PM.PM ? 1 : 0); + } + log.debug("3. AM/PM: " + date.getMillis() + " " + date); + + // The hours + if (hours == null) + { + date.setHourOfDay(0); + } + else + { + date.set(DateTimeFieldType.hourOfDay(), hours % (use12HourFormat ? 12 : 24)); + } + log.debug("4. hours: " + date.getMillis() + " " + date); + + // The minutes + if (minutes == null) + { + date.setMinuteOfHour(0); + } + else + { + date.setMinuteOfHour(minutes); + } + log.debug("5. minutes: " + date.getMillis() + " " + date); + + // Use the client timezone to properly calculate the millisecs + if (tzClient != null) + { + date.setZoneRetainFields(DateTimeZone.forTimeZone(tzClient)); + } + log.debug("6. timezone: " + date.getMillis() + " " + date); + + Date rtn = new Date(date.getMillis()); + log.debug("7. final date: " + rtn.getTime() + " " + rtn); + return rtn; + } + + /** + * Use <code>-Dwicket.replace.expected.results=true</code> to automatically replace the expected + * output file. + * + * @param <T> + * + * @param pageClass + * @param filename + * @throws Exception + */ + protected <T extends Page> void myTestExecution(final Class<T> pageClass, final String filename) + throws Exception + { + System.out.println("=== " + pageClass.getName() + " ==="); + + tester.getSession().setLocale(Locale.GERMAN); + tester.startPage(pageClass); + tester.assertRenderedPage(pageClass); + + String document = tester.getLastResponseAsString(); + document = document.replaceAll("\\d\\d\\.\\d\\d\\.\\d\\d", "xx.xx.xx"); + document = document.replaceAll("\\d\\d/\\d\\d/\\d\\d\\d\\d", "xx.xx.xxxx"); + document = document.replaceAll("\\d\\d/\\d\\d\\d\\d", "xx.xxxx"); + + DiffUtil.validatePage(document, pageClass, filename, true); + } +}
http://git-wip-us.apache.org/repos/asf/wicket/blob/d32dafd6/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html ---------------------------------------------------------------------- diff --git a/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html b/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html index acc6554..7400398 100644 --- a/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html +++ b/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html @@ -1,6 +1,9 @@ <html xmlns="http://www.w3.org/1999/xhtml"> -<head> +<head><script type="text/javascript" src="../resource/org.apache.wicket.extensions.yui.YuiLib/yuiloader/yuiloader.js"></script> +<script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery.js"></script> +<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-event-jquery.js"></script> + <title>Wicket Examples - dates</title> <link rel="stylesheet" type="text/css" href="../../style.css"/> <style type="text/css"> @@ -11,11 +14,7 @@ th { } /*]]>*/ -</style> -<script type="text/javascript" src="../resource/org.apache.wicket.extensions.yui.YuiLib/yuiloader/yuiloader.js"></script> -<script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery.js"></script> -<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-event-jquery.js"></script> -<script type="text/javascript" > +</style><script type="text/javascript" > /*<