001    /*******************************************************************************
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     * http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing,
013     * software distributed under the License is distributed on an
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     * KIND, either express or implied.  See the License for the
016     * specific language governing permissions and limitations
017     * under the License.
018     *******************************************************************************/
019    package org.apache.commons.convert;
020    
021    import java.text.DateFormat;
022    import java.text.SimpleDateFormat;
023    import java.util.Collection;
024    import java.util.List;
025    import java.util.Locale;
026    import java.util.Set;
027    import java.util.TimeZone;
028    
029    import junit.framework.TestCase;
030    
031    public class TestDateTimeConverters extends TestCase {
032    
033        public static <S, T> void assertConversion(String label, Converter<S, T> converter, S source, T target) throws Exception {
034            assertConversion(label, converter, source, target, true);
035        }
036    
037        @SuppressWarnings("unchecked")
038        public static <S, T> void assertConversion(String label, Converter<S, T> converter, S source, T target, boolean testRegistration) throws Exception {
039            assertTrue(label + " can convert", converter.canConvert(source.getClass(), target.getClass()));
040            if (testRegistration) {
041                assertEquals(label + " registered", converter.getClass(), Converters.getConverter(source.getClass(), target.getClass()).getClass());
042            }
043            assertEquals(label + " converted", target, converter.convert(source));
044            Converter<T, S> reflectiveConverter = null;
045            try {
046                reflectiveConverter = (Converter<T, S>) Converters.getConverter(target.getClass(), source.getClass());
047                assertEquals(label + " reflection converted", source, reflectiveConverter.convert(target));
048            } catch (ClassNotFoundException e) {
049                System.out.println(converter.getClass() + " is not reflective");
050            }
051            try {
052                LocalizedConverter<S,T> localizedConverter = (LocalizedConverter) converter;
053                T localizedResult = localizedConverter.convert(source, Locale.getDefault(), TimeZone.getDefault());
054                T formattedResult = localizedConverter.convert(source, Locale.getDefault(), TimeZone.getDefault(), DateTimeConverters.CALENDAR_FORMAT);
055                if (reflectiveConverter != null) {
056                    LocalizedConverter<T, S> localizedReflectiveConverter = (LocalizedConverter) reflectiveConverter;
057                    assertEquals(label + " localized reflection converted", source, localizedReflectiveConverter.convert(localizedResult, Locale.getDefault(), TimeZone.getDefault()));
058                    assertEquals(label + " formatted reflection converted", source, localizedReflectiveConverter.convert(formattedResult, Locale.getDefault(), TimeZone.getDefault(), DateTimeConverters.CALENDAR_FORMAT));
059                }
060            } catch (ClassCastException e) {}
061        }
062    
063        @SuppressWarnings("unchecked")
064        public static <S> void assertToCollection(String label, S source) throws Exception {
065            Converter<S, ? extends Collection> toList = (Converter<S, ? extends Collection>) Converters.getConverter(source.getClass(), List.class);
066            Collection<S> listResult = toList.convert(source);
067            assertEquals(label + " converted to List", source, listResult.toArray()[0]);
068            Converter<S, ? extends Collection> toSet = (Converter<S, ? extends Collection>) Converters.getConverter(source.getClass(), Set.class);
069            Collection<S> setResult = toSet.convert(source);
070            assertEquals(label + " converted to Set", source, setResult.toArray()[0]);
071        }
072    
073        public TestDateTimeConverters(String name) {
074            super(name);
075        }
076    
077        @SuppressWarnings("deprecation")
078        public void testDateTimeConverters() throws Exception {
079            ConverterLoader loader = new DateTimeConverters();
080            loader.loadConverters();
081            // Java date-related classes default to Jan 1, 1970 00:00:00 in some methods,
082            // so we use it here for simplicity.
083            java.util.Date utilDate = new java.util.Date(70, 0, 1, 0, 0, 0);
084            long currentTime = utilDate.getTime();
085            java.util.Calendar cal = java.util.Calendar.getInstance();
086            cal.setTimeInMillis(currentTime);
087            java.sql.Date sqlDate = new java.sql.Date(70, 0, 1);
088            java.sql.Time sqlTime = new java.sql.Time(0, 0, 0);
089            java.sql.Timestamp timestamp = new java.sql.Timestamp(currentTime);
090            java.sql.Timestamp stampWithNanos = new java.sql.Timestamp(currentTime);
091            stampWithNanos.setNanos(10);
092            // Source class = java.util.Calendar
093            DateFormat df = new SimpleDateFormat(DateTimeConverters.CALENDAR_FORMAT);
094            df.setCalendar(cal);
095            assertConversion("CalendarToDate", new DateTimeConverters.CalendarToDate(), cal, utilDate);
096            assertConversion("CalendarToLong", new DateTimeConverters.CalendarToLong(), cal, currentTime);
097            assertConversion("CalendarToString", new DateTimeConverters.CalendarToString(), cal, df.format(cal.getTime()));
098            assertConversion("CalendarToTimestamp", new DateTimeConverters.CalendarToTimestamp(), cal, timestamp);
099            assertToCollection("CalendarToCollection", cal);
100            // Source class = java.util.Date
101            assertConversion("DateToCalendar", new DateTimeConverters.DateToCalendar(), utilDate, cal);
102            assertConversion("DateToLong", new DateTimeConverters.GenericDateToLong<java.util.Date>(java.util.Date.class), utilDate, currentTime);
103            assertConversion("DateToSqlDate", new DateTimeConverters.DateToSqlDate(), utilDate, sqlDate);
104            assertConversion("DateToSqlTime", new DateTimeConverters.DateToSqlTime(), utilDate, sqlTime);
105            assertConversion("DateToString", new DateTimeConverters.DateToString(), utilDate, df.format(cal.getTime()));
106            assertConversion("DateToTimestamp", new DateTimeConverters.DateToTimestamp(), utilDate, timestamp);
107            assertConversion("DateToTimestamp", new DateTimeConverters.DateToTimestamp(), timestamp, timestamp, false);
108            assertToCollection("DateToCollection", utilDate);
109            // Source class = java.sql.Date
110            assertConversion("SqlDateToDate", new DateTimeConverters.SqlDateToDate(), sqlDate, new java.util.Date(sqlDate.getTime()));
111            assertConversion("SqlDateToLong", new DateTimeConverters.GenericDateToLong<java.sql.Date>(java.sql.Date.class), sqlDate, sqlDate.getTime());
112            assertConversion("SqlDateToString", new DateTimeConverters.SqlDateToString(), sqlDate, sqlDate.toString());
113            assertConversion("SqlDateToTimestamp", new DateTimeConverters.SqlDateToTimestamp(), sqlDate, new java.sql.Timestamp(sqlDate.getTime()));
114            assertToCollection("SqlDateToCollection", sqlDate);
115            // Source class = java.sql.Time
116            assertConversion("SqlTimeToLong", new DateTimeConverters.GenericDateToLong<java.sql.Time>(java.sql.Time.class), sqlTime, sqlTime.getTime());
117            assertToCollection("SqlTimeToCollection", sqlTime);
118            assertConversion("SqlTimeToString", new DateTimeConverters.SqlTimeToString(), sqlTime, sqlTime.toString());
119            // Source class = java.sql.Timestamp
120            assertConversion("TimestampToLong", new DateTimeConverters.GenericDateToLong<java.sql.Timestamp>(java.sql.Timestamp.class), timestamp, currentTime);
121            assertConversion("TimestampToSqlDate", new DateTimeConverters.TimestampToSqlDate(), new java.sql.Timestamp(sqlDate.getTime()), sqlDate);
122            assertConversion("TimestampToSqlTime", new DateTimeConverters.TimestampToSqlTime(), new java.sql.Timestamp(sqlDate.getTime()), sqlTime);
123            assertConversion("TimestampToString", new DateTimeConverters.TimestampToString(), stampWithNanos, stampWithNanos.toString());
124            assertToCollection("TimestampToCollection", timestamp);
125            // TimeZone tests
126            TimeZone tz = TimeZone.getDefault();
127            assertConversion("TimeZoneToString", new DateTimeConverters.TimeZoneToString(), tz, tz.getID());
128            assertToCollection("TimeZoneToCollection", tz);
129        }
130    }