package com.airbnb.epoxy;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@Config(sdk = 21, manifest = TestRunner.MANIFEST_PATH)
@RunWith(TestRunner.class)
public class ModelListTest {
private final ModelList.ModelListObserver observer = mock(ModelList.ModelListObserver.class);
private final ModelList modelList = new ModelList();
@Before
public void before() {
modelList.add(new TestModel());
modelList.add(new TestModel());
modelList.add(new TestModel());
modelList.setObserver(observer);
}
@Test
public void testSet() {
modelList.set(0, new TestModel());
verify(observer).onItemRangeRemoved(0, 1);
verify(observer).onItemRangeInserted(0, 1);
}
@Test
public void testSetSameIdDoesntNotify() {
EpoxyModel<?> newModelWithSameId = new TestModel();
newModelWithSameId.id(modelList.get(0).id());
modelList.set(0, newModelWithSameId);
verifyNoMoreInteractions(observer);
assertEquals(newModelWithSameId, modelList.get(0));
}
@Test
public void testAdd() {
modelList.add(new TestModel());
modelList.add(new TestModel());
verify(observer).onItemRangeInserted(3, 1);
verify(observer).onItemRangeInserted(4, 1);
}
@Test
public void testAddAtIndex() {
modelList.add(0, new TestModel());
modelList.add(2, new TestModel());
verify(observer).onItemRangeInserted(0, 1);
verify(observer).onItemRangeInserted(2, 1);
}
@Test
public void testAddAll() {
List<EpoxyModel<?>> newModels = new ArrayList<>();
newModels.add(new TestModel());
newModels.add(new TestModel());
modelList.addAll(newModels);
verify(observer).onItemRangeInserted(3, 2);
}
@Test
public void testAddAllAtIndex() {
List<EpoxyModel<?>> newModels = new ArrayList<>();
newModels.add(new TestModel());
newModels.add(new TestModel());
modelList.addAll(0, newModels);
verify(observer).onItemRangeInserted(0, 2);
}
@Test
public void testRemoveIndex() {
EpoxyModel<?> removedModel = modelList.remove(0);
assertFalse(modelList.contains(removedModel));
assertEquals(2, modelList.size());
verify(observer).onItemRangeRemoved(0, 1);
}
@Test
public void testRemoveObject() {
EpoxyModel<?> model = modelList.get(0);
boolean model1Removed = modelList.remove(model);
assertEquals(2, modelList.size());
assertTrue(model1Removed);
assertFalse(modelList.contains(model));
verify(observer).onItemRangeRemoved(0, 1);
}
@Test
public void testRemoveObjectNotAdded() {
boolean removed = modelList.remove(new TestModel());
assertFalse(removed);
verifyNoMoreInteractions(observer);
}
@Test
public void testClear() {
modelList.clear();
verify(observer).onItemRangeRemoved(0, 3);
}
@Test
public void testClearWhenAlreadyEmpty() {
modelList.clear();
modelList.clear();
verify(observer).onItemRangeRemoved(0, 3);
verifyNoMoreInteractions(observer);
}
@Test
public void testSublistClear() {
modelList.subList(0, 2).clear();
verify(observer).onItemRangeRemoved(0, 2);
}
@Test
public void testNoClearWhenEmpty() {
modelList.clear();
modelList.clear();
verify(observer).onItemRangeRemoved(0, 3);
verifyNoMoreInteractions(observer);
}
@Test
public void testRemoveRange() {
modelList.removeRange(0, 2);
assertEquals(1, modelList.size());
verify(observer).onItemRangeRemoved(0, 2);
}
@Test
public void testRemoveEmptyRange() {
modelList.removeRange(1, 1);
verifyNoMoreInteractions(observer);
}
@Test
public void testIteratorRemove() {
Iterator<EpoxyModel<?>> iterator = modelList.iterator();
iterator.next();
iterator.remove();
verify(observer).onItemRangeRemoved(0, 1);
}
@Test
public void testRemoveAll() {
List<EpoxyModel<?>> modelsToRemove = new ArrayList<>();
modelsToRemove.add(modelList.get(0));
modelsToRemove.add(modelList.get(1));
modelList.removeAll(modelsToRemove);
verify(observer, times(2)).onItemRangeRemoved(0, 1);
}
@Test
public void testRetainAll() {
List<EpoxyModel<?>> modelsToRetain = new ArrayList<>();
modelsToRetain.add(modelList.get(0));
modelList.retainAll(modelsToRetain);
verify(observer, times(2)).onItemRangeRemoved(1, 1);
}
}