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.

DefaultFunctionsTest.java 36KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861
  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.AssertionFailedError;
  19. import junit.framework.TestCase;
  20. import static com.healthmarketscience.jackcess.impl.expr.ExpressionatorTest.eval;
  21. import static com.healthmarketscience.jackcess.impl.expr.ExpressionatorTest.toBD;
  22. /**
  23. *
  24. * @author James Ahlborn
  25. */
  26. public class DefaultFunctionsTest extends TestCase
  27. {
  28. public DefaultFunctionsTest(String name) {
  29. super(name);
  30. }
  31. public void testFuncs() throws Exception
  32. {
  33. assertEval("foo", "=IIf(10 > 1, \"foo\", \"bar\")");
  34. assertEval("bar", "=IIf(10 < 1, \"foo\", \"bar\")");
  35. assertEval(102, "=Asc(\"foo\")");
  36. assertEval(9786, "=AscW(\"\u263A\")");
  37. assertEval("f", "=Chr(102)");
  38. assertEval("\u263A", "=ChrW(9786)");
  39. assertEval("263A", "=Hex(9786)");
  40. assertEval("blah", "=Nz(\"blah\")");
  41. assertEval("", "=Nz(Null)");
  42. assertEval("blah", "=Nz(\"blah\",\"FOO\")");
  43. assertEval("FOO", "=Nz(Null,\"FOO\")");
  44. assertEval("23072", "=Oct(9786)");
  45. assertEval(" 9786", "=Str(9786)");
  46. assertEval("-42", "=Str(-42)");
  47. assertEval("-42", "=Str$(-42)");
  48. assertNull(eval("=Str(Null)"));
  49. try {
  50. eval("=Str$(Null)");
  51. fail("EvalException should have been thrown");
  52. } catch(EvalException expected) {
  53. // success
  54. }
  55. assertEval(-1, "=CBool(\"1\")");
  56. assertEval(13, "=CByte(\"13\")");
  57. assertEval(14, "=CByte(\"13.7\")");
  58. assertEval(new BigDecimal("57.1235"), "=CCur(\"57.12346\")");
  59. assertEval(new Double("57.12345"), "=CDbl(\"57.12345\")");
  60. assertEval(new BigDecimal("57.123456789"), "=CDec(\"57.123456789\")");
  61. assertEval(513, "=CInt(\"513\")");
  62. assertEval(514, "=CInt(\"513.7\")");
  63. assertEval(345513, "=CLng(\"345513\")");
  64. assertEval(345514, "=CLng(\"345513.7\")");
  65. assertEquals(new Float("57.12345").doubleValue(),
  66. eval("=CSng(\"57.12345\")"));
  67. assertEval("9786", "=CStr(9786)");
  68. assertEval("-42", "=CStr(-42)");
  69. assertEval(LocalDateTime.of(2003,1,2,0,0), "=CDate('01/02/2003')");
  70. assertEval(LocalDateTime.of(2003,1,2,7,0), "=CDate('01/02/2003 7:00:00 AM')");
  71. assertEval(LocalDateTime.of(1908,3,31,10,48), "=CDate(3013.45)");
  72. assertEval(-1, "=IsNull(Null)");
  73. assertEval(0, "=IsNull(13)");
  74. assertEval(-1, "=IsDate(#01/02/2003#)");
  75. assertEval(0, "=IsDate('foo')");
  76. assertEval(0, "=IsDate('200')");
  77. assertEval(0, "=IsNumeric(Null)");
  78. assertEval(0, "=IsNumeric('foo')");
  79. assertEval(0, "=IsNumeric(#01/02/2003#)");
  80. assertEval(0, "=IsNumeric('01/02/2003')");
  81. assertEval(-1, "=IsNumeric(37)");
  82. assertEval(-1, "=IsNumeric(' 37 ')");
  83. assertEval(-1, "=IsNumeric(' -37.5e2 ')");
  84. assertEval(-1, "=IsNumeric(' &H37 ')");
  85. assertEval(0, "=IsNumeric(' &H37foo ')");
  86. assertEval(0, "=IsNumeric(' &o39 ')");
  87. assertEval(-1, "=IsNumeric(' &o36 ')");
  88. assertEval(0, "=IsNumeric(' &o36.1 ')");
  89. assertEval(1, "=VarType(Null)");
  90. assertEval(8, "=VarType('blah')");
  91. assertEval(7, "=VarType(#01/02/2003#)");
  92. assertEval(3, "=VarType(42)");
  93. assertEval(5, "=VarType(CDbl(42))");
  94. assertEval(14, "=VarType(42.3)");
  95. assertEval("Null", "=TypeName(Null)");
  96. assertEval("String", "=TypeName('blah')");
  97. assertEval("Date", "=TypeName(#01/02/2003#)");
  98. assertEval("Long", "=TypeName(42)");
  99. assertEval("Double", "=TypeName(CDbl(42))");
  100. assertEval("Decimal", "=TypeName(42.3)");
  101. assertEval(2, "=InStr('AFOOBAR', 'FOO')");
  102. assertEval(2, "=InStr('AFOOBAR', 'foo')");
  103. assertEval(2, "=InStr(1, 'AFOOBAR', 'foo')");
  104. assertEval(0, "=InStr(1, 'AFOOBAR', 'foo', 0)");
  105. assertEval(2, "=InStr(1, 'AFOOBAR', 'foo', 1)");
  106. assertEval(2, "=InStr(1, 'AFOOBAR', 'FOO', 0)");
  107. assertEval(2, "=InStr(2, 'AFOOBAR', 'FOO')");
  108. assertEval(0, "=InStr(3, 'AFOOBAR', 'FOO')");
  109. assertEval(0, "=InStr(17, 'AFOOBAR', 'FOO')");
  110. assertEval(2, "=InStr(1, 'AFOOBARFOOBAR', 'FOO')");
  111. assertEval(8, "=InStr(3, 'AFOOBARFOOBAR', 'FOO')");
  112. assertNull(eval("=InStr(3, Null, 'FOO')"));
  113. assertEval(2, "=InStrRev('AFOOBAR', 'FOO')");
  114. assertEval(2, "=InStrRev('AFOOBAR', 'foo')");
  115. assertEval(2, "=InStrRev('AFOOBAR', 'foo', -1)");
  116. assertEval(0, "=InStrRev('AFOOBAR', 'foo', -1, 0)");
  117. assertEval(2, "=InStrRev('AFOOBAR', 'foo', -1, 1)");
  118. assertEval(2, "=InStrRev('AFOOBAR', 'FOO', -1, 0)");
  119. assertEval(2, "=InStrRev('AFOOBAR', 'FOO', 4)");
  120. assertEval(0, "=InStrRev('AFOOBAR', 'FOO', 3)");
  121. assertEval(2, "=InStrRev('AFOOBAR', 'FOO', 17)");
  122. assertEval(2, "=InStrRev('AFOOBARFOOBAR', 'FOO', 9)");
  123. assertEval(8, "=InStrRev('AFOOBARFOOBAR', 'FOO', 10)");
  124. assertNull(eval("=InStrRev(Null, 'FOO', 3)"));
  125. assertEval("FOOO", "=UCase(\"fOoO\")");
  126. assertEval("fooo", "=LCase(\"fOoO\")");
  127. assertEval(" FOO \" BAR ", "=UCase(\" foo \"\" bar \")");
  128. assertEval("bl", "=Left(\"blah\", 2)");
  129. assertEval("", "=Left(\"blah\", 0)");
  130. assertEval("blah", "=Left(\"blah\", 17)");
  131. assertEval("la", "=Mid(\"blah\", 2, 2)");
  132. assertEval("ah", "=Right(\"blah\", 2)");
  133. assertEval("", "=Right(\"blah\", 0)");
  134. assertEval("blah", "=Right(\"blah\", 17)");
  135. assertEval("blah ", "=LTrim(\" blah \")");
  136. assertEval(" blah", "=RTrim(\" blah \")");
  137. assertEval("blah", "=Trim(\" blah \")");
  138. assertEval(" ", "=Space(3)");
  139. assertEval("ddd", "=String(3,'d')");
  140. assertEval(1, "=StrComp('FOO', 'bar')");
  141. assertEval(-1, "=StrComp('bar', 'FOO')");
  142. assertEval(0, "=StrComp('FOO', 'foo')");
  143. assertEval(-1, "=StrComp('FOO', 'bar', 0)");
  144. assertEval(1, "=StrComp('bar', 'FOO', 0)");
  145. assertEval(-1, "=StrComp('FOO', 'foo', 0)");
  146. assertEval("FOO", "=StrConv('foo', 1)");
  147. assertEval("foo", "=StrConv('foo', 2)");
  148. assertEval("foo", "=StrConv('FOO', 2)");
  149. assertEval("Foo Bar", "=StrConv('FOO bar', 3)");
  150. assertEval("halb", "=StrReverse('blah')");
  151. assertEval("foo", "=Choose(1,'foo','bar','blah')");
  152. assertEval(null, "=Choose(-1,'foo','bar','blah')");
  153. assertEval("blah", "=Choose(3,'foo','bar','blah')");
  154. assertEval(null, "=Switch(False,'foo', False, 'bar', False, 'blah')");
  155. assertEval("bar", "=Switch(False,'foo', True, 'bar', True, 'blah')");
  156. assertEval("blah", "=Switch(False,'foo', False, 'bar', True, 'blah')");
  157. try {
  158. eval("=StrReverse('blah', 1)");
  159. fail("EvalException should have been thrown");
  160. } catch(EvalException e) {
  161. assertTrue(e.getMessage().contains("Invalid function call"));
  162. }
  163. try {
  164. eval("=StrReverse()");
  165. fail("EvalException should have been thrown");
  166. } catch(EvalException e) {
  167. assertTrue(e.getMessage().contains("Invalid function call"));
  168. }
  169. assertEval(1615198d, "=Val(' 1615 198th Street N.E.')");
  170. assertEval(-1d, "=Val(' &HFFFFwhatever')");
  171. assertEval(131071d, "=Val(' &H1FFFFwhatever')");
  172. assertEval(-1d, "=Val(' &HFFFFFFFFwhatever')");
  173. assertEval(291d, "=Val(' &H123whatever')");
  174. assertEval(83d, "=Val(' &O123whatever')");
  175. assertEval(1.23d, "=Val(' 1 2 3 e -2 whatever')");
  176. assertEval(0d, "=Val(' whatever123 ')");
  177. assertEval(0d, "=Val('')");
  178. assertEval("faa", "=Replace('foo','o','a')");
  179. assertEval("faa", "=Replace('fOo','o','a')");
  180. assertEval("aa", "=Replace('foo','o','a',2)");
  181. assertEval("oo", "=Replace('foo','o','a',2,0)");
  182. assertEval("", "=Replace('foo','o','a',4)");
  183. assertEval("foo", "=Replace('foo','','a')");
  184. assertEval("o", "=Replace('foo','','a',3)");
  185. assertEval("fahhabahhaahha", "=Replace('fooboooo','OO','ahha')");
  186. assertEval("fahhaboooo", "=Replace('fooboooo','OO','ahha',1,1)");
  187. assertEval("fooboooo", "=Replace('fooboooo','OO','ahha',1,1,0)");
  188. assertEval("ahhabahhaahha", "=Replace('fooboooo','OO','ahha',2)");
  189. assertEval("obahhaahha", "=Replace('fooboooo','OO','ahha',3)");
  190. assertEval("fb", "=Replace('fooboooo','OO','')");
  191. assertEval("", "=Replace('','o','a')");
  192. assertEval("foo", "=Replace('foo','foobar','a')");
  193. assertEval("12,345.00", "=FormatNumber(12345)");
  194. assertEval("0.12", "=FormatNumber(0.12345)");
  195. assertEval("12.34", "=FormatNumber(12.345)");
  196. assertEval("-12,345.00", "=FormatNumber(-12345)");
  197. assertEval("-0.12", "=FormatNumber(-0.12345)");
  198. assertEval("-12.34", "=FormatNumber(-12.345)");
  199. assertEval("12,345.000", "=FormatNumber(12345,3)");
  200. assertEval("0.123", "=FormatNumber(0.12345,3)");
  201. assertEval("12.345", "=FormatNumber(12.345,3)");
  202. assertEval("12,345", "=FormatNumber(12345,0)");
  203. assertEval("0", "=FormatNumber(0.12345,0)");
  204. assertEval("12", "=FormatNumber(12.345,0)");
  205. assertEval("0.123", "=FormatNumber(0.12345,3,True)");
  206. assertEval(".123", "=FormatNumber(0.12345,3,False)");
  207. assertEval("-0.123", "=FormatNumber(-0.12345,3,True)");
  208. assertEval("-.123", "=FormatNumber(-0.12345,3,False)");
  209. assertEval("-12.34", "=FormatNumber(-12.345,-1,True,False)");
  210. assertEval("(12.34)", "=FormatNumber(-12.345,-1,True,True)");
  211. assertEval("(12)", "=FormatNumber(-12.345,0,True,True)");
  212. assertEval("12,345.00", "=FormatNumber(12345,-1,-2,-2,True)");
  213. assertEval("12345.00", "=FormatNumber(12345,-1,-2,-2,False)");
  214. assertEval("1,234,500.00%", "=FormatPercent(12345)");
  215. assertEval("(1,234.50%)", "=FormatPercent(-12.345,-1,True,True)");
  216. assertEval("34%", "=FormatPercent(0.345,0,True,True)");
  217. assertEval("-.123%", "=FormatPercent(-0.0012345,3,False)");
  218. assertEval("$12,345.00", "=FormatCurrency(12345)");
  219. assertEval("($12,345.00)", "=FormatCurrency(-12345)");
  220. assertEval("-$12.34", "=FormatCurrency(-12.345,-1,True,False)");
  221. assertEval("$12", "=FormatCurrency(12.345,0,True,True)");
  222. assertEval("($.123)", "=FormatCurrency(-0.12345,3,False)");
  223. assertEval("1/1/1973 1:37:25 PM", "=FormatDateTime(#1/1/1973 1:37:25 PM#)");
  224. assertEval("1:37:25 PM", "=FormatDateTime(#1:37:25 PM#,0)");
  225. assertEval("1/1/1973", "=FormatDateTime(#1/1/1973#,0)");
  226. assertEval("Monday, January 01, 1973", "=FormatDateTime(#1/1/1973 1:37:25 PM#,1)");
  227. assertEval("1/1/1973", "=FormatDateTime(#1/1/1973 1:37:25 PM#,2)");
  228. assertEval("1:37:25 PM", "=FormatDateTime(#1/1/1973 1:37:25 PM#,3)");
  229. assertEval("13:37", "=FormatDateTime(#1/1/1973 1:37:25 PM#,4)");
  230. }
  231. public void testFormat() throws Exception
  232. {
  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("-0.12345", "=Format(-0.12345, 'General Number')");
  237. assertEval("12345.6789", "=Format('12345.6789', 'General Number')");
  238. assertEval("1678.9", "=Format('1.6789E+3', 'General Number')");
  239. assertEval("37623.2916666667", "=Format(#01/02/2003 7:00:00 AM#, 'General Number')");
  240. assertEval("foo", "=Format('foo', 'General Number')");
  241. assertEval("12,345.68", "=Format(12345.6789, 'Standard')");
  242. assertEval("0.12", "=Format(0.12345, 'Standard')");
  243. assertEval("-12,345.68", "=Format(-12345.6789, 'Standard')");
  244. assertEval("-0.12", "=Format(-0.12345, 'Standard')");
  245. assertEval("12345.68", "=Format(12345.6789, 'Fixed')");
  246. assertEval("0.12", "=Format(0.12345, 'Fixed')");
  247. assertEval("-12345.68", "=Format(-12345.6789, 'Fixed')");
  248. assertEval("-0.12", "=Format(-0.12345, 'Fixed')");
  249. assertEval("\u20AC12,345.68", "=Format(12345.6789, 'Euro')");
  250. assertEval("\u20AC0.12", "=Format(0.12345, 'Euro')");
  251. assertEval("(\u20AC12,345.68)", "=Format(-12345.6789, 'Euro')");
  252. assertEval("(\u20AC0.12)", "=Format(-0.12345, 'Euro')");
  253. assertEval("$12,345.68", "=Format(12345.6789, 'Currency')");
  254. assertEval("$0.12", "=Format(0.12345, 'Currency')");
  255. assertEval("($12,345.68)", "=Format(-12345.6789, 'Currency')");
  256. assertEval("($0.12)", "=Format(-0.12345, 'Currency')");
  257. assertEval("1234567.89%", "=Format(12345.6789, 'Percent')");
  258. assertEval("12.34%", "=Format(0.12345, 'Percent')");
  259. assertEval("-1234567.89%", "=Format(-12345.6789, 'Percent')");
  260. assertEval("-12.34%", "=Format(-0.12345, 'Percent')");
  261. assertEval("1.23E+4", "=Format(12345.6789, 'Scientific')");
  262. assertEval("1.23E-1", "=Format(0.12345, 'Scientific')");
  263. assertEval("-1.23E+4", "=Format(-12345.6789, 'Scientific')");
  264. assertEval("-1.23E-1", "=Format(-0.12345, 'Scientific')");
  265. assertEval("Yes", "=Format(True, 'Yes/No')");
  266. assertEval("No", "=Format(False, 'Yes/No')");
  267. assertEval("True", "=Format(True, 'True/False')");
  268. assertEval("False", "=Format(False, 'True/False')");
  269. assertEval("On", "=Format(True, 'On/Off')");
  270. assertEval("Off", "=Format(False, 'On/Off')");
  271. assertEval("1/2/2003 7:00:00 AM", "=Format(#01/02/2003 7:00:00 AM#, 'General Date')");
  272. assertEval("1/2/2003", "=Format(#01/02/2003#, 'General Date')");
  273. assertEval("7:00:00 AM", "=Format(#7:00:00 AM#, 'General Date')");
  274. assertEval("1/2/2003 7:00:00 AM", "=Format('37623.2916666667', 'General Date')");
  275. assertEval("foo", "=Format('foo', 'General Date')");
  276. assertEval("", "=Format('', 'General Date')");
  277. assertEval("Thursday, January 02, 2003", "=Format(#01/02/2003 7:00:00 AM#, 'Long Date')");
  278. assertEval("02-Jan-03", "=Format(#01/02/2003 7:00:00 AM#, 'Medium Date')");
  279. assertEval("1/2/2003", "=Format(#01/02/2003 7:00:00 AM#, 'Short Date')");
  280. assertEval("7:00:00 AM", "=Format(#01/02/2003 7:00:00 AM#, 'Long Time')");
  281. assertEval("07:00 AM", "=Format(#01/02/2003 7:00:00 AM#, 'Medium Time')");
  282. assertEval("07:00", "=Format(#01/02/2003 7:00:00 AM#, 'Short Time')");
  283. assertEval("19:00", "=Format(#01/02/2003 7:00:00 PM#, 'Short Time')");
  284. }
  285. public void testCustomFormat() throws Exception
  286. {
  287. assertEval("07:00 a", "=Format(#01/10/2003 7:00:00 AM#, 'hh:nn a/p')");
  288. assertEval("07:00 p", "=Format(#01/10/2003 7:00:00 PM#, 'hh:nn a/p')");
  289. assertEval("07:00 a 6 2", "=Format(#01/10/2003 7:00:00 AM#, 'hh:nn a/p w ww')");
  290. assertEval("07:00 a 4 1", "=Format(#01/10/2003 7:00:00 AM#, 'hh:nn a/p w ww', 3, 3)");
  291. assertEval("1313", "=Format(#01/10/2003 7:13:00 AM#, 'nnnn; foo bar')");
  292. assertEval("1 1/10/2003 7:13:00 AM ttt this is text",
  293. "=Format(#01/10/2003 7:13:00 AM#, 'q c ttt \"this is text\"')");
  294. assertEval("1 1/10/2003 ttt this is text",
  295. "=Format(#01/10/2003#, 'q c ttt \"this is text\"')");
  296. assertEval("4 7:13:00 AM ttt this 'is' \"text\"",
  297. "=Format(#7:13:00 AM#, \"q c ttt \"\"this 'is' \"\"\"\"text\"\"\"\"\"\"\")");
  298. assertEval("12/29/1899", "=Format('true', 'c')");
  299. assertEval("Tuesday, 00 Jan 2, 21:36:00 Y",
  300. "=Format('3.9', '*~dddd, yy mmm d, hh:nn:ss \\Y[Yellow]')");
  301. assertEval("Tuesday, 00 Jan 01/2, 09:36:00 PM",
  302. "=Format('3.9', 'dddd, yy mmm mm/d, hh:nn:ss AMPM')");
  303. assertEval("9:36:00 PM",
  304. "=Format('3.9', 'ttttt')");
  305. assertEval("9:36:00 PM",
  306. "=Format(3.9, 'ttttt')");
  307. assertEval("foo",
  308. "=Format('foo', 'dddd, yy mmm mm d, hh:nn:ss AMPM')");
  309. assertEvalFormat("';\\y;\\n'",
  310. "foo", "'foo'",
  311. "", "''",
  312. "y", "True",
  313. "n", "'0'",
  314. "", "Null");
  315. assertEvalFormat("'\\p;\"y\";!\\n;*~\\z[Blue];'",
  316. "foo", "'foo'",
  317. "", "''",
  318. "y", "True",
  319. "n", "'0'",
  320. "p", "'10'",
  321. "z", "Null");
  322. assertEvalFormat("'\"p\"#.00#\"blah\"'",
  323. "p13.00blah", "13",
  324. "-p13.00blah", "-13",
  325. "p.00blah", "0",
  326. "", "''",
  327. "", "Null");
  328. assertEvalFormat("'\"p\"#.00#\"blah\";(\"p\"#.00#\"blah\")'",
  329. "p13.00blah", "13",
  330. "(p13.00blah)", "-13",
  331. "p.00blah", "0",
  332. "(p1.00blah)", "True",
  333. "p.00blah", "'false'",
  334. "p37623.292blah", "#01/02/2003 7:00:00 AM#",
  335. "p37623.292blah", "'01/02/2003 7:00:00 AM'",
  336. "NotANumber", "'NotANumber'",
  337. "", "''",
  338. "", "Null");
  339. assertEvalFormat("'\"p\"#.00#\"blah\";!(\"p\"#.00#\"blah\")[Red];\"zero\"'",
  340. "p13.00blah", "13",
  341. "(p13.00blah)", "-13",
  342. "zero", "0",
  343. "", "''",
  344. "", "Null");
  345. assertEvalFormat("'\\p#.00#\"blah\";*~(\"p\"#.00#\"blah\");\"zero\";\"yuck\"'",
  346. "p13.00blah", "13",
  347. "(p13.00blah)", "-13",
  348. "zero", "0",
  349. "", "''",
  350. "yuck", "Null");
  351. assertEvalFormat("'0.##;(0.###);\"zero\";\"yuck\";'",
  352. "0.03", "0.03",
  353. "zero", "0.003",
  354. "(0.003)", "-0.003",
  355. "zero", "-0.0003");
  356. assertEvalFormat("'0.##;(0.###E+0)'",
  357. "0.03", "0.03",
  358. "(3.E-4)", "-0.0003",
  359. "0.", "0",
  360. "34223.", "34223",
  361. "(3.422E+4)", "-34223");
  362. assertEvalFormat("'0.###E-0'",
  363. "3.E-4", "0.0003",
  364. "3.422E4", "34223"
  365. );
  366. assertEvalFormat("'0.###e+0'",
  367. "3.e-4", "0.0003",
  368. "3.422e+4", "34223"
  369. );
  370. assertEvalFormat("'0.###e-0'",
  371. "3.e-4", "0.0003",
  372. "3.422e4", "34223"
  373. );
  374. assertEvalFormat("'#,##0.###'",
  375. "0.003", "0.003",
  376. "0.", "0.0003",
  377. "34,223.", "34223"
  378. );
  379. assertEvalFormat("'0.'",
  380. "13.", "13",
  381. "0.", "0.003",
  382. "-45.", "-45",
  383. "0.", "-0.003",
  384. "0.", "0"
  385. );
  386. assertEvalFormat("'0.#'",
  387. "13.", "13",
  388. "0.3", "0.3",
  389. "0.", "0.003",
  390. "-45.", "-45",
  391. "0.", "-0.003",
  392. "0.", "0"
  393. );
  394. assertEvalFormat("'0'",
  395. "13", "13",
  396. "0", "0.003",
  397. "-45", "-45",
  398. "0", "-0.003",
  399. "0", "0"
  400. );
  401. assertEvalFormat("'%0'",
  402. "%13", "0.13",
  403. "%0", "0.003",
  404. "-%45", "-0.45",
  405. "%0", "-0.003",
  406. "%0", "0"
  407. );
  408. assertEvalFormat("'#'",
  409. "13", "13",
  410. "", "0.003",
  411. "-45", "-45",
  412. "", "-0.003",
  413. "", "0"
  414. );
  415. assertEvalFormat("'\\0\\[#.#\\]\\0'",
  416. "0[13.]0", "13",
  417. "0[.]0", "0.003",
  418. "0[.3]0", "0.3",
  419. "-0[45.]0", "-45",
  420. "0[.]0", "-0.003",
  421. "-0[.3]0", "-0.3",
  422. "0[.]0", "0"
  423. );
  424. assertEvalFormat("\"#;n'g;'\"",
  425. "5", "5",
  426. "n'g", "-5",
  427. "'", "0");
  428. assertEvalFormat("'$0.0#'",
  429. "$213.0", "213");
  430. assertEvalFormat("'@'",
  431. "foo", "'foo'",
  432. "-13", "-13",
  433. "0", "0",
  434. "", "''",
  435. "", "Null");
  436. assertEvalFormat("'>@'",
  437. "FOO", "'foo'",
  438. "-13", "-13",
  439. "0", "0",
  440. "", "''",
  441. "", "Null");
  442. assertEvalFormat("'<@'",
  443. "foo", "'FOO'",
  444. "-13", "-13",
  445. "0", "0",
  446. "", "''",
  447. "", "Null");
  448. assertEvalFormat("'!>@;'",
  449. "O", "'foo'",
  450. "3", "-13",
  451. "0", "0",
  452. "", "''",
  453. "", "Null");
  454. assertEvalFormat("'!>*~@[Red];\"empty\";'",
  455. "O", "'foo'",
  456. "3", "-13",
  457. "0", "0",
  458. "empty", "''",
  459. "empty", "Null");
  460. assertEvalFormat("'><@'",
  461. "fOo", "'fOo'");
  462. assertEvalFormat("'\\x@@@&&&\\y'",
  463. "x fy", "'f'",
  464. "x fooy", "'foo'",
  465. "x foobay", "'fooba'",
  466. "xfoobarybaz", "'foobarbaz'"
  467. );
  468. assertEvalFormat("'!\\x@@@&&&\\y'",
  469. "xf y", "'f'",
  470. "xfooy", "'foo'",
  471. "xfoobay", "'fooba'",
  472. "xbarbazy", "'foobarbaz'"
  473. );
  474. assertEvalFormat("'\\x&&&@@@\\y'",
  475. "x fy", "'f'",
  476. "xfooy", "'foo'",
  477. "xfoobay", "'fooba'",
  478. "xfoobarybaz", "'foobarbaz'"
  479. );
  480. assertEvalFormat("'!\\x&&&@@@\\y'",
  481. "xf y", "'f'",
  482. "xfoo y", "'foo'",
  483. "xfooba y", "'fooba'",
  484. "xbarbazy", "'foobarbaz'"
  485. );
  486. }
  487. private static void assertEvalFormat(String fmtStr, String... testStrs) {
  488. for(int i = 0; i < testStrs.length; i+=2) {
  489. String expected = testStrs[i];
  490. String val = testStrs[i + 1];
  491. try {
  492. assertEval(expected,
  493. "=Format(" + val + ", " + fmtStr + ")");
  494. } catch(AssertionFailedError afe) {
  495. throw new AssertionFailedError("Input " + val + ": " +
  496. afe.getMessage());
  497. }
  498. }
  499. }
  500. public void testNumberFuncs() throws Exception
  501. {
  502. assertEval(1, "=Abs(1)");
  503. assertEval(1, "=Abs(-1)");
  504. assertEval(toBD(1.1), "=Abs(-1.1)");
  505. assertEval(Math.atan(0.2), "=Atan(0.2)");
  506. assertEval(Math.sin(0.2), "=Sin(0.2)");
  507. assertEval(Math.tan(0.2), "=Tan(0.2)");
  508. assertEval(Math.cos(0.2), "=Cos(0.2)");
  509. assertEval(Math.exp(0.2), "=Exp(0.2)");
  510. assertEval(Math.log(0.2), "=Log(0.2)");
  511. assertEval(Math.sqrt(4.3), "=Sqr(4.3)");
  512. assertEval(3, "=Fix(3.5)");
  513. assertEval(4, "=Fix(4)");
  514. assertEval(-3, "=Fix(-3.5)");
  515. assertEval(-4, "=Fix(-4)");
  516. assertEval(1, "=Sgn(3.5)");
  517. assertEval(1, "=Sgn(4)");
  518. assertEval(-1, "=Sgn(-3.5)");
  519. assertEval(-1, "=Sgn(-4)");
  520. assertEval(3, "=Int(3.5)");
  521. assertEval(4, "=Int(4)");
  522. assertEval(-4, "=Int(-3.5)");
  523. assertEval(-4, "=Int(-4)");
  524. assertEval(toBD(4), "=Round(3.7)");
  525. assertEval(4, "=Round(4)");
  526. assertEval(toBD(-4), "=Round(-3.7)");
  527. assertEval(-4, "=Round(-4)");
  528. assertEval(toBD(3.73), "=Round(3.7345, 2)");
  529. assertEval(4, "=Round(4, 2)");
  530. assertEval(toBD(-3.73), "=Round(-3.7345, 2)");
  531. assertEval(-4, "=Round(-4, 2)");
  532. }
  533. public void testDateFuncs() throws Exception
  534. {
  535. assertEval("1/2/2003", "=CStr(DateValue(#01/02/2003 7:00:00 AM#))");
  536. assertEval("7:00:00 AM", "=CStr(TimeValue(#01/02/2003 7:00:00 AM#))");
  537. assertEval("1:10:00 PM", "=CStr(#13:10:00#)");
  538. assertEval(2003, "=Year(#01/02/2003 7:00:00 AM#)");
  539. assertEval(1, "=Month(#01/02/2003 7:00:00 AM#)");
  540. assertEval(2, "=Day(#01/02/2003 7:00:00 AM#)");
  541. assertEval(2003, "=Year('01/02/2003 7:00:00 AM')");
  542. assertEval(1899, "=Year(#7:00:00 AM#)");
  543. assertEquals(Calendar.getInstance().get(Calendar.YEAR),
  544. eval("=Year('01/02 7:00:00 AM')"));
  545. assertEval("January", "=MonthName(1)");
  546. assertEval("Feb", "=MonthName(2,True)");
  547. assertEval("March", "=MonthName(3,False)");
  548. assertEval(7, "=Hour(#01/02/2003 7:10:27 AM#)");
  549. assertEval(19, "=Hour(#01/02/2003 7:10:27 PM#)");
  550. assertEval(10, "=Minute(#01/02/2003 7:10:27 AM#)");
  551. assertEval(27, "=Second(#01/02/2003 7:10:27 AM#)");
  552. assertEval(7, "=Weekday(#11/22/2003#)");
  553. assertEval(3, "=Weekday(#11/22/2003#, 5)");
  554. assertEval(1, "=Weekday(#11/22/2003#, 7)");
  555. assertEval("Sunday", "=WeekdayName(1)");
  556. assertEval("Sun", "=WeekdayName(1,True)");
  557. assertEval("Tuesday", "=WeekdayName(1,False,3)");
  558. assertEval("Thu", "=WeekdayName(3,True,3)");
  559. assertTrue(((String)eval("=CStr(Date())"))
  560. .matches("\\d{1,2}/\\d{1,2}/\\d{4}"));
  561. assertTrue(((String)eval("=CStr(Time())"))
  562. .matches("\\d{1,2}:\\d{2}:\\d{2} (AM|PM)"));
  563. assertEval("3:57:34 AM", "=CStr(TimeSerial(3,57,34))");
  564. assertEval("3:57:34 PM", "=CStr(TimeSerial(15,57,34))");
  565. assertEval("5:45:00 AM", "=CStr(TimeSerial(6,-15,0))");
  566. assertEval("12:00:00 AM", "=CStr(TimeSerial(0,0,0))");
  567. assertEval("2:00:00 PM", "=CStr(TimeSerial(-10,0,0))");
  568. assertEval("6:00:00 AM", "=CStr(TimeSerial(30,0,0))");
  569. assertEval("2/12/1969", "=CStr(DateSerial(69,2,12))");
  570. assertEval("2/12/2010", "=CStr(DateSerial(10,2,12))");
  571. assertEval("7/12/2013", "=CStr(DateSerial(2014,-5,12))");
  572. assertEval("8/7/2013", "=CStr(DateSerial(2014,-5,38))");
  573. assertEval(1, "=DatePart('ww',#01/03/2018#)");
  574. assertEval(2, "=DatePart('ww',#01/03/2018#,4)");
  575. assertEval(1, "=DatePart('ww',#01/03/2018#,5)");
  576. assertEval(1, "=DatePart('ww',#01/03/2018#,4,3)");
  577. assertEval(52, "=DatePart('ww',#01/03/2018#,5,3)");
  578. assertEval(1, "=DatePart('ww',#01/03/2018#,4,2)");
  579. assertEval(53, "=DatePart('ww',#01/03/2018#,5,2)");
  580. assertEval(2003, "=DatePart('yyyy',#11/22/2003 5:45:13 AM#)");
  581. assertEval(4, "=DatePart('q',#11/22/2003 5:45:13 AM#)");
  582. assertEval(11, "=DatePart('m',#11/22/2003 5:45:13 AM#)");
  583. assertEval(326, "=DatePart('y',#11/22/2003 5:45:13 AM#)");
  584. assertEval(22, "=DatePart('d',#11/22/2003 5:45:13 AM#)");
  585. assertEval(7, "=DatePart('w',#11/22/2003 5:45:13 AM#)");
  586. assertEval(3, "=DatePart('w',#11/22/2003 5:45:13 AM#, 5)");
  587. assertEval(5, "=DatePart('h',#11/22/2003 5:45:13 AM#)");
  588. assertEval(45, "=DatePart('n',#11/22/2003 5:45:13 AM#)");
  589. assertEval(13, "=DatePart('s',#11/22/2003 5:45:13 AM#)");
  590. assertEval("11/22/2005 5:45:13 AM", "CStr(DateAdd('yyyy',2,#11/22/2003 5:45:13 AM#))");
  591. assertEval("2/22/2004 5:45:13 AM", "CStr(DateAdd('q',1,#11/22/2003 5:45:13 AM#))");
  592. assertEval("1/22/2004 5:45:13 AM", "CStr(DateAdd('m',2,#11/22/2003 5:45:13 AM#))");
  593. assertEval("12/12/2003 5:45:13 AM", "CStr(DateAdd('d',20,#11/22/2003 5:45:13 AM#))");
  594. assertEval("12/12/2003 5:45:13 AM", "CStr(DateAdd('w',20,#11/22/2003 5:45:13 AM#))");
  595. assertEval("12/12/2003 5:45:13 AM", "CStr(DateAdd('y',20,#11/22/2003 5:45:13 AM#))");
  596. assertEval("12/27/2003 5:45:13 AM", "CStr(DateAdd('ww',5,#11/22/2003 5:45:13 AM#))");
  597. assertEval("11/22/2003 3:45:13 PM", "CStr(DateAdd('h',10,#11/22/2003 5:45:13 AM#))");
  598. assertEval("11/22/2003 6:19:13 AM", "CStr(DateAdd('n',34,#11/22/2003 5:45:13 AM#))");
  599. assertEval("11/22/2003 5:46:27 AM", "CStr(DateAdd('s',74,#11/22/2003 5:45:13 AM#))");
  600. assertEval("12/12/2003", "CStr(DateAdd('d',20,#11/22/2003#))");
  601. assertEval("11/22/2003 10:00:00 AM", "CStr(DateAdd('h',10,#11/22/2003#))");
  602. assertEval("11/23/2003", "CStr(DateAdd('h',24,#11/22/2003#))");
  603. assertEval("3:45:13 PM", "CStr(DateAdd('h',10,#5:45:13 AM#))");
  604. assertEval("12/31/1899 11:45:13 AM", "CStr(DateAdd('h',30,#5:45:13 AM#))");
  605. assertEval(0, "=DateDiff('yyyy',#10/22/2003#,#11/22/2003#)");
  606. assertEval(4, "=DateDiff('yyyy',#10/22/2003#,#11/22/2007#)");
  607. assertEval(-4, "=DateDiff('yyyy',#11/22/2007#,#10/22/2003#)");
  608. assertEval(0, "=DateDiff('q',#10/22/2003#,#11/22/2003#)");
  609. assertEval(3, "=DateDiff('q',#03/01/2003#,#11/22/2003#)");
  610. assertEval(16, "=DateDiff('q',#10/22/2003#,#11/22/2007#)");
  611. assertEval(-13, "=DateDiff('q',#03/22/2007#,#10/22/2003#)");
  612. assertEval(1, "=DateDiff('m',#10/22/2003#,#11/01/2003#)");
  613. assertEval(8, "=DateDiff('m',#03/22/2003#,#11/01/2003#)");
  614. assertEval(49, "=DateDiff('m',#10/22/2003#,#11/22/2007#)");
  615. assertEval(-41, "=DateDiff('m',#03/22/2007#,#10/01/2003#)");
  616. assertEval(10, "=DateDiff('d','10/22','11/01')");
  617. assertEval(0, "=DateDiff('y',#1:37:00 AM#,#2:15:00 AM#)");
  618. assertEval(10, "=DateDiff('d',#10/22/2003#,#11/01/2003#)");
  619. assertEval(1, "=DateDiff('d',#10/22/2003 11:00:00 PM#,#10/23/2003 1:00:00 AM#)");
  620. assertEval(224, "=DateDiff('d',#03/22/2003#,#11/01/2003#)");
  621. assertEval(1492, "=DateDiff('y',#10/22/2003#,#11/22/2007#)");
  622. assertEval(-1268, "=DateDiff('d',#03/22/2007#,#10/01/2003#)");
  623. assertEval(366, "=DateDiff('d',#1/1/2000#,#1/1/2001#)");
  624. assertEval(365, "=DateDiff('d',#1/1/2001#,#1/1/2002#)");
  625. assertEval(0, "=DateDiff('w',#11/3/2018#,#11/04/2018#)");
  626. assertEval(1, "=DateDiff('w',#11/3/2018#,#11/10/2018#)");
  627. assertEval(0, "=DateDiff('w',#12/31/2017#,#1/1/2018#)");
  628. assertEval(32, "=DateDiff('w',#03/22/2003#,#11/01/2003#)");
  629. assertEval(213, "=DateDiff('w',#10/22/2003#,#11/22/2007#)");
  630. assertEval(-181, "=DateDiff('w',#03/22/2007#,#10/01/2003#)");
  631. assertEval(1, "=DateDiff('ww',#11/3/2018#,#11/04/2018#)");
  632. assertEval(1, "=DateDiff('ww',#11/3/2018#,#11/10/2018#)");
  633. assertEval(0, "=DateDiff('ww',#12/31/2017#,#1/1/2018#)");
  634. assertEval(1, "=DateDiff('ww',#12/31/2017#,#1/1/2018#,2)");
  635. assertEval(0, "=DateDiff('ww',#12/31/2017#,#1/1/2018#,1,3)");
  636. assertEval(53, "=DateDiff('ww',#1/1/2000#,#1/1/2001#)");
  637. assertEval(32, "=DateDiff('ww',#03/22/2003#,#11/01/2003#)");
  638. assertEval(213, "=DateDiff('ww',#10/22/2003#,#11/22/2007#)");
  639. assertEval(-181, "=DateDiff('ww',#03/22/2007#,#10/01/2003#)");
  640. assertEval(1, "=DateDiff('h',#1:37:00 AM#,#2:15:00 AM#)");
  641. assertEval(13, "=DateDiff('h',#1:37:00 AM#,#2:15:00 PM#)");
  642. assertEval(1, "=DateDiff('h',#11/3/2018 1:37:00 AM#,#11/3/2018 2:15:00 AM#)");
  643. assertEval(13, "=DateDiff('h',#11/3/2018 1:37:00 AM#,#11/3/2018 2:15:00 PM#)");
  644. assertEval(24, "=DateDiff('h',#11/3/2018#,#11/4/2018#)");
  645. assertEval(5641, "=DateDiff('h',#3/13/2018 1:37:00 AM#,#11/3/2018 2:15:00 AM#)");
  646. assertEval(23161, "=DateDiff('h',#3/13/2016 1:37:00 AM#,#11/3/2018 2:15:00 AM#)");
  647. assertEval(-23173, "=DateDiff('h',#11/3/2018 2:15:00 PM#,#3/13/2016 1:37:00 AM#)");
  648. assertEval(1, "=DateDiff('n',#1:37:59 AM#,#1:38:00 AM#)");
  649. assertEval(758, "=DateDiff('n',#1:37:30 AM#,#2:15:13 PM#)");
  650. assertEval(1, "=DateDiff('n',#11/3/2018 1:37:59 AM#,#11/3/2018 1:38:00 AM#)");
  651. assertEval(758, "=DateDiff('n',#11/3/2018 1:37:59 AM#,#11/3/2018 2:15:00 PM#)");
  652. assertEval(1440, "=DateDiff('n',#11/3/2018#,#11/4/2018#)");
  653. assertEval(338438, "=DateDiff('n',#3/13/2018 1:37:59 AM#,#11/3/2018 2:15:00 AM#)");
  654. assertEval(1389638, "=DateDiff('n',#3/13/2016 1:37:30 AM#,#11/3/2018 2:15:13 AM#)");
  655. assertEval(-1390358, "=DateDiff('n',#11/3/2018 2:15:30 PM#,#3/13/2016 1:37:13 AM#)");
  656. assertEval(1, "=DateDiff('s',#1:37:59 AM#,#1:38:00 AM#)");
  657. assertEval(35, "=DateDiff('s',#1:37:10 AM#,#1:37:45 AM#)");
  658. assertEval(45463, "=DateDiff('s',#1:37:30 AM#,#2:15:13 PM#)");
  659. assertEval(1, "=DateDiff('s',#11/3/2018 1:37:59 AM#,#11/3/2018 1:38:00 AM#)");
  660. assertEval(45463, "=DateDiff('s',#11/3/2018 1:37:30 AM#,#11/3/2018 2:15:13 PM#)");
  661. assertEval(86400, "=DateDiff('s',#11/3/2018#,#11/4/2018#)");
  662. assertEval(20306221, "=DateDiff('s',#3/13/2018 1:37:59 AM#,#11/3/2018 2:15:00 AM#)");
  663. assertEval(83378263, "=DateDiff('s',#3/13/2016 1:37:30 AM#,#11/3/2018 2:15:13 AM#)");
  664. assertEval(-83421497, "=DateDiff('s',#11/3/2018 2:15:30 PM#,#3/13/2016 1:37:13 AM#)");
  665. }
  666. public void testFinancialFuncs() throws Exception
  667. {
  668. assertEval("-9.57859403981306", "=CStr(NPer(0.12/12,-100,-1000))");
  669. assertEval("-9.48809500550578", "=CStr(NPer(0.12/12,-100,-1000,0,1))");
  670. assertEval("60.0821228537616", "=CStr(NPer(0.12/12,-100,-1000,10000))");
  671. assertEval("59.6738656742947", "=CStr(NPer(0.12/12,-100,-1000,10000,1))");
  672. assertEval("69.6607168935747", "=CStr(NPer(0.12/12,-100,0,10000))");
  673. assertEval("69.1619606798005", "=CStr(NPer(0.12/12,-100,0,10000,1))");
  674. assertEval("8166.96698564091", "=CStr(FV(0.12/12,60,-100))");
  675. assertEval("8248.63665549732", "=CStr(FV(0.12/12,60,-100,0,1))");
  676. assertEval("6350.27028707682", "=CStr(FV(0.12/12,60,-100,1000))");
  677. assertEval("6431.93995693323", "=CStr(FV(0.12/12,60,-100,1000,1))");
  678. assertEval("4495.5038406224", "=CStr(PV(0.12/12,60,-100))");
  679. assertEval("4540.45887902863", "=CStr(PV(0.12/12,60,-100,0,1))");
  680. assertEval("-1008.99231875519", "=CStr(PV(0.12/12,60,-100,10000))");
  681. assertEval("-964.03728034897", "=CStr(PV(0.12/12,60,-100,10000,1))");
  682. assertEval("22.2444476849018", "=CStr(Pmt(0.12/12,60,-1000))");
  683. assertEval("22.0242056286156", "=CStr(Pmt(0.12/12,60,-1000,0,1))");
  684. assertEval("-100.200029164116", "=CStr(Pmt(0.12/12,60,-1000,10000))");
  685. assertEval("-99.2079496674414", "=CStr(Pmt(0.12/12,60,-1000,10000,1))");
  686. assertEval("-122.444476849018", "=CStr(Pmt(0.12/12,60,0,10000))");
  687. assertEval("-121.232155296057", "=CStr(Pmt(0.12/12,60,0,10000,1))");
  688. assertEval("22.2444476849018", "=CStr(Pmt(0.12/12,60,-1000))");
  689. assertEval("10", "=CStr(IPmt(0.12/12,1,60,-1000))");
  690. assertEval("5.90418478297567", "=CStr(IPmt(0.12/12,30,60,-1000))");
  691. assertEval("0", "=CStr(IPmt(0.12/12,1,60,-1000,0,1))");
  692. assertEval("5.8457275078967", "=CStr(IPmt(0.12/12,30,60,-1000,0,1))");
  693. assertEval("0", "=CStr(IPmt(0.12/12,1,60,0,10000))");
  694. assertEval("40.9581521702433", "=CStr(IPmt(0.12/12,30,60,0,10000))");
  695. assertEval("0", "=CStr(IPmt(0.12/12,1,60,0,10000,1))");
  696. assertEval("40.552625911132", "=CStr(IPmt(0.12/12,30,60,0,10000,1))");
  697. assertEval("10", "=CStr(IPmt(0.12/12,1,60,-1000,10000))");
  698. assertEval("46.862336953219", "=CStr(IPmt(0.12/12,30,60,-1000,10000))");
  699. assertEval("0", "=CStr(IPmt(0.12/12,1,60,-1000,10000,1))");
  700. assertEval("46.3983534190287", "=CStr(IPmt(0.12/12,30,60,-1000,10000,1))");
  701. assertEval("12.2444476849018", "=CStr(PPmt(0.12/12,1,60,-1000))");
  702. assertEval("16.3402629019261", "=CStr(PPmt(0.12/12,30,60,-1000))");
  703. assertEval("22.0242056286156", "=CStr(PPmt(0.12/12,1,60,-1000,0,1))");
  704. assertEval("16.1784781207189", "=CStr(PPmt(0.12/12,30,60,-1000,0,1))");
  705. assertEval("-122.444476849018", "=CStr(PPmt(0.12/12,1,60,0,10000))");
  706. assertEval("-163.402629019261", "=CStr(PPmt(0.12/12,30,60,0,10000))");
  707. assertEval("-121.232155296057", "=CStr(PPmt(0.12/12,1,60,0,10000,1))");
  708. assertEval("-161.784781207189", "=CStr(PPmt(0.12/12,30,60,0,10000,1))");
  709. assertEval("-110.200029164116", "=CStr(PPmt(0.12/12,1,60,-1000,10000))");
  710. assertEval("-147.062366117335", "=CStr(PPmt(0.12/12,30,60,-1000,10000))");
  711. assertEval("-99.2079496674414", "=CStr(PPmt(0.12/12,1,60,-1000,10000,1))");
  712. assertEval("-145.60630308647", "=CStr(PPmt(0.12/12,30,60,-1000,10000,1))");
  713. assertEval("1.31506849315068", "=CStr(DDB(2400,300,10*365,1))");
  714. assertEval("40", "=CStr(DDB(2400,300,10*12,1))");
  715. assertEval("480", "=CStr(DDB(2400,300,10,1))");
  716. assertEval("22.1225472000002", "=CStr(DDB(2400,300,10,10))");
  717. assertEval("245.76", "=CStr(DDB(2400,300,10,4))");
  718. assertEval("307.2", "=CStr(DDB(2400,300,10,3))");
  719. assertEval("480", "=CStr(DDB(2400,300,10,0.1))");
  720. assertEval("274.768033075174", "=CStr(DDB(2400,300,10,3.5))");
  721. assertEval("2250", "=CStr(SLN(30000,7500,10))");
  722. assertEval("1000", "=CStr(SLN(10000,5000,5))");
  723. assertEval("1142.85714285714", "=CStr(SLN(8000,0,7))");
  724. assertEval("4090.90909090909", "=CStr(SYD(30000,7500,10,1))");
  725. assertEval("409.090909090909", "=CStr(SYD(30000,7500,10,10))");
  726. assertEval("-1.63048347266756E-02", "=CStr(Rate(3,200,-610,0,-20,0.1))");
  727. assertEval("7.70147248820165E-03", "=CStr(Rate(4*12,-200,8000))");
  728. assertEval("-1.09802980531205", "=CStr(Rate(60,93.22,5000,0.1))");
  729. }
  730. static void assertEval(Object expected, String exprStr) {
  731. try {
  732. assertEquals(expected, eval(exprStr));
  733. } catch(Error e) {
  734. // Convenience for adding new tests
  735. // System.err.println("[ERROR] " + e);
  736. throw e;
  737. }
  738. }
  739. }