package me.tatarka.bindingcollectionadapter2;
import android.databinding.ObservableArrayList;
import android.databinding.ObservableList;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import me.tatarka.bindingcollectionadapter2.collections.MergeObservableList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@RunWith(JUnit4.class)
@SuppressWarnings("unchecked")
public class MergeObservableTest {
@Test
public void emptyListIsEmpty() {
MergeObservableList<String> list = new MergeObservableList<>();
ObservableList.OnListChangedCallback callback = mock(ObservableList.OnListChangedCallback.class);
list.addOnListChangedCallback(callback);
assertThat(list).isEmpty();
verifyNoMoreInteractions(callback);
}
@Test
public void insertingItemContainsThatItem() {
MergeObservableList<String> list = new MergeObservableList<>();
ObservableList.OnListChangedCallback callback = mock(ObservableList.OnListChangedCallback.class);
list.addOnListChangedCallback(callback);
list.insertItem("test");
assertThat(list)
.hasSize(1)
.containsExactly("test");
verify(callback).onItemRangeInserted(list, 0, 1);
}
@Test
public void insertingListContainsThatList() {
MergeObservableList<String> list = new MergeObservableList<>();
ObservableList.OnListChangedCallback callback = mock(ObservableList.OnListChangedCallback.class);
list.addOnListChangedCallback(callback);
ObservableList<String> items = new ObservableArrayList<>();
items.add("test1");
items.add("test2");
list.insertList(items);
assertThat(list)
.hasSize(2)
.containsExactly("test1", "test2");
verify(callback).onItemRangeInserted(list, 0, 2);
}
@Test
public void insertingItemAndListContainsItemThenList() {
MergeObservableList<String> list = new MergeObservableList<>();
ObservableList.OnListChangedCallback callback = mock(ObservableList.OnListChangedCallback.class);
list.addOnListChangedCallback(callback);
list.insertItem("test1");
ObservableList<String> items = new ObservableArrayList<>();
items.add("test2");
items.add("test3");
list.insertList(items);
assertThat(list)
.hasSize(3)
.containsExactly("test1", "test2", "test3");
verify(callback).onItemRangeInserted(list, 0, 1);
verify(callback).onItemRangeInserted(list, 1, 2);
}
@Test
public void addingItemToBackingListAddsItemToList() {
MergeObservableList<String> list = new MergeObservableList<>();
ObservableList.OnListChangedCallback callback = mock(ObservableList.OnListChangedCallback.class);
list.addOnListChangedCallback(callback);
list.insertItem("test1");
ObservableList<String> items = new ObservableArrayList<>();
items.add("test2");
list.insertList(items);
list.insertItem("test4");
items.add("test3");
assertThat(list)
.hasSize(4)
.containsExactly("test1", "test2", "test3", "test4");
verify(callback).onItemRangeInserted(list, 0, 1);
verify(callback).onItemRangeInserted(list, 1, 1);
verify(callback, times(2)).onItemRangeInserted(list, 2, 1);
}
@Test
public void removingItemFromBackingListRemovesItemFromList() {
MergeObservableList<String> list = new MergeObservableList<>();
ObservableList.OnListChangedCallback callback = mock(ObservableList.OnListChangedCallback.class);
list.addOnListChangedCallback(callback);
list.insertItem("test1");
ObservableList<String> items = new ObservableArrayList<>();
items.add("test2");
list.insertList(items);
list.insertItem("test3");
items.clear();
assertThat(list)
.hasSize(2)
.containsExactly("test1", "test3");
verify(callback).onItemRangeInserted(list, 0, 1);
verify(callback).onItemRangeInserted(list, 1, 1);
verify(callback).onItemRangeInserted(list, 2, 1);
verify(callback).onItemRangeRemoved(list, 1, 1);
}
@Test
public void changingItemFromBackingListChangesItInList() {
MergeObservableList<String> list = new MergeObservableList<>();
ObservableList.OnListChangedCallback callback = mock(ObservableList.OnListChangedCallback.class);
list.addOnListChangedCallback(callback);
list.insertItem("test1");
ObservableList<String> items = new ObservableArrayList<>();
items.add("test2");
list.insertList(items);
items.set(0, "test3");
assertThat(list)
.hasSize(2)
.containsExactly("test1", "test3");
verify(callback).onItemRangeInserted(list, 0, 1);
verify(callback).onItemRangeInserted(list, 1, 1);
verify(callback).onItemRangeChanged(list, 1, 1);
}
}