package org.celllife.idart.misc;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.celllife.function.AndRule;
import org.celllife.function.DateRule;
import org.celllife.function.DateRuleFactory;
import org.celllife.function.IRule;
import org.celllife.function.DateRule.RangeSelectionEnum;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* Unit tests for {@link org.celllife.function.DateRule}
*/
public class DateRangeRuleTest {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
private Date centerBoundry;
private Date upperBoundry;
private Date lowerBoundry;
private Date belowLower;
private Date aboveUpper;
private Date centerBoundryPlus;
private Date upperBoundryMinus;
@BeforeClass
public void init() throws ParseException {
centerBoundry = sdf.parse("20080101130000");
centerBoundryPlus = sdf.parse("20080101130001");
upperBoundry = sdf.parse("20080102150000");
upperBoundryMinus = sdf.parse("20080102145900");
lowerBoundry = sdf.parse("20071231090000");
belowLower = sdf.parse("20071230100000");
aboveUpper = sdf.parse("20080103210000");
}
@Test(dataProvider = "boudryProvider")
public void testSingleRule(Date boundry, RangeSelectionEnum restriction,
Date candidate, boolean expected, boolean ignoreTimestamp) {
DateRule rule = new DateRule(boundry, restriction);
if (ignoreTimestamp) {
rule.setDateComparator(new DateFieldComparator(
Calendar.DAY_OF_MONTH));
}
boolean result = rule.evaluate(candidate);
Assert.assertEquals(result, expected);
}
@DataProvider(name = "boudryProvider")
public Object[][] getRuleParams() {
return new Object[][] {
{ centerBoundry, RangeSelectionEnum.AFTER_BOUNDRY_INCLUSIVE,
centerBoundry, true, false },
{ centerBoundry, RangeSelectionEnum.AFTER_BOUNDRY,
centerBoundry, false, false },
{ centerBoundry, RangeSelectionEnum.AFTER_BOUNDRY,
upperBoundry, true, false },
{ centerBoundry, RangeSelectionEnum.AFTER_BOUNDRY_INCLUSIVE,
upperBoundry, true, false },
{ centerBoundry, RangeSelectionEnum.AFTER_BOUNDRY,
lowerBoundry, false, false },
{ centerBoundry, RangeSelectionEnum.AFTER_BOUNDRY_INCLUSIVE,
lowerBoundry, false, false },
{ centerBoundry, RangeSelectionEnum.BEFORE_BOUNDRY_INCLUSIVE,
centerBoundry, true, false },
{ centerBoundry, RangeSelectionEnum.BEFORE_BOUNDRY,
centerBoundry, false, false },
{ centerBoundry, RangeSelectionEnum.BEFORE_BOUNDRY,
upperBoundry, false, false },
{ centerBoundry, RangeSelectionEnum.BEFORE_BOUNDRY_INCLUSIVE,
upperBoundry, false, false },
{ centerBoundry, RangeSelectionEnum.BEFORE_BOUNDRY,
lowerBoundry, true, false },
{ centerBoundry, RangeSelectionEnum.BEFORE_BOUNDRY_INCLUSIVE,
lowerBoundry, true, false },
// test with and without timestamp
{ centerBoundry, RangeSelectionEnum.AFTER_BOUNDRY,
centerBoundryPlus, true, false },
{ centerBoundry, RangeSelectionEnum.AFTER_BOUNDRY,
centerBoundryPlus, false, true },
{ upperBoundry, RangeSelectionEnum.BEFORE_BOUNDRY,
upperBoundryMinus, true, false },
{ upperBoundry, RangeSelectionEnum.BEFORE_BOUNDRY,
upperBoundryMinus, false, true },
{ upperBoundry, RangeSelectionEnum.BEFORE_BOUNDRY_INCLUSIVE,
upperBoundryMinus, true, false },
{ upperBoundry, RangeSelectionEnum.AFTER_BOUNDRY_INCLUSIVE,
upperBoundryMinus, false, false },
{ upperBoundry, RangeSelectionEnum.AFTER_BOUNDRY_INCLUSIVE,
upperBoundryMinus, true, true } };
}
@Test(dataProvider = "chainRuleProvider")
public void testChainedRule(String code, IRule<Date> rule, Date candidate,
boolean expected) {
if (code.equals("")) {
System.out.println("Break point: " + code);
}
boolean result = rule.evaluate(candidate);
Assert.assertEquals(result, expected);
}
@SuppressWarnings("unchecked")
@DataProvider(name = "chainRuleProvider")
public Object[][] getChainedRules() {
return new Object[][] {
{
"(-*-)",
DateRuleFactory.betweenExclusive(lowerBoundry,
upperBoundry, false), centerBoundry, true },
{
"(--*)",
DateRuleFactory.betweenExclusive(lowerBoundry,
upperBoundry, false), upperBoundry, false },
{
"(*--)",
DateRuleFactory.betweenExclusive(lowerBoundry,
upperBoundry, false), lowerBoundry, false },
{
"(*--)",
DateRuleFactory.betweenExclusive(lowerBoundry,
upperBoundry, false), aboveUpper, false },
{
"*(--)",
DateRuleFactory.betweenExclusive(lowerBoundry,
upperBoundry, false), belowLower, false },
{
"-) (*-",
DateRuleFactory.betweenExclusive(upperBoundry,
lowerBoundry, false), upperBoundry, false },
{
"-*) (-",
DateRuleFactory.betweenExclusive(upperBoundry,
lowerBoundry, false), lowerBoundry, false },
{
"*-) (-",
DateRuleFactory.betweenExclusive(upperBoundry,
lowerBoundry, false), belowLower, false },
{
"-) (-*",
DateRuleFactory.betweenExclusive(upperBoundry,
lowerBoundry, false), aboveUpper, false },
{
"-)*(-",
DateRuleFactory.betweenExclusive(upperBoundry,
lowerBoundry, false), centerBoundry, false },
{
"[-*-]",
DateRuleFactory.betweenInclusive(lowerBoundry,
upperBoundry, false), centerBoundry, true },
{
"[--*]",
DateRuleFactory.betweenInclusive(lowerBoundry,
upperBoundry, false), upperBoundry, true },
{
"[*--]",
DateRuleFactory.betweenInclusive(lowerBoundry,
upperBoundry, false), lowerBoundry, true },
{
"[*--]",
DateRuleFactory.betweenInclusive(lowerBoundry,
upperBoundry, false), aboveUpper, false },
{
"*[--]",
DateRuleFactory.betweenInclusive(lowerBoundry,
upperBoundry, false), belowLower, false },
{
"-] [*-",
DateRuleFactory.betweenExclusive(upperBoundry,
lowerBoundry, false), upperBoundry, false },
{
"-*] [-",
DateRuleFactory.betweenExclusive(upperBoundry,
lowerBoundry, false), lowerBoundry, false },
{
"*-] [-",
DateRuleFactory.betweenExclusive(upperBoundry,
lowerBoundry, false), belowLower, false },
{
"-] [-*",
DateRuleFactory.betweenExclusive(upperBoundry,
lowerBoundry, false), aboveUpper, false },
{
"-]*[-",
DateRuleFactory.betweenExclusive(upperBoundry,
lowerBoundry, false), centerBoundry, false },
{
"-]*[-",
new AndRule<Date>(DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.after(upperBoundry,
false)), lowerBoundry, false },
{
"(-(*-",
new AndRule<Date>(DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.after(upperBoundry,
false)), upperBoundry, false },
{
"*(-(-",
new AndRule<Date>(DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.after(upperBoundry,
false)), belowLower, false },
{
"(-(-*",
new AndRule<Date>(DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.after(upperBoundry,
false)), aboveUpper, true },
{
"-*]-]",
new AndRule<Date>(DateRuleFactory.beforeInclusive(
lowerBoundry, false), DateRuleFactory
.beforeInclusive(upperBoundry, false)),
lowerBoundry, true },
{
"-]-*]",
new AndRule<Date>(DateRuleFactory.beforeInclusive(
lowerBoundry, false), DateRuleFactory
.beforeInclusive(upperBoundry, false)),
upperBoundry, false },
{
"*-]-]",
new AndRule<Date>(DateRuleFactory.beforeInclusive(
lowerBoundry, false), DateRuleFactory
.beforeInclusive(upperBoundry, false)),
belowLower, true },
{
"-]-]*",
new AndRule<Date>(DateRuleFactory.beforeInclusive(
lowerBoundry, false), DateRuleFactory
.beforeInclusive(upperBoundry, false)),
aboveUpper, false },
{
"(*--]",
new AndRule<Date>(DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.beforeInclusive(
upperBoundry, false)), lowerBoundry, false },
{
"(--*]",
new AndRule<Date>(DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.beforeInclusive(
upperBoundry, false)), upperBoundry, true },
{
"*(--]",
new AndRule<Date>(DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.beforeInclusive(
upperBoundry, false)), belowLower, false },
{
"(--]*",
new AndRule<Date>(DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.beforeInclusive(
upperBoundry, false)), aboveUpper, false },
{
"(-*-]",
new AndRule<Date>(DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.beforeInclusive(
upperBoundry, false)), centerBoundry, true },
{
"(-(-*-]",
new AndRule<Date>(DateRuleFactory.after(belowLower,
false), DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.beforeInclusive(
upperBoundry, false)), centerBoundry, true },
{
"(-(--*]",
new AndRule<Date>(DateRuleFactory.after(belowLower,
false), DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.beforeInclusive(
upperBoundry, false)), upperBoundry, true },
{
"(-(*--]",
new AndRule<Date>(DateRuleFactory.after(belowLower,
false), DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.beforeInclusive(
upperBoundry, false)), lowerBoundry, false },
{
"(-(--]*",
new AndRule<Date>(DateRuleFactory.after(belowLower,
false), DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.beforeInclusive(
upperBoundry, false)), aboveUpper, false },
{
"(*-(--]",
new AndRule<Date>(DateRuleFactory.after(belowLower,
false), DateRuleFactory.after(lowerBoundry,
false), DateRuleFactory.beforeInclusive(
upperBoundry, false)), belowLower, false },
{
"(-[-(-[*-",
new AndRule<Date>(DateRuleFactory.after(belowLower,
false), DateRuleFactory.afterInclusive(
lowerBoundry, false), DateRuleFactory.after(
upperBoundry, false), DateRuleFactory
.afterInclusive(aboveUpper, false)),
aboveUpper, true },
{
"(-[-(*-[-",
new AndRule<Date>(DateRuleFactory.after(belowLower,
false), DateRuleFactory.afterInclusive(
lowerBoundry, false), DateRuleFactory.after(
upperBoundry, false), DateRuleFactory
.afterInclusive(aboveUpper, false)),
upperBoundry, false },
{
"(-[*-(-[-",
new AndRule<Date>(DateRuleFactory.after(belowLower,
false), DateRuleFactory.afterInclusive(
lowerBoundry, false), DateRuleFactory.after(
upperBoundry, false), DateRuleFactory
.afterInclusive(aboveUpper, false)),
lowerBoundry, false },
{
"(*-[-(-[-",
new AndRule<Date>(DateRuleFactory.after(belowLower,
false), DateRuleFactory.afterInclusive(
lowerBoundry, false), DateRuleFactory.after(
upperBoundry, false), DateRuleFactory
.afterInclusive(aboveUpper, false)),
belowLower, false },
};
}
}