SegmentedTimelineAdditionalTest.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  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. * SegmentedTimelineTest2.java
  29. * ---------------------------
  30. * (C) Copyright 2004-2013, by Object Refinery Limited and Contributors.
  31. *
  32. * Original Author: David Gilbert (for Object Refinery Limited);
  33. * Contributor(s): -;
  34. *
  35. * Changes
  36. * -------
  37. * 02-Aug-2004 : Added standard header (DG);
  38. * 02-Feb-2007 : Removed author tags all over JFreeChart sources (DG);
  39. *
  40. */
  41. package org.jfree.chart.axis;
  42. import static org.junit.Assert.assertTrue;
  43. import java.util.Calendar;
  44. import java.util.Date;
  45. import java.util.Locale;
  46. import java.util.TimeZone;
  47. import org.junit.Test;
  48. /**
  49. * Some tests for the {@link SegmentedTimeline} class.
  50. */
  51. public class SegmentedTimelineAdditionalTest {
  52. /**
  53. * Constructor
  54. */
  55. public SegmentedTimelineAdditionalTest() {
  56. super();
  57. }
  58. /**
  59. * Test 1 checks 9am Friday 26 March 2004 converts to a timeline value and
  60. * back again correctly. This is prior to Daylight Saving.
  61. */
  62. @Test
  63. public void test1() {
  64. TimeZone savedZone = TimeZone.getDefault();
  65. TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
  66. Locale savedLocale = Locale.getDefault();
  67. Locale.setDefault(Locale.UK);
  68. Calendar cal = Calendar.getInstance(Locale.UK);
  69. cal.set(Calendar.YEAR, 2004);
  70. cal.set(Calendar.MONTH, Calendar.MARCH);
  71. cal.set(Calendar.DAY_OF_MONTH, 26);
  72. cal.set(Calendar.HOUR_OF_DAY, 9);
  73. cal.set(Calendar.MINUTE, 0);
  74. cal.set(Calendar.SECOND, 0);
  75. cal.set(Calendar.MILLISECOND, 0);
  76. Date date = cal.getTime();
  77. SegmentedTimeline timeline = getTimeline();
  78. long value = timeline.toTimelineValue(date);
  79. long ms = timeline.toMillisecond(value);
  80. Calendar cal2 = Calendar.getInstance(Locale.UK);
  81. cal2.setTime(new Date(ms));
  82. Date reverted = cal2.getTime();
  83. assertTrue("test1", value == (900000 * 34)
  84. && date.getTime() == reverted.getTime());
  85. TimeZone.setDefault(savedZone);
  86. Locale.setDefault(savedLocale);
  87. }
  88. /**
  89. * Test 2 checks 9.15am Friday 26 March 2004 converts to a timeline value
  90. * and back again correctly. This is prior to Daylight Saving.
  91. */
  92. @Test
  93. public void test2() {
  94. TimeZone savedZone = TimeZone.getDefault();
  95. TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
  96. Calendar cal = Calendar.getInstance(Locale.UK);
  97. cal.set(Calendar.YEAR, 2004);
  98. cal.set(Calendar.MONTH, Calendar.MARCH);
  99. cal.set(Calendar.DAY_OF_MONTH, 26);
  100. cal.set(Calendar.HOUR_OF_DAY, 9);
  101. cal.set(Calendar.MINUTE, 15);
  102. cal.set(Calendar.SECOND, 0);
  103. cal.set(Calendar.MILLISECOND, 0);
  104. Date date = cal.getTime();
  105. SegmentedTimeline timeline = getTimeline();
  106. long value = timeline.toTimelineValue(date);
  107. long ms = timeline.toMillisecond(value);
  108. Calendar cal2 = Calendar.getInstance(Locale.UK);
  109. cal2.setTime(new Date(ms));
  110. Date reverted = cal2.getTime();
  111. assertTrue("test2", value == (900000 * 34 + 900000)
  112. && date.getTime() == reverted.getTime());
  113. TimeZone.setDefault(savedZone);
  114. }
  115. /**
  116. * Test 3 checks 9.30am Friday 26 March 2004 converts to a timeline value
  117. * and back again correctly. This is prior to Daylight Saving.
  118. */
  119. @Test
  120. public void test3() {
  121. TimeZone savedZone = TimeZone.getDefault();
  122. TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
  123. Calendar cal = Calendar.getInstance(Locale.UK);
  124. cal.set(Calendar.YEAR, 2004);
  125. cal.set(Calendar.MONTH, Calendar.MARCH);
  126. cal.set(Calendar.DAY_OF_MONTH, 26);
  127. cal.set(Calendar.HOUR_OF_DAY, 9);
  128. cal.set(Calendar.MINUTE, 30);
  129. cal.set(Calendar.SECOND, 0);
  130. cal.set(Calendar.MILLISECOND, 0);
  131. Date date = cal.getTime();
  132. SegmentedTimeline timeline = getTimeline();
  133. long value = timeline.toTimelineValue(date);
  134. long ms = timeline.toMillisecond(value);
  135. Calendar cal2 = Calendar.getInstance(Locale.UK);
  136. cal2.setTime(new Date(ms));
  137. Date reverted = cal2.getTime();
  138. assertTrue("test3", value == (900000 * 34 + 900000 * 2)
  139. && date.getTime() == reverted.getTime());
  140. TimeZone.setDefault(savedZone);
  141. }
  142. /**
  143. * Test 4 checks 9.30am Friday 26 March 2004 (+ 1 millisecond) converts to
  144. * a timeline value and back again correctly. This is prior to Daylight
  145. * Saving.
  146. */
  147. @Test
  148. public void test4() {
  149. TimeZone savedZone = TimeZone.getDefault();
  150. TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
  151. Calendar cal = Calendar.getInstance(Locale.UK);
  152. cal.set(Calendar.YEAR, 2004);
  153. cal.set(Calendar.MONTH, Calendar.MARCH);
  154. cal.set(Calendar.DAY_OF_MONTH, 26);
  155. cal.set(Calendar.HOUR_OF_DAY, 9);
  156. cal.set(Calendar.MINUTE, 30);
  157. cal.set(Calendar.SECOND, 0);
  158. cal.set(Calendar.MILLISECOND, 1);
  159. Date date = cal.getTime();
  160. SegmentedTimeline timeline = getTimeline();
  161. long value = timeline.toTimelineValue(date);
  162. long ms = timeline.toMillisecond(value);
  163. Calendar cal2 = Calendar.getInstance(Locale.UK);
  164. cal2.setTime(new Date(ms));
  165. Date reverted = cal2.getTime();
  166. assertTrue("test4", value == (900000 * 34 + 900000 * 2 + 1)
  167. && date.getTime() == reverted.getTime());
  168. TimeZone.setDefault(savedZone);
  169. }
  170. /**
  171. * Test 5 checks 5.30pm Thursday 25 March 2004 converts to a timeline
  172. * value and back again correctly. As it is in the excluded segment, we
  173. * expect it to map to 9am, Friday 26 March 2004. This is prior to
  174. * Daylight Saving.
  175. */
  176. @Test
  177. public void test5() {
  178. TimeZone savedZone = TimeZone.getDefault();
  179. TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
  180. Calendar cal = Calendar.getInstance(Locale.UK);
  181. cal.set(Calendar.YEAR, 2004);
  182. cal.set(Calendar.MONTH, Calendar.MARCH);
  183. cal.set(Calendar.DAY_OF_MONTH, 25);
  184. cal.set(Calendar.HOUR_OF_DAY, 17);
  185. cal.set(Calendar.MINUTE, 30);
  186. cal.set(Calendar.SECOND, 0);
  187. cal.set(Calendar.MILLISECOND, 0);
  188. Date date = cal.getTime();
  189. SegmentedTimeline timeline = getTimeline();
  190. long value = timeline.toTimelineValue(date);
  191. long ms = timeline.toMillisecond(value);
  192. Calendar cal2 = Calendar.getInstance(Locale.UK);
  193. cal2.setTime(new Date(ms));
  194. Date reverted = cal2.getTime();
  195. Calendar expectedReverted = Calendar.getInstance(Locale.UK);
  196. expectedReverted.set(Calendar.YEAR, 2004);
  197. expectedReverted.set(Calendar.MONTH, Calendar.MARCH);
  198. expectedReverted.set(Calendar.DAY_OF_MONTH, 26);
  199. expectedReverted.set(Calendar.HOUR_OF_DAY, 9);
  200. expectedReverted.set(Calendar.MINUTE, 0);
  201. expectedReverted.set(Calendar.SECOND, 0);
  202. expectedReverted.set(Calendar.MILLISECOND, 0);
  203. assertTrue("test5", value == (900000 * 34)
  204. && expectedReverted.getTime().getTime() == reverted.getTime());
  205. TimeZone.setDefault(savedZone);
  206. }
  207. /**
  208. * Test 6 checks that 9am on Sunday 28 March 2004 converts to the timeline
  209. * value and back again correctly. Note that Saturday and Sunday are
  210. * excluded from the timeline, so we expect the value to map to 9am on
  211. * Monday 29 March 2004. This is during daylight saving.
  212. */
  213. @Test
  214. public void test6() {
  215. TimeZone savedZone = TimeZone.getDefault();
  216. TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
  217. Calendar cal = Calendar.getInstance(Locale.UK);
  218. cal.set(Calendar.YEAR, 2004);
  219. cal.set(Calendar.MONTH, Calendar.MARCH);
  220. cal.set(Calendar.DAY_OF_MONTH, 28);
  221. cal.set(Calendar.HOUR_OF_DAY, 9);
  222. cal.set(Calendar.MINUTE, 0);
  223. cal.set(Calendar.SECOND, 0);
  224. cal.set(Calendar.MILLISECOND, 0);
  225. Date date = cal.getTime();
  226. SegmentedTimeline timeline = getTimeline();
  227. long value = timeline.toTimelineValue(date);
  228. long ms = timeline.toMillisecond(value);
  229. Calendar cal2 = Calendar.getInstance(Locale.UK);
  230. cal2.setTime(new Date(ms));
  231. Date reverted = cal2.getTime();
  232. Calendar expectedReverted = Calendar.getInstance(Locale.UK);
  233. expectedReverted.set(Calendar.YEAR, 2004);
  234. expectedReverted.set(Calendar.MONTH, Calendar.MARCH);
  235. expectedReverted.set(Calendar.DAY_OF_MONTH, 29);
  236. expectedReverted.set(Calendar.HOUR_OF_DAY, 9);
  237. expectedReverted.set(Calendar.MINUTE, 0);
  238. expectedReverted.set(Calendar.SECOND, 0);
  239. expectedReverted.set(Calendar.MILLISECOND, 0);
  240. assertTrue("test6", value == (900000 * 34 * 2)
  241. && expectedReverted.getTime().getTime() == reverted.getTime());
  242. TimeZone.setDefault(savedZone);
  243. }
  244. /**
  245. * Test 7 checks 9am Monday 29 March 2004 converts to a timeline value and
  246. * back again correctly. This is during Daylight Saving.
  247. */
  248. @Test
  249. public void test7() {
  250. TimeZone savedZone = TimeZone.getDefault();
  251. TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
  252. Calendar cal = Calendar.getInstance(Locale.UK);
  253. cal.set(Calendar.YEAR, 2004);
  254. cal.set(Calendar.MONTH, Calendar.MARCH);
  255. cal.set(Calendar.DAY_OF_MONTH, 29);
  256. cal.set(Calendar.HOUR_OF_DAY, 9);
  257. cal.set(Calendar.MINUTE, 0);
  258. cal.set(Calendar.SECOND, 0);
  259. cal.set(Calendar.MILLISECOND, 0);
  260. Date date = cal.getTime();
  261. SegmentedTimeline timeline = getTimeline();
  262. long value = timeline.toTimelineValue(date);
  263. long ms = timeline.toMillisecond(value);
  264. Calendar cal2 = Calendar.getInstance(Locale.UK);
  265. cal2.setTime(new Date(ms));
  266. Date reverted = cal2.getTime();
  267. Calendar expectedReverted = Calendar.getInstance();
  268. expectedReverted.set(Calendar.YEAR, 2004);
  269. expectedReverted.set(Calendar.MONTH, Calendar.MARCH);
  270. expectedReverted.set(Calendar.DAY_OF_MONTH, 29);
  271. expectedReverted.set(Calendar.HOUR_OF_DAY, 9);
  272. expectedReverted.set(Calendar.MINUTE, 0);
  273. expectedReverted.set(Calendar.SECOND, 0);
  274. expectedReverted.set(Calendar.MILLISECOND, 0);
  275. assertTrue("test7", value == (900000 * 34 * 2)
  276. && expectedReverted.getTime().getTime() == reverted.getTime());
  277. TimeZone.setDefault(savedZone);
  278. }
  279. /**
  280. * Test 8.
  281. */
  282. @Test
  283. public void test8() {
  284. TimeZone savedZone = TimeZone.getDefault();
  285. TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
  286. Calendar cal = Calendar.getInstance(Locale.UK);
  287. cal.set(Calendar.YEAR, 2004);
  288. cal.set(Calendar.MONTH, Calendar.MARCH);
  289. cal.set(Calendar.DAY_OF_MONTH, 29);
  290. cal.set(Calendar.HOUR_OF_DAY, 10);
  291. cal.set(Calendar.MINUTE, 0);
  292. cal.set(Calendar.SECOND, 0);
  293. cal.set(Calendar.MILLISECOND, 0);
  294. Date date = cal.getTime();
  295. SegmentedTimeline timeline = getTimeline();
  296. // Add exception in included segments
  297. cal.set(Calendar.YEAR, 2004);
  298. cal.set(Calendar.MONTH, Calendar.MARCH);
  299. cal.set(Calendar.DAY_OF_MONTH, 29);
  300. cal.set(Calendar.HOUR_OF_DAY, 9);
  301. cal.set(Calendar.MINUTE, 15);
  302. cal.set(Calendar.SECOND, 0);
  303. cal.set(Calendar.MILLISECOND, 0);
  304. timeline.addException(cal.getTime());
  305. long value = timeline.toTimelineValue(date);
  306. long ms = timeline.toMillisecond(value);
  307. Calendar cal2 = Calendar.getInstance(Locale.UK);
  308. cal2.setTime(new Date(ms));
  309. Date reverted = cal2.getTime();
  310. Calendar expectedReverted = Calendar.getInstance();
  311. expectedReverted.set(Calendar.YEAR, 2004);
  312. expectedReverted.set(Calendar.MONTH, Calendar.MARCH);
  313. expectedReverted.set(Calendar.DAY_OF_MONTH, 29);
  314. expectedReverted.set(Calendar.HOUR_OF_DAY, 10);
  315. expectedReverted.set(Calendar.MINUTE, 0);
  316. expectedReverted.set(Calendar.SECOND, 0);
  317. expectedReverted.set(Calendar.MILLISECOND, 0);
  318. assertTrue("test8", value == (900000 * 34 * 2 + 900000 * (4 - 1))
  319. && expectedReverted.getTime().getTime() == reverted.getTime());
  320. TimeZone.setDefault(savedZone);
  321. }
  322. /**
  323. * Creates a timeline from 9am on Thursday 25 March 2004 to 5pm on
  324. * Tuesday 30 March 2004, for the UK locale.
  325. *
  326. * @return A timeline.
  327. */
  328. private SegmentedTimeline getTimeline() {
  329. Calendar cal = Calendar.getInstance(Locale.UK);
  330. cal.set(Calendar.YEAR, 2004);
  331. cal.set(Calendar.MONTH, Calendar.MARCH);
  332. cal.set(Calendar.DAY_OF_MONTH, 25);
  333. cal.set(Calendar.HOUR_OF_DAY, 9);
  334. cal.set(Calendar.MINUTE, 0);
  335. cal.set(Calendar.SECOND, 0);
  336. cal.set(Calendar.MILLISECOND, 0);
  337. Date from = cal.getTime();
  338. cal = Calendar.getInstance(Locale.UK);
  339. cal.set(Calendar.YEAR, 2004);
  340. cal.set(Calendar.MONTH, Calendar.MARCH);
  341. cal.set(Calendar.DAY_OF_MONTH, 30);
  342. cal.set(Calendar.HOUR_OF_DAY, 17);
  343. cal.set(Calendar.MINUTE, 30);
  344. cal.set(Calendar.SECOND, 0);
  345. cal.set(Calendar.MILLISECOND, 0);
  346. Date to = cal.getTime();
  347. return getTimeline(from, to);
  348. }
  349. /**
  350. * Returns a segmented timeline for 15 minute segments, Monday to Friday
  351. * only, between 9am and 5pm. The UK locale is used.
  352. *
  353. * @param start the start date.
  354. * @param end the end date.
  355. *
  356. * @return The timeline.
  357. */
  358. private SegmentedTimeline getTimeline(Date start, Date end) {
  359. Calendar cal = Calendar.getInstance(Locale.UK);
  360. cal.set(Calendar.YEAR, 1970);
  361. cal.set(Calendar.MONTH, Calendar.JANUARY);
  362. cal.set(Calendar.DAY_OF_MONTH, 1);
  363. cal.set(Calendar.HOUR_OF_DAY, 9);
  364. cal.set(Calendar.MINUTE, 0);
  365. cal.set(Calendar.SECOND, 0);
  366. cal.set(Calendar.MILLISECOND, 0);
  367. Date open = cal.getTime();
  368. cal = Calendar.getInstance(Locale.UK);
  369. cal.set(Calendar.YEAR, 1970);
  370. cal.set(Calendar.MONTH, Calendar.JANUARY);
  371. cal.set(Calendar.DAY_OF_MONTH, 1);
  372. cal.set(Calendar.HOUR_OF_DAY, 17);
  373. cal.set(Calendar.MINUTE, 30);
  374. cal.set(Calendar.SECOND, 0);
  375. cal.set(Calendar.MILLISECOND, 0);
  376. Date close = cal.getTime();
  377. SegmentedTimeline result = null;
  378. // Create a segmented time line (segment size : 15 minutes)
  379. long quarterHourCount = (close.getTime() - open.getTime())
  380. / SegmentedTimeline.FIFTEEN_MINUTE_SEGMENT_SIZE;
  381. long totalQuarterHourCount = SegmentedTimeline.DAY_SEGMENT_SIZE
  382. / SegmentedTimeline.FIFTEEN_MINUTE_SEGMENT_SIZE;
  383. result = new SegmentedTimeline(
  384. SegmentedTimeline.FIFTEEN_MINUTE_SEGMENT_SIZE,
  385. (int) quarterHourCount,
  386. (int) (totalQuarterHourCount - quarterHourCount)
  387. );
  388. result.setAdjustForDaylightSaving(true);
  389. // Set start time
  390. result.setStartTime(start.getTime());
  391. // Saturday and Sundays are non business hours
  392. result.setBaseTimeline(
  393. SegmentedTimeline.newMondayThroughFridayTimeline()
  394. );
  395. /* PUT exclusions in test */
  396. if (start != null && end != null) {
  397. result.addBaseTimelineExclusions(start.getTime(), end.getTime());
  398. }
  399. return result;
  400. }
  401. }