package test.beast.util; import java.io.File; import java.io.FileWriter; import java.util.ArrayList; import java.util.List; import org.junit.Test; import beast.app.beauti.BeautiDoc; import beast.core.BEASTInterface; import beast.core.BEASTObject; import beast.core.parameter.RealParameter; import beast.evolution.alignment.Taxon; import beast.util.JSONParser; import beast.util.JSONProducer; import junit.framework.TestCase; public class JSONTest extends TestCase { public static String JSON_FILE = "examples/testUCLNclock.json"; @Test public void testJSONtoXMLtoJSON() throws Exception { JSONParser parser = new JSONParser(); BEASTObject beastObject = parser.parseFile(new File(JSON_FILE)); JSONProducer producer = new JSONProducer(); String actual = producer.toJSON(beastObject).trim();//.replaceAll("\\s+", " "); String expected = BeautiDoc.load(JSON_FILE).trim();//.replaceAll("\\s+", " "); assertEquals("Produced JSON differs from original", expected, actual); } @Test public void testJSONFragmentParsing() throws Exception { JSONParser parser = new JSONParser(); String json = "{version: \"2.4\",\n" + "\n" + "beast: [\n" + "{spec:\"beast.core.parameter.RealParameter\",\n" + " value:\"2.345\"\n" + "}\n" + "]\n" + "}\n"; ; List<Object> objects = parser.parseFragment(json, true); assertEquals(1, objects.size()); RealParameter p = (RealParameter) objects.get(0); assertEquals(2.345, p.getValue(), 1e-13); } @Test public void testAnnotatedConstructor() throws Exception { List<Taxon> taxa = new ArrayList<>(); taxa.add(new Taxon("first one")); taxa.add(new Taxon("second one")); AnnotatedRunnableTestClass t = new AnnotatedRunnableTestClass(3, taxa); JSONProducer producer = new JSONProducer(); String json = producer.toJSON(t); assertEquals(3, (int) t.getParam1()); FileWriter outfile = new FileWriter(new File("/tmp/JSONTest.json")); outfile.write(json); outfile.close(); JSONParser parser = new JSONParser(); BEASTInterface b = parser.parseFile(new File("/tmp/JSONTest.json")); assertEquals(3, (int) ((AnnotatedRunnableTestClass) b).getParam1()); assertEquals(2, ((AnnotatedRunnableTestClass) b).getTaxon().size()); // test that default value for param1 comes through String json2 = "{version: \"2.4\",\n" + "namespace: \"beast.core:beast.evolution.alignment:beast.evolution.tree.coalescent:beast.core.util:beast.evolution.nuc:beast.evolution.operators:beast.evolution.sitemodel:beast.evolution.substitutionmodel:beast.evolution.likelihood\",\n" + "\n" + "beast: [\n" + "\n" + "\n" + " {id: \"JSONTest\",\n" + " spec: \"test.beast.util.AnnotatedRunnableTestClass\",\n" + " taxon: [\n" + " {id: \"first one\" },\n" + " {id: \"second one\" }\n" + " ]\n" + " }\n" + "]\n" + "}"; outfile = new FileWriter(new File("/tmp/JSONTest2.json")); outfile.write(json2); outfile.close(); parser = new JSONParser(); b = parser.parseFile(new File("/tmp/JSONTest2.json")); assertEquals(10, (int) ((AnnotatedRunnableTestClass) b).getParam1()); assertEquals(2, ((AnnotatedRunnableTestClass) b).getTaxon().size()); // test that array of doubles comes through in second constructor String json3 = "{version: \"2.4\",\n" + "namespace: \"beast.core:beast.evolution.alignment:beast.evolution.tree.coalescent:beast.core.util:beast.evolution.nuc:beast.evolution.operators:beast.evolution.sitemodel:beast.evolution.substitutionmodel:beast.evolution.likelihood\",\n" + "\n" + "beast: [\n" + "\n" + "\n" + " {id: \"JSONTest\",\n" + " spec: \"test.beast.util.AnnotatedRunnableTestClass\",\n" + " array: [1.0, 2.0, 3.0]\n" + " }\n" + "]\n" + "}"; outfile = new FileWriter(new File("/tmp/JSONTest3.json")); outfile.write(json3); outfile.close(); parser = new JSONParser(); b = parser.parseFile(new File("/tmp/JSONTest3.json")); assertEquals(3, ((AnnotatedRunnableTestClass) b).getArray().size()); } }