package org.skyscreamer.yoga.mapper;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.skyscreamer.yoga.configuration.DefaultEntityConfigurationRegistry;
import org.skyscreamer.yoga.configuration.EntityConfigurationRegistry;
import org.skyscreamer.yoga.model.ObjectMapHierarchicalModelImpl;
import org.skyscreamer.yoga.selector.CompositeSelector;
import org.skyscreamer.yoga.selector.FieldSelector;
import org.skyscreamer.yoga.selector.SelectorResolver;
import org.skyscreamer.yoga.test.model.basic.BasicTestDataLeaf;
import org.skyscreamer.yoga.test.model.basic.BasicTestDataNode;
import org.skyscreamer.yoga.test.model.basic.LeafConfiguration;
import org.skyscreamer.yoga.test.util.DummyHttpServletRequest;
import org.skyscreamer.yoga.test.util.DummyHttpServletResponse;
public class ResultTraverserTest
{
ResultTraverser resultTraverser = new ResultTraverser();
EntityConfigurationRegistry registry = new DefaultEntityConfigurationRegistry();
YogaRequestContext requestContext;
SelectorResolver resolver = new SelectorResolver();
@Before
public void setup()
{
registry.register( new LeafConfiguration() );
resolver.setEntityConfigurationRegistry( registry );
requestContext = new YogaRequestContext( "map", resolver , new DummyHttpServletRequest(),
new DummyHttpServletResponse() );
}
@Test
public void testBasicSelector() throws IOException
{
BasicTestDataLeaf input = new BasicTestDataLeaf();
ObjectMapHierarchicalModelImpl model = new ObjectMapHierarchicalModelImpl();
resultTraverser.traverse( input, resolver.getBaseSelector(), model, requestContext );
Map<String, Object> objectTree = model.getUnderlyingModel();
Assert.assertEquals( 0, objectTree.get( "id" ) );
}
@Test
public void testBasicFieldSelector() throws IOException
{
BasicTestDataLeaf input = new BasicTestDataLeaf();
input.setOther( "someValue" );
ObjectMapHierarchicalModelImpl model = new ObjectMapHierarchicalModelImpl();
resultTraverser.traverse( input, resolver.resolveSelector( "other" ), model, requestContext );
Map<String, Object> objectTree = model.getUnderlyingModel();
Assert.assertEquals( "someValue", objectTree.get( "other" ) );
}
@Test
public void testStarFieldSelector() throws IOException
{
resolver.setStarResolvesToAll( true );
BasicTestDataLeaf input = new BasicTestDataLeaf();
input.setOther( "someValue" );
ObjectMapHierarchicalModelImpl model = new ObjectMapHierarchicalModelImpl();
resultTraverser.traverse( input, resolver.resolveSelector( "*" ), model, requestContext );
Map<String, Object> objectTree = model.getUnderlyingModel();
Assert.assertEquals( "someValue", objectTree.get( "other" ) );
Assert.assertEquals( 0, objectTree.get( "id" ) );
Assert.assertEquals( "customValue", objectTree.get( "someField" ) );
}
@Test
public void testBasicListField() throws IOException
{
BasicTestDataLeaf input = new BasicTestDataLeaf();
List<String> list = Arrays.asList( "someValue", "aSecondValue" );
input.setRandomStrings( list );
ObjectMapHierarchicalModelImpl model = new ObjectMapHierarchicalModelImpl();
FieldSelector selector = new FieldSelector();
selector.register( "randomStrings", new FieldSelector() );
resultTraverser.traverse( input, new CompositeSelector( resolver.getBaseSelector(), selector ), model, requestContext );
Map<String, Object> objectTree = model.getUnderlyingModel();
Assert.assertEquals( list, objectTree.get( "randomStrings" ) );
}
@Test
public void testBasicMapField() throws IOException
{
HashMap<Object,Object> map = new HashMap<Object, Object>();
map.put("someKey", "someValue");
map.put("anotherKey", "anotherValue");
BasicTestDataLeaf input = new BasicTestDataLeaf();
input.setId(10);
input.setName("name");
input.setOther("other");
map.put("aThirdKey", input);
ObjectMapHierarchicalModelImpl model = new ObjectMapHierarchicalModelImpl();
FieldSelector selector = new FieldSelector();
selector.register( "anotherKey", new FieldSelector() );
selector.register( "aThirdKey", new FieldSelector() );
resultTraverser.traverse( map, new CompositeSelector( resolver.getBaseSelector(), selector ), model, requestContext );
Map<String, Object> objectTree = model.getUnderlyingModel();
// "someKey" should not be selected from map
Assert.assertEquals( null, objectTree.get( "someKey" ) );
// "anotherKey" should be selected from map and has primitive value
Assert.assertEquals( "anotherValue", objectTree.get( "anotherKey" ) );
// "aThirdKey" should be selected but only @Core fields of pojo
Map<?,?> actualPojo = (Map<?,?>) objectTree.get("aThirdKey");
Assert.assertEquals( input.getId(), actualPojo.get("id"));
Assert.assertEquals( input.getName(), actualPojo.get("name"));
Assert.assertEquals(null, actualPojo.get("other"));
}
@Test
public void testNullValuesInList() throws IOException {
BasicTestDataLeaf input = new BasicTestDataLeaf();
List<String> list = Arrays.asList( "someValue", null, "aThirdValue" );
input.setRandomStrings( list );
ObjectMapHierarchicalModelImpl model = new ObjectMapHierarchicalModelImpl();
FieldSelector selector = new FieldSelector();
selector.register( "randomStrings", new FieldSelector() );
resultTraverser.traverse( input, new CompositeSelector( resolver.getBaseSelector(), selector ), model, requestContext );
Map<String, Object> objectTree = model.getUnderlyingModel();
Assert.assertEquals( list, objectTree.get( "randomStrings" ) );
}
@Test
public void testBasicCombinedSelctor() throws IOException
{
BasicTestDataLeaf input = new BasicTestDataLeaf();
input.setOther( "someValue" );
ObjectMapHierarchicalModelImpl model = new ObjectMapHierarchicalModelImpl();
FieldSelector fieldSelector = new FieldSelector();
fieldSelector.register( "other", new FieldSelector() );
CompositeSelector selector = new CompositeSelector( resolver.getBaseSelector(), fieldSelector );
resultTraverser.traverse( input, selector, model, requestContext );
Map<String, Object> objectTree = model.getUnderlyingModel();
Assert.assertEquals( 0, objectTree.get( "id" ) );
Assert.assertEquals( "someValue", objectTree.get( "other" ) );
}
@SuppressWarnings("unchecked")
@Test
public void testNodeCombinedSelector() throws IOException
{
BasicTestDataNode input = new BasicTestDataNode();
input.setLeaf( new BasicTestDataLeaf() );
input.setId( "fooId" );
FieldSelector fieldSelector = new FieldSelector();
fieldSelector.register( "leaf", new FieldSelector() );
CompositeSelector selector = new CompositeSelector( resolver.getBaseSelector(), fieldSelector );
ObjectMapHierarchicalModelImpl model = new ObjectMapHierarchicalModelImpl();
resultTraverser.traverse( input, selector, model, requestContext );
Map<String, Object> objectTree = model.getUnderlyingModel();
Assert.assertEquals( "fooId", objectTree.get( "id" ) );
Map<String, Object> childTree = (Map<String, Object>) objectTree.get( "leaf" );
Assert.assertEquals( 0, childTree.get( "id" ) );
}
@Test
public void testConfiguration() throws IOException
{
BasicTestDataLeaf input = new BasicTestDataLeaf();
ObjectMapHierarchicalModelImpl model = new ObjectMapHierarchicalModelImpl();
FieldSelector fieldSelector = new FieldSelector();
fieldSelector.register( "someField", new FieldSelector() );
resultTraverser.traverse( input, new CompositeSelector( resolver.getBaseSelector(), fieldSelector ), model, requestContext );
Map<String, Object> objectTree = model.getUnderlyingModel();
Assert.assertEquals( "customValue", objectTree.get( "someField" ) );
}
}