/* =========================================================== * Orson Charts : a 3D chart library for the Java(tm) platform * =========================================================== * * (C)opyright 2013-2016, by Object Refinery Limited. All rights reserved. * * http://www.object-refinery.com/orsoncharts/index.html * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * [Oracle and Java are registered trademarks of Oracle and/or its affiliates. * Other names may be trademarks of their respective owners.] * * If you do not wish to be bound by the terms of the GPL, an alternative * commercial license can be purchased. For details, please see visit the * Orson Charts home page: * * http://www.object-refinery.com/orsoncharts/index.html * */ package com.orsoncharts.data; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.junit.Test; import com.orsoncharts.data.category.StandardCategoryDataset3D; import com.orsoncharts.data.xyz.XYZDataset; import com.orsoncharts.data.xyz.XYZSeries; import com.orsoncharts.data.xyz.XYZSeriesCollection; /** * Some tests for the {@link JSONUtils} class. */ public class JSONUtilsTest { /** * Some checks for the readKeyedValues() method. */ @Test public void checkReadKeyedValues() { String json = "[]"; KeyedValues<String, ? extends Number> dkv = JSONUtils.readKeyedValues(json); assertTrue(dkv.getItemCount() == 0); json = "[[\"Key 1\", 1.23], [\"Key 2\", null], [\"NaN\", null], " + "[\"MIN_VALUE\", 4.9E-324], " + "[\"MAX_VALUE\", 1.7976931348623157E308], " + "[\"POSITIVE_INFINITY\", null]]"; dkv = JSONUtils.readKeyedValues(json); assertTrue(dkv.getItemCount() == 6); assertEquals(1.23, dkv.getValue("Key 1")); assertEquals(1.23, dkv.getValue(0)); assertNull(dkv.getValue("Key 2")); assertNull(dkv.getValue(1)); assertNull(dkv.getValue("NaN")); assertNull(dkv.getValue(2)); assertEquals(Double.MIN_VALUE, dkv.getValue("MIN_VALUE")); assertEquals(Double.MIN_VALUE, dkv.getValue(3)); assertEquals(Double.MAX_VALUE, dkv.getValue("MAX_VALUE")); assertEquals(Double.MAX_VALUE, dkv.getValue(4)); assertNull(dkv.getValue("POSITIVE_INFINITY")); assertNull(dkv.getValue(5)); } @Test public void checkWriteKeyedValues() { // some standard cases are already checked in the tests for the // toString() method in StandardPieDataset3D DefaultKeyedValues<String, Number> dkv = new DefaultKeyedValues<String, Number>(); dkv.put("\"", 1.0); assertEquals("[[\"\\\"\", 1.0]]", JSONUtils.writeKeyedValues(dkv)); dkv.clear(); dkv.put("\\", 1.0); assertEquals("[[\"\\\\\", 1.0]]", JSONUtils.writeKeyedValues(dkv)); dkv.clear(); dkv.put("\t", 1.0); assertEquals("[[\"\\t\", 1.0]]", JSONUtils.writeKeyedValues(dkv)); dkv.clear(); dkv.put("\n", 1.0); assertEquals("[[\"\\n\", 1.0]]", JSONUtils.writeKeyedValues(dkv)); dkv.clear(); dkv.put("\f", 1.0); assertEquals("[[\"\\f\", 1.0]]", JSONUtils.writeKeyedValues(dkv)); dkv.clear(); dkv.put("\b", 1.0); assertEquals("[[\"\\b\", 1.0]]", JSONUtils.writeKeyedValues(dkv)); dkv.clear(); dkv.put("\r", 1.0); assertEquals("[[\"\\r\", 1.0]]", JSONUtils.writeKeyedValues(dkv)); dkv.clear(); dkv.put("/", 1.0); assertEquals("[[\"\\/\", 1.0]]", JSONUtils.writeKeyedValues(dkv)); dkv.clear(); } @Test public void checkReadKeyedValues2D() { String json = "{}"; KeyedValues2D<String, String, Number> dkv2d = JSONUtils.readKeyedValues2D(json); assertEquals(0, dkv2d.getRowCount()); assertEquals(0, dkv2d.getColumnCount()); json = "{\"columnKeys\": [\"C1\", \"C2\", \"C3\"], \"rows\": " + "[[\"R1\", [1.0, 2.0, 3.0]], [\"R2\", [4.0, 5.0, 6.0]]]}"; dkv2d = JSONUtils.readKeyedValues2D(json); assertEquals(2, dkv2d.getRowCount()); assertEquals(3, dkv2d.getColumnCount()); assertEquals(1.0, dkv2d.getValue("R1", "C1")); assertEquals(2.0, dkv2d.getValue("R1", "C2")); assertEquals(3.0, dkv2d.getValue("R1", "C3")); assertEquals(4.0, dkv2d.getValue("R2", "C1")); assertEquals(5.0, dkv2d.getValue("R2", "C2")); assertEquals(6.0, dkv2d.getValue("R2", "C3")); } @Test public void checkWriteKeyedValues2D() { DefaultKeyedValues2D<String, String, Number> dkv2d = new DefaultKeyedValues2D<String, String, Number>(); String expected = "{}"; assertEquals(expected, JSONUtils.writeKeyedValues2D(dkv2d)); dkv2d.setValue(1.0, "R1", "C1"); expected = "{\"columnKeys\": [\"C1\"], \"rows\": [[\"R1\", [1.0]]]}"; assertEquals(expected, JSONUtils.writeKeyedValues2D(dkv2d)); } @Test public void checkReadKeyedValues3D() { String json = "{}"; KeyedValues3D<String, String, String, ? extends Number> dkv3d = JSONUtils.readKeyedValues3D(json); assertEquals(0, dkv3d.getRowCount()); assertEquals(0, dkv3d.getColumnCount()); json = "{\"columnKeys\": [\"C1\", \"C2\"], \"rowKeys\": " + "[\"R1\", \"R2\"], \"data\": [{\"seriesKey\": \"S1\", " + "\"rows\": {\"R1\": [1.0, 2.0], \"R2\": [3.0, 4.0]}}, " + "{\"seriesKey\": \"S2\", \"rows\": {\"R2\": [5.0, 6.0]}}]}"; dkv3d = JSONUtils.readKeyedValues3D(json); assertEquals(2, dkv3d.getSeriesCount()); assertEquals("S1", dkv3d.getSeriesKey(0)); assertEquals("S2", dkv3d.getSeriesKey(1)); assertEquals(2, dkv3d.getRowCount()); assertEquals("R1", dkv3d.getRowKey(0)); assertEquals("R2", dkv3d.getRowKey(1)); assertEquals(2, dkv3d.getColumnCount()); assertEquals("C1", dkv3d.getColumnKey(0)); assertEquals("C2", dkv3d.getColumnKey(1)); assertEquals(1.0, dkv3d.getValue("S1", "R1", "C1")); assertEquals(2.0, dkv3d.getValue("S1", "R1", "C2")); assertEquals(3.0, dkv3d.getValue("S1", "R2", "C1")); assertEquals(4.0, dkv3d.getValue("S1", "R2", "C2")); assertEquals(5.0, dkv3d.getValue("S2", "R2", "C1")); assertEquals(6.0, dkv3d.getValue("S2", "R2", "C2")); } @Test public void checkWriteKeyedValues3D() { StandardCategoryDataset3D<String, String, String> dataset = new StandardCategoryDataset3D<String, String, String>(); dataset.addValue(1.0, "S1", "R1", "C1"); dataset.addValue(2.0, "S1", "R1", "C2"); dataset.addValue(3.0, "S1", "R2", "C1"); dataset.addValue(4.0, "S1", "R2", "C2"); // series 2 only has data in row 2 dataset.addValue(5.0, "S2", "R2", "C1"); dataset.addValue(6.0, "S2", "R2", "C2"); String expected = "{\"columnKeys\": [\"C1\", \"C2\"], \"rowKeys\": " + "[\"R1\", \"R2\"], \"series\": [{\"seriesKey\": \"S1\", " + "\"rows\": [[\"R1\", [1.0, 2.0]], [\"R2\", [3.0, 4.0]]]}, " + "{\"seriesKey\": \"S2\", \"rows\": [[\"R2\", [5.0, 6.0]]]}]}"; assertEquals(expected, JSONUtils.writeKeyedValues3D(dataset)); } private static final double EPSILON = 0.0000001; /** * Tests for reading XYZDatasets from JSON format. */ @Test public void checkReadXYZDataset() { String json = "[]"; XYZDataset dataset = JSONUtils.readXYZDataset(json); assertEquals(0, dataset.getSeriesCount()); json = "[[\"Series 1\", [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]], " + "[\"Series 2\", [[5.5, 6.6, 7.7], [8.8, 9.9, 9.9], " + "[8.4, 9.2, 9.1]]]]"; dataset = JSONUtils.readXYZDataset(json); assertEquals(2, dataset.getSeriesCount()); assertEquals("Series 1", dataset.getSeriesKey(0)); assertEquals("Series 2", dataset.getSeriesKey(1)); assertEquals(2, dataset.getItemCount(0)); assertEquals(3, dataset.getItemCount(1)); assertEquals(1.0, dataset.getX(0, 0), EPSILON); assertEquals(2.0, dataset.getY(0, 0), EPSILON); assertEquals(3.0, dataset.getZ(0, 0), EPSILON); assertEquals(4.0, dataset.getX(0, 1), EPSILON); assertEquals(5.0, dataset.getY(0, 1), EPSILON); assertEquals(6.0, dataset.getZ(0, 1), EPSILON); assertEquals(5.5, dataset.getX(1, 0), EPSILON); assertEquals(6.6, dataset.getY(1, 0), EPSILON); assertEquals(7.7, dataset.getZ(1, 0), EPSILON); assertEquals(8.8, dataset.getX(1, 1), EPSILON); assertEquals(9.9, dataset.getY(1, 1), EPSILON); assertEquals(9.9, dataset.getZ(1, 1), EPSILON); assertEquals(8.4, dataset.getX(1, 2), EPSILON); assertEquals(9.2, dataset.getY(1, 2), EPSILON); assertEquals(9.1, dataset.getZ(1, 2), EPSILON); } /** * Tests for writing XYZDatasets to JSON format. */ @Test public void checkWriteXYZDataset() { XYZSeriesCollection<String> dataset = new XYZSeriesCollection<String>(); assertEquals("[]", JSONUtils.writeXYZDataset(dataset)); XYZSeries<String> s1 = new XYZSeries<String>("S1"); dataset.add(s1); assertEquals("[[\"S1\", []]]", JSONUtils.writeXYZDataset(dataset)); s1.add(1.0, 2.0, 3.0); assertEquals("[[\"S1\", [[1.0, 2.0, 3.0]]]]", JSONUtils.writeXYZDataset(dataset)); XYZSeries<String> s2 = new XYZSeries<String>("S2"); dataset.add(s2); assertEquals("[[\"S1\", [[1.0, 2.0, 3.0]]], [\"S2\", []]]", JSONUtils.writeXYZDataset(dataset)); } }