Fix `GsonBuilder.setDateFormat` ignoring partial DEFAULT; deprecate `setDateFormat(int)` (#2556)
* Fix `GsonBuilder.setDateFormat` ignoring partial DEFAULT; deprecate `setDateFormat(int)` * Remove date format methods not used by main code * Adjust example
This commit is contained in:
parent
df0165b1bc
commit
13be1d104d
|
@ -232,7 +232,7 @@ public final class Gson {
|
||||||
* through {@link GsonBuilder#registerTypeAdapter(Type, Object)}.
|
* through {@link GsonBuilder#registerTypeAdapter(Type, Object)}.
|
||||||
* <li>The default Date format is same as {@link java.text.DateFormat#DEFAULT}. This format
|
* <li>The default Date format is same as {@link java.text.DateFormat#DEFAULT}. This format
|
||||||
* ignores the millisecond portion of the date during serialization. You can change this by
|
* ignores the millisecond portion of the date during serialization. You can change this by
|
||||||
* invoking {@link GsonBuilder#setDateFormat(int)} or {@link
|
* invoking {@link GsonBuilder#setDateFormat(int, int)} or {@link
|
||||||
* GsonBuilder#setDateFormat(String)}.
|
* GsonBuilder#setDateFormat(String)}.
|
||||||
* <li>By default, Gson ignores the {@link com.google.gson.annotations.Expose} annotation. You
|
* <li>By default, Gson ignores the {@link com.google.gson.annotations.Expose} annotation. You
|
||||||
* can enable Gson to serialize/deserialize only those fields marked with this annotation
|
* can enable Gson to serialize/deserialize only those fields marked with this annotation
|
||||||
|
|
|
@ -66,7 +66,7 @@ import java.util.Objects;
|
||||||
* .registerTypeAdapter(Id.class, new IdTypeAdapter())
|
* .registerTypeAdapter(Id.class, new IdTypeAdapter())
|
||||||
* .enableComplexMapKeySerialization()
|
* .enableComplexMapKeySerialization()
|
||||||
* .serializeNulls()
|
* .serializeNulls()
|
||||||
* .setDateFormat(DateFormat.LONG)
|
* .setDateFormat(DateFormat.LONG, DateFormat.LONG)
|
||||||
* .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
|
* .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
|
||||||
* .setPrettyPrinting()
|
* .setPrettyPrinting()
|
||||||
* .setVersion(1.0)
|
* .setVersion(1.0)
|
||||||
|
@ -583,16 +583,16 @@ public final class GsonBuilder {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures Gson to serialize {@code Date} objects according to the pattern provided. You can
|
* Configures Gson to serialize {@code Date} objects according to the pattern provided. You can
|
||||||
* call this method or {@link #setDateFormat(int)} multiple times, but only the last invocation
|
* call this method or {@link #setDateFormat(int, int)} multiple times, but only the last
|
||||||
* will be used to decide the serialization format.
|
* invocation will be used to decide the serialization format.
|
||||||
*
|
*
|
||||||
* <p>The date format will be used to serialize and deserialize {@link java.util.Date} and in case
|
* <p>The date format will be used to serialize and deserialize {@link java.util.Date} and in case
|
||||||
* the {@code java.sql} module is present, also {@link java.sql.Timestamp} and {@link
|
* the {@code java.sql} module is present, also {@link java.sql.Timestamp} and {@link
|
||||||
* java.sql.Date}.
|
* java.sql.Date}.
|
||||||
*
|
*
|
||||||
* <p>Note that this pattern must abide by the convention provided by {@code SimpleDateFormat}
|
* <p>Note that this pattern must abide by the convention provided by {@code SimpleDateFormat}
|
||||||
* class. See the documentation in {@link java.text.SimpleDateFormat} for more information on
|
* class. See the documentation in {@link SimpleDateFormat} for more information on valid date and
|
||||||
* valid date and time patterns.
|
* time patterns.
|
||||||
*
|
*
|
||||||
* @param pattern the pattern that dates will be serialized/deserialized to/from; can be {@code
|
* @param pattern the pattern that dates will be serialized/deserialized to/from; can be {@code
|
||||||
* null} to reset the pattern
|
* null} to reset the pattern
|
||||||
|
@ -624,12 +624,17 @@ public final class GsonBuilder {
|
||||||
* DateFormat} class, such as {@link DateFormat#MEDIUM}. See the documentation of the {@link
|
* DateFormat} class, such as {@link DateFormat#MEDIUM}. See the documentation of the {@link
|
||||||
* DateFormat} class for more information on the valid style constants.
|
* DateFormat} class for more information on the valid style constants.
|
||||||
*
|
*
|
||||||
|
* @deprecated Counterintuitively, despite this method taking only a 'date style' Gson will use a
|
||||||
|
* format which includes both date and time, with the 'time style' being the last value set by
|
||||||
|
* {@link #setDateFormat(int, int)}. Therefore prefer using {@link #setDateFormat(int, int)}
|
||||||
|
* and explicitly provide the desired 'time style'.
|
||||||
* @param dateStyle the predefined date style that date objects will be serialized/deserialized
|
* @param dateStyle the predefined date style that date objects will be serialized/deserialized
|
||||||
* to/from
|
* to/from
|
||||||
* @return a reference to this {@code GsonBuilder} object to fulfill the "Builder" pattern
|
* @return a reference to this {@code GsonBuilder} object to fulfill the "Builder" pattern
|
||||||
* @throws IllegalArgumentException if the style is invalid
|
* @throws IllegalArgumentException if the style is invalid
|
||||||
* @since 1.2
|
* @since 1.2
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public GsonBuilder setDateFormat(int dateStyle) {
|
public GsonBuilder setDateFormat(int dateStyle) {
|
||||||
this.dateStyle = checkDateFormatStyle(dateStyle);
|
this.dateStyle = checkDateFormatStyle(dateStyle);
|
||||||
|
@ -916,7 +921,7 @@ public final class GsonBuilder {
|
||||||
SqlTypesSupport.TIMESTAMP_DATE_TYPE.createAdapterFactory(datePattern);
|
SqlTypesSupport.TIMESTAMP_DATE_TYPE.createAdapterFactory(datePattern);
|
||||||
sqlDateAdapterFactory = SqlTypesSupport.DATE_DATE_TYPE.createAdapterFactory(datePattern);
|
sqlDateAdapterFactory = SqlTypesSupport.DATE_DATE_TYPE.createAdapterFactory(datePattern);
|
||||||
}
|
}
|
||||||
} else if (dateStyle != DateFormat.DEFAULT && timeStyle != DateFormat.DEFAULT) {
|
} else if (dateStyle != DateFormat.DEFAULT || timeStyle != DateFormat.DEFAULT) {
|
||||||
dateAdapterFactory =
|
dateAdapterFactory =
|
||||||
DefaultDateTypeAdapter.DateType.DATE.createAdapterFactory(dateStyle, timeStyle);
|
DefaultDateTypeAdapter.DateType.DATE.createAdapterFactory(dateStyle, timeStyle);
|
||||||
|
|
||||||
|
|
|
@ -23,14 +23,6 @@ import java.util.Locale;
|
||||||
public class PreJava9DateFormatProvider {
|
public class PreJava9DateFormatProvider {
|
||||||
private PreJava9DateFormatProvider() {}
|
private PreJava9DateFormatProvider() {}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the same DateFormat as {@code DateFormat.getDateInstance(style, Locale.US)} in Java 8
|
|
||||||
* or below.
|
|
||||||
*/
|
|
||||||
public static DateFormat getUsDateFormat(int style) {
|
|
||||||
return new SimpleDateFormat(getDateFormatPattern(style), Locale.US);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the same DateFormat as {@code DateFormat.getDateTimeInstance(dateStyle, timeStyle,
|
* Returns the same DateFormat as {@code DateFormat.getDateTimeInstance(dateStyle, timeStyle,
|
||||||
* Locale.US)} in Java 8 or below.
|
* Locale.US)} in Java 8 or below.
|
||||||
|
@ -41,21 +33,6 @@ public class PreJava9DateFormatProvider {
|
||||||
return new SimpleDateFormat(pattern, Locale.US);
|
return new SimpleDateFormat(pattern, Locale.US);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getDateFormatPattern(int style) {
|
|
||||||
switch (style) {
|
|
||||||
case DateFormat.SHORT:
|
|
||||||
return "M/d/yy";
|
|
||||||
case DateFormat.MEDIUM:
|
|
||||||
return "MMM d, y";
|
|
||||||
case DateFormat.LONG:
|
|
||||||
return "MMMM d, y";
|
|
||||||
case DateFormat.FULL:
|
|
||||||
return "EEEE, MMMM d, y";
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException("Unknown DateFormat style: " + style);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getDatePartOfDateTimePattern(int dateStyle) {
|
private static String getDatePartOfDateTimePattern(int dateStyle) {
|
||||||
switch (dateStyle) {
|
switch (dateStyle) {
|
||||||
case DateFormat.SHORT:
|
case DateFormat.SHORT:
|
||||||
|
|
|
@ -104,18 +104,9 @@ public final class DefaultDateTypeAdapter<T extends Date> extends TypeAdapter<T>
|
||||||
return createFactory(new DefaultDateTypeAdapter<>(this, datePattern));
|
return createFactory(new DefaultDateTypeAdapter<>(this, datePattern));
|
||||||
}
|
}
|
||||||
|
|
||||||
public final TypeAdapterFactory createAdapterFactory(int style) {
|
|
||||||
return createFactory(new DefaultDateTypeAdapter<>(this, style));
|
|
||||||
}
|
|
||||||
|
|
||||||
public final TypeAdapterFactory createAdapterFactory(int dateStyle, int timeStyle) {
|
public final TypeAdapterFactory createAdapterFactory(int dateStyle, int timeStyle) {
|
||||||
return createFactory(new DefaultDateTypeAdapter<>(this, dateStyle, timeStyle));
|
return createFactory(new DefaultDateTypeAdapter<>(this, dateStyle, timeStyle));
|
||||||
}
|
}
|
||||||
|
|
||||||
public final TypeAdapterFactory createDefaultsAdapterFactory() {
|
|
||||||
return createFactory(
|
|
||||||
new DefaultDateTypeAdapter<>(this, DateFormat.DEFAULT, DateFormat.DEFAULT));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private final DateType<T> dateType;
|
private final DateType<T> dateType;
|
||||||
|
@ -134,17 +125,6 @@ public final class DefaultDateTypeAdapter<T extends Date> extends TypeAdapter<T>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private DefaultDateTypeAdapter(DateType<T> dateType, int style) {
|
|
||||||
this.dateType = Objects.requireNonNull(dateType);
|
|
||||||
dateFormats.add(DateFormat.getDateInstance(style, Locale.US));
|
|
||||||
if (!Locale.getDefault().equals(Locale.US)) {
|
|
||||||
dateFormats.add(DateFormat.getDateInstance(style));
|
|
||||||
}
|
|
||||||
if (JavaVersion.isJava9OrLater()) {
|
|
||||||
dateFormats.add(PreJava9DateFormatProvider.getUsDateFormat(style));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private DefaultDateTypeAdapter(DateType<T> dateType, int dateStyle, int timeStyle) {
|
private DefaultDateTypeAdapter(DateType<T> dateType, int dateStyle, int timeStyle) {
|
||||||
this.dateType = Objects.requireNonNull(dateType);
|
this.dateType = Objects.requireNonNull(dateType);
|
||||||
dateFormats.add(DateFormat.getDateTimeInstance(dateStyle, timeStyle, Locale.US));
|
dateFormats.add(DateFormat.getDateTimeInstance(dateStyle, timeStyle, Locale.US));
|
||||||
|
|
|
@ -358,6 +358,7 @@ public class GsonBuilderTest {
|
||||||
assertThat(emptyFormatted).isEqualTo(originalFormatted);
|
assertThat(emptyFormatted).isEqualTo(originalFormatted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // for GsonBuilder.setDateFormat(int)
|
||||||
@Test
|
@Test
|
||||||
public void testSetDateFormatValidStyle() {
|
public void testSetDateFormatValidStyle() {
|
||||||
GsonBuilder builder = new GsonBuilder();
|
GsonBuilder builder = new GsonBuilder();
|
||||||
|
@ -370,6 +371,7 @@ public class GsonBuilderTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // for GsonBuilder.setDateFormat(int)
|
||||||
@Test
|
@Test
|
||||||
public void testSetDateFormatInvalidStyle() {
|
public void testSetDateFormatInvalidStyle() {
|
||||||
GsonBuilder builder = new GsonBuilder();
|
GsonBuilder builder = new GsonBuilder();
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
package com.google.gson.functional;
|
package com.google.gson.functional;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static com.google.common.truth.Truth.assertWithMessage;
|
||||||
import static org.junit.Assert.assertThrows;
|
import static org.junit.Assert.assertThrows;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
|
@ -501,22 +502,84 @@ public class DefaultTypeAdaptersTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Uses {@link GsonBuilder#setDateFormat(int, int)} */
|
||||||
@Test
|
@Test
|
||||||
public void testDateSerializationWithStyle() {
|
public void testDateSerializationWithStyle() {
|
||||||
int style = DateFormat.SHORT;
|
|
||||||
Date date = new Date(0);
|
Date date = new Date(0);
|
||||||
String expectedFormatted = DateFormat.getDateTimeInstance(style, style, Locale.US).format(date);
|
int[] styles = {DateFormat.FULL, DateFormat.LONG, DateFormat.MEDIUM, DateFormat.SHORT};
|
||||||
|
|
||||||
Gson gson = new GsonBuilder().setDateFormat(style, style).create();
|
for (int dateStyle : styles) {
|
||||||
String json = gson.toJson(date);
|
for (int timeStyle : styles) {
|
||||||
assertThat(json).isEqualTo("\"" + expectedFormatted + "\"");
|
String expectedFormatted =
|
||||||
// Verify that custom style is not equal to default style
|
DateFormat.getDateTimeInstance(dateStyle, timeStyle, Locale.US).format(date);
|
||||||
assertThat(json).isNotEqualTo(new Gson().toJson(date));
|
|
||||||
|
Gson gson = new GsonBuilder().setDateFormat(dateStyle, timeStyle).create();
|
||||||
|
String json = gson.toJson(date);
|
||||||
|
assertWithMessage("dateStyle=" + dateStyle + ", timeStyle=" + timeStyle)
|
||||||
|
.that(json)
|
||||||
|
.isEqualTo("\"" + expectedFormatted + "\"");
|
||||||
|
|
||||||
|
assertWithMessage("dateStyle=" + dateStyle + ", timeStyle=" + timeStyle)
|
||||||
|
.that(gson.fromJson(json, Date.class).getTime())
|
||||||
|
.isEqualTo(date.getTime());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// `new Gson()` should use dateStyle=DEFAULT, timeStyle=DEFAULT
|
||||||
|
String expectedFormatted =
|
||||||
|
DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.US)
|
||||||
|
.format(date);
|
||||||
|
assertThat(new Gson().toJson(date)).isEqualTo("\"" + expectedFormatted + "\"");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Uses {@link GsonBuilder#setDateFormat(int)} */
|
||||||
|
@SuppressWarnings("deprecation") // for GsonBuilder.setDateFormat(int)
|
||||||
|
@Test
|
||||||
|
public void testDateSerializationWithDateStyle() {
|
||||||
|
Date date = new Date(0);
|
||||||
|
int[] styles = {DateFormat.FULL, DateFormat.LONG, DateFormat.MEDIUM, DateFormat.SHORT};
|
||||||
|
|
||||||
|
for (int dateStyle : styles) {
|
||||||
|
String expectedFormatted =
|
||||||
|
DateFormat.getDateTimeInstance(dateStyle, DateFormat.DEFAULT, Locale.US).format(date);
|
||||||
|
|
||||||
|
Gson gson = new GsonBuilder().setDateFormat(dateStyle).create();
|
||||||
|
String json = gson.toJson(date);
|
||||||
|
assertWithMessage("dateStyle=" + dateStyle)
|
||||||
|
.that(json)
|
||||||
|
.isEqualTo("\"" + expectedFormatted + "\"");
|
||||||
|
|
||||||
|
assertWithMessage("dateStyle=" + dateStyle)
|
||||||
|
.that(gson.fromJson(json, Date.class).getTime())
|
||||||
|
.isEqualTo(date.getTime());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Using {@link GsonBuilder#setDateFormat(int, int)} should overwrite previous patterns set with
|
||||||
|
* {@link GsonBuilder#setDateFormat(String)}
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testDateStyleOverwritesPattern() {
|
||||||
|
String pattern = "yyyy-MM-dd";
|
||||||
|
Date date = new Date(0);
|
||||||
|
GsonBuilder gsonBuilder = new GsonBuilder().setDateFormat(pattern);
|
||||||
|
String patternJson = gsonBuilder.create().toJson(date);
|
||||||
|
|
||||||
|
int style = DateFormat.SHORT;
|
||||||
|
String styleJson = gsonBuilder.setDateFormat(style, style).create().toJson(date);
|
||||||
|
String expectedFormatted = DateFormat.getDateTimeInstance(style, style, Locale.US).format(date);
|
||||||
|
assertThat(styleJson).isEqualTo("\"" + expectedFormatted + "\"");
|
||||||
|
|
||||||
|
// Should not be equal to pattern JSON output
|
||||||
|
assertThat(styleJson).isNotEqualTo(patternJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // for GsonBuilder.setDateFormat(int)
|
||||||
@Test
|
@Test
|
||||||
public void testDateSerializationWithPattern() {
|
public void testDateSerializationWithPattern() {
|
||||||
String pattern = "yyyy-MM-dd";
|
String pattern = "yyyy-MM-dd";
|
||||||
|
// This also verifies that a custom pattern overwrites a custom style
|
||||||
Gson gson = new GsonBuilder().setDateFormat(DateFormat.FULL).setDateFormat(pattern).create();
|
Gson gson = new GsonBuilder().setDateFormat(DateFormat.FULL).setDateFormat(pattern).create();
|
||||||
Date now = new Date(1315806903103L);
|
Date now = new Date(1315806903103L);
|
||||||
String json = gson.toJson(now);
|
String json = gson.toJson(now);
|
||||||
|
@ -527,6 +590,7 @@ public class DefaultTypeAdaptersTest {
|
||||||
@Test
|
@Test
|
||||||
public void testDateDeserializationWithPattern() {
|
public void testDateDeserializationWithPattern() {
|
||||||
String pattern = "yyyy-MM-dd";
|
String pattern = "yyyy-MM-dd";
|
||||||
|
// This also verifies that a custom pattern overwrites a custom style
|
||||||
Gson gson = new GsonBuilder().setDateFormat(DateFormat.FULL).setDateFormat(pattern).create();
|
Gson gson = new GsonBuilder().setDateFormat(DateFormat.FULL).setDateFormat(pattern).create();
|
||||||
Date now = new Date(1315806903103L);
|
Date now = new Date(1315806903103L);
|
||||||
String json = gson.toJson(now);
|
String json = gson.toJson(now);
|
||||||
|
|
|
@ -18,7 +18,7 @@ package com.google.gson.internal.bind;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static com.google.common.truth.Truth.assertWithMessage;
|
import static com.google.common.truth.Truth.assertWithMessage;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.assertThrows;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
|
@ -63,10 +63,7 @@ public class DefaultDateTypeAdapterTest {
|
||||||
// Note: \h means "horizontal space", because some JDK versions use Narrow No Break Space
|
// Note: \h means "horizontal space", because some JDK versions use Narrow No Break Space
|
||||||
// (U+202F) before the AM or PM indication.
|
// (U+202F) before the AM or PM indication.
|
||||||
String utcFull = "(Coordinated Universal Time|UTC)";
|
String utcFull = "(Coordinated Universal Time|UTC)";
|
||||||
assertFormatted("Jan 1, 1970,? 12:00:00\\hAM", DateType.DATE.createDefaultsAdapterFactory());
|
assertFormatted("Jan 1, 1970,? 12:00:00\\hAM", DefaultDateTypeAdapter.DEFAULT_STYLE_FACTORY);
|
||||||
assertFormatted("1/1/70", DateType.DATE.createAdapterFactory(DateFormat.SHORT));
|
|
||||||
assertFormatted("Jan 1, 1970", DateType.DATE.createAdapterFactory(DateFormat.MEDIUM));
|
|
||||||
assertFormatted("January 1, 1970", DateType.DATE.createAdapterFactory(DateFormat.LONG));
|
|
||||||
assertFormatted(
|
assertFormatted(
|
||||||
"1/1/70,? 12:00\\hAM",
|
"1/1/70,? 12:00\\hAM",
|
||||||
DateType.DATE.createAdapterFactory(DateFormat.SHORT, DateFormat.SHORT));
|
DateType.DATE.createAdapterFactory(DateFormat.SHORT, DateFormat.SHORT));
|
||||||
|
@ -95,16 +92,7 @@ public class DefaultDateTypeAdapterTest {
|
||||||
Date date = new Date(0);
|
Date date = new Date(0);
|
||||||
assertParsed(
|
assertParsed(
|
||||||
DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(date),
|
DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(date),
|
||||||
DateType.DATE.createDefaultsAdapterFactory());
|
DefaultDateTypeAdapter.DEFAULT_STYLE_FACTORY);
|
||||||
assertParsed(
|
|
||||||
DateFormat.getDateInstance(DateFormat.SHORT).format(date),
|
|
||||||
DateType.DATE.createAdapterFactory(DateFormat.SHORT));
|
|
||||||
assertParsed(
|
|
||||||
DateFormat.getDateInstance(DateFormat.MEDIUM).format(date),
|
|
||||||
DateType.DATE.createAdapterFactory(DateFormat.MEDIUM));
|
|
||||||
assertParsed(
|
|
||||||
DateFormat.getDateInstance(DateFormat.LONG).format(date),
|
|
||||||
DateType.DATE.createAdapterFactory(DateFormat.LONG));
|
|
||||||
assertParsed(
|
assertParsed(
|
||||||
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date),
|
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date),
|
||||||
DateType.DATE.createAdapterFactory(DateFormat.SHORT, DateFormat.SHORT));
|
DateType.DATE.createAdapterFactory(DateFormat.SHORT, DateFormat.SHORT));
|
||||||
|
@ -130,10 +118,7 @@ public class DefaultDateTypeAdapterTest {
|
||||||
Locale defaultLocale = Locale.getDefault();
|
Locale defaultLocale = Locale.getDefault();
|
||||||
Locale.setDefault(Locale.US);
|
Locale.setDefault(Locale.US);
|
||||||
try {
|
try {
|
||||||
assertParsed("Jan 1, 1970 0:00:00 AM", DateType.DATE.createDefaultsAdapterFactory());
|
assertParsed("Jan 1, 1970 0:00:00 AM", DefaultDateTypeAdapter.DEFAULT_STYLE_FACTORY);
|
||||||
assertParsed("1/1/70", DateType.DATE.createAdapterFactory(DateFormat.SHORT));
|
|
||||||
assertParsed("Jan 1, 1970", DateType.DATE.createAdapterFactory(DateFormat.MEDIUM));
|
|
||||||
assertParsed("January 1, 1970", DateType.DATE.createAdapterFactory(DateFormat.LONG));
|
|
||||||
assertParsed(
|
assertParsed(
|
||||||
"1/1/70 0:00 AM", DateType.DATE.createAdapterFactory(DateFormat.SHORT, DateFormat.SHORT));
|
"1/1/70 0:00 AM", DateType.DATE.createAdapterFactory(DateFormat.SHORT, DateFormat.SHORT));
|
||||||
assertParsed(
|
assertParsed(
|
||||||
|
@ -158,8 +143,8 @@ public class DefaultDateTypeAdapterTest {
|
||||||
Locale defaultLocale = Locale.getDefault();
|
Locale defaultLocale = Locale.getDefault();
|
||||||
Locale.setDefault(Locale.US);
|
Locale.setDefault(Locale.US);
|
||||||
try {
|
try {
|
||||||
assertFormatted("Dec 31, 1969,? 4:00:00\\hPM", DateType.DATE.createDefaultsAdapterFactory());
|
assertFormatted("Dec 31, 1969,? 4:00:00\\hPM", DefaultDateTypeAdapter.DEFAULT_STYLE_FACTORY);
|
||||||
assertParsed("Dec 31, 1969 4:00:00 PM", DateType.DATE.createDefaultsAdapterFactory());
|
assertParsed("Dec 31, 1969 4:00:00 PM", DefaultDateTypeAdapter.DEFAULT_STYLE_FACTORY);
|
||||||
} finally {
|
} finally {
|
||||||
TimeZone.setDefault(defaultTimeZone);
|
TimeZone.setDefault(defaultTimeZone);
|
||||||
Locale.setDefault(defaultLocale);
|
Locale.setDefault(defaultLocale);
|
||||||
|
@ -168,7 +153,7 @@ public class DefaultDateTypeAdapterTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDateDeserializationISO8601() throws Exception {
|
public void testDateDeserializationISO8601() throws Exception {
|
||||||
TypeAdapterFactory adapterFactory = DateType.DATE.createDefaultsAdapterFactory();
|
TypeAdapterFactory adapterFactory = DefaultDateTypeAdapter.DEFAULT_STYLE_FACTORY;
|
||||||
assertParsed("1970-01-01T00:00:00.000Z", adapterFactory);
|
assertParsed("1970-01-01T00:00:00.000Z", adapterFactory);
|
||||||
assertParsed("1970-01-01T00:00Z", adapterFactory);
|
assertParsed("1970-01-01T00:00Z", adapterFactory);
|
||||||
assertParsed("1970-01-01T00:00:00+00:00", adapterFactory);
|
assertParsed("1970-01-01T00:00:00+00:00", adapterFactory);
|
||||||
|
@ -176,17 +161,6 @@ public class DefaultDateTypeAdapterTest {
|
||||||
assertParsed("1970-01-01T01:00:00+01", adapterFactory);
|
assertParsed("1970-01-01T01:00:00+01", adapterFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDateSerialization() {
|
|
||||||
int dateStyle = DateFormat.LONG;
|
|
||||||
TypeAdapter<Date> dateTypeAdapter = dateAdapter(DateType.DATE.createAdapterFactory(dateStyle));
|
|
||||||
DateFormat formatter = DateFormat.getDateInstance(dateStyle, Locale.US);
|
|
||||||
Date currentDate = new Date();
|
|
||||||
|
|
||||||
String dateString = dateTypeAdapter.toJson(currentDate);
|
|
||||||
assertThat(dateString).isEqualTo(toLiteral(formatter.format(currentDate)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDatePattern() {
|
public void testDatePattern() {
|
||||||
String pattern = "yyyy-MM-dd";
|
String pattern = "yyyy-MM-dd";
|
||||||
|
@ -200,28 +174,24 @@ public class DefaultDateTypeAdapterTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testInvalidDatePattern() {
|
public void testInvalidDatePattern() {
|
||||||
try {
|
assertThrows(
|
||||||
DateType.DATE.createAdapterFactory("I am a bad Date pattern....");
|
IllegalArgumentException.class,
|
||||||
fail("Invalid date pattern should fail.");
|
() -> DateType.DATE.createAdapterFactory("I am a bad Date pattern...."));
|
||||||
} catch (IllegalArgumentException expected) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNullValue() throws Exception {
|
public void testNullValue() throws Exception {
|
||||||
TypeAdapter<Date> adapter = dateAdapter(DateType.DATE.createDefaultsAdapterFactory());
|
TypeAdapter<Date> adapter = dateAdapter(DefaultDateTypeAdapter.DEFAULT_STYLE_FACTORY);
|
||||||
assertThat(adapter.fromJson("null")).isNull();
|
assertThat(adapter.fromJson("null")).isNull();
|
||||||
assertThat(adapter.toJson(null)).isEqualTo("null");
|
assertThat(adapter.toJson(null)).isEqualTo("null");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUnexpectedToken() throws Exception {
|
public void testUnexpectedToken() throws Exception {
|
||||||
try {
|
TypeAdapter<Date> adapter = dateAdapter(DefaultDateTypeAdapter.DEFAULT_STYLE_FACTORY);
|
||||||
TypeAdapter<Date> adapter = dateAdapter(DateType.DATE.createDefaultsAdapterFactory());
|
IllegalStateException e =
|
||||||
adapter.fromJson("{}");
|
assertThrows(IllegalStateException.class, () -> adapter.fromJson("{}"));
|
||||||
fail("Unexpected token should fail.");
|
assertThat(e).hasMessageThat().startsWith("Expected a string but was BEGIN_OBJECT");
|
||||||
} catch (IllegalStateException expected) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Reference in New Issue