package com.github.florent37.carpaccio;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.github.florent37.carpaccio.mapping.MappingManager;
import com.github.florent37.carpaccio.model.CarpaccioAction;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
/**
* Created by florentchampigny on 24/07/15.
*/
public class CarpaccioManagerTest {
@Mock
MappingManager mappingManager;
CarpaccioManager carpaccioManager;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
CarpaccioLogger.ENABLE_LOG = false;
Carpaccio.IN_EDIT_MODE = false;
carpaccioManager = new CarpaccioManager(mappingManager);
}
@Test
public void testAddView() throws Exception {
View view = mock(View.class);
doReturn("setColor()").when(view).getTag();
carpaccioManager.addView(view);
assertTrue(carpaccioManager.carpaccioViews.contains(view));
}
@Test
public void testAddViewMultiple() throws Exception {
View view = mock(View.class);
carpaccioManager.addView(view);
assertTrue(carpaccioManager.carpaccioViews.contains(view));
}
@Test
public void testIsCarpaccioControlledView() throws Exception {
View view = mock(View.class);
doReturn("setColor()").when(view).getTag();
assertTrue(carpaccioManager.isCarpaccioControlledView(view));
}
@Test
public void testIsCarpaccioControlledView_textView() throws Exception {
TextView view = mock(TextView.class);
doReturn("$user.getName()").when(view).getText();
assertTrue(carpaccioManager.isCarpaccioControlledView(view));
}
@Test
public void testIsCarpaccioControlledView_column() throws Exception {
View view = mock(View.class);
doReturn("setColor();").when(view).getTag();
assertTrue(carpaccioManager.isCarpaccioControlledView(view));
}
@Test
public void testIsCarpaccioControlledView_multiple() throws Exception {
View view = mock(View.class);
doReturn("setColor();setText();").when(view).getTag();
assertTrue(carpaccioManager.isCarpaccioControlledView(view));
}
@Test
public void testIsCarpaccioControlledView_false() throws Exception {
View view = mock(View.class);
doReturn("setColor").when(view).getTag();
assertFalse(carpaccioManager.isCarpaccioControlledView(view));
}
@Test
public void testIsCarpaccioControlledView_false_emptyTag() throws Exception {
View view = mock(View.class);
doReturn(null).when(view).getTag();
assertFalse(carpaccioManager.isCarpaccioControlledView(view));
}
@Test
public void testRegisterController() throws Exception {
Object controller = mock(Object.class);
carpaccioManager.registerController(controller);
assertTrue(carpaccioManager.registerControllers.contains(controller));
}
@Test
public void testRegisterControllers() throws Exception {
assertTrue(carpaccioManager.registerControllers.isEmpty());
carpaccioManager.registerControllers(null,"java.util.ArrayList");
assertFalse(carpaccioManager.registerControllers.isEmpty());
assertTrue(carpaccioManager.registerControllers.get(0) instanceof java.util.ArrayList);
}
@Test
public void testRegisterControllers_multiple() throws Exception {
assertTrue(carpaccioManager.registerControllers.isEmpty());
carpaccioManager.registerControllers(null,"java.util.ArrayList;java.util.HashMap;");
assertFalse(carpaccioManager.registerControllers.isEmpty());
assertTrue(carpaccioManager.registerControllers.get(0) instanceof java.util.ArrayList);
assertTrue(carpaccioManager.registerControllers.get(1) instanceof java.util.HashMap);
}
@Test
public void testRegisterControllers_fail() throws Exception {
assertTrue(carpaccioManager.registerControllers.isEmpty());
carpaccioManager.registerControllers(null,"java.ttttttiiillll.ArrayList");
assertTrue(carpaccioManager.registerControllers.isEmpty());
}
@Test
public void testRegisterControllers_fail_multiple() throws Exception {
assertTrue(carpaccioManager.registerControllers.isEmpty());
carpaccioManager.registerControllers(null,"java.ttttttiiillll.ArrayList;java.util.HashMap;");
assertFalse(carpaccioManager.registerControllers.isEmpty());
assertTrue(carpaccioManager.registerControllers.get(0) instanceof java.util.HashMap);
}
@Test
public void testRegisterControllers_multiple_whiteSpace() throws Exception {
assertTrue(carpaccioManager.registerControllers.isEmpty());
carpaccioManager.registerControllers(null," java.util.ArrayList; \n java.util.HashMap; \n ");
assertFalse(carpaccioManager.registerControllers.isEmpty());
assertTrue(carpaccioManager.registerControllers.get(0) instanceof java.util.ArrayList);
assertTrue(carpaccioManager.registerControllers.get(1) instanceof java.util.HashMap);
}
@Test
public void testRegisterControllers_multiple_commaSeparator() throws Exception {
assertTrue(carpaccioManager.registerControllers.isEmpty());
carpaccioManager.registerControllers(null,"java.util.ArrayList;java.util.HashMap");
assertFalse(carpaccioManager.registerControllers.isEmpty());
assertTrue(carpaccioManager.registerControllers.get(0) instanceof java.util.ArrayList);
assertTrue(carpaccioManager.registerControllers.get(1) instanceof java.util.HashMap);
}
public class Controller {
public void setText(TextView textView, String text) {
textView.setText(text);
}
public void setColor(View view, int color) {
}
}
@Test
public void testExecuteActionsOnViews() throws Exception {
Controller controller = spy(new Controller());
TextView textView = mock(TextView.class);
doReturn("setText(florent)").when(textView).getTag();
doReturn("setText(florent)").when(textView).getTag();
carpaccioManager.carpaccioViews.add(textView);
carpaccioManager.registerControllers.add(controller);
carpaccioManager.executeActionsOnViews();
verify(controller, atLeastOnce()).setText(eq(textView), eq("florent"));
verify(textView, atLeastOnce()).setText(eq("florent"));
}
Object tmpTag;
@Test
public void testExecuteActionsOnViews_text() throws Exception {
Controller controller = spy(new Controller());
TextView textView = mock(TextView.class);
doReturn("$user.name").when(textView).getText();
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
tmpTag = invocation.getArguments()[0];
return null;
}
}).when(textView).setTag(any());
carpaccioManager.carpaccioViews.add(textView);
carpaccioManager.registerControllers.add(controller);
carpaccioManager.executeActionsOnViews();
assertNotNull(tmpTag);
}
@Test
public void testExecuteActionsOnViews_text_tagString() throws Exception {
Controller controller = spy(new Controller());
TextView textView = mock(TextView.class);
doReturn("$user.name").when(textView).getText();
doReturn("setFont(font)").when(textView).getTag();
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
tmpTag = invocation.getArguments()[0];
return null;
}
}).when(textView).setTag(any());
carpaccioManager.carpaccioViews.add(textView);
carpaccioManager.registerControllers.add(controller);
carpaccioManager.executeActionsOnViews();
assertEquals("setFont(font);setText($user.name)", tmpTag);
}
@Test
public void testExecuteActionsOnViews_text_tagList() throws Exception {
Controller controller = spy(new Controller());
TextView textView = mock(TextView.class);
doReturn("$user.name").when(textView).getText();
List<CarpaccioAction> actions = new ArrayList<>();
actions.add(new CarpaccioAction("setFont(font)"));
doReturn(actions).when(textView).getTag();
carpaccioManager.carpaccioViews.add(textView);
carpaccioManager.registerControllers.add(controller);
carpaccioManager.executeActionsOnViews();
List<CarpaccioAction> expected = new ArrayList<>();
expected.add(new CarpaccioAction("setFont(font)"));
expected.add(new CarpaccioAction("setText($user.name)"));
assertEquals(expected,textView.getTag());
}
@Test
public void testExecuteActionsOnView() throws Exception {
Controller controller = spy(new Controller());
TextView textView = mock(TextView.class);
doReturn("setColor(1)").when(textView).getTag();
carpaccioManager.carpaccioViews.add(textView);
carpaccioManager.registerControllers.add(controller);
carpaccioManager.executeActionsOnView(textView);
verify(controller, atLeastOnce()).setColor(eq(textView), eq(1));
}
@Test
public void testExecuteActionsOnView_mapping() throws Exception {
Controller controller = spy(new Controller());
TextView textView = mock(TextView.class);
doReturn("setText($user.name)").when(textView).getTag();
doNothing().when(mappingManager).callMappingOnView(any(CarpaccioAction.class),any(View.class),anyObject());
carpaccioManager.carpaccioViews.add(textView);
carpaccioManager.registerControllers.add(controller);
carpaccioManager.executeActionsOnView(textView);
verify(mappingManager, atLeastOnce()).callMappingOnView(any(CarpaccioAction.class), any(View.class), anyObject());
verify(controller, never()).setText(eq(textView), anyString());
}
@Test
public void testExecuteActionsOnView_mapping_EDIT_MODE() throws Exception {
Controller controller = spy(new Controller());
Carpaccio.IN_EDIT_MODE = true;
TextView textView = mock(TextView.class);
doReturn("setText($user.name)").when(textView).getTag();
doNothing().when(mappingManager).callMappingOnView(any(CarpaccioAction.class), any(View.class), anyObject());
carpaccioManager.carpaccioViews.add(textView);
carpaccioManager.registerControllers.add(controller);
carpaccioManager.executeActionsOnView(textView);
verify(controller, atLeastOnce()).setText(eq(textView), eq("$user.name"));
}
@Test
public void testExecuteActionsOnView_list() throws Exception {
Controller controller = spy(new Controller());
TextView textView = mock(TextView.class);
List<CarpaccioAction> carpaccioActionList = new ArrayList<>();
carpaccioActionList.add(new CarpaccioAction("setText(florent)"));
doReturn(carpaccioActionList).when(textView).getTag();
carpaccioManager.carpaccioViews.add(textView);
carpaccioManager.registerControllers.add(controller);
carpaccioManager.executeActionsOnView(textView);
verify(controller, atLeastOnce()).setText(eq(textView), eq("florent"));
}
@Test
public void testExecuteActionsOnViews2() throws Exception {
Controller controller = spy(new Controller());
TextView textView = mock(TextView.class);
doReturn("setFont(florent)").when(textView).getTag();
carpaccioManager.carpaccioViews.add(textView);
carpaccioManager.registerControllers.add(controller);
carpaccioManager.executeActionsOnViews();
verify(controller, never()).setText(eq(textView), eq("florent"));
verify(textView, never()).setText(eq("florent"));
}
@Test
public void testMapObject() throws Exception {
String name = "name";
Object object = new Object();
carpaccioManager.mapObject(name, object);
verify(carpaccioManager.mappingManager, atLeastOnce()).mapObject(eq(name), eq(object));
}
@Test
public void testMapList() throws Exception {
List list = new ArrayList();
RecyclerView.Adapter adapter = mock(RecyclerView.Adapter.class);
carpaccioManager.registerAdapters.put("users", adapter);
try {
carpaccioManager.mapList("users", list);
}catch (Exception e){
//adapter.notifyDataSetChanged() throws exception on tests
}
verify(mappingManager).mapList(eq("users"), eq(list));
}
@Test
public void testGetMappedList() throws Exception {
carpaccioManager.getMappedList("users");
verify(mappingManager).getMappedList(eq("users"));
}
@Test
public void testGetMappedList_null() throws Exception {
carpaccioManager.mappingManager = null;
verify(mappingManager,never()).getMappedList(eq("users"));
}
@Test
public void testRegisterAdapter() throws Exception {
RecyclerView.Adapter adapter = mock(RecyclerView.Adapter.class);
carpaccioManager.registerAdapter("users", adapter);
assertEquals(adapter, carpaccioManager.registerAdapters.get("users"));
}
@Test
public void findCarpaccioControlledViews() throws Exception {
View view = mock(View.class);
doReturn("setText(florent)").when(view).getTag();
carpaccioManager.findCarpaccioControlledViews(view);
assertTrue(carpaccioManager.carpaccioViews.contains(view));
}
@Test
public void findCarpaccioControlledViews_viewGroup() throws Exception {
ViewGroup viewGroup = mock(ViewGroup.class);
doReturn(1).when(viewGroup).getChildCount();
View view = mock(View.class);
doReturn(view).when(viewGroup).getChildAt(0);
doReturn("setText(florent)").when(view).getTag();
carpaccioManager.findCarpaccioControlledViews(viewGroup);
assertTrue(carpaccioManager.carpaccioViews.contains(view));
assertFalse(carpaccioManager.carpaccioViews.contains(viewGroup));
}
@Test
public void testAddChildViews() throws Exception {
ViewGroup viewGroup = mock(ViewGroup.class);
doReturn(1).when(viewGroup).getChildCount();
View view = mock(View.class);
doReturn(view).when(viewGroup).getChildAt(0);
doReturn("setText(florent)").when(view).getTag();
carpaccioManager.addChildViews(viewGroup);
assertTrue(carpaccioManager.carpaccioSubViews.get(viewGroup).contains(view));
}
@Test
public void testBindViews() throws Exception {
ViewGroup viewGroup = mock(ViewGroup.class);
View view = mock(View.class);
doReturn(new Object()).when(mappingManager).getMappedListsObject("users",0);
carpaccioManager.carpaccioSubViews.put(viewGroup, Arrays.asList(view));
carpaccioManager.bindView(viewGroup, "users", 0);
verify(mappingManager, atLeastOnce()).getMappedListsObject(eq("users"), eq(0));
verify(view,atLeastOnce()).getTag();
}
}