package de.jpaw.bonaparte.core.tests;
import java.util.HashMap;
import java.util.Map;
import org.testng.Assert;
import org.testng.annotations.Test;
import de.jpaw.bonaparte.core.BonaPortable;
import de.jpaw.bonaparte.core.MapParser;
import de.jpaw.bonaparte.core.MimeTypes;
import de.jpaw.bonaparte.core.StaticMeta;
import de.jpaw.bonaparte.util.ToStringHelper;
import de.jpaw.json.JsonParser;
public class MapToBonaPortableTest {
/** Demonstrates how a JSON String can be converted back to a BonaPortable. This is effectively a 2 step process. */
@Test
public void testJsonToBonaPortable() throws Exception {
String json = "{ \"" + MimeTypes.JSON_FIELD_PQON + "\": \"meta.ParsedFoldingComponent\", \"fieldname\":\"foo\" , \"index\": 42 }";
Map<String,Object> testMap = new JsonParser(json, false).parseObject();
BonaPortable test = MapParser.asBonaPortable(testMap, StaticMeta.OUTER_BONAPORTABLE);
Assert.assertNotNull(test);
Assert.assertEquals(test.getClass().getSimpleName(), "ParsedFoldingComponent");
Assert.assertEquals(testMap.get("fieldname"), "foo");
Assert.assertEquals(testMap.get("index"), Integer.valueOf(42));
}
private void testNumber(Map<String,Object> testMap, String expected) {
Assert.assertEquals(testMap.get("i").getClass().getSimpleName(), "Integer");
Assert.assertEquals(testMap.get("l").getClass().getSimpleName(), "Long");
Assert.assertEquals(testMap.get("d").getClass().getSimpleName(), expected);
}
/** Demonstrates how the parser converts numeric types, with choice on fractional numbers. */
@Test
public void testJsonToNumber() throws Exception {
String json = "{ \"i\": -565656, \"l\": 62626262628818818, \"d\":3.14 }";
testNumber(new JsonParser(json, false).parseObject(), "BigDecimal");
testNumber(new JsonParser(json, true).parseObject(), "Double");
}
/** Demonstrates how a Map (parsed JSON) can be converted back to a BonaPortable. */
@Test
public void testMapToBonaPortable() throws Exception {
Map<String,Object> testMap = new HashMap<String,Object>(10);
testMap.put(MimeTypes.JSON_FIELD_PQON, "meta.ParsedFoldingComponent");
testMap.put("fieldname", "foo");
testMap.put("index", "42"); // show that converter also maps Strings to Integer where required!
BonaPortable test = MapParser.asBonaPortable(testMap, StaticMeta.OUTER_BONAPORTABLE);
Assert.assertNotNull(test);
Assert.assertEquals(test.getClass().getSimpleName(), "ParsedFoldingComponent");
}
/** Demonstrates how a nested Map (parsed JSON) can be converted back to a BonaPortable. */
@Test
public void testMapsToBonaPortable() throws Exception {
Map<String,Object> testMap = new HashMap<String,Object>(10);
Map<String,Object> testMap2 = new HashMap<String,Object>(10);
testMap2.put(MimeTypes.JSON_FIELD_PQON, "meta.ParsedFoldingComponent");
testMap2.put("fieldname", "bar");
testMap2.put("index", 999);
testMap.put(MimeTypes.JSON_FIELD_PQON, "meta.ParsedFoldingComponent");
testMap.put("fieldname", "foo");
testMap.put("index", 42);
testMap.put("alphaIndex", "EUR");
// testMap.put("component", testMap2); // fails due to self-reference (cyclic static initialization problem: meta$$component.lowerBound is null)
System.out.println(ToStringHelper.toStringML(testMap));
BonaPortable test = MapParser.asBonaPortable(testMap, StaticMeta.OUTER_BONAPORTABLE);
Assert.assertNotNull(test);
Assert.assertEquals(test.getClass().getSimpleName(), "ParsedFoldingComponent");
System.out.println(ToStringHelper.toStringML(test));
}
}