/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.widget.searchandfilter.service;
import org.geomajas.widget.searchandfilter.search.dto.AndCriterion;
import org.geomajas.widget.searchandfilter.search.dto.AttributeCriterion;
import org.geomajas.widget.searchandfilter.search.dto.GeometryCriterion;
import org.geomajas.widget.searchandfilter.search.dto.OrCriterion;
import org.junit.Assert;
import org.junit.Test;
/**
* Tests for DtoSearchConverterServiceImpl.
*
* @author Kristof Heirwegh
*
*/
public class DtoSearchConverterServiceImplTest {
private static final String LA = "Laag a";
private static final String LB = "Laag b";
private static final String LC = "Laag c";
private static final String ATTNAME = "blah";
private static final String OPER = "=";
private static final String VAL = "bliep";
private final AttributeCriterion aCA = new AttributeCriterion(LA, ATTNAME, OPER, VAL);
private final AttributeCriterion aCB = new AttributeCriterion(LB, ATTNAME, OPER, VAL);
private final AttributeCriterion aCC = new AttributeCriterion(LC, ATTNAME, OPER, VAL);
@Test
public void testPruningBasic() throws Exception {
DtoSearchConverterServiceImpl dscsi = new DtoSearchConverterServiceImpl();
AndCriterion critter = new AndCriterion();
// -- single attr, should be no change
critter.getCriteria().add(aCA);
dscsi.prune(critter);
Assert.assertTrue("1", critter.getCriteria().size() == 1);
// -- two attrs on same layer, should be no change
critter.getCriteria().add(aCA);
dscsi.prune(critter);
Assert.assertTrue("2", critter.getCriteria().size() == 2);
// -- extra attr on different layer, all should be removed (nothing in common)
critter.getCriteria().add(aCB);
dscsi.prune(critter);
Assert.assertTrue("3", critter.getCriteria().size() == 0);
}
@Test
public void testPruningCombined() throws Exception {
DtoSearchConverterServiceImpl dscsi = new DtoSearchConverterServiceImpl();
AndCriterion critter = new AndCriterion();
GeometryCriterion gc = new GeometryCriterion();
critter.getCriteria().add(gc);
// -- single geo, should be no change
gc.getServerLayerIds().add(LA);
dscsi.prune(critter);
Assert.assertTrue("1", critter.getCriteria().size() == 1);
// -- add attr on same layer, should be no change
critter.getCriteria().add(aCA);
dscsi.prune(critter);
Assert.assertTrue("2a", critter.getCriteria().size() == 2);
Assert.assertTrue("2b", gc.getServerLayerIds().size() == 1);
// -- two layers in gc, uncommon one should be removed
gc.getServerLayerIds().add(LB);
dscsi.prune(critter);
Assert.assertTrue("3a", critter.getCriteria().size() == 2);
Assert.assertTrue("3b", gc.getServerLayerIds().size() == 1);
Assert.assertEquals("3c", gc.getServerLayerIds().get(0), LA);
// -- extra attr on different layer, all should be removed (nothing in common)
gc.getServerLayerIds().add(LB);
critter.getCriteria().add(aCC);
dscsi.prune(critter);
Assert.assertTrue("4", critter.getCriteria().size() == 0);
}
@Test
public void testPruningGroups() throws Exception {
DtoSearchConverterServiceImpl dscsi = new DtoSearchConverterServiceImpl();
AndCriterion critter = new AndCriterion();
AndCriterion subAnd = new AndCriterion();
OrCriterion subOr = new OrCriterion();
GeometryCriterion gc = new GeometryCriterion();
critter.getCriteria().add(subAnd);
subAnd.getCriteria().add(gc);
subOr.getCriteria().add(aCA);
gc.getServerLayerIds().add(LA);
// -- single SubAnd
dscsi.prune(critter);
Assert.assertTrue("1a", critter.getCriteria().size() == 1);
Assert.assertTrue("1b", subAnd.getCriteria().size() == 1);
// -- SubAnd & subOr
critter.getCriteria().add(subOr);
dscsi.prune(critter);
Assert.assertTrue("2a", critter.getCriteria().size() == 2);
Assert.assertTrue("2b", subAnd.getCriteria().size() == 1);
Assert.assertTrue("2c", subOr.getCriteria().size() == 1);
// -- SubAnd & subOr Multi
gc.getServerLayerIds().add(LB);
subOr.getCriteria().add(aCB);
dscsi.prune(critter);
Assert.assertTrue("3a", critter.getCriteria().size() == 2);
Assert.assertTrue("3b", subAnd.getCriteria().size() == 1);
Assert.assertTrue("3c", gc.getServerLayerIds().size() == 2);
Assert.assertTrue("3d", subOr.getCriteria().size() == 2);
// -- SubAnd & subOr Multi -- diff in Geo
gc.getServerLayerIds().add(LC);
dscsi.prune(critter);
Assert.assertTrue("4a", critter.getCriteria().size() == 2);
Assert.assertTrue("4b", subAnd.getCriteria().size() == 1);
Assert.assertTrue("4c", gc.getServerLayerIds().size() == 2);
Assert.assertTrue("4d", subOr.getCriteria().size() == 2);
// -- SubAnd & subOr Multi -- diff in subOr
subOr.getCriteria().add(aCC);
dscsi.prune(critter);
Assert.assertTrue("5a", critter.getCriteria().size() == 2);
Assert.assertTrue("5b", subAnd.getCriteria().size() == 1);
Assert.assertTrue("5c", gc.getServerLayerIds().size() == 2);
Assert.assertTrue("5d", subOr.getCriteria().size() == 2);
// -- SubAnd & subOr Multi -- diff in subAnd
gc.getServerLayerIds().add(LC); // must be same as is And
GeometryCriterion gc2 = new GeometryCriterion();
gc2.getServerLayerIds().add(LA);
gc2.getServerLayerIds().add(LB);
gc2.getServerLayerIds().add(LC);
subAnd.getCriteria().add(gc2);
dscsi.prune(critter);
Assert.assertTrue("6a", critter.getCriteria().size() == 2);
Assert.assertTrue("6b", subAnd.getCriteria().size() == 2);
Assert.assertTrue("6c", gc.getServerLayerIds().size() == 2);
Assert.assertTrue("6d", gc2.getServerLayerIds().size() == 2);
Assert.assertTrue("6e", subOr.getCriteria().size() == 2);
}
@Test
public void testPruningMultiNest() throws Exception {
DtoSearchConverterServiceImpl dscsi = new DtoSearchConverterServiceImpl();
AndCriterion root = new AndCriterion();
OrCriterion subOr = new OrCriterion();
AndCriterion subsubAnd1 = new AndCriterion();
AndCriterion subsubAnd2 = new AndCriterion();
root.getCriteria().add(subOr);
subOr.getCriteria().add(subsubAnd1);
subOr.getCriteria().add(subsubAnd2);
subsubAnd1.getCriteria().add(aCA);
subsubAnd2.getCriteria().add(aCB);
// -- single SubAnd
dscsi.prune(root);
Assert.assertTrue("a", root.getCriteria().size() == 1);
Assert.assertTrue("b", subOr.getCriteria().size() == 2);
Assert.assertTrue("c", subsubAnd1.getCriteria().size() == 1);
Assert.assertTrue("d", subsubAnd2.getCriteria().size() == 1);
}
}