package me.tatarka.bindingcollectionadapter2;
import android.databinding.ObservableList;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.Arrays;
import me.tatarka.bindingcollectionadapter2.collections.DiffObservableList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@RunWith(JUnit4.class)
@SuppressWarnings("unchecked")
public class DiffObservableListTest {
@Test
public void insetOneItem() {
DiffObservableList<Item> list = new DiffObservableList<>(Item.DIFF_CALLBACK);
ObservableList.OnListChangedCallback callback = mock(ObservableList.OnListChangedCallback.class);
list.addOnListChangedCallback(callback);
list.update(Arrays.asList(new Item("1", "a")));
assertThat(list)
.hasSize(1)
.containsExactly(new Item("1", "a"));
verify(callback).onItemRangeInserted(list, 0, 1);
}
@Test
public void removeOneItem() {
DiffObservableList<Item> list = new DiffObservableList<>(Item.DIFF_CALLBACK);
ObservableList.OnListChangedCallback callback = mock(ObservableList.OnListChangedCallback.class);
list.addOnListChangedCallback(callback);
list.update(Arrays.asList(new Item("1", "a")));
list.update(Arrays.<Item>asList());
assertThat(list).isEmpty();
verify(callback).onItemRangeRemoved(list, 0, 1);
}
@Test
public void moveOneItem() {
DiffObservableList<Item> list = new DiffObservableList<>(Item.DIFF_CALLBACK);
ObservableList.OnListChangedCallback callback = mock(ObservableList.OnListChangedCallback.class);
list.addOnListChangedCallback(callback);
list.update(Arrays.asList(new Item("1", "a"), new Item("2", "b")));
list.update(Arrays.asList(new Item("2", "b"), new Item("1", "a")));
assertThat(list)
.hasSize(2)
.containsExactly(new Item("2", "b"), new Item("1", "a"));
verify(callback).onItemRangeMoved(list, 1, 0, 1);
}
@Test
public void changeItem() {
DiffObservableList<Item> list = new DiffObservableList<>(Item.DIFF_CALLBACK);
ObservableList.OnListChangedCallback callback = mock(ObservableList.OnListChangedCallback.class);
list.addOnListChangedCallback(callback);
list.update(Arrays.asList(new Item("1", "a")));
list.update(Arrays.asList(new Item("1", "b")));
assertThat(list)
.hasSize(1)
.containsExactly(new Item("1", "b"));
verify(callback).onItemRangeChanged(list, 0, 1);
}
static class Item {
static final DiffObservableList.Callback<Item> DIFF_CALLBACK = new DiffObservableList.Callback<Item>() {
@Override
public boolean areItemsTheSame(Item oldItem, Item newItem) {
return oldItem.id.equals(newItem.id);
}
@Override
public boolean areContentsTheSame(Item oldItem, Item newItem) {
return oldItem.value.equals(newItem.value);
}
};
final String id;
final String value;
Item(String id, String value) {
this.id = id;
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Item item = (Item) o;
if (!id.equals(item.id)) return false;
return value.equals(item.value);
}
@Override
public int hashCode() {
int result = id.hashCode();
result = 31 * result + value.hashCode();
return result;
}
@Override
public String toString() {
return "Test(" +
"id='" + id + '\'' +
", value='" + value + '\'' +
')';
}
}
}