/* * Copyright (C) 2014 SCVNGR, Inc. d/b/a LevelUp * * 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.scvngr.levelup.core.util; import android.support.annotation.NonNull; import android.test.suitebuilder.annotation.SmallTest; import com.scvngr.levelup.core.test.SupportAndroidTestCase; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.TimeZone; /** * Tests {@link com.scvngr.levelup.core.util.IsoDateUtils}. */ public final class IsoDateUtilsTest extends SupportAndroidTestCase { @NonNull private static final TimeZone TIME_ZONE_EST = NullUtils.nonNullContract(TimeZone .getTimeZone("GMT-0500")); @NonNull private static final TimeZone TIME_ZONE_HST = NullUtils.nonNullContract(TimeZone .getTimeZone("GMT-1000")); @SmallTest public void testGetTimeZoneUtc() { final TimeZone timeZone = IsoDateUtils.getTimeZoneUtc(); assertEquals(0, timeZone.getRawOffset()); assertEquals("UTC", timeZone.getID()); assertEquals(TimeZone.getTimeZone("UTC"), timeZone); } @SmallTest public void testParseIsoDateTime() { validateParseIsoDateTime(IsoDateUtils.getTimeZoneUtc()); validateParseIsoDateTime(TIME_ZONE_EST); validateParseIsoDateTime(TIME_ZONE_HST); } @SmallTest public void testParseIsoDateTime_parseException() { validateParseIsoDateTimeParseException(IsoDateUtils.getTimeZoneUtc()); validateParseIsoDateTimeParseException(TIME_ZONE_EST); validateParseIsoDateTimeParseException(TIME_ZONE_HST); } @SmallTest public void testToIsoDateTime() { final Date date = new Date(1370993354000L); assertEquals("2013-06-11T23:29:14+0000", IsoDateUtils.toIsoDatetime(date, IsoDateUtils.getTimeZoneUtc())); assertEquals("2013-06-11T18:29:14-0500", IsoDateUtils.toIsoDatetime(date, TIME_ZONE_EST)); assertEquals("2013-06-11T13:29:14-1000", IsoDateUtils.toIsoDatetime(date, TIME_ZONE_HST)); } /** * Validate the {@link java.text.ParseException} thrown by * {@link com.scvngr.levelup.core.util.IsoDateUtils#parseIsoDatetime(String, java.util.TimeZone)} when given an invalid datetime. * * @param timeZone The relative {@link java.util.TimeZone}. */ private static void validateParseIsoDateTimeParseException(@NonNull final TimeZone timeZone) { try { IsoDateUtils.parseIsoDatetime("2011-05-03T12:00:00", timeZone); fail("ParseException should have been thrown."); } catch (final ParseException e) { // Expected exception } try { IsoDateUtils.parseIsoDatetime("2011-05-0312:00:00-05:00", timeZone); fail("ParseException should have been thrown."); } catch (final ParseException e) { // Expected exception } } /** * Validate the {@link java.util.Date}s generated by * {@link com.scvngr.levelup.core.util.IsoDateUtils#parseIsoDatetime(String, java.util.TimeZone)} when given valid datetimes. * * @param timeZone The relative {@link java.util.TimeZone}. */ private static void validateParseIsoDateTime(@NonNull final TimeZone timeZone) { try { { final Date date = IsoDateUtils.parseIsoDatetime("2012-12-04T18:10:45-05:00", timeZone); final Calendar cal = Calendar.getInstance(timeZone, Locale.US); cal.setTime(date); assertEquals(2012, cal.get(Calendar.YEAR)); assertEquals(4, cal.get(Calendar.DAY_OF_MONTH)); assertEquals(11, cal.get(Calendar.MONTH)); assertEquals(23 + getTimeZoneOffsetHours(timeZone), cal.get(Calendar.HOUR_OF_DAY)); assertEquals(10, cal.get(Calendar.MINUTE)); assertEquals(45, cal.get(Calendar.SECOND)); assertEquals(timeZone.getRawOffset(), cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)); } { final Date date = IsoDateUtils.parseIsoDatetime("2011-05-03T12:00:00-0400", timeZone); final Calendar cal = Calendar.getInstance(timeZone, Locale.US); cal.setTime(date); assertEquals(2011, cal.get(Calendar.YEAR)); assertEquals(3, cal.get(Calendar.DAY_OF_MONTH)); assertEquals(4, cal.get(Calendar.MONTH)); assertEquals(16 + getTimeZoneOffsetHours(timeZone), cal.get(Calendar.HOUR_OF_DAY)); assertEquals(0, cal.get(Calendar.MINUTE)); assertEquals(0, cal.get(Calendar.SECOND)); assertEquals(timeZone.getRawOffset(), cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)); } } catch (final ParseException e) { fail("ParseException should have been thrown."); } } /** * Get a {@link java.util.TimeZone}'s offset hours. * * @param timeZone The {@link java.util.TimeZone}. * @return The number of hours offset from GMT. */ private static int getTimeZoneOffsetHours(@NonNull final TimeZone timeZone) { return timeZone.getRawOffset() / 3600000; } }