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 under the terms
  10. * of the GNU Lesser General Public License as published by the Free Software Foundation;
  11. * either version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
  14. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  15. * See the GNU Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public License along with this
  18. * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  19. * Boston, MA 02111-1307, USA.
  20. *
  21. * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
  22. * in the United States and other countries.]
  23. *
  24. * -----------------
  25. * QuarterTests.java
  26. * -----------------
  27. * (C) Copyright 2001-2005, by Object Refinery Limited.
  28. *
  29. * Original Author: David Gilbert (for Object Refinery Limited);
  30. * Contributor(s): -;
  31. *
  32. * $Id: QuarterTests.java,v 1.4 2005/01/14 17:28:37 mungady Exp $
  33. *
  34. * Changes
  35. * -------
  36. * 16-Nov-2001 : Version 1 (DG);
  37. * 17-Oct-2002 : Fixed errors reported by Checkstyle (DG);
  38. * 13-Mar-2003 : Added serialization test (DG);
  39. * 11-Jan-2005 : Added check for non-clonability (DG);
  40. *
  41. */
  42. package org.jfree.data.time.junit;
  43. import java.io.ByteArrayInputStream;
  44. import java.io.ByteArrayOutputStream;
  45. import java.io.ObjectInput;
  46. import java.io.ObjectInputStream;
  47. import java.io.ObjectOutput;
  48. import java.io.ObjectOutputStream;
  49. import java.util.Date;
  50. import java.util.TimeZone;
  51. import junit.framework.Test;
  52. import junit.framework.TestCase;
  53. import junit.framework.TestSuite;
  54. import org.jfree.data.time.Quarter;
  55. import org.jfree.data.time.TimePeriodFormatException;
  56. /**
  57. * Tests for the {link Quarter} class.
  58. */
  59. public class QuarterTests extends TestCase {
  60. /** A quarter. */
  61. private Quarter q1Y1900;
  62. /** A quarter. */
  63. private Quarter q2Y1900;
  64. /** A quarter. */
  65. private Quarter q3Y9999;
  66. /** A quarter. */
  67. private Quarter q4Y9999;
  68. /**
  69. * Returns the tests as a test suite.
  70. *
  71. * @return The test suite.
  72. */
  73. public static Test suite() {
  74. return new TestSuite(QuarterTests.class);
  75. }
  76. /**
  77. * Constructs a new set of tests.
  78. *
  79. * @param name the name of the tests.
  80. */
  81. public QuarterTests(String name) {
  82. super(name);
  83. }
  84. /**
  85. * Common test setup.
  86. */
  87. protected void setUp() {
  88. this.q1Y1900 = new Quarter(1, 1900);
  89. this.q2Y1900 = new Quarter(2, 1900);
  90. this.q3Y9999 = new Quarter(3, 9999);
  91. this.q4Y9999 = new Quarter(4, 9999);
  92. }
  93. /**
  94. * Check that a Quarter instance is equal to itself.
  95. *
  96. * SourceForge Bug ID: 558850.
  97. */
  98. public void testEqualsSelf() {
  99. Quarter quarter = new Quarter();
  100. assertTrue(quarter.equals(quarter));
  101. }
  102. /**
  103. * Tests the equals method.
  104. */
  105. public void testEquals() {
  106. Quarter q1 = new Quarter(2, 2002);
  107. Quarter q2 = new Quarter(2, 2002);
  108. assertTrue(q1.equals(q2));
  109. }
  110. /**
  111. * In GMT, the end of Q1 2002 is java.util.Date(1017619199999L). Use this to check the
  112. * quarter constructor.
  113. */
  114. public void testDateConstructor1() {
  115. TimeZone zone = TimeZone.getTimeZone("GMT");
  116. Quarter q1 = new Quarter(new Date(1017619199999L), zone);
  117. Quarter q2 = new Quarter(new Date(1017619200000L), zone);
  118. assertEquals(1, q1.getQuarter());
  119. assertEquals(1017619199999L, q1.getLastMillisecond(zone));
  120. assertEquals(2, q2.getQuarter());
  121. assertEquals(1017619200000L, q2.getFirstMillisecond(zone));
  122. }
  123. /**
  124. * In Istanbul, the end of Q1 2002 is java.util.Date(1017608399999L). Use this to check the
  125. * quarter constructor.
  126. */
  127. public void testDateConstructor2() {
  128. TimeZone zone = TimeZone.getTimeZone("Europe/Istanbul");
  129. Quarter q1 = new Quarter(new Date(1017608399999L), zone);
  130. Quarter q2 = new Quarter(new Date(1017608400000L), zone);
  131. assertEquals(1, q1.getQuarter());
  132. assertEquals(1017608399999L, q1.getLastMillisecond(zone));
  133. assertEquals(2, q2.getQuarter());
  134. assertEquals(1017608400000L, q2.getFirstMillisecond(zone));
  135. }
  136. /**
  137. * Set up a quarter equal to Q1 1900. Request the previous quarter, it should be null.
  138. */
  139. public void testQ1Y1900Previous() {
  140. Quarter previous = (Quarter) this.q1Y1900.previous();
  141. assertNull(previous);
  142. }
  143. /**
  144. * Set up a quarter equal to Q1 1900. Request the next quarter, it should be Q2 1900.
  145. */
  146. public void testQ1Y1900Next() {
  147. Quarter next = (Quarter) this.q1Y1900.next();
  148. assertEquals(this.q2Y1900, next);
  149. }
  150. /**
  151. * Set up a quarter equal to Q4 9999. Request the previous quarter, it should be Q3 9999.
  152. */
  153. public void testQ4Y9999Previous() {
  154. Quarter previous = (Quarter) this.q4Y9999.previous();
  155. assertEquals(this.q3Y9999, previous);
  156. }
  157. /**
  158. * Set up a quarter equal to Q4 9999. Request the next quarter, it should be null.
  159. */
  160. public void testQ4Y9999Next() {
  161. Quarter next = (Quarter) this.q4Y9999.next();
  162. assertNull(next);
  163. }
  164. /**
  165. * Test the string parsing code...
  166. */
  167. public void testParseQuarter() {
  168. Quarter quarter = null;
  169. // test 1...
  170. try {
  171. quarter = Quarter.parseQuarter("Q1-2000");
  172. }
  173. catch (TimePeriodFormatException e) {
  174. quarter = new Quarter(1, 1900);
  175. }
  176. assertEquals(1, quarter.getQuarter());
  177. assertEquals(2000, quarter.getYear().getYear());
  178. // test 2...
  179. try {
  180. quarter = Quarter.parseQuarter("2001-Q2");
  181. }
  182. catch (TimePeriodFormatException e) {
  183. quarter = new Quarter(1, 1900);
  184. }
  185. assertEquals(2, quarter.getQuarter());
  186. assertEquals(2001, quarter.getYear().getYear());
  187. // test 3...
  188. try {
  189. quarter = Quarter.parseQuarter("Q3, 2002");
  190. }
  191. catch (TimePeriodFormatException e) {
  192. quarter = new Quarter(1, 1900);
  193. }
  194. assertEquals(3, quarter.getQuarter());
  195. assertEquals(2002, quarter.getYear().getYear());
  196. }
  197. /**
  198. * Serialize an instance, restore it, and check for equality.
  199. */
  200. public void testSerialization() {
  201. Quarter q1 = new Quarter(4, 1999);
  202. Quarter q2 = null;
  203. try {
  204. ByteArrayOutputStream buffer = new ByteArrayOutputStream();
  205. ObjectOutput out = new ObjectOutputStream(buffer);
  206. out.writeObject(q1);
  207. out.close();
  208. ObjectInput in = new ObjectInputStream(
  209. new ByteArrayInputStream(buffer.toByteArray())
  210. );
  211. q2 = (Quarter) in.readObject();
  212. in.close();
  213. }
  214. catch (Exception e) {
  215. System.out.println(e.toString());
  216. }
  217. assertEquals(q1, q2);
  218. }
  219. /**
  220. * Two objects that are equal are required to return the same hashCode.
  221. */
  222. public void testHashcode() {
  223. Quarter q1 = new Quarter(2, 2003);
  224. Quarter q2 = new Quarter(2, 2003);
  225. assertTrue(q1.equals(q2));
  226. int h1 = q1.hashCode();
  227. int h2 = q2.hashCode();
  228. assertEquals(h1, h2);
  229. }
  230. /**
  231. * The {@link Quarter} class is immutable, so should not be {@link Cloneable}.
  232. */
  233. public void testNotCloneable() {
  234. Quarter q = new Quarter(2, 2003);
  235. assertFalse(q instanceof Cloneable);
  236. }
  237. }