package org.osm2world.core.test;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.openstreetmap.josm.plugins.graphview.core.data.EmptyTagGroup;
import org.osm2world.core.math.VectorXYZ;
import org.osm2world.core.math.VectorXZ;
import org.osm2world.core.osm.data.OSMNode;
public final class TestUtil {
private TestUtil() {}
/**
* returns a list of nodes where yon don't care about the attributes
*/
public static final List<OSMNode> createTestNodes(int numberOfNodes) {
List<OSMNode> result = new ArrayList<OSMNode>(numberOfNodes);
for (int i = 0; i < numberOfNodes; i++) {
result.add(new OSMNode(i, i, EmptyTagGroup.EMPTY_TAG_GROUP, i));
}
return result;
}
/**
* returns VectorXZ objects;
* can be used to test properties that need to be true for all vectors.
*
* Will contain some fixed common vectors
* and a lot of random vectors (that will be the same every time, though,
* so tests can be reproduced).
*/
public static final Iterable<VectorXZ> anyVectorXZ() {
return Arrays.asList(
VectorXZ.NULL_VECTOR,
VectorXZ.X_UNIT, VectorXZ.Z_UNIT,
VectorXZ.X_UNIT.invert(), VectorXZ.Z_UNIT.invert());
//TODO (test): more + random vectors
}
public static final void assertAlmostEquals(
double expected, double actual) {
if (Math.abs(expected - actual) > 0.001) {
throw new AssertionError("expected " + expected + ", was " + actual);
}
}
public static final void assertAlmostEquals(
VectorXZ expected, VectorXZ actual) {
assertAlmostEquals(expected.x, actual.x);
assertAlmostEquals(expected.z, actual.z);
}
public static void assertAlmostEquals(
double expectedX, double expectedZ,
VectorXZ actual) {
assertAlmostEquals(expectedX, actual.x);
assertAlmostEquals(expectedZ, actual.z);
}
public static final void assertAlmostEquals(
VectorXYZ expected, VectorXYZ actual) {
assertAlmostEquals(expected.x, actual.x);
assertAlmostEquals(expected.y, actual.y);
assertAlmostEquals(expected.z, actual.z);
}
public static final void assertAlmostEquals(
double expectedX, double expectedY, double expectedZ,
VectorXYZ actual) {
assertAlmostEquals(expectedX, actual.x);
assertAlmostEquals(expectedY, actual.y);
assertAlmostEquals(expectedZ, actual.z);
}
public static final void assertSameCyclicOrder(
List<VectorXZ> actual, VectorXZ... expected) {
Collections.reverse(actual);
if (actual.size() != expected.length) {
fail("expected size" + expected.length +
", found list of size " + actual.size());
}
for (int offset = 0; offset < actual.size(); offset++) {
boolean matches = true;
for (int i = 0; i < actual.size(); i++) {
int iWithOffset = (i + offset) % actual.size();
if (VectorXZ.distance(expected[i],
actual.get(iWithOffset)) > 0.0001) {
matches = false;
break;
}
}
if (matches) {
return;
}
}
fail("cannot match list to expected sequence. Found " + actual);
}
}