package com.airbnb.epoxy;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import java.util.List;
import static org.junit.Assert.assertEquals;
@Config(sdk = 21, manifest = TestRunner.MANIFEST_PATH)
@RunWith(TestRunner.class)
public class UpdateOpHelperTest {
private final UpdateOpHelper helper = new UpdateOpHelper();
@Test
public void insertionBatch() {
helper.add(0); // New batch
helper.add(1); // Add at the end
helper.add(0); // Add at the start
helper.add(1); // Add in the middle
assertEquals(1, helper.getNumInsertionBatches());
assertEquals(4, helper.getNumInsertions());
List<UpdateOp> opList = helper.opList;
assertEquals(1, opList.size());
assertEquals(0, opList.get(0).positionStart);
assertEquals(4, opList.get(0).itemCount);
assertEquals(0, helper.getNumRemovalBatches());
assertEquals(0, helper.getNumRemovals());
assertEquals(0, helper.getNumMoves());
}
@Test
public void insertionMultipleBatches() {
helper.add(1); // New batch
helper.add(3); // New batch
helper.add(1); // New batch
helper.add(0); // New batch
assertEquals(4, helper.getNumInsertionBatches());
assertEquals(4, helper.getNumInsertions());
List<UpdateOp> opList = helper.opList;
assertEquals(4, opList.size());
assertEquals(1, opList.get(0).positionStart);
assertEquals(1, opList.get(0).itemCount);
assertEquals(3, opList.get(1).positionStart);
assertEquals(1, opList.get(1).itemCount);
assertEquals(1, opList.get(2).positionStart);
assertEquals(1, opList.get(2).itemCount);
assertEquals(0, opList.get(3).positionStart);
assertEquals(1, opList.get(3).itemCount);
}
@Test
public void insertionBatchRanges() {
helper.add(1, 2);
helper.add(1, 1);
helper.add(4, 1);
assertEquals(1, helper.getNumInsertionBatches());
assertEquals(4, helper.getNumInsertions());
List<UpdateOp> opList = helper.opList;
assertEquals(1, opList.size());
assertEquals(1, opList.get(0).positionStart);
assertEquals(4, opList.get(0).itemCount);
}
@Test
public void removeBatch() {
helper.remove(3); // New batch
helper.remove(3); // Remove at the end
helper.remove(2); // Remove at the start
assertEquals(1, helper.getNumRemovalBatches());
assertEquals(3, helper.getNumRemovals());
List<UpdateOp> opList = helper.opList;
assertEquals(1, opList.size());
assertEquals(2, opList.get(0).positionStart);
assertEquals(3, opList.get(0).itemCount);
assertEquals(0, helper.getNumInsertionBatches());
assertEquals(0, helper.getNumInsertions());
assertEquals(0, helper.getNumMoves());
}
@Test
public void removeMultipleBatches() {
helper.remove(3);
helper.remove(4);
helper.remove(2);
assertEquals(3, helper.getNumRemovalBatches());
assertEquals(3, helper.getNumRemovals());
List<UpdateOp> opList = helper.opList;
assertEquals(3, opList.size());
assertEquals(3, opList.get(0).positionStart);
assertEquals(1, opList.get(0).itemCount);
assertEquals(4, opList.get(1).positionStart);
assertEquals(1, opList.get(1).itemCount);
assertEquals(2, opList.get(2).positionStart);
assertEquals(1, opList.get(2).itemCount);
}
@Test
public void removeBatchRange() {
helper.remove(3, 2);
helper.remove(3, 2);
helper.remove(0, 3);
assertEquals(1, helper.getNumRemovalBatches());
assertEquals(7, helper.getNumRemovals());
List<UpdateOp> opList = helper.opList;
assertEquals(1, opList.size());
assertEquals(0, opList.get(0).positionStart);
assertEquals(7, opList.get(0).itemCount);
}
@Test
public void update() {
helper.update(1); // New Batch
helper.update(0); // Update at start of batch
helper.update(2); // Update at end of batch
helper.update(0); // Update same item as before (shouldn't be added to batch length)
List<UpdateOp> opList = helper.opList;
assertEquals(1, opList.size());
assertEquals(0, opList.get(0).positionStart);
assertEquals(3, opList.get(0).itemCount);
assertEquals(0, helper.getNumInsertionBatches());
assertEquals(0, helper.getNumInsertions());
assertEquals(0, helper.getNumRemovalBatches());
assertEquals(0, helper.getNumRemovals());
assertEquals(0, helper.getNumMoves());
}
@Test
public void updateMultipleBatches() {
helper.update(3);
helper.update(5);
helper.update(3);
helper.update(0);
List<UpdateOp> opList = helper.opList;
assertEquals(4, opList.size());
assertEquals(3, opList.get(0).positionStart);
assertEquals(1, opList.get(0).itemCount);
assertEquals(5, opList.get(1).positionStart);
assertEquals(1, opList.get(1).itemCount);
assertEquals(3, opList.get(2).positionStart);
assertEquals(1, opList.get(2).itemCount);
assertEquals(0, opList.get(3).positionStart);
assertEquals(1, opList.get(3).itemCount);
assertEquals(0, helper.getNumInsertionBatches());
assertEquals(0, helper.getNumInsertions());
assertEquals(0, helper.getNumRemovalBatches());
assertEquals(0, helper.getNumRemovals());
assertEquals(0, helper.getNumMoves());
}
@Test
public void moves() {
helper.move(0, 3);
helper.move(0, 4);
assertEquals(2, helper.getNumMoves());
assertEquals(0, helper.getNumInsertionBatches());
assertEquals(0, helper.getNumInsertions());
assertEquals(0, helper.getNumRemovalBatches());
assertEquals(0, helper.getNumRemovals());
List<UpdateOp> opList = helper.opList;
assertEquals(2, opList.size());
assertEquals(0, opList.get(0).positionStart);
assertEquals(3, opList.get(0).itemCount);
assertEquals(0, opList.get(0).positionStart);
assertEquals(3, opList.get(0).itemCount);
}
}