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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  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 com.healthmarketscience.jackcess.expr.EvalException;
  16. import junit.framework.TestCase;
  17. import static com.healthmarketscience.jackcess.impl.expr.ExpressionatorTest.eval;
  18. import static com.healthmarketscience.jackcess.impl.expr.ExpressionatorTest.toBD;
  19. /**
  20. *
  21. * @author James Ahlborn
  22. */
  23. public class DefaultFunctionsTest extends TestCase
  24. {
  25. public DefaultFunctionsTest(String name) {
  26. super(name);
  27. }
  28. // FIXME, test more number/string functions
  29. public void testFuncs() throws Exception
  30. {
  31. assertEquals("foo", eval("=IIf(10 > 1, \"foo\", \"bar\")"));
  32. assertEquals("bar", eval("=IIf(10 < 1, \"foo\", \"bar\")"));
  33. assertEquals(102, eval("=Asc(\"foo\")"));
  34. assertEquals(9786, eval("=AscW(\"\u263A\")"));
  35. assertEquals("f", eval("=Chr(102)"));
  36. assertEquals("\u263A", eval("=ChrW(9786)"));
  37. assertEquals("263A", eval("=Hex(9786)"));
  38. assertEquals("blah", eval("=Nz(\"blah\")"));
  39. assertEquals("", eval("=Nz(Null)"));
  40. assertEquals("blah", eval("=Nz(\"blah\",\"FOO\")"));
  41. assertEquals("FOO", eval("=Nz(Null,\"FOO\")"));
  42. assertEquals("23072", eval("=Oct(9786)"));
  43. assertEquals(" 9786", eval("=Str(9786)"));
  44. assertEquals("-42", eval("=Str(-42)"));
  45. assertEquals("-42", eval("=Str$(-42)"));
  46. assertNull(eval("=Str(Null)"));
  47. try {
  48. eval("=Str$(Null)");
  49. fail("EvalException should have been thrown");
  50. } catch(EvalException expected) {
  51. // success
  52. }
  53. assertEquals(-1, eval("=CBool(\"1\")"));
  54. assertEquals(13, eval("=CByte(\"13\")"));
  55. assertEquals(14, eval("=CByte(\"13.7\")"));
  56. assertEquals(new BigDecimal("57.1235"), eval("=CCur(\"57.12346\")"));
  57. assertEquals(new Double("57.12345"), eval("=CDbl(\"57.12345\")"));
  58. assertEquals(new BigDecimal("57.123456789"), eval("=CDec(\"57.123456789\")"));
  59. assertEquals(513, eval("=CInt(\"513\")"));
  60. assertEquals(514, eval("=CInt(\"513.7\")"));
  61. assertEquals(345513, eval("=CLng(\"345513\")"));
  62. assertEquals(345514, eval("=CLng(\"345513.7\")"));
  63. assertEquals(new Float("57.12345").doubleValue(),
  64. eval("=CSng(\"57.12345\")"));
  65. assertEquals("9786", eval("=CStr(9786)"));
  66. assertEquals("-42", eval("=CStr(-42)"));
  67. assertEquals(-1, eval("=IsNull(Null)"));
  68. assertEquals(0, eval("=IsNull(13)"));
  69. assertEquals(-1, eval("=IsDate(#01/02/2003#)"));
  70. assertEquals(0, eval("=IsDate('foo')"));
  71. assertEquals(0, eval("=IsNumeric(Null)"));
  72. assertEquals(0, eval("=IsNumeric('foo')"));
  73. assertEquals(0, eval("=IsNumeric(#01/02/2003#)"));
  74. assertEquals(-1, eval("=IsNumeric(37)"));
  75. assertEquals(-1, eval("=IsNumeric(' 37 ')"));
  76. assertEquals(-1, eval("=IsNumeric(' -37.5e2 ')"));
  77. assertEquals(-1, eval("=IsNumeric(' &H37 ')"));
  78. assertEquals(0, eval("=IsNumeric(' &H37foo ')"));
  79. assertEquals(0, eval("=IsNumeric(' &o39 ')"));
  80. assertEquals(-1, eval("=IsNumeric(' &o36 ')"));
  81. assertEquals(0, eval("=IsNumeric(' &o36.1 ')"));
  82. assertEquals(1, eval("=VarType(Null)"));
  83. assertEquals(8, eval("=VarType('blah')"));
  84. assertEquals(7, eval("=VarType(#01/02/2003#)"));
  85. assertEquals(3, eval("=VarType(42)"));
  86. assertEquals(5, eval("=VarType(CDbl(42))"));
  87. assertEquals(14, eval("=VarType(42.3)"));
  88. assertEquals("Null", eval("=TypeName(Null)"));
  89. assertEquals("String", eval("=TypeName('blah')"));
  90. assertEquals("Date", eval("=TypeName(#01/02/2003#)"));
  91. assertEquals("Long", eval("=TypeName(42)"));
  92. assertEquals("Double", eval("=TypeName(CDbl(42))"));
  93. assertEquals("Decimal", eval("=TypeName(42.3)"));
  94. assertEquals(2, eval("=InStr('AFOOBAR', 'FOO')"));
  95. assertEquals(2, eval("=InStr('AFOOBAR', 'foo')"));
  96. assertEquals(2, eval("=InStr(1, 'AFOOBAR', 'foo')"));
  97. assertEquals(0, eval("=InStr(1, 'AFOOBAR', 'foo', 0)"));
  98. assertEquals(2, eval("=InStr(1, 'AFOOBAR', 'foo', 1)"));
  99. assertEquals(2, eval("=InStr(1, 'AFOOBAR', 'FOO', 0)"));
  100. assertEquals(2, eval("=InStr(2, 'AFOOBAR', 'FOO')"));
  101. assertEquals(0, eval("=InStr(3, 'AFOOBAR', 'FOO')"));
  102. assertEquals(0, eval("=InStr(17, 'AFOOBAR', 'FOO')"));
  103. assertEquals(2, eval("=InStr(1, 'AFOOBARFOOBAR', 'FOO')"));
  104. assertEquals(8, eval("=InStr(3, 'AFOOBARFOOBAR', 'FOO')"));
  105. assertNull(eval("=InStr(3, Null, 'FOO')"));
  106. assertEquals(2, eval("=InStrRev('AFOOBAR', 'FOO')"));
  107. assertEquals(2, eval("=InStrRev('AFOOBAR', 'foo')"));
  108. assertEquals(2, eval("=InStrRev('AFOOBAR', 'foo', -1)"));
  109. assertEquals(0, eval("=InStrRev('AFOOBAR', 'foo', -1, 0)"));
  110. assertEquals(2, eval("=InStrRev('AFOOBAR', 'foo', -1, 1)"));
  111. assertEquals(2, eval("=InStrRev('AFOOBAR', 'FOO', -1, 0)"));
  112. assertEquals(2, eval("=InStrRev('AFOOBAR', 'FOO', 4)"));
  113. assertEquals(0, eval("=InStrRev('AFOOBAR', 'FOO', 3)"));
  114. assertEquals(2, eval("=InStrRev('AFOOBAR', 'FOO', 17)"));
  115. assertEquals(2, eval("=InStrRev('AFOOBARFOOBAR', 'FOO', 9)"));
  116. assertEquals(8, eval("=InStrRev('AFOOBARFOOBAR', 'FOO', 10)"));
  117. assertNull(eval("=InStrRev(Null, 'FOO', 3)"));
  118. assertEquals("FOOO", eval("=UCase(\"fOoO\")"));
  119. assertEquals("fooo", eval("=LCase(\"fOoO\")"));
  120. assertEquals("bl", eval("=Left(\"blah\", 2)"));
  121. assertEquals("", eval("=Left(\"blah\", 0)"));
  122. assertEquals("blah", eval("=Left(\"blah\", 17)"));
  123. assertEquals("la", eval("=Mid(\"blah\", 2, 2)"));
  124. assertEquals("ah", eval("=Right(\"blah\", 2)"));
  125. assertEquals("", eval("=Right(\"blah\", 0)"));
  126. assertEquals("blah", eval("=Right(\"blah\", 17)"));
  127. assertEquals("blah ", eval("=LTrim(\" blah \")"));
  128. assertEquals(" blah", eval("=RTrim(\" blah \")"));
  129. assertEquals("blah", eval("=Trim(\" blah \")"));
  130. assertEquals(" ", eval("=Space(3)"));
  131. assertEquals("ddd", eval("=String(3,'d')"));
  132. assertEquals(1, eval("=StrComp('FOO', 'bar')"));
  133. assertEquals(-1, eval("=StrComp('bar', 'FOO')"));
  134. assertEquals(0, eval("=StrComp('FOO', 'foo')"));
  135. assertEquals(-1, eval("=StrComp('FOO', 'bar', 0)"));
  136. assertEquals(1, eval("=StrComp('bar', 'FOO', 0)"));
  137. assertEquals(-1, eval("=StrComp('FOO', 'foo', 0)"));
  138. assertEquals("halb", eval("=StrReverse('blah')"));
  139. assertEquals("foo", eval("=Choose(1,'foo','bar','blah')"));
  140. assertEquals(null, eval("=Choose(-1,'foo','bar','blah')"));
  141. assertEquals("blah", eval("=Choose(3,'foo','bar','blah')"));
  142. assertEquals(null, eval("=Switch(False,'foo', False, 'bar', False, 'blah')"));
  143. assertEquals("bar", eval("=Switch(False,'foo', True, 'bar', True, 'blah')"));
  144. assertEquals("blah", eval("=Switch(False,'foo', False, 'bar', True, 'blah')"));
  145. try {
  146. eval("=StrReverse('blah', 1)");
  147. fail("EvalException should have been thrown");
  148. } catch(EvalException e) {
  149. assertTrue(e.getMessage().contains("Invalid function call"));
  150. }
  151. try {
  152. eval("=StrReverse()");
  153. fail("EvalException should have been thrown");
  154. } catch(EvalException e) {
  155. assertTrue(e.getMessage().contains("Invalid function call"));
  156. }
  157. }
  158. public void testNumberFuncs() throws Exception
  159. {
  160. assertEquals(1, eval("=Abs(1)"));
  161. assertEquals(1, eval("=Abs(-1)"));
  162. assertEquals(toBD(1.1), eval("=Abs(-1.1)"));
  163. assertEquals(Math.atan(0.2), eval("=Atan(0.2)"));
  164. assertEquals(Math.sin(0.2), eval("=Sin(0.2)"));
  165. assertEquals(Math.tan(0.2), eval("=Tan(0.2)"));
  166. assertEquals(Math.cos(0.2), eval("=Cos(0.2)"));
  167. assertEquals(Math.exp(0.2), eval("=Exp(0.2)"));
  168. assertEquals(Math.log(0.2), eval("=Log(0.2)"));
  169. assertEquals(Math.sqrt(4.3), eval("=Sqr(4.3)"));
  170. assertEquals(3, eval("=Fix(3.5)"));
  171. assertEquals(4, eval("=Fix(4)"));
  172. assertEquals(-3, eval("=Fix(-3.5)"));
  173. assertEquals(-4, eval("=Fix(-4)"));
  174. assertEquals(1, eval("=Sgn(3.5)"));
  175. assertEquals(1, eval("=Sgn(4)"));
  176. assertEquals(-1, eval("=Sgn(-3.5)"));
  177. assertEquals(-1, eval("=Sgn(-4)"));
  178. assertEquals(3, eval("=Int(3.5)"));
  179. assertEquals(4, eval("=Int(4)"));
  180. assertEquals(-4, eval("=Int(-3.5)"));
  181. assertEquals(-4, eval("=Int(-4)"));
  182. assertEquals(toBD(4), eval("=Round(3.7)"));
  183. assertEquals(4, eval("=Round(4)"));
  184. assertEquals(toBD(-4), eval("=Round(-3.7)"));
  185. assertEquals(-4, eval("=Round(-4)"));
  186. assertEquals(toBD(3.73), eval("=Round(3.7345, 2)"));
  187. assertEquals(4, eval("=Round(4, 2)"));
  188. assertEquals(toBD(-3.73), eval("=Round(-3.7345, 2)"));
  189. assertEquals(-4, eval("=Round(-4, 2)"));
  190. }
  191. public void testDateFuncs() throws Exception
  192. {
  193. assertEquals("1/2/2003", eval("=CStr(DateValue(#01/02/2003 7:00:00 AM#))"));
  194. assertEquals("7:00:00 AM", eval("=CStr(TimeValue(#01/02/2003 7:00:00 AM#))"));
  195. assertEquals("1:10:00 PM", eval("=CStr(#13:10:00#)"));
  196. assertEquals(2003, eval("=Year(#01/02/2003 7:00:00 AM#)"));
  197. assertEquals(1, eval("=Month(#01/02/2003 7:00:00 AM#)"));
  198. assertEquals(2, eval("=Day(#01/02/2003 7:00:00 AM#)"));
  199. assertEquals(2003, eval("=Year('01/02/2003 7:00:00 AM')"));
  200. assertEquals(1899, eval("=Year(#7:00:00 AM#)"));
  201. assertEquals("January", eval("=MonthName(1)"));
  202. assertEquals("Feb", eval("=MonthName(2,True)"));
  203. assertEquals("March", eval("=MonthName(3,False)"));
  204. assertEquals(7, eval("=Hour(#01/02/2003 7:10:27 AM#)"));
  205. assertEquals(19, eval("=Hour(#01/02/2003 7:10:27 PM#)"));
  206. assertEquals(10, eval("=Minute(#01/02/2003 7:10:27 AM#)"));
  207. assertEquals(27, eval("=Second(#01/02/2003 7:10:27 AM#)"));
  208. assertEquals(7, eval("=Weekday(#11/22/2003#)"));
  209. assertEquals(3, eval("=Weekday(#11/22/2003#, 5)"));
  210. assertEquals(1, eval("=Weekday(#11/22/2003#, 7)"));
  211. assertEquals("Sunday", eval("=WeekdayName(1)"));
  212. assertEquals("Sun", eval("=WeekdayName(1,True)"));
  213. assertEquals("Tuesday", eval("=WeekdayName(1,False,3)"));
  214. assertEquals("Thu", eval("=WeekdayName(3,True,3)"));
  215. assertTrue(((String)eval("=CStr(Date())"))
  216. .matches("\\d{1,2}/\\d{1,2}/\\d{4}"));
  217. assertTrue(((String)eval("=CStr(Time())"))
  218. .matches("\\d{1,2}:\\d{2}:\\d{2} (AM|PM)"));
  219. assertEquals("3:57:34 AM", eval("=CStr(TimeSerial(3,57,34))"));
  220. assertEquals("3:57:34 PM", eval("=CStr(TimeSerial(15,57,34))"));
  221. assertEquals("5:45:00 AM", eval("=CStr(TimeSerial(6,-15,0))"));
  222. assertEquals("12:00:00 AM", eval("=CStr(TimeSerial(0,0,0))"));
  223. assertEquals("2:00:00 PM", eval("=CStr(TimeSerial(-10,0,0))"));
  224. assertEquals("6:00:00 AM", eval("=CStr(TimeSerial(30,0,0))"));
  225. assertEquals("2/12/1969", eval("=CStr(DateSerial(69,2,12))"));
  226. assertEquals("2/12/2010", eval("=CStr(DateSerial(10,2,12))"));
  227. assertEquals("7/12/2013", eval("=CStr(DateSerial(2014,-5,12))"));
  228. assertEquals("8/7/2013", eval("=CStr(DateSerial(2014,-5,38))"));
  229. }
  230. public void testFinancialFuncs() throws Exception
  231. {
  232. assertEquals("-9.57859403981317",
  233. eval("=CStr(NPer(0.12/12,-100,-1000))"));
  234. assertEquals("-9.48809500550583",
  235. eval("=CStr(NPer(0.12/12,-100,-1000,0,1))"));
  236. assertEquals("60.0821228537617",
  237. eval("=CStr(NPer(0.12/12,-100,-1000,10000))"));
  238. assertEquals("59.6738656742946",
  239. eval("=CStr(NPer(0.12/12,-100,-1000,10000,1))"));
  240. assertEquals("69.6607168935748",
  241. eval("=CStr(NPer(0.12/12,-100,0,10000))"));
  242. assertEquals("69.1619606798004",
  243. eval("=CStr(NPer(0.12/12,-100,0,10000,1))"));
  244. assertEquals("8166.96698564091",
  245. eval("=CStr(FV(0.12/12,60,-100))"));
  246. assertEquals("8248.63665549732",
  247. eval("=CStr(FV(0.12/12,60,-100,0,1))"));
  248. assertEquals("6350.27028707682",
  249. eval("=CStr(FV(0.12/12,60,-100,1000))"));
  250. assertEquals("6431.93995693323",
  251. eval("=CStr(FV(0.12/12,60,-100,1000,1))"));
  252. assertEquals("4495.5038406224",
  253. eval("=CStr(PV(0.12/12,60,-100))"));
  254. assertEquals("4540.45887902863",
  255. eval("=CStr(PV(0.12/12,60,-100,0,1))"));
  256. assertEquals("-1008.99231875519",
  257. eval("=CStr(PV(0.12/12,60,-100,10000))"));
  258. assertEquals("-964.037280348968",
  259. eval("=CStr(PV(0.12/12,60,-100,10000,1))"));
  260. assertEquals("22.2444476849018",
  261. eval("=CStr(Pmt(0.12/12,60,-1000))"));
  262. assertEquals("22.0242056286156",
  263. eval("=CStr(Pmt(0.12/12,60,-1000,0,1))"));
  264. assertEquals("-100.200029164116",
  265. eval("=CStr(Pmt(0.12/12,60,-1000,10000))"));
  266. assertEquals("-99.2079496674414",
  267. eval("=CStr(Pmt(0.12/12,60,-1000,10000,1))"));
  268. assertEquals("-122.444476849018",
  269. eval("=CStr(Pmt(0.12/12,60,0,10000))"));
  270. assertEquals("-121.232155296057",
  271. eval("=CStr(Pmt(0.12/12,60,0,10000,1))"));
  272. // FIXME not working for all param combos
  273. // assertEquals("10.0",
  274. // eval("=CStr(IPmt(0.12/12,1,60,-1000))"));
  275. // assertEquals("5.904184782975672",
  276. // eval("=CStr(IPmt(0.12/12,30,60,-1000))"));
  277. // 0
  278. // assertEquals("",
  279. // eval("=CStr(IPmt(0.12/12,1,60,-1000,0,1))"));
  280. // 5.84572750...
  281. // assertEquals("5.845727507896704",
  282. // eval("=CStr(IPmt(0.12/12,30,60,-1000,0,1))"));
  283. // 0
  284. // assertEquals("",
  285. // eval("=CStr(IPmt(0.12/12,1,60,0,10000))"));
  286. // 40.9581521702433
  287. // assertEquals("40.95815217024329",
  288. // eval("=CStr(IPmt(0.12/12,30,60,0,10000))"));
  289. // 0
  290. // assertEquals("",
  291. // eval("=CStr(IPmt(0.12/12,1,60,0,10000,1))"));
  292. // 40.552625911132
  293. // assertEquals("40.55262591113197",
  294. // eval("=CStr(IPmt(0.12/12,30,60,0,10000,1))"));
  295. // assertEquals("10.0",
  296. // eval("=CStr(IPmt(0.12/12,1,60,-1000,10000))"));
  297. // assertEquals("46.862336953218964",
  298. // eval("=CStr(IPmt(0.12/12,30,60,-1000,10000))"));
  299. // 0
  300. // assertEquals("",
  301. // eval("=CStr(IPmt(0.12/12,1,60,-1000,10000,1))"));
  302. // 46.3983534190287
  303. // assertEquals("46.39835341902867",
  304. // eval("=CStr(IPmt(0.12/12,30,60,-1000,10000,1))"));
  305. // FIXME, doesn't work for partial days
  306. // assertEquals("1.3150684931506849",
  307. // eval("=CStr(DDB(2400,300,10*365,1))"));
  308. // assertEquals("40.0",
  309. // eval("=CStr(DDB(2400,300,10*12,1))"));
  310. // assertEquals("480.0",
  311. // eval("=CStr(DDB(2400,300,10,1))"));
  312. // assertEquals("22.122547200000042",
  313. // eval("=CStr(DDB(2400,300,10,10))"));
  314. // assertEquals("245.76",
  315. // eval("=CStr(DDB(2400,300,10,4))"));
  316. // assertEquals("307.20000000000005",
  317. // eval("=CStr(DDB(2400,300,10,3))"));
  318. // assertEquals("480.0",
  319. // eval("=CStr(DDB(2400,300,10,0.1))"));
  320. // 274.768033075174
  321. // assertEquals("",
  322. // eval("=CStr(DDB(2400,300,10,3.5))"));
  323. }
  324. }