package me.tatarka.bindingcollectionadapter2;
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;
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 BindingListViewAdapter.ItemIsEnabled<String> itemIsEnabled;
public final BindingListViewAdapter<String> listAdapter = new MyBindingListViewAdapter<>(1);
public final BindingViewPagerAdapter<String> pagerAdapter = new MyBindingViewPagerAdapter<>();
private ViewModel(List<String> items, ItemBinding<String> itemBinding, final List<Long> itemIds, final List<Boolean> itemIsEnabled) {
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;
}
if (itemIsEnabled != null) {
this.itemIsEnabled = new BindingListViewAdapter.ItemIsEnabled<String>() {
@Override
public boolean isEnabled(int position, String item) {
return itemIsEnabled.get(position);
}
};
} else {
this.itemIsEnabled = null;
}
}
public static class Builder {
private List<String> items;
private ItemBinding<String> itemBinding;
private List<Long> itemIds;
private List<Boolean> itemIsEnabled;
public Builder(List<String> items, ItemBinding<String> itemBinding) {
this.items = items;
this.itemBinding = itemBinding;
}
public Builder itemIds(List<Long> itemIds) {
this.itemIds = itemIds;
return this;
}
public Builder itemIsEnabled(List<Boolean> itemIsEnabled) {
this.itemIsEnabled = itemIsEnabled;
return this;
}
public ViewModel build() {
return new ViewModel(items, itemBinding, itemIds, itemIsEnabled);
}
}
}
public static class MyBindingListViewAdapter<T> extends BindingListViewAdapter<T> {
public MyBindingListViewAdapter(int itemTypeCount) {
super(itemTypeCount);
}
}
public static class MyBindingViewPagerAdapter<T> extends BindingViewPagerAdapter<T> {
}
public static <T> Iterable<T> iterable(final BindingListViewAdapter<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.getCount();
}
@Override
T get(int index) {
return adapter.getAdapterItem(index);
}
};
}
});
}
public static <T> Iterable<T> iterable(final BindingViewPagerAdapter<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.getCount();
}
@Override
T get(int index) {
return adapter.getAdapterItem(index);
}
};
}
});
}
public static Iterable<Long> iterableIds(final BindingListViewAdapter<?> adapter) {
if (adapter == null) return null;
return new IndexIterable<>(new Factory<IndexIterator<Long>>() {
@Override
public IndexIterator<Long> get() {
return new IndexIterator<Long>() {
@Override
int getCount() {
return adapter.getCount();
}
@Override
Long get(int index) {
return adapter.getItemId(index);
}
};
}
});
}
public static Iterable<Boolean> iterableIsEnabled(final BindingListViewAdapter<?> adapter) {
if (adapter == null) return null;
return new IndexIterable<>(new Factory<IndexIterator<Boolean>>() {
@Override
public IndexIterator<Boolean> get() {
return new IndexIterator<Boolean>() {
@Override
int getCount() {
return adapter.getCount();
}
@Override
Boolean get(int index) {
return adapter.isEnabled(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);
}
}