Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

DefaultFunctionsTest.java 29KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. /*
  2. Copyright (c) 2016 James Ahlborn
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package com.healthmarketscience.jackcess.impl.expr;
  14. import java.math.BigDecimal;
  15. import java.time.LocalDateTime;
  16. import java.util.Calendar;
  17. import com.healthmarketscience.jackcess.expr.EvalException;
  18. import junit.framework.TestCase;
  19. import static com.healthmarketscience.jackcess.impl.expr.ExpressionatorTest.eval;
  20. import static com.healthmarketscience.jackcess.impl.expr.ExpressionatorTest.toBD;
  21. /**
  22. *
  23. * @author James Ahlborn
  24. */
  25. public class DefaultFunctionsTest extends TestCase
  26. {
  27. public DefaultFunctionsTest(String name) {
  28. super(name);
  29. }
  30. public void testFuncs() throws Exception
  31. {
  32. assertEval("foo", "=IIf(10 > 1, \"foo\", \"bar\")");
  33. assertEval("bar", "=IIf(10 < 1, \"foo\", \"bar\")");
  34. assertEval(102, "=Asc(\"foo\")");
  35. assertEval(9786, "=AscW(\"\u263A\")");
  36. assertEval("f", "=Chr(102)");
  37. assertEval("\u263A", "=ChrW(9786)");
  38. assertEval("263A", "=Hex(9786)");
  39. assertEval("blah", "=Nz(\"blah\")");
  40. assertEval("", "=Nz(Null)");
  41. assertEval("blah", "=Nz(\"blah\",\"FOO\")");
  42. assertEval("FOO", "=Nz(Null,\"FOO\")");
  43. assertEval("23072", "=Oct(9786)");
  44. assertEval(" 9786", "=Str(9786)");
  45. assertEval("-42", "=Str(-42)");
  46. assertEval("-42", "=Str$(-42)");
  47. assertNull(eval("=Str(Null)"));
  48. try {
  49. eval("=Str$(Null)");
  50. fail("EvalException should have been thrown");
  51. } catch(EvalException expected) {
  52. // success
  53. }
  54. assertEval(-1, "=CBool(\"1\")");
  55. assertEval(13, "=CByte(\"13\")");
  56. assertEval(14, "=CByte(\"13.7\")");
  57. assertEval(new BigDecimal("57.1235"), "=CCur(\"57.12346\")");
  58. assertEval(new Double("57.12345"), "=CDbl(\"57.12345\")");
  59. assertEval(new BigDecimal("57.123456789"), "=CDec(\"57.123456789\")");
  60. assertEval(513, "=CInt(\"513\")");
  61. assertEval(514, "=CInt(\"513.7\")");
  62. assertEval(345513, "=CLng(\"345513\")");
  63. assertEval(345514, "=CLng(\"345513.7\")");
  64. assertEquals(new Float("57.12345").doubleValue(),
  65. eval("=CSng(\"57.12345\")"));
  66. assertEval("9786", "=CStr(9786)");
  67. assertEval("-42", "=CStr(-42)");
  68. assertEval(LocalDateTime.of(2003,1,2,0,0), "=CDate('01/02/2003')");
  69. assertEval(LocalDateTime.of(2003,1,2,7,0), "=CDate('01/02/2003 7:00:00 AM')");
  70. assertEval(LocalDateTime.of(1908,3,31,10,48), "=CDate(3013.45)");
  71. assertEval(-1, "=IsNull(Null)");
  72. assertEval(0, "=IsNull(13)");
  73. assertEval(-1, "=IsDate(#01/02/2003#)");
  74. assertEval(0, "=IsDate('foo')");
  75. assertEval(0, "=IsDate('200')");
  76. assertEval(0, "=IsNumeric(Null)");
  77. assertEval(0, "=IsNumeric('foo')");
  78. assertEval(0, "=IsNumeric(#01/02/2003#)");
  79. assertEval(0, "=IsNumeric('01/02/2003')");
  80. assertEval(-1, "=IsNumeric(37)");
  81. assertEval(-1, "=IsNumeric(' 37 ')");
  82. assertEval(-1, "=IsNumeric(' -37.5e2 ')");
  83. assertEval(-1, "=IsNumeric(' &H37 ')");
  84. assertEval(0, "=IsNumeric(' &H37foo ')");
  85. assertEval(0, "=IsNumeric(' &o39 ')");
  86. assertEval(-1, "=IsNumeric(' &o36 ')");
  87. assertEval(0, "=IsNumeric(' &o36.1 ')");
  88. assertEval(1, "=VarType(Null)");
  89. assertEval(8, "=VarType('blah')");
  90. assertEval(7, "=VarType(#01/02/2003#)");
  91. assertEval(3, "=VarType(42)");
  92. assertEval(5, "=VarType(CDbl(42))");
  93. assertEval(14, "=VarType(42.3)");
  94. assertEval("Null", "=TypeName(Null)");
  95. assertEval("String", "=TypeName('blah')");
  96. assertEval("Date", "=TypeName(#01/02/2003#)");
  97. assertEval("Long", "=TypeName(42)");
  98. assertEval("Double", "=TypeName(CDbl(42))");
  99. assertEval("Decimal", "=TypeName(42.3)");
  100. assertEval(2, "=InStr('AFOOBAR', 'FOO')");
  101. assertEval(2, "=InStr('AFOOBAR', 'foo')");
  102. assertEval(2, "=InStr(1, 'AFOOBAR', 'foo')");
  103. assertEval(0, "=InStr(1, 'AFOOBAR', 'foo', 0)");
  104. assertEval(2, "=InStr(1, 'AFOOBAR', 'foo', 1)");
  105. assertEval(2, "=InStr(1, 'AFOOBAR', 'FOO', 0)");
  106. assertEval(2, "=InStr(2, 'AFOOBAR', 'FOO')");
  107. assertEval(0, "=InStr(3, 'AFOOBAR', 'FOO')");
  108. assertEval(0, "=InStr(17, 'AFOOBAR', 'FOO')");
  109. assertEval(2, "=InStr(1, 'AFOOBARFOOBAR', 'FOO')");
  110. assertEval(8, "=InStr(3, 'AFOOBARFOOBAR', 'FOO')");
  111. assertNull(eval("=InStr(3, Null, 'FOO')"));
  112. assertEval(2, "=InStrRev('AFOOBAR', 'FOO')");
  113. assertEval(2, "=InStrRev('AFOOBAR', 'foo')");
  114. assertEval(2, "=InStrRev('AFOOBAR', 'foo', -1)");
  115. assertEval(0, "=InStrRev('AFOOBAR', 'foo', -1, 0)");
  116. assertEval(2, "=InStrRev('AFOOBAR', 'foo', -1, 1)");
  117. assertEval(2, "=InStrRev('AFOOBAR', 'FOO', -1, 0)");
  118. assertEval(2, "=InStrRev('AFOOBAR', 'FOO', 4)");
  119. assertEval(0, "=InStrRev('AFOOBAR', 'FOO', 3)");
  120. assertEval(2, "=InStrRev('AFOOBAR', 'FOO', 17)");
  121. assertEval(2, "=InStrRev('AFOOBARFOOBAR', 'FOO', 9)");
  122. assertEval(8, "=InStrRev('AFOOBARFOOBAR', 'FOO', 10)");
  123. assertNull(eval("=InStrRev(Null, 'FOO', 3)"));
  124. assertEval("FOOO", "=UCase(\"fOoO\")");
  125. assertEval("fooo", "=LCase(\"fOoO\")");
  126. assertEval(" FOO \" BAR ", "=UCase(\" foo \"\" bar \")");
  127. assertEval("bl", "=Left(\"blah\", 2)");
  128. assertEval("", "=Left(\"blah\", 0)");
  129. assertEval("blah", "=Left(\"blah\", 17)");
  130. assertEval("la", "=Mid(\"blah\", 2, 2)");
  131. assertEval("ah", "=Right(\"blah\", 2)");
  132. assertEval("", "=Right(\"blah\", 0)");
  133. assertEval("blah", "=Right(\"blah\", 17)");
  134. assertEval("blah ", "=LTrim(\" blah \")");
  135. assertEval(" blah", "=RTrim(\" blah \")");
  136. assertEval("blah", "=Trim(\" blah \")");
  137. assertEval(" ", "=Space(3)");
  138. assertEval("ddd", "=String(3,'d')");
  139. assertEval(1, "=StrComp('FOO', 'bar')");
  140. assertEval(-1, "=StrComp('bar', 'FOO')");
  141. assertEval(0, "=StrComp('FOO', 'foo')");
  142. assertEval(-1, "=StrComp('FOO', 'bar', 0)");
  143. assertEval(1, "=StrComp('bar', 'FOO', 0)");
  144. assertEval(-1, "=StrComp('FOO', 'foo', 0)");
  145. assertEval("FOO", "=StrConv('foo', 1)");
  146. assertEval("foo", "=StrConv('foo', 2)");
  147. assertEval("foo", "=StrConv('FOO', 2)");
  148. assertEval("Foo Bar", "=StrConv('FOO bar', 3)");
  149. assertEval("halb", "=StrReverse('blah')");
  150. assertEval("foo", "=Choose(1,'foo','bar','blah')");
  151. assertEval(null, "=Choose(-1,'foo','bar','blah')");
  152. assertEval("blah", "=Choose(3,'foo','bar','blah')");
  153. assertEval(null, "=Switch(False,'foo', False, 'bar', False, 'blah')");
  154. assertEval("bar", "=Switch(False,'foo', True, 'bar', True, 'blah')");
  155. assertEval("blah", "=Switch(False,'foo', False, 'bar', True, 'blah')");
  156. try {
  157. eval("=StrReverse('blah', 1)");
  158. fail("EvalException should have been thrown");
  159. } catch(EvalException e) {
  160. assertTrue(e.getMessage().contains("Invalid function call"));
  161. }
  162. try {
  163. eval("=StrReverse()");
  164. fail("EvalException should have been thrown");
  165. } catch(EvalException e) {
  166. assertTrue(e.getMessage().contains("Invalid function call"));
  167. }
  168. assertEval(1615198d, "=Val(' 1615 198th Street N.E.')");
  169. assertEval(-1d, "=Val(' &HFFFFwhatever')");
  170. assertEval(131071d, "=Val(' &H1FFFFwhatever')");
  171. assertEval(-1d, "=Val(' &HFFFFFFFFwhatever')");
  172. assertEval(291d, "=Val(' &H123whatever')");
  173. assertEval(83d, "=Val(' &O123whatever')");
  174. assertEval(1.23d, "=Val(' 1 2 3 e -2 whatever')");
  175. assertEval(0d, "=Val(' whatever123 ')");
  176. assertEval(0d, "=Val('')");
  177. assertEval("faa", "=Replace('foo','o','a')");
  178. assertEval("faa", "=Replace('fOo','o','a')");
  179. assertEval("aa", "=Replace('foo','o','a',2)");
  180. assertEval("oo", "=Replace('foo','o','a',2,0)");
  181. assertEval("", "=Replace('foo','o','a',4)");
  182. assertEval("foo", "=Replace('foo','','a')");
  183. assertEval("o", "=Replace('foo','','a',3)");
  184. assertEval("fahhabahhaahha", "=Replace('fooboooo','OO','ahha')");
  185. assertEval("fahhaboooo", "=Replace('fooboooo','OO','ahha',1,1)");
  186. assertEval("fooboooo", "=Replace('fooboooo','OO','ahha',1,1,0)");
  187. assertEval("ahhabahhaahha", "=Replace('fooboooo','OO','ahha',2)");
  188. assertEval("obahhaahha", "=Replace('fooboooo','OO','ahha',3)");
  189. assertEval("fb", "=Replace('fooboooo','OO','')");
  190. assertEval("", "=Replace('','o','a')");
  191. assertEval("foo", "=Replace('foo','foobar','a')");
  192. assertEval("12,345.00", "=FormatNumber(12345)");
  193. assertEval("0.12", "=FormatNumber(0.12345)");
  194. assertEval("12.34", "=FormatNumber(12.345)");
  195. assertEval("-12,345.00", "=FormatNumber(-12345)");
  196. assertEval("-0.12", "=FormatNumber(-0.12345)");
  197. assertEval("-12.34", "=FormatNumber(-12.345)");
  198. assertEval("12,345.000", "=FormatNumber(12345,3)");
  199. assertEval("0.123", "=FormatNumber(0.12345,3)");
  200. assertEval("12.345", "=FormatNumber(12.345,3)");
  201. assertEval("12,345", "=FormatNumber(12345,0)");
  202. assertEval("0", "=FormatNumber(0.12345,0)");
  203. assertEval("12", "=FormatNumber(12.345,0)");
  204. assertEval("0.123", "=FormatNumber(0.12345,3,True)");
  205. assertEval(".123", "=FormatNumber(0.12345,3,False)");
  206. assertEval("-0.123", "=FormatNumber(-0.12345,3,True)");
  207. assertEval("-.123", "=FormatNumber(-0.12345,3,False)");
  208. assertEval("-12.34", "=FormatNumber(-12.345,-1,True,False)");
  209. assertEval("(12.34)", "=FormatNumber(-12.345,-1,True,True)");
  210. assertEval("(12)", "=FormatNumber(-12.345,0,True,True)");
  211. assertEval("12,345.00", "=FormatNumber(12345,-1,-2,-2,True)");
  212. assertEval("12345.00", "=FormatNumber(12345,-1,-2,-2,False)");
  213. assertEval("1,234,500.00%", "=FormatPercent(12345)");
  214. assertEval("(1,234.50%)", "=FormatPercent(-12.345,-1,True,True)");
  215. assertEval("34%", "=FormatPercent(0.345,0,True,True)");
  216. assertEval("-.123%", "=FormatPercent(-0.0012345,3,False)");
  217. assertEval("$12,345.00", "=FormatCurrency(12345)");
  218. assertEval("-$12.34", "=FormatCurrency(-12.345,-1,True,False)");
  219. assertEval("$12", "=FormatCurrency(12.345,0,True,True)");
  220. assertEval("($.123)", "=FormatCurrency(-0.12345,3,False)");
  221. assertEval("1/1/1973 1:37:25 PM", "=FormatDateTime(#1/1/1973 1:37:25 PM#)");
  222. assertEval("1:37:25 PM", "=FormatDateTime(#1:37:25 PM#,0)");
  223. assertEval("1/1/1973", "=FormatDateTime(#1/1/1973#,0)");
  224. assertEval("Monday, January 01, 1973", "=FormatDateTime(#1/1/1973 1:37:25 PM#,1)");
  225. assertEval("1/1/1973", "=FormatDateTime(#1/1/1973 1:37:25 PM#,2)");
  226. assertEval("1:37:25 PM", "=FormatDateTime(#1/1/1973 1:37:25 PM#,3)");
  227. assertEval("13:37", "=FormatDateTime(#1/1/1973 1:37:25 PM#,4)");
  228. }
  229. public void testFormat() throws Exception
  230. {
  231. assertEval("12345.6789", "=Format(12345.6789, 'General Number')");
  232. assertEval("0.12345", "=Format(0.12345, 'General Number')");
  233. assertEval("-12345.6789", "=Format(-12345.6789, 'General Number')");
  234. assertEval("-0.12345", "=Format(-0.12345, 'General Number')");
  235. assertEval("12345.6789", "=Format('12345.6789', 'General Number')");
  236. assertEval("1678.9", "=Format('1.6789E+3', 'General Number')");
  237. assertEval("37623.2916666667", "=Format(#01/02/2003 7:00:00 AM#, 'General Number')");
  238. assertEval("foo", "=Format('foo', 'General Number')");
  239. assertEval("12,345.68", "=Format(12345.6789, 'Standard')");
  240. assertEval("0.12", "=Format(0.12345, 'Standard')");
  241. assertEval("-12,345.68", "=Format(-12345.6789, 'Standard')");
  242. assertEval("-0.12", "=Format(-0.12345, 'Standard')");
  243. assertEval("12345.68", "=Format(12345.6789, 'Fixed')");
  244. assertEval("0.12", "=Format(0.12345, 'Fixed')");
  245. assertEval("-12345.68", "=Format(-12345.6789, 'Fixed')");
  246. assertEval("-0.12", "=Format(-0.12345, 'Fixed')");
  247. assertEval("\u20AC12,345.68", "=Format(12345.6789, 'Euro')");
  248. assertEval("\u20AC0.12", "=Format(0.12345, 'Euro')");
  249. assertEval("(\u20AC12,345.68)", "=Format(-12345.6789, 'Euro')");
  250. assertEval("(\u20AC0.12)", "=Format(-0.12345, 'Euro')");
  251. assertEval("$12,345.68", "=Format(12345.6789, 'Currency')");
  252. assertEval("$0.12", "=Format(0.12345, 'Currency')");
  253. assertEval("($12,345.68)", "=Format(-12345.6789, 'Currency')");
  254. assertEval("($0.12)", "=Format(-0.12345, 'Currency')");
  255. assertEval("1234567.89%", "=Format(12345.6789, 'Percent')");
  256. assertEval("12.34%", "=Format(0.12345, 'Percent')");
  257. assertEval("-1234567.89%", "=Format(-12345.6789, 'Percent')");
  258. assertEval("-12.34%", "=Format(-0.12345, 'Percent')");
  259. assertEval("1.23E+4", "=Format(12345.6789, 'Scientific')");
  260. assertEval("1.23E-1", "=Format(0.12345, 'Scientific')");
  261. assertEval("-1.23E+4", "=Format(-12345.6789, 'Scientific')");
  262. assertEval("-1.23E-1", "=Format(-0.12345, 'Scientific')");
  263. assertEval("Yes", "=Format(True, 'Yes/No')");
  264. assertEval("No", "=Format(False, 'Yes/No')");
  265. assertEval("True", "=Format(True, 'True/False')");
  266. assertEval("False", "=Format(False, 'True/False')");
  267. assertEval("On", "=Format(True, 'On/Off')");
  268. assertEval("Off", "=Format(False, 'On/Off')");
  269. assertEval("1/2/2003 7:00:00 AM", "=Format(#01/02/2003 7:00:00 AM#, 'General Date')");
  270. assertEval("1/2/2003", "=Format(#01/02/2003#, 'General Date')");
  271. assertEval("7:00:00 AM", "=Format(#7:00:00 AM#, 'General Date')");
  272. assertEval("1/2/2003 7:00:00 AM", "=Format('37623.2916666667', 'General Date')");
  273. assertEval("foo", "=Format('foo', 'General Date')");
  274. assertEval("Thursday, January 02, 2003", "=Format(#01/02/2003 7:00:00 AM#, 'Long Date')");
  275. assertEval("02-Jan-03", "=Format(#01/02/2003 7:00:00 AM#, 'Medium Date')");
  276. assertEval("1/2/2003", "=Format(#01/02/2003 7:00:00 AM#, 'Short Date')");
  277. assertEval("7:00:00 AM", "=Format(#01/02/2003 7:00:00 AM#, 'Long Time')");
  278. assertEval("07:00 AM", "=Format(#01/02/2003 7:00:00 AM#, 'Medium Time')");
  279. assertEval("07:00", "=Format(#01/02/2003 7:00:00 AM#, 'Short Time')");
  280. assertEval("19:00", "=Format(#01/02/2003 7:00:00 PM#, 'Short Time')");
  281. }
  282. public void testCustomFormat() throws Exception
  283. {
  284. assertEval("07:00 a", "=Format(#01/10/2003 7:00:00 AM#, 'hh:nn a/p')");
  285. assertEval("07:00 a 6 2", "=Format(#01/10/2003 7:00:00 AM#, 'hh:nn a/p w ww')");
  286. assertEval("07:00 a 4 1", "=Format(#01/10/2003 7:00:00 AM#, 'hh:nn a/p w ww', 3, 3)");
  287. assertEval("1313", "=Format(#01/10/2003 7:13:00 AM#, 'nnnn; foo bar')");
  288. assertEval("1 1/10/2003 7:13:00 AM ttt this is text",
  289. "=Format(#01/10/2003 7:13:00 AM#, 'q c ttt \"this is text\"')");
  290. assertEval("1 1/10/2003 ttt this is text",
  291. "=Format(#01/10/2003#, 'q c ttt \"this is text\"')");
  292. assertEval("4 7:13:00 AM ttt this 'is' \"text\"",
  293. "=Format(#7:13:00 AM#, \"q c ttt \"\"this 'is' \"\"\"\"text\"\"\"\"\"\"\")");
  294. assertEval("12/29/1899", "=Format('true', 'c')");
  295. assertEval("Tuesday, 00 Jan 2, 21:36:00",
  296. "=Format('3.9', 'dddd, yy mmm d, hh:nn:ss')");
  297. assertEval("Tuesday, 00 Jan 01 2, 09:36:00 PM",
  298. "=Format('3.9', 'dddd, yy mmm mm d, hh:nn:ss AMPM')");
  299. assertEval("foo",
  300. "=Format('foo', 'dddd, yy mmm mm d, hh:nn:ss AMPM')");
  301. assertEval("p13.00blah",
  302. "=Format('13', '\"p\"#.00#\"blah\"')");
  303. assertEval("-p13.00blah",
  304. "=Format('-13', '\"p\"#.00#\"blah\";(\"p\"#.00#\"blah\")')");
  305. // assertEval("-p13.00blah",
  306. // "=Format('-13', '\"p\"#.00#\"blah\"')");
  307. }
  308. public void testNumberFuncs() throws Exception
  309. {
  310. assertEval(1, "=Abs(1)");
  311. assertEval(1, "=Abs(-1)");
  312. assertEval(toBD(1.1), "=Abs(-1.1)");
  313. assertEval(Math.atan(0.2), "=Atan(0.2)");
  314. assertEval(Math.sin(0.2), "=Sin(0.2)");
  315. assertEval(Math.tan(0.2), "=Tan(0.2)");
  316. assertEval(Math.cos(0.2), "=Cos(0.2)");
  317. assertEval(Math.exp(0.2), "=Exp(0.2)");
  318. assertEval(Math.log(0.2), "=Log(0.2)");
  319. assertEval(Math.sqrt(4.3), "=Sqr(4.3)");
  320. assertEval(3, "=Fix(3.5)");
  321. assertEval(4, "=Fix(4)");
  322. assertEval(-3, "=Fix(-3.5)");
  323. assertEval(-4, "=Fix(-4)");
  324. assertEval(1, "=Sgn(3.5)");
  325. assertEval(1, "=Sgn(4)");
  326. assertEval(-1, "=Sgn(-3.5)");
  327. assertEval(-1, "=Sgn(-4)");
  328. assertEval(3, "=Int(3.5)");
  329. assertEval(4, "=Int(4)");
  330. assertEval(-4, "=Int(-3.5)");
  331. assertEval(-4, "=Int(-4)");
  332. assertEval(toBD(4), "=Round(3.7)");
  333. assertEval(4, "=Round(4)");
  334. assertEval(toBD(-4), "=Round(-3.7)");
  335. assertEval(-4, "=Round(-4)");
  336. assertEval(toBD(3.73), "=Round(3.7345, 2)");
  337. assertEval(4, "=Round(4, 2)");
  338. assertEval(toBD(-3.73), "=Round(-3.7345, 2)");
  339. assertEval(-4, "=Round(-4, 2)");
  340. }
  341. public void testDateFuncs() throws Exception
  342. {
  343. assertEval("1/2/2003", "=CStr(DateValue(#01/02/2003 7:00:00 AM#))");
  344. assertEval("7:00:00 AM", "=CStr(TimeValue(#01/02/2003 7:00:00 AM#))");
  345. assertEval("1:10:00 PM", "=CStr(#13:10:00#)");
  346. assertEval(2003, "=Year(#01/02/2003 7:00:00 AM#)");
  347. assertEval(1, "=Month(#01/02/2003 7:00:00 AM#)");
  348. assertEval(2, "=Day(#01/02/2003 7:00:00 AM#)");
  349. assertEval(2003, "=Year('01/02/2003 7:00:00 AM')");
  350. assertEval(1899, "=Year(#7:00:00 AM#)");
  351. assertEquals(Calendar.getInstance().get(Calendar.YEAR),
  352. eval("=Year('01/02 7:00:00 AM')"));
  353. assertEval("January", "=MonthName(1)");
  354. assertEval("Feb", "=MonthName(2,True)");
  355. assertEval("March", "=MonthName(3,False)");
  356. assertEval(7, "=Hour(#01/02/2003 7:10:27 AM#)");
  357. assertEval(19, "=Hour(#01/02/2003 7:10:27 PM#)");
  358. assertEval(10, "=Minute(#01/02/2003 7:10:27 AM#)");
  359. assertEval(27, "=Second(#01/02/2003 7:10:27 AM#)");
  360. assertEval(7, "=Weekday(#11/22/2003#)");
  361. assertEval(3, "=Weekday(#11/22/2003#, 5)");
  362. assertEval(1, "=Weekday(#11/22/2003#, 7)");
  363. assertEval("Sunday", "=WeekdayName(1)");
  364. assertEval("Sun", "=WeekdayName(1,True)");
  365. assertEval("Tuesday", "=WeekdayName(1,False,3)");
  366. assertEval("Thu", "=WeekdayName(3,True,3)");
  367. assertTrue(((String)eval("=CStr(Date())"))
  368. .matches("\\d{1,2}/\\d{1,2}/\\d{4}"));
  369. assertTrue(((String)eval("=CStr(Time())"))
  370. .matches("\\d{1,2}:\\d{2}:\\d{2} (AM|PM)"));
  371. assertEval("3:57:34 AM", "=CStr(TimeSerial(3,57,34))");
  372. assertEval("3:57:34 PM", "=CStr(TimeSerial(15,57,34))");
  373. assertEval("5:45:00 AM", "=CStr(TimeSerial(6,-15,0))");
  374. assertEval("12:00:00 AM", "=CStr(TimeSerial(0,0,0))");
  375. assertEval("2:00:00 PM", "=CStr(TimeSerial(-10,0,0))");
  376. assertEval("6:00:00 AM", "=CStr(TimeSerial(30,0,0))");
  377. assertEval("2/12/1969", "=CStr(DateSerial(69,2,12))");
  378. assertEval("2/12/2010", "=CStr(DateSerial(10,2,12))");
  379. assertEval("7/12/2013", "=CStr(DateSerial(2014,-5,12))");
  380. assertEval("8/7/2013", "=CStr(DateSerial(2014,-5,38))");
  381. assertEval(1, "=DatePart('ww',#01/03/2018#)");
  382. assertEval(2, "=DatePart('ww',#01/03/2018#,4)");
  383. assertEval(1, "=DatePart('ww',#01/03/2018#,5)");
  384. assertEval(1, "=DatePart('ww',#01/03/2018#,4,3)");
  385. assertEval(52, "=DatePart('ww',#01/03/2018#,5,3)");
  386. assertEval(1, "=DatePart('ww',#01/03/2018#,4,2)");
  387. assertEval(53, "=DatePart('ww',#01/03/2018#,5,2)");
  388. assertEval(2003, "=DatePart('yyyy',#11/22/2003 5:45:13 AM#)");
  389. assertEval(4, "=DatePart('q',#11/22/2003 5:45:13 AM#)");
  390. assertEval(11, "=DatePart('m',#11/22/2003 5:45:13 AM#)");
  391. assertEval(326, "=DatePart('y',#11/22/2003 5:45:13 AM#)");
  392. assertEval(22, "=DatePart('d',#11/22/2003 5:45:13 AM#)");
  393. assertEval(7, "=DatePart('w',#11/22/2003 5:45:13 AM#)");
  394. assertEval(3, "=DatePart('w',#11/22/2003 5:45:13 AM#, 5)");
  395. assertEval(5, "=DatePart('h',#11/22/2003 5:45:13 AM#)");
  396. assertEval(45, "=DatePart('n',#11/22/2003 5:45:13 AM#)");
  397. assertEval(13, "=DatePart('s',#11/22/2003 5:45:13 AM#)");
  398. assertEval("11/22/2005 5:45:13 AM", "CStr(DateAdd('yyyy',2,#11/22/2003 5:45:13 AM#))");
  399. assertEval("2/22/2004 5:45:13 AM", "CStr(DateAdd('q',1,#11/22/2003 5:45:13 AM#))");
  400. assertEval("1/22/2004 5:45:13 AM", "CStr(DateAdd('m',2,#11/22/2003 5:45:13 AM#))");
  401. assertEval("12/12/2003 5:45:13 AM", "CStr(DateAdd('d',20,#11/22/2003 5:45:13 AM#))");
  402. assertEval("12/12/2003 5:45:13 AM", "CStr(DateAdd('w',20,#11/22/2003 5:45:13 AM#))");
  403. assertEval("12/12/2003 5:45:13 AM", "CStr(DateAdd('y',20,#11/22/2003 5:45:13 AM#))");
  404. assertEval("12/27/2003 5:45:13 AM", "CStr(DateAdd('ww',5,#11/22/2003 5:45:13 AM#))");
  405. assertEval("11/22/2003 3:45:13 PM", "CStr(DateAdd('h',10,#11/22/2003 5:45:13 AM#))");
  406. assertEval("11/22/2003 6:19:13 AM", "CStr(DateAdd('n',34,#11/22/2003 5:45:13 AM#))");
  407. assertEval("11/22/2003 5:46:27 AM", "CStr(DateAdd('s',74,#11/22/2003 5:45:13 AM#))");
  408. assertEval("12/12/2003", "CStr(DateAdd('d',20,#11/22/2003#))");
  409. assertEval("11/22/2003 10:00:00 AM", "CStr(DateAdd('h',10,#11/22/2003#))");
  410. assertEval("11/23/2003", "CStr(DateAdd('h',24,#11/22/2003#))");
  411. assertEval("3:45:13 PM", "CStr(DateAdd('h',10,#5:45:13 AM#))");
  412. assertEval("12/31/1899 11:45:13 AM", "CStr(DateAdd('h',30,#5:45:13 AM#))");
  413. assertEval(0, "=DateDiff('yyyy',#10/22/2003#,#11/22/2003#)");
  414. assertEval(4, "=DateDiff('yyyy',#10/22/2003#,#11/22/2007#)");
  415. assertEval(-4, "=DateDiff('yyyy',#11/22/2007#,#10/22/2003#)");
  416. assertEval(0, "=DateDiff('q',#10/22/2003#,#11/22/2003#)");
  417. assertEval(3, "=DateDiff('q',#03/01/2003#,#11/22/2003#)");
  418. assertEval(16, "=DateDiff('q',#10/22/2003#,#11/22/2007#)");
  419. assertEval(-13, "=DateDiff('q',#03/22/2007#,#10/22/2003#)");
  420. assertEval(1, "=DateDiff('m',#10/22/2003#,#11/01/2003#)");
  421. assertEval(8, "=DateDiff('m',#03/22/2003#,#11/01/2003#)");
  422. assertEval(49, "=DateDiff('m',#10/22/2003#,#11/22/2007#)");
  423. assertEval(-41, "=DateDiff('m',#03/22/2007#,#10/01/2003#)");
  424. assertEval(10, "=DateDiff('d','10/22','11/01')");
  425. assertEval(0, "=DateDiff('y',#1:37:00 AM#,#2:15:00 AM#)");
  426. assertEval(10, "=DateDiff('d',#10/22/2003#,#11/01/2003#)");
  427. assertEval(1, "=DateDiff('d',#10/22/2003 11:00:00 PM#,#10/23/2003 1:00:00 AM#)");
  428. assertEval(224, "=DateDiff('d',#03/22/2003#,#11/01/2003#)");
  429. assertEval(1492, "=DateDiff('y',#10/22/2003#,#11/22/2007#)");
  430. assertEval(-1268, "=DateDiff('d',#03/22/2007#,#10/01/2003#)");
  431. assertEval(366, "=DateDiff('d',#1/1/2000#,#1/1/2001#)");
  432. assertEval(365, "=DateDiff('d',#1/1/2001#,#1/1/2002#)");
  433. assertEval(0, "=DateDiff('w',#11/3/2018#,#11/04/2018#)");
  434. assertEval(1, "=DateDiff('w',#11/3/2018#,#11/10/2018#)");
  435. assertEval(0, "=DateDiff('w',#12/31/2017#,#1/1/2018#)");
  436. assertEval(32, "=DateDiff('w',#03/22/2003#,#11/01/2003#)");
  437. assertEval(213, "=DateDiff('w',#10/22/2003#,#11/22/2007#)");
  438. assertEval(-181, "=DateDiff('w',#03/22/2007#,#10/01/2003#)");
  439. assertEval(1, "=DateDiff('ww',#11/3/2018#,#11/04/2018#)");
  440. assertEval(1, "=DateDiff('ww',#11/3/2018#,#11/10/2018#)");
  441. assertEval(0, "=DateDiff('ww',#12/31/2017#,#1/1/2018#)");
  442. assertEval(1, "=DateDiff('ww',#12/31/2017#,#1/1/2018#,2)");
  443. assertEval(0, "=DateDiff('ww',#12/31/2017#,#1/1/2018#,1,3)");
  444. assertEval(53, "=DateDiff('ww',#1/1/2000#,#1/1/2001#)");
  445. assertEval(32, "=DateDiff('ww',#03/22/2003#,#11/01/2003#)");
  446. assertEval(213, "=DateDiff('ww',#10/22/2003#,#11/22/2007#)");
  447. assertEval(-181, "=DateDiff('ww',#03/22/2007#,#10/01/2003#)");
  448. assertEval(1, "=DateDiff('h',#1:37:00 AM#,#2:15:00 AM#)");
  449. assertEval(13, "=DateDiff('h',#1:37:00 AM#,#2:15:00 PM#)");
  450. assertEval(1, "=DateDiff('h',#11/3/2018 1:37:00 AM#,#11/3/2018 2:15:00 AM#)");
  451. assertEval(13, "=DateDiff('h',#11/3/2018 1:37:00 AM#,#11/3/2018 2:15:00 PM#)");
  452. assertEval(24, "=DateDiff('h',#11/3/2018#,#11/4/2018#)");
  453. assertEval(5641, "=DateDiff('h',#3/13/2018 1:37:00 AM#,#11/3/2018 2:15:00 AM#)");
  454. assertEval(23161, "=DateDiff('h',#3/13/2016 1:37:00 AM#,#11/3/2018 2:15:00 AM#)");
  455. assertEval(-23173, "=DateDiff('h',#11/3/2018 2:15:00 PM#,#3/13/2016 1:37:00 AM#)");
  456. assertEval(1, "=DateDiff('n',#1:37:59 AM#,#1:38:00 AM#)");
  457. assertEval(758, "=DateDiff('n',#1:37:30 AM#,#2:15:13 PM#)");
  458. assertEval(1, "=DateDiff('n',#11/3/2018 1:37:59 AM#,#11/3/2018 1:38:00 AM#)");
  459. assertEval(758, "=DateDiff('n',#11/3/2018 1:37:59 AM#,#11/3/2018 2:15:00 PM#)");
  460. assertEval(1440, "=DateDiff('n',#11/3/2018#,#11/4/2018#)");
  461. assertEval(338438, "=DateDiff('n',#3/13/2018 1:37:59 AM#,#11/3/2018 2:15:00 AM#)");
  462. assertEval(1389638, "=DateDiff('n',#3/13/2016 1:37:30 AM#,#11/3/2018 2:15:13 AM#)");
  463. assertEval(-1390358, "=DateDiff('n',#11/3/2018 2:15:30 PM#,#3/13/2016 1:37:13 AM#)");
  464. assertEval(1, "=DateDiff('s',#1:37:59 AM#,#1:38:00 AM#)");
  465. assertEval(35, "=DateDiff('s',#1:37:10 AM#,#1:37:45 AM#)");
  466. assertEval(45463, "=DateDiff('s',#1:37:30 AM#,#2:15:13 PM#)");
  467. assertEval(1, "=DateDiff('s',#11/3/2018 1:37:59 AM#,#11/3/2018 1:38:00 AM#)");
  468. assertEval(45463, "=DateDiff('s',#11/3/2018 1:37:30 AM#,#11/3/2018 2:15:13 PM#)");
  469. assertEval(86400, "=DateDiff('s',#11/3/2018#,#11/4/2018#)");
  470. assertEval(20306221, "=DateDiff('s',#3/13/2018 1:37:59 AM#,#11/3/2018 2:15:00 AM#)");
  471. assertEval(83378263, "=DateDiff('s',#3/13/2016 1:37:30 AM#,#11/3/2018 2:15:13 AM#)");
  472. assertEval(-83421497, "=DateDiff('s',#11/3/2018 2:15:30 PM#,#3/13/2016 1:37:13 AM#)");
  473. }
  474. public void testFinancialFuncs() throws Exception
  475. {
  476. assertEval("-9.57859403981306", "=CStr(NPer(0.12/12,-100,-1000))");
  477. assertEval("-9.48809500550578", "=CStr(NPer(0.12/12,-100,-1000,0,1))");
  478. assertEval("60.0821228537616", "=CStr(NPer(0.12/12,-100,-1000,10000))");
  479. assertEval("59.6738656742947", "=CStr(NPer(0.12/12,-100,-1000,10000,1))");
  480. assertEval("69.6607168935747", "=CStr(NPer(0.12/12,-100,0,10000))");
  481. assertEval("69.1619606798005", "=CStr(NPer(0.12/12,-100,0,10000,1))");
  482. assertEval("8166.96698564091", "=CStr(FV(0.12/12,60,-100))");
  483. assertEval("8248.63665549732", "=CStr(FV(0.12/12,60,-100,0,1))");
  484. assertEval("6350.27028707682", "=CStr(FV(0.12/12,60,-100,1000))");
  485. assertEval("6431.93995693323", "=CStr(FV(0.12/12,60,-100,1000,1))");
  486. assertEval("4495.5038406224", "=CStr(PV(0.12/12,60,-100))");
  487. assertEval("4540.45887902863", "=CStr(PV(0.12/12,60,-100,0,1))");
  488. assertEval("-1008.99231875519", "=CStr(PV(0.12/12,60,-100,10000))");
  489. assertEval("-964.03728034897", "=CStr(PV(0.12/12,60,-100,10000,1))");
  490. assertEval("22.2444476849018", "=CStr(Pmt(0.12/12,60,-1000))");
  491. assertEval("22.0242056286156", "=CStr(Pmt(0.12/12,60,-1000,0,1))");
  492. assertEval("-100.200029164116", "=CStr(Pmt(0.12/12,60,-1000,10000))");
  493. assertEval("-99.2079496674414", "=CStr(Pmt(0.12/12,60,-1000,10000,1))");
  494. assertEval("-122.444476849018", "=CStr(Pmt(0.12/12,60,0,10000))");
  495. assertEval("-121.232155296057", "=CStr(Pmt(0.12/12,60,0,10000,1))");
  496. assertEval("22.2444476849018", "=CStr(Pmt(0.12/12,60,-1000))");
  497. assertEval("10", "=CStr(IPmt(0.12/12,1,60,-1000))");
  498. assertEval("5.90418478297567", "=CStr(IPmt(0.12/12,30,60,-1000))");
  499. assertEval("0", "=CStr(IPmt(0.12/12,1,60,-1000,0,1))");
  500. assertEval("5.8457275078967", "=CStr(IPmt(0.12/12,30,60,-1000,0,1))");
  501. assertEval("0", "=CStr(IPmt(0.12/12,1,60,0,10000))");
  502. assertEval("40.9581521702433", "=CStr(IPmt(0.12/12,30,60,0,10000))");
  503. assertEval("0", "=CStr(IPmt(0.12/12,1,60,0,10000,1))");
  504. assertEval("40.552625911132", "=CStr(IPmt(0.12/12,30,60,0,10000,1))");
  505. assertEval("10", "=CStr(IPmt(0.12/12,1,60,-1000,10000))");
  506. assertEval("46.862336953219", "=CStr(IPmt(0.12/12,30,60,-1000,10000))");
  507. assertEval("0", "=CStr(IPmt(0.12/12,1,60,-1000,10000,1))");
  508. assertEval("46.3983534190287", "=CStr(IPmt(0.12/12,30,60,-1000,10000,1))");
  509. assertEval("12.2444476849018", "=CStr(PPmt(0.12/12,1,60,-1000))");
  510. assertEval("16.3402629019261", "=CStr(PPmt(0.12/12,30,60,-1000))");
  511. assertEval("22.0242056286156", "=CStr(PPmt(0.12/12,1,60,-1000,0,1))");
  512. assertEval("16.1784781207189", "=CStr(PPmt(0.12/12,30,60,-1000,0,1))");
  513. assertEval("-122.444476849018", "=CStr(PPmt(0.12/12,1,60,0,10000))");
  514. assertEval("-163.402629019261", "=CStr(PPmt(0.12/12,30,60,0,10000))");
  515. assertEval("-121.232155296057", "=CStr(PPmt(0.12/12,1,60,0,10000,1))");
  516. assertEval("-161.784781207189", "=CStr(PPmt(0.12/12,30,60,0,10000,1))");
  517. assertEval("-110.200029164116", "=CStr(PPmt(0.12/12,1,60,-1000,10000))");
  518. assertEval("-147.062366117335", "=CStr(PPmt(0.12/12,30,60,-1000,10000))");
  519. assertEval("-99.2079496674414", "=CStr(PPmt(0.12/12,1,60,-1000,10000,1))");
  520. assertEval("-145.60630308647", "=CStr(PPmt(0.12/12,30,60,-1000,10000,1))");
  521. assertEval("1.31506849315068", "=CStr(DDB(2400,300,10*365,1))");
  522. assertEval("40", "=CStr(DDB(2400,300,10*12,1))");
  523. assertEval("480", "=CStr(DDB(2400,300,10,1))");
  524. assertEval("22.1225472000002", "=CStr(DDB(2400,300,10,10))");
  525. assertEval("245.76", "=CStr(DDB(2400,300,10,4))");
  526. assertEval("307.2", "=CStr(DDB(2400,300,10,3))");
  527. assertEval("480", "=CStr(DDB(2400,300,10,0.1))");
  528. assertEval("274.768033075174", "=CStr(DDB(2400,300,10,3.5))");
  529. assertEval("2250", "=CStr(SLN(30000,7500,10))");
  530. assertEval("1000", "=CStr(SLN(10000,5000,5))");
  531. assertEval("1142.85714285714", "=CStr(SLN(8000,0,7))");
  532. assertEval("4090.90909090909", "=CStr(SYD(30000,7500,10,1))");
  533. assertEval("409.090909090909", "=CStr(SYD(30000,7500,10,10))");
  534. assertEval("-1.63048347266756E-02", "=CStr(Rate(3,200,-610,0,-20,0.1))");
  535. assertEval("7.70147248820165E-03", "=CStr(Rate(4*12,-200,8000))");
  536. assertEval("-1.09802980531205", "=CStr(Rate(60,93.22,5000,0.1))");
  537. }
  538. static void assertEval(Object expected, String exprStr) {
  539. try {
  540. assertEquals(expected, eval(exprStr));
  541. } catch(Error e) {
  542. // Convenience for adding new tests
  543. // System.err.println("[ERROR] " + e);
  544. throw e;
  545. }
  546. }
  547. }