/**
* Copyright (c) 2014-2017 by the respective copyright holders.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.core.scheduler;
import static org.junit.Assert.assertEquals;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import org.junit.Test;
public class RecurrenceExpressionTest {
@Test(expected = IllegalArgumentException.class)
public void garbageString() throws ParseException {
new RecurrenceExpression("blahblahblah");
}
@Test
public void getTimeAfterCheck() throws ParseException {
Calendar cal = Calendar.getInstance();
cal.set(2016, 0, 1, 0, 0, 0); // set to Jan 1st 2016, 00:00
cal.set(Calendar.MILLISECOND, 0);
Date startDate = cal.getTime();
// This rule describes an event that takes place on every weekday (BYDAY) for the next 15 weekdays (COUNT).
RecurrenceExpression expr = new RecurrenceExpression("FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR;COUNT=15", startDate);
Date nextDate = expr.getTimeAfter(startDate);
cal.set(2016, 0, 4, 0, 0, 0);
cal.set(Calendar.MILLISECOND, 0);
Date checkDate = cal.getTime();
assertEquals(checkDate, nextDate);
}
@Test
public void IntervalCheck() throws ParseException {
Calendar cal = Calendar.getInstance();
cal.set(2016, 0, 1, 0, 0, 0); // set to Jan 1st 2016, 00:00
cal.set(Calendar.MILLISECOND, 0);
Date startDate = cal.getTime();
// US election day. Every fourth year (INTERVAL) on the first Tuesday (BYDAY) after a Monday (BYMONTHDAY ensures
// that) in November (BYMONTH).
RecurrenceExpression expr = new RecurrenceExpression(
"FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8", startDate);
Date nextDate = expr.getTimeAfter(startDate);
nextDate = expr.getTimeAfter(nextDate);
cal.set(2020, 10, 3, 0, 0, 0);
cal.set(Calendar.MILLISECOND, 0);
Date checkDate = cal.getTime();
assertEquals(checkDate, nextDate);
}
@Test
public void getFinalTimeCheck() throws ParseException {
Calendar cal = Calendar.getInstance();
cal.set(2016, 0, 1, 0, 0, 0); // set to Jan 1st 2016, 00:00
cal.set(Calendar.MILLISECOND, 0);
Date startDate = cal.getTime();
// This rule describes an event that takes place on every weekday (BYDAY) for the next 15 weekdays (COUNT).
RecurrenceExpression expr = new RecurrenceExpression("FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR;COUNT=15", startDate);
Date nextDate = expr.getFinalFireTime();
cal.set(2016, 0, 21, 0, 0, 0);
cal.set(Calendar.MILLISECOND, 0);
Date checkDate = cal.getTime();
assertEquals(checkDate, nextDate);
}
}