forked from upstream-mirrors/OpenTracks
Add test case for SingleColorTrackPathPainter. Move createCachedLocations method and INVALID_LATITUDE field from DynamicSpeedTrackPathPainterTest to TrackPathPainterTestCase to make them can be invoked by both test cases.
This commit is contained in:
+26
-8
@@ -19,6 +19,7 @@ import com.google.android.apps.mytracks.MapOverlay.CachedLocation;
|
|||||||
import com.google.android.maps.GeoPoint;
|
import com.google.android.maps.GeoPoint;
|
||||||
import com.google.android.maps.Projection;
|
import com.google.android.maps.Projection;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
@@ -51,16 +52,31 @@ public class SingleColorTrackPathPainter implements TrackPathPainter {
|
|||||||
@Override
|
@Override
|
||||||
public void updatePath(Projection projection, Rect viewRect, int startLocationIdx,
|
public void updatePath(Projection projection, Rect viewRect, int startLocationIdx,
|
||||||
Boolean alwaysVisible, List<CachedLocation> points) {
|
Boolean alwaysVisible, List<CachedLocation> points) {
|
||||||
// Whether to start a new segment on new valid and visible point.
|
Path newPath = new Path();
|
||||||
|
newPath.incReserve(points.size());
|
||||||
|
updatePath(projection, viewRect, startLocationIdx, alwaysVisible, points, newPath);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates path.
|
||||||
|
*
|
||||||
|
* @param projection
|
||||||
|
* @param viewRect
|
||||||
|
* @param startLocationIdx
|
||||||
|
* @param alwaysVisible
|
||||||
|
* @param points
|
||||||
|
* @param newPath
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
void updatePath(Projection projection, Rect viewRect, int startLocationIdx,
|
||||||
|
Boolean alwaysVisible, List<CachedLocation> points, Path newPath) {
|
||||||
|
// Whether to start a new segment on new valid and visible point.
|
||||||
boolean newSegment = startLocationIdx <= 0 || !points.get(startLocationIdx - 1).valid;
|
boolean newSegment = startLocationIdx <= 0 || !points.get(startLocationIdx - 1).valid;
|
||||||
boolean lastVisible = !newSegment;
|
boolean lastVisible = !newSegment;
|
||||||
final Point pt = new Point();
|
final Point pt = new Point();
|
||||||
// Loop over track points.
|
// Loop over track points.
|
||||||
int numPoints = points.size();
|
for (int i = startLocationIdx; i < points.size() ; ++i) {
|
||||||
path = newPath();
|
|
||||||
path.incReserve(numPoints);
|
|
||||||
|
|
||||||
for (int i = startLocationIdx; i < numPoints ; ++i) {
|
|
||||||
CachedLocation loc = points.get(i);
|
CachedLocation loc = points.get(i);
|
||||||
|
|
||||||
// Check if valid, if not then indicate a new segment.
|
// Check if valid, if not then indicate a new segment.
|
||||||
@@ -82,12 +98,14 @@ public class SingleColorTrackPathPainter implements TrackPathPainter {
|
|||||||
// Either move to beginning of a new segment or continue the old one.
|
// Either move to beginning of a new segment or continue the old one.
|
||||||
projection.toPixels(geoPoint, pt);
|
projection.toPixels(geoPoint, pt);
|
||||||
if (newSegment) {
|
if (newSegment) {
|
||||||
path.moveTo(pt.x, pt.y);
|
newPath.moveTo(pt.x, pt.y);
|
||||||
newSegment = false;
|
newSegment = false;
|
||||||
} else {
|
} else {
|
||||||
path.lineTo(pt.x, pt.y);
|
newPath.lineTo(pt.x, pt.y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
path = newPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+2
-29
@@ -16,7 +16,6 @@
|
|||||||
package com.google.android.apps.mytracks.maps;
|
package com.google.android.apps.mytracks.maps;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.ColoredPath;
|
import com.google.android.apps.mytracks.ColoredPath;
|
||||||
import com.google.android.apps.mytracks.MapOverlay;
|
|
||||||
import com.google.android.apps.mytracks.MapOverlay.CachedLocation;
|
import com.google.android.apps.mytracks.MapOverlay.CachedLocation;
|
||||||
import com.google.android.apps.mytracks.TrackStubUtils;
|
import com.google.android.apps.mytracks.TrackStubUtils;
|
||||||
import com.google.android.apps.mytracks.util.UnitConversions;
|
import com.google.android.apps.mytracks.util.UnitConversions;
|
||||||
@@ -26,7 +25,6 @@ import com.google.android.testing.mocking.UsesMocks;
|
|||||||
|
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -37,7 +35,6 @@ import java.util.List;
|
|||||||
public class DynamicSpeedTrackPathPainterTest extends TrackPathPainterTestCase {
|
public class DynamicSpeedTrackPathPainterTest extends TrackPathPainterTestCase {
|
||||||
private DynamicSpeedTrackPathPainter dynamicSpeedTrackPathPainter;
|
private DynamicSpeedTrackPathPainter dynamicSpeedTrackPathPainter;
|
||||||
private TrackPathDescriptor trackPathDescriptor;
|
private TrackPathDescriptor trackPathDescriptor;
|
||||||
private static final int INVALID_LATITUDE = 100;
|
|
||||||
private static final int NUMBER_OF_LOCATIONS = 100;
|
private static final int NUMBER_OF_LOCATIONS = 100;
|
||||||
private static final int SLOW_SPEED = 30;
|
private static final int SLOW_SPEED = 30;
|
||||||
private static final int NORMAL_SPEED = 50;
|
private static final int NORMAL_SPEED = 50;
|
||||||
@@ -99,8 +96,7 @@ public class DynamicSpeedTrackPathPainterTest extends TrackPathPainterTestCase {
|
|||||||
// Gets the fast speed for location.
|
// Gets the fast speed for location.
|
||||||
int fastSpeed = (int) (NORMAL_SPEED * 3 / UnitConversions.MS_TO_KMH);
|
int fastSpeed = (int) (NORMAL_SPEED * 3 / UnitConversions.MS_TO_KMH);
|
||||||
|
|
||||||
// Get a number of startLocationIdx. And makes sure is less than
|
// Get a number of startLocationIdx. And makes sure is less than numberOfFirstThreeSegments.
|
||||||
// numberOfFirstThreeSegments.
|
|
||||||
int startLocationIdx = NUMBER_OF_LOCATIONS / 8;
|
int startLocationIdx = NUMBER_OF_LOCATIONS / 8;
|
||||||
int numberOfFirstThreeSegments = NUMBER_OF_LOCATIONS / 4;
|
int numberOfFirstThreeSegments = NUMBER_OF_LOCATIONS / 4;
|
||||||
int numberOfLastSegment = NUMBER_OF_LOCATIONS - numberOfFirstThreeSegments * 3;
|
int numberOfLastSegment = NUMBER_OF_LOCATIONS - numberOfFirstThreeSegments * 3;
|
||||||
@@ -151,28 +147,5 @@ public class DynamicSpeedTrackPathPainterTest extends TrackPathPainterTestCase {
|
|||||||
trackPathDescriptor);
|
trackPathDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a list of CachedLocations.
|
|
||||||
*
|
|
||||||
* @param number the number of locations
|
|
||||||
* @param isValid flag whether creates valid locations
|
|
||||||
* @param speed the speed of locations, and will be default value if less than
|
|
||||||
* zero
|
|
||||||
* @return the simulated locations
|
|
||||||
*/
|
|
||||||
private List<CachedLocation> createCachedLocations(int number, boolean isValid, float speed) {
|
|
||||||
List<CachedLocation> points = new ArrayList<MapOverlay.CachedLocation>();
|
|
||||||
double latitude = TrackStubUtils.INITIAL_LATITUDE;
|
|
||||||
if (!isValid) latitude = INVALID_LATITUDE;
|
|
||||||
for (int i = 0; i < number; ++i) {
|
|
||||||
Location location = TrackStubUtils.createMyTracksLocation(latitude,
|
|
||||||
TrackStubUtils.INITIAL_LONGITUDE, TrackStubUtils.INITIAL_ALTITUDE);
|
|
||||||
if (speed > 0) {
|
|
||||||
location.setSpeed(speed);
|
|
||||||
}
|
|
||||||
CachedLocation cachedLocation = new CachedLocation(location);
|
|
||||||
points.add(cachedLocation);
|
|
||||||
}
|
|
||||||
return points;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+117
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 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.maps;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.MapOverlay.CachedLocation;
|
||||||
|
import com.google.android.testing.mocking.AndroidMock;
|
||||||
|
import com.google.android.testing.mocking.UsesMocks;
|
||||||
|
|
||||||
|
import android.graphics.Path;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for the {@link SingleColorTrackPathPainter}.
|
||||||
|
*
|
||||||
|
* @author Youtao Liu
|
||||||
|
*/
|
||||||
|
public class SingleColorTrackPathPainterTest extends TrackPathPainterTestCase {
|
||||||
|
private SingleColorTrackPathPainter singleColorTrackPathPainter;
|
||||||
|
private Path pathMock;
|
||||||
|
private static final int NUMBER_OF_LOCATIONS = 100;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the
|
||||||
|
* {@link SingleColorTrackPathPainter#updatePath(com.google.android.maps.Projection, android.graphics.Rect, int, Boolean, List, Path)}
|
||||||
|
* method when all locations are valid.
|
||||||
|
*/
|
||||||
|
public void testUpdatePath_AllValidLocation() {
|
||||||
|
initialTrackPathDescriptorMock();
|
||||||
|
List<CachedLocation> points = createCachedLocations(NUMBER_OF_LOCATIONS, true, -1);
|
||||||
|
// Gets a random number from 1 to numberOfLocations.
|
||||||
|
int startLocationIdx = (int) (1 + (NUMBER_OF_LOCATIONS - 1) * Math.random());
|
||||||
|
|
||||||
|
for (int i = 0; i < NUMBER_OF_LOCATIONS - startLocationIdx; i++) {
|
||||||
|
pathMock.lineTo(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
AndroidMock.replay(pathMock);
|
||||||
|
singleColorTrackPathPainter.updatePath(myTracksOverlay.getMapProjection(mockView),
|
||||||
|
myTracksOverlay.getMapViewRect(mockView), startLocationIdx, true, points, pathMock);
|
||||||
|
AndroidMock.verify(pathMock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the
|
||||||
|
* {@link SingleColorTrackPathPainter#updatePath(com.google.android.maps.Projection, android.graphics.Rect, int, Boolean, List, Path)}
|
||||||
|
* method when all locations are invalid.
|
||||||
|
*/
|
||||||
|
public void testUpdatePath_AllInvalidLocation() {
|
||||||
|
initialTrackPathDescriptorMock();
|
||||||
|
List<CachedLocation> points = createCachedLocations(NUMBER_OF_LOCATIONS, false, -1);
|
||||||
|
// Gets a random number from 1 to numberOfLocations.
|
||||||
|
int startLocationIdx = (int) (1 + (NUMBER_OF_LOCATIONS - 1) * Math.random());
|
||||||
|
AndroidMock.replay(pathMock);
|
||||||
|
singleColorTrackPathPainter.updatePath(myTracksOverlay.getMapProjection(mockView),
|
||||||
|
myTracksOverlay.getMapViewRect(mockView), startLocationIdx, true, points, pathMock);
|
||||||
|
AndroidMock.verify(pathMock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the
|
||||||
|
* {@link SingleColorTrackPathPainter#updatePath(com.google.android.maps.Projection, android.graphics.Rect, int, Boolean, List, Path)}
|
||||||
|
* method when there are three segment.
|
||||||
|
*/
|
||||||
|
public void testUpdatePath_ThreeSegments() {
|
||||||
|
initialTrackPathDescriptorMock();
|
||||||
|
// First segment.
|
||||||
|
List<CachedLocation> points = createCachedLocations(NUMBER_OF_LOCATIONS, true, -1);
|
||||||
|
points.addAll(createCachedLocations(1, false, -1));
|
||||||
|
// Second segment.
|
||||||
|
points.addAll(createCachedLocations(NUMBER_OF_LOCATIONS, true, -1));
|
||||||
|
points.addAll(createCachedLocations(1, false, -1));
|
||||||
|
// Third segment.
|
||||||
|
points.addAll(createCachedLocations(NUMBER_OF_LOCATIONS, true, -1));
|
||||||
|
// Gets a random number from 1 to numberOfLocations.
|
||||||
|
int startLocationIdx = (int) (1 + (NUMBER_OF_LOCATIONS - 1) * Math.random());
|
||||||
|
for (int i = 0; i < NUMBER_OF_LOCATIONS - startLocationIdx; i++) {
|
||||||
|
pathMock.lineTo(0, 0);
|
||||||
|
}
|
||||||
|
pathMock.moveTo(0, 0);
|
||||||
|
for (int i = 0; i < NUMBER_OF_LOCATIONS - 1; i++) {
|
||||||
|
pathMock.lineTo(0, 0);
|
||||||
|
}
|
||||||
|
pathMock.moveTo(0, 0);
|
||||||
|
for (int i = 0; i < NUMBER_OF_LOCATIONS - 1; i++) {
|
||||||
|
pathMock.lineTo(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
AndroidMock.replay(pathMock);
|
||||||
|
singleColorTrackPathPainter.updatePath(myTracksOverlay.getMapProjection(mockView),
|
||||||
|
myTracksOverlay.getMapViewRect(mockView), startLocationIdx, true, points, pathMock);
|
||||||
|
AndroidMock.verify(pathMock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initials a mocked TrackPathDescriptor object.
|
||||||
|
*/
|
||||||
|
@UsesMocks(Path.class)
|
||||||
|
private void initialTrackPathDescriptorMock() {
|
||||||
|
pathMock = AndroidMock.createStrictMock(Path.class);
|
||||||
|
singleColorTrackPathPainter = new SingleColorTrackPathPainter(getContext());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -15,12 +15,19 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.apps.mytracks.maps;
|
package com.google.android.apps.mytracks.maps;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.MapOverlay;
|
||||||
|
import com.google.android.apps.mytracks.MapOverlay.CachedLocation;
|
||||||
import com.google.android.apps.mytracks.MockMyTracksOverlay;
|
import com.google.android.apps.mytracks.MockMyTracksOverlay;
|
||||||
|
import com.google.android.apps.mytracks.TrackStubUtils;
|
||||||
import com.google.android.maps.MapView;
|
import com.google.android.maps.MapView;
|
||||||
|
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
|
import android.location.Location;
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for the MyTracks track path descriptors and painters.
|
* Tests for the MyTracks track path descriptors and painters.
|
||||||
*
|
*
|
||||||
@@ -30,6 +37,8 @@ public class TrackPathPainterTestCase extends AndroidTestCase {
|
|||||||
protected Canvas canvas;
|
protected Canvas canvas;
|
||||||
protected MockMyTracksOverlay myTracksOverlay;
|
protected MockMyTracksOverlay myTracksOverlay;
|
||||||
protected MapView mockView;
|
protected MapView mockView;
|
||||||
|
|
||||||
|
final int INVALID_LATITUDE = 100;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void setUp() throws Exception {
|
protected void setUp() throws Exception {
|
||||||
@@ -40,4 +49,30 @@ public class TrackPathPainterTestCase extends AndroidTestCase {
|
|||||||
myTracksOverlay.setTrackDrawingEnabled(true);
|
myTracksOverlay.setTrackDrawingEnabled(true);
|
||||||
mockView = null;
|
mockView = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a list of CachedLocations.
|
||||||
|
*
|
||||||
|
* @param number the number of locations
|
||||||
|
* @param isValid flag whether creates valid locations
|
||||||
|
* @param speed the speed of locations, and will give a default valid value if less than
|
||||||
|
* zero
|
||||||
|
* @return the simulated locations
|
||||||
|
* @author Youtao Liu.
|
||||||
|
*/
|
||||||
|
List<CachedLocation> createCachedLocations(int number, boolean isValid, float speed) {
|
||||||
|
List<CachedLocation> points = new ArrayList<MapOverlay.CachedLocation>();
|
||||||
|
double latitude = TrackStubUtils.INITIAL_LATITUDE;
|
||||||
|
if (!isValid) latitude = INVALID_LATITUDE;
|
||||||
|
for (int i = 0; i < number; ++i) {
|
||||||
|
Location location = TrackStubUtils.createMyTracksLocation(latitude,
|
||||||
|
TrackStubUtils.INITIAL_LONGITUDE, TrackStubUtils.INITIAL_ALTITUDE);
|
||||||
|
if (speed > 0) {
|
||||||
|
location.setSpeed(speed);
|
||||||
|
}
|
||||||
|
CachedLocation cachedLocation = new CachedLocation(location);
|
||||||
|
points.add(cachedLocation);
|
||||||
|
}
|
||||||
|
return points;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user