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 }