package me.tatarka.bindingcollectionadapter2.recyclerview;
import android.support.test.espresso.core.deps.dagger.internal.Factory;
import android.support.test.espresso.core.deps.guava.base.Joiner;
import java.util.Iterator;
import java.util.List;
import me.tatarka.bindingcollectionadapter2.BindingListViewAdapter;
import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter;
import me.tatarka.bindingcollectionadapter2.ItemBinding;
public class TestHelpers {
public static class ViewModel {
public final List<String> items;
public final ItemBinding<String> itemBinding;
public final BindingListViewAdapter.ItemIds<String> itemIds;
public final MyBindingRecyclerViewAdapter<String> adapter = new MyBindingRecyclerViewAdapter<>();
public ViewModel(List<String> items, ItemBinding<String> itemBinding) {
this(items, itemBinding, null);
}
public ViewModel(List<String> items, ItemBinding<String> itemBinding, final List<Long> itemIds) {
this.items = items;
this.itemBinding = itemBinding;
if (itemIds != null) {
this.itemIds = new BindingListViewAdapter.ItemIds<String>() {
@Override
public long getItemId(int position, String item) {
return itemIds.get(position);
}
};
} else {
this.itemIds = null;
}
}
}
public static class MyBindingRecyclerViewAdapter<T> extends BindingRecyclerViewAdapter<T> {
}
public static <T> Iterable<T> iterable(final BindingRecyclerViewAdapter<T> adapter) {
if (adapter == null) return null;
return new IndexIterable<>(new Factory<IndexIterator<T>>() {
@Override
public IndexIterator<T> get() {
return new IndexIterator<T>() {
@Override
int getCount() {
return adapter.getItemCount();
}
@Override
T get(int index) {
return adapter.getAdapterItem(index);
}
};
}
});
}
private static class IndexIterable<T> implements Iterable<T> {
private Factory<IndexIterator<T>> iteratorFactory;
private IndexIterable(Factory<IndexIterator<T>> iteratorFactory) {
this.iteratorFactory = iteratorFactory;
}
@Override
public Iterator<T> iterator() {
return iteratorFactory.get();
}
@Override
public String toString() {
return iterator().toString();
}
}
private static abstract class IndexIterator<T> implements Iterator<T> {
private int index = 0;
@Override
public boolean hasNext() {
return index < getCount();
}
@Override
public T next() {
T item = get(index);
index += 1;
return item;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
@Override
public String toString() {
return "[" + Joiner.on(',').join(this) + "]";
}
abstract int getCount();
abstract T get(int index);
}
}