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.io.File;
import java.sql.Date;
import java.util.Locale;
import java.util.TimeZone;
import co.smartreceipts.android.DefaultObjects;
import co.smartreceipts.android.model.Category;
import co.smartreceipts.android.model.PaymentMethod;
import co.smartreceipts.android.model.Price;
import co.smartreceipts.android.model.Receipt;
import co.smartreceipts.android.model.Source;
import co.smartreceipts.android.model.Trip;
import co.smartreceipts.android.persistence.DatabaseHelper;
import co.smartreceipts.android.sync.model.SyncState;
import co.smartreceipts.android.utils.TestLocaleToggler;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNull;
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 DefaultReceiptImplTest {
private static final int ID = 5;
private static final String NAME = "Name";
private static final Date DATE = new Date(1409703721000L);
private static final TimeZone TIMEZONE = TimeZone.getDefault();
private static final String COMMENT = "Comment";
private static final boolean REIMBURSABLE = true;
private static final int INDEX = 3;
private static final boolean FULL_PAGE = true;
private static final boolean IS_SELECTED = true;
private static final String EXTRA1 = "extra1";
private static final String EXTRA2 = "extra2";
private static final String EXTRA3 = "extra3";
// Class under test
DefaultReceiptImpl mReceipt;
Trip mTrip;
File mFile;
PaymentMethod mPaymentMethod;
Category mCategory;
Price mPrice;
Price mTax;
SyncState mSyncState;
@Before
public void setUp() throws Exception {
TestLocaleToggler.setDefaultLocale(Locale.US);
mTrip = DefaultObjects.newDefaultTrip();
mFile = new File(new File("").getAbsolutePath());
mPaymentMethod = DefaultObjects.newDefaultPaymentMethod();
mCategory = DefaultObjects.newDefaultCategory();
mPrice = DefaultObjects.newDefaultPrice();
mTax = DefaultObjects.newDefaultTax();
mSyncState = DefaultObjects.newDefaultSyncState();
mReceipt = new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState);
}
@After
public void tearDown() throws Exception {
TestLocaleToggler.resetDefaultLocale();
}
@Test
public void getId() {
assertEquals(ID, mReceipt.getId());
}
@Test
public void getTrip() {
assertEquals(mTrip, mReceipt.getTrip());
}
@Test
public void getPaymentMethod() {
assertEquals(mPaymentMethod, mReceipt.getPaymentMethod());
}
@Test
public void getName() {
assertEquals(NAME, mReceipt.getName());
}
@Test
public void getFile() {
assertEquals(mFile, mReceipt.getFile());
}
@Test
public void getCategory() {
assertEquals(mCategory, mReceipt.getCategory());
}
@Test
public void getComment() {
assertEquals(COMMENT, mReceipt.getComment());
}
@Test
public void getPrice() {
assertEquals(mPrice, mReceipt.getPrice());
}
@Test
public void getTax() {
assertEquals(mTax, mReceipt.getTax());
}
@Test
public void getDate() {
assertEquals(DATE, mReceipt.getDate());
}
@Test
public void getTimeZone() {
assertEquals(TIMEZONE, mReceipt.getTimeZone());
}
@Test
public void isReimbursable() {
assertEquals(REIMBURSABLE, mReceipt.isReimbursable());
}
@Test
public void isFullPage() {
assertEquals(FULL_PAGE, mReceipt.isFullPage());
}
@Test
public void isSelected() {
assertEquals(IS_SELECTED, mReceipt.isSelected());
}
@Test
public void getIndex() {
assertEquals(INDEX, mReceipt.getIndex());
}
@Test
public void getExtraEditText1() {
final Receipt nullExtra1Receipt = new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, null, EXTRA2, EXTRA3, mSyncState);
final Receipt noDataExtra1Receipt = new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, DatabaseHelper.NO_DATA, EXTRA2, EXTRA3, mSyncState);
assertTrue(mReceipt.hasExtraEditText1());
assertEquals(EXTRA1, mReceipt.getExtraEditText1());
assertFalse(nullExtra1Receipt.hasExtraEditText1());
assertNull(nullExtra1Receipt.getExtraEditText1());
assertFalse(noDataExtra1Receipt.hasExtraEditText1());
assertNull(noDataExtra1Receipt.getExtraEditText1());
}
@Test
public void getExtraEditText2() {
final Receipt nullExtra2Receipt = new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, null, EXTRA3, mSyncState);
final Receipt noDataExtra2Receipt = new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, DatabaseHelper.NO_DATA, EXTRA3, mSyncState);
assertTrue(mReceipt.hasExtraEditText2());
assertEquals(EXTRA2, mReceipt.getExtraEditText2());
assertFalse(nullExtra2Receipt.hasExtraEditText2());
assertNull(nullExtra2Receipt.getExtraEditText2());
assertFalse(noDataExtra2Receipt.hasExtraEditText2());
assertNull(noDataExtra2Receipt.getExtraEditText2());
}
@Test
public void getExtraEditText3() {
final Receipt nullExtra3Receipt = new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, null, mSyncState);
final Receipt noDataExtra3Receipt = new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, DatabaseHelper.NO_DATA, mSyncState);
assertTrue(mReceipt.hasExtraEditText3());
assertEquals(EXTRA3, mReceipt.getExtraEditText3());
assertFalse(nullExtra3Receipt.hasExtraEditText3());
assertNull(nullExtra3Receipt.getExtraEditText3());
assertFalse(noDataExtra3Receipt.hasExtraEditText3());
assertNull(noDataExtra3Receipt.getExtraEditText3());
}
@Test
public void getSyncState() {
assertEquals(mSyncState, mReceipt.getSyncState());
}
@Test
public void compareTo() {
assertTrue(mReceipt.compareTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState)) == 0);
assertTrue(mReceipt.compareTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, new Date(DATE.getTime()*2), TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState)) > 0);
assertTrue(mReceipt.compareTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, new Date(0), TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState)) < 0);
}
@Test
public void equals() {
Assert.assertEquals(mReceipt, mReceipt);
Assert.assertEquals(mReceipt, new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState));
assertThat(mReceipt, not(equalTo(new Object())));
assertThat(mReceipt, not(equalTo(mock(Receipt.class))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(-1, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mock(Trip.class), mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mock(File.class), mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mock(PaymentMethod.class), NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, "bad", mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mock(Category.class), COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, "bad", mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mock(Price.class), mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mock(Price.class), DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, new Date(System.currentTimeMillis()), TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, !REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, !FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, "bad", EXTRA2, EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, "bad", EXTRA3, mSyncState))));
assertThat(mReceipt, not(equalTo(new DefaultReceiptImpl(ID, INDEX, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, "bad", mSyncState))));
// Special equals cases (we don't check on the Index field, sources don't count, and selected doesn't count):
Assert.assertEquals(mReceipt, new DefaultReceiptImpl(ID, INDEX + 1, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState));
Assert.assertEquals(mReceipt, new DefaultReceiptImpl(ID, INDEX + 1, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, IS_SELECTED, Source.Parcel, EXTRA1, EXTRA2, EXTRA3, mSyncState));
Assert.assertEquals(mReceipt, new DefaultReceiptImpl(ID, INDEX + 1, mTrip, mFile, mPaymentMethod, NAME, mCategory, COMMENT, mPrice, mTax, DATE, TIMEZONE, REIMBURSABLE, FULL_PAGE, !IS_SELECTED, Source.Undefined, EXTRA1, EXTRA2, EXTRA3, mSyncState));
}
@Test
public void parcelEquality() {
final Parcel parcel = Parcel.obtain();
mReceipt.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
final DefaultReceiptImpl receipt = DefaultReceiptImpl.CREATOR.createFromParcel(parcel);
assertNotNull(receipt);
assertEquals(receipt, mReceipt);
}
}