package org.robobinding.widget.adapterview;
import static com.google.common.collect.Lists.newArrayList;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.notNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import org.robobinding.BindableView;
import org.robobinding.itempresentationmodel.DataSetChangeListeners;
import org.robobinding.itempresentationmodel.RefreshableItemPresentationModel;
import org.robobinding.itempresentationmodel.ViewTypeSelectionContext;
import org.robobinding.presentationmodel.AbstractItemPresentationModelObject;
import org.robobinding.property.DataSetPropertyChangeListener;
import org.robobinding.property.DataSetValueModel;
import org.robobinding.util.RandomValues;
import org.robobinding.viewattribute.ViewTag;
import org.robobinding.viewattribute.ViewTags;
import android.view.View;
import android.view.ViewGroup;
/**
*
* @since 1.0
* @version $Revision: 1.0 $
* @author Robert Taylor
*/
@RunWith(MockitoJUnitRunner.class)
public class DataSetAdapterTest {
private MockDataSetValueModel valueModel;
@Before
public void setUp() {
valueModel = new MockDataSetValueModel();
}
@Test
public void whenGenerateItemView_thenInflateTheCorrectViewWithItemPresentationModelAttached() {
View view = mock(View.class);
ItemLayoutBinder itemLayoutBinder = aItemLayoutBinder().inflateAndReturnRootView(view);
ViewTag<RefreshableItemPresentationModel> viewTag = mockViewTag();
ViewTags<RefreshableItemPresentationModel> viewTags = aViewTags().tagForViewAndReturn(view, viewTag);
DataSetAdapter dataSetAdapter = aDataSetAdapter()
.withItemLayoutBinder(itemLayoutBinder)
.withViewTags(viewTags)
.build();
View result = dataSetAdapter.getView(0, null, null);
assertThat(result, sameInstance(view));
verify(viewTag).set(notNull(RefreshableItemPresentationModel.class));
}
private ObjectDataSetAdapterBuilder aDataSetAdapter() {
return new ObjectDataSetAdapterBuilder(valueModel);
}
@SuppressWarnings("unchecked")
private ViewTag<RefreshableItemPresentationModel> mockViewTag() {
return mock(ViewTag.class);
}
private static ItemLayoutBinderBuilder aItemLayoutBinder() {
return new ItemLayoutBinderBuilder();
}
private static class ItemLayoutBinderBuilder {
private ItemLayoutBinder itemLayoutBinder;
public ItemLayoutBinderBuilder() {
itemLayoutBinder = mock(ItemLayoutBinder.class);
}
public ItemLayoutBinder inflateAndReturnRootView(View rootView) {
BindableView bindableView = mock(BindableView.class);
when(bindableView.getRootView()).thenReturn(rootView);
when(itemLayoutBinder.inflate(any(ViewGroup.class), anyInt())).thenReturn(bindableView);
return itemLayoutBinder;
}
}
private static ViewTagsBuilder aViewTags() {
return new ViewTagsBuilder();
}
private static class ViewTagsBuilder {
private ViewTags<RefreshableItemPresentationModel> viewTags;
@SuppressWarnings("unchecked")
public ViewTagsBuilder() {
viewTags = mock(ViewTags.class);
}
public ViewTags<RefreshableItemPresentationModel> tagForViewAndReturn(View view, ViewTag<RefreshableItemPresentationModel> viewTag) {
when(viewTags.tagFor(view)).thenReturn(viewTag);
return viewTags;
}
}
@Test
public void whenGenerateDropdownView_thenInflateTheCorrectViewWithItemPresentationModelAttached() {
View view = mock(View.class);
ItemLayoutBinder dropdownLayoutBinder = aItemLayoutBinder().inflateAndReturnRootView(view);
ViewTag<RefreshableItemPresentationModel> viewTag = mockViewTag();
ViewTags<RefreshableItemPresentationModel> viewTags = aViewTags().tagForViewAndReturn(view, viewTag);
DataSetAdapter dataSetAdapter = aDataSetAdapter()
.withDropdownLayoutBinder(dropdownLayoutBinder)
.withViewTags(viewTags)
.build();
View result = dataSetAdapter.getDropDownView(0, null, null);
assertThat(result, sameInstance(view));
verify(viewTag).set(notNull(RefreshableItemPresentationModel.class));
}
@Test
public void dataSetAdapterCountShouldReflectValueModel() {
DataSetAdapter dataSetAdapter = aDataSetAdapter()
.build();
assertThat(dataSetAdapter.getCount(), is(valueModel.size()));
}
public static class MockDataSetValueModel implements DataSetValueModel {
private DataSetChangeListeners listeners;
private List<Object> items;
public MockDataSetValueModel() {
listeners = new DataSetChangeListeners();
initializeItems();
}
private void initializeItems() {
items = newArrayList();
for (int i = 0; i < RandomValues.anyIntegerGreaterThanZero(); i++) {
items.add(new Object());
}
}
@Override
public void addPropertyChangeListener(DataSetPropertyChangeListener listener) {
listeners.add(listener);
}
@Override
public void removePropertyChangeListener(DataSetPropertyChangeListener listener) {
}
@Override
public int size() {
return items.size();
}
@Override
public Object get(int position) {
return null;
}
@Override
public RefreshableItemPresentationModel newRefreshableItemPresentationModel(int itemViewType) {
return mock(AbstractItemPresentationModelObject.class);
}
@Override
public int selectViewType(ViewTypeSelectionContext<Object> context) {
return 0;
}
@Override
public boolean preInitializingViewsWithDefault(boolean defaultValue) {
return false;
}
}
private static class ObjectDataSetAdapterBuilder {
private DataSetValueModel valueModel;
private ItemLayoutBinder itemLayoutBinder;
private ItemLayoutBinder dropdownLayoutBinder;
private ItemLayoutSelector layoutSelector;
private int dropdownLayoutId;
private ViewTags<RefreshableItemPresentationModel> viewTags;
private boolean preInitializeViews;
public ObjectDataSetAdapterBuilder(DataSetValueModel valueModel) {
this.valueModel = valueModel;
itemLayoutBinder = null;
dropdownLayoutBinder = null;
layoutSelector = new SingleItemLayoutSelector(1);
dropdownLayoutId = 1;
viewTags = null;
preInitializeViews = false;
}
public ObjectDataSetAdapterBuilder withViewTags(ViewTags<RefreshableItemPresentationModel> newValue) {
this.viewTags = newValue;
return this;
}
public ObjectDataSetAdapterBuilder withItemLayoutBinder(ItemLayoutBinder newValue) {
this.itemLayoutBinder = newValue;
return this;
}
public ObjectDataSetAdapterBuilder withDropdownLayoutBinder(ItemLayoutBinder newValue) {
this.dropdownLayoutBinder = newValue;
return this;
}
public DataSetAdapter build() {
return new DataSetAdapter(valueModel, itemLayoutBinder,
dropdownLayoutBinder, layoutSelector, dropdownLayoutId,
viewTags, preInitializeViews);
}
}
}