/*
* This file is part of LibrePlan
*
* Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
* Copyright (C) 2010-2011 Igalia, S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.libreplan.business.test.resources.entities;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.libreplan.business.resources.entities.CriterionCompounder.atom;
import static org.libreplan.business.resources.entities.CriterionCompounder.build;
import static org.libreplan.business.resources.entities.CriterionCompounder.not;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import org.joda.time.LocalDate;
import org.junit.Test;
import org.libreplan.business.resources.entities.Criterion;
import org.libreplan.business.resources.entities.CriterionCompounder;
import org.libreplan.business.resources.entities.ICriterion;
import org.libreplan.business.resources.entities.PredefinedCriterionTypes;
import org.libreplan.business.resources.entities.Resource;
import org.libreplan.business.resources.entities.Worker;
/**
* Tests for criterion. <br />
* @author Óscar González Fernández <ogonzalez@igalia.com>
*/
public class CriterionTest {
@Test
public void testCreateWithAType() {
Criterion managerCriterion = PredefinedCriterionTypes.CATEGORY
.createCriterion("Manager");
assertTrue(PredefinedCriterionTypes.CATEGORY.contains(managerCriterion));
}
@Test
public void testCompounding() {
Worker worker1 = Worker.create();
Worker worker2 = Worker.create();
ICriterion criterionForWorker1 = justThisResourcesCriterion(worker1);
ICriterion criterionForWorker2 = justThisResourcesCriterion(worker2);
ICriterion criterionForWorkers1And2 = justThisResourcesCriterion(
worker1, worker2);
assertTrue(criterionForWorker1.isSatisfiedBy(worker1));
assertTrue(criterionForWorker2.isSatisfiedBy(worker2));
assertFalse(criterionForWorker2.isSatisfiedBy(worker1));
assertTrue(criterionForWorkers1And2.isSatisfiedBy(worker1));
assertTrue(criterionForWorkers1And2.isSatisfiedBy(worker2));
ICriterion compositedCriterion = CriterionCompounder.atom(
criterionForWorker1).and(criterionForWorkers1And2).getResult();
ICriterion matchesNoneComposited = CriterionCompounder.build().and(
criterionForWorker1).and(criterionForWorker2).getResult();
assertFalse(matchesNoneComposited.isSatisfiedBy(worker2));
assertFalse(matchesNoneComposited.isSatisfiedBy(worker1));
assertTrue(compositedCriterion.isSatisfiedBy(worker1));
assertFalse(compositedCriterion.isSatisfiedBy(worker2));
}
@Test
public void testWorkerSatisfySeveralCriterions() {
Worker worker1 = Worker.create();
Worker worker2 = Worker.create();
ICriterion criterion1 = justThisResourcesCriterion(worker1);
ICriterion criterion2 = justThisResourcesCriterion(worker1);
ICriterion criterion3 = justThisResourcesCriterion(worker2);
ICriterion criterion4 = justThisResourcesCriterion(worker1, worker2);
assertTrue(criterion1.isSatisfiedBy(worker1));
assertFalse(criterion1.isSatisfiedBy(worker2));
assertTrue(criterion2.isSatisfiedBy(worker1));
assertFalse(criterion2.isSatisfiedBy(worker2));
assertFalse(criterion3.isSatisfiedBy(worker1));
assertTrue(criterion3.isSatisfiedBy(worker2));
assertTrue(criterion4.isSatisfiedBy(worker1));
assertTrue(criterion4.isSatisfiedBy(worker2));
List<ICriterion> criterionList1 = Arrays.asList(criterion1, criterion2);
List<ICriterion> criterionList2 = Arrays.asList(criterion1, criterion2,
criterion3);
List<ICriterion> criterionList3 = Arrays.asList(criterion3, criterion4);
ICriterion compositedCriterion1 = CriterionCompounder.buildAnd(
criterionList1).getResult();
ICriterion compositedCriterion2 = CriterionCompounder.buildAnd(
criterionList2).getResult();
ICriterion compositedCriterion3 = CriterionCompounder.buildAnd(
criterionList3).getResult();
assertTrue(compositedCriterion1.isSatisfiedBy(worker1));
assertFalse(compositedCriterion1.isSatisfiedBy(worker2));
assertFalse(compositedCriterion2.isSatisfiedBy(worker1));
assertFalse(compositedCriterion2.isSatisfiedBy(worker2));
assertFalse(compositedCriterion3.isSatisfiedBy(worker1));
assertTrue(compositedCriterion3.isSatisfiedBy(worker2));
}
@Test
public void testEmptyMatchesAll() {
assertTrue(build().getResult().isSatisfiedBy(Worker.create()));
}
@Test
public void testSimpleNegation() {
Worker worker1 = Worker.create();
Worker worker2 = Worker.create();
Worker worker3 = Worker.create();
ICriterion criterionForWorker1 = justThisResourcesCriterion(worker1);
ICriterion criterionForWorker2 = justThisResourcesCriterion(worker2);
ICriterion worker1Negated = not(criterionForWorker1);
ICriterion compound = build().and(criterionForWorker1).and(
not(criterionForWorker2)).getResult();
assertFalse(worker1Negated.isSatisfiedBy(worker1));
assertTrue(worker1Negated.isSatisfiedBy(worker2));
assertFalse(compound.isSatisfiedBy(worker2));
assertTrue(compound.isSatisfiedBy(worker1));
assertFalse(compound.isSatisfiedBy(worker3));
}
@Test
public void testNegateAnd() {
Worker worker1 = Worker.create();
Worker worker2 = Worker.create();
Worker worker3 = Worker.create();
ICriterion criterionForWorker1 = justThisResourcesCriterion(worker1);
ICriterion both = justThisResourcesCriterion(worker1, worker2);
ICriterion andNegated = not(atom(criterionForWorker1).and(both));
assertTrue(andNegated.isSatisfiedBy(worker2));
assertTrue(andNegated.isSatisfiedBy(worker3));
assertFalse(andNegated.isSatisfiedBy(worker1));
}
@Test
public void testOr() {
Worker worker1 = Worker.create();
Worker worker2 = Worker.create();
Worker worker3 = Worker.create();
ICriterion both = justThisResourcesCriterion(worker1, worker2);
assertFalse(both.isSatisfiedBy(worker3));
ICriterion all = atom(both).or(justThisResourcesCriterion(worker3))
.getResult();
assertTrue(all.isSatisfiedBy(worker1));
assertTrue(all.isSatisfiedBy(worker2));
assertTrue(all.isSatisfiedBy(worker3));
}
@Test
public void testOrHasLessPrecendenceThanAnd() {
Worker worker1 = Worker.create();
Worker worker2 = Worker.create();
Worker worker3 = Worker.create();
ICriterion criterionForWorker1 = justThisResourcesCriterion(worker1);
ICriterion both = justThisResourcesCriterion(worker1, worker2);
ICriterion or = atom(criterionForWorker1).and(both).or(
justThisResourcesCriterion(worker3)).getResult();
assertTrue(or.isSatisfiedBy(worker1));
assertFalse(or.isSatisfiedBy(worker2));
assertTrue("or has less priority", or.isSatisfiedBy(worker3));
}
@Test
public void testCanBeRelatedTo() {
assertTrue(PredefinedCriterionTypes.LOCATION
.criterionCanBeRelatedTo(Worker.class));
assertTrue(PredefinedCriterionTypes.CATEGORY
.criterionCanBeRelatedTo(Worker.class));
}
public static ICriterion justThisResourcesCriterion(
final Resource... resources) {
final HashSet<Resource> set = new HashSet<Resource>(Arrays
.asList(resources));
return new ICriterion() {
@Override
public boolean isSatisfiedBy(Resource resource) {
return set.contains(resource);
}
@Override
public boolean isSatisfiedBy(Resource resource, LocalDate start, LocalDate end) {
return isSatisfiedBy(resource);
}
@Override
public boolean isSatisfiedBy(Resource resource, LocalDate atThisDate) {
return isSatisfiedBy(resource);
}
};
}
}