/*
* Copyright 2013 Nicolas Morel
*
* 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 com.github.nmorel.gwtjackson.shared.options;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
import com.github.nmorel.gwtjackson.shared.AbstractTester;
import com.github.nmorel.gwtjackson.shared.ObjectReaderTester;
import com.github.nmorel.gwtjackson.shared.ObjectWriterTester;
/**
* @author Nicolas Morel
*/
public final class DateOptionsTester extends AbstractTester {
public static class BeanWithDates {
public Date date;
@JsonFormat( shape = Shape.STRING, pattern = "/yyyy/MM/dd/" )
public Date onlyDate;
@JsonFormat( shape = Shape.STRING, pattern = "/yyyy/MM/dd/ Z" )
public Date onlyDateTz;
public java.sql.Date sqlDate;
public Time sqlTime;
public Timestamp sqlTimestamp;
public Map<Date, String> mapDate;
public Map<java.sql.Date, String> mapSqlDate;
public Map<Time, String> mapSqlTime;
public Map<Timestamp, String> mapSqlTimestamp;
}
public static final DateOptionsTester INSTANCE = new DateOptionsTester();
private DateOptionsTester() {
}
public void testSerializeDatesAsTimestamps( ObjectWriterTester<BeanWithDates> writer ) {
BeanWithDates bean = new BeanWithDates();
bean.date = new Date( 1345304756540l );
bean.onlyDate = new Date( 1345304756540l );
bean.onlyDateTz = new Date( 1345304756540l );
bean.sqlDate = new java.sql.Date( 1345304756541l );
bean.sqlTime = new Time( 1345304756542l );
bean.sqlTimestamp = new Timestamp( 1345304756543l );
Map<Date, String> mapDate = new HashMap<Date, String>();
mapDate.put( new Date( 1345304756544l ), "java.util.Date" );
bean.mapDate = mapDate;
Map<java.sql.Date, String> mapSqlDate = new HashMap<java.sql.Date, String>();
mapSqlDate.put( new java.sql.Date( 1345304756545l ), "java.sql.Date" );
bean.mapSqlDate = mapSqlDate;
Map<Time, String> mapSqlTime = new HashMap<Time, String>();
mapSqlTime.put( new Time( 1345304756546l ), "java.sql.Time" );
bean.mapSqlTime = mapSqlTime;
Map<Timestamp, String> mapSqlTimestamp = new HashMap<Timestamp, String>();
mapSqlTimestamp.put( new Timestamp( 1345304756547l ), "java.sql.Timestamp" );
bean.mapSqlTimestamp = mapSqlTimestamp;
String expected = "{" +
"\"date\":1345304756540," +
"\"onlyDate\":\"/2012/08/18/\"," +
"\"onlyDateTz\":\"/2012/08/18/ +0000\"," +
"\"sqlDate\":\"" + bean.sqlDate.toString() + "\"," +
"\"sqlTime\":\"" + bean.sqlTime.toString() + "\"," +
"\"sqlTimestamp\":1345304756543," +
"\"mapDate\":{\"1345304756544\":\"java.util.Date\"}," +
"\"mapSqlDate\":{\"1345304756545\":\"java.sql.Date\"}," +
"\"mapSqlTime\":{\"1345304756546\":\"java.sql.Time\"}," +
"\"mapSqlTimestamp\":{\"1345304756547\":\"java.sql.Timestamp\"}" +
"}";
assertEquals( expected, writer.write( bean ) );
}
public void testDeserializeDatesAsTimestamps( ObjectReaderTester<BeanWithDates> reader ) {
String input = "{" +
"\"date\":1345304756540," +
"\"onlyDate\":1345304756540," +
"\"onlyDateTz\":1345304756540," +
"\"sqlDate\":\"2012-08-18\"," +
"\"sqlTime\":\"15:45:56\"," +
"\"sqlTimestamp\":1345304756543," +
"\"mapDate\":{\"1345304756544\":\"java.util.Date\"}" +
"}";
BeanWithDates bean = reader.read( input );
assertEquals( new Date( 1345304756540l ), bean.date );
assertEquals( new Date( 1345304756540l ), bean.onlyDate );
assertEquals( new Date( 1345304756540l ), bean.onlyDateTz );
assertEquals( getUTCTime( 2012, 8, 18, 0, 0, 0, 0 ), bean.sqlDate.getTime() );
assertEquals( new Time( 15, 45, 56 ), bean.sqlTime );
assertEquals( new java.sql.Timestamp( 1345304756543l ), bean.sqlTimestamp );
Map<Date, String> mapDate = new HashMap<Date, String>();
mapDate.put( new Date( 1345304756544l ), "java.util.Date" );
assertEquals( mapDate, bean.mapDate );
// Jackson is not able to deserialize java.sql.* types as string so we don't bother testing it
}
public void testSerializeDatesNotAsTimestamps( ObjectWriterTester<BeanWithDates> writer ) {
BeanWithDates bean = new BeanWithDates();
bean.date = getUTCDate( 2012, 8, 18, 15, 45, 56, 540 );
bean.onlyDate = getUTCDate( 2012, 8, 18, 0, 0, 0, 0);
bean.onlyDateTz = getUTCDate( 2012, 8, 18, 0, 0, 0, 0);
bean.sqlDate = new java.sql.Date( getUTCTime( 2012, 8, 18, 15, 45, 56, 541 ) );
bean.sqlTime = new java.sql.Time( getUTCTime( 2012, 8, 18, 15, 45, 56, 542 ) );
bean.sqlTimestamp = new java.sql.Timestamp( getUTCTime( 2012, 8, 18, 15, 45, 56, 543 ) );
Map<Date, String> mapDate = new HashMap<Date, String>();
mapDate.put( getUTCDate( 2012, 8, 18, 15, 45, 56, 544 ), "java.util.Date" );
bean.mapDate = mapDate;
Map<java.sql.Date, String> mapSqlDate = new HashMap<java.sql.Date, String>();
mapSqlDate.put( new java.sql.Date( getUTCTime( 2012, 8, 18, 15, 45, 56, 545 ) ), "java.sql.Date" );
bean.mapSqlDate = mapSqlDate;
Map<Time, String> mapSqlTime = new HashMap<Time, String>();
mapSqlTime.put( new java.sql.Time( getUTCTime( 2012, 8, 18, 15, 45, 56, 546 ) ), "java.sql.Time" );
bean.mapSqlTime = mapSqlTime;
Map<Timestamp, String> mapSqlTimestamp = new HashMap<Timestamp, String>();
mapSqlTimestamp.put( new java.sql.Timestamp( getUTCTime( 2012, 8, 18, 15, 45, 56, 547 ) ), "java.sql.Timestamp" );
bean.mapSqlTimestamp = mapSqlTimestamp;
String expected = "{" +
"\"date\":\"2012-08-18T15:45:56.540+0000\"," +
"\"onlyDate\":\"/2012/08/18/\"," +
"\"onlyDateTz\":\"/2012/08/18/ +0000\"," +
"\"sqlDate\":\"" + bean.sqlDate.toString() + "\"," +
"\"sqlTime\":\"" + bean.sqlTime.toString() + "\"," +
"\"sqlTimestamp\":\"2012-08-18T15:45:56.543+0000\"," +
"\"mapDate\":{\"2012-08-18T15:45:56.544+0000\":\"java.util.Date\"}," +
"\"mapSqlDate\":{\"2012-08-18T15:45:56.545+0000\":\"java.sql.Date\"}," +
"\"mapSqlTime\":{\"2012-08-18T15:45:56.546+0000\":\"java.sql.Time\"}," +
"\"mapSqlTimestamp\":{\"2012-08-18T15:45:56.547+0000\":\"java.sql.Timestamp\"}" +
"}";
assertEquals( expected, writer.write( bean ) );
}
@SuppressWarnings("deprecation")
public void testDeserializeDatesNotAsTimestamps( ObjectReaderTester<BeanWithDates> reader ) {
String input = "{" +
"\"date\":\"2012-08-18T15:45:56.540+0000\"," +
"\"onlyDate\":\"/2012/08/18/\"," +
"\"onlyDateTz\":\"/2012/08/18/ +0000\"," +
"\"sqlDate\":\"2012-08-18\"," +
"\"sqlTime\":\"15:45:56\"," +
"\"sqlTimestamp\":\"2012-08-18T15:45:56.543+0000\"," +
"\"mapDate\":{\"2012-08-18T15:45:56.544+0000\":\"java.util.Date\"}" +
"}";
BeanWithDates bean = reader.read( input );
assertEquals( new Date( 1345304756540l ), bean.date );
Date utcDate = getUTCDate( 2012, 8, 18, 0, 0, 0, 0 );
assertEquals( utcDate, bean.onlyDate );
assertEquals( utcDate, bean.onlyDateTz );
assertEquals( utcDate, bean.sqlDate );
assertEquals( new Time( 15, 45, 56 ), bean.sqlTime );
assertEquals( new java.sql.Timestamp( 1345304756543l ), bean.sqlTimestamp );
Map<Date, String> mapDate = new HashMap<Date, String>();
mapDate.put( new Date( 1345304756544l ), "java.util.Date" );
assertEquals( mapDate, bean.mapDate );
// Jackson is not able to deserialize java.sql.* types as string so we don't bother testing it
}
@SuppressWarnings("deprecation")
public void testDeserializeDatesNotAsTimestampsAndUseBrowserTimezone( ObjectReaderTester<BeanWithDates> reader ) {
String input = "{" +
"\"date\":\"2012-08-18T15:45:56.540+0000\"," +
"\"onlyDate\":\"/2012/08/18/\"," +
"\"onlyDateTz\":\"/2012/08/18/ +0000\"," +
"\"sqlDate\":\"2012-08-18\"," +
"\"sqlTime\":\"15:45:56\"," +
"\"sqlTimestamp\":\"2012-08-18T15:45:56.543+0000\"," +
"\"mapDate\":{\"2012-08-18T15:45:56.544+0000\":\"java.util.Date\"}" +
"}";
BeanWithDates bean = reader.read( input );
assertEquals( new Date( 1345304756540l ), bean.date );
Date utc = getUTCDate( 2012, 8, 18, 0, 0, 0, 0 );
Date currentTz = new Date(112, 7, 18);
assertEquals( currentTz, bean.onlyDate );
assertEquals( utc, bean.onlyDateTz );
assertEquals( currentTz, bean.sqlDate );
assertEquals( new Time( 15, 45, 56 ), bean.sqlTime );
assertEquals( new java.sql.Timestamp( 1345304756543l ), bean.sqlTimestamp );
Map<Date, String> mapDate = new HashMap<Date, String>();
mapDate.put( new Date( 1345304756544l ), "java.util.Date" );
assertEquals( mapDate, bean.mapDate );
// Jackson is not able to deserialize java.sql.* types as string so we don't bother testing it
}
}