package pl.matisoft.soy.data; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; import org.junit.Test; import com.google.common.base.Optional; import com.google.template.soy.data.SoyData; import com.google.template.soy.data.SoyMapData; public class DefaultToSoyDataConverterTest { private final DefaultToSoyDataConverter objectToSoyDataConverter = new DefaultToSoyDataConverter(); private final String key = "key"; private final String keyValue = "keyValue"; private enum MyEnum { A, B, C } @Test public void testToSoyMapWhenNoModel() throws Exception { Optional<SoyMapData> soyData = objectToSoyDataConverter.toSoyMap(null); assertFalse(soyData.isPresent()); } @Test public void testToSoyMapWhenModelIsPresent() throws Exception { Map<String, String> model = new HashMap<String, String>(); model.put(key, keyValue); Optional<SoyMapData> soyData = objectToSoyDataConverter.toSoyMap(model); assertTrue(soyData.isPresent()); SoyMapData data = soyData.get(); assertEquals(keyValue, data.get(key).stringValue()); } @Test(expected = IllegalArgumentException.class) public void testToSoyCompatibleMapWhenNotMap() throws Exception { String test = "won't work"; objectToSoyDataConverter.toSoyCompatibleMap(test); } @Test public void testToSoyCompatibleObjectsWhenObjectIsNull() throws Exception { Object testObject = objectToSoyDataConverter .toSoyCompatibleObjects(null); assertNull(testObject); } @Test public void testToSoyCompatibleObjectsWhenObjectIsString() throws Exception { String testInput = "test"; Object testObject = objectToSoyDataConverter .toSoyCompatibleObjects(testInput); assertEquals("test", testObject.toString()); } @Test public void testToSoyCompatibleObjectsWhenObjectIsEnum() throws Exception { MyEnum testInput = MyEnum.A; Object testObject = objectToSoyDataConverter .toSoyCompatibleObjects(testInput); assertEquals("A", testObject.toString()); } @Test public void testToSoyCompatibleObjectsWhenObjectIsWrapperType() throws Exception { Integer testInput = 42; Object testObject = objectToSoyDataConverter .toSoyCompatibleObjects(testInput); assertTrue(testObject instanceof Integer); assertEquals(testInput, (Integer) testObject); } @Test public void testToSoyCompatibleObjectsWhenObjectIsIterable() throws Exception { List<String> testInput = new ArrayList<String>(); testInput.add("test"); Object testObject = objectToSoyDataConverter .toSoyCompatibleObjects(testInput); assertTrue(testObject instanceof Iterable<?>); @SuppressWarnings("unchecked") List<String> actual = (List<String>) testObject; assertEquals(1, actual.size()); assertEquals("test", actual.get(0)); } @Test public void testToSoyCompatibleObjectsWhenObjectIsArray() throws Exception { String[] testInput = new String[] { "test" }; Object testObject = objectToSoyDataConverter .toSoyCompatibleObjects(testInput); assertTrue(testObject.getClass().isArray()); String[] actual = (String[]) testObject; assertEquals(1, actual.length); assertEquals("test", actual[0]); } @SuppressWarnings("unchecked") @Test public void testToSoyCompatibleObjectsWhenObjectIsPojo() throws Exception { PojoTest testInput = new PojoTest(); Object testObject = objectToSoyDataConverter .toSoyCompatibleObjects(testInput); assertTrue(testObject instanceof Map); assertEquals("test", ((Map<String, String>) testObject).get("name")); } @Test public void testObjectToSoyDataMapWhenObjectIsNull() throws Exception { SoyMapData testObject = objectToSoyDataConverter .objectToSoyDataMap(null); assertTrue(testObject instanceof SoyMapData); } @Test public void testObjectToSoyDataMapWhenObjectIsSoyMapData() throws Exception { SoyMapData testInput = new SoyMapData(); testInput.putSingle(key, SoyData.createFromExistingData(keyValue)); SoyMapData testObject = objectToSoyDataConverter .objectToSoyDataMap(testInput); assertTrue(testObject instanceof SoyMapData); assertEquals(keyValue, ((SoyMapData) testObject).get(key).stringValue()); } @Test public void testObjectToSoyDataMapWhenObjectIsMap() throws Exception { Map<String, String> testInput = new HashMap<String, String>(); testInput.put(key, keyValue); SoyMapData testObject = objectToSoyDataConverter .objectToSoyDataMap(testInput); assertTrue(testObject instanceof SoyMapData); assertEquals(keyValue, ((SoyMapData) testObject).get(key).stringValue()); } @Test public void testObjectToSoyDataMapWhenObjectIsCallable() throws Exception { Callable<String> testInput = new Callable<String>() { @Override public String call() throws Exception { return "test"; } }; Object testObject = objectToSoyDataConverter .toSoyCompatibleObjects(testInput); assertEquals("test", testObject.toString()); } private static class PojoTest { String name = "test"; @SuppressWarnings("unused") public String getName() { return name; } @SuppressWarnings("unused") public void setName(String name) { this.name = name; } } }