1. /* ===========================================================
  2. * JFreeChart : a free chart library for the Java(tm) platform
  3. * ===========================================================
  4. *
  5. * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
  6. *
  7. * Project Info: http://www.jfree.org/jfreechart/index.html
  8. *
  9. * This library is free software; you can redistribute it and/or modify it
  10. * under the terms of the GNU Lesser General Public License as published by
  11. * the Free Software Foundation; either version 2.1 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This library is distributed in the hope that it will be useful, but
  15. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  16. * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
  17. * License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public License
  20. * along with this library; if not, write to the Free Software Foundation,
  21. * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  22. *
  23. * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
  24. * in the United States and other countries.]
  25. *
  26. * --------------------------
  27. * DatasetUtilitiesTests.java
  28. * --------------------------
  29. * (C) Copyright 2003-2005, by Object Refinery Limited and Contributors.
  30. *
  31. * Original Author: David Gilbert (for Object Refinery Limited);
  32. * Contributor(s): -;
  33. *
  34. * $Id: DatasetUtilitiesTests.java,v 1.11 2005/03/04 11:50:11 mungady Exp $
  35. *
  36. * Changes
  37. * -------
  38. * 18-Sep-2003 : Version 1 (DG);
  39. * 23-Mar-2004 : Added test for maximumStackedRangeValue() method (DG);
  40. * 04-Oct-2004 : Eliminated NumberUtils usage (DG);
  41. * 07-Jan-2005 : Updated for method name changes (DG);
  42. * 03-Feb-2005 : Added testFindStackedRangeBounds2() method (DG);
  43. *
  44. */
  45. package org.jfree.data.general.junit;
  46. import junit.framework.Test;
  47. import junit.framework.TestCase;
  48. import junit.framework.TestSuite;
  49. import org.jfree.data.KeyToGroupMap;
  50. import org.jfree.data.Range;
  51. import org.jfree.data.category.CategoryDataset;
  52. import org.jfree.data.category.DefaultCategoryDataset;
  53. import org.jfree.data.general.DatasetUtilities;
  54. import org.jfree.data.general.DefaultPieDataset;
  55. import org.jfree.data.general.PieDataset;
  56. import org.jfree.data.xy.DefaultTableXYDataset;
  57. import org.jfree.data.xy.TableXYDataset;
  58. import org.jfree.data.xy.XYDataset;
  59. import org.jfree.data.xy.XYSeries;
  60. import org.jfree.data.xy.XYSeriesCollection;
  61. /**
  62. * Tests for the {@link DatasetUtilities} class.
  63. */
  64. public class DatasetUtilitiesTests extends TestCase {
  65. private static final double EPSILON = 0.0000000001;
  66. /**
  67. * Returns the tests as a test suite.
  68. *
  69. * @return The test suite.
  70. */
  71. public static Test suite() {
  72. return new TestSuite(DatasetUtilitiesTests.class);
  73. }
  74. /**
  75. * Constructs a new set of tests.
  76. *
  77. * @param name the name of the tests.
  78. */
  79. public DatasetUtilitiesTests(String name) {
  80. super(name);
  81. }
  82. /**
  83. * Some tests to verify that Java does what I think it does!
  84. */
  85. public void testJava() {
  86. assertTrue(Double.isNaN(Math.min(1.0, Double.NaN)));
  87. assertTrue(Double.isNaN(Math.max(1.0, Double.NaN)));
  88. }
  89. /**
  90. * Some tests for the calculatePieDatasetTotal() method.
  91. */
  92. public void testCalculatePieDatasetTotal() {
  93. DefaultPieDataset d = new DefaultPieDataset();
  94. assertEquals(
  95. 0.0, DatasetUtilities.calculatePieDatasetTotal(d), EPSILON
  96. );
  97. d.setValue("A", 1.0);
  98. assertEquals(
  99. 1.0, DatasetUtilities.calculatePieDatasetTotal(d), EPSILON
  100. );
  101. d.setValue("B", 3.0);
  102. assertEquals(
  103. 4.0, DatasetUtilities.calculatePieDatasetTotal(d), EPSILON
  104. );
  105. }
  106. /**
  107. * Some tests for the findDomainBounds() method.
  108. */
  109. public void testFindDomainBounds() {
  110. XYDataset dataset = createXYDataset1();
  111. Range r = DatasetUtilities.findDomainBounds(dataset);
  112. assertEquals(1.0, r.getLowerBound(), EPSILON);
  113. assertEquals(3.0, r.getUpperBound(), EPSILON);
  114. }
  115. /**
  116. * Some tests for the iterateDomainBounds() method.
  117. */
  118. public void testIterateDomainBounds() {
  119. XYDataset dataset = createXYDataset1();
  120. Range r = DatasetUtilities.iterateDomainBounds(dataset);
  121. assertEquals(1.0, r.getLowerBound(), EPSILON);
  122. assertEquals(3.0, r.getUpperBound(), EPSILON);
  123. }
  124. /**
  125. * Some tests for the findRangeExtent() method.
  126. */
  127. public void testFindRangeBounds1() {
  128. CategoryDataset dataset = createCategoryDataset1();
  129. Range r = DatasetUtilities.findRangeBounds(dataset);
  130. assertEquals(1.0, r.getLowerBound(), EPSILON);
  131. assertEquals(6.0, r.getUpperBound(), EPSILON);
  132. }
  133. /**
  134. * Some tests for the findRangeBounds() method.
  135. */
  136. public void testFindRangeBounds2() {
  137. XYDataset dataset = createXYDataset1();
  138. Range r = DatasetUtilities.findRangeBounds(dataset);
  139. assertEquals(100.0, r.getLowerBound(), EPSILON);
  140. assertEquals(105.0, r.getUpperBound(), EPSILON);
  141. }
  142. /**
  143. * Some tests for the iterateCategoryRangeBounds() method.
  144. */
  145. public void testIterateCategoryRangeBounds() {
  146. CategoryDataset dataset = createCategoryDataset1();
  147. Range r = DatasetUtilities.iterateCategoryRangeBounds(dataset, false);
  148. assertEquals(1.0, r.getLowerBound(), EPSILON);
  149. assertEquals(6.0, r.getUpperBound(), EPSILON);
  150. }
  151. /**
  152. * Some tests for the iterateXYRangeBounds() method.
  153. */
  154. public void testIterateXYRangeBounds() {
  155. XYDataset dataset = createXYDataset1();
  156. Range r = DatasetUtilities.iterateXYRangeBounds(dataset);
  157. assertEquals(100.0, r.getLowerBound(), EPSILON);
  158. assertEquals(105.0, r.getUpperBound(), EPSILON);
  159. }
  160. /**
  161. * Some tests for the findMinimumDomainValue() method.
  162. */
  163. public void testFindMinimumDomainValue() {
  164. XYDataset dataset = createXYDataset1();
  165. Number minimum = DatasetUtilities.findMinimumDomainValue(dataset);
  166. assertEquals(new Double(1.0), minimum);
  167. }
  168. /**
  169. * Some tests for the findMaximumDomainValue() method.
  170. */
  171. public void testFindMaximumDomainValue() {
  172. XYDataset dataset = createXYDataset1();
  173. Number maximum = DatasetUtilities.findMaximumDomainValue(dataset);
  174. assertEquals(new Double(3.0), maximum);
  175. }
  176. /**
  177. * Some tests for the findMinimumRangeValue() method.
  178. */
  179. public void testFindMinimumRangeValue() {
  180. CategoryDataset d1 = createCategoryDataset1();
  181. Number min1 = DatasetUtilities.findMinimumRangeValue(d1);
  182. assertEquals(new Double(1.0), min1);
  183. XYDataset d2 = createXYDataset1();
  184. Number min2 = DatasetUtilities.findMinimumRangeValue(d2);
  185. assertEquals(new Double(100.0), min2);
  186. }
  187. /**
  188. * Some tests for the findMaximumRangeValue() method.
  189. */
  190. public void testFindMaximumRangeValue() {
  191. CategoryDataset d1 = createCategoryDataset1();
  192. Number max1 = DatasetUtilities.findMaximumRangeValue(d1);
  193. assertEquals(new Double(6.0), max1);
  194. XYDataset dataset = createXYDataset1();
  195. Number maximum = DatasetUtilities.findMaximumRangeValue(dataset);
  196. assertEquals(new Double(105.0), maximum);
  197. }
  198. /**
  199. * A quick test of the min and max range value methods.
  200. */
  201. public void testMinMaxRange() {
  202. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  203. dataset.addValue(100.0, "Series 1", "Type 1");
  204. dataset.addValue(101.1, "Series 1", "Type 2");
  205. Number min = DatasetUtilities.findMinimumRangeValue(dataset);
  206. assertTrue(min.doubleValue() < 100.1);
  207. Number max = DatasetUtilities.findMaximumRangeValue(dataset);
  208. assertTrue(max.doubleValue() > 101.0);
  209. }
  210. /**
  211. * A test to reproduce bug report 803660.
  212. */
  213. public void test803660() {
  214. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  215. dataset.addValue(100.0, "Series 1", "Type 1");
  216. dataset.addValue(101.1, "Series 1", "Type 2");
  217. Number n = DatasetUtilities.findMaximumRangeValue(dataset);
  218. assertTrue(n.doubleValue() > 101.0);
  219. }
  220. /**
  221. * A simple test for the cumulative range calculation. The sequence of
  222. * "cumulative" values are considered to be { 0.0, 10.0, 25.0, 18.0 } so
  223. * the range should be 0.0 -> 25.0.
  224. */
  225. public void testCumulativeRange1() {
  226. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  227. dataset.addValue(10.0, "Series 1", "Start");
  228. dataset.addValue(15.0, "Series 1", "Delta 1");
  229. dataset.addValue(-7.0, "Series 1", "Delta 2");
  230. Range range = DatasetUtilities.findCumulativeRangeBounds(dataset);
  231. assertEquals(0.0, range.getLowerBound(), 0.00000001);
  232. assertEquals(25.0, range.getUpperBound(), 0.00000001);
  233. }
  234. /**
  235. * A further test for the cumulative range calculation.
  236. */
  237. public void testCumulativeRange2() {
  238. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  239. dataset.addValue(-21.4, "Series 1", "Start Value");
  240. dataset.addValue(11.57, "Series 1", "Delta 1");
  241. dataset.addValue(3.51, "Series 1", "Delta 2");
  242. dataset.addValue(-12.36, "Series 1", "Delta 3");
  243. dataset.addValue(3.39, "Series 1", "Delta 4");
  244. dataset.addValue(38.68, "Series 1", "Delta 5");
  245. dataset.addValue(-43.31, "Series 1", "Delta 6");
  246. dataset.addValue(-29.59, "Series 1", "Delta 7");
  247. dataset.addValue(35.30, "Series 1", "Delta 8");
  248. dataset.addValue(5.0, "Series 1", "Delta 9");
  249. Range range = DatasetUtilities.findCumulativeRangeBounds(dataset);
  250. assertEquals(-49.51, range.getLowerBound(), 0.00000001);
  251. assertEquals(23.39, range.getUpperBound(), 0.00000001);
  252. }
  253. /**
  254. * Test the creation of a dataset from an array.
  255. */
  256. public void testCreateCategoryDataset1() {
  257. String[] rowKeys = {"R1", "R2", "R3"};
  258. String[] columnKeys = {"C1", "C2"};
  259. double[][] data = new double[3][];
  260. data[0] = new double[] {1.1, 1.2};
  261. data[1] = new double[] {2.1, 2.2};
  262. data[2] = new double[] {3.1, 3.2};
  263. CategoryDataset dataset = DatasetUtilities.createCategoryDataset(
  264. rowKeys, columnKeys, data
  265. );
  266. assertTrue(dataset.getRowCount() == 3);
  267. assertTrue(dataset.getColumnCount() == 2);
  268. }
  269. /**
  270. * Test the creation of a dataset from an array. This time is should fail
  271. * because the array dimensions are around the wrong way.
  272. */
  273. public void testCreateCategoryDataset2() {
  274. boolean pass = false;
  275. String[] rowKeys = {"R1", "R2", "R3"};
  276. String[] columnKeys = {"C1", "C2"};
  277. double[][] data = new double[2][];
  278. data[0] = new double[] {1.1, 1.2, 1.3};
  279. data[1] = new double[] {2.1, 2.2, 2.3};
  280. CategoryDataset dataset = null;
  281. try {
  282. dataset = DatasetUtilities.createCategoryDataset(
  283. rowKeys, columnKeys, data
  284. );
  285. }
  286. catch (IllegalArgumentException e) {
  287. pass = true; // got it!
  288. }
  289. assertTrue(pass);
  290. assertTrue(dataset == null);
  291. }
  292. /**
  293. * Test for a bug reported in the forum:
  294. *
  295. * http://www.jfree.org/phpBB2/viewtopic.php?t=7903
  296. */
  297. public void testMaximumStackedRangeValue() {
  298. double v1 = 24.3;
  299. double v2 = 14.2;
  300. double v3 = 33.2;
  301. double v4 = 32.4;
  302. double v5 = 26.3;
  303. double v6 = 22.6;
  304. Number answer = new Double(Math.max(v1 + v2 + v3, v4 + v5 + v6));
  305. DefaultCategoryDataset d = new DefaultCategoryDataset();
  306. d.addValue(v1, "Row 0", "Column 0");
  307. d.addValue(v2, "Row 1", "Column 0");
  308. d.addValue(v3, "Row 2", "Column 0");
  309. d.addValue(v4, "Row 0", "Column 1");
  310. d.addValue(v5, "Row 1", "Column 1");
  311. d.addValue(v6, "Row 2", "Column 1");
  312. Number max = DatasetUtilities.findMaximumStackedRangeValue(d);
  313. assertTrue(max.equals(answer));
  314. }
  315. /**
  316. * Some checks for the findStackedRangeBounds() method.
  317. */
  318. public void testFindStackedRangeBoundsForCategoryDataset1() {
  319. CategoryDataset d1 = createCategoryDataset1();
  320. Range r = DatasetUtilities.findStackedRangeBounds(d1);
  321. assertEquals(0.0, r.getLowerBound(), EPSILON);
  322. assertEquals(15.0, r.getUpperBound(), EPSILON);
  323. d1 = createCategoryDataset2();
  324. r = DatasetUtilities.findStackedRangeBounds(d1);
  325. assertEquals(-2.0, r.getLowerBound(), EPSILON);
  326. assertEquals(2.0, r.getUpperBound(), EPSILON);
  327. }
  328. /**
  329. * Some checks for the findStackedRangeBounds() method.
  330. */
  331. public void testFindStackedRangeBoundsForCategoryDataset2() {
  332. CategoryDataset d1 = new DefaultCategoryDataset();
  333. Range r = DatasetUtilities.findStackedRangeBounds(d1);
  334. assertTrue(r == null);
  335. }
  336. /**
  337. * Some checks for the findStackedRangeBounds() method.
  338. */
  339. public void testFindStackedRangeBoundsForTableXYDataset1() {
  340. TableXYDataset d2 = createTableXYDataset1();
  341. Range r = DatasetUtilities.findStackedRangeBounds(d2);
  342. assertEquals(-2.0, r.getLowerBound(), EPSILON);
  343. assertEquals(2.0, r.getUpperBound(), EPSILON);
  344. }
  345. /**
  346. * Some checks for the findStackedRangeBounds() method.
  347. */
  348. public void testFindStackedRangeBoundsForTableXYDataset2() {
  349. DefaultTableXYDataset d = new DefaultTableXYDataset();
  350. Range r = DatasetUtilities.findStackedRangeBounds(d);
  351. assertEquals(r, new Range(0.0, 0.0));
  352. }
  353. /**
  354. * Tests the stacked range extent calculation.
  355. */
  356. public void testStackedRangeWithMap() {
  357. CategoryDataset d = createCategoryDataset1();
  358. KeyToGroupMap map = new KeyToGroupMap("G0");
  359. map.mapKeyToGroup("R2", "G1");
  360. Range r = DatasetUtilities.findStackedRangeBounds(d, map);
  361. assertEquals(0.0, r.getLowerBound(), EPSILON);
  362. assertEquals(9.0, r.getUpperBound(), EPSILON);
  363. }
  364. /**
  365. * Some checks for the limitPieDataset() methods.
  366. */
  367. public void testLimitPieDataset() {
  368. // check that empty dataset is handled OK
  369. DefaultPieDataset d1 = new DefaultPieDataset();
  370. PieDataset d2 = DatasetUtilities.createConsolidatedPieDataset(
  371. d1, "Other", 0.05
  372. );
  373. assertEquals(0, d2.getItemCount());
  374. // check that minItem limit is observed
  375. d1.setValue("Item 1", 1.0);
  376. d1.setValue("Item 2", 49.50);
  377. d1.setValue("Item 3", 49.50);
  378. d2 = DatasetUtilities.createConsolidatedPieDataset(d1, "Other", 0.05);
  379. assertEquals(3, d2.getItemCount());
  380. assertEquals("Item 1", d2.getKey(0));
  381. assertEquals("Item 2", d2.getKey(1));
  382. assertEquals("Item 3", d2.getKey(2));
  383. // check that minItem limit is observed
  384. d1.setValue("Item 4", 1.0);
  385. d2 = DatasetUtilities.createConsolidatedPieDataset(
  386. d1, "Other", 0.05, 2
  387. );
  388. // and that simple aggregation works
  389. assertEquals(3, d2.getItemCount());
  390. assertEquals("Item 2", d2.getKey(0));
  391. assertEquals("Item 3", d2.getKey(1));
  392. assertEquals("Other", d2.getKey(2));
  393. assertEquals(new Double(2.0), d2.getValue("Other"));
  394. }
  395. /**
  396. * Creates a dataset for testing.
  397. *
  398. * @return A dataset.
  399. */
  400. private CategoryDataset createCategoryDataset1() {
  401. DefaultCategoryDataset result = new DefaultCategoryDataset();
  402. result.addValue(1.0, "R0", "C0");
  403. result.addValue(1.0, "R1", "C0");
  404. result.addValue(1.0, "R2", "C0");
  405. result.addValue(4.0, "R0", "C1");
  406. result.addValue(5.0, "R1", "C1");
  407. result.addValue(6.0, "R2", "C1");
  408. return result;
  409. }
  410. /**
  411. * Creates a dataset for testing.
  412. *
  413. * @return A dataset.
  414. */
  415. private CategoryDataset createCategoryDataset2() {
  416. DefaultCategoryDataset result = new DefaultCategoryDataset();
  417. result.addValue(1.0, "R0", "C0");
  418. result.addValue(-2.0, "R1", "C0");
  419. result.addValue(2.0, "R0", "C1");
  420. result.addValue(-1.0, "R1", "C1");
  421. return result;
  422. }
  423. /**
  424. * Creates a dataset for testing.
  425. *
  426. * @return A dataset.
  427. */
  428. private XYDataset createXYDataset1() {
  429. XYSeries series1 = new XYSeries("S1");
  430. series1.add(1.0, 100.0);
  431. series1.add(2.0, 101.0);
  432. series1.add(3.0, 102.0);
  433. XYSeries series2 = new XYSeries("S2");
  434. series2.add(1.0, 103.0);
  435. series2.add(2.0, null);
  436. series2.add(3.0, 105.0);
  437. XYSeriesCollection result = new XYSeriesCollection();
  438. result.addSeries(series1);
  439. result.addSeries(series2);
  440. result.setIntervalWidth(0.0);
  441. return result;
  442. }
  443. /**
  444. * Creates a sample dataset for testing purposes.
  445. *
  446. * @return A sample dataset.
  447. */
  448. private TableXYDataset createTableXYDataset1() {
  449. DefaultTableXYDataset dataset = new DefaultTableXYDataset();
  450. XYSeries s1 = new XYSeries("Series 1", true, false);
  451. s1.add(1.0, 1.0);
  452. s1.add(2.0, 2.0);
  453. dataset.addSeries(s1);
  454. XYSeries s2 = new XYSeries("Series 2", true, false);
  455. s2.add(1.0, -2.0);
  456. s2.add(2.0, -1.0);
  457. dataset.addSeries(s2);
  458. return dataset;
  459. }
  460. }