package com.maciekjanusz.compassproject; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.annotation.Config; import java.math.BigDecimal; import java.util.Random; import static com.maciekjanusz.compassproject.util.CompassMath.MAX_LATITUDE; import static com.maciekjanusz.compassproject.util.CompassMath.MAX_LONGITUDE; import static com.maciekjanusz.compassproject.util.CompassMath.calculateBearing; import static com.maciekjanusz.compassproject.util.CompassMath.validateLatitude; import static com.maciekjanusz.compassproject.util.CompassMath.validateLongitude; import static com.maciekjanusz.compassproject.util.CompassMath.decimalToDegrees; import static com.maciekjanusz.compassproject.util.CompassMath.degreesToDecimal; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; /** * To work on unit tests, switch the Test Artifact in the Build Variants view. */ @Config(constants = BuildConfig.class, sdk = 21, manifest = "app/src/main/AndroidManifest.xml") @RunWith(RobolectricGradleTestRunner.class) public class CompassMathTest { @Test public void testCalculateBearing() throws Exception { float lat1 = 0f, lon1 = 0f, lat2 = 0f, lon2 = 0f; float bearing = (float) calculateBearing(lat1, lon1, lat2, lon2); assertThat(bearing, equalTo(0f)); lon2 = 90f; bearing = (float) calculateBearing(lat1, lon1, lat2, lon2); assertThat(bearing, equalTo(90f)); lat2 = 45f; bearing = (float) calculateBearing(lat1, lon1, lat2, lon2); assertThat(bearing, equalTo(45f)); lat2 = -45f; lon2 = 0f; bearing = (float) calculateBearing(lat1, lon1, lat2, lon2); assertThat(bearing, equalTo(180f)); } @Test public void testValidateLatitude() throws Exception { Random random = new Random(); float interval = 2 * MAX_LATITUDE; float randomRightLatitude = (random.nextFloat() * interval) - MAX_LATITUDE; float randomWrongLatitude = (random.nextFloat() * interval) + MAX_LATITUDE + 0.1f; assertThat(validateLatitude(randomRightLatitude), equalTo(true)); assertThat(validateLatitude(randomWrongLatitude), equalTo(false)); assertThat(validateLatitude(MAX_LATITUDE), equalTo(true)); assertThat(validateLatitude(-MAX_LATITUDE), equalTo(true)); } @Test public void testValidateLongitude() throws Exception { Random random = new Random(); float interval = 2 * MAX_LONGITUDE; float randomRightLatitude = (random.nextFloat() * interval) - MAX_LONGITUDE; float randomWrongLatitude = (random.nextFloat() * interval) + MAX_LONGITUDE + 0.1f; assertThat(validateLongitude(randomRightLatitude), equalTo(true)); assertThat(validateLongitude(randomWrongLatitude), equalTo(false)); assertThat(validateLongitude(MAX_LONGITUDE), equalTo(true)); assertThat(validateLongitude(-MAX_LONGITUDE), equalTo(true)); } @Test public void testCoordinateConversion() throws Exception { float decimal = 50.06f; float[] degMinSec = decimalToDegrees(decimal); float resultDecimal = degreesToDecimal((int)degMinSec[0], (int)degMinSec[1], degMinSec[2]); resultDecimal = round(resultDecimal, 2); assertThat(resultDecimal, equalTo(decimal)); // test with 0 value decimal = 0; degMinSec = decimalToDegrees(decimal); resultDecimal = degreesToDecimal((int)degMinSec[0], (int)degMinSec[1], degMinSec[2]); resultDecimal = round(resultDecimal, 2); assertThat(resultDecimal, equalTo(decimal)); // test with more decimal places decimal = 39.572141f; degMinSec = decimalToDegrees(decimal); resultDecimal = degreesToDecimal((int)degMinSec[0], (int)degMinSec[1], degMinSec[2]); resultDecimal = round(resultDecimal, 6); assertThat(resultDecimal, equalTo(decimal)); } public static float round(float d, int decimalPlaces) { BigDecimal bd = new BigDecimal(Float.toString(d)); bd = bd.setScale(decimalPlaces, BigDecimal.ROUND_HALF_UP); return bd.floatValue(); } }