package mil.nga.giat.geowave.types.gpx; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.core.index.StringUtils; import mil.nga.giat.geowave.core.ingest.GeoWaveData; import mil.nga.giat.geowave.format.gpx.GPXConsumer; import mil.nga.giat.geowave.types.HelperClass; import mil.nga.giat.geowave.types.ValidateObject; import org.junit.Before; import org.junit.Test; import org.opengis.feature.simple.SimpleFeature; public class GPXConsumerTest { Map<String, ValidateObject<SimpleFeature>> expectedResults = new HashMap<String, ValidateObject<SimpleFeature>>(); @Before public void setup() { expectedResults.put( "123_6_A_track_1_1", new ValidateObject<SimpleFeature>() { @Override public boolean validate( final SimpleFeature feature ) { return feature.getAttribute( "Elevation").toString().equals( "4.46") && (feature.getAttribute("Timestamp") != null) && (feature.getAttribute("Latitude") != null) && (feature.getAttribute("Longitude") != null); } }); expectedResults.put( "123_6_A_track_1_2", new ValidateObject<SimpleFeature>() { @Override public boolean validate( final SimpleFeature feature ) { return feature.getAttribute( "Elevation").toString().equals( "4.634") && (feature.getAttribute("Timestamp") != null) && (feature.getAttribute("Latitude") != null) && (feature.getAttribute("Longitude") != null); } }); expectedResults.put( "123_2_B_track_1_1", new ValidateObject<SimpleFeature>() { @Override public boolean validate( final SimpleFeature feature ) { return feature.getAttribute( "Elevation").toString().equals( "10.46") && (feature.getAttribute("Timestamp") != null) && (feature.getAttribute("Latitude") != null) && (feature.getAttribute("Longitude") != null); } }); expectedResults.put( "123_2_B_track_1_2", new ValidateObject<SimpleFeature>() { @Override public boolean validate( final SimpleFeature feature ) { return feature.getAttribute( "Elevation").toString().equals( "11.634") && feature.getAttribute( "Fix").toString().equals( "2d") && feature.getAttribute( "Satellites").toString().equals( "8") && feature.getAttribute( "HDOP").toString().equals( "2.0") && feature.getAttribute( "VDOP").toString().equals( "2.1") && feature.getAttribute( "PDOP").toString().equals( "2.2") && (feature.getAttribute("Timestamp") != null) && (feature.getAttribute("Latitude") != null) && (feature.getAttribute("Longitude") != null); } }); expectedResults.put( "123_6_A_track", new ValidateObject<SimpleFeature>() { @Override public boolean validate( final SimpleFeature feature ) { return feature.getAttribute( "Name").toString().equals( "A track") && feature.getAttribute( "Duration").toString().equals( "60000") && (feature.getAttribute("StartTimeStamp") != null) && feature.getAttribute( "NumberPoints").toString().equals( "2") && (feature.getAttribute("EndTimeStamp") != null); } }); expectedResults.put( "123_2_B_track", new ValidateObject<SimpleFeature>() { @Override public boolean validate( final SimpleFeature feature ) { return feature.getAttribute( "Duration").toString().equals( "60000") && (feature.getAttribute("StartTimeStamp") != null) && feature.getAttribute( "NumberPoints").toString().equals( "2") && (feature.getAttribute("EndTimeStamp") != null); } }); expectedResults.put( "AQUADUCT_0422469500_-0714618070", new ValidateObject<SimpleFeature>() { @Override public boolean validate( final SimpleFeature feature ) { return feature.getAttribute( "Description").toString().equals( "Aquaduct") && (feature.getAttribute("Longitude") != null) && feature.getAttribute( "Symbol").toString().equals( "Dam") && (feature.getAttribute("Latitude") != null); } }); expectedResults.put( "TRANSITION_0422446460_-0714685390", new ValidateObject<SimpleFeature>() { @Override public boolean validate( final SimpleFeature feature ) { return feature.getAttribute( "Name").toString().equals( "TRANSITION") && feature.getAttribute( "Elevation").toString().equals( "92.6592"); } }); expectedResults.put( "123_12_ROUT135ASP", new ValidateObject<SimpleFeature>() { @Override public boolean validate( final SimpleFeature feature ) { return feature.getAttribute( "Name").toString().equals( "ROUT135ASP") && feature.getAttribute( "NumberPoints").toString().equals( "2") && feature.getAttribute( "Description").toString().equals( "Route 135 ASP"); } }); expectedResults.put( "123_12_ROUT135ASP_2_rtename2_0422446460_-0714685390", new ValidateObject<SimpleFeature>() { @Override public boolean validate( final SimpleFeature feature ) { return (feature.getAttribute("Longitude") != null) && (feature.getAttribute("Latitude") != null); } }); } @Test public void test() throws IOException { final Set<String> expectedSet = HelperClass.buildSet(expectedResults); try (final InputStream is = this.getClass().getClassLoader().getResourceAsStream( "sample_gpx.xml");) { final ByteArrayId indexId = new ByteArrayId( "123".getBytes(StringUtils.GEOWAVE_CHAR_SET)); final Collection<ByteArrayId> indexIds = new ArrayList<ByteArrayId>(); indexIds.add(indexId); final GPXConsumer consumer = new GPXConsumer( is, indexIds, "123", new HashMap<String, Map<String, String>>(), true, ""); int totalCount = 0; while (consumer.hasNext()) { final GeoWaveData<SimpleFeature> data = consumer.next(); if (!expectedSet.remove(data.getValue().getID())) { System.out.println("Missing match:" + data.getValue().getID()); } final ValidateObject<SimpleFeature> tester = expectedResults.get(data.getValue().getID()); if (tester != null) { assertTrue( data.getValue().toString(), tester.validate(data.getValue())); } totalCount++; } consumer.close(); assertEquals( 12, totalCount); } // did everything get validated? if (expectedSet.size() > 0) { System.out.println("Failed matches:"); System.out.println(expectedSet); } assertEquals( "All expected data set should be matched; zero unmatched data expected", 0, expectedSet.size()); } /** * run test and each duplicate is treated uniquely * * @throws IOException */ @Test public void testDescent() throws IOException { descent(new File( "src/test/resources/gpx")); } private static Map<String, Long> fileCount = new HashMap<String, Long>(); static { fileCount.put( "000991807.gpx", Long.valueOf(40)); /** tests duplicate waypoint **/ fileCount.put( "mystic_basin_trail.gpx", Long.valueOf(24)); } private void descent( final File dir ) throws IOException { if (dir.isDirectory()) { for (final File file : dir.listFiles()) { descent(file); } } else if (dir.getName().endsWith( "gpx")) { try (final InputStream is = new FileInputStream( dir);) { final ByteArrayId indexId = new ByteArrayId( "123".getBytes(StringUtils.GEOWAVE_CHAR_SET)); final Collection<ByteArrayId> indexIds = new ArrayList<ByteArrayId>(); indexIds.add(indexId); try (final GPXConsumer consumer = new GPXConsumer( is, indexIds, "", new HashMap<String, Map<String, String>>(), false, "")) { final Set<String> ids = new HashSet<String>(); while (consumer.hasNext()) { final String id = consumer.next().getValue().getID(); // insure uniqueness...even for duplicate points assertTrue(!ids.contains(id)); ids.add(id); } final Long amount = fileCount.get(dir.getName()); if (amount != null) { assertEquals( dir.getName(), amount.intValue(), ids.size()); } } } catch (final Exception ex) { System.out.println("Failed " + dir); throw ex; } } } }