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 35KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811
  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 a 6 2", "=Format(#01/10/2003 7:00:00 AM#, 'hh:nn a/p w ww')");
  289. assertEval("07:00 a 4 1", "=Format(#01/10/2003 7:00:00 AM#, 'hh:nn a/p w ww', 3, 3)");
  290. assertEval("1313", "=Format(#01/10/2003 7:13:00 AM#, 'nnnn; foo bar')");
  291. assertEval("1 1/10/2003 7:13:00 AM ttt this is text",
  292. "=Format(#01/10/2003 7:13:00 AM#, 'q c ttt \"this is text\"')");
  293. assertEval("1 1/10/2003 ttt this is text",
  294. "=Format(#01/10/2003#, 'q c ttt \"this is text\"')");
  295. assertEval("4 7:13:00 AM ttt this 'is' \"text\"",
  296. "=Format(#7:13:00 AM#, \"q c ttt \"\"this 'is' \"\"\"\"text\"\"\"\"\"\"\")");
  297. assertEval("12/29/1899", "=Format('true', 'c')");
  298. assertEval("Tuesday, 00 Jan 2, 21:36:00 Y",
  299. "=Format('3.9', '*~dddd, yy mmm d, hh:nn:ss \\Y[Yellow]')");
  300. assertEval("Tuesday, 00 Jan 01/2, 09:36:00 PM",
  301. "=Format('3.9', 'dddd, yy mmm mm/d, hh:nn:ss AMPM')");
  302. assertEval("foo",
  303. "=Format('foo', 'dddd, yy mmm mm d, hh:nn:ss AMPM')");
  304. assertEvalFormat("';\\y;\\n'",
  305. "foo", "'foo'",
  306. "", "''",
  307. "y", "True",
  308. "n", "'0'",
  309. "", "Null");
  310. assertEvalFormat("';\"y\";!\\n;*~\\z[Blue];'",
  311. "foo", "'foo'",
  312. "", "''",
  313. "y", "True",
  314. "n", "'0'",
  315. "z", "Null");
  316. assertEvalFormat("'\"p\"#.00#\"blah\"'",
  317. "p13.00blah", "13",
  318. "-p13.00blah", "-13",
  319. "p.00blah", "0",
  320. "", "''",
  321. "", "Null");
  322. assertEvalFormat("'\"p\"#.00#\"blah\";(\"p\"#.00#\"blah\")'",
  323. "p13.00blah", "13",
  324. "(p13.00blah)", "-13",
  325. "p.00blah", "0",
  326. "(p1.00blah)", "True",
  327. "p.00blah", "'false'",
  328. "p37623.292blah", "#01/02/2003 7:00:00 AM#",
  329. "p37623.292blah", "'01/02/2003 7:00:00 AM'",
  330. "NotANumber", "'NotANumber'",
  331. "", "''",
  332. "", "Null");
  333. assertEvalFormat("'\"p\"#.00#\"blah\";!(\"p\"#.00#\"blah\")[Red];\"zero\"'",
  334. "p13.00blah", "13",
  335. "(p13.00blah)", "-13",
  336. "zero", "0",
  337. "", "''",
  338. "", "Null");
  339. assertEvalFormat("'\"p\"#.00#\"blah\";(\"p\"#.00#\"blah\");\"zero\";\"yuck\"'",
  340. "p13.00blah", "13",
  341. "(p13.00blah)", "-13",
  342. "zero", "0",
  343. "", "''",
  344. "yuck", "Null");
  345. assertEvalFormat("'0.##;(0.###);\"zero\";\"yuck\"'",
  346. "0.03", "0.03",
  347. "zero", "0.003",
  348. "(0.003)", "-0.003",
  349. "zero", "-0.0003");
  350. // FIXME, need to handle rounding w/ negatives
  351. // FIXME, need to handle dangling decimal
  352. // assertEvalFormat("'0.##;(0.###E+0)'",
  353. // "0.03", "0.03",
  354. // "(0.003)", "-0.0003",
  355. assertEvalFormat("'0.'",
  356. "13.", "13",
  357. "0.", "0.003",
  358. "-45.", "-45",
  359. "0.", "-0.003",
  360. "0.", "0"
  361. );
  362. assertEvalFormat("'0.#'",
  363. "13.", "13",
  364. "0.3", "0.3",
  365. "0.", "0.003",
  366. "-45.", "-45",
  367. "0.", "-0.003",
  368. "0.", "0"
  369. );
  370. assertEvalFormat("'0'",
  371. "13", "13",
  372. "0", "0.003",
  373. "-45", "-45",
  374. "0", "-0.003",
  375. "0", "0"
  376. );
  377. assertEvalFormat("'#'",
  378. "13", "13",
  379. "0", "0.003",
  380. "-45", "-45",
  381. "0", "-0.003"
  382. // FIXME
  383. // "", "0"
  384. );
  385. assertEvalFormat("'$0.0#'",
  386. "$213.0", "213");
  387. assertEvalFormat("'@'",
  388. "foo", "'foo'",
  389. "-13", "-13",
  390. "0", "0",
  391. "", "''",
  392. "", "Null");
  393. assertEvalFormat("'>@'",
  394. "FOO", "'foo'",
  395. "-13", "-13",
  396. "0", "0",
  397. "", "''",
  398. "", "Null");
  399. assertEvalFormat("'<@'",
  400. "foo", "'FOO'",
  401. "-13", "-13",
  402. "0", "0",
  403. "", "''",
  404. "", "Null");
  405. assertEvalFormat("'!>@'",
  406. "O", "'foo'",
  407. "3", "-13",
  408. "0", "0",
  409. "", "''",
  410. "", "Null");
  411. assertEvalFormat("'!>@[Red];\"empty\"'",
  412. "O", "'foo'",
  413. "3", "-13",
  414. "0", "0",
  415. "empty", "''",
  416. "empty", "Null");
  417. assertEvalFormat("'><@'",
  418. "fOo", "'fOo'");
  419. assertEvalFormat("'\\x@@@&&&\\y'",
  420. "x fy", "'f'",
  421. "x fooy", "'foo'",
  422. "x foobay", "'fooba'",
  423. "xfoobarybaz", "'foobarbaz'"
  424. );
  425. assertEvalFormat("'!\\x@@@&&&\\y'",
  426. "xf y", "'f'",
  427. "xfooy", "'foo'",
  428. "xfoobay", "'fooba'",
  429. "xbarbazy", "'foobarbaz'"
  430. );
  431. assertEvalFormat("'\\x&&&@@@\\y'",
  432. "x fy", "'f'",
  433. "xfooy", "'foo'",
  434. "xfoobay", "'fooba'",
  435. "xfoobarybaz", "'foobarbaz'"
  436. );
  437. assertEvalFormat("'!\\x&&&@@@\\y'",
  438. "xf y", "'f'",
  439. "xfoo y", "'foo'",
  440. "xfooba y", "'fooba'",
  441. "xbarbazy", "'foobarbaz'"
  442. );
  443. }
  444. private static void assertEvalFormat(String fmtStr, String... testStrs) {
  445. for(int i = 0; i < testStrs.length; i+=2) {
  446. String expected = testStrs[i];
  447. String val = testStrs[i + 1];
  448. try {
  449. assertEval(expected,
  450. "=Format(" + val + ", " + fmtStr + ")");
  451. } catch(AssertionFailedError afe) {
  452. throw new AssertionFailedError("Input " + val + ": " +
  453. afe.getMessage());
  454. }
  455. }
  456. }
  457. public void testNumberFuncs() throws Exception
  458. {
  459. assertEval(1, "=Abs(1)");
  460. assertEval(1, "=Abs(-1)");
  461. assertEval(toBD(1.1), "=Abs(-1.1)");
  462. assertEval(Math.atan(0.2), "=Atan(0.2)");
  463. assertEval(Math.sin(0.2), "=Sin(0.2)");
  464. assertEval(Math.tan(0.2), "=Tan(0.2)");
  465. assertEval(Math.cos(0.2), "=Cos(0.2)");
  466. assertEval(Math.exp(0.2), "=Exp(0.2)");
  467. assertEval(Math.log(0.2), "=Log(0.2)");
  468. assertEval(Math.sqrt(4.3), "=Sqr(4.3)");
  469. assertEval(3, "=Fix(3.5)");
  470. assertEval(4, "=Fix(4)");
  471. assertEval(-3, "=Fix(-3.5)");
  472. assertEval(-4, "=Fix(-4)");
  473. assertEval(1, "=Sgn(3.5)");
  474. assertEval(1, "=Sgn(4)");
  475. assertEval(-1, "=Sgn(-3.5)");
  476. assertEval(-1, "=Sgn(-4)");
  477. assertEval(3, "=Int(3.5)");
  478. assertEval(4, "=Int(4)");
  479. assertEval(-4, "=Int(-3.5)");
  480. assertEval(-4, "=Int(-4)");
  481. assertEval(toBD(4), "=Round(3.7)");
  482. assertEval(4, "=Round(4)");
  483. assertEval(toBD(-4), "=Round(-3.7)");
  484. assertEval(-4, "=Round(-4)");
  485. assertEval(toBD(3.73), "=Round(3.7345, 2)");
  486. assertEval(4, "=Round(4, 2)");
  487. assertEval(toBD(-3.73), "=Round(-3.7345, 2)");
  488. assertEval(-4, "=Round(-4, 2)");
  489. }
  490. public void testDateFuncs() throws Exception
  491. {
  492. assertEval("1/2/2003", "=CStr(DateValue(#01/02/2003 7:00:00 AM#))");
  493. assertEval("7:00:00 AM", "=CStr(TimeValue(#01/02/2003 7:00:00 AM#))");
  494. assertEval("1:10:00 PM", "=CStr(#13:10:00#)");
  495. assertEval(2003, "=Year(#01/02/2003 7:00:00 AM#)");
  496. assertEval(1, "=Month(#01/02/2003 7:00:00 AM#)");
  497. assertEval(2, "=Day(#01/02/2003 7:00:00 AM#)");
  498. assertEval(2003, "=Year('01/02/2003 7:00:00 AM')");
  499. assertEval(1899, "=Year(#7:00:00 AM#)");
  500. assertEquals(Calendar.getInstance().get(Calendar.YEAR),
  501. eval("=Year('01/02 7:00:00 AM')"));
  502. assertEval("January", "=MonthName(1)");
  503. assertEval("Feb", "=MonthName(2,True)");
  504. assertEval("March", "=MonthName(3,False)");
  505. assertEval(7, "=Hour(#01/02/2003 7:10:27 AM#)");
  506. assertEval(19, "=Hour(#01/02/2003 7:10:27 PM#)");
  507. assertEval(10, "=Minute(#01/02/2003 7:10:27 AM#)");
  508. assertEval(27, "=Second(#01/02/2003 7:10:27 AM#)");
  509. assertEval(7, "=Weekday(#11/22/2003#)");
  510. assertEval(3, "=Weekday(#11/22/2003#, 5)");
  511. assertEval(1, "=Weekday(#11/22/2003#, 7)");
  512. assertEval("Sunday", "=WeekdayName(1)");
  513. assertEval("Sun", "=WeekdayName(1,True)");
  514. assertEval("Tuesday", "=WeekdayName(1,False,3)");
  515. assertEval("Thu", "=WeekdayName(3,True,3)");
  516. assertTrue(((String)eval("=CStr(Date())"))
  517. .matches("\\d{1,2}/\\d{1,2}/\\d{4}"));
  518. assertTrue(((String)eval("=CStr(Time())"))
  519. .matches("\\d{1,2}:\\d{2}:\\d{2} (AM|PM)"));
  520. assertEval("3:57:34 AM", "=CStr(TimeSerial(3,57,34))");
  521. assertEval("3:57:34 PM", "=CStr(TimeSerial(15,57,34))");
  522. assertEval("5:45:00 AM", "=CStr(TimeSerial(6,-15,0))");
  523. assertEval("12:00:00 AM", "=CStr(TimeSerial(0,0,0))");
  524. assertEval("2:00:00 PM", "=CStr(TimeSerial(-10,0,0))");
  525. assertEval("6:00:00 AM", "=CStr(TimeSerial(30,0,0))");
  526. assertEval("2/12/1969", "=CStr(DateSerial(69,2,12))");
  527. assertEval("2/12/2010", "=CStr(DateSerial(10,2,12))");
  528. assertEval("7/12/2013", "=CStr(DateSerial(2014,-5,12))");
  529. assertEval("8/7/2013", "=CStr(DateSerial(2014,-5,38))");
  530. assertEval(1, "=DatePart('ww',#01/03/2018#)");
  531. assertEval(2, "=DatePart('ww',#01/03/2018#,4)");
  532. assertEval(1, "=DatePart('ww',#01/03/2018#,5)");
  533. assertEval(1, "=DatePart('ww',#01/03/2018#,4,3)");
  534. assertEval(52, "=DatePart('ww',#01/03/2018#,5,3)");
  535. assertEval(1, "=DatePart('ww',#01/03/2018#,4,2)");
  536. assertEval(53, "=DatePart('ww',#01/03/2018#,5,2)");
  537. assertEval(2003, "=DatePart('yyyy',#11/22/2003 5:45:13 AM#)");
  538. assertEval(4, "=DatePart('q',#11/22/2003 5:45:13 AM#)");
  539. assertEval(11, "=DatePart('m',#11/22/2003 5:45:13 AM#)");
  540. assertEval(326, "=DatePart('y',#11/22/2003 5:45:13 AM#)");
  541. assertEval(22, "=DatePart('d',#11/22/2003 5:45:13 AM#)");
  542. assertEval(7, "=DatePart('w',#11/22/2003 5:45:13 AM#)");
  543. assertEval(3, "=DatePart('w',#11/22/2003 5:45:13 AM#, 5)");
  544. assertEval(5, "=DatePart('h',#11/22/2003 5:45:13 AM#)");
  545. assertEval(45, "=DatePart('n',#11/22/2003 5:45:13 AM#)");
  546. assertEval(13, "=DatePart('s',#11/22/2003 5:45:13 AM#)");
  547. assertEval("11/22/2005 5:45:13 AM", "CStr(DateAdd('yyyy',2,#11/22/2003 5:45:13 AM#))");
  548. assertEval("2/22/2004 5:45:13 AM", "CStr(DateAdd('q',1,#11/22/2003 5:45:13 AM#))");
  549. assertEval("1/22/2004 5:45:13 AM", "CStr(DateAdd('m',2,#11/22/2003 5:45:13 AM#))");
  550. assertEval("12/12/2003 5:45:13 AM", "CStr(DateAdd('d',20,#11/22/2003 5:45:13 AM#))");
  551. assertEval("12/12/2003 5:45:13 AM", "CStr(DateAdd('w',20,#11/22/2003 5:45:13 AM#))");
  552. assertEval("12/12/2003 5:45:13 AM", "CStr(DateAdd('y',20,#11/22/2003 5:45:13 AM#))");
  553. assertEval("12/27/2003 5:45:13 AM", "CStr(DateAdd('ww',5,#11/22/2003 5:45:13 AM#))");
  554. assertEval("11/22/2003 3:45:13 PM", "CStr(DateAdd('h',10,#11/22/2003 5:45:13 AM#))");
  555. assertEval("11/22/2003 6:19:13 AM", "CStr(DateAdd('n',34,#11/22/2003 5:45:13 AM#))");
  556. assertEval("11/22/2003 5:46:27 AM", "CStr(DateAdd('s',74,#11/22/2003 5:45:13 AM#))");
  557. assertEval("12/12/2003", "CStr(DateAdd('d',20,#11/22/2003#))");
  558. assertEval("11/22/2003 10:00:00 AM", "CStr(DateAdd('h',10,#11/22/2003#))");
  559. assertEval("11/23/2003", "CStr(DateAdd('h',24,#11/22/2003#))");
  560. assertEval("3:45:13 PM", "CStr(DateAdd('h',10,#5:45:13 AM#))");
  561. assertEval("12/31/1899 11:45:13 AM", "CStr(DateAdd('h',30,#5:45:13 AM#))");
  562. assertEval(0, "=DateDiff('yyyy',#10/22/2003#,#11/22/2003#)");
  563. assertEval(4, "=DateDiff('yyyy',#10/22/2003#,#11/22/2007#)");
  564. assertEval(-4, "=DateDiff('yyyy',#11/22/2007#,#10/22/2003#)");
  565. assertEval(0, "=DateDiff('q',#10/22/2003#,#11/22/2003#)");
  566. assertEval(3, "=DateDiff('q',#03/01/2003#,#11/22/2003#)");
  567. assertEval(16, "=DateDiff('q',#10/22/2003#,#11/22/2007#)");
  568. assertEval(-13, "=DateDiff('q',#03/22/2007#,#10/22/2003#)");
  569. assertEval(1, "=DateDiff('m',#10/22/2003#,#11/01/2003#)");
  570. assertEval(8, "=DateDiff('m',#03/22/2003#,#11/01/2003#)");
  571. assertEval(49, "=DateDiff('m',#10/22/2003#,#11/22/2007#)");
  572. assertEval(-41, "=DateDiff('m',#03/22/2007#,#10/01/2003#)");
  573. assertEval(10, "=DateDiff('d','10/22','11/01')");
  574. assertEval(0, "=DateDiff('y',#1:37:00 AM#,#2:15:00 AM#)");
  575. assertEval(10, "=DateDiff('d',#10/22/2003#,#11/01/2003#)");
  576. assertEval(1, "=DateDiff('d',#10/22/2003 11:00:00 PM#,#10/23/2003 1:00:00 AM#)");
  577. assertEval(224, "=DateDiff('d',#03/22/2003#,#11/01/2003#)");
  578. assertEval(1492, "=DateDiff('y',#10/22/2003#,#11/22/2007#)");
  579. assertEval(-1268, "=DateDiff('d',#03/22/2007#,#10/01/2003#)");
  580. assertEval(366, "=DateDiff('d',#1/1/2000#,#1/1/2001#)");
  581. assertEval(365, "=DateDiff('d',#1/1/2001#,#1/1/2002#)");
  582. assertEval(0, "=DateDiff('w',#11/3/2018#,#11/04/2018#)");
  583. assertEval(1, "=DateDiff('w',#11/3/2018#,#11/10/2018#)");
  584. assertEval(0, "=DateDiff('w',#12/31/2017#,#1/1/2018#)");
  585. assertEval(32, "=DateDiff('w',#03/22/2003#,#11/01/2003#)");
  586. assertEval(213, "=DateDiff('w',#10/22/2003#,#11/22/2007#)");
  587. assertEval(-181, "=DateDiff('w',#03/22/2007#,#10/01/2003#)");
  588. assertEval(1, "=DateDiff('ww',#11/3/2018#,#11/04/2018#)");
  589. assertEval(1, "=DateDiff('ww',#11/3/2018#,#11/10/2018#)");
  590. assertEval(0, "=DateDiff('ww',#12/31/2017#,#1/1/2018#)");
  591. assertEval(1, "=DateDiff('ww',#12/31/2017#,#1/1/2018#,2)");
  592. assertEval(0, "=DateDiff('ww',#12/31/2017#,#1/1/2018#,1,3)");
  593. assertEval(53, "=DateDiff('ww',#1/1/2000#,#1/1/2001#)");
  594. assertEval(32, "=DateDiff('ww',#03/22/2003#,#11/01/2003#)");
  595. assertEval(213, "=DateDiff('ww',#10/22/2003#,#11/22/2007#)");
  596. assertEval(-181, "=DateDiff('ww',#03/22/2007#,#10/01/2003#)");
  597. assertEval(1, "=DateDiff('h',#1:37:00 AM#,#2:15:00 AM#)");
  598. assertEval(13, "=DateDiff('h',#1:37:00 AM#,#2:15:00 PM#)");
  599. assertEval(1, "=DateDiff('h',#11/3/2018 1:37:00 AM#,#11/3/2018 2:15:00 AM#)");
  600. assertEval(13, "=DateDiff('h',#11/3/2018 1:37:00 AM#,#11/3/2018 2:15:00 PM#)");
  601. assertEval(24, "=DateDiff('h',#11/3/2018#,#11/4/2018#)");
  602. assertEval(5641, "=DateDiff('h',#3/13/2018 1:37:00 AM#,#11/3/2018 2:15:00 AM#)");
  603. assertEval(23161, "=DateDiff('h',#3/13/2016 1:37:00 AM#,#11/3/2018 2:15:00 AM#)");
  604. assertEval(-23173, "=DateDiff('h',#11/3/2018 2:15:00 PM#,#3/13/2016 1:37:00 AM#)");
  605. assertEval(1, "=DateDiff('n',#1:37:59 AM#,#1:38:00 AM#)");
  606. assertEval(758, "=DateDiff('n',#1:37:30 AM#,#2:15:13 PM#)");
  607. assertEval(1, "=DateDiff('n',#11/3/2018 1:37:59 AM#,#11/3/2018 1:38:00 AM#)");
  608. assertEval(758, "=DateDiff('n',#11/3/2018 1:37:59 AM#,#11/3/2018 2:15:00 PM#)");
  609. assertEval(1440, "=DateDiff('n',#11/3/2018#,#11/4/2018#)");
  610. assertEval(338438, "=DateDiff('n',#3/13/2018 1:37:59 AM#,#11/3/2018 2:15:00 AM#)");
  611. assertEval(1389638, "=DateDiff('n',#3/13/2016 1:37:30 AM#,#11/3/2018 2:15:13 AM#)");
  612. assertEval(-1390358, "=DateDiff('n',#11/3/2018 2:15:30 PM#,#3/13/2016 1:37:13 AM#)");
  613. assertEval(1, "=DateDiff('s',#1:37:59 AM#,#1:38:00 AM#)");
  614. assertEval(35, "=DateDiff('s',#1:37:10 AM#,#1:37:45 AM#)");
  615. assertEval(45463, "=DateDiff('s',#1:37:30 AM#,#2:15:13 PM#)");
  616. assertEval(1, "=DateDiff('s',#11/3/2018 1:37:59 AM#,#11/3/2018 1:38:00 AM#)");
  617. assertEval(45463, "=DateDiff('s',#11/3/2018 1:37:30 AM#,#11/3/2018 2:15:13 PM#)");
  618. assertEval(86400, "=DateDiff('s',#11/3/2018#,#11/4/2018#)");
  619. assertEval(20306221, "=DateDiff('s',#3/13/2018 1:37:59 AM#,#11/3/2018 2:15:00 AM#)");
  620. assertEval(83378263, "=DateDiff('s',#3/13/2016 1:37:30 AM#,#11/3/2018 2:15:13 AM#)");
  621. assertEval(-83421497, "=DateDiff('s',#11/3/2018 2:15:30 PM#,#3/13/2016 1:37:13 AM#)");
  622. }
  623. public void testFinancialFuncs() throws Exception
  624. {
  625. assertEval("-9.57859403981306", "=CStr(NPer(0.12/12,-100,-1000))");
  626. assertEval("-9.48809500550578", "=CStr(NPer(0.12/12,-100,-1000,0,1))");
  627. assertEval("60.0821228537616", "=CStr(NPer(0.12/12,-100,-1000,10000))");
  628. assertEval("59.6738656742947", "=CStr(NPer(0.12/12,-100,-1000,10000,1))");
  629. assertEval("69.6607168935747", "=CStr(NPer(0.12/12,-100,0,10000))");
  630. assertEval("69.1619606798005", "=CStr(NPer(0.12/12,-100,0,10000,1))");
  631. assertEval("8166.96698564091", "=CStr(FV(0.12/12,60,-100))");
  632. assertEval("8248.63665549732", "=CStr(FV(0.12/12,60,-100,0,1))");
  633. assertEval("6350.27028707682", "=CStr(FV(0.12/12,60,-100,1000))");
  634. assertEval("6431.93995693323", "=CStr(FV(0.12/12,60,-100,1000,1))");
  635. assertEval("4495.5038406224", "=CStr(PV(0.12/12,60,-100))");
  636. assertEval("4540.45887902863", "=CStr(PV(0.12/12,60,-100,0,1))");
  637. assertEval("-1008.99231875519", "=CStr(PV(0.12/12,60,-100,10000))");
  638. assertEval("-964.03728034897", "=CStr(PV(0.12/12,60,-100,10000,1))");
  639. assertEval("22.2444476849018", "=CStr(Pmt(0.12/12,60,-1000))");
  640. assertEval("22.0242056286156", "=CStr(Pmt(0.12/12,60,-1000,0,1))");
  641. assertEval("-100.200029164116", "=CStr(Pmt(0.12/12,60,-1000,10000))");
  642. assertEval("-99.2079496674414", "=CStr(Pmt(0.12/12,60,-1000,10000,1))");
  643. assertEval("-122.444476849018", "=CStr(Pmt(0.12/12,60,0,10000))");
  644. assertEval("-121.232155296057", "=CStr(Pmt(0.12/12,60,0,10000,1))");
  645. assertEval("22.2444476849018", "=CStr(Pmt(0.12/12,60,-1000))");
  646. assertEval("10", "=CStr(IPmt(0.12/12,1,60,-1000))");
  647. assertEval("5.90418478297567", "=CStr(IPmt(0.12/12,30,60,-1000))");
  648. assertEval("0", "=CStr(IPmt(0.12/12,1,60,-1000,0,1))");
  649. assertEval("5.8457275078967", "=CStr(IPmt(0.12/12,30,60,-1000,0,1))");
  650. assertEval("0", "=CStr(IPmt(0.12/12,1,60,0,10000))");
  651. assertEval("40.9581521702433", "=CStr(IPmt(0.12/12,30,60,0,10000))");
  652. assertEval("0", "=CStr(IPmt(0.12/12,1,60,0,10000,1))");
  653. assertEval("40.552625911132", "=CStr(IPmt(0.12/12,30,60,0,10000,1))");
  654. assertEval("10", "=CStr(IPmt(0.12/12,1,60,-1000,10000))");
  655. assertEval("46.862336953219", "=CStr(IPmt(0.12/12,30,60,-1000,10000))");
  656. assertEval("0", "=CStr(IPmt(0.12/12,1,60,-1000,10000,1))");
  657. assertEval("46.3983534190287", "=CStr(IPmt(0.12/12,30,60,-1000,10000,1))");
  658. assertEval("12.2444476849018", "=CStr(PPmt(0.12/12,1,60,-1000))");
  659. assertEval("16.3402629019261", "=CStr(PPmt(0.12/12,30,60,-1000))");
  660. assertEval("22.0242056286156", "=CStr(PPmt(0.12/12,1,60,-1000,0,1))");
  661. assertEval("16.1784781207189", "=CStr(PPmt(0.12/12,30,60,-1000,0,1))");
  662. assertEval("-122.444476849018", "=CStr(PPmt(0.12/12,1,60,0,10000))");
  663. assertEval("-163.402629019261", "=CStr(PPmt(0.12/12,30,60,0,10000))");
  664. assertEval("-121.232155296057", "=CStr(PPmt(0.12/12,1,60,0,10000,1))");
  665. assertEval("-161.784781207189", "=CStr(PPmt(0.12/12,30,60,0,10000,1))");
  666. assertEval("-110.200029164116", "=CStr(PPmt(0.12/12,1,60,-1000,10000))");
  667. assertEval("-147.062366117335", "=CStr(PPmt(0.12/12,30,60,-1000,10000))");
  668. assertEval("-99.2079496674414", "=CStr(PPmt(0.12/12,1,60,-1000,10000,1))");
  669. assertEval("-145.60630308647", "=CStr(PPmt(0.12/12,30,60,-1000,10000,1))");
  670. assertEval("1.31506849315068", "=CStr(DDB(2400,300,10*365,1))");
  671. assertEval("40", "=CStr(DDB(2400,300,10*12,1))");
  672. assertEval("480", "=CStr(DDB(2400,300,10,1))");
  673. assertEval("22.1225472000002", "=CStr(DDB(2400,300,10,10))");
  674. assertEval("245.76", "=CStr(DDB(2400,300,10,4))");
  675. assertEval("307.2", "=CStr(DDB(2400,300,10,3))");
  676. assertEval("480", "=CStr(DDB(2400,300,10,0.1))");
  677. assertEval("274.768033075174", "=CStr(DDB(2400,300,10,3.5))");
  678. assertEval("2250", "=CStr(SLN(30000,7500,10))");
  679. assertEval("1000", "=CStr(SLN(10000,5000,5))");
  680. assertEval("1142.85714285714", "=CStr(SLN(8000,0,7))");
  681. assertEval("4090.90909090909", "=CStr(SYD(30000,7500,10,1))");
  682. assertEval("409.090909090909", "=CStr(SYD(30000,7500,10,10))");
  683. assertEval("-1.63048347266756E-02", "=CStr(Rate(3,200,-610,0,-20,0.1))");
  684. assertEval("7.70147248820165E-03", "=CStr(Rate(4*12,-200,8000))");
  685. assertEval("-1.09802980531205", "=CStr(Rate(60,93.22,5000,0.1))");
  686. }
  687. static void assertEval(Object expected, String exprStr) {
  688. try {
  689. assertEquals(expected, eval(exprStr));
  690. } catch(Error e) {
  691. // Convenience for adding new tests
  692. // System.err.println("[ERROR] " + e);
  693. throw e;
  694. }
  695. }
  696. }