/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.el.datetime;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import org.mule.runtime.core.api.el.datetime.Time;
import org.mule.tck.junit4.AbstractMuleTestCase;
import org.mule.tck.size.SmallTest;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import javax.xml.bind.DatatypeConverter;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import org.junit.Before;
import org.junit.Test;
@SmallTest
public class DateTimeTimeTestCase extends AbstractMuleTestCase {
public static final int TWO_DAYS_IN_SECONDS = 172800;
public static final int TWO_DAYS_IN_MINUTES = 2880;
public static final int TWO_DAYS_IN_HOURS = 48;
protected volatile Calendar calendarNow;
protected volatile DateTime now;
protected volatile DateTime before;
protected volatile DateTime after;
@Before
public void setup() {
calendarNow = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
GregorianCalendar calendarBefore = ((GregorianCalendar) calendarNow.clone());
calendarBefore.add(Calendar.MILLISECOND, -10);
GregorianCalendar calendarAfter = ((GregorianCalendar) calendarNow.clone());
calendarAfter.add(Calendar.MILLISECOND, +10);
before = new DateTime(calendarBefore).withTimeZone("UTC");
now = new DateTime((GregorianCalendar) calendarNow.clone()).withTimeZone("UTC");
after = new DateTime(calendarAfter).withTimeZone("UTC");
}
@Test
public void milliSeconds() {
assertThat(now.getMilliSeconds(), is((long) calendarNow.get(Calendar.MILLISECOND)));
}
@Test
public void isBefore() {
assertThat(before.isBefore(now), is(true));
assertThat(before.isBefore(after), is(true));
assertThat(now.isBefore(after), is(true));
}
@Test
public void isAfter() {
assertThat(after.isAfter(before), is(true));
assertThat(after.isAfter(now), is(true));
assertThat(now.isAfter(before), is(true));
}
@Test
public void format() {
SimpleDateFormat df = new SimpleDateFormat("hh:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
assertThat(now.format("hh:mm:ss"), is(df.format(calendarNow.getTime())));
}
@Test
public void timeZone() {
assertThat(now.getTimeZone(), is(TimeZone.getTimeZone("UTC").getDisplayName()));
}
@Test
public void plusSeconds() {
assertThat(now.plusSeconds(1).getSeconds(), is((calendarNow.get(Calendar.SECOND) + 1) % 60));
}
@Test
public void plusSecondsShouldKeepSameDayInRollover() {
assertSameDay(now.getTime(), now.getTime().plusSeconds(TWO_DAYS_IN_SECONDS));
}
@Test
public void plusMinutes() {
assertThat(now.getTime().plusMinutes(1).getMinutes(), is((calendarNow.get(Calendar.MINUTE) + 1) % 60));
}
@Test
public void plusMinutesShouldKeepSameDayInRollover() {
assertSameDay(now.getTime(), now.getTime().plusMinutes(TWO_DAYS_IN_MINUTES));
}
@Test
public void plusHours() {
assertThat(now.getTime().plusHours(1).getHours(), is((calendarNow.get(Calendar.HOUR_OF_DAY) + 1) % 24));
}
@Test
public void plusHoursShouldKeepSameDayInRollover() {
assertSameDay(now.getTime(), now.getTime().plusHours(TWO_DAYS_IN_HOURS));
}
private void assertSameDay(Time a, Time b) {
assertThat(a.toCalendar().get(Calendar.DAY_OF_YEAR), is(b.toCalendar().get(Calendar.DAY_OF_YEAR)));
}
@Test
public void withTimeZone() {
int hour = now.getHours();
assertThat(now.withTimeZone("GMT-03:00").getHours(), is(hour));
}
@Test
public void changeTimeZone() {
int hour = now.getHours();
assertThat(now.changeTimeZone("GMT-03:00").getHours(), is((hour + 24 - 3) % 24));
}
@Test
public void changeTimeZoneRollover() {
assertThat(now.getTime().plusHours(48).toCalendar().get(Calendar.DAY_OF_YEAR), is(1));
}
@Test
public void seconds() {
assertThat(now.getSeconds(), is(calendarNow.get(Calendar.SECOND)));
}
@Test
public void minutes() {
assertThat(now.getMinutes(), is(calendarNow.get(Calendar.MINUTE)));
}
@Test
public void hourOfDay() {
assertThat(now.getHours(), is(calendarNow.get(Calendar.HOUR_OF_DAY)));
}
@Test
public void testToString() {
assertThat(now.getTime().withTimeZone("UTC").toString().substring(0, 8),
is(DatatypeConverter.printTime(Calendar.getInstance(TimeZone.getTimeZone("UTC"))).substring(0, 8)));
}
@Test
public void toDate() {
assertThat(now.toDate(), is(instanceOf(Date.class)));
}
@Test
public void toCalendar() {
assertThat(now.toCalendar(), is(instanceOf(GregorianCalendar.class)));
}
@Test
public void toXMLCalendar() throws DatatypeConfigurationException {
assertThat(now.toXMLCalendar(), is(instanceOf(XMLGregorianCalendar.class)));
}
@Test
public void fromDate() {
Date date = new Date();
date.setYear(0);
date.setMonth(0);
date.setDate(1);
assertEquals(1900, new DateTime(date).getYear());
assertEquals(1, new DateTime(date).getMonth());
assertEquals(1, new DateTime(date).getDayOfMonth());
}
@Test
public void fromCalendar() {
Calendar cal = new GregorianCalendar();
cal.set(Calendar.YEAR, 1900);
cal.set(Calendar.MONTH, 0);
cal.set(Calendar.DAY_OF_MONTH, 1);
assertEquals(1900, new DateTime(cal).getYear());
assertEquals(1, new DateTime(cal).getMonth());
assertEquals(1, new DateTime(cal).getDayOfMonth());
}
@Test
public void fromXMLCalendar() throws DatatypeConfigurationException {
XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
xmlCal.setYear(1900);
xmlCal.setMonth(1);
xmlCal.setDay(1);
assertEquals(1900, new DateTime(xmlCal).getYear());
assertEquals(1, new DateTime(xmlCal).getMonth());
assertEquals(1, new DateTime(xmlCal).getDayOfMonth());
}
}