WeekTest.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. /* ===========================================================
  2. * JFreeChart : a free chart library for the Java(tm) platform
  3. * ===========================================================
  4. *
  5. * (C) Copyright 2000-2013, 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
  20. * License along with this library; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
  22. * USA.
  23. *
  24. * [Oracle and Java are registered trademarks of Oracle and/or its affiliates.
  25. * Other names may be trademarks of their respective owners.]
  26. *
  27. * -------------
  28. * WeekTest.java
  29. * -------------
  30. * (C) Copyright 2002-2013, by Object Refinery Limited.
  31. *
  32. * Original Author: David Gilbert (for Object Refinery Limited);
  33. * Contributor(s): -;
  34. *
  35. * Changes
  36. * -------
  37. * 05-Apr-2002 : Version 1 (DG);
  38. * 26-Jun-2002 : Removed unnecessary imports (DG);
  39. * 17-Oct-2002 : Fixed errors reported by Checkstyle (DG);
  40. * 13-Mar-2003 : Added serialization test (DG);
  41. * 21-Oct-2003 : Added hashCode test (DG);
  42. * 06-Apr-2006 : Added testBug1448828() method (DG);
  43. * 01-Jun-2006 : Added testBug1498805() method (DG);
  44. * 11-Jul-2007 : Fixed bad time zone assumption (DG);
  45. * 28-Aug-2007 : Added test for constructor problem (DG);
  46. * 19-Dec-2007 : Set default locale for tests that are sensitive
  47. * to the locale (DG);
  48. *
  49. */
  50. package org.jfree.data.time;
  51. import static org.junit.Assert.assertTrue;
  52. import static org.junit.Assert.assertFalse;
  53. import static org.junit.Assert.assertEquals;
  54. import static org.junit.Assert.assertNull;
  55. import java.util.Calendar;
  56. import java.util.Date;
  57. import java.util.GregorianCalendar;
  58. import java.util.Locale;
  59. import java.util.TimeZone;
  60. import org.jfree.chart.TestUtilities;
  61. import org.junit.Before;
  62. import org.junit.Test;
  63. /**
  64. * Tests for the {@link Week} class.
  65. */
  66. public class WeekTest {
  67. /** A week. */
  68. private Week w1Y1900;
  69. /** A week. */
  70. private Week w2Y1900;
  71. /** A week. */
  72. private Week w51Y9999;
  73. /** A week. */
  74. private Week w52Y9999;
  75. /**
  76. * Common test setup.
  77. */
  78. @Before
  79. public void setUp() {
  80. this.w1Y1900 = new Week(1, 1900);
  81. this.w2Y1900 = new Week(2, 1900);
  82. this.w51Y9999 = new Week(51, 9999);
  83. this.w52Y9999 = new Week(52, 9999);
  84. }
  85. /**
  86. * Tests the equals method.
  87. */
  88. @Test
  89. public void testEquals() {
  90. Week w1 = new Week(1, 2002);
  91. Week w2 = new Week(1, 2002);
  92. assertTrue(w1.equals(w2));
  93. assertTrue(w2.equals(w1));
  94. w1 = new Week(2, 2002);
  95. assertFalse(w1.equals(w2));
  96. w2 = new Week(2, 2002);
  97. assertTrue(w1.equals(w2));
  98. w1 = new Week(2, 2003);
  99. assertFalse(w1.equals(w2));
  100. w2 = new Week(2, 2003);
  101. assertTrue(w1.equals(w2));
  102. }
  103. /**
  104. * Request the week before week 1, 1900: it should be <code>null</code>.
  105. */
  106. @Test
  107. public void testW1Y1900Previous() {
  108. Week previous = (Week) this.w1Y1900.previous();
  109. assertNull(previous);
  110. }
  111. /**
  112. * Request the week after week 1, 1900: it should be week 2, 1900.
  113. */
  114. @Test
  115. public void testW1Y1900Next() {
  116. Week next = (Week) this.w1Y1900.next();
  117. assertEquals(this.w2Y1900, next);
  118. }
  119. /**
  120. * Request the week before w52, 9999: it should be week 51, 9999.
  121. */
  122. @Test
  123. public void testW52Y9999Previous() {
  124. Week previous = (Week) this.w52Y9999.previous();
  125. assertEquals(this.w51Y9999, previous);
  126. }
  127. /**
  128. * Request the week after w52, 9999: it should be <code>null</code>.
  129. */
  130. @Test
  131. public void testW52Y9999Next() {
  132. Week next = (Week) this.w52Y9999.next();
  133. assertNull(next);
  134. }
  135. /**
  136. * Serialize an instance, restore it, and check for equality.
  137. */
  138. @Test
  139. public void testSerialization() {
  140. Week w1 = new Week(24, 1999);
  141. Week w2 = (Week) TestUtilities.serialised(w1);
  142. assertEquals(w1, w2);
  143. }
  144. /**
  145. * Two objects that are equal are required to return the same hashCode.
  146. */
  147. @Test
  148. public void testHashcode() {
  149. Week w1 = new Week(2, 2003);
  150. Week w2 = new Week(2, 2003);
  151. assertTrue(w1.equals(w2));
  152. int h1 = w1.hashCode();
  153. int h2 = w2.hashCode();
  154. assertEquals(h1, h2);
  155. }
  156. /**
  157. * The {@link Week} class is immutable, so should not be {@link Cloneable}.
  158. */
  159. @Test
  160. public void testNotCloneable() {
  161. Week w = new Week(1, 1999);
  162. assertFalse(w instanceof Cloneable);
  163. }
  164. /**
  165. * The first week in 2005 should span the range:
  166. *
  167. * TimeZone | Start Millis | End Millis | Start Date | End Date
  168. * -----------------+---------------+---------------+-------------+------------
  169. * Europe/London | 1104710400000 | 1105315199999 | 3-Jan-2005 | 9-Jan-2005
  170. * Europe/Paris | 1104706800000 | 1105311599999 | 3-Jan-2005 | 2-Jan-2005
  171. * America/New_York | 1104037200000 | 1104641999999 | 26-Dec-2004 | 1-Jan-2005
  172. *
  173. * In London and Paris, Monday is the first day of the week, while in the
  174. * US it is Sunday.
  175. *
  176. * Previously, we were using these values, but see Java Bug ID 4960215:
  177. *
  178. * TimeZone | Start Millis | End Millis | Start Date | End Date
  179. * -----------------+---------------+---------------+-------------+------------
  180. * Europe/London | 1104105600000 | 1104710399999 | 27-Dec-2004 | 2-Jan-2005
  181. * Europe/Paris | 1104102000000 | 1104706799999 | 27-Dec-2004 | 2-Jan-2005
  182. * America/New_York | 1104037200000 | 1104641999999 | 26-Dec-2004 | 1-Jan-2005
  183. */
  184. @Test
  185. public void testWeek12005() {
  186. Week w1 = new Week(1, 2005);
  187. Calendar c1 = Calendar.getInstance(
  188. TimeZone.getTimeZone("Europe/London"), Locale.UK);
  189. c1.setMinimalDaysInFirstWeek(4); // see Java Bug ID 4960215
  190. assertEquals(1104710400000L, w1.getFirstMillisecond(c1));
  191. assertEquals(1105315199999L, w1.getLastMillisecond(c1));
  192. Calendar c2 = Calendar.getInstance(
  193. TimeZone.getTimeZone("Europe/Paris"), Locale.FRANCE);
  194. c2.setMinimalDaysInFirstWeek(4); // see Java Bug ID 4960215
  195. assertEquals(1104706800000L, w1.getFirstMillisecond(c2));
  196. assertEquals(1105311599999L, w1.getLastMillisecond(c2));
  197. Calendar c3 = Calendar.getInstance(
  198. TimeZone.getTimeZone("America/New_York"), Locale.US);
  199. assertEquals(1104037200000L, w1.getFirstMillisecond(c3));
  200. assertEquals(1104641999999L, w1.getLastMillisecond(c3));
  201. }
  202. /**
  203. * The 53rd week in 2004 in London and Paris should span the range:
  204. *
  205. * TimeZone | Start Millis | End Millis | Start Date | End Date
  206. * -----------------+---------------+---------------+-------------+------------
  207. * Europe/London | 1104105600000 | 1104710399999 | 27-Dec-2004 | 02-Jan-2005
  208. * Europe/Paris | 1104102000000 | 1104706799999 | 27-Dec-2004 | 02-Jan-2005
  209. *
  210. * The 53rd week in 2005 in New York should span the range:
  211. *
  212. * TimeZone | Start Millis | End Millis | Start Date | End Date
  213. * -----------------+---------------+---------------+-------------+------------
  214. * America/New_York | 1135486800000 | 1136091599999 | 25-Dec-2005 | 31-Dec-2005
  215. *
  216. * In London and Paris, Monday is the first day of the week, while in the
  217. * US it is Sunday.
  218. */
  219. @Test
  220. public void testWeek532005() {
  221. Week w1 = new Week(53, 2004);
  222. Calendar c1 = Calendar.getInstance(
  223. TimeZone.getTimeZone("Europe/London"), Locale.UK);
  224. c1.setMinimalDaysInFirstWeek(4); // see Java Bug ID 4960215
  225. assertEquals(1104105600000L, w1.getFirstMillisecond(c1));
  226. assertEquals(1104710399999L, w1.getLastMillisecond(c1));
  227. Calendar c2 = Calendar.getInstance(
  228. TimeZone.getTimeZone("Europe/Paris"), Locale.FRANCE);
  229. c2.setMinimalDaysInFirstWeek(4); // see Java Bug ID 4960215
  230. assertEquals(1104102000000L, w1.getFirstMillisecond(c2));
  231. assertEquals(1104706799999L, w1.getLastMillisecond(c2));
  232. w1 = new Week(53, 2005);
  233. Calendar c3 = Calendar.getInstance(
  234. TimeZone.getTimeZone("America/New_York"), Locale.US);
  235. assertEquals(1135486800000L, w1.getFirstMillisecond(c3));
  236. assertEquals(1136091599999L, w1.getLastMillisecond(c3));
  237. }
  238. /**
  239. * A test case for bug 1448828.
  240. */
  241. @Test
  242. public void testBug1448828() {
  243. Locale saved = Locale.getDefault();
  244. Locale.setDefault(Locale.UK);
  245. try {
  246. Week w = new Week(new Date(1136109830000l),
  247. TimeZone.getTimeZone("GMT"));
  248. assertEquals(2005, w.getYearValue());
  249. assertEquals(52, w.getWeek());
  250. }
  251. finally {
  252. Locale.setDefault(saved);
  253. }
  254. }
  255. /**
  256. * A test case for bug 1498805.
  257. */
  258. @Test
  259. public void testBug1498805() {
  260. Locale saved = Locale.getDefault();
  261. Locale.setDefault(Locale.UK);
  262. try {
  263. TimeZone zone = TimeZone.getTimeZone("GMT");
  264. GregorianCalendar gc = new GregorianCalendar(zone);
  265. gc.set(2005, Calendar.JANUARY, 1, 12, 0, 0);
  266. Week w = new Week(gc.getTime(), zone);
  267. assertEquals(53, w.getWeek());
  268. assertEquals(new Year(2004), w.getYear());
  269. }
  270. finally {
  271. Locale.setDefault(saved);
  272. }
  273. }
  274. /**
  275. * Some checks for the getFirstMillisecond() method.
  276. */
  277. @Test
  278. public void testGetFirstMillisecond() {
  279. Locale saved = Locale.getDefault();
  280. Locale.setDefault(Locale.UK);
  281. TimeZone savedZone = TimeZone.getDefault();
  282. TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
  283. Week w = new Week(3, 1970);
  284. assertEquals(946800000L, w.getFirstMillisecond());
  285. Locale.setDefault(saved);
  286. TimeZone.setDefault(savedZone);
  287. }
  288. /**
  289. * Some checks for the getFirstMillisecond(TimeZone) method.
  290. */
  291. @Test
  292. public void testGetFirstMillisecondWithTimeZone() {
  293. Week w = new Week(47, 1950);
  294. Locale saved = Locale.getDefault();
  295. Locale.setDefault(Locale.US);
  296. try {
  297. TimeZone zone = TimeZone.getTimeZone("America/Los_Angeles");
  298. assertEquals(-603302400000L, w.getFirstMillisecond(zone));
  299. }
  300. finally {
  301. Locale.setDefault(saved);
  302. }
  303. // try null calendar
  304. boolean pass = false;
  305. try {
  306. w.getFirstMillisecond((TimeZone) null);
  307. }
  308. catch (NullPointerException e) {
  309. pass = true;
  310. }
  311. assertTrue(pass);
  312. }
  313. /**
  314. * Some checks for the getFirstMillisecond(TimeZone) method.
  315. */
  316. @Test
  317. public void testGetFirstMillisecondWithCalendar() {
  318. Week w = new Week(1, 2001);
  319. GregorianCalendar calendar = new GregorianCalendar(Locale.GERMANY);
  320. calendar.setTimeZone(TimeZone.getTimeZone("Europe/Frankfurt"));
  321. assertEquals(978307200000L, w.getFirstMillisecond(calendar));
  322. // try null calendar
  323. boolean pass = false;
  324. try {
  325. w.getFirstMillisecond((Calendar) null);
  326. }
  327. catch (NullPointerException e) {
  328. pass = true;
  329. }
  330. assertTrue(pass);
  331. }
  332. /**
  333. * Some checks for the getLastMillisecond() method.
  334. */
  335. @Test
  336. public void testGetLastMillisecond() {
  337. Locale saved = Locale.getDefault();
  338. Locale.setDefault(Locale.UK);
  339. TimeZone savedZone = TimeZone.getDefault();
  340. TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
  341. Week w = new Week(31, 1970);
  342. assertEquals(18485999999L, w.getLastMillisecond());
  343. Locale.setDefault(saved);
  344. TimeZone.setDefault(savedZone);
  345. }
  346. /**
  347. * Some checks for the getLastMillisecond(TimeZone) method.
  348. */
  349. @Test
  350. public void testGetLastMillisecondWithTimeZone() {
  351. Week w = new Week(2, 1950);
  352. Locale saved = Locale.getDefault();
  353. Locale.setDefault(Locale.US);
  354. try {
  355. TimeZone zone = TimeZone.getTimeZone("America/Los_Angeles");
  356. assertEquals(-629913600001L, w.getLastMillisecond(zone));
  357. }
  358. finally {
  359. Locale.setDefault(saved);
  360. }
  361. // try null zone
  362. boolean pass = false;
  363. try {
  364. w.getLastMillisecond((TimeZone) null);
  365. }
  366. catch (NullPointerException e) {
  367. pass = true;
  368. }
  369. assertTrue(pass);
  370. }
  371. /**
  372. * Some checks for the getLastMillisecond(TimeZone) method.
  373. */
  374. @Test
  375. public void testGetLastMillisecondWithCalendar() {
  376. Week w = new Week(52, 2001);
  377. GregorianCalendar calendar = new GregorianCalendar(Locale.GERMANY);
  378. calendar.setTimeZone(TimeZone.getTimeZone("Europe/Frankfurt"));
  379. assertEquals(1009756799999L, w.getLastMillisecond(calendar));
  380. // try null calendar
  381. boolean pass = false;
  382. try {
  383. w.getLastMillisecond((Calendar) null);
  384. }
  385. catch (NullPointerException e) {
  386. pass = true;
  387. }
  388. assertTrue(pass);
  389. }
  390. /**
  391. * Some checks for the getSerialIndex() method.
  392. */
  393. @Test
  394. public void testGetSerialIndex() {
  395. Week w = new Week(1, 2000);
  396. assertEquals(106001L, w.getSerialIndex());
  397. w = new Week(1, 1900);
  398. assertEquals(100701L, w.getSerialIndex());
  399. }
  400. /**
  401. * Some checks for the testNext() method.
  402. */
  403. @Test
  404. public void testNext() {
  405. Week w = new Week(12, 2000);
  406. w = (Week) w.next();
  407. assertEquals(new Year(2000), w.getYear());
  408. assertEquals(13, w.getWeek());
  409. w = new Week(53, 9999);
  410. assertNull(w.next());
  411. }
  412. /**
  413. * Some checks for the getStart() method.
  414. */
  415. @Test
  416. public void testGetStart() {
  417. Locale saved = Locale.getDefault();
  418. Locale.setDefault(Locale.ITALY);
  419. Calendar cal = Calendar.getInstance(Locale.ITALY);
  420. cal.set(2006, Calendar.JANUARY, 16, 0, 0, 0);
  421. cal.set(Calendar.MILLISECOND, 0);
  422. Week w = new Week(3, 2006);
  423. assertEquals(cal.getTime(), w.getStart());
  424. Locale.setDefault(saved);
  425. }
  426. /**
  427. * Some checks for the getEnd() method.
  428. */
  429. @Test
  430. public void testGetEnd() {
  431. Locale saved = Locale.getDefault();
  432. Locale.setDefault(Locale.ITALY);
  433. Calendar cal = Calendar.getInstance(Locale.ITALY);
  434. cal.set(2006, Calendar.JANUARY, 8, 23, 59, 59);
  435. cal.set(Calendar.MILLISECOND, 999);
  436. Week w = new Week(1, 2006);
  437. assertEquals(cal.getTime(), w.getEnd());
  438. Locale.setDefault(saved);
  439. }
  440. /**
  441. * A test for a problem in constructing a new Week instance.
  442. */
  443. @Test
  444. public void testConstructor() {
  445. Locale savedLocale = Locale.getDefault();
  446. TimeZone savedZone = TimeZone.getDefault();
  447. Locale.setDefault(new Locale("da", "DK"));
  448. TimeZone.setDefault(TimeZone.getTimeZone("Europe/Copenhagen"));
  449. GregorianCalendar cal = (GregorianCalendar) Calendar.getInstance(
  450. TimeZone.getDefault(), Locale.getDefault());
  451. // first day of week is monday
  452. assertEquals(Calendar.MONDAY, cal.getFirstDayOfWeek());
  453. cal.set(2007, Calendar.AUGUST, 26, 1, 0, 0);
  454. cal.set(Calendar.MILLISECOND, 0);
  455. Date t = cal.getTime();
  456. Week w = new Week(t, TimeZone.getTimeZone("Europe/Copenhagen"));
  457. assertEquals(34, w.getWeek());
  458. Locale.setDefault(Locale.US);
  459. TimeZone.setDefault(TimeZone.getTimeZone("US/Detroit"));
  460. cal = (GregorianCalendar) Calendar.getInstance(TimeZone.getDefault());
  461. // first day of week is Sunday
  462. assertEquals(Calendar.SUNDAY, cal.getFirstDayOfWeek());
  463. cal.set(2007, Calendar.AUGUST, 26, 1, 0, 0);
  464. cal.set(Calendar.MILLISECOND, 0);
  465. t = cal.getTime();
  466. w = new Week(t, TimeZone.getTimeZone("Europe/Copenhagen"));
  467. assertEquals(35, w.getWeek());
  468. w = new Week(t, TimeZone.getTimeZone("Europe/Copenhagen"),
  469. new Locale("da", "DK"));
  470. assertEquals(34, w.getWeek());
  471. Locale.setDefault(savedLocale);
  472. TimeZone.setDefault(savedZone);
  473. }
  474. }