From 5aa016b5b9f3f3fe1b08d9cb25c1f8e756117559 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sun, 17 Jan 2021 00:10:04 +0100 Subject: [PATCH] Import: compute TrackStatistics onTrackEnd. ExportImportTest were not checking TrackStatistics correctly. #316. --- .../io/file/importer/ExportImportTest.java | 45 +++++++++++-------- .../importer/AbstractFileTrackImporter.java | 18 +++----- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java index ef4e95031..1419c9c2d 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java @@ -41,8 +41,10 @@ import de.dennisguse.opentracks.stats.TrackStatistics; import de.dennisguse.opentracks.util.PreferencesUtils; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; /** * Export a track to {@link TrackFileFormat} and verify that the import is identical. @@ -93,7 +95,6 @@ public class ExportImportTest { service.newTrackPoint(createTrackPoint(System.currentTimeMillis(), 3, 14.001, 10, 15, 10, 0, 66, 3, 50), 0); service.newTrackPoint(createTrackPoint(System.currentTimeMillis(), 3, 14.002, 10, 15, 10, 0, 66, 3, 50), 0); service.insertMarker("Marker 2", "Marker 2 category", "Marker 2 desc", null); - Thread.sleep(10); service.pauseCurrentTrack(); service.resumeCurrentTrack(); @@ -164,7 +165,7 @@ public class ExportImportTest { assertTrackpoints(false, false, false, false, false); // 3. trackstatistics - assertTrackStatistics(); + assertTrackStatistics(false); // 4. markers assertMarkers(); @@ -202,7 +203,7 @@ public class ExportImportTest { assertTrackpoints(true, true, true, true, true); // 2. trackstatistics - assertTrackStatistics(); + assertTrackStatistics(true); // 4. markers assertMarkers(); @@ -298,7 +299,7 @@ public class ExportImportTest { assertTrackpoints(false, true, true, true, true); // 3. trackstatistics - assertTrackStatistics(); + assertTrackStatistics(true); // 4. markers assertMarkers(); @@ -358,7 +359,8 @@ public class ExportImportTest { assertEquals(trackPoint.getTime(), importedTrackPoint.getTime()); TrackPoint.Type type = trackPoint.getType(); - assertEquals("" + i, trackPoint.getType(), importedTrackPoint.getType()); + Log.e(TAG, "" + importedTrackPoint.getType().equals(type)); + assertEquals("" + i, type, importedTrackPoint.getType()); // TODO Not exported for GPX/KML // assertEquals(trackPoint.getAccuracy(), importedTrackPoint.getAccuracy(), 0.01); @@ -400,7 +402,7 @@ public class ExportImportTest { } } - private void assertTrackStatistics() { + private void assertTrackStatistics(boolean verifyElevationGainAndLoss) { Track importedTrack = contentProviderUtils.getTrack(importTrackId); assertNotNull(importedTrack.getTrackStatistics()); @@ -409,24 +411,31 @@ public class ExportImportTest { TrackStatistics importedTrackStatistics = importedTrack.getTrackStatistics(); // Time - assertEquals(trackStatistics.getStartTime(), trackStatistics.getStartTime()); - assertEquals(trackStatistics.getStopTime(), trackStatistics.getStopTime()); - assertEquals(trackStatistics.getTotalTime(), trackStatistics.getTotalTime()); - assertEquals(trackStatistics.getMovingTime(), trackStatistics.getMovingTime()); + assertTrue(trackStatistics.getStartTime().isBefore(trackStatistics.getStopTime())); //Just to be sure. + assertEquals(trackStatistics.getStartTime(), importedTrackStatistics.getStartTime()); + assertEquals(trackStatistics.getStopTime(), importedTrackStatistics.getStopTime()); + + assertEquals(trackStatistics.getTotalTime(), importedTrackStatistics.getTotalTime()); + assertEquals(trackStatistics.getMovingTime(), importedTrackStatistics.getMovingTime()); // Distance - assertEquals(trackStatistics.getTotalDistance(), trackStatistics.getTotalDistance(), 0.01); + assertEquals(trackStatistics.getTotalDistance(), importedTrackStatistics.getTotalDistance(), 0.01); // Speed - assertEquals(trackStatistics.getMaxSpeed(), trackStatistics.getMaxSpeed(), 0.01); - assertEquals(trackStatistics.getAverageSpeed(), trackStatistics.getAverageSpeed(), 0.01); - assertEquals(trackStatistics.getAverageMovingSpeed(), trackStatistics.getAverageMovingSpeed(), 0.01); + assertEquals(trackStatistics.getMaxSpeed(), importedTrackStatistics.getMaxSpeed(), 0.01); + assertEquals(trackStatistics.getAverageSpeed(), importedTrackStatistics.getAverageSpeed(), 0.01); + assertEquals(trackStatistics.getAverageMovingSpeed(), importedTrackStatistics.getAverageMovingSpeed(), 0.01); // Elevation - assertEquals(trackStatistics.getMinElevation(), trackStatistics.getMinElevation(), 0.01); - assertEquals(trackStatistics.getMaxElevation(), trackStatistics.getMaxElevation(), 0.01); - assertEquals(trackStatistics.getTotalElevationGain(), trackStatistics.getTotalElevationGain(), 0.01); - assertEquals(trackStatistics.getTotalElevationLoss(), trackStatistics.getTotalElevationLoss(), 0.01); + assertEquals(trackStatistics.getMinElevation(), importedTrackStatistics.getMinElevation(), 0.01); + assertEquals(trackStatistics.getMaxElevation(), importedTrackStatistics.getMaxElevation(), 0.01); + if (verifyElevationGainAndLoss) { + assertEquals(trackStatistics.getTotalElevationGain(), importedTrackStatistics.getTotalElevationGain(), 0.01); + assertEquals(trackStatistics.getTotalElevationLoss(), importedTrackStatistics.getTotalElevationLoss(), 0.01); + } else { + assertFalse(importedTrackStatistics.hasTotalElevationGain()); + assertFalse(importedTrackStatistics.hasTotalElevationLoss()); + } } private static TrackPoint createTrackPoint(long time, double latitude, double longitude, float accuracy, long speed, long altitude, float elevationGain, float heartRate, float cyclingCadence, float power) { diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java index 5159a3a46..5f98dada4 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java @@ -251,10 +251,13 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track if (icon != null) { trackData.track.setIcon(icon); } - if (trackData.trackStatisticsUpdater == null) { - trackData.trackStatisticsUpdater = new TrackStatisticsUpdater(); + + TrackStatisticsUpdater statistics = new TrackStatisticsUpdater(); + //TODO I guess, we should not filter by recordingDistanceInterval on import; the data is already recorded, so we should not change it. + for (TrackPoint trackPoint : trackData.bufferedTrackPoints) { + statistics.addTrackPoint(trackPoint, recordingDistanceInterval); } - trackData.track.setTrackStatistics(trackData.trackStatisticsUpdater.getTrackStatistics()); + trackData.track.setTrackStatistics(statistics.getTrackStatistics()); Track track = contentProviderUtils.getTrack(trackData.track.getUuid()); if (track != null) { @@ -502,12 +505,6 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track * @param trackPoint the trackPoint */ protected void insertTrackPoint(TrackPoint trackPoint) { - if (trackData.trackStatisticsUpdater == null) { - trackData.trackStatisticsUpdater = new TrackStatisticsUpdater(); - } - //TODO I guess, we should not filter by recordingDistanceInterval on import; the data is already recorded, so we should not change it. - trackData.trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval); - trackData.bufferedTrackPoints.add(trackPoint); } @@ -548,9 +545,6 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track // The last location in the current segment; Null if the current segment doesn't have a last location TrackPoint lastLocationInCurrentSegment; - // The TrackStatisticsUpdater for the current track - TrackStatisticsUpdater trackStatisticsUpdater; - // The buffered locations final List bufferedTrackPoints = new ArrayList<>(); }