Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test additional code paths in java decoder #180

Merged
merged 16 commits into from
Jun 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 83 additions & 95 deletions java/src/test/java/com/mlt/TestUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,123 +3,111 @@
import static org.junit.jupiter.api.Assertions.assertEquals;

import com.mlt.converter.mvt.MapboxVectorTile;
import com.mlt.data.Feature;
import com.mlt.data.MapLibreTile;
import com.mlt.vector.FeatureTable;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;

public class TestUtils {

private static int compareFeatures(
List<Feature> mltFeatures, List<Feature> mvtFeatures, boolean isFeatureTableSorted) {
int numErrors = 0;
springmeyer marked this conversation as resolved.
Show resolved Hide resolved
assertEquals(
mvtFeatures.size(),
mltFeatures.size(),
"mvtFeatures.size()=" + mvtFeatures.size() + " mltFeatures.size()=" + mltFeatures.size());
for (var j = 0; j < mltFeatures.size(); j++) {
var mltFeature = mltFeatures.get(j);
var mvtFeature =
isFeatureTableSorted
? mvtFeatures.stream().filter(f -> f.id() == mltFeature.id()).findFirst().get()
: mvtFeatures.get(j);
assertEquals(
mvtFeature.id(),
mltFeature.id(),
"mvtFeature.id()=" + mvtFeature.id() + " mltFeature.id()=" + mltFeature.id());
var mltGeometry = mltFeature.geometry();
var mvtGeometry = mvtFeature.geometry();
if (!mvtGeometry.equalsExact(mltGeometry)) {
// System.out.println("Failure comparing geometry for feature: " + mvtFeature.id());
// System.out.println(" mvtGeometry: " + mvtGeometry);
// System.out.println(" mltGeometry: " + mltGeometry);
numErrors++;
}
var mltProperties = mltFeature.properties();
var mvtProperties = mvtFeature.properties();
for (var mvtProperty : mvtProperties.entrySet()) {
var mvtPropertyKey = mvtProperty.getKey();
// TODO: remove the below special case once this bug is fixed:
// https://github.com/maplibre/maplibre-tile-spec/issues/181
if (mvtPropertyKey.equals("id")) {
continue;
}
var mltProperty = mltProperties.get(mvtPropertyKey);
if (mltProperty == null) {
// System.out.println(mvtFeature.id() + " mlt prop missing for " + mvtProperty.getKey());
// System.out.println(" mvtProperties: " + mvtProperties);
// System.out.println(" mltProperties: " + mltProperties);
springmeyer marked this conversation as resolved.
Show resolved Hide resolved
numErrors++;
} else if (!mltProperty.equals(mvtProperty.getValue())) {
// System.out.println(
// "Failure comparing property "
// + mvtProperty.getKey()
// + " for feature: "
// + mvtFeature.id());
// System.out.println(" mvtProperty: " + mvtProperty.getValue());
// System.out.println(" mltProperty: " + mltProperty);
springmeyer marked this conversation as resolved.
Show resolved Hide resolved
numErrors++;
} else {
assertEquals(
mvtProperty.getValue(),
mltProperty,
"mvtProperty.getValue()=" + mvtProperty.getValue() + " mltProperty=" + mltProperty);
}
}
}
return numErrors;
}

public static int compareTilesVectorized(
FeatureTable[] featureTables, MapboxVectorTile mvTile, boolean isFeatureTableSorted) {
int numErrors = 0;
var mvtLayers = mvTile.layers();
assertEquals(
featureTables.length,
mvtLayers.size(),
"featureTables.length=" + featureTables.length + " mvtLayers.size()=" + mvtLayers.size());
for (var i = 0; i < mvtLayers.size(); i++) {
var featureTable = featureTables[i];
var mvtLayer = mvtLayers.get(i);
var mvtFeatures = mvtLayer.features();
var mvtFeatures = mvtLayers.get(i).features();
var featureTable = featureTables[i];
var featureIterator = featureTable.iterator();

for (var j = 0; j < mvtFeatures.size(); j++) {
var mltFeature = featureIterator.next();
var mvtFeature =
isFeatureTableSorted
? mvtFeatures.stream().filter(f -> f.id() == mltFeature.id()).findFirst().get()
: mvtFeatures.get(j);

assertEquals(mvtFeature.id(), mltFeature.id());

var mvtGeometry = mvtFeature.geometry();
var mltGeometry = mltFeature.geometry();
assertEquals(mvtGeometry, mltGeometry);

var mltProperties = mltFeature.properties();
for (var property : mltProperties.entrySet()) {
var mltPropertyKey = property.getKey();
var mltPropertyValue = property.getValue();
if (mltPropertyValue instanceof Map<?, ?>) {
/* Handle shared dictionary case -> currently only String is supported
* as nested property in the converter, so only handle this case */
var mvtProperties = mvtFeature.properties();
var nestedStringValues = (Map<String, String>) mltPropertyValue;
var mvtStringProperties =
mvtProperties.entrySet().stream()
.filter(
p -> p.getKey().contains(mltPropertyKey) && p.getValue() instanceof String)
.toList();
// TODO: verify why mlt seems to have a property more than mvt on the
// name:* column in some tiles
for (var mvtProperty : mvtStringProperties) {
var mvtPropertyKey = mvtProperty.getKey();
var mvtPropertyValue = mvtProperty.getValue();
var mltValue = nestedStringValues.get(mvtPropertyKey);

if (mvtPropertyKey.equals("name:ja:rm")) {
// TODO: fix -> currently the converter can't handle a triple nested property name
System.out.println(
"Skip verification for the name:ja:rm property name since it is currently"
+ " not supported in the converter.");
numErrors++;
continue;
}

assertEquals(mvtPropertyValue, mltValue);
}
} else {
assertEquals(mvtFeature.properties().get(mltPropertyKey), mltPropertyValue);
}
}
var mltFeatures = new ArrayList<Feature>();
while (featureIterator.hasNext()) {
mltFeatures.add(featureIterator.next());
springmeyer marked this conversation as resolved.
Show resolved Hide resolved
}
numErrors += compareFeatures(mltFeatures, mvtFeatures, isFeatureTableSorted);
}
return numErrors;
}

public static int compareTilesSequential(MapLibreTile mlTile, MapboxVectorTile mvTile) {
public static int compareTilesSequential(
MapLibreTile mlTile, MapboxVectorTile mvTile, boolean isFeatureTableSorted) {
int numErrors = 0;
var mltLayers = mlTile.layers();
var mvtLayers = mvTile.layers();

assertEquals(
mltLayers.size(),
mvtLayers.size(),
"mltLayers.size()=" + mltLayers.size() + " mvtLayers.size()=" + mvtLayers.size());
for (var i = 0; i < mvtLayers.size(); i++) {
var mltLayer = mltLayers.get(i);
var mvtLayer = mvtLayers.get(i);
var mvtFeatures = mvtLayers.get(i).features();
var mltLayer = mltLayers.get(i);
var mltFeatures = mltLayer.features();
var mvtFeatures = mvtLayer.features();
for (com.mlt.data.Feature mvtFeature : mvtFeatures) {
var mltFeature =
mltFeatures.stream().filter(f -> f.id() == mvtFeature.id()).findFirst().get();

assertEquals(mvtFeature.id(), mltFeature.id());

var mltGeometry = mltFeature.geometry();
var mvtGeometry = mvtFeature.geometry();
assertEquals(mvtGeometry, mltGeometry);

var mltProperties = mltFeature.properties();
var mvtProperties = mvtFeature.properties();
for (var mvtProperty : mvtProperties.entrySet()) {
var mvtPropertyKey = mvtProperty.getKey();
if (mvtPropertyKey.equals("name:ja:rm")) {
System.out.println(
"Skip verification for the name:ja:rm property name since it is currently"
+ " not supported in the converter.");
numErrors++;
continue;
}

var mltProperty = mltProperties.get(mvtProperty.getKey());
if (mltProperty == null) {
// System.out.println("Failure comparing property " + mvtProperty.getKey() + " for
// feature: " + mvtFeature.id() + " as mltProperty is null");
numErrors++;
} else if (!mltProperty.equals(mvtProperty.getValue())) {
// System.out.println("Failure comparing property " + mvtProperty.getKey() + " for
// feature: " + mvtFeature.id());
// System.out.println(" mvtProperty: " + mvtProperty.getValue());
// System.out.println(" mltProperty: " + mltProperty);
numErrors++;
} else {
assertEquals(mvtProperty.getValue(), mltProperty);
}
}
}
numErrors += compareFeatures(mltFeatures, mvtFeatures, isFeatureTableSorted);
}
return numErrors;
}
Expand Down
Loading