diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/sendtogoogle/SendToGoogleUtils.java b/MyTracks/src/com/google/android/apps/mytracks/io/sendtogoogle/SendToGoogleUtils.java index c3a29ce1d..142c20813 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/sendtogoogle/SendToGoogleUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/sendtogoogle/SendToGoogleUtils.java @@ -19,6 +19,7 @@ package com.google.android.apps.mytracks.io.sendtogoogle; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.apps.mytracks.util.LocationUtils; +import com.google.common.annotations.VisibleForTesting; import android.location.Location; import android.util.Log; @@ -109,11 +110,12 @@ public class SendToGoogleUtils { * @param segment the track segment * @param splitTracks an array of track segments */ - private static void prepareTrackSegment(Track segment, ArrayList splitTracks) { + @VisibleForTesting + static boolean prepareTrackSegment(Track segment, ArrayList splitTracks) { // Make sure the segment has at least 2 points if (segment.getLocations().size() < 2) { Log.d(TAG, "segment has less than 2 points"); - return; + return false; } // For a new segment, sets it stop time @@ -128,5 +130,6 @@ public class SendToGoogleUtils { LocationUtils.decimate(segment, 2.0); splitTracks.add(segment); + return true; } } diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/TrackStubUtils.java b/MyTracksTest/src/com/google/android/apps/mytracks/TrackStubUtils.java index 5bc04ef01..2fc915d7a 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/TrackStubUtils.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/TrackStubUtils.java @@ -31,9 +31,9 @@ import android.location.Location; public class TrackStubUtils { static final String LOCATION_PROVIDER = "gps"; - static final double INITIAL_LATITUDE = 22; - static final double INITIAL_LONGITUDE = 22; - static final double INITIAL_ALTITUDE = 22; + public static final double INITIAL_LATITUDE = 22; + public static final double INITIAL_LONGITUDE = 22; + public static final double INITIAL_ALTITUDE = 22; static final float INITIAL_ACCURACY = 5; static final float INITIAL_SPEED = 10; static final float INITIAL_BEARING = 3.0f; diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/io/sendtogoogle/SendToGoogleUtilsTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/io/sendtogoogle/SendToGoogleUtilsTest.java new file mode 100644 index 000000000..fa4629122 --- /dev/null +++ b/MyTracksTest/src/com/google/android/apps/mytracks/io/sendtogoogle/SendToGoogleUtilsTest.java @@ -0,0 +1,140 @@ +/* + * Copyright 2012 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.io.sendtogoogle; + +/** + * Tests the {@link SendToGoogleUtils}. + * + * @author Youtao Liu + */ +import com.google.android.apps.mytracks.TrackStubUtils; +import com.google.android.apps.mytracks.content.MyTracksLocation; +import com.google.android.apps.mytracks.content.Track; + +import android.location.Location; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.TestCase; + +public class SendToGoogleUtilsTest extends TestCase { + + private final static long TRACK_ID = 1L; + private final static String TRACK_CATEGORY = "trackCategory"; + private final static String TRACK_NAME = "trackName"; + private final static double DIFFERENCE = 0.02; + private final static double INVALID_LATITUDE = 91; + + /** + * Tests the method + * {@link SendToGoogleUtils#prepareTrackSegment(Track, java.util.ArrayList)} + * when there is only one location in a segment. + */ + public void testPrepareTrackSegment_onlyOneLocation() { + Track trackStub = TrackStubUtils.createTrack(1); + assertFalse(SendToGoogleUtils.prepareTrackSegment(trackStub, null)); + } + + /** + * Tests the method + * {@link SendToGoogleUtils#prepareTrackSegment(Track, ArrayList)} when there + * is no stop time. + */ + public void testPrepareTrackSegment_noStopTime() { + Track trackStub = TrackStubUtils.createTrack(2); + assertEquals(-1L, trackStub.getStatistics().getStopTime()); + + ArrayList tracksArray = new ArrayList(); + assertTrue(SendToGoogleUtils.prepareTrackSegment(trackStub, tracksArray)); + assertEquals(trackStub, tracksArray.get(0)); + // The stop time should be the time of last location + assertEquals(trackStub.getLocations().get(1).getTime(), trackStub.getStatistics().getStopTime()); + } + + /** + * Tests the method + * {@link SendToGoogleUtils#prepareTrackSegment(Track, java.util.ArrayList)} + * when there is stop time. + */ + public void testPrepareTrackSegment_hasStopTime() { + Track trackStub = TrackStubUtils.createTrack(2); + // Gives a margin to make sure the this time will be not same with the last + // location in the track. + long stopTime = System.currentTimeMillis() + 1000; + trackStub.getStatistics().setStopTime(stopTime); + + ArrayList tracksArray = new ArrayList(); + SendToGoogleUtils.prepareTrackSegment(trackStub, tracksArray); + assertEquals(trackStub, tracksArray.get(0)); + assertEquals(stopTime, trackStub.getStatistics().getStopTime()); + } + + /** + * Tests the method + * {@link SendToGoogleUtils#prepareLocations(Track, java.util.List)} . + */ + public void testPrepareLocations() { + Track trackStub = TrackStubUtils.createTrack(2); + trackStub.setId(TRACK_ID); + trackStub.setName(TRACK_NAME); + trackStub.setCategory(TRACK_CATEGORY); + + List locationsArray = new ArrayList(); + // Adds 100 location to List. + for (int i = 0; i < 100; i++) { + // Use this variable as a flag to make all points in the track can be kept + // after run the LocationUtils#decimate(Track, double) with + // Ramer–Douglas–Peucker algorithm. + double latitude = TrackStubUtils.INITIAL_LATITUDE; + if (i % 2 == 0) { + latitude -= DIFFERENCE * (i % 10); + } + // Inserts 9 points which have wrong latitude, so would have 10 segments. + if (i % 10 == 0 && i > 0) { + MyTracksLocation location = TrackStubUtils.createMyTracksLocation(); + location.setLatitude(INVALID_LATITUDE); + locationsArray.add(location); + } else { + locationsArray.add(TrackStubUtils.createMyTracksLocation(latitude, + TrackStubUtils.INITIAL_LONGITUDE + DIFFERENCE * (i % 10), + TrackStubUtils.INITIAL_ALTITUDE + DIFFERENCE * (i % 10))); + } + } + ArrayList result = SendToGoogleUtils.prepareLocations(trackStub, locationsArray); + assertEquals(10, result.size()); + // Checks all segments. + for (int i = 0; i < 10; i++) { + Track segmentOne = result.get(i); + assertEquals(TRACK_ID, segmentOne.getId()); + assertEquals(TRACK_NAME, segmentOne.getName()); + assertEquals(TRACK_CATEGORY, segmentOne.getCategory()); + } + // Checks all locations in the first segment. + for (int j = 0; j < 9; j++) { + double latitude = TrackStubUtils.INITIAL_LATITUDE; + if (j % 2 == 0) { + latitude -= DIFFERENCE * (j % 10); + } + Location oneLocation = result.get(0).getLocations().get(j); + assertEquals(TrackStubUtils.createMyTracksLocation().getAltitude() + DIFFERENCE * (j % 10), + oneLocation.getAltitude()); + assertEquals(latitude, oneLocation.getLatitude()); + assertEquals(TrackStubUtils.createMyTracksLocation().getLongitude() + DIFFERENCE * (j % 10), + oneLocation.getLongitude()); + } + } +}