/*
* Copyright 2015 Rayco AraƱa
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.raycoarana.baindo.renderer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.raycoarana.baindo.BinderDelegate;
import com.raycoarana.baindo.UnbindableCollector;
import com.raycoarana.baindo.UnbindableCollectorProvider;
import com.raycoarana.baindo.test.UnitTestSuite;
import org.junit.Test;
import org.mockito.Mock;
import static junit.framework.Assert.assertTrue;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class BinderRendererTest extends UnitTestSuite {
private static final int SOME_VIEW_ID = 42;
private static final Object SOME_CONTENT = new Object();
@Mock
private UnbindableCollector mFirstUnbindableCollector;
@Mock
private UnbindableCollector mSecondUnbindableCollector;
@Mock
private UnbindableCollectorProvider mUnbindableCollectorProvider;
@Mock
private BinderDelegate mBinderDelegate;
@Mock
private View mView;
@Mock
private LayoutInflater mLayoutInflater;
@Mock
private ViewGroup mViewGroup;
private BinderRenderer mBinderRenderer;
private Object mBinderRendererClone;
@Test
public void shouldUnbindOnRecycle() {
givenAnUnbindableCollectorProvider();
givenABinderRenderer();
whenRecycle();
thenRendererIsUnbinded();
}
@Test
public void shouldCreateClone() throws CloneNotSupportedException {
givenAnUnbindableCollectorProvider();
givenABinderRenderer();
whenClone();
thenCloneWithNewUnbindableCollectorIsCreated();
}
@Test
public void shouldFindViewsInRendererView() {
givenAnUnbindableCollectorProvider();
givenABinderRenderer();
whenFindView();
thenViewsAreFoundAtRendererView();
}
@Test
public void shouldBindViewsWhenRender() {
givenAnUnbindableCollectorProvider();
givenABinderRenderer();
whenRender();
thenViewsAreBinded();
}
private void givenAnUnbindableCollectorProvider() {
when(mUnbindableCollectorProvider.get()).thenReturn(mFirstUnbindableCollector,
mSecondUnbindableCollector);
}
private void givenABinderRenderer() {
mBinderRenderer = new BinderRenderer();
mBinderRenderer.injectUnbindableCollectorProvider(mUnbindableCollectorProvider);
mBinderRenderer.injectDelegate(mBinderDelegate);
mBinderRenderer.onCreate(SOME_CONTENT, mLayoutInflater, mViewGroup);
}
private void whenRecycle() {
mBinderRenderer.onRecycle(null);
}
private void whenRender() {
mBinderRenderer.render();
}
private void whenClone() throws CloneNotSupportedException {
mBinderRendererClone = mBinderRenderer.clone();
}
private void whenFindView() {
mBinderRenderer.findViewById(SOME_VIEW_ID);
}
private void thenRendererIsUnbinded() {
verify(mFirstUnbindableCollector).unbindAndReleaseAll();
}
private void thenCloneWithNewUnbindableCollectorIsCreated() {
assertTrue(mBinderRendererClone instanceof com.raycoarana.baindo.renderer.BinderRenderer);
((com.raycoarana.baindo.renderer.BinderRenderer) mBinderRendererClone).unbind();
verify(mSecondUnbindableCollector).unbindAndReleaseAll();
}
private void thenViewsAreBinded() {
verify(mBinderDelegate).bind(mBinderRenderer, mFirstUnbindableCollector);
}
@SuppressWarnings("ResourceType")
private void thenViewsAreFoundAtRendererView() {
verify(mView).findViewById(SOME_VIEW_ID);
}
private class BinderRenderer extends com.raycoarana.baindo.renderer.BinderRenderer<Object> {
@Override
protected void bindViews() {
bind();
}
@Override
protected View inflate(LayoutInflater inflater, ViewGroup parent) {
return mView;
}
}
}