You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TestDataFormatter.java 27KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. /* ====================================================================
  2. Licensed to the Apache Software Foundation (ASF) under one or more
  3. contributor license agreements. See the NOTICE file distributed with
  4. this work for additional information regarding copyright ownership.
  5. The ASF licenses this file to You under the Apache License, Version 2.0
  6. (the "License"); you may not use this file except in compliance with
  7. the License. You may obtain a copy of the License at
  8. http://www.apache.org/licenses/LICENSE-2.0
  9. Unless required by applicable law or agreed to in writing, software
  10. distributed under the License is distributed on an "AS IS" BASIS,
  11. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. See the License for the specific language governing permissions and
  13. limitations under the License.
  14. 2012 - Alfresco Software, Ltd.
  15. Alfresco Software has modified source of this file
  16. The details of changes as svn diff can be found in svn at location root/projects/3rd-party/src
  17. ==================================================================== */
  18. package org.apache.poi.ss.usermodel;
  19. import java.text.DateFormat;
  20. import java.util.Calendar;
  21. import java.util.Date;
  22. import java.util.Locale;
  23. import junit.framework.TestCase;
  24. import org.apache.poi.hssf.usermodel.TestHSSFDataFormatter;
  25. /**
  26. * Tests of {@link DataFormatter}
  27. *
  28. * See {@link TestHSSFDataFormatter} too for
  29. * more tests.
  30. */
  31. public class TestDataFormatter extends TestCase {
  32. /**
  33. * Test that we use the specified locale when deciding
  34. * how to format normal numbers
  35. */
  36. public void testLocale() {
  37. DataFormatter dfUS = new DataFormatter(Locale.US);
  38. DataFormatter dfFR = new DataFormatter(Locale.FRENCH);
  39. assertEquals("1234", dfUS.formatRawCellContents(1234, -1, "@"));
  40. assertEquals("1234", dfFR.formatRawCellContents(1234, -1, "@"));
  41. assertEquals("12.34", dfUS.formatRawCellContents(12.34, -1, "@"));
  42. assertEquals("12,34", dfFR.formatRawCellContents(12.34, -1, "@"));
  43. }
  44. /**
  45. * At the moment, we don't decode the locale strings into
  46. * a specific locale, but we should format things as if
  47. * the locale (eg '[$-1010409]') isn't there
  48. */
  49. public void testLocaleBasedFormats() {
  50. DataFormatter dfUS = new DataFormatter(Locale.US);
  51. // Standard formats
  52. assertEquals("63", dfUS.formatRawCellContents(63.0, -1, "[$-1010409]General"));
  53. assertEquals("63", dfUS.formatRawCellContents(63.0, -1, "[$-1010409]@"));
  54. // Regular numeric style formats
  55. assertEquals("63", dfUS.formatRawCellContents(63.0, -1, "[$-1010409]##"));
  56. assertEquals("63", dfUS.formatRawCellContents(63.0, -1, "[$-1010409]00"));
  57. }
  58. /**
  59. * Ensure that colours get correctly
  60. * zapped from within the format strings
  61. */
  62. public void testColours() {
  63. DataFormatter dfUS = new DataFormatter(Locale.US);
  64. String[] formats = new String[] {
  65. "##.##",
  66. "[WHITE]##.##",
  67. "[BLACK]##.##;[RED]-##.##",
  68. "[COLOR11]##.##;[COLOR 43]-##.00",
  69. };
  70. for(String format : formats) {
  71. assertEquals(
  72. "Wrong format for: " + format,
  73. "12.34",
  74. dfUS.formatRawCellContents(12.343, -1, format)
  75. );
  76. assertEquals(
  77. "Wrong format for: " + format,
  78. "-12.34",
  79. dfUS.formatRawCellContents(-12.343, -1, format)
  80. );
  81. }
  82. // Ensure that random square brackets remain
  83. assertEquals("12.34[a]", dfUS.formatRawCellContents(12.343, -1, "##.##[a]"));
  84. assertEquals("[ab]12.34[x]", dfUS.formatRawCellContents(12.343, -1, "[ab]##.##[x]"));
  85. }
  86. public void testColoursAndBrackets() {
  87. DataFormatter dfUS = new DataFormatter(Locale.US);
  88. // Without currency symbols
  89. String[] formats = new String[] {
  90. "#,##0.00;[Blue](#,##0.00)",
  91. };
  92. for(String format : formats) {
  93. assertEquals(
  94. "Wrong format for: " + format,
  95. "12.34",
  96. dfUS.formatRawCellContents(12.343, -1, format)
  97. );
  98. assertEquals(
  99. "Wrong format for: " + format,
  100. "(12.34)",
  101. dfUS.formatRawCellContents(-12.343, -1, format)
  102. );
  103. }
  104. // With
  105. formats = new String[] {
  106. "$#,##0.00;[Red]($#,##0.00)"
  107. };
  108. for(String format : formats) {
  109. assertEquals(
  110. "Wrong format for: " + format,
  111. "$12.34",
  112. dfUS.formatRawCellContents(12.343, -1, format)
  113. );
  114. assertEquals(
  115. "Wrong format for: " + format,
  116. "($12.34)",
  117. dfUS.formatRawCellContents(-12.343, -1, format)
  118. );
  119. }
  120. }
  121. /**
  122. * Test how we handle negative and zeros.
  123. * Note - some tests are disabled as DecimalFormat
  124. * and Excel differ, and workarounds are not
  125. * yet in place for all of these
  126. */
  127. public void testNegativeZero() {
  128. DataFormatter dfUS = new DataFormatter(Locale.US);
  129. String all2dp = "00.00";
  130. String alln1dp = "(00.0)";
  131. String p1dp_n1dp = "00.0;(00.0)";
  132. String p2dp_n1dp = "00.00;(00.0)";
  133. String p2dp_n1dp_z0 = "00.00;(00.0);0";
  134. String all2dpTSP = "00.00_x";
  135. String p2dp_n2dpTSP = "00.00_x;(00.00)_x";
  136. String p2dp_n1dpTSP = "00.00_x;(00.0)_x";
  137. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, all2dp));
  138. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, p2dp_n1dp));
  139. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, p2dp_n1dp_z0));
  140. assertEquals("(12.3)", dfUS.formatRawCellContents(12.343, -1, alln1dp));
  141. assertEquals("-(12.3)", dfUS.formatRawCellContents(-12.343, -1, alln1dp));
  142. assertEquals("12.3", dfUS.formatRawCellContents(12.343, -1, p1dp_n1dp));
  143. assertEquals("(12.3)", dfUS.formatRawCellContents(-12.343, -1, p1dp_n1dp));
  144. assertEquals("-12.34", dfUS.formatRawCellContents(-12.343, -1, all2dp));
  145. // TODO - fix case of negative subpattern differing from the
  146. // positive one by more than just the prefix+suffix, which
  147. // is all DecimalFormat supports...
  148. // assertEquals("(12.3)", dfUS.formatRawCellContents(-12.343, -1, p2dp_n1dp));
  149. // assertEquals("(12.3)", dfUS.formatRawCellContents(-12.343, -1, p2dp_n1dp_z0));
  150. assertEquals("00.00", dfUS.formatRawCellContents(0, -1, all2dp));
  151. assertEquals("00.00", dfUS.formatRawCellContents(0, -1, p2dp_n1dp));
  152. assertEquals("0", dfUS.formatRawCellContents(0, -1, p2dp_n1dp_z0));
  153. // Spaces are skipped
  154. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, all2dpTSP));
  155. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, p2dp_n2dpTSP));
  156. assertEquals("(12.34)", dfUS.formatRawCellContents(-12.343, -1, p2dp_n2dpTSP));
  157. // assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, p2dp_n1dpTSP));
  158. // assertEquals("(12.3)", dfUS.formatRawCellContents(-12.343, -1, p2dp_n1dpTSP));
  159. }
  160. /**
  161. * Test that we correctly handle fractions in the
  162. * format string, eg # #/#
  163. */
  164. public void testFractions() {
  165. DataFormatter dfUS = new DataFormatter(Locale.US);
  166. // Excel often prefers "# #/#"
  167. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "# #/#"));
  168. assertEquals("321 26/81", dfUS.formatRawCellContents(321.321, -1, "# #/##"));
  169. assertEquals("26027/81", dfUS.formatRawCellContents(321.321, -1, "#/##"));
  170. // OOo seems to like the "# ?/?" form
  171. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "# ?/?"));
  172. assertEquals("321 26/81", dfUS.formatRawCellContents(321.321, -1, "# ?/??"));
  173. assertEquals("26027/81", dfUS.formatRawCellContents(321.321, -1, "?/??"));
  174. // p;n;z;s parts
  175. assertEquals( "321 1/3", dfUS.formatRawCellContents(321.321, -1, "# #/#;# ##/#;0;xxx"));
  176. assertEquals("-321 1/3", dfUS.formatRawCellContents(-321.321, -1, "# #/#;# ##/#;0;xxx"));
  177. assertEquals("0", dfUS.formatRawCellContents(0, -1, "# #/#;# ##/#;0;xxx"));
  178. // assertEquals("0.0", dfUS.formatRawCellContents(0, -1, "# #/#;# ##/#;#.#;xxx")); // currently hard coded to 0
  179. // Custom formats with text are not currently supported
  180. // assertEquals("+ve", dfUS.formatRawCellContents(0, -1, "+ve;-ve;zero;xxx"));
  181. // assertEquals("-ve", dfUS.formatRawCellContents(0, -1, "-ve;-ve;zero;xxx"));
  182. // assertEquals("zero", dfUS.formatRawCellContents(0, -1, "zero;-ve;zero;xxx"));
  183. // Custom formats - check text is stripped, including multiple spaces
  184. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "# #/#"));
  185. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "#\" \" #/#"));
  186. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "#\"FRED\" #/#"));
  187. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "#\\ #/#"));
  188. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "# \\q#/#"));
  189. // Cases that were very slow
  190. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "0\" \"?/?;?/?")); // 0" "?/?;?/? - length of -ve part was used
  191. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "0 \"#\"\\#\\#?/?")); // 0 "#"\#\#?/? - length of text was used
  192. assertEquals("321 295/919", dfUS.formatRawCellContents(321.321, -1, "# #/###"));
  193. assertEquals("321 321/1000", dfUS.formatRawCellContents(321.321, -1, "# #/####")); // Code limits to #### as that is as slow as we want to get
  194. assertEquals("321 321/1000", dfUS.formatRawCellContents(321.321, -1, "# #/##########"));
  195. // Not a valid fraction formats (too many #/# or ?/?) - hence the strange expected results
  196. /* assertEquals("321 / ?/?", dfUS.formatRawCellContents(321.321, -1, "# #/# ?/?"));
  197. assertEquals("321 / /", dfUS.formatRawCellContents(321.321, -1, "# #/# #/#"));
  198. assertEquals("321 ?/? ?/?", dfUS.formatRawCellContents(321.321, -1, "# ?/? ?/?"));
  199. assertEquals("321 ?/? / /", dfUS.formatRawCellContents(321.321, -1, "# ?/? #/# #/#"));
  200. */
  201. //Bug54686 patch sets default behavior of # #/## if there is a failure to parse
  202. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "# #/# ?/?"));
  203. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "# #/# #/#"));
  204. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "# ?/? ?/?"));
  205. assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "# ?/? #/# #/#"));
  206. // Where both p and n don't include a fraction, so cannot always be formatted
  207. // assertEquals("123", dfUS.formatRawCellContents(-123.321, -1, "0 ?/?;0"));
  208. //Bug54868 patch has a hit on the first string before the ";"
  209. assertEquals("-123 1/3", dfUS.formatRawCellContents(-123.321, -1, "0 ?/?;0"));
  210. }
  211. /**
  212. * Test that _x (blank with the space taken by "x")
  213. * and *x (fill to the column width with "x"s) are
  214. * correctly ignored by us.
  215. */
  216. public void testPaddingSpaces() {
  217. DataFormatter dfUS = new DataFormatter(Locale.US);
  218. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, "##.##_ "));
  219. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, "##.##_1"));
  220. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, "##.##_)"));
  221. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, "_-##.##"));
  222. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, "##.##* "));
  223. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, "##.##*1"));
  224. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, "##.##*)"));
  225. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, "*-##.##"));
  226. }
  227. /**
  228. * DataFormatter is the CSV mode preserves spaces
  229. */
  230. public void testPaddingSpacesCSV() {
  231. DataFormatter dfUS = new DataFormatter(Locale.US, true);
  232. assertEquals("12.34 ", dfUS.formatRawCellContents(12.343, -1, "##.##_ "));
  233. assertEquals("-12.34 ", dfUS.formatRawCellContents(-12.343, -1, "##.##_ "));
  234. assertEquals(". ", dfUS.formatRawCellContents(0.0, -1, "##.##_ "));
  235. assertEquals("12.34 ", dfUS.formatRawCellContents(12.343, -1, "##.##_1"));
  236. assertEquals("-12.34 ", dfUS.formatRawCellContents(-12.343, -1, "##.##_1"));
  237. assertEquals(". ", dfUS.formatRawCellContents(0.0, -1, "##.##_1"));
  238. assertEquals("12.34 ", dfUS.formatRawCellContents(12.343, -1, "##.##_)"));
  239. assertEquals("-12.34 ", dfUS.formatRawCellContents(-12.343, -1, "##.##_)"));
  240. assertEquals(". ", dfUS.formatRawCellContents(0.0, -1, "##.##_)"));
  241. assertEquals(" 12.34", dfUS.formatRawCellContents(12.343, -1, "_-##.##"));
  242. assertEquals("- 12.34", dfUS.formatRawCellContents(-12.343, -1, "_-##.##"));
  243. assertEquals(" .", dfUS.formatRawCellContents(0.0, -1, "_-##.##"));
  244. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, "##.##* "));
  245. assertEquals("-12.34", dfUS.formatRawCellContents(-12.343, -1, "##.##* "));
  246. assertEquals(".", dfUS.formatRawCellContents(0.0, -1, "##.##* "));
  247. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, "##.##*1"));
  248. assertEquals("-12.34", dfUS.formatRawCellContents(-12.343, -1, "##.##*1"));
  249. assertEquals(".", dfUS.formatRawCellContents(0.0, -1, "##.##*1"));
  250. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, "##.##*)"));
  251. assertEquals("-12.34", dfUS.formatRawCellContents(-12.343, -1, "##.##*)"));
  252. assertEquals(".", dfUS.formatRawCellContents(0.0, -1, "##.##*)"));
  253. assertEquals("12.34", dfUS.formatRawCellContents(12.343, -1, "*-##.##"));
  254. assertEquals("-12.34", dfUS.formatRawCellContents(-12.343, -1, "*-##.##"));
  255. assertEquals(".", dfUS.formatRawCellContents(0.0, -1, "*-##.##"));
  256. }
  257. /**
  258. * Test that the special Excel month format MMMMM
  259. * gets turned into the first letter of the month
  260. */
  261. public void testMMMMM() {
  262. DataFormatter dfUS = new DataFormatter(Locale.US);
  263. Calendar c = Calendar.getInstance();
  264. c.set(Calendar.MILLISECOND, 0);
  265. c.set(2010, 5, 1, 2, 0, 0);
  266. assertEquals("2010-J-1 2:00:00", dfUS.formatRawCellContents(
  267. DateUtil.getExcelDate(c, false), -1, "YYYY-MMMMM-D h:mm:ss"
  268. ));
  269. }
  270. /**
  271. * Tests that we do AM/PM handling properly
  272. */
  273. public void testAMPM() {
  274. DataFormatter dfUS = new DataFormatter(Locale.US);
  275. assertEquals("06:00", dfUS.formatRawCellContents(0.25, -1, "hh:mm"));
  276. assertEquals("18:00", dfUS.formatRawCellContents(0.75, -1, "hh:mm"));
  277. assertEquals("06:00 AM", dfUS.formatRawCellContents(0.25, -1, "hh:mm AM/PM"));
  278. assertEquals("06:00 PM", dfUS.formatRawCellContents(0.75, -1, "hh:mm AM/PM"));
  279. assertEquals("1904-01-01 06:00:00 AM", dfUS.formatRawCellContents(0.25, -1, "yyyy-mm-dd hh:mm:ss AM/PM", true));
  280. assertEquals("1904-01-01 06:00:00 PM", dfUS.formatRawCellContents(0.75, -1, "yyyy-mm-dd hh:mm:ss AM/PM", true));
  281. }
  282. /**
  283. * Test that we can handle elapsed time,
  284. * eg formatting 1 day 4 hours as 28 hours
  285. */
  286. public void testElapsedTime() {
  287. DataFormatter dfUS = new DataFormatter(Locale.US);
  288. double hour = 1.0/24.0;
  289. assertEquals("01:00", dfUS.formatRawCellContents(1*hour, -1, "hh:mm"));
  290. assertEquals("05:00", dfUS.formatRawCellContents(5*hour, -1, "hh:mm"));
  291. assertEquals("20:00", dfUS.formatRawCellContents(20*hour, -1, "hh:mm"));
  292. assertEquals("23:00", dfUS.formatRawCellContents(23*hour, -1, "hh:mm"));
  293. assertEquals("00:00", dfUS.formatRawCellContents(24*hour, -1, "hh:mm"));
  294. assertEquals("02:00", dfUS.formatRawCellContents(26*hour, -1, "hh:mm"));
  295. assertEquals("20:00", dfUS.formatRawCellContents(44*hour, -1, "hh:mm"));
  296. assertEquals("02:00", dfUS.formatRawCellContents(50*hour, -1, "hh:mm"));
  297. assertEquals("01:00", dfUS.formatRawCellContents(1*hour, -1, "[hh]:mm"));
  298. assertEquals("05:00", dfUS.formatRawCellContents(5*hour, -1, "[hh]:mm"));
  299. assertEquals("20:00", dfUS.formatRawCellContents(20*hour, -1, "[hh]:mm"));
  300. assertEquals("23:00", dfUS.formatRawCellContents(23*hour, -1, "[hh]:mm"));
  301. assertEquals("24:00", dfUS.formatRawCellContents(24*hour, -1, "[hh]:mm"));
  302. assertEquals("26:00", dfUS.formatRawCellContents(26*hour, -1, "[hh]:mm"));
  303. assertEquals("44:00", dfUS.formatRawCellContents(44*hour, -1, "[hh]:mm"));
  304. assertEquals("50:00", dfUS.formatRawCellContents(50*hour, -1, "[hh]:mm"));
  305. assertEquals("01", dfUS.formatRawCellContents(1*hour, -1, "[hh]"));
  306. assertEquals("05", dfUS.formatRawCellContents(5*hour, -1, "[hh]"));
  307. assertEquals("20", dfUS.formatRawCellContents(20*hour, -1, "[hh]"));
  308. assertEquals("23", dfUS.formatRawCellContents(23*hour, -1, "[hh]"));
  309. assertEquals("24", dfUS.formatRawCellContents(24*hour, -1, "[hh]"));
  310. assertEquals("26", dfUS.formatRawCellContents(26*hour, -1, "[hh]"));
  311. assertEquals("44", dfUS.formatRawCellContents(44*hour, -1, "[hh]"));
  312. assertEquals("50", dfUS.formatRawCellContents(50*hour, -1, "[hh]"));
  313. double minute = 1.0/24.0/60.0;
  314. assertEquals("01:00", dfUS.formatRawCellContents(1*minute, -1, "[mm]:ss"));
  315. assertEquals("05:00", dfUS.formatRawCellContents(5*minute, -1, "[mm]:ss"));
  316. assertEquals("20:00", dfUS.formatRawCellContents(20*minute, -1, "[mm]:ss"));
  317. assertEquals("23:00", dfUS.formatRawCellContents(23*minute, -1, "[mm]:ss"));
  318. assertEquals("24:00", dfUS.formatRawCellContents(24*minute, -1, "[mm]:ss"));
  319. assertEquals("26:00", dfUS.formatRawCellContents(26*minute, -1, "[mm]:ss"));
  320. assertEquals("44:00", dfUS.formatRawCellContents(44*minute, -1, "[mm]:ss"));
  321. assertEquals("50:00", dfUS.formatRawCellContents(50*minute, -1, "[mm]:ss"));
  322. assertEquals("59:00", dfUS.formatRawCellContents(59*minute, -1, "[mm]:ss"));
  323. assertEquals("60:00", dfUS.formatRawCellContents(60*minute, -1, "[mm]:ss"));
  324. assertEquals("61:00", dfUS.formatRawCellContents(61*minute, -1, "[mm]:ss"));
  325. assertEquals("119:00", dfUS.formatRawCellContents(119*minute, -1, "[mm]:ss"));
  326. assertEquals("120:00", dfUS.formatRawCellContents(120*minute, -1, "[mm]:ss"));
  327. assertEquals("121:00", dfUS.formatRawCellContents(121*minute, -1, "[mm]:ss"));
  328. assertEquals("01", dfUS.formatRawCellContents(1*minute, -1, "[mm]"));
  329. assertEquals("05", dfUS.formatRawCellContents(5*minute, -1, "[mm]"));
  330. assertEquals("20", dfUS.formatRawCellContents(20*minute, -1, "[mm]"));
  331. assertEquals("23", dfUS.formatRawCellContents(23*minute, -1, "[mm]"));
  332. assertEquals("24", dfUS.formatRawCellContents(24*minute, -1, "[mm]"));
  333. assertEquals("26", dfUS.formatRawCellContents(26*minute, -1, "[mm]"));
  334. assertEquals("44", dfUS.formatRawCellContents(44*minute, -1, "[mm]"));
  335. assertEquals("50", dfUS.formatRawCellContents(50*minute, -1, "[mm]"));
  336. assertEquals("59", dfUS.formatRawCellContents(59*minute, -1, "[mm]"));
  337. assertEquals("60", dfUS.formatRawCellContents(60*minute, -1, "[mm]"));
  338. assertEquals("61", dfUS.formatRawCellContents(61*minute, -1, "[mm]"));
  339. assertEquals("119", dfUS.formatRawCellContents(119*minute, -1, "[mm]"));
  340. assertEquals("120", dfUS.formatRawCellContents(120*minute, -1, "[mm]"));
  341. assertEquals("121", dfUS.formatRawCellContents(121*minute, -1, "[mm]"));
  342. double second = 1.0/24.0/60.0/60.0;
  343. assertEquals("86400", dfUS.formatRawCellContents(86400*second, -1, "[ss]"));
  344. assertEquals("01", dfUS.formatRawCellContents(1*second, -1, "[ss]"));
  345. assertEquals("05", dfUS.formatRawCellContents(5*second, -1, "[ss]"));
  346. assertEquals("20", dfUS.formatRawCellContents(20*second, -1, "[ss]"));
  347. assertEquals("23", dfUS.formatRawCellContents(23*second, -1, "[ss]"));
  348. assertEquals("24", dfUS.formatRawCellContents(24*second, -1, "[ss]"));
  349. assertEquals("26", dfUS.formatRawCellContents(26*second, -1, "[ss]"));
  350. assertEquals("44", dfUS.formatRawCellContents(44*second, -1, "[ss]"));
  351. assertEquals("50", dfUS.formatRawCellContents(50*second, -1, "[ss]"));
  352. assertEquals("59", dfUS.formatRawCellContents(59*second, -1, "[ss]"));
  353. assertEquals("60", dfUS.formatRawCellContents(60*second, -1, "[ss]"));
  354. assertEquals("61", dfUS.formatRawCellContents(61*second, -1, "[ss]"));
  355. assertEquals("119", dfUS.formatRawCellContents(119*second, -1, "[ss]"));
  356. assertEquals("120", dfUS.formatRawCellContents(120*second, -1, "[ss]"));
  357. assertEquals("121", dfUS.formatRawCellContents(121*second, -1, "[ss]"));
  358. boolean jdk_1_5 = System.getProperty("java.vm.version").startsWith("1.5");
  359. if(!jdk_1_5) {
  360. // YK: the tests below were written under JDK 1.6 and assume that
  361. // the rounding mode in the underlying decimal formatters is HALF_UP
  362. // It is not so JDK 1.5 where the default rounding mode is HALV_EVEN and cannot be changed.
  363. assertEquals("27:18:08", dfUS.formatRawCellContents(1.1376, -1, "[h]:mm:ss"));
  364. assertEquals("28:48:00", dfUS.formatRawCellContents(1.2, -1, "[h]:mm:ss"));
  365. assertEquals("29:31:12", dfUS.formatRawCellContents(1.23, -1, "[h]:mm:ss"));
  366. assertEquals("31:26:24", dfUS.formatRawCellContents(1.31, -1, "[h]:mm:ss"));
  367. assertEquals("27:18:08", dfUS.formatRawCellContents(1.1376, -1, "[hh]:mm:ss"));
  368. assertEquals("28:48:00", dfUS.formatRawCellContents(1.2, -1, "[hh]:mm:ss"));
  369. assertEquals("29:31:12", dfUS.formatRawCellContents(1.23, -1, "[hh]:mm:ss"));
  370. assertEquals("31:26:24", dfUS.formatRawCellContents(1.31, -1, "[hh]:mm:ss"));
  371. assertEquals("57:07.2", dfUS.formatRawCellContents(.123, -1, "mm:ss.0;@"));
  372. assertEquals("57:41.8", dfUS.formatRawCellContents(.1234, -1, "mm:ss.0;@"));
  373. assertEquals("57:41.76", dfUS.formatRawCellContents(.1234, -1, "mm:ss.00;@"));
  374. assertEquals("57:41.760", dfUS.formatRawCellContents(.1234, -1, "mm:ss.000;@"));
  375. assertEquals("24:00.0", dfUS.formatRawCellContents(123456.6, -1, "mm:ss.0"));
  376. }
  377. }
  378. public void testDateWindowing() {
  379. DataFormatter dfUS = new DataFormatter(Locale.US);
  380. assertEquals("1899-12-31 00:00:00", dfUS.formatRawCellContents(0.0, -1, "yyyy-mm-dd hh:mm:ss"));
  381. assertEquals("1899-12-31 00:00:00", dfUS.formatRawCellContents(0.0, -1, "yyyy-mm-dd hh:mm:ss", false));
  382. assertEquals("1904-01-01 00:00:00", dfUS.formatRawCellContents(0.0, -1, "yyyy-mm-dd hh:mm:ss", true));
  383. }
  384. public void testScientificNotation() {
  385. DataFormatter dfUS = new DataFormatter(Locale.US);
  386. assertEquals("1.23E+01", dfUS.formatRawCellContents(12.343, -1, "0.00E+00"));
  387. assertEquals("-1.23E+01", dfUS.formatRawCellContents(-12.343, -1, "0.00E+00"));
  388. assertEquals("0.00E+00", dfUS.formatRawCellContents(0.0, -1, "0.00E+00"));
  389. }
  390. public void testInvalidDate() {
  391. DataFormatter df1 = new DataFormatter(Locale.US);
  392. assertEquals("-1.0", df1.formatRawCellContents(-1, -1, "mm/dd/yyyy"));
  393. DataFormatter df2 = new DataFormatter(Locale.US, true);
  394. assertEquals("###############################################################################################################################################################################################################################################################",
  395. df2.formatRawCellContents(-1, -1, "mm/dd/yyyy"));
  396. }
  397. public void testEscapes() {
  398. DataFormatter dfUS = new DataFormatter(Locale.US);
  399. assertEquals("1901-01-01", dfUS.formatRawCellContents(367.0, -1, "yyyy-mm-dd"));
  400. assertEquals("1901-01-01", dfUS.formatRawCellContents(367.0, -1, "yyyy\\-mm\\-dd"));
  401. assertEquals("1901.01.01", dfUS.formatRawCellContents(367.0, -1, "yyyy.mm.dd"));
  402. assertEquals("1901.01.01", dfUS.formatRawCellContents(367.0, -1, "yyyy\\.mm\\.dd"));
  403. assertEquals("1901/01/01", dfUS.formatRawCellContents(367.0, -1, "yyyy/mm/dd"));
  404. assertEquals("1901/01/01", dfUS.formatRawCellContents(367.0, -1, "yyyy\\/mm\\/dd"));
  405. }
  406. public void testOther() {
  407. DataFormatter dfUS = new DataFormatter(Locale.US, true);
  408. assertEquals(" 12.34 ", dfUS.formatRawCellContents(12.34, -1, "_-* #,##0.00_-;-* #,##0.00_-;_-* \"-\"??_-;_-@_-"));
  409. assertEquals("-12.34 ", dfUS.formatRawCellContents(-12.34, -1, "_-* #,##0.00_-;-* #,##0.00_-;_-* \"-\"??_-;_-@_-"));
  410. assertEquals(" - ", dfUS.formatRawCellContents(0.0, -1, "_-* #,##0.00_-;-* #,##0.00_-;_-* \"-\"??_-;_-@_-"));
  411. assertEquals(" $- ", dfUS.formatRawCellContents(0.0, -1, "_-$* #,##0.00_-;-$* #,##0.00_-;_-$* \"-\"??_-;_-@_-"));
  412. }
  413. /**
  414. * TODO Fix these so that they work
  415. */
  416. public void DISABLEDtestCustomFormats() {
  417. DataFormatter dfUS = new DataFormatter(Locale.US, true);
  418. String fmt;
  419. fmt = "\"At\" H:MM AM/PM \"on\" DDDD MMMM D\",\" YYYY";
  420. assertEquals(
  421. "At 4:20 AM on Thursday May 17, 2007",
  422. dfUS.formatRawCellContents(39219.1805636921, -1, fmt)
  423. );
  424. fmt = "0 \"dollars and\" .00 \"cents\"";
  425. assertEquals("19 dollars and .99 cents", dfUS.formatRawCellContents(19.99, -1, fmt));
  426. }
  427. /**
  428. * ExcelStyleDateFormatter should work for Milliseconds too
  429. */
  430. public void testExcelStyleDateFormatterStringOnMillis() {
  431. // Test directly with the .000 style
  432. DateFormat formatter1 = new ExcelStyleDateFormatter("ss.000");
  433. assertEquals("00.001", formatter1.format(new Date(1L)));
  434. assertEquals("00.010", formatter1.format(new Date(10L)));
  435. assertEquals("00.100", formatter1.format(new Date(100L)));
  436. assertEquals("01.000", formatter1.format(new Date(1000L)));
  437. assertEquals("01.001", formatter1.format(new Date(1001L)));
  438. assertEquals("10.000", formatter1.format(new Date(10000L)));
  439. assertEquals("10.001", formatter1.format(new Date(10001L)));
  440. // Test directly with the .SSS style
  441. DateFormat formatter2 = new ExcelStyleDateFormatter("ss.SSS");
  442. assertEquals("00.001", formatter2.format(new Date(1L)));
  443. assertEquals("00.010", formatter2.format(new Date(10L)));
  444. assertEquals("00.100", formatter2.format(new Date(100L)));
  445. assertEquals("01.000", formatter2.format(new Date(1000L)));
  446. assertEquals("01.001", formatter2.format(new Date(1001L)));
  447. assertEquals("10.000", formatter2.format(new Date(10000L)));
  448. assertEquals("10.001", formatter2.format(new Date(10001L)));
  449. // Test via DataFormatter
  450. DataFormatter dfUS = new DataFormatter(Locale.US, true);
  451. assertEquals("01.010", dfUS.formatRawCellContents(0.0000116898, -1, "ss.000"));
  452. }
  453. }