From 7781014cf7cd76b2968526a213c517746939edbe Mon Sep 17 00:00:00 2001 From: Rodrigo Damazio Date: Tue, 7 Sep 2010 16:32:46 -0300 Subject: [PATCH] Fixing issue 148 - properly loading bounding boxes, and adding regression tests. --- .../android/apps/mytracks/MyTracksMap.java | 20 ++-- .../apps/mytracks/stats/ExtremityMonitor.java | 7 ++ .../apps/mytracks/stats/TripStatistics.java | 15 +-- .../mytracks/stats/TripStatisticsTest.java | 105 ++++++++++++++++++ 4 files changed, 130 insertions(+), 17 deletions(-) create mode 100644 MyTracksTest/src/com/google/android/apps/mytracks/stats/TripStatisticsTest.java diff --git a/MyTracks/src/com/google/android/apps/mytracks/MyTracksMap.java b/MyTracks/src/com/google/android/apps/mytracks/MyTracksMap.java index 394471e43..cf450bdb1 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MyTracksMap.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MyTracksMap.java @@ -375,7 +375,6 @@ public class MyTracksMap extends MapActivity } } - @SuppressWarnings("deprecation") protected void setupZoomControls() { mapView.setBuiltInZoomControls(true); } @@ -640,14 +639,18 @@ public class MyTracksMap extends MapActivity return; } TripStatistics stats = track.getStatistics(); - int latSpanE6 = stats.getTop() - stats.getBottom(); - int lonSpanE6 = stats.getRight() - stats.getLeft(); - if (latSpanE6 > 0 && latSpanE6 < 180E6 && lonSpanE6 > 0 - && lonSpanE6 < 180E6) { + int bottom = stats.getBottom(); + int left = stats.getLeft(); + int latSpanE6 = stats.getTop() - bottom; + int lonSpanE6 = stats.getRight() - left; + if (latSpanE6 > 0 + && latSpanE6 < 180E6 + && lonSpanE6 > 0 + && lonSpanE6 < 360E6) { keepMyLocationVisible = false; GeoPoint center = new GeoPoint( - stats.getBottom() + latSpanE6 / 2, - stats.getLeft() + lonSpanE6 / 2); + bottom + latSpanE6 / 2, + left + lonSpanE6 / 2); if (MyTracksUtils.isValidGeoPoint(center)) { mapView.getController().setCenter(center); mapView.getController().zoomToSpan(latSpanE6, lonSpanE6); @@ -1026,9 +1029,6 @@ public class MyTracksMap extends MapActivity cursor.close(); cursor = null; } - if (cursor != null) { - cursor.close(); - } mapView.postInvalidate(); } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/stats/ExtremityMonitor.java b/MyTracks/src/com/google/android/apps/mytracks/stats/ExtremityMonitor.java index 5b7aa855d..ac3b9fed4 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/stats/ExtremityMonitor.java +++ b/MyTracks/src/com/google/android/apps/mytracks/stats/ExtremityMonitor.java @@ -86,6 +86,13 @@ public class ExtremityMonitor { * Sets the minimum and maximum values. */ public void set(double min, double max) { + // If the min is greater than the max and they were actually initialized to + // some values, then we have a problem. + if (min > max && !Double.isInfinite(max) && !Double.isInfinite(min)) { + throw new IllegalArgumentException( + "Invalid min: " + min + " vs max:" + max); + } + this.min = min; this.max = max; } diff --git a/MyTracks/src/com/google/android/apps/mytracks/stats/TripStatistics.java b/MyTracks/src/com/google/android/apps/mytracks/stats/TripStatistics.java index 160c237f6..286158ead 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/stats/TripStatistics.java +++ b/MyTracks/src/com/google/android/apps/mytracks/stats/TripStatistics.java @@ -403,15 +403,16 @@ public class TripStatistics implements Parcelable { /** * Sets the bounding box for this trip. + * The unit for all parameters is signed decimal degrees (degrees * 1E6). * - * @param left the westmost longitude reached - * @param top the northmost latitude reached - * @param right the eastmost longitude reached - * @param bottom the southmost latitude reached + * @param leftE6 the westmost longitude reached + * @param topE6 the northmost latitude reached + * @param rightE6 the eastmost longitude reached + * @param bottomE6 the southmost latitude reached */ - public void setBounds(int left, int top, int right, int bottom) { - latitudeExtremities.set(bottom, top); - longitudeExtremities.set(left, right); + public void setBounds(int leftE6, int topE6, int rightE6, int bottomE6) { + latitudeExtremities.set(bottomE6 / 1E6, topE6 / 1E6); + longitudeExtremities.set(leftE6 / 1E6, rightE6 / 1E6); } // Data manipulation methods diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/stats/TripStatisticsTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/stats/TripStatisticsTest.java new file mode 100644 index 000000000..29737bb63 --- /dev/null +++ b/MyTracksTest/src/com/google/android/apps/mytracks/stats/TripStatisticsTest.java @@ -0,0 +1,105 @@ +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.android.apps.mytracks.stats; + +import junit.framework.TestCase; + +/** + * Tests for {@link TripStatistics}. + * This only tests non-trivial pieces of that class. + * + * @author Rodrigo Damazio + */ +public class TripStatisticsTest extends TestCase { + + private TripStatistics statistics; + + @Override + protected void setUp() throws Exception { + super.setUp(); + + statistics = new TripStatistics(); + } + + public void testSetBounds() { + // This is not a trivial setter, conversion happens in it + statistics.setBounds(12345, -34567, 56789, -98765); + assertEquals(12345, statistics.getLeft()); + assertEquals(-34567, statistics.getTop()); + assertEquals(56789, statistics.getRight()); + assertEquals(-98765, statistics.getBottom()); + } + + public void testMerge() { + TripStatistics statistics2 = new TripStatistics(); + statistics.setStartTime(1000L); // Resulting start time + statistics.setStopTime(2500L); + statistics2.setStartTime(3000L); + statistics2.setStopTime(4000L); // Resulting stop time + statistics.setTotalTime(1500L); + statistics2.setTotalTime(1000L); // Result: 1500+1000 + statistics.setMovingTime(700L); + statistics2.setMovingTime(600L); // Result: 700+600 + statistics.setTotalDistance(750.0); + statistics2.setTotalDistance(350.0); // Result: 750+350 + statistics.setTotalElevationGain(50.0); + statistics2.setTotalElevationGain(850.0); // Result: 850+50 + statistics.setMaxSpeed(60.0); // Resulting max speed + statistics2.setMaxSpeed(30.0); + statistics.setMaxElevation(1250.0); + statistics.setMinElevation(1200.0); // Resulting min elevation + statistics2.setMaxElevation(3575.0); // Resulting max elevation + statistics2.setMinElevation(2800.0); + statistics.setMaxGrade(15.0); + statistics.setMinGrade(-25.0); // Resulting min grade + statistics2.setMaxGrade(35.0); // Resulting max grade + statistics2.setMinGrade(0.0); + + // Resulting bounds: -10000, 35000, 30000, -40000 + statistics.setBounds(-10000, 20000, 30000, -40000); + statistics2.setBounds(-5000, 35000, 0, 20000); + + statistics.merge(statistics2); + + assertEquals(1000L, statistics.getStartTime()); + assertEquals(4000L, statistics.getStopTime()); + assertEquals(2500L, statistics.getTotalTime()); + assertEquals(1300L, statistics.getMovingTime()); + assertEquals(1100.0, statistics.getTotalDistance()); + assertEquals(900.0, statistics.getTotalElevationGain()); + assertEquals(60.0, statistics.getMaxSpeed()); + assertEquals(-10000, statistics.getLeft()); + assertEquals(30000, statistics.getRight()); + assertEquals(35000, statistics.getTop()); + assertEquals(-40000, statistics.getBottom()); + assertEquals(1200.0, statistics.getMinElevation()); + assertEquals(3575.0, statistics.getMaxElevation()); + assertEquals(-25.0, statistics.getMinGrade()); + assertEquals(35.0, statistics.getMaxGrade()); + } + + public void testGetAverageSpeed() { + statistics.setTotalDistance(1000.0); + statistics.setTotalTime(50000); // in milliseconds + assertEquals(20.0, statistics.getAverageSpeed()); + } + + public void testGetAverageMovingSpeed() { + statistics.setTotalDistance(1000.0); + statistics.setMovingTime(20000); // in milliseconds + assertEquals(50.0, statistics.getAverageMovingSpeed()); + } +}