/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.epl.datetime;
import com.espertech.esper.client.util.DateTime;
import com.espertech.esper.client.util.TimePeriod;
import com.espertech.esper.epl.datetime.calop.CalendarOpPlusFastAddHelper;
import com.espertech.esper.epl.datetime.calop.CalendarOpPlusFastAddResult;
import com.espertech.esper.epl.expression.time.TimeAbacusMilliseconds;
import junit.framework.TestCase;
import java.util.Calendar;
public class TestCalendarOpPlusFastAddHelper extends TestCase {
public void testCompute() {
long defaultCurrent = DateTime.parseDefaultMSec("2002-05-30T09:51:01.150");
// millisecond adds
TimePeriod oneMsec = new TimePeriod().millis(1);
assertCompute(defaultCurrent, oneMsec, "1980-01-01T00:00:00.000",
new LongAssertionAtLeast(22 * 365 * 24 * 60 * 60 * 1000L), "2002-05-30T09:51:01.151");
assertCompute(defaultCurrent, oneMsec, "2001-06-01T00:00:00.000",
new LongAssertionAtLeast(363 * 24 * 60 * 60 * 1000L), "2002-05-30T09:51:01.151");
// 10-millisecond adds
TimePeriod tenMsec = new TimePeriod().millis(10);
assertCompute(defaultCurrent, tenMsec, "1980-01-01T00:00:00.000",
new LongAssertionAtLeast(22 * 365 * 24 * 60 * 60 * 100L), "2002-05-30T09:51:01.160");
// 100-millisecond adds
TimePeriod hundredMsec = new TimePeriod().millis(100);
assertCompute(defaultCurrent, hundredMsec, "1980-01-01T00:00:00.000",
new LongAssertionAtLeast(22 * 365 * 24 * 60 * 60 * 10L), "2002-05-30T09:51:01.200");
// 1-hour-in-millisecond adds
TimePeriod oneHourInMsec = new TimePeriod().millis(60 * 60 * 1000);
assertCompute(defaultCurrent, oneHourInMsec, "1980-01-01T00:00:00.000",
new LongAssertionAtLeast(22 * 365 * 24), "2002-05-30T10:00:00.000");
// second adds
TimePeriod oneSec = new TimePeriod().sec(1);
assertCompute(defaultCurrent, oneSec, "1980-01-01T00:00:00.000",
new LongAssertionAtLeast(22 * 365 * 24 * 60 * 60L), "2002-05-30T09:51:02.000");
assertCompute(defaultCurrent, oneSec, "2002-05-30T09:51:00.150",
new LongAssertionAtLeast(2), "2002-05-30T09:51:02.150");
assertCompute(defaultCurrent, oneSec, "2002-05-30T09:51:00.151",
new LongAssertionAtLeast(1), "2002-05-30T09:51:01.151");
assertCompute(defaultCurrent, oneSec, "2002-05-30T09:51:01.149",
new LongAssertionAtLeast(1), "2002-05-30T09:51:02.149");
assertCompute(defaultCurrent, oneSec, "2002-05-30T09:51:01.150",
new LongAssertionAtLeast(1), "2002-05-30T09:51:02.150");
assertCompute(defaultCurrent, oneSec, "2002-05-30T09:51:01.151",
new LongAssertionAtLeast(0), "2002-05-30T09:51:01.151");
// 10-second adds
TimePeriod tenSec = new TimePeriod().sec(10);
assertCompute(defaultCurrent, tenSec, "1980-01-01T00:00:00.000",
new LongAssertionAtLeast(22 * 365 * 24 * 60 * 6L), "2002-05-30T09:51:10.000");
assertCompute(defaultCurrent, tenSec, "2002-05-30T09:50:00.000",
new LongAssertionExact(7L), "2002-05-30T09:51:10.000");
assertCompute(defaultCurrent, tenSec, "2002-05-30T09:50:51.149",
new LongAssertionExact(2L), "2002-05-30T09:51:11.149");
assertCompute(defaultCurrent, tenSec, "2002-05-30T09:50:51.150",
new LongAssertionExact(2L), "2002-05-30T09:51:11.150");
assertCompute(defaultCurrent, tenSec, "2002-05-30T09:50:51.151",
new LongAssertionExact(1L), "2002-05-30T09:51:01.151");
assertCompute(defaultCurrent, tenSec, "2002-05-30T09:51:00.149",
new LongAssertionExact(1L), "2002-05-30T09:51:10.149");
assertCompute(defaultCurrent, tenSec, "2002-05-30T09:51:01.149",
new LongAssertionExact(1L), "2002-05-30T09:51:11.149");
assertCompute(defaultCurrent, tenSec, "2002-05-30T09:51:01.150",
new LongAssertionExact(1L), "2002-05-30T09:51:11.150");
// minute adds
TimePeriod oneMin = new TimePeriod().min(1);
assertCompute(defaultCurrent, oneMin, "1980-01-01T00:00:00.000",
new LongAssertionAtLeast(22 * 365 * 24 * 60), "2002-05-30T09:52:00.000");
// 10-minute adds
TimePeriod tenMin = new TimePeriod().min(10);
assertCompute(defaultCurrent, tenMin, "1980-01-01T00:00:00.000",
new LongAssertionAtLeast(22 * 365 * 24 * 6), "2002-05-30T10:00:00.000");
// 1-hour adds
TimePeriod oneHour = new TimePeriod().hours(1);
assertCompute(defaultCurrent, oneHour, "1980-01-01T00:00:00.000",
new LongAssertionAtLeast(22 * 365 * 24), "2002-05-30T10:00:00.000");
// 1-day adds
TimePeriod oneDay = new TimePeriod().days(1);
assertCompute(defaultCurrent, oneDay, "1980-01-01T00:00:00.000",
new LongAssertionAtLeast(22 * 365), "2002-05-31T00:00:00.000");
// 1-month adds
TimePeriod oneMonth = new TimePeriod().months(1);
assertCompute(defaultCurrent, oneMonth, "1980-01-01T00:00:00.000",
new LongAssertionAtLeast(22 * 12), "2002-06-01T00:00:00.000");
// 1-year adds
TimePeriod oneYear = new TimePeriod().years(1);
assertCompute(defaultCurrent, oneYear, "1980-01-01T00:00:00.000",
new LongAssertionExact(23), "2003-01-01T00:00:00.000");
// Uneven adds
TimePeriod unevenOne = new TimePeriod().years(1).months(2).days(3);
assertCompute(defaultCurrent, unevenOne, "1980-01-01T00:00:00.000",
new LongAssertionExact(20), "2003-06-30T00:00:00.000");
assertCompute(defaultCurrent, unevenOne, "2002-01-01T00:00:00.000",
new LongAssertionExact(1), "2003-03-04T00:00:00.000");
assertCompute(defaultCurrent, unevenOne, "2001-01-01T00:00:00.000",
new LongAssertionExact(2), "2003-05-07T00:00:00.000");
}
private void assertCompute(long current, TimePeriod timePeriod, String reference,
LongAssertion factorAssertion, String expectedTarget) {
Calendar referenceDate = DateTime.parseDefaultCal(reference);
CalendarOpPlusFastAddResult result = CalendarOpPlusFastAddHelper.computeNextDue(current, timePeriod, referenceDate, TimeAbacusMilliseconds.INSTANCE, 0);
assertEquals("\nExpected " + expectedTarget + "\n" +
"Received " + DateTime.print(result.getScheduled()) + "\n",
DateTime.parseDefaultCal(expectedTarget), result.getScheduled());
factorAssertion.assertLong(result.getFactor());
}
private interface LongAssertion {
public void assertLong(long value);
}
private static class LongAssertionExact implements LongAssertion {
private final long expected;
private LongAssertionExact(long expected) {
this.expected = expected;
}
public void assertLong(long value) {
assertEquals(expected, value);
}
}
private static class LongAssertionAtLeast implements LongAssertion {
private final long atLeast;
private LongAssertionAtLeast(long atLeast) {
this.atLeast = atLeast;
}
public void assertLong(long value) {
assertTrue(value >= atLeast);
}
}
}