@Test public void noPayloadsForNoChanges() { DiffHelper diffHelper = new DiffHelper(adapter, true); TestModel firstModel = new TestModel(); models.add(firstModel); diffHelper.notifyModelChanges(); verify(observer).onItemRangeInserted(0, 1); models.clear(); diffHelper.notifyModelChanges(); verify(observer).onItemRangeRemoved(0, 1); verifyNoMoreInteractions(observer); }
@Test public void testAddModels() { List<TestModel> list = new ArrayList<>(); list.add(new TestModel()); list.add(new TestModel()); testAdapter.addModels(list); verify(observer).onItemRangeInserted(0, 2); assertEquals(2, testAdapter.models.size()); List<TestModel> list2 = new ArrayList<>(); list2.add(new TestModel()); list2.add(new TestModel()); testAdapter.addModels(list2); verify(observer).onItemRangeInserted(2, 2); assertEquals(4, testAdapter.models.size()); checkDifferState(); }
@Test public void payloadsDisabled() { DiffHelper diffHelper = new DiffHelper(adapter, false); TestModel firstModel = new TestModel(); models.add(firstModel); diffHelper.notifyModelChanges(); verify(observer).onItemRangeInserted(0, 1); TestModel updatedFirstModel = firstModel.clone().incrementValue(); models.clear(); models.add(updatedFirstModel); diffHelper.notifyModelChanges(); verify(observer).onItemRangeChanged(0, 1, null); verifyNoMoreInteractions(observer); }
@Test public void moveModelOtherWay() { AdapterDataObserver observer = mock(AdapterDataObserver.class); final List<TestModel> testModels = new ArrayList<>(); testModels.add(new TestModel(1)); testModels.add(new TestModel(2)); testModels.add(new TestModel(3)); EpoxyController controller = new EpoxyController() { @Override protected void buildModels() { add(testModels); } }; EpoxyControllerAdapter adapter = controller.getAdapter(); adapter.registerAdapterDataObserver(observer); controller.requestModelBuild(); verify(observer).onItemRangeInserted(0, 3); testModels.add(2, testModels.remove(1)); controller.moveModel(1, 2); verify(observer).onItemRangeMoved(1, 2, 1); assertEquals(testModels, adapter.getCurrentModels()); controller.requestModelBuild(); assertEquals(testModels, adapter.getCurrentModels()); verifyNoMoreInteractions(observer); }
@Test public void moveModel() { AdapterDataObserver observer = mock(AdapterDataObserver.class); final List<TestModel> testModels = new ArrayList<>(); testModels.add(new TestModel(1)); testModels.add(new TestModel(2)); testModels.add(new TestModel(3)); EpoxyController controller = new EpoxyController() { @Override protected void buildModels() { add(testModels); } }; EpoxyControllerAdapter adapter = controller.getAdapter(); adapter.registerAdapterDataObserver(observer); controller.requestModelBuild(); verify(observer).onItemRangeInserted(0, 3); testModels.add(0, testModels.remove(1)); controller.moveModel(1, 0); verify(observer).onItemRangeMoved(1, 0, 1); assertEquals(testModels, adapter.getCurrentModels()); controller.requestModelBuild(); assertEquals(testModels, adapter.getCurrentModels()); verifyNoMoreInteractions(observer); }
@Test public void typesWithOutHashCodeAreNotDiffed() { SimpleEpoxyController controller = new SimpleEpoxyController(); AdapterDataObserver observerMock = mock(AdapterDataObserver.class); controller.getAdapter().registerAdapterDataObserver(observerMock); ModelWithDataBindingBindingModel_ firstModel = new ModelWithDataBindingBindingModel_() .clickListener(new OnClickListener() { @Override public void onClick(View v) { } }) .id(1); controller.setModels(Collections.singletonList(firstModel)); verify(observerMock).onItemRangeInserted(0, 1); ModelWithDataBindingBindingModel_ secondModel = new ModelWithDataBindingBindingModel_() .clickListener(new OnClickListener() { @Override public void onClick(View v) { } }) .id(1); controller.setModels(Collections.singletonList(secondModel)); verifyNoMoreInteractions(observerMock); }
controller.setModel(model); controller.requestModelBuild(); verify(observerMock).onItemRangeInserted(eq(0), eq(1));
@Test public void unbindListenerChangesHashCode() { TestController controller = new TestController(); AdapterDataObserver observerMock = mock(AdapterDataObserver.class); controller.getAdapter().registerAdapterDataObserver(observerMock); ModelWithClickListener_ model = new ModelWithClickListener_(); controller.buildWithModel(model); verify(observerMock).onItemRangeInserted(eq(0), eq(1)); // shouldn't change model = new ModelWithClickListener_(); model.onUnbind(null); controller.buildWithModel(model); verify(observerMock, never()).onItemRangeChanged(eq(0), eq(1), any()); model = new ModelWithClickListener_(); UnbindListener listener1 = new UnbindListener(); model.onUnbind(listener1); controller.buildWithModel(model); verify(observerMock, times(1)).onItemRangeChanged(eq(0), eq(1), any()); model = new ModelWithClickListener_(); model.onUnbind(listener1); controller.buildWithModel(model); verify(observerMock, times(1)).onItemRangeChanged(eq(0), eq(1), any()); }
@Test public void bindListenerChangesHashCode() { TestController controller = new TestController(); AdapterDataObserver observerMock = mock(AdapterDataObserver.class); controller.getAdapter().registerAdapterDataObserver(observerMock); ModelWithClickListener_ model = new ModelWithClickListener_(); controller.buildWithModel(model); verify(observerMock).onItemRangeInserted(eq(0), eq(1)); // shouldn't change model = new ModelWithClickListener_(); model.onBind(null); controller.buildWithModel(model); verify(observerMock, never()).onItemRangeChanged(eq(0), eq(1), any()); model = new ModelWithClickListener_(); BindListener listener1 = new BindListener(); model.onBind(listener1); controller.buildWithModel(model); verify(observerMock, times(1)).onItemRangeChanged(eq(0), eq(1), any()); model = new ModelWithClickListener_(); model.onBind(listener1); controller.buildWithModel(model); verify(observerMock, times(1)).onItemRangeChanged(eq(0), eq(1), any()); }
@Test public void basicBuildModels() { AdapterDataObserver observer = mock(AdapterDataObserver.class); EpoxyController controller = new EpoxyController() { @Override protected void buildModels() { new TestModel() .addTo(this); } @Override protected void onExceptionSwallowed(RuntimeException exception) { noExceptionsDuringBasicBuildModels = false; } }; controller.getAdapter().registerAdapterDataObserver(observer); controller.requestModelBuild(); assertTrue(noExceptionsDuringBasicBuildModels); assertEquals(1, controller.getAdapter().getItemCount()); verify(observer).onItemRangeInserted(0, 1); verifyNoMoreInteractions(observer); }
@Test public void newUnbindListenerDoesNotChangHashCode() { TestController controller = new TestController(); AdapterDataObserver observerMock = mock(AdapterDataObserver.class); controller.getAdapter().registerAdapterDataObserver(observerMock); ModelWithClickListener_ model = new ModelWithClickListener_(); controller.buildWithModel(model); verify(observerMock).onItemRangeInserted(eq(0), eq(1)); model = new ModelWithClickListener_(); model.onUnbind(new UnbindListener()); controller.buildWithModel(model); model = new ModelWithClickListener_(); model.onUnbind(new UnbindListener()); controller.buildWithModel(model); verify(observerMock).onItemRangeChanged(eq(0), eq(1), any()); } }
@Test public void newBindListenerDoesNotChangeHashCode() { TestController controller = new TestController(); AdapterDataObserver observerMock = mock(AdapterDataObserver.class); controller.getAdapter().registerAdapterDataObserver(observerMock); ModelWithClickListener_ model = new ModelWithClickListener_(); controller.buildWithModel(model); verify(observerMock).onItemRangeInserted(eq(0), eq(1)); model = new ModelWithClickListener_(); model.onBind(new BindListener()); controller.buildWithModel(model); model = new ModelWithClickListener_(); model.onBind(new BindListener()); controller.buildWithModel(model); verify(observerMock).onItemRangeChanged(eq(0), eq(1), any()); }
@Test public void nullUnbindListenerChangesHashCode() { TestController controller = new TestController(); AdapterDataObserver observerMock = mock(AdapterDataObserver.class); controller.getAdapter().registerAdapterDataObserver(observerMock); ModelWithClickListener_ model = new ModelWithClickListener_(); controller.buildWithModel(model); verify(observerMock).onItemRangeInserted(eq(0), eq(1)); model = new ModelWithClickListener_(); model.onUnbind(new UnbindListener()); controller.buildWithModel(model); model = new ModelWithClickListener_(); model.onUnbind(null); controller.buildWithModel(model); verify(observerMock, times(2)).onItemRangeChanged(eq(0), eq(1), any()); }
@Test public void nullBindListenerChangesHashCode() { TestController controller = new TestController(); AdapterDataObserver observerMock = mock(AdapterDataObserver.class); controller.getAdapter().registerAdapterDataObserver(observerMock); ModelWithClickListener_ model = new ModelWithClickListener_(); controller.buildWithModel(model); verify(observerMock).onItemRangeInserted(eq(0), eq(1)); model = new ModelWithClickListener_(); model.onBind(new BindListener()); controller.buildWithModel(model); model = new ModelWithClickListener_(); model.onBind(null); controller.buildWithModel(model); verify(observerMock, times(2)).onItemRangeChanged(eq(0), eq(1), any()); }
@Test public void typesWithHashCodeAreDiffed() { SimpleEpoxyController controller = new SimpleEpoxyController(); AdapterDataObserver observerMock = mock(AdapterDataObserver.class); controller.getAdapter().registerAdapterDataObserver(observerMock); ModelWithDataBindingBindingModel_ firstModel = new ModelWithDataBindingBindingModel_() .stringValue("value1") .id(1); controller.setModels(Collections.singletonList(firstModel)); verify(observerMock).onItemRangeInserted(0, 1); ModelWithDataBindingBindingModel_ secondModel = new ModelWithDataBindingBindingModel_() .stringValue("value2") .id(1); controller.setModels(Collections.singletonList(secondModel)); verify(observerMock).onItemRangeChanged(eq(0), eq(1), any()); verifyNoMoreInteractions(observerMock); }
@Test public void singlePayload() { DiffHelper diffHelper = new DiffHelper(adapter, true); TestModel firstModel = new TestModel(); models.add(firstModel); diffHelper.notifyModelChanges(); verify(observer).onItemRangeInserted(0, 1); models.clear(); TestModel changedFirstModel = firstModel.clone().incrementValue(); this.models.add(changedFirstModel); diffHelper.notifyModelChanges(); verify(observer).onItemRangeChanged(eq(0), eq(1), argThat(new DiffPayloadMatcher(firstModel))); verifyNoMoreInteractions(observer); }
@Test() public void testInsertModelAfter() { TestModel firstModel = new TestModel(); testAdapter.addModels(firstModel); testAdapter.insertModelAfter(new TestModel(), firstModel); verify(observer).onItemRangeInserted(1, 1); assertEquals(2, testAdapter.models.size()); assertEquals(firstModel, testAdapter.models.get(0)); checkDifferState(); }
@Test public void testAddModelsVarArgs() { testAdapter.addModels(new TestModel(), new TestModel()); verify(observer).onItemRangeInserted(0, 2); assertEquals(2, testAdapter.models.size()); testAdapter.addModels(new TestModel(), new TestModel()); verify(observer).onItemRangeInserted(2, 2); assertEquals(4, testAdapter.models.size()); checkDifferState(); }
@Test public void testAddModel() { testAdapter.addModel(new TestModel()); verify(observer).onItemRangeInserted(0, 1); assertEquals(1, testAdapter.models.size()); testAdapter.addModel(new TestModel()); verify(observer).onItemRangeInserted(1, 1); assertEquals(2, testAdapter.models.size()); checkDifferState(); }
@Test() public void testInsertModelBefore() { TestModel firstModel = new TestModel(); testAdapter.addModels(firstModel); testAdapter.insertModelBefore(new TestModel(), firstModel); verify(observer, times(2)).onItemRangeInserted(0, 1); assertEquals(2, testAdapter.models.size()); assertEquals(firstModel, testAdapter.models.get(1)); checkDifferState(); }