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 * XYSeriesTests.java
28 * ------------------
29 * (C) Copyright 2003, 2004, by Object Refinery Limited and Contributors.
30 *
31 * Original Author: David Gilbert (for Object Refinery Limited);
32 * Contributor(s): -;
33 *
34 * $Id: XYSeriesTests.java,v 1.5 2005/05/20 08:20:05 mungady Exp $
35 *
36 * Changes
37 * -------
38 * 23-Dec-2003 : Version 1 (DG);
39 *
40 */
41
42 package org.jfree.data.xy.junit;
43
44 import java.io.ByteArrayInputStream;
45 import java.io.ByteArrayOutputStream;
46 import java.io.ObjectInput;
47 import java.io.ObjectInputStream;
48 import java.io.ObjectOutput;
49 import java.io.ObjectOutputStream;
50
51 import junit.framework.Test;
52 import junit.framework.TestCase;
53 import junit.framework.TestSuite;
54
55 import org.jfree.data.general.SeriesException;
56 import org.jfree.data.xy.XYDataItem;
57 import org.jfree.data.xy.XYSeries;
58
59 /**
60 * Tests for the {@link XYSeries} class.
61 */
62 public class XYSeriesTests extends TestCase {
63
64 /**
65 * Returns the tests as a test suite.
66 *
67 * @return The test suite.
68 */
69 public static Test suite() {
70 return new TestSuite(XYSeriesTests.class);
71 }
72
73 /**
74 * Constructs a new set of tests.
75 *
76 * @param name the name of the tests.
77 */
78 public XYSeriesTests(String name) {
79 super(name);
80 }
81
82 /**
83 * Confirm that the equals method can distinguish all the required fields.
84 */
85 public void testEquals() {
86
87 XYSeries s1 = new XYSeries("Series");
88 s1.add(1.0, 1.1);
89 XYSeries s2 = new XYSeries("Series");
90 s2.add(1.0, 1.1);
91 assertTrue(s1.equals(s2));
92 assertTrue(s2.equals(s1));
93
94 s1.setKey("Series X");
95 assertFalse(s1.equals(s2));
96
97 s2.setKey("Series X");
98 assertTrue(s1.equals(s2));
99
100 }
101
102 /**
103 * Confirm that cloning works.
104 */
105 public void testCloning() {
106 XYSeries s1 = new XYSeries("Series");
107 s1.add(1.0, 1.1);
108 XYSeries s2 = null;
109 try {
110 s2 = (XYSeries) s1.clone();
111 }
112 catch (CloneNotSupportedException e) {
113 System.err.println("XYSeriesTests.testCloning: failed to clone.");
114 }
115 assertTrue(s1 != s2);
116 assertTrue(s1.getClass() == s2.getClass());
117 assertTrue(s1.equals(s2));
118 }
119
120 /**
121 * Serialize an instance, restore it, and check for equality.
122 */
123 public void testSerialization() {
124
125 XYSeries s1 = new XYSeries("Series");
126 s1.add(1.0, 1.1);
127 XYSeries s2 = null;
128
129 try {
130 ByteArrayOutputStream buffer = new ByteArrayOutputStream();
131 ObjectOutput out = new ObjectOutputStream(buffer);
132 out.writeObject(s1);
133 out.close();
134
135 ObjectInput in = new ObjectInputStream(
136 new ByteArrayInputStream(buffer.toByteArray())
137 );
138 s2 = (XYSeries) in.readObject();
139 in.close();
140 }
141 catch (Exception e) {
142 System.out.println(e.toString());
143 }
144 assertEquals(s1, s2);
145
146 }
147
148 /**
149 * Simple test for the indexOf() method.
150 */
151 public void testIndexOf() {
152 XYSeries s1 = new XYSeries("Series 1");
153 s1.add(1.0, 1.0);
154 s1.add(2.0, 2.0);
155 s1.add(3.0, 3.0);
156 assertEquals(0, s1.indexOf(new Double(1.0)));
157 }
158
159 /**
160 * A check for the indexOf() method for an unsorted series.
161 */
162 public void testIndexOf2() {
163 XYSeries s1 = new XYSeries("Series 1", false, true);
164 s1.add(1.0, 1.0);
165 s1.add(3.0, 3.0);
166 s1.add(2.0, 2.0);
167 assertEquals(0, s1.indexOf(new Double(1.0)));
168 assertEquals(1, s1.indexOf(new Double(3.0)));
169 assertEquals(2, s1.indexOf(new Double(2.0)));
170 }
171
172 /**
173 * Simple test for the remove() method.
174 */
175 public void testRemove() {
176
177 XYSeries s1 = new XYSeries("Series 1");
178 s1.add(1.0, 1.0);
179 s1.add(2.0, 2.0);
180 s1.add(3.0, 3.0);
181
182 assertEquals(3, s1.getItemCount());
183 s1.remove(new Double(2.0));
184 assertEquals(new Double(3.0), s1.getX(1));
185
186 s1.remove(0);
187 assertEquals(new Double(3.0), s1.getX(0));
188
189 }
190
191 private static final double EPSILON = 0.0000000001;
192
193 /**
194 * When items are added with duplicate x-values, we expect them to remain
195 * in the order they were added.
196 */
197 public void testAdditionOfDuplicateXValues() {
198 XYSeries s1 = new XYSeries("Series 1");
199 s1.add(1.0, 1.0);
200 s1.add(2.0, 2.0);
201 s1.add(2.0, 3.0);
202 s1.add(2.0, 4.0);
203 s1.add(3.0, 5.0);
204 assertEquals(1.0, s1.getY(0).doubleValue(), EPSILON);
205 assertEquals(2.0, s1.getY(1).doubleValue(), EPSILON);
206 assertEquals(3.0, s1.getY(2).doubleValue(), EPSILON);
207 assertEquals(4.0, s1.getY(3).doubleValue(), EPSILON);
208 assertEquals(5.0, s1.getY(4).doubleValue(), EPSILON);
209 }
210
211 /**
212 * Some checks for the update(Number, Number) method.
213 */
214 public void testUpdate() {
215 XYSeries series = new XYSeries("S1");
216 series.add(new Integer(1), new Integer(2));
217 assertEquals(new Integer(2), series.getY(0));
218 series.update(new Integer(1), new Integer(3));
219 assertEquals(new Integer(3), series.getY(0));
220 try {
221 series.update(new Integer(2), new Integer(99));
222 assertTrue(false);
223 }
224 catch (SeriesException e) {
225 // got the required exception
226 }
227 }
228
229 /**
230 * Some checks for the update() method for an unsorted series.
231 */
232 public void testUpdate2() {
233 XYSeries series = new XYSeries("Series", false, true);
234 series.add(5.0, 55.0);
235 series.add(4.0, 44.0);
236 series.add(6.0, 66.0);
237 series.update(new Double(4.0), new Double(99.0));
238 assertEquals(new Double(99.0), series.getY(1));
239 }
240
241 /**
242 * Some checks for the addOrUpdate() method.
243 */
244 public void testAddOrUpdate() {
245 XYSeries series = new XYSeries("S1");
246 XYDataItem old = series.addOrUpdate(new Long(1), new Long(2));
247 assertTrue(old == null);
248 assertEquals(1, series.getItemCount());
249 assertEquals(new Long(2), series.getY(0));
250
251 old = series.addOrUpdate(new Long(2), new Long(3));
252 assertTrue(old == null);
253 assertEquals(2, series.getItemCount());
254 assertEquals(new Long(3), series.getY(1));
255
256 old = series.addOrUpdate(new Long(1), new Long(99));
257 assertEquals(new XYDataItem(new Long(1), new Long(2)), old);
258 assertEquals(2, series.getItemCount());
259 assertEquals(new Long(99), series.getY(0));
260 assertEquals(new Long(3), series.getY(1));
261 }
262
263 /**
264 * Some checks for the addOrUpdate() method for an UNSORTED series.
265 */
266 public void testAddOrUpdate2() {
267 XYSeries series = new XYSeries("Series", false, true);
268 series.add(5.0, 5.5);
269 series.add(6.0, 6.6);
270 series.add(3.0, 3.3);
271 series.add(4.0, 4.4);
272 series.add(2.0, 2.2);
273 series.add(1.0, 1.1);
274 series.addOrUpdate(new Double(3.0), new Double(33.3));
275 series.addOrUpdate(new Double(2.0), new Double(22.2));
276 assertEquals(33.3, series.getY(2).doubleValue(), EPSILON);
277 assertEquals(22.2, series.getY(4).doubleValue(), EPSILON);
278 }
279
280 /**
281 * Some checks for the add() method for an UNSORTED series.
282 */
283 public void testAdd() {
284 XYSeries series = new XYSeries("Series", false, true);
285 series.add(5.0, 5.50);
286 series.add(5.1, 5.51);
287 series.add(6.0, 6.6);
288 series.add(3.0, 3.3);
289 series.add(4.0, 4.4);
290 series.add(2.0, 2.2);
291 series.add(1.0, 1.1);
292 assertEquals(5.5, series.getY(0).doubleValue(), EPSILON);
293 assertEquals(5.51, series.getY(1).doubleValue(), EPSILON);
294 assertEquals(6.6, series.getY(2).doubleValue(), EPSILON);
295 assertEquals(3.3, series.getY(3).doubleValue(), EPSILON);
296 assertEquals(4.4, series.getY(4).doubleValue(), EPSILON);
297 assertEquals(2.2, series.getY(5).doubleValue(), EPSILON);
298 assertEquals(1.1, series.getY(6).doubleValue(), EPSILON);
299 }
300
301 /**
302 * A simple check that the maximumItemCount attribute is working.
303 */
304 public void testSetMaximumItemCount() {
305 XYSeries s1 = new XYSeries("S1");
306 assertEquals(Integer.MAX_VALUE, s1.getMaximumItemCount());
307 s1.setMaximumItemCount(2);
308 assertEquals(2, s1.getMaximumItemCount());
309 s1.add(1.0, 1.1);
310 s1.add(2.0, 2.2);
311 s1.add(3.0, 3.3);
312 assertEquals(2.0, s1.getX(0).doubleValue(), EPSILON);
313 assertEquals(3.0, s1.getX(1).doubleValue(), EPSILON);
314 }
315
316 /**
317 * Check that the maximum item count can be applied retrospectively.
318 */
319 public void testSetMaximumItemCount2() {
320 XYSeries s1 = new XYSeries("S1");
321 s1.add(1.0, 1.1);
322 s1.add(2.0, 2.2);
323 s1.add(3.0, 3.3);
324 s1.setMaximumItemCount(2);
325 assertEquals(2.0, s1.getX(0).doubleValue(), EPSILON);
326 assertEquals(3.0, s1.getX(1).doubleValue(), EPSILON);
327 }
328
329 }