| /* |
| * Copyright (C) 2008 Google Inc. |
| * |
| * 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.google.gson; |
| |
| import com.google.gson.DefaultTypeAdapters.DefaultDateTypeAdapter; |
| import java.text.DateFormat; |
| import java.text.SimpleDateFormat; |
| import java.util.Date; |
| import java.util.Locale; |
| import java.util.TimeZone; |
| import junit.framework.TestCase; |
| |
| /** |
| * A simple unit test for the {@link DefaultDateTypeAdapter} class. |
| * |
| * @author Joel Leitch |
| */ |
| public class DefaultDateTypeAdapterTest extends TestCase { |
| |
| public void testFormattingInEnUs() { |
| testFormattingAlwaysEmitsUsLocale(Locale.US); |
| } |
| |
| public void testFormattingInFr() { |
| testFormattingAlwaysEmitsUsLocale(Locale.FRANCE); |
| } |
| |
| private void testFormattingAlwaysEmitsUsLocale(Locale locale) { |
| TimeZone defaultTimeZone = TimeZone.getDefault(); |
| TimeZone.setDefault(TimeZone.getTimeZone("UTC")); |
| Locale defaultLocale = Locale.getDefault(); |
| Locale.setDefault(locale); |
| try { |
| assertFormatted("Jan 1, 1970 12:00:00 AM", new DefaultDateTypeAdapter()); |
| assertFormatted("1/1/70", new DefaultDateTypeAdapter(DateFormat.SHORT)); |
| assertFormatted("Jan 1, 1970", new DefaultDateTypeAdapter(DateFormat.MEDIUM)); |
| assertFormatted("January 1, 1970", new DefaultDateTypeAdapter(DateFormat.LONG)); |
| assertFormatted("1/1/70 12:00 AM", |
| new DefaultDateTypeAdapter(DateFormat.SHORT, DateFormat.SHORT)); |
| assertFormatted("Jan 1, 1970 12:00:00 AM", |
| new DefaultDateTypeAdapter(DateFormat.MEDIUM, DateFormat.MEDIUM)); |
| assertFormatted("January 1, 1970 12:00:00 AM UTC", |
| new DefaultDateTypeAdapter(DateFormat.LONG, DateFormat.LONG)); |
| assertFormatted("Thursday, January 1, 1970 12:00:00 AM UTC", |
| new DefaultDateTypeAdapter(DateFormat.FULL, DateFormat.FULL)); |
| } finally { |
| TimeZone.setDefault(defaultTimeZone); |
| Locale.setDefault(defaultLocale); |
| } |
| } |
| |
| public void testParsingDatesFormattedWithSystemLocale() { |
| TimeZone defaultTimeZone = TimeZone.getDefault(); |
| TimeZone.setDefault(TimeZone.getTimeZone("UTC")); |
| Locale defaultLocale = Locale.getDefault(); |
| Locale.setDefault(Locale.FRANCE); |
| try { |
| assertParsed("1 janv. 1970 00:00:00", new DefaultDateTypeAdapter()); |
| assertParsed("01/01/70", new DefaultDateTypeAdapter(DateFormat.SHORT)); |
| assertParsed("1 janv. 1970", new DefaultDateTypeAdapter(DateFormat.MEDIUM)); |
| assertParsed("1 janvier 1970", new DefaultDateTypeAdapter(DateFormat.LONG)); |
| assertParsed("01/01/70 00:00", |
| new DefaultDateTypeAdapter(DateFormat.SHORT, DateFormat.SHORT)); |
| assertParsed("1 janv. 1970 00:00:00", |
| new DefaultDateTypeAdapter(DateFormat.MEDIUM, DateFormat.MEDIUM)); |
| assertParsed("1 janvier 1970 00:00:00 UTC", |
| new DefaultDateTypeAdapter(DateFormat.LONG, DateFormat.LONG)); |
| assertParsed("jeudi 1 janvier 1970 00 h 00 UTC", |
| new DefaultDateTypeAdapter(DateFormat.FULL, DateFormat.FULL)); |
| } finally { |
| TimeZone.setDefault(defaultTimeZone); |
| Locale.setDefault(defaultLocale); |
| } |
| } |
| |
| public void testParsingDatesFormattedWithUsLocale() { |
| TimeZone defaultTimeZone = TimeZone.getDefault(); |
| TimeZone.setDefault(TimeZone.getTimeZone("UTC")); |
| Locale defaultLocale = Locale.getDefault(); |
| Locale.setDefault(Locale.US); |
| try { |
| assertParsed("Jan 1, 1970 0:00:00 AM", new DefaultDateTypeAdapter()); |
| assertParsed("1/1/70", new DefaultDateTypeAdapter(DateFormat.SHORT)); |
| assertParsed("Jan 1, 1970", new DefaultDateTypeAdapter(DateFormat.MEDIUM)); |
| assertParsed("January 1, 1970", new DefaultDateTypeAdapter(DateFormat.LONG)); |
| assertParsed("1/1/70 0:00 AM", |
| new DefaultDateTypeAdapter(DateFormat.SHORT, DateFormat.SHORT)); |
| assertParsed("Jan 1, 1970 0:00:00 AM", |
| new DefaultDateTypeAdapter(DateFormat.MEDIUM, DateFormat.MEDIUM)); |
| assertParsed("January 1, 1970 0:00:00 AM UTC", |
| new DefaultDateTypeAdapter(DateFormat.LONG, DateFormat.LONG)); |
| assertParsed("Thursday, January 1, 1970 0:00:00 AM UTC", |
| new DefaultDateTypeAdapter(DateFormat.FULL, DateFormat.FULL)); |
| } finally { |
| TimeZone.setDefault(defaultTimeZone); |
| Locale.setDefault(defaultLocale); |
| } |
| } |
| |
| public void testFormatUsesDefaultTimezone() { |
| TimeZone defaultTimeZone = TimeZone.getDefault(); |
| TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); |
| Locale defaultLocale = Locale.getDefault(); |
| Locale.setDefault(Locale.US); |
| try { |
| assertFormatted("Dec 31, 1969 4:00:00 PM", new DefaultDateTypeAdapter()); |
| assertParsed("Dec 31, 1969 4:00:00 PM", new DefaultDateTypeAdapter()); |
| } finally { |
| TimeZone.setDefault(defaultTimeZone); |
| Locale.setDefault(defaultLocale); |
| } |
| } |
| |
| public void testDateSerialization() throws Exception { |
| int dateStyle = DateFormat.LONG; |
| DefaultDateTypeAdapter dateTypeAdapter = new DefaultDateTypeAdapter(dateStyle); |
| DateFormat formatter = DateFormat.getDateInstance(dateStyle); |
| Date currentDate = new Date(); |
| |
| String dateString = dateTypeAdapter.serialize(currentDate, Date.class, null).getAsString(); |
| assertEquals(formatter.format(currentDate), dateString); |
| } |
| |
| public void testDatePattern() throws Exception { |
| String pattern = "yyyy-MM-dd"; |
| DefaultDateTypeAdapter dateTypeAdapter = new DefaultDateTypeAdapter(pattern); |
| DateFormat formatter = new SimpleDateFormat(pattern); |
| Date currentDate = new Date(); |
| |
| String dateString = dateTypeAdapter.serialize(currentDate, Date.class, null).getAsString(); |
| assertEquals(formatter.format(currentDate), dateString); |
| } |
| |
| public void testInvalidDatePattern() throws Exception { |
| try { |
| new DefaultDateTypeAdapter("I am a bad Date pattern...."); |
| fail("Invalid date pattern should fail."); |
| } catch (IllegalArgumentException expected) { } |
| } |
| |
| private void assertFormatted(String formatted, DefaultDateTypeAdapter adapter) { |
| assertEquals(formatted, adapter.serialize(new Date(0), Date.class, null).getAsString()); |
| } |
| |
| private void assertParsed(String date, DefaultDateTypeAdapter adapter) { |
| assertEquals(date, new Date(0), adapter.deserialize(new JsonPrimitive(date), Date.class, null)); |
| assertEquals("ISO 8601", new Date(0), adapter.deserialize( |
| new JsonPrimitive("1970-01-01T00:00:00Z"), Date.class, null)); |
| } |
| } |