package co.smartreceipts.android.model.impl; import android.os.Parcel; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import java.math.BigDecimal; import java.sql.Date; import java.util.Locale; import java.util.TimeZone; import co.smartreceipts.android.DefaultObjects; import co.smartreceipts.android.model.Distance; import co.smartreceipts.android.model.PriceCurrency; import co.smartreceipts.android.model.Trip; import co.smartreceipts.android.sync.model.SyncState; import co.smartreceipts.android.utils.TestLocaleToggler; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.core.IsNot.not; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; @RunWith(RobolectricTestRunner.class) public class ImmutableDistanceImplTest { private static final double EPSILON = 1d / Distance.RATE_PRECISION; private static final int ID = 5; private static final String LOCATION = "Location"; private static final BigDecimal DISTANCE = new BigDecimal(12.55d); private static final BigDecimal RATE = new BigDecimal(0.33d); private static final Date DATE = new Date(1409703721000L); private static final PriceCurrency CURRENCY = PriceCurrency.getInstance("USD"); private static final TimeZone TIMEZONE = TimeZone.getDefault(); private static final String COMMENT = "Comment"; // Class under test ImmutableDistanceImpl mDistance; Trip mTrip; SyncState mSyncState; @Before public void setUp() throws Exception { TestLocaleToggler.setDefaultLocale(Locale.US); mTrip = DefaultObjects.newDefaultTrip(); mSyncState = DefaultObjects.newDefaultSyncState(); mDistance = new ImmutableDistanceImpl(ID, mTrip, LOCATION, DISTANCE, RATE, CURRENCY, DATE, TIMEZONE, COMMENT, mSyncState); } @After public void tearDown() throws Exception { TestLocaleToggler.resetDefaultLocale(); } @Test public void getId() { assertEquals(ID, mDistance.getId()); } @Test public void getTrip() { assertEquals(mTrip, mDistance.getTrip()); } @Test public void getLocation() { assertEquals(LOCATION, mDistance.getLocation()); } @Test public void getDistance() { assertEquals(DISTANCE.doubleValue(), mDistance.getDistance().doubleValue(), EPSILON); } @Test public void getDecimalFormattedDistance() { assertEquals("12.55", mDistance.getDecimalFormattedDistance()); } @Test public void getDate() { assertEquals(DATE, mDistance.getDate()); } @Test public void getTimeZone() { assertEquals(TIMEZONE, mDistance.getTimeZone()); } @Test public void getRate() { assertEquals(RATE.doubleValue(), mDistance.getRate().doubleValue(), EPSILON); } @Test public void getDecimalFormattedRate() { assertEquals("0.330", mDistance.getDecimalFormattedRate()); } @Test public void getCurrencyFormattedRate() { assertEquals("$0.33", mDistance.getCurrencyFormattedRate()); } @Test public void getCurrencyFormattedRateFor3DigitPrecisionRate() { final Distance distance = new ImmutableDistanceImpl(ID, mTrip, LOCATION, DISTANCE, new BigDecimal(0.535), CURRENCY, DATE, TIMEZONE, COMMENT, mSyncState); assertEquals("$0.535", distance.getCurrencyFormattedRate()); } @Test public void getComment() { assertEquals(COMMENT, mDistance.getComment()); } @Test public void getSyncState() { Assert.assertEquals(mSyncState, mDistance.getSyncState()); } @Test public void compareTo() { assertTrue(mDistance.compareTo(new ImmutableDistanceImpl(ID, mTrip, LOCATION, DISTANCE, RATE, CURRENCY, DATE, TIMEZONE, COMMENT, mSyncState)) == 0); assertTrue(mDistance.compareTo(new ImmutableDistanceImpl(ID, mTrip, LOCATION, DISTANCE, RATE, CURRENCY, new Date(DATE.getTime()*2), TIMEZONE, COMMENT, mSyncState)) > 0); assertTrue(mDistance.compareTo(new ImmutableDistanceImpl(ID, mTrip, LOCATION, DISTANCE, RATE, CURRENCY, new Date(0), TIMEZONE, COMMENT, mSyncState)) < 0); } @Test public void equals() { Assert.assertEquals(mDistance, mDistance); Assert.assertEquals(mDistance, new ImmutableDistanceImpl(ID, mTrip, LOCATION, DISTANCE, RATE, CURRENCY, DATE, TIMEZONE, COMMENT, mSyncState)); assertThat(mDistance, not(equalTo(new Object()))); assertThat(mDistance, not(equalTo(mock(Distance.class)))); assertThat(mDistance, not(equalTo(new ImmutableDistanceImpl(-1, mTrip, LOCATION, DISTANCE, RATE, CURRENCY, DATE, TIMEZONE, COMMENT, mSyncState)))); assertThat(mDistance, not(equalTo(new ImmutableDistanceImpl(ID, mock(Trip.class), LOCATION, DISTANCE, RATE, CURRENCY, DATE, TIMEZONE, COMMENT, mSyncState)))); assertThat(mDistance, not(equalTo(new ImmutableDistanceImpl(ID, mTrip, "bad", DISTANCE, RATE, CURRENCY, DATE, TIMEZONE, COMMENT, mSyncState)))); assertThat(mDistance, not(equalTo(new ImmutableDistanceImpl(ID, mTrip, LOCATION, new BigDecimal(0), RATE, CURRENCY, DATE, TIMEZONE, COMMENT, mSyncState)))); assertThat(mDistance, not(equalTo(new ImmutableDistanceImpl(ID, mTrip, LOCATION, DISTANCE, new BigDecimal(0), CURRENCY, DATE, TIMEZONE, COMMENT, mSyncState)))); assertThat(mDistance, not(equalTo(new ImmutableDistanceImpl(ID, mTrip, LOCATION, DISTANCE, RATE, PriceCurrency.getInstance("EUR"), DATE, TIMEZONE, COMMENT, mSyncState)))); assertThat(mDistance, not(equalTo(new ImmutableDistanceImpl(ID, mTrip, LOCATION, DISTANCE, RATE, CURRENCY, new Date(System.currentTimeMillis()), TIMEZONE, COMMENT, mSyncState)))); assertThat(mDistance, not(equalTo(new ImmutableDistanceImpl(ID, mTrip, LOCATION, DISTANCE, RATE, CURRENCY, DATE, TIMEZONE, "bad", mSyncState)))); } @Test public void parcelEquality() { final Parcel parcel = Parcel.obtain(); mDistance.writeToParcel(parcel, 0); parcel.setDataPosition(0); final ImmutableDistanceImpl distance = ImmutableDistanceImpl.CREATOR.createFromParcel(parcel); assertNotNull(distance); assertEquals(distance, mDistance); } }