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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  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(-1, eval("=IsDate(#01/02/2003#)"));
  69. assertEquals(1, eval("=VarType(Null)"));
  70. assertEquals(8, eval("=VarType('blah')"));
  71. assertEquals(7, eval("=VarType(#01/02/2003#)"));
  72. assertEquals(3, eval("=VarType(42)"));
  73. assertEquals(5, eval("=VarType(CDbl(42))"));
  74. assertEquals(14, eval("=VarType(42.3)"));
  75. assertEquals("Null", eval("=TypeName(Null)"));
  76. assertEquals("String", eval("=TypeName('blah')"));
  77. assertEquals("Date", eval("=TypeName(#01/02/2003#)"));
  78. assertEquals("Long", eval("=TypeName(42)"));
  79. assertEquals("Double", eval("=TypeName(CDbl(42))"));
  80. assertEquals("Decimal", eval("=TypeName(42.3)"));
  81. assertEquals(2, eval("=InStr('AFOOBAR', 'FOO')"));
  82. assertEquals(2, eval("=InStr('AFOOBAR', 'foo')"));
  83. assertEquals(2, eval("=InStr(1, 'AFOOBAR', 'foo')"));
  84. assertEquals(0, eval("=InStr(1, 'AFOOBAR', 'foo', 0)"));
  85. assertEquals(2, eval("=InStr(1, 'AFOOBAR', 'foo', 1)"));
  86. assertEquals(2, eval("=InStr(1, 'AFOOBAR', 'FOO', 0)"));
  87. assertEquals(2, eval("=InStr(2, 'AFOOBAR', 'FOO')"));
  88. assertEquals(0, eval("=InStr(3, 'AFOOBAR', 'FOO')"));
  89. assertEquals(0, eval("=InStr(17, 'AFOOBAR', 'FOO')"));
  90. assertEquals(2, eval("=InStr(1, 'AFOOBARFOOBAR', 'FOO')"));
  91. assertEquals(8, eval("=InStr(3, 'AFOOBARFOOBAR', 'FOO')"));
  92. assertNull(eval("=InStr(3, Null, 'FOO')"));
  93. assertEquals(2, eval("=InStrRev('AFOOBAR', 'FOO')"));
  94. assertEquals(2, eval("=InStrRev('AFOOBAR', 'foo')"));
  95. assertEquals(2, eval("=InStrRev('AFOOBAR', 'foo', -1)"));
  96. assertEquals(0, eval("=InStrRev('AFOOBAR', 'foo', -1, 0)"));
  97. assertEquals(2, eval("=InStrRev('AFOOBAR', 'foo', -1, 1)"));
  98. assertEquals(2, eval("=InStrRev('AFOOBAR', 'FOO', -1, 0)"));
  99. assertEquals(2, eval("=InStrRev('AFOOBAR', 'FOO', 4)"));
  100. assertEquals(0, eval("=InStrRev('AFOOBAR', 'FOO', 3)"));
  101. assertEquals(2, eval("=InStrRev('AFOOBAR', 'FOO', 17)"));
  102. assertEquals(2, eval("=InStrRev('AFOOBARFOOBAR', 'FOO', 9)"));
  103. assertEquals(8, eval("=InStrRev('AFOOBARFOOBAR', 'FOO', 10)"));
  104. assertNull(eval("=InStrRev(Null, 'FOO', 3)"));
  105. assertEquals("FOOO", eval("=UCase(\"fOoO\")"));
  106. assertEquals("fooo", eval("=LCase(\"fOoO\")"));
  107. assertEquals("bl", eval("=Left(\"blah\", 2)"));
  108. assertEquals("", eval("=Left(\"blah\", 0)"));
  109. assertEquals("blah", eval("=Left(\"blah\", 17)"));
  110. assertEquals("la", eval("=Mid(\"blah\", 2, 2)"));
  111. assertEquals("ah", eval("=Right(\"blah\", 2)"));
  112. assertEquals("", eval("=Right(\"blah\", 0)"));
  113. assertEquals("blah", eval("=Right(\"blah\", 17)"));
  114. assertEquals("blah ", eval("=LTrim(\" blah \")"));
  115. assertEquals(" blah", eval("=RTrim(\" blah \")"));
  116. assertEquals("blah", eval("=Trim(\" blah \")"));
  117. assertEquals(" ", eval("=Space(3)"));
  118. assertEquals("ddd", eval("=String(3,'d')"));
  119. assertEquals(1, eval("=StrComp('FOO', 'bar')"));
  120. assertEquals(-1, eval("=StrComp('bar', 'FOO')"));
  121. assertEquals(0, eval("=StrComp('FOO', 'foo')"));
  122. assertEquals(-1, eval("=StrComp('FOO', 'bar', 0)"));
  123. assertEquals(1, eval("=StrComp('bar', 'FOO', 0)"));
  124. assertEquals(-1, eval("=StrComp('FOO', 'foo', 0)"));
  125. assertEquals("halb", eval("=StrReverse('blah')"));
  126. assertEquals("foo", eval("=Choose(1,'foo','bar','blah')"));
  127. assertEquals(null, eval("=Choose(-1,'foo','bar','blah')"));
  128. assertEquals("blah", eval("=Choose(3,'foo','bar','blah')"));
  129. assertEquals(null, eval("=Switch(False,'foo', False, 'bar', False, 'blah')"));
  130. assertEquals("bar", eval("=Switch(False,'foo', True, 'bar', True, 'blah')"));
  131. assertEquals("blah", eval("=Switch(False,'foo', False, 'bar', True, 'blah')"));
  132. try {
  133. eval("=StrReverse('blah', 1)");
  134. fail("EvalException should have been thrown");
  135. } catch(EvalException e) {
  136. assertTrue(e.getMessage().contains("Invalid function call"));
  137. }
  138. try {
  139. eval("=StrReverse()");
  140. fail("EvalException should have been thrown");
  141. } catch(EvalException e) {
  142. assertTrue(e.getMessage().contains("Invalid function call"));
  143. }
  144. }
  145. public void testNumberFuncs() throws Exception
  146. {
  147. assertEquals(1, eval("=Abs(1)"));
  148. assertEquals(1, eval("=Abs(-1)"));
  149. assertEquals(toBD(1.1), eval("=Abs(-1.1)"));
  150. assertEquals(Math.atan(0.2), eval("=Atan(0.2)"));
  151. assertEquals(Math.sin(0.2), eval("=Sin(0.2)"));
  152. assertEquals(Math.tan(0.2), eval("=Tan(0.2)"));
  153. assertEquals(Math.cos(0.2), eval("=Cos(0.2)"));
  154. assertEquals(Math.exp(0.2), eval("=Exp(0.2)"));
  155. assertEquals(Math.log(0.2), eval("=Log(0.2)"));
  156. assertEquals(Math.sqrt(4.3), eval("=Sqr(4.3)"));
  157. assertEquals(3, eval("=Fix(3.5)"));
  158. assertEquals(4, eval("=Fix(4)"));
  159. assertEquals(-3, eval("=Fix(-3.5)"));
  160. assertEquals(-4, eval("=Fix(-4)"));
  161. assertEquals(1, eval("=Sgn(3.5)"));
  162. assertEquals(1, eval("=Sgn(4)"));
  163. assertEquals(-1, eval("=Sgn(-3.5)"));
  164. assertEquals(-1, eval("=Sgn(-4)"));
  165. assertEquals(3, eval("=Int(3.5)"));
  166. assertEquals(4, eval("=Int(4)"));
  167. assertEquals(-4, eval("=Int(-3.5)"));
  168. assertEquals(-4, eval("=Int(-4)"));
  169. assertEquals(toBD(4), eval("=Round(3.7)"));
  170. assertEquals(4, eval("=Round(4)"));
  171. assertEquals(toBD(-4), eval("=Round(-3.7)"));
  172. assertEquals(-4, eval("=Round(-4)"));
  173. assertEquals(toBD(3.73), eval("=Round(3.7345, 2)"));
  174. assertEquals(4, eval("=Round(4, 2)"));
  175. assertEquals(toBD(-3.73), eval("=Round(-3.7345, 2)"));
  176. assertEquals(-4, eval("=Round(-4, 2)"));
  177. }
  178. public void testDateFuncs() throws Exception
  179. {
  180. assertEquals("1/2/2003", eval("=CStr(DateValue(#01/02/2003 7:00:00 AM#))"));
  181. assertEquals("7:00:00 AM", eval("=CStr(TimeValue(#01/02/2003 7:00:00 AM#))"));
  182. assertEquals(2003, eval("=Year(#01/02/2003 7:00:00 AM#)"));
  183. assertEquals(1, eval("=Month(#01/02/2003 7:00:00 AM#)"));
  184. assertEquals(2, eval("=Day(#01/02/2003 7:00:00 AM#)"));
  185. assertEquals(7, eval("=Hour(#01/02/2003 7:10:27 AM#)"));
  186. assertEquals(19, eval("=Hour(#01/02/2003 7:10:27 PM#)"));
  187. assertEquals(10, eval("=Minute(#01/02/2003 7:10:27 AM#)"));
  188. assertEquals(27, eval("=Second(#01/02/2003 7:10:27 AM#)"));
  189. assertEquals(7, eval("=Weekday(#11/22/2003#)"));
  190. assertEquals(3, eval("=Weekday(#11/22/2003#, 5)"));
  191. assertTrue(((String)eval("=CStr(Date())"))
  192. .matches("\\d{1,2}/\\d{1,2}/\\d{4}"));
  193. assertTrue(((String)eval("=CStr(Time())"))
  194. .matches("\\d{1,2}:\\d{2}:\\d{2} (AM|PM)"));
  195. assertEquals("3:57:34 AM", eval("=CStr(TimeSerial(3,57,34))"));
  196. assertEquals("3:57:34 PM", eval("=CStr(TimeSerial(15,57,34))"));
  197. assertEquals("5:45:00 AM", eval("=CStr(TimeSerial(6,-15,0))"));
  198. assertEquals("12:00:00 AM", eval("=CStr(TimeSerial(0,0,0))"));
  199. assertEquals("2:00:00 PM", eval("=CStr(TimeSerial(-10,0,0))"));
  200. assertEquals("6:00:00 AM", eval("=CStr(TimeSerial(30,0,0))"));
  201. assertEquals("2/12/1969", eval("=CStr(DateSerial(69,2,12))"));
  202. assertEquals("2/12/2010", eval("=CStr(DateSerial(10,2,12))"));
  203. assertEquals("7/12/2013", eval("=CStr(DateSerial(2014,-5,12))"));
  204. assertEquals("8/7/2013", eval("=CStr(DateSerial(2014,-5,38))"));
  205. }
  206. public void testFinancialFuncs() throws Exception
  207. {
  208. assertEquals("-9.57859403981317",
  209. eval("=CStr(NPer(0.12/12,-100,-1000))"));
  210. assertEquals("-9.48809500550583",
  211. eval("=CStr(NPer(0.12/12,-100,-1000,0,1))"));
  212. assertEquals("60.0821228537617",
  213. eval("=CStr(NPer(0.12/12,-100,-1000,10000))"));
  214. assertEquals("59.6738656742946",
  215. eval("=CStr(NPer(0.12/12,-100,-1000,10000,1))"));
  216. assertEquals("69.6607168935748",
  217. eval("=CStr(NPer(0.12/12,-100,0,10000))"));
  218. assertEquals("69.1619606798004",
  219. eval("=CStr(NPer(0.12/12,-100,0,10000,1))"));
  220. assertEquals("8166.96698564091",
  221. eval("=CStr(FV(0.12/12,60,-100))"));
  222. assertEquals("8248.63665549732",
  223. eval("=CStr(FV(0.12/12,60,-100,0,1))"));
  224. assertEquals("6350.27028707682",
  225. eval("=CStr(FV(0.12/12,60,-100,1000))"));
  226. assertEquals("6431.93995693323",
  227. eval("=CStr(FV(0.12/12,60,-100,1000,1))"));
  228. assertEquals("4495.5038406224",
  229. eval("=CStr(PV(0.12/12,60,-100))"));
  230. assertEquals("4540.45887902863",
  231. eval("=CStr(PV(0.12/12,60,-100,0,1))"));
  232. assertEquals("-1008.99231875519",
  233. eval("=CStr(PV(0.12/12,60,-100,10000))"));
  234. assertEquals("-964.037280348968",
  235. eval("=CStr(PV(0.12/12,60,-100,10000,1))"));
  236. assertEquals("22.2444476849018",
  237. eval("=CStr(Pmt(0.12/12,60,-1000))"));
  238. assertEquals("22.0242056286156",
  239. eval("=CStr(Pmt(0.12/12,60,-1000,0,1))"));
  240. assertEquals("-100.200029164116",
  241. eval("=CStr(Pmt(0.12/12,60,-1000,10000))"));
  242. assertEquals("-99.2079496674414",
  243. eval("=CStr(Pmt(0.12/12,60,-1000,10000,1))"));
  244. assertEquals("-122.444476849018",
  245. eval("=CStr(Pmt(0.12/12,60,0,10000))"));
  246. assertEquals("-121.232155296057",
  247. eval("=CStr(Pmt(0.12/12,60,0,10000,1))"));
  248. // FIXME not working for all param combos
  249. // assertEquals("10.0",
  250. // eval("=CStr(IPmt(0.12/12,1,60,-1000))"));
  251. // assertEquals("5.904184782975672",
  252. // eval("=CStr(IPmt(0.12/12,30,60,-1000))"));
  253. // 0
  254. // assertEquals("",
  255. // eval("=CStr(IPmt(0.12/12,1,60,-1000,0,1))"));
  256. // 5.84572750...
  257. // assertEquals("5.845727507896704",
  258. // eval("=CStr(IPmt(0.12/12,30,60,-1000,0,1))"));
  259. // 0
  260. // assertEquals("",
  261. // eval("=CStr(IPmt(0.12/12,1,60,0,10000))"));
  262. // 40.9581521702433
  263. // assertEquals("40.95815217024329",
  264. // eval("=CStr(IPmt(0.12/12,30,60,0,10000))"));
  265. // 0
  266. // assertEquals("",
  267. // eval("=CStr(IPmt(0.12/12,1,60,0,10000,1))"));
  268. // 40.552625911132
  269. // assertEquals("40.55262591113197",
  270. // eval("=CStr(IPmt(0.12/12,30,60,0,10000,1))"));
  271. // assertEquals("10.0",
  272. // eval("=CStr(IPmt(0.12/12,1,60,-1000,10000))"));
  273. // assertEquals("46.862336953218964",
  274. // eval("=CStr(IPmt(0.12/12,30,60,-1000,10000))"));
  275. // 0
  276. // assertEquals("",
  277. // eval("=CStr(IPmt(0.12/12,1,60,-1000,10000,1))"));
  278. // 46.3983534190287
  279. // assertEquals("46.39835341902867",
  280. // eval("=CStr(IPmt(0.12/12,30,60,-1000,10000,1))"));
  281. // FIXME, doesn't work for partial days
  282. // assertEquals("1.3150684931506849",
  283. // eval("=CStr(DDB(2400,300,10*365,1))"));
  284. // assertEquals("40.0",
  285. // eval("=CStr(DDB(2400,300,10*12,1))"));
  286. // assertEquals("480.0",
  287. // eval("=CStr(DDB(2400,300,10,1))"));
  288. // assertEquals("22.122547200000042",
  289. // eval("=CStr(DDB(2400,300,10,10))"));
  290. // assertEquals("245.76",
  291. // eval("=CStr(DDB(2400,300,10,4))"));
  292. // assertEquals("307.20000000000005",
  293. // eval("=CStr(DDB(2400,300,10,3))"));
  294. // assertEquals("480.0",
  295. // eval("=CStr(DDB(2400,300,10,0.1))"));
  296. // 274.768033075174
  297. // assertEquals("",
  298. // eval("=CStr(DDB(2400,300,10,3.5))"));
  299. }
  300. }