/*
* 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
;
}
}