/**
* See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Board of Regents of the University of Wisconsin System
* licenses this file to you 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.microsoft.exchange;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.List;
import java.util.TimeZone;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.XMLGregorianCalendar;
import net.fortuna.ical4j.util.TimeZones;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.junit.Test;
import org.springframework.util.CollectionUtils;
public class DateHelpTest {
private final Log log = LogFactory.getLog(this.getClass());
@Test
public void systemTimeZone(){
List<String> availableIDs = Arrays.asList(TimeZone.getAvailableIDs());
assertFalse(CollectionUtils.isEmpty(availableIDs));
assertTrue(availableIDs.contains(TimeZones.UTC_ID));
assertTrue(availableIDs.contains("UTC"));
TimeZone ical4jUTC = TimeZone.getTimeZone(TimeZones.UTC_ID);
TimeZone sysUTC = TimeZone.getTimeZone("UTC");
assertEquals(ical4jUTC.getDSTSavings(), sysUTC.getDSTSavings());
assertEquals(ical4jUTC.getRawOffset(), sysUTC.getRawOffset());
assertTrue(ical4jUTC.hasSameRules(sysUTC));
TimeZone origDefaultTimeZone = TimeZone.getDefault();
assertNotNull(origDefaultTimeZone);
assertEquals(TimeZone.getDefault().getRawOffset(), origDefaultTimeZone.getRawOffset());
log.info("TimeZone.DisplayName="+origDefaultTimeZone.getDisplayName());
log.info("TimeZone.ID="+origDefaultTimeZone.getID());
log.info("TimeZone.DSTSavings="+origDefaultTimeZone.getDSTSavings());
log.info("TimeZone.RawOffset="+origDefaultTimeZone.getRawOffset());
log.info("TimeZone.useDaylightTime="+origDefaultTimeZone.useDaylightTime());
TimeZone.setDefault(ical4jUTC);
assertEquals(ical4jUTC, TimeZone.getDefault());
log.info(" -- Defualt Time Zone has been changed successfully! -- ");
TimeZone newDefaultTimeZone = TimeZone.getDefault();
log.info("TimeZone.DisplayName="+newDefaultTimeZone.getDisplayName());
log.info("TimeZone.ID="+newDefaultTimeZone.getID());
log.info("TimeZone.DSTSavings="+newDefaultTimeZone.getDSTSavings());
log.info("TimeZone.RawOffset="+newDefaultTimeZone.getRawOffset());
log.info("TimeZone.useDaylightTime="+newDefaultTimeZone.useDaylightTime());
}
/**
* Gets an {@link XMLGregorianCalendar} for the current date time using the default {@link TimeZone}
* Test ensures the generated {@link XMLGregorianCalendar} has an offset which is equivalant to the default timezones rawOffSet + dstSavings
* @throws DatatypeConfigurationException
*/
@Test
public void getXMLGregorianCalendarNow() throws DatatypeConfigurationException{
XMLGregorianCalendar xmlGregorianCalendarNow = DateHelp.getXMLGregorianCalendarNow();
assertNotNull(xmlGregorianCalendarNow);
int xmlTimeZoneOffsetMinutes = xmlGregorianCalendarNow.getTimezone();
TimeZone xmlTimeZone = xmlGregorianCalendarNow.getTimeZone(xmlTimeZoneOffsetMinutes);
assertNotNull(xmlTimeZone);
TimeZone jvmTimeZone = TimeZone.getDefault();
xmlGregorianCalendareMatchesTimeZone(xmlGregorianCalendarNow,jvmTimeZone);
}
/**
* Computes the time zone offset for a given {@link XMLGregorianCalendar} and compares to the specified {@link TimeZone}
*
*
*
* @param xmlGregorianCalendar
* @param timeZone
*/
public boolean xmlGregorianCalendareMatchesTimeZone(XMLGregorianCalendar xmlGregorianCalendar, TimeZone timeZone){
int xmlTimeZoneOffsetMinutes = xmlGregorianCalendar.getTimezone();
TimeZone xmlTimeZone = xmlGregorianCalendar.getTimeZone(xmlTimeZoneOffsetMinutes);
int jvmRawOffsetMinutes = (timeZone.getRawOffset()/1000/60);
int jvmDstOffsetMinutes = (timeZone.getDSTSavings()/1000/60);
int xmlRawOffsetMinutes = (xmlTimeZone.getRawOffset()/1000/60);
int xmlDstOffsetMinutes = (xmlTimeZone.getDSTSavings()/1000/60);
//XMLGregorianCalendar only stores an Int for offset, no DST information.
//as a result the xmlTimeZone and jvmTimeZone almost never follow the same rules
if(timeZone.hasSameRules(xmlTimeZone)){
log.debug("xmlTimeZoneId="+xmlTimeZone.getID()+ " hasSameRules as jvmTimeZone="+timeZone.getID());
return true;
}
if(timeZone.useDaylightTime()){
//they definately do not when the jvmTimeZone uses DST.
assertFalse(xmlTimeZone.hasSameRules(timeZone));
jvmRawOffsetMinutes+=jvmDstOffsetMinutes;
}
if(xmlTimeZone.useDaylightTime()){
xmlRawOffsetMinutes+=xmlDstOffsetMinutes;
}
if(xmlTimeZoneOffsetMinutes != xmlRawOffsetMinutes){
log.info("xmlTimeZoneId="+xmlTimeZone.getID()+ " has weird rules");
}
return (jvmRawOffsetMinutes == xmlRawOffsetMinutes);
}
@Test
public void getXMLGregorianCalendarsForTimeZones() throws DatatypeConfigurationException{
List<String> availableIDs = Arrays.asList(TimeZone.getAvailableIDs());
for(String timeZoneID :availableIDs ){
TimeZone currTimeZone = TimeZone.getTimeZone(timeZoneID);
XMLGregorianCalendar currXmlCalendar = DateHelp.getXMLGregorianCalendarNow(currTimeZone);
boolean match = xmlGregorianCalendareMatchesTimeZone(currXmlCalendar,currTimeZone);
if(!match) log.info(currTimeZone.getID() +" "+(match ? "PASSED":"FAILED"));
}
}
@Test
public void splitIntervalTest() {
DateTime start= new DateTime();
DateTime end = start.plusYears(1);
assertTrue(start.isBefore(end));
assertTrue( (end.getMillis() > start.getMillis()) );
List<Interval> intervals = DateHelp.generateIntervals(start.toDate(), end.toDate());
assertNotNull(intervals);
assertEquals(2, intervals.size());
Interval lastInterval = null;
for(Interval interval : intervals) {
log.info(interval);
if(lastInterval != null) {
assertTrue(interval.abuts(lastInterval));
}
lastInterval=interval;
}
}
@Test
public void splitMultipleIntervalTest() {
DateTime start= new DateTime();
DateTime end = start.plusYears(1);
assertTrue(start.isBefore(end));
assertTrue( (end.getMillis() > start.getMillis()) );
List<Interval> intervals = DateHelp.generateMultipleIntervals(start.toDate(), end.toDate(),4);
assertNotNull(intervals);
assertEquals(4, intervals.size());
Interval lastInterval = null;
for(Interval interval : intervals) {
log.info(interval);
if(lastInterval != null) {
assertTrue(interval.abuts(lastInterval));
}
lastInterval=interval;
}
}
}