com.microsoft.exchange.DateHelpTest.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.exchange.DateHelpTest.java

Source

/**
 * 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;
        }

    }

}