package me.tatarka.bindingcollectionadapter2; import android.databinding.DataBindingUtil; import android.databinding.ObservableArrayList; import android.databinding.ObservableList; import android.databinding.ViewDataBinding; import android.support.test.annotation.UiThreadTest; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.widget.ListView; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import java.util.Arrays; import java.util.List; import me.tatarka.bindingcollectionadapter2.test.R; import static me.tatarka.bindingcollectionadapter2.test.R.layout.item; import static org.assertj.core.api.Assertions.assertThat; @RunWith(AndroidJUnit4.class) public class DynamicItemViewTest { @Rule public ActivityTestRule<EmptyActivity> activityTestRule = new ActivityTestRule<>(EmptyActivity.class); private LayoutInflater inflater; @Before public void setup() throws Exception { inflater = LayoutInflater.from(activityTestRule.getActivity()); } @Test @UiThreadTest public void dynamicItemBindingInListView() { List<String> items = Arrays.asList("one", "two", "three"); TestHelpers.ViewModel viewModel = new TestHelpers.ViewModel.Builder(items, ItemBinding.<String>of(BR.item, item)).build(); ViewDataBinding binding = DataBindingUtil.inflate(inflater, R.layout.list_view, null, false); binding.setVariable(BR.viewModel, viewModel); binding.executePendingBindings(); TestHelpers.ViewModel newViewModel = new TestHelpers.ViewModel.Builder(items, ItemBinding.<String>of(BR.item, R.layout.item2)).build(); binding.setVariable(BR.viewModel, newViewModel); binding.executePendingBindings(); ListView listView = (ListView) binding.getRoot(); @SuppressWarnings("unchecked") BindingCollectionAdapter<String> adapter = (BindingCollectionAdapter<String>) listView.getAdapter(); assertThat(adapter.getItemBinding().layoutRes()).isEqualTo(R.layout.item2); } @Test @UiThreadTest public void adapterDoesntChangeForSameItemBindingInListView() { ObservableList<String> items = new ObservableArrayList<>(); items.addAll(Arrays.asList("one", "two", "three")); TestHelpers.ViewModel viewModel = new TestHelpers.ViewModel.Builder(items, ItemBinding.<String>of(BR.item, item)).build(); ViewDataBinding binding = DataBindingUtil.inflate(inflater, R.layout.list_view, null, false); binding.setVariable(BR.viewModel, viewModel); binding.executePendingBindings(); ListView listView1 = (ListView) binding.getRoot(); BindingCollectionAdapter<String> adapter1 = (BindingCollectionAdapter<String>) listView1.getAdapter(); items.add("four"); ListView listView2 = (ListView) binding.getRoot(); @SuppressWarnings("unchecked") BindingCollectionAdapter<String> adapter2 = (BindingCollectionAdapter<String>) listView2.getAdapter(); assertThat(adapter1).isSameAs(adapter2); } @Test @UiThreadTest public void adapterDoesntChangeForSameItemBindingSelectorInListView() { ObservableList<String> items = new ObservableArrayList<>(); items.addAll(Arrays.asList("one", "two", "three")); ItemBinding<String> itemBinding = ItemBinding.of(new OnItemBind<String>() { @Override public void onItemBind(ItemBinding itemBinding, int position, String item) { itemBinding.set(me.tatarka.bindingcollectionadapter2.BR.item, position); } }); TestHelpers.ViewModel viewModel = new TestHelpers.ViewModel.Builder(items, itemBinding).build(); ViewDataBinding binding = DataBindingUtil.inflate(inflater, R.layout.list_view, null, false); binding.setVariable(me.tatarka.bindingcollectionadapter2.BR.viewModel, viewModel); binding.executePendingBindings(); ListView listView1 = (ListView) binding.getRoot(); BindingCollectionAdapter<String> adapter1 = (BindingCollectionAdapter<String>) listView1.getAdapter(); items.add("four"); ListView listView2 = (ListView) binding.getRoot(); @SuppressWarnings("unchecked") BindingCollectionAdapter<String> adapter2 = (BindingCollectionAdapter<String>) listView2.getAdapter(); assertThat(adapter1).isSameAs(adapter2); } @Test @UiThreadTest public void dynamicItemBindingInViewPager() { List<String> items = Arrays.asList("one", "two", "three"); TestHelpers.ViewModel viewModel = new TestHelpers.ViewModel.Builder(items, ItemBinding.<String>of(me.tatarka.bindingcollectionadapter2.BR.item, item)).build(); ViewDataBinding binding = DataBindingUtil.inflate(inflater, R.layout.view_pager_adapter, null, false); binding.setVariable(me.tatarka.bindingcollectionadapter2.BR.viewModel, viewModel); binding.executePendingBindings(); TestHelpers.ViewModel newViewModel = new TestHelpers.ViewModel.Builder(items, ItemBinding.<String>of(me.tatarka.bindingcollectionadapter2.BR.item, R.layout.item2)).build(); binding.setVariable(me.tatarka.bindingcollectionadapter2.BR.viewModel, newViewModel); binding.executePendingBindings(); ViewPager viewPager = (ViewPager) binding.getRoot(); @SuppressWarnings("unchecked") BindingCollectionAdapter<String> adapter = (BindingCollectionAdapter<String>) viewPager.getAdapter(); assertThat(adapter.getItemBinding().layoutRes()).isEqualTo(R.layout.item2); } }