package com.github.florent37.carpaccio.mapping;
import android.view.View;
import android.widget.TextView;
import com.github.florent37.carpaccio.Carpaccio;
import com.github.florent37.carpaccio.model.CarpaccioAction;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.Arrays;
import static org.junit.Assert.*;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
/**
* Created by florentchampigny on 24/07/15.
*/
public class MappingManagerTest {
@Mock MappingManager.MappingManagerCallback callback;
MappingManager mappingManager;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mappingManager = new MappingManager();
mappingManager.setMappingManagerCallback(callback);
}
@Test
public void testIsCallMapping() throws Exception {
String[] call = new String[]{"$user"};
assertTrue(MappingManager.isCallMapping(call));
}
@Test
public void testIsCallMapping_multiple() throws Exception {
String[] call = new String[]{"$user1","$user2"}; //only 1 mapping
assertFalse(MappingManager.isCallMapping(call));
}
@Test
public void testIsCallMapping_false() throws Exception {
String[] call = new String[]{"user1"};
assertFalse(MappingManager.isCallMapping(call));
}
@Test
public void testIsCallMapping_empty() throws Exception {
String[] call = new String[]{};
assertFalse(MappingManager.isCallMapping(call));
}
@Test
public void testGetFunctionName() throws Exception {
assertEquals("getName", MappingManager.getFunctionName("getName()"));
}
@Test
public void testGetFunctionName2() throws Exception {
assertEquals("getName", MappingManager.getFunctionName("name"));
}
public class User{
String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "nameToString";
}
}
public class Controller {
public void setText(TextView textView, String text) {
textView.setText(text);
}
}
@Test
public void testMapObject() throws Exception {
User user = new User("florent");
String name = "user";
CarpaccioAction carpaccioAction = new CarpaccioAction("setText($user.getName())");
View view = mock(View.class);
{
ArrayList list = new ArrayList();
list.add(new MappingWaiting(view,carpaccioAction,"user.getName()","user"));
mappingManager.mappingWaitings.put("user", list);
}
mappingManager.mapObject(name,user);
assertTrue(mappingManager.mappedObjects.containsKey(name));
assertEquals(user, mappingManager.mappedObjects.get(name));
verify(callback,atLeastOnce()).callActionOnView(eq(carpaccioAction), eq(view));
assertEquals("florent", carpaccioAction.getValues()[0]);
}
@Test
public void testMapObject2() throws Exception {
User user = new User("florent");
String name = "user";
View view = mock(View.class);
CarpaccioAction carpaccioAction = new CarpaccioAction("setText($user.name)");
{
ArrayList list = new ArrayList();
list.add(new MappingWaiting(view,carpaccioAction,"user.getName()","user"));
mappingManager.mappingWaitings.put("user", list);
}
mappingManager.mapObject(name, user);
assertTrue(mappingManager.mappedObjects.containsKey(name));
assertEquals(user, mappingManager.mappedObjects.get(name));
verify(callback,atLeastOnce()).callActionOnView(eq(carpaccioAction), eq(view));
assertEquals("florent", carpaccioAction.getValues()[0]);
}
@Test
public void testMapObject_noFunction() throws Exception {
User user = new User("florent");
String name = "user";
View view = mock(View.class);
CarpaccioAction carpaccioAction = new CarpaccioAction("setText($user)");
{
ArrayList list = new ArrayList();
list.add(new MappingWaiting(view,carpaccioAction,"user","user"));
mappingManager.mappingWaitings.put("user", list);
}
mappingManager.mapObject(name,user);
assertTrue(mappingManager.mappedObjects.containsKey(name));
assertEquals(user, mappingManager.mappedObjects.get(name));
verify(callback,atLeastOnce()).callActionOnView(eq(carpaccioAction), eq(view));
verify(callback,atLeastOnce()).callActionOnView(eq(carpaccioAction), eq(view));
assertEquals("nameToString", carpaccioAction.getValues()[0]);
}
@Test
public void testMapObject_fail() throws Exception {
User user = new User("florent");
String name = "user";
View view = mock(View.class);
CarpaccioAction carpaccioAction = new CarpaccioAction("setTexteu($user.getName())");
{
ArrayList list = new ArrayList();
list.add(new MappingWaiting(view,carpaccioAction,"setTexteu","user"));
mappingManager.mappingWaitings.put("user", list);
}
mappingManager.mapObject(name, user);
assertTrue(mappingManager.mappedObjects.containsKey(name));
assertEquals(user, mappingManager.mappedObjects.get(name));
verify(callback,atLeastOnce()).callActionOnView(eq(carpaccioAction), eq(view));
}
@Test
public void testCallMapping() throws Exception {
View view = mock(View.class);
CarpaccioAction carpaccioAction = new CarpaccioAction("setText($user)");
mappingManager.callMappingOnView(carpaccioAction,view,null);
assertTrue(mappingManager.mappingWaitings.containsKey("user"));
MappingWaiting addedWaiting = mappingManager.mappingWaitings.get("user").get(0);
assertNotNull(addedWaiting);
assertEquals("user", addedWaiting.objectName);
assertEquals("user", addedWaiting.call);
assertEquals(carpaccioAction, addedWaiting.carpaccioAction);
assertEquals(view, addedWaiting.view);
}
@Test
public void testCallMapping_withFunction() throws Exception {
View view = mock(View.class);
CarpaccioAction carpaccioAction = new CarpaccioAction("setText($user.getName())");
mappingManager.callMappingOnView(carpaccioAction,view,null);
assertTrue(mappingManager.mappingWaitings.containsKey("user"));
MappingWaiting addedWaiting = mappingManager.mappingWaitings.get("user").get(0);
assertNotNull(addedWaiting);
assertEquals("user", addedWaiting.objectName);
assertEquals("user.getName()", addedWaiting.call);
assertEquals(carpaccioAction, addedWaiting.carpaccioAction);
assertEquals(view, addedWaiting.view);
}
@Test
public void testGetMappingManagerCallback() throws Exception {
assertEquals(callback,mappingManager.getMappingManagerCallback());
}
@Test
public void testSetMappingManagerCallback() throws Exception {
mappingManager.setMappingManagerCallback(callback);
assertEquals(callback,mappingManager.mappingManagerCallback);
}
public class SubClassToEvaluate{
public String getUrl(){
return "www.MyImage";
}
public String toString(){
return "IamAnImage";
}
}
public class ObjectToEvaluate{
protected SubClassToEvaluate image = new SubClassToEvaluate();
public String toString(){
return "ThisIsMyToString";
}
public String getName(){
return "florent";
}
public int getCount(){
return 3;
}
public SubClassToEvaluate getImage() {
return image;
}
}
@Test
public void testEvaluateExpression(){
ObjectToEvaluate object = new ObjectToEvaluate();
String value = mappingManager.evaluate(object, "object.getName()");
assertEquals("florent",value);
}
@Test
public void testEvaluateExpression_reduce(){
ObjectToEvaluate object = new ObjectToEvaluate();
String value = mappingManager.evaluate(object, "object.name");
assertEquals("florent",value);
}
@Test
public void testEvaluateExpression_toString(){
ObjectToEvaluate object = new ObjectToEvaluate();
String value = mappingManager.evaluate(object,"object");
assertEquals("ThisIsMyToString",value);
}
@Test
public void testEvaluateExpression_multiple_toString(){
ObjectToEvaluate object = new ObjectToEvaluate();
String value = mappingManager.evaluate(object, "object.image");
assertEquals("IamAnImage",value);
}
@Test
public void testEvaluateExpression_multiple_value(){
ObjectToEvaluate object = new ObjectToEvaluate();
String value = mappingManager.evaluate(object, "object.image.getUrl()");
assertEquals("www.MyImage",value);
}
@Test
public void testEvaluateExpression_int(){
ObjectToEvaluate object = new ObjectToEvaluate();
String value = mappingManager.evaluate(object, "object.count");
assertEquals("3",value);
}
}