/*
* Copyright 2006-2007 the original author or authors.
*
* Licensed 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.springframework.batch.core.repository.dao;
import static org.junit.Assert.assertEquals;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* Test case showing some weirdnesses in date formatting. Looks like a bug in
* SimpleDateFormat / GregorianCalendar, and it affects the JSON deserialization
* that we use in the ExecutionContext around daylight savings.
*
* @author Dave Syer
*
*/
@RunWith(Parameterized.class)
public class DateFormatTests {
private final SimpleDateFormat format;
private final String input;
private final int hour;
private final String output;
/**
*
*/
public DateFormatTests(String pattern, String input, String output, int hour) {
this.output = output;
this.format = new SimpleDateFormat(pattern, Locale.UK);
format.setTimeZone(TimeZone.getTimeZone("GMT"));
this.input = input;
this.hour = hour;
}
@Test
public void testDateFormat() throws Exception {
Date date = format.parse(input);
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.UK);
calendar.setTime(date);
// System.err.println(format.toPattern() + " + " + input + " --> " +
// calendar.getTime());
// This assertion is true...
assertEquals(hour, calendar.get(Calendar.HOUR_OF_DAY));
// ...but the toString() does not match in 1970 and 1971
assertEquals(output, format.format(date));
}
@Parameters
public static List<Object[]> data() {
List<Object[]> params = new ArrayList<Object[]>();
String format = "yyyy-MM-dd HH:mm:ss.S z";
/*
* When the date format has an explicit time zone these are OK. But on
* 2008/10/26 when the clocks went back to GMT these failed the hour
* assertion (with the hour coming back as 12). On 2008/10/27, the day
* after, they are fine, but the toString still didn't match.
*/
params.add(new Object[] { format, "1970-01-01 11:20:34.0 GMT", "1970-01-01 11:20:34.0 GMT", 11 });
params.add(new Object[] { format, "1971-02-01 11:20:34.0 GMT", "1971-02-01 11:20:34.0 GMT", 11 });
// After 1972 you always get the right answer
params.add(new Object[] { format, "1972-02-01 11:20:34.0 GMT", "1972-02-01 11:20:34.0 GMT", 11 });
params.add(new Object[] { format, "1976-02-01 11:20:34.0 GMT", "1976-02-01 11:20:34.0 GMT", 11 });
params.add(new Object[] { format, "1982-02-01 11:20:34.0 GMT", "1982-02-01 11:20:34.0 GMT", 11 });
params.add(new Object[] { format, "2008-02-01 11:20:34.0 GMT", "2008-02-01 11:20:34.0 GMT", 11 });
return params;
}
}