// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.dialogs.relation.sort;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
import org.openstreetmap.josm.io.IllegalDataException;
import org.openstreetmap.josm.io.OsmReader;
import org.openstreetmap.josm.testutils.JOSMTestRules;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
/**
* Unit tests of {@link WayConnectionTypeCalculator} class.
*/
public class WayConnectionTypeCalculatorTest {
private RelationSorter sorter = new RelationSorter();
private WayConnectionTypeCalculator wayConnectionTypeCalculator = new WayConnectionTypeCalculator();
private DataSet testDataset;
/**
* Use Mercator projection
*/
@Rule
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
public JOSMTestRules test = new JOSMTestRules().preferences().projection();
/**
* Load the test data set
* @throws IllegalDataException if an error was found while parsing the data
* @throws IOException in case of I/O error
*/
@Before
public void loadData() throws IllegalDataException, IOException {
if (testDataset == null) {
try (InputStream fis = new FileInputStream("data_nodist/relation_sort.osm")) {
testDataset = OsmReader.parseDataSet(fis, NullProgressMonitor.INSTANCE);
}
}
}
private Relation getRelation(String testType) {
for (Relation r: testDataset.getRelations()) {
if (testType.equals(r.get("test")))
return r;
}
return null;
}
private String getConnections(List<WayConnectionType> connections) {
String[] result = new String[connections.size()];
for (int i = 0; i < result.length; i++) {
WayConnectionType wc = connections.get(i);
if (wc.isValid()) {
StringBuilder sb = new StringBuilder();
if (wc.isLoop) {
sb.append("L");
}
if (wc.isOnewayLoopForwardPart) {
sb.append("FP");
}
if (wc.isOnewayLoopBackwardPart) {
sb.append("BP");
}
if (wc.isOnewayHead) {
sb.append("H");
}
if (wc.isOnewayTail) {
sb.append("T");
}
if (sb.length() > 0) {
sb.append(" ");
}
sb.append(wc.direction);
result[i] = sb.toString();
} else {
result[i] = "I";
}
}
return Arrays.toString(result);
}
@Test
public void testGeneric() {
Relation relation = getRelation("generic");
String actual = getConnections(wayConnectionTypeCalculator.updateLinks(relation.getMembers()));
Assert.assertEquals("[NONE, NONE, FORWARD, FORWARD, NONE, NONE, NONE, I, I]", actual);
actual = getConnections(wayConnectionTypeCalculator.updateLinks(sorter.sortMembers(relation.getMembers())));
Assert.assertEquals("[FORWARD, FORWARD, FORWARD, FORWARD, BACKWARD, BACKWARD, NONE, I, I]", actual);
}
@Test
public void testAssociatedStreet() {
Relation relation = getRelation("associatedStreet");
String actual = getConnections(wayConnectionTypeCalculator.updateLinks(relation.getMembers()));
Assert.assertEquals("[NONE, I, I, I, NONE, I]", actual);
actual = getConnections(wayConnectionTypeCalculator.updateLinks(sorter.sortMembers(relation.getMembers())));
Assert.assertEquals("[FORWARD, FORWARD, I, I, I, I]", actual);
}
@Test
public void testLoop() {
Relation relation = getRelation("loop");
String actual = getConnections(wayConnectionTypeCalculator.updateLinks(relation.getMembers()));
Assert.assertEquals("[FPH FORWARD, FP FORWARD, NONE, FPH FORWARD, NONE, FPH FORWARD, NONE]", actual);
//TODO Sorting doesn't work well in this case
actual = getConnections(wayConnectionTypeCalculator.updateLinks(sorter.sortMembers(relation.getMembers())));
Assert.assertEquals("[BACKWARD, BACKWARD, BACKWARD, FPH FORWARD, FPH FORWARD, FPH FORWARD, FPH FORWARD]", actual);
}
}