/*
* Copyright (C) 2014
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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 General Public License for more details.
*
*/
package uk.me.parabola.mkgmap.reader.osm;
import static org.junit.Assert.*;
import org.junit.Test;
import uk.me.parabola.imgfmt.app.Area;
import uk.me.parabola.imgfmt.app.Coord;
import uk.me.parabola.imgfmt.app.net.AccessTagsAndBits;
/**
* Test evaluation of restriction relations
* @author GerdP
*
*/
public class RestrictionRelationTest {
private final static byte DEFAULT_EXCEPTION = AccessTagsAndBits.FOOT | AccessTagsAndBits.EMERGENCY;
@Test
public void basicTest() {
GeneralRelation gr = createRelation();
gr.addTag("restriction","no_left_turn");
gr.addTag("except","bicycle");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(AccessTagsAndBits.BIKE | DEFAULT_EXCEPTION, rr.getExceptMask());
}
@Test
public void footTest() {
GeneralRelation gr = createRelation();
gr.addTag("restriction:foot","no_left_turn");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(~AccessTagsAndBits.FOOT , rr.getExceptMask());
}
@Test
public void footAndBikeTest() {
GeneralRelation gr = createRelation();
gr.addTag("restriction:foot","no_left_turn");
gr.addTag("restriction:bicycle","no_left_turn");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(~(AccessTagsAndBits.FOOT | AccessTagsAndBits.BIKE), rr.getExceptMask());
}
@Test
public void psvTest() {
GeneralRelation gr = createRelation();
gr.addTag("restriction","no_left_turn");
gr.addTag("except","psv");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(AccessTagsAndBits.BUS | AccessTagsAndBits.TAXI | DEFAULT_EXCEPTION, rr.getExceptMask());
}
@Test
public void multipleExeptTest() {
GeneralRelation gr = createRelation();
gr.addTag("restriction","no_left_turn");
gr.addTag("except","psv;bicycle");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(AccessTagsAndBits.BUS | AccessTagsAndBits.TAXI | AccessTagsAndBits.BIKE | DEFAULT_EXCEPTION, rr.getExceptMask());
}
@Test
public void multipleExeptTestWithUnknown() {
GeneralRelation gr = createRelation();
gr.addTag("restriction","no_left_turn");
gr.addTag("except","psv;xyz;bicycle");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(AccessTagsAndBits.BUS | AccessTagsAndBits.TAXI | AccessTagsAndBits.BIKE | DEFAULT_EXCEPTION, rr.getExceptMask());
}
@Test
public void multipleExcplicitTestWithUnknown() {
GeneralRelation gr = createRelation();
gr.addTag("restriction:motorcar","no_left_turn");
gr.addTag("restriction:hgv","no_left_turn");
gr.addTag("restriction:xyz","no_left_turn");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(~(AccessTagsAndBits.CAR |AccessTagsAndBits.TRUCK) , rr.getExceptMask());
}
@Test
public void excplicitTestWithUnknown() {
GeneralRelation gr = createRelation();
gr.addTag("restriction:xyz","no_left_turn");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertFalse(rr.isValid());
}
@Test
public void motor_vehicleTest() {
GeneralRelation gr = createRelation();
gr.addTag("restriction:motor_vehicle","no_left_turn");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(AccessTagsAndBits.BIKE | DEFAULT_EXCEPTION, rr.getExceptMask());
}
@Test
public void motor_vehicleTest2() {
GeneralRelation gr = createRelation();
gr.addTag("restriction","no_left_turn");
gr.addTag("type", "restriction:motor_vehicle");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(AccessTagsAndBits.BIKE | DEFAULT_EXCEPTION, rr.getExceptMask());
}
@Test
public void motor_vehicleExceptCarTest() {
GeneralRelation gr = createRelation();
gr.addTag("except","motorcar");
gr.addTag("restriction:motor_vehicle","no_left_turn");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(AccessTagsAndBits.BIKE | AccessTagsAndBits.CAR | DEFAULT_EXCEPTION, rr.getExceptMask());
}
@Test
public void motor_vehicleExceptCarTest2() {
GeneralRelation gr = createRelation();
gr.addTag("except","motorcar");
gr.addTag("restriction", "no_left_turn");
gr.addTag("type", "restriction:motor_vehicle");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(AccessTagsAndBits.BIKE | AccessTagsAndBits.CAR | DEFAULT_EXCEPTION, rr.getExceptMask());
}
@Test
public void noEmergencyTest1() {
GeneralRelation gr = createRelation();
gr.addTag("restriction:emergency","no_left_turn");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(~AccessTagsAndBits.EMERGENCY, rr.getExceptMask());
}
@Test
public void noEmergencyTest2() {
GeneralRelation gr = createRelation();
gr.addTag("restriction:motor_vehicle","no_left_turn");
gr.addTag("restriction:emergency","no_left_turn");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(AccessTagsAndBits.BIKE | AccessTagsAndBits.FOOT, rr.getExceptMask());
}
@Test
public void mixedDirectionsTest() {
GeneralRelation gr = createRelation();
gr.addTag("restriction:car","no_left_turn");
gr.addTag("restriction:truck","no_u_turn");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertFalse(rr.isValid());
}
@Test
public void ignoreMotorcycleTest1() {
GeneralRelation gr = createRelation();
gr.addTag("restriction:motorcycle","no_u_turn");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertFalse(rr.isValid());
}
@Test
public void ignoreMotorcycleTest2() {
GeneralRelation gr = createRelation();
gr.addTag("restriction","no_u_turn");
gr.addTag("except","motorcycle");
RestrictionRelation rr = new RestrictionRelation(gr);
rr.eval(new Area(-100,-100,1000,1000));
assertTrue(rr.isValid());
assertEquals(DEFAULT_EXCEPTION, rr.getExceptMask());
}
private static GeneralRelation createRelation(){
GeneralRelation gr = new GeneralRelation(1);
gr.addTag("type", "restriction");
Way fromWay = new Way(1);
Way toWay = new Way(2);
Coord viaCoord = new Coord(100,100);
Node viaNode = new Node(1, viaCoord);
fromWay.addPoint(new Coord(0,0));
fromWay.addPoint(viaCoord);
toWay.addPoint(new Coord(120,200));
toWay.addPoint(viaCoord);
gr.addElement("from", fromWay);
gr.addElement("to", toWay);
gr.addElement("via", viaNode);
return gr;
}
}