package net.sourceforge.stripes.validation; import org.testng.annotations.Test; import org.testng.Assert; import java.util.Locale; import java.util.Collection; import java.util.ArrayList; import java.util.Date; import java.util.Calendar; import java.util.MissingResourceException; import java.text.DateFormat; import java.text.SimpleDateFormat; /** * Tests that ensure that the DateTypeConverter does the right thing given * an appropriate input locale. * * @author Tim Fennell */ public class DateTypeConverterTest { // Used to format back to dates for equality checking :) private DateFormat format = new SimpleDateFormat("MM/dd/yyyy", Locale.US); private DateTypeConverter getConverter(Locale locale) { DateTypeConverter converter = new DateTypeConverter(){ @Override protected String getResourceString(final String key) throws MissingResourceException { throw new MissingResourceException("Bundle not available to unit tests.", "", key); } }; converter.setLocale(locale); return converter; } @Test(groups="fast") public void testBasicUsLocaleDates() { Collection<ValidationError> errors = new ArrayList<ValidationError>(); DateTypeConverter converter = getConverter(Locale.US); Date date = converter.convert("1/31/07", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "01/31/2007"); date = converter.convert("Feb 28, 2006", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "02/28/2006"); date = converter.convert("March 1, 2007", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "03/01/2007"); } @Test(groups="fast") public void testVariantUsLocaleDates() { Collection<ValidationError> errors = new ArrayList<ValidationError>(); DateTypeConverter converter = getConverter(Locale.US); Date date = converter.convert("01/31/2007", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "01/31/2007"); date = converter.convert("28 Feb 06", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "02/28/2006"); date = converter.convert("1 March 07", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "03/01/2007"); } @Test(groups="fast") public void testAlternateSeparatorsDates() { Collection<ValidationError> errors = new ArrayList<ValidationError>(); DateTypeConverter converter = getConverter(Locale.US); Date date = converter.convert("01 31 2007", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "01/31/2007"); date = converter.convert("28-Feb-06", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "02/28/2006"); date = converter.convert("01-March-07", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "03/01/2007"); } @Test(groups="fast") public void testUkLocaleDates() { Collection<ValidationError> errors = new ArrayList<ValidationError>(); DateTypeConverter converter = getConverter(Locale.UK); Date date = converter.convert("31 01 2007", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "01/31/2007"); date = converter.convert("28/02/2006", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "02/28/2006"); date = converter.convert("01 March 2007", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "03/01/2007"); } @Test(groups="fast") public void testWhackySeparators() { Collection<ValidationError> errors = new ArrayList<ValidationError>(); DateTypeConverter converter = getConverter(Locale.US); Date date = converter.convert("01, 31, 2007", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "01/31/2007"); date = converter.convert("02--28.2006", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "02/28/2006"); date = converter.convert("01//March,./ 2007", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "03/01/2007"); } @Test(groups="fast") public void testNonStandardFormats() { Collection<ValidationError> errors = new ArrayList<ValidationError>(); DateTypeConverter converter = getConverter(Locale.US); Date date = converter.convert("Jan 31 2007", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "01/31/2007"); date = converter.convert("February 28 2006", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "02/28/2006"); date = converter.convert("2007-03-01", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "03/01/2007"); } @Test(groups="fast") public void testPartialInputFormats() { Collection<ValidationError> errors = new ArrayList<ValidationError>(); DateTypeConverter converter = getConverter(Locale.US); Date date = converter.convert("Jan 31", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "01/31/" + Calendar.getInstance().get( Calendar.YEAR )); date = converter.convert("February 28", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "02/28/" + Calendar.getInstance().get( Calendar.YEAR )); date = converter.convert("03/01", Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), "03/01/" + Calendar.getInstance().get( Calendar.YEAR )); } @Test(groups="fast") public void testDateToStringFormat() { Collection<ValidationError> errors = new ArrayList<ValidationError>(); DateTypeConverter converter = getConverter(Locale.US); Date now = new Date(); Date date = converter.convert(now.toString(), Date.class, errors); Assert.assertNotNull(date); Assert.assertEquals(0, errors.size()); Assert.assertEquals(format.format(date), format.format(now)); } }