diff options
| -rw-r--r-- | main/src/cgeo/geocaching/AbstractPopupActivity.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CacheDetailActivity.java | 17 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgeo.java | 11 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgeonavigate.java | 26 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgeotrackable.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/gc/GCMap.java | 9 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/geopoint/HumanDistance.java | 49 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/geopoint/Units.java | 73 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/ScaleOverlay.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/ui/AddressListAdapter.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/ui/CacheDetailsCreator.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/ui/DistanceView.java | 6 | ||||
| -rw-r--r-- | tests/src/cgeo/geocaching/geopoint/HumanDistanceTest.java | 41 | ||||
| -rw-r--r-- | tests/src/cgeo/geocaching/geopoint/UnitsTest.java | 103 |
14 files changed, 207 insertions, 148 deletions
diff --git a/main/src/cgeo/geocaching/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java index bf81d5c..819aa68 100644 --- a/main/src/cgeo/geocaching/AbstractPopupActivity.java +++ b/main/src/cgeo/geocaching/AbstractPopupActivity.java @@ -8,7 +8,7 @@ import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.gcvote.GCVote; import cgeo.geocaching.gcvote.GCVoteRating; import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.HumanDistance; +import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.ui.CacheDetailsCreator; import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.Log; @@ -64,7 +64,7 @@ public abstract class AbstractPopupActivity extends AbstractActivity { protected void updateGeoData(final IGeoData geo) { try { if (geo.getCoords() != null && cache != null && cache.getCoords() != null) { - cacheDistance.setText(HumanDistance.getHumanDistance(geo.getCoords().distanceTo(cache.getCoords()))); + cacheDistance.setText(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(cache.getCoords()))); cacheDistance.bringToFront(); } } catch (Exception e) { diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index bf80e5a..f897ffe 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -14,8 +14,7 @@ import cgeo.geocaching.enumerations.LoadFlags.SaveFlag; import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.enumerations.WaypointType; import cgeo.geocaching.geopoint.GeopointFormatter; -import cgeo.geocaching.geopoint.HumanDistance; -import cgeo.geocaching.geopoint.IConversion; +import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.network.HtmlImage; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.ui.CacheDetailsCreator; @@ -138,21 +137,13 @@ public class CacheDetailActivity extends AbstractActivity { final StringBuilder dist = new StringBuilder(); if (geo.getCoords() != null && cache != null && cache.getCoords() != null) { - dist.append(HumanDistance.getHumanDistance(geo.getCoords().distanceTo(cache.getCoords()))); + dist.append(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(cache.getCoords()))); } if (cache != null && cache.getElevation() != null) { if (geo.getAltitude() != 0.0) { - final double diff = cache.getElevation() - geo.getAltitude(); - dist.append(diff >= 0 ? " ↗" : " ↘"); - // TODO: move code related to different units (from the whole project) into utils code - if (Settings.isUseMetricUnits()) { - dist.append(Math.abs((int) diff)); - dist.append(" m"); - } else { - dist.append(Math.abs((int) (diff * IConversion.METERS_TO_FEET))); - dist.append(" ft"); - } + final float diff = (float) (cache.getElevation() - geo.getAltitude()); + dist.append(' ').append(Units.getElevation(diff)); } } diff --git a/main/src/cgeo/geocaching/cgeo.java b/main/src/cgeo/geocaching/cgeo.java index 35d0a22..bb01cf1 100644 --- a/main/src/cgeo/geocaching/cgeo.java +++ b/main/src/cgeo/geocaching/cgeo.java @@ -6,8 +6,7 @@ import cgeo.geocaching.connector.gc.Login; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.HumanDistance; -import cgeo.geocaching.geopoint.IConversion; +import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.maps.CGeoMap; import cgeo.geocaching.network.StatusUpdater.Status; import cgeo.geocaching.ui.Formatter; @@ -633,11 +632,7 @@ public class cgeo extends AbstractActivity { if (geo.getAccuracy() >= 0) { int speed = Math.round(geo.getSpeed()) * 60 * 60 / 1000; - if (Settings.isUseMetricUnits()) { - navAccuracy.setText("±" + Math.round(geo.getAccuracy()) + " m" + Formatter.SEPARATOR + speed + " km/h"); - } else { - navAccuracy.setText("±" + Math.round(geo.getAccuracy() * IConversion.METERS_TO_FEET) + " ft" + Formatter.SEPARATOR + speed / IConversion.MILES_TO_KILOMETER + " mph"); - } + navAccuracy.setText("±" + Units.getDistanceFromMeters(geo.getAccuracy()) + Formatter.SEPARATOR + Units.getSpeed(speed)); } else { navAccuracy.setText(null); } @@ -651,7 +646,7 @@ public class cgeo extends AbstractActivity { } } else { if (geo.getAltitude() != 0.0) { - final String humanAlt = HumanDistance.getHumanDistance((float) geo.getAltitude() / 1000); + final String humanAlt = Units.getDistanceFromKilometers((float) geo.getAltitude() / 1000); navLocation.setText(geo.getCoords() + " | " + humanAlt); } else { navLocation.setText(geo.getCoords().toString()); diff --git a/main/src/cgeo/geocaching/cgeonavigate.java b/main/src/cgeo/geocaching/cgeonavigate.java index 567ae74..6062a14 100644 --- a/main/src/cgeo/geocaching/cgeonavigate.java +++ b/main/src/cgeo/geocaching/cgeonavigate.java @@ -2,8 +2,7 @@ package cgeo.geocaching; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.HumanDistance; -import cgeo.geocaching.geopoint.IConversion; +import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.maps.CGeoMap; import cgeo.geocaching.ui.CompassView; import cgeo.geocaching.utils.GeoDirHandler; @@ -217,7 +216,7 @@ public class cgeonavigate extends AbstractActivity { } cacheHeading = geo.getCoords().bearingTo(dstCoords); - distanceView.setText(HumanDistance.getHumanDistance(geo.getCoords().distanceTo(dstCoords))); + distanceView.setText(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(dstCoords))); headingView.setText(Math.round(cacheHeading) + "°"); } @@ -233,29 +232,22 @@ public class cgeonavigate extends AbstractActivity { } if (geo.getCoords() != null) { - String satellites; - if (geo.getSatellitesFixed() > 0) { - satellites = res.getString(R.string.loc_sat) + ": " + geo.getSatellitesFixed() + "/" + geo.getSatellitesVisible(); - } else if (geo.getSatellitesVisible() >= 0) { - satellites = res.getString(R.string.loc_sat) + ": 0/" + geo.getSatellitesVisible(); - } else { - satellites = ""; + if (geo.getSatellitesVisible() >= 0) { + navSatellites.setText(res.getString(R.string.loc_sat) + ": " + geo.getSatellitesFixed() + "/" + geo.getSatellitesVisible()); + } + else { + navSatellites.setText(""); } - navSatellites.setText(satellites); navType.setText(res.getString(geo.getLocationProvider().resourceId)); if (geo.getAccuracy() >= 0) { - if (Settings.isUseMetricUnits()) { - navAccuracy.setText("±" + Math.round(geo.getAccuracy()) + " m"); - } else { - navAccuracy.setText("±" + Math.round(geo.getAccuracy() * IConversion.METERS_TO_FEET) + " ft"); - } + navAccuracy.setText("±" + Units.getDistanceFromMeters(geo.getAccuracy())); } else { navAccuracy.setText(null); } if (geo.getAltitude() != 0.0f) { - final String humanAlt = HumanDistance.getHumanDistance((float) geo.getAltitude() / 1000); + final String humanAlt = Units.getDistanceFromMeters((float) geo.getAltitude()); navLocation.setText(geo.getCoords() + " | " + humanAlt); } else { navLocation.setText(geo.getCoords().toString()); diff --git a/main/src/cgeo/geocaching/cgeotrackable.java b/main/src/cgeo/geocaching/cgeotrackable.java index c635e41..acd351d 100644 --- a/main/src/cgeo/geocaching/cgeotrackable.java +++ b/main/src/cgeo/geocaching/cgeotrackable.java @@ -3,7 +3,7 @@ package cgeo.geocaching; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.connector.gc.GCParser; import cgeo.geocaching.enumerations.LogType; -import cgeo.geocaching.geopoint.HumanDistance; +import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.network.HtmlImage; import cgeo.geocaching.ui.CacheDetailsCreator; import cgeo.geocaching.ui.Formatter; @@ -166,7 +166,7 @@ public class cgeotrackable extends AbstractActivity { // trackable distance if (trackable.getDistance() >= 0) { - details.add(R.string.trackable_distance, HumanDistance.getHumanDistance(trackable.getDistance())); + details.add(R.string.trackable_distance, Units.getDistanceFromKilometers(trackable.getDistance())); } // trackable goal diff --git a/main/src/cgeo/geocaching/connector/gc/GCMap.java b/main/src/cgeo/geocaching/connector/gc/GCMap.java index a8509b8..dd9193d 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCMap.java +++ b/main/src/cgeo/geocaching/connector/gc/GCMap.java @@ -10,7 +10,7 @@ import cgeo.geocaching.enumerations.LiveMapStrategy.Strategy; import cgeo.geocaching.enumerations.LiveMapStrategy.StrategyFlag; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.IConversion; +import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.ui.Formatter; @@ -243,12 +243,7 @@ public class GCMap { SearchResult result = searchByViewport(viewport, tokens, strategy); if (Settings.isDebug()) { - String text = Formatter.SEPARATOR + strategy.getL10n() + Formatter.SEPARATOR; - if (Settings.isUseMetricUnits()) { - text += speed + " km/h"; - } else { - text += speed / IConversion.MILES_TO_KILOMETER + " mph"; - } + StringBuilder text = new StringBuilder(Formatter.SEPARATOR).append(strategy.getL10n()).append(Formatter.SEPARATOR).append(Units.getSpeed(speed)); result.setUrl(result.getUrl() + text); } diff --git a/main/src/cgeo/geocaching/geopoint/HumanDistance.java b/main/src/cgeo/geocaching/geopoint/HumanDistance.java deleted file mode 100644 index 25d1bb7..0000000 --- a/main/src/cgeo/geocaching/geopoint/HumanDistance.java +++ /dev/null @@ -1,49 +0,0 @@ -package cgeo.geocaching.geopoint; - -import cgeo.geocaching.Settings; - -import org.apache.commons.lang3.tuple.ImmutablePair; - -public class HumanDistance { - - public static ImmutablePair<Double, String> scaleUnit(final double distanceKilometers) { - double distance; - String units; - if (Settings.isUseMetricUnits()) { - if (distanceKilometers >= 1) { - distance = distanceKilometers; - units = "km"; - } else { - distance = distanceKilometers * 1000; - units = "m"; - } - } else { - distance = distanceKilometers / IConversion.MILES_TO_KILOMETER; - if (distance >= 0.1) { - units = "mi"; - } else { - distance *= 5280; - units = "ft"; - } - } - return new ImmutablePair<Double, String>(distance, units); - } - - public static String getHumanDistance(final Float distanceKilometers) { - if (distanceKilometers == null) { - return "?"; - } - - final ImmutablePair<Double, String> scaled = scaleUnit(distanceKilometers); - String formatString; - if (scaled.left >= 100) { - formatString = "%.0f"; - } else if (scaled.left >= 10) { - formatString = "%.1f"; - } else { - formatString = "%.2f"; - } - - return String.format(formatString + " %s", scaled.left, scaled.right); - } -} diff --git a/main/src/cgeo/geocaching/geopoint/Units.java b/main/src/cgeo/geocaching/geopoint/Units.java new file mode 100644 index 0000000..3da3ad9 --- /dev/null +++ b/main/src/cgeo/geocaching/geopoint/Units.java @@ -0,0 +1,73 @@ +package cgeo.geocaching.geopoint; + +import cgeo.geocaching.Settings; + +import org.apache.commons.lang3.tuple.ImmutablePair; + +public class Units { + + public static ImmutablePair<Double, String> scaleDistance(final double distanceKilometers) { + double distance; + String units; + if (Settings.isUseMetricUnits()) { + if (distanceKilometers >= 1) { + distance = distanceKilometers; + units = "km"; + } else { + distance = distanceKilometers * 1000; + units = "m"; + } + } else { + distance = distanceKilometers / IConversion.MILES_TO_KILOMETER; + if (distance >= 0.1) { + units = "mi"; + } else { + distance *= 5280; + units = "ft"; + } + } + return new ImmutablePair<Double, String>(distance, units); + } + + public static String getDistanceFromKilometers(final Float distanceKilometers) { + if (distanceKilometers == null) { + return "?"; + } + + final ImmutablePair<Double, String> scaled = scaleDistance(distanceKilometers); + String formatString; + if (scaled.left >= 100) { + formatString = "%.0f"; + } else if (scaled.left >= 10) { + formatString = "%.1f"; + } else { + formatString = "%.2f"; + } + + return String.format(formatString + " %s", scaled.left, scaled.right); + } + + /** + * Get human readable elevation, depending on settings for metric units. + * Result is rounded to full meters/feet, as the sensors don't have that precision anyway. + * + * @param meters + * @return + */ + public static String getElevation(float meters) { + final ImmutablePair<Double, String> scaled = scaleDistance(meters / 1000f); + return (meters >= 0 ? "↥ " : "↧ ") + String.format("%d %s", Math.abs(Math.round(scaled.left)), scaled.right); + } + + public static String getDistanceFromMeters(float meters) { + return getDistanceFromKilometers(meters / 1000f); + } + + public static String getSpeed(float kilometersPerHour) { + final String speed = getDistanceFromKilometers(kilometersPerHour); + if (speed.endsWith("mi")) { + return speed.substring(0, speed.length() - 2) + "mph"; + } + return speed + (Settings.isUseMetricUnits() ? "/h" : "ph"); + } +} diff --git a/main/src/cgeo/geocaching/maps/ScaleOverlay.java b/main/src/cgeo/geocaching/maps/ScaleOverlay.java index 321624d..bee6acf 100644 --- a/main/src/cgeo/geocaching/maps/ScaleOverlay.java +++ b/main/src/cgeo/geocaching/maps/ScaleOverlay.java @@ -1,7 +1,7 @@ package cgeo.geocaching.maps; import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.HumanDistance; +import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.maps.interfaces.GeneralOverlay; import cgeo.geocaching.maps.interfaces.GeoPointImpl; import cgeo.geocaching.maps.interfaces.MapProjectionImpl; @@ -62,7 +62,7 @@ public class ScaleOverlay implements GeneralOverlay { final Geopoint leftCoords = new Geopoint(center.getLatitudeE6() / 1e6, center.getLongitudeE6() / 1e6 - span / 2); final Geopoint rightCoords = new Geopoint(center.getLatitudeE6() / 1e6, center.getLongitudeE6() / 1e6 + span / 2); - final ImmutablePair<Double, String> scaled = HumanDistance.scaleUnit(leftCoords.distanceTo(rightCoords) * SCALE_WIDTH_FACTOR); + final ImmutablePair<Double, String> scaled = Units.scaleDistance(leftCoords.distanceTo(rightCoords) * SCALE_WIDTH_FACTOR); final double distanceRound = keepSignificantDigit(scaled.left); final double pixels = Math.round((mapView.getWidth() * SCALE_WIDTH_FACTOR / scaled.left) * distanceRound); diff --git a/main/src/cgeo/geocaching/ui/AddressListAdapter.java b/main/src/cgeo/geocaching/ui/AddressListAdapter.java index 17a9289..eb8b516 100644 --- a/main/src/cgeo/geocaching/ui/AddressListAdapter.java +++ b/main/src/cgeo/geocaching/ui/AddressListAdapter.java @@ -4,7 +4,7 @@ import cgeo.geocaching.R; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.cgeocaches; import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.HumanDistance; +import cgeo.geocaching.geopoint.Units; import org.apache.commons.lang3.StringUtils; @@ -73,7 +73,7 @@ public class AddressListAdapter extends ArrayAdapter<Address> { private CharSequence getDistanceText(final Address address) { if (location != null && address.hasLatitude() && address.hasLongitude()) { - return HumanDistance.getHumanDistance(location.distanceTo(new Geopoint(address.getLatitude(), address.getLongitude()))); + return Units.getDistanceFromKilometers(location.distanceTo(new Geopoint(address.getLatitude(), address.getLongitude()))); } return ""; diff --git a/main/src/cgeo/geocaching/ui/CacheDetailsCreator.java b/main/src/cgeo/geocaching/ui/CacheDetailsCreator.java index 70fc2bb..2a83ddc 100644 --- a/main/src/cgeo/geocaching/ui/CacheDetailsCreator.java +++ b/main/src/cgeo/geocaching/ui/CacheDetailsCreator.java @@ -4,7 +4,7 @@ import cgeo.geocaching.R; import cgeo.geocaching.cgCache; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.HumanDistance; +import cgeo.geocaching.geopoint.Units; import org.apache.commons.lang3.StringUtils; @@ -148,7 +148,7 @@ public final class CacheDetailsCreator { } String text = "--"; if (distance != null) { - text = HumanDistance.getHumanDistance(distance); + text = Units.getDistanceFromKilometers(distance); } else if (cacheDistanceView != null) { // if there is already a distance in cacheDistance, use it instead of resetting to default. diff --git a/main/src/cgeo/geocaching/ui/DistanceView.java b/main/src/cgeo/geocaching/ui/DistanceView.java index 83de4aa..9611511 100644 --- a/main/src/cgeo/geocaching/ui/DistanceView.java +++ b/main/src/cgeo/geocaching/ui/DistanceView.java @@ -1,7 +1,7 @@ package cgeo.geocaching.ui; import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.HumanDistance; +import cgeo.geocaching.geopoint.Units; import android.content.Context; import android.util.AttributeSet; @@ -30,11 +30,11 @@ public class DistanceView extends TextView { if (cacheCoords == null || coords == null) { return; } - setText(HumanDistance.getHumanDistance(coords.distanceTo(cacheCoords))); + setText(Units.getDistanceFromKilometers(coords.distanceTo(cacheCoords))); } public void setDistance(Float distance) { - setText("~" + HumanDistance.getHumanDistance(distance)); + setText("~" + Units.getDistanceFromKilometers(distance)); } public void clear() { diff --git a/tests/src/cgeo/geocaching/geopoint/HumanDistanceTest.java b/tests/src/cgeo/geocaching/geopoint/HumanDistanceTest.java deleted file mode 100644 index c5fce00..0000000 --- a/tests/src/cgeo/geocaching/geopoint/HumanDistanceTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package cgeo.geocaching.geopoint; - -import cgeo.CGeoTestCase; -import cgeo.geocaching.Settings; - -import java.util.regex.Pattern; - -public class HumanDistanceTest extends CGeoTestCase { - - private static void assertMatch(final String ok, final float distance) { - final String humanDistance = HumanDistance.getHumanDistance(distance); - if (!Pattern.compile('^' + ok + '$').matcher(humanDistance).find()) { - fail("getHumanDistance(" + distance + - ") [metric: " + (Settings.isUseMetricUnits() ? "yes" : "no") + - "] fails to match " + ok + ": " + humanDistance); - } - } - - // Make method non-static so that Settings is initialized - @SuppressWarnings("static-method") - public void testHumanDistance() { - assertEquals("?", HumanDistance.getHumanDistance(null)); - final boolean savedMetrics = Settings.isUseMetricUnits(); - try { - Settings.setUseMetricUnits(true); - assertMatch("123 km", 122.782f); - assertMatch("123 km", 123.456f); - assertMatch("12.3 km", 12.3456f); - assertMatch("1.23 km", 1.23456f); - assertMatch("123 m", 0.123456f); - Settings.setUseMetricUnits(false); - assertMatch("76.7 mi", 123.456f); - assertMatch("7.67 mi", 12.3456f); - assertMatch("0.77 mi", 1.23456f); - assertMatch("405 ft", 0.123456f); - assertMatch("40.5 ft", 0.0123456f); - } finally { - Settings.setUseMetricUnits(savedMetrics); - } - } -} diff --git a/tests/src/cgeo/geocaching/geopoint/UnitsTest.java b/tests/src/cgeo/geocaching/geopoint/UnitsTest.java new file mode 100644 index 0000000..10f1785 --- /dev/null +++ b/tests/src/cgeo/geocaching/geopoint/UnitsTest.java @@ -0,0 +1,103 @@ +package cgeo.geocaching.geopoint; + +import cgeo.CGeoTestCase; +import cgeo.geocaching.Settings; + +import org.apache.commons.lang3.StringUtils; + +public class UnitsTest extends CGeoTestCase { + + private static void assertDistance(final String expected, final float distance) { + final String actual = Units.getDistanceFromKilometers(distance); + if (!StringUtils.equals(expected, actual.replace(',', '.'))) { // make 1.2 the same as 1,2 + fail("getHumanDistance(" + distance + + ") [metric: " + (Settings.isUseMetricUnits() ? "yes" : "no") + + "] fails to match " + expected + ": " + actual); + } + } + + // Make method non-static so that Settings is initialized + @SuppressWarnings("static-method") + public void testDistance() { + assertEquals("?", Units.getDistanceFromKilometers(null)); + final boolean savedMetrics = Settings.isUseMetricUnits(); + try { + Settings.setUseMetricUnits(true); + assertDistance("123 km", 122.782f); + assertDistance("123 km", 123.456f); + assertDistance("12.3 km", 12.3456f); + assertDistance("1.23 km", 1.23456f); + assertDistance("123 m", 0.123456f); + Settings.setUseMetricUnits(false); + assertDistance("76.7 mi", 123.456f); + assertDistance("7.67 mi", 12.3456f); + assertDistance("0.77 mi", 1.23456f); + assertDistance("405 ft", 0.123456f); + assertDistance("40.5 ft", 0.0123456f); + } finally { + Settings.setUseMetricUnits(savedMetrics); + } + } + + // Make method non-static so that Settings is initialized + @SuppressWarnings("static-method") + public void testElevation() { + final boolean savedMetrics = Settings.isUseMetricUnits(); + try { + Settings.setUseMetricUnits(true); + assertElevation("↥ 123 m", 122.782f); + assertElevation("↥ 123 m", 123.456f); + assertElevation("↥ 12 m", 12.3456f); + assertElevation("↥ 1 m", 1.23456f); + assertElevation("↥ 2 m", 1.6f); + assertElevation("↥ 0 m", 0.123456f); + assertElevation("↧ 123 m", -122.782f); + assertElevation("↧ 123 m", -123.456f); + assertElevation("↧ 12 m", -12.3456f); + assertElevation("↧ 1 m", -1.23456f); + assertElevation("↧ 2 m", -1.6f); + assertElevation("↧ 0 m", -0.123456f); + Settings.setUseMetricUnits(false); + assertElevation("↥ 405 ft", 123.456f); + assertElevation("↥ 41 ft", 12.3456f); + } finally { + Settings.setUseMetricUnits(savedMetrics); + } + } + + private static void assertElevation(final String expected, final float meters) { + final String actual = Units.getElevation(meters); + if (!StringUtils.equals(expected, actual.replace(',', '.'))) { + fail("elevation " + actual + " does not match expected " + expected); + } + } + + // Make method non-static so that Settings is initialized + @SuppressWarnings("static-method") + public void testSpeed() { + assertEquals("?", Units.getDistanceFromKilometers(null)); + final boolean savedMetrics = Settings.isUseMetricUnits(); + try { + Settings.setUseMetricUnits(true); + assertSpeed("123 km/h", 122.782f); + assertSpeed("123 km/h", 123.456f); + assertSpeed("12.3 km/h", 12.3456f); + assertSpeed("1.23 km/h", 1.23456f); + assertSpeed("123 m/h", 0.123456f); + Settings.setUseMetricUnits(false); + assertSpeed("76.7 mph", 123.456f); + assertSpeed("7.67 mph", 12.3456f); + assertSpeed("0.77 mph", 1.23456f); + } finally { + Settings.setUseMetricUnits(savedMetrics); + } + } + + private static void assertSpeed(final String expected, final float kilometersPerHour) { + final String actual = Units.getSpeed(kilometersPerHour); + if (!StringUtils.equals(expected, actual.replace(',', '.'))) { + fail("speed " + actual + " does not match expected " + expected); + } + } + +} |
