/** * The contents of this file are subject to the OpenMRS Public License * Version 1.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://license.openmrs.org * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * Copyright (C) OpenMRS, LLC. All Rights Reserved. */ package org.openmrs.module.reporting.common; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Assert; import org.junit.Test; import org.openmrs.test.BaseModuleContextSensitiveTest; import org.openmrs.test.Verifies; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; /** * Testing the cohort definition persister. */ public class DateUtilTest extends BaseModuleContextSensitiveTest { protected Log log = LogFactory.getLog(this.getClass()); protected void testMessage(String expected, String actual) { StringBuilder expectedMessage = new StringBuilder(); for (String s : expected.split(" ")) { expectedMessage.append(expectedMessage.length() == 0 ? "" : " ").append(MessageUtil.translate(s, s)); } Assert.assertEquals(expectedMessage.toString(), actual); } @Test public void shouldReturnInTheFuture() { Calendar calendar = Calendar.getInstance(); Date now = new Date(); calendar.setTime(now); calendar.add(Calendar.SECOND, +1); testMessage("reporting.dateUtil.inTheFuture", DateUtil.getTimespan(now, calendar.getTime())); } @Test public void shouldReturnOneSecondAgo() { Calendar calendar = Calendar.getInstance(); Date now = new Date(); calendar.setTime(now); calendar.add(Calendar.SECOND, -1); testMessage("reporting.dateUtil.oneSecond reporting.dateUtil.ago", DateUtil.getTimespan(now, calendar.getTime())); } @Test public void shouldReturnThirtySecondsAgo() { Calendar calendar = Calendar.getInstance(); Date now = new Date(); calendar.setTime(now); calendar.add(Calendar.SECOND, -30); testMessage("30 reporting.dateUtil.seconds reporting.dateUtil.ago", DateUtil.getTimespan(now, calendar.getTime())); } @Test public void shouldReturnAnHourAgo() { Calendar calendar = Calendar.getInstance(); Date now = new Date(); calendar.setTime(now); calendar.add(Calendar.MINUTE, -40); testMessage("40 reporting.dateUtil.minutes reporting.dateUtil.ago", DateUtil.getTimespan(now, calendar.getTime())); } @Test public void shouldReturnOneHourAgo() { Calendar calendar = Calendar.getInstance(); Date now = new Date(); calendar.setTime(now); calendar.add(Calendar.MINUTE, -65); testMessage("reporting.dateUtil.anHour reporting.dateUtil.ago", DateUtil.getTimespan(now, calendar.getTime())); } @Test public void shouldReturnSixHoursAgo() { Calendar calendar = Calendar.getInstance(); Date now = new Date(); calendar.setTime(now); calendar.add(Calendar.HOUR, -6); testMessage("6 reporting.dateUtil.hours reporting.dateUtil.ago", DateUtil.getTimespan(now, calendar.getTime())); } @Test public void shouldReturnYesterday() { Calendar calendar = Calendar.getInstance(); Date now = new Date(); calendar.setTime(now); calendar.add(Calendar.DAY_OF_MONTH, -1); testMessage("reporting.dateUtil.yesterday", DateUtil.getTimespan(now, calendar.getTime())); } @Test public void shouldReturnTenDaysAgo() { Calendar calendar = Calendar.getInstance(); Date now = new Date(); calendar.setTime(now); calendar.add(Calendar.DAY_OF_MONTH, -10); testMessage("10 reporting.dateUtil.days reporting.dateUtil.ago", DateUtil.getTimespan(now, calendar.getTime())); } @Test public void shouldReturnOneMonthAgo() { Calendar calendar = Calendar.getInstance(); Date now = new Date(); calendar.setTime(now); calendar.add(Calendar.MONTH, -1); testMessage("reporting.dateUtil.oneMonth reporting.dateUtil.ago", DateUtil.getTimespan(now, calendar.getTime())); } @Test public void shouldReturnFiveMonthsAgo() { Calendar calendar = Calendar.getInstance(); Date now = new Date(); calendar.setTime(now); calendar.add(Calendar.MONTH, -5); testMessage("5 reporting.dateUtil.months reporting.dateUtil.ago", DateUtil.getTimespan(now, calendar.getTime())); } @Test public void shouldReturnOneYearAgo() { Calendar calendar = Calendar.getInstance(); Date now = new Date(); calendar.setTime(now); calendar.add(Calendar.YEAR, -1); testMessage("reporting.dateUtil.oneYear reporting.dateUtil.ago", DateUtil.getTimespan(now, calendar.getTime())); } @Test public void shouldReturnTenYearsAgo() { Calendar calendar = Calendar.getInstance(); Date now = new Date(); calendar.setTime(now); calendar.add(Calendar.YEAR, -10); testMessage("10 reporting.dateUtil.years reporting.dateUtil.ago", DateUtil.getTimespan(now, calendar.getTime())); } @Test @Verifies(value = "should correctly handle daylight savings time", method = "getTimespan(Date,Date,null)") public void getTimespan_shouldCorrectlyHandleDaylightSavingsTime() throws Exception { // USA has daylight saving time. // in 2009 DST started March 8 and ended November 1 Calendar cal = new GregorianCalendar(Locale.US); cal.set(Calendar.YEAR, 2009); cal.set(Calendar.DAY_OF_MONTH, 25); cal.set(Calendar.MONTH, Calendar.FEBRUARY); Date feb25 = cal.getTime(); cal.set(Calendar.MONTH, Calendar.MARCH); Date mar25 = cal.getTime(); cal.set(Calendar.MONTH, Calendar.APRIL); Date apr25 = cal.getTime(); cal.set(Calendar.MONTH, Calendar.OCTOBER); Date oct25 = cal.getTime(); cal.set(Calendar.MONTH, Calendar.NOVEMBER); Date nov25 = cal.getTime(); cal.set(Calendar.MONTH, Calendar.DECEMBER); Date dec25 = cal.getTime(); testMessage("reporting.dateUtil.oneMonth reporting.dateUtil.ago", DateUtil.getTimespan(mar25, feb25)); testMessage("reporting.dateUtil.oneMonth reporting.dateUtil.ago", DateUtil.getTimespan(apr25, mar25)); testMessage("reporting.dateUtil.oneMonth reporting.dateUtil.ago", DateUtil.getTimespan(nov25, oct25)); testMessage("reporting.dateUtil.oneMonth reporting.dateUtil.ago", DateUtil.getTimespan(dec25, nov25)); } @Test @Verifies(value = "should say one month ago even though february is short", method = "getTimespan(Date,Date,null)") public void getTimespan_shouldSayOneMonthAgoEvenThoughFebruaryIsShort() throws Exception { testMessage("reporting.dateUtil.oneMonth reporting.dateUtil.ago", DateUtil.getTimespan(DateUtil.getDateTime(2009, 3, 15), DateUtil.getDateTime(2009, 2, 15))); } @Test public void testParseYmdhms() throws Exception { DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); assertThat(df.format(DateUtil.parseYmdhms("2008-08-18 14:09:05.1")), is("2008-08-18 14:09:05.1")); assertThat(df.format(DateUtil.parseYmdhms("2008-08-18 14:09:05")), is("2008-08-18 14:09:05.0")); assertThat(df.format(DateUtil.parseYmdhms("2008-08-18")), is("2008-08-18 00:00:00.0")); } }