utcexprbuiltin.pp 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. unit utcExprBuiltin;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, punit, math, fpexprpars;
  6. procedure RegisterTests(aTop : PSuite);
  7. implementation
  8. uses dateutils, typinfo;
  9. procedure AssertEquals(Msg: String; AResultType: TResultType; ANode: TFPExprNode); overload;
  10. begin
  11. AssertNotNull(Msg+': Node not null',ANode);
  12. AssertEquals(Msg,ResultTypeName(AResultType),ResultTypeName(Anode.NodeType));
  13. end;
  14. procedure AssertEquals(Msg: String; AExpected, AActual: TResultType); overload;
  15. begin
  16. AssertEquals(Msg,ResultTypeName(AExpected),ResultTypeName(AActual));
  17. end;
  18. type
  19. TMyFPExpressionParser = class(TFPExpressionParser)
  20. public
  21. property ExprNode;
  22. property Scanner;
  23. property Dirty;
  24. end;
  25. var
  26. FValue : Integer;
  27. FP: TMyFPExpressionParser;
  28. FM : TExprBuiltInManager;
  29. FileFormatSettings: TFormatSettings;
  30. procedure DummyGetDate(var Result: TFPExpressionResult; const Args: TExprParameterArray);
  31. begin
  32. Result.resDateTime:=Date;
  33. end;
  34. procedure DummyEchoDate(var Result: TFPExpressionResult; const Args: TExprParameterArray);
  35. begin
  36. Result.resDateTime:=Args[0].resDateTime;
  37. end;
  38. function SuiteSetup: string;
  39. begin
  40. Result := '';
  41. FP := TMyFPExpressionParser.Create(nil);
  42. FM := TExprBuiltInManager.Create(Nil);
  43. FValue := 0;
  44. end;
  45. function SuiteTearDown : string;
  46. begin
  47. Result := '';
  48. FValue := 0;
  49. FreeAndNil(FM);
  50. FreeAndNil(FP);
  51. end;
  52. function TestBuiltinsManager_TestCreate: TTestString;
  53. begin
  54. Result := '';
  55. AssertEquals('Have no builtin expressions',0,FM.IdentifierCount);
  56. end;
  57. function TestBuiltinsManager_TestVariable1: TTestString;
  58. Var
  59. I : TFPBuiltinExprIdentifierDef;
  60. begin
  61. Result := '';
  62. I:=FM.AddVariable(bcuser,'a',rtBoolean,'True');
  63. AssertNotNull('Addvariable returns result',I);
  64. AssertEquals('One variable added',1,FM.IdentifierCount);
  65. AssertSame('Result equals variable added',I,FM.Identifiers[0]);
  66. AssertEquals('Variable has correct category',ord(bcUser),Ord(I.Category));
  67. AssertEquals('Variable has correct resulttype',rtBoolean,I.ResultType);
  68. AssertEquals('Variable has correct value','True',I.Value);
  69. end;
  70. function TestBuiltinsManager_TestVariable2: TTestString;
  71. Var
  72. I : TFPBuiltinExprIdentifierDef;
  73. begin
  74. Result := '';
  75. I:=FM.AddBooleanVariable(bcUser,'a',False);
  76. AssertNotNull('Addvariable returns result',I);
  77. AssertEquals('One variable added',1,FM.IdentifierCount);
  78. AssertSame('Result equals variable added',I,FM.Identifiers[0]);
  79. AssertEquals('Variable has correct category',ord(bcUser),Ord(I.Category));
  80. AssertEquals('Variable has correct resulttype',rtBoolean,I.ResultType);
  81. AssertEquals('Variable has correct value','False',I.Value);
  82. end;
  83. function TestBuiltinsManager_TestVariable3: TTestString;
  84. Var
  85. I : TFPBuiltinExprIdentifierDef;
  86. begin
  87. Result := '';
  88. I:=FM.AddIntegerVariable(bcUser,'a',123);
  89. AssertNotNull('Addvariable returns result',I);
  90. AssertEquals('One variable added',1,FM.IdentifierCount);
  91. AssertSame('Result equals variable added',I,FM.Identifiers[0]);
  92. AssertEquals('Variable has correct category',ord(bcUser),Ord(I.Category));
  93. AssertEquals('Variable has correct resulttype',rtInteger,I.ResultType);
  94. AssertEquals('Variable has correct value','123',I.Value);
  95. end;
  96. function TestBuiltinsManager_TestVariable4: TTestString;
  97. Var
  98. I : TFPBuiltinExprIdentifierDef;
  99. begin
  100. Result := '';
  101. I:=FM.AddFloatVariable(bcUser,'a',1.23);
  102. AssertNotNull('Addvariable returns result',I);
  103. AssertEquals('One variable added',1,FM.IdentifierCount);
  104. AssertSame('Result equals variable added',I,FM.Identifiers[0]);
  105. AssertEquals('Variable has correct category',ord(bcUser),Ord(I.Category));
  106. AssertEquals('Variable has correct resulttype',rtFloat,I.ResultType);
  107. AssertEquals('Variable has correct value',FloatToStr(1.23, FileFormatSettings),I.Value);
  108. end;
  109. function TestBuiltinsManager_TestVariable5: TTestString;
  110. Var
  111. I : TFPBuiltinExprIdentifierDef;
  112. begin
  113. Result := '';
  114. I:=FM.AddStringVariable(bcUser,'a','1.23');
  115. AssertNotNull('Addvariable returns result',I);
  116. AssertEquals('One variable added',1,FM.IdentifierCount);
  117. AssertSame('Result equals variable added',I,FM.Identifiers[0]);
  118. AssertEquals('Variable has correct category',ord(bcUser),Ord(I.Category));
  119. AssertEquals('Variable has correct resulttype',rtString,I.ResultType);
  120. AssertEquals('Variable has correct value','1.23',I.Value);
  121. end;
  122. function TestBuiltinsManager_TestVariable6: TTestString;
  123. Var
  124. I : TFPBuiltinExprIdentifierDef;
  125. D : TDateTime;
  126. begin
  127. Result := '';
  128. D:=Now;
  129. I:=FM.AddDateTimeVariable(bcUser,'a',D);
  130. AssertNotNull('Addvariable returns result',I);
  131. AssertEquals('One variable added',1,FM.IdentifierCount);
  132. AssertSame('Result equals variable added',I,FM.Identifiers[0]);
  133. AssertEquals('Variable has correct category',ord(bcUser),Ord(I.Category));
  134. AssertEquals('Variable has correct resulttype',rtDateTime,I.ResultType);
  135. AssertEquals('Variable has correct value',FormatDateTime('yyyy-mm-dd hh:nn:ss',D),I.Value);
  136. end;
  137. function TestBuiltinsManager_TestVariable7: TTestString;
  138. Var
  139. I : TFPBuiltinExprIdentifierDef;
  140. begin
  141. Result := '';
  142. I:=FM.AddCurrencyVariable(bcUser,'a',1.23);
  143. AssertNotNull('Addvariable returns result',I);
  144. AssertEquals('One variable added',1,FM.IdentifierCount);
  145. AssertSame('Result equals variable added',I,FM.Identifiers[0]);
  146. AssertEquals('Variable has correct category',ord(bcUser),Ord(I.Category));
  147. AssertEquals('Variable has correct resulttype',rtCurrency,I.ResultType);
  148. AssertEquals('Variable has correct value',CurrToStr(1.23, FileFormatSettings),I.Value);
  149. end;
  150. function TestBuiltinsManager_TestFunction1: TTestString;
  151. Var
  152. I : TFPBuiltinExprIdentifierDef;
  153. begin
  154. Result := '';
  155. I:=FM.AddFunction(bcUser,'Date','D','',@DummyGetDate);
  156. AssertNotNull('Addvariable returns result',I);
  157. AssertEquals('One variable added',1,FM.IdentifierCount);
  158. AssertSame('Result equals variable added',I,FM.Identifiers[0]);
  159. AssertEquals('Variable has correct category',ord(bcUser),Ord(I.Category));
  160. AssertEquals('Function has correct resulttype',rtDateTime,I.ResultType);
  161. AssertEquals('Function has correct address',Pointer(@DummyGetDate),Pointer(I.OnGetFunctionValueCallBack));
  162. end;
  163. function TestBuiltinsManager_TestFunction2: TTestString;
  164. Var
  165. I,I2 : TFPBuiltinExprIdentifierDef;
  166. ind : Integer;
  167. begin
  168. Result := '';
  169. FM.AddFunction(bcUser,'EchoDate','D','D',@DummyEchoDate);
  170. I:=FM.AddFunction(bcUser,'Echo','D','D',@DummyEchoDate);
  171. FM.AddFunction(bcUser,'DoEcho','D','D',@DummyEchoDate);
  172. ind:=FM.IndexOfIdentifier('Echo');
  173. AssertEquals('Found identifier',1,ind);
  174. I2:=FM.FindIdentifier('Echo');
  175. AssertNotNull('FindIdentifier returns result',I2);
  176. AssertSame('Findidentifier returns correct result',I,I2);
  177. ind:=FM.IndexOfIdentifier('NoNoNo');
  178. AssertEquals('Found no such identifier',-1,ind);
  179. I2:=FM.FindIdentifier('NoNoNo');
  180. AssertNull('FindIdentifier returns no result',I2);
  181. end;
  182. function TestBuiltinsManager_TestDelete: TTestString;
  183. begin
  184. Result := '';
  185. FM.AddFunction(bcUser,'EchoDate','D','D',@DummyEchoDate);
  186. FM.AddFunction(bcUser,'EchoDate2','D','D',@DummyEchoDate);
  187. FM.AddFunction(bcUser,'EchoDate3','D','D',@DummyEchoDate);
  188. AssertEquals('Count before',3,FM.IdentifierCount);
  189. FM.Delete(2);
  190. AssertEquals('Count after',2,FM.IdentifierCount);
  191. AssertEquals('No more',-1,FM.IndexOfIdentifier('EchoDate3'));
  192. AssertEquals('Left 1',0,FM.IndexOfIdentifier('EchoDate'));
  193. AssertEquals('Left 2',1,FM.IndexOfIdentifier('EchoDate2'));
  194. end;
  195. function TestBuiltinsManager_TestRemove: TTestString;
  196. begin
  197. Result := '';
  198. FM.AddFunction(bcUser,'EchoDate','D','D',@DummyEchoDate);
  199. FM.AddFunction(bcUser,'EchoDate2','D','D',@DummyEchoDate);
  200. FM.AddFunction(bcUser,'EchoDate3','D','D',@DummyEchoDate);
  201. AssertEquals('Count before',3,FM.IdentifierCount);
  202. AssertEquals('Result ',1,FM.Remove('EchoDate2'));
  203. AssertEquals('Count after',2,FM.IdentifierCount);
  204. AssertEquals('No more',-1,FM.IndexOfIdentifier('EchoDate2'));
  205. AssertEquals('Left 1',0,FM.IndexOfIdentifier('EchoDate'));
  206. AssertEquals('Left 2',1,FM.IndexOfIdentifier('EchoDate3'));
  207. AssertEquals('Result ',-1,FM.Remove('Nono'));
  208. end;
  209. procedure SetExpression(const AExpression: String);
  210. Var
  211. Msg : String;
  212. begin
  213. Msg:='';
  214. try
  215. FP.Expression:=AExpression;
  216. except
  217. On E : Exception do
  218. Msg:=E.message;
  219. end;
  220. If (Msg<>'') then
  221. Fail('Parsing of expression "'+AExpression+'" failed :'+Msg);
  222. end;
  223. procedure AssertResult(F: TExprFloat);
  224. begin
  225. AssertEquals('Float result', F, FP.AsFloat, 1E-9);
  226. end;
  227. procedure AssertResult(I: Int64);
  228. begin
  229. AssertEquals('Integer result', I, FP.AsInteger);
  230. end;
  231. procedure AssertResult(S: String);
  232. begin
  233. AssertEquals('String result', S, FP.AsString);
  234. end;
  235. procedure AssertResult(B: Boolean);
  236. begin
  237. AssertEquals('Boolean result', B, FP.AsBoolean);
  238. end;
  239. procedure AssertDateTimeResult(D: TDateTime);
  240. begin
  241. AssertEquals('DateTime result', D, FP.AsDateTime, 2/SecsPerDay);
  242. end;
  243. procedure AssertCurrencyResult(C: Currency);
  244. begin
  245. AssertEquals('Currency result', C, FP.AsCurrency, 1E-9);
  246. end;
  247. procedure AssertExpression(const AExpression: String; AResult: Int64);
  248. begin
  249. FP.BuiltIns:=AllBuiltIns;
  250. SetExpression(AExpression);
  251. AssertResult(AResult);
  252. end;
  253. procedure AssertExpression(const AExpression: String; const AResult: String);
  254. begin
  255. FP.BuiltIns:=AllBuiltIns;
  256. SetExpression(AExpression);
  257. AssertResult(AResult);
  258. end;
  259. procedure AssertExpression(const AExpression: String; const AResult: TExprFloat);
  260. begin
  261. FP.BuiltIns:=AllBuiltIns;
  262. SetExpression(AExpression);
  263. AssertResult(AResult);
  264. end;
  265. procedure AssertExpression(const AExpression: String; const AResult: Boolean);
  266. begin
  267. FP.BuiltIns:=AllBuiltIns;
  268. SetExpression(AExpression);
  269. AssertResult(AResult);
  270. end;
  271. procedure AssertDateTimeExpression(const AExpression: String; const AResult: TDateTime);
  272. begin
  273. FP.BuiltIns:=AllBuiltIns;
  274. SetExpression(AExpression);
  275. AssertDateTimeResult(AResult);
  276. end;
  277. procedure AssertAggregateExpression(const AExpression: String; AResult: Int64; AUpdateCount: integer);
  278. begin
  279. FP.BuiltIns:=AllBuiltIns;
  280. SetExpression(AExpression);
  281. AssertEquals('Has aggregate',True,FP.ExprNode.HasAggregate);
  282. FP.InitAggregate;
  283. While AUpdateCount>0 do
  284. begin
  285. FP.UpdateAggregate;
  286. Dec(AUpdateCount);
  287. end;
  288. AssertResult(AResult);
  289. end;
  290. procedure AssertAggregateExpression(const AExpression: String; AResult: TExprFloat; AUpdateCount: integer);
  291. begin
  292. FP.BuiltIns:=AllBuiltIns;
  293. SetExpression(AExpression);
  294. AssertEquals('Has aggregate',True,FP.ExprNode.HasAggregate);
  295. FP.InitAggregate;
  296. While AUpdateCount>0 do
  297. begin
  298. FP.UpdateAggregate;
  299. Dec(AUpdateCount);
  300. end;
  301. AssertResult(AResult);
  302. end;
  303. procedure AssertAggregateCurrExpression(Const AExpression : String; AResult : Currency; AUpdateCount : integer);
  304. begin
  305. FP.BuiltIns:=AllBuiltIns;
  306. SetExpression(AExpression);
  307. AssertEquals('Has aggregate',True,FP.ExprNode.HasAggregate);
  308. FP.InitAggregate;
  309. While AUpdateCount>0 do
  310. begin
  311. FP.UpdateAggregate;
  312. Dec(AUpdateCount);
  313. end;
  314. AssertCurrencyResult(AResult);
  315. end;
  316. function TestBuiltins_TestVariablepi: TTestString;
  317. begin
  318. Result := '';
  319. AssertExpression('pi',Pi);
  320. end;
  321. function TestBuiltins_TestFunctioncos: TTestString;
  322. begin
  323. Result := '';
  324. AssertExpression('cos(0.5)',Cos(0.5));
  325. AssertExpression('cos(0.75)',Cos(0.75));
  326. end;
  327. function TestBuiltins_TestFunctionsin: TTestString;
  328. begin
  329. Result := '';
  330. AssertExpression('sin(0.5)',sin(0.5));
  331. AssertExpression('sin(0.75)',sin(0.75));
  332. end;
  333. function TestBuiltins_TestFunctionarctan: TTestString;
  334. begin
  335. Result := '';
  336. AssertExpression('arctan(0.5)',arctan(0.5));
  337. AssertExpression('arctan(0.75)',arctan(0.75));
  338. end;
  339. function TestBuiltins_TestFunctionabs: TTestString;
  340. begin
  341. Result := '';
  342. AssertExpression('abs(0.5)',0.5);
  343. AssertExpression('abs(-0.75)',0.75);
  344. end;
  345. function TestBuiltins_TestFunctionsqr: TTestString;
  346. begin
  347. Result := '';
  348. AssertExpression('sqr(0.5)',sqr(0.5));
  349. AssertExpression('sqr(-0.75)',sqr(0.75));
  350. end;
  351. function TestBuiltins_TestFunctionsqrt: TTestString;
  352. begin
  353. Result := '';
  354. AssertExpression('sqrt(0.5)',sqrt(0.5));
  355. AssertExpression('sqrt(0.75)',sqrt(0.75));
  356. end;
  357. function TestBuiltins_TestFunctionexp: TTestString;
  358. begin
  359. Result := '';
  360. AssertExpression('exp(1.0)',exp(1));
  361. AssertExpression('exp(0.0)',1.0);
  362. end;
  363. function TestBuiltins_TestFunctionln: TTestString;
  364. begin
  365. Result := '';
  366. AssertExpression('ln(0.5)',ln(0.5));
  367. AssertExpression('ln(1.5)',ln(1.5));
  368. end;
  369. function TestBuiltins_TestFunctionlog: TTestString;
  370. begin
  371. Result := '';
  372. AssertExpression('log(0.5)',ln(0.5)/ln(10.0));
  373. AssertExpression('log(1.5)',ln(1.5)/ln(10.0));
  374. AssertExpression('log(10.0)',1.0);
  375. end;
  376. function TestBuiltins_TestFunctionfrac: TTestString;
  377. begin
  378. Result := '';
  379. AssertExpression('frac(0.5)',frac(0.5));
  380. AssertExpression('frac(1.5)',frac(1.5));
  381. end;
  382. function TestBuiltins_TestFunctionint: TTestString;
  383. begin
  384. Result := '';
  385. AssertExpression('int(0.5)',int(0.5));
  386. AssertExpression('int(1.5)',int(1.5));
  387. end;
  388. function TestBuiltins_TestFunctionround: TTestString;
  389. begin
  390. Result := '';
  391. AssertExpression('round(0.5)',round(0.5));
  392. AssertExpression('round(1.55)',round(1.55));
  393. end;
  394. function TestBuiltins_TestFunctiontrunc: TTestString;
  395. begin
  396. Result := '';
  397. AssertExpression('trunc(0.5)',trunc(0.5));
  398. AssertExpression('trunc(1.55)',trunc(1.55));
  399. end;
  400. function TestBuiltins_TestFunctionlength: TTestString;
  401. begin
  402. Result := '';
  403. AssertExpression('length(''123'')',3);
  404. end;
  405. function TestBuiltins_TestFunctioncopy: TTestString;
  406. begin
  407. Result := '';
  408. AssertExpression('copy(''123456'',2,4)','2345');
  409. end;
  410. function TestBuiltins_TestFunctiondelete: TTestString;
  411. begin
  412. Result := '';
  413. AssertExpression('delete(''123456'',2,4)','16');
  414. end;
  415. function TestBuiltins_TestFunctionpos: TTestString;
  416. begin
  417. Result := '';
  418. AssertExpression('pos(''234'',''123456'')',2);
  419. end;
  420. function TestBuiltins_TestFunctionlowercase: TTestString;
  421. begin
  422. Result := '';
  423. AssertExpression('lowercase(''AbCdEf'')','abcdef');
  424. end;
  425. function TestBuiltins_TestFunctionuppercase: TTestString;
  426. begin
  427. Result := '';
  428. AssertExpression('uppercase(''AbCdEf'')','ABCDEF');
  429. end;
  430. function TestBuiltins_TestFunctionstringreplace: TTestString;
  431. begin
  432. Result := '';
  433. // last options are replaceall, ignorecase
  434. AssertExpression('stringreplace(''AbCdEf'',''C'',''Z'',false,false)','AbZdEf');
  435. AssertExpression('stringreplace(''AbCdEf'',''c'',''Z'',false,false)','AbCdEf');
  436. AssertExpression('stringreplace(''AbCdEf'',''c'',''Z'',false,true)','AbZdEf');
  437. AssertExpression('stringreplace(''AbCdEfC'',''C'',''Z'',false,false)','AbZdEfC');
  438. AssertExpression('stringreplace(''AbCdEfC'',''C'',''Z'',True,false)','AbZdEfZ');
  439. end;
  440. function TestBuiltins_TestFunctioncomparetext: TTestString;
  441. begin
  442. Result := '';
  443. AssertExpression('comparetext(''AbCdEf'',''AbCdEf'')',0);
  444. AssertExpression('comparetext(''AbCdEf'',''ABCDEF'')',0);
  445. AssertExpression('comparetext(''AbCdEf'',''FEDCBA'')',comparetext('AbCdEf','FEDCBA'));
  446. end;
  447. function TestBuiltins_TestFunctiondate: TTestString;
  448. begin
  449. Result := '';
  450. AssertDateTimeExpression('date',date);
  451. end;
  452. function TestBuiltins_TestFunctiontime: TTestString;
  453. begin
  454. Result := '';
  455. AssertDateTimeExpression('time',time);
  456. end;
  457. function TestBuiltins_TestFunctionnow: TTestString;
  458. begin
  459. Result := '';
  460. AssertDateTimeExpression('now',now);
  461. end;
  462. function TestBuiltins_TestFunctiondayofweek: TTestString;
  463. begin
  464. Result := '';
  465. FP.Identifiers.AddDateTimeVariable('D',Date);
  466. AssertExpression('dayofweek(d)',DayOfWeek(date));
  467. end;
  468. function TestBuiltins_TestFunctionextractyear: TTestString;
  469. Var
  470. Y,M,D : Word;
  471. begin
  472. Result := '';
  473. DecodeDate(Date,Y,M,D);
  474. FP.Identifiers.AddDateTimeVariable('D',Date);
  475. AssertExpression('extractyear(d)',Y);
  476. end;
  477. function TestBuiltins_TestFunctionextractmonth: TTestString;
  478. Var
  479. Y,M,D : Word;
  480. begin
  481. Result := '';
  482. FP.Identifiers.AddDateTimeVariable('D',Date);
  483. DecodeDate(Date,Y,M,D);
  484. AssertExpression('extractmonth(d)',M);
  485. end;
  486. function TestBuiltins_TestFunctionextractday: TTestString;
  487. Var
  488. Y,M,D : Word;
  489. begin
  490. Result := '';
  491. DecodeDate(Date,Y,M,D);
  492. FP.Identifiers.AddDateTimeVariable('D',Date);
  493. AssertExpression('extractday(d)',D);
  494. end;
  495. function TestBuiltins_TestFunctionextracthour: TTestString;
  496. Var
  497. T : TDateTime;
  498. H,m,s,ms : Word;
  499. begin
  500. Result := '';
  501. T:=Time;
  502. DecodeTime(T,h,m,s,ms);
  503. FP.Identifiers.AddDateTimeVariable('T',T);
  504. AssertExpression('extracthour(t)',h);
  505. end;
  506. function TestBuiltins_TestFunctionextractmin: TTestString;
  507. Var
  508. T : TDateTime;
  509. H,m,s,ms : Word;
  510. begin
  511. Result := '';
  512. T:=Time;
  513. DecodeTime(T,h,m,s,ms);
  514. FP.Identifiers.AddDateTimeVariable('T',T);
  515. AssertExpression('extractmin(t)',m);
  516. end;
  517. function TestBuiltins_TestFunctionextractsec: TTestString;
  518. Var
  519. T : TDateTime;
  520. H,m,s,ms : Word;
  521. begin
  522. Result := '';
  523. T:=Time;
  524. DecodeTime(T,h,m,s,ms);
  525. FP.Identifiers.AddDateTimeVariable('T',T);
  526. AssertExpression('extractsec(t)',s);
  527. end;
  528. function TestBuiltins_TestFunctionextractmsec: TTestString;
  529. Var
  530. T : TDateTime;
  531. H,m,s,ms : Word;
  532. begin
  533. Result := '';
  534. T:=Time;
  535. DecodeTime(T,h,m,s,ms);
  536. FP.Identifiers.AddDateTimeVariable('T',T);
  537. AssertExpression('extractmsec(t)',ms);
  538. end;
  539. function TestBuiltins_TestFunctionencodedate: TTestString;
  540. begin
  541. Result := '';
  542. AssertDateTimeExpression('encodedate(2008,10,11)',EncodeDate(2008,10,11));
  543. end;
  544. function TestBuiltins_TestFunctionencodetime: TTestString;
  545. begin
  546. Result := '';
  547. AssertDateTimeExpression('encodetime(14,10,11,0)',EncodeTime(14,10,11,0));
  548. end;
  549. function TestBuiltins_TestFunctionencodedatetime: TTestString;
  550. begin
  551. Result := '';
  552. AssertDateTimeExpression('encodedatetime(2008,12,13,14,10,11,0)',EncodeDate(2008,12,13)+EncodeTime(14,10,11,0));
  553. end;
  554. function TestBuiltins_TestFunctionshortdayname: TTestString;
  555. begin
  556. Result := '';
  557. AssertExpression('shortdayname(1)',ShortDayNames[1]);
  558. AssertExpression('shortdayname(7)',ShortDayNames[7]);
  559. end;
  560. function TestBuiltins_TestFunctionshortmonthname: TTestString;
  561. begin
  562. Result := '';
  563. AssertExpression('shortmonthname(1)',ShortMonthNames[1]);
  564. AssertExpression('shortmonthname(12)',ShortMonthNames[12]);
  565. end;
  566. function TestBuiltins_TestFunctionlongdayname: TTestString;
  567. begin
  568. Result := '';
  569. AssertExpression('longdayname(1)',longDayNames[1]);
  570. AssertExpression('longdayname(7)',longDayNames[7]);
  571. end;
  572. function TestBuiltins_TestFunctionlongmonthname: TTestString;
  573. begin
  574. Result := '';
  575. AssertExpression('longmonthname(1)',longMonthNames[1]);
  576. AssertExpression('longmonthname(12)',longMonthNames[12]);
  577. end;
  578. function TestBuiltins_TestFunctionformatdatetime: TTestString;
  579. begin
  580. Result := '';
  581. AssertExpression('FormatDateTime(''cccc'',Date)',FormatDateTime('cccc',Date));
  582. end;
  583. function TestBuiltins_TestFunctionshl: TTestString;
  584. Var
  585. I : Int64;
  586. begin
  587. Result := '';
  588. AssertExpression('shl(12,3)',12 shl 3);
  589. I:=12 shl 30;
  590. AssertExpression('shl(12,30)',I);
  591. end;
  592. function TestBuiltins_TestFunctionshr: TTestString;
  593. begin
  594. Result := '';
  595. AssertExpression('shr(12,2)',12 shr 2);
  596. end;
  597. function TestBuiltins_TestFunctionIFS: TTestString;
  598. begin
  599. Result := '';
  600. AssertExpression('ifs(true,''string1'',''string2'')','string1');
  601. AssertExpression('ifs(false,''string1'',''string2'')','string2');
  602. end;
  603. function TestBuiltins_TestFunctionIFF: TTestString;
  604. begin
  605. Result := '';
  606. AssertExpression('iff(true,1.0,2.0)',1.0);
  607. AssertExpression('iff(false,1.0,2.0)',2.0);
  608. end;
  609. function TestBuiltins_TestFunctionIFD: TTestString;
  610. begin
  611. Result := '';
  612. FP.Identifiers.AddDateTimeVariable('A',Date);
  613. FP.Identifiers.AddDateTimeVariable('B',Date-1);
  614. AssertDateTimeExpression('ifd(true,A,B)',Date);
  615. AssertDateTimeExpression('ifd(false,A,B)',Date-1);
  616. end;
  617. function TestBuiltins_TestFunctionIFI: TTestString;
  618. begin
  619. Result := '';
  620. AssertExpression('ifi(true,1,2)',1);
  621. AssertExpression('ifi(false,1,2)',2);
  622. end;
  623. function TestBuiltins_TestFunctioninttostr: TTestString;
  624. begin
  625. Result := '';
  626. AssertExpression('inttostr(2)','2');
  627. end;
  628. function TestBuiltins_TestFunctionstrtoint: TTestString;
  629. begin
  630. Result := '';
  631. AssertExpression('strtoint(''2'')',2);
  632. end;
  633. function TestBuiltins_TestFunctionstrtointdef: TTestString;
  634. begin
  635. Result := '';
  636. AssertExpression('strtointdef(''abc'',2)',2);
  637. end;
  638. function TestBuiltins_TestFunctionfloattostr: TTestString;
  639. begin
  640. Result := '';
  641. AssertExpression('floattostr(1.23)',Floattostr(1.23));
  642. end;
  643. function TestBuiltins_TestFunctionstrtofloat: TTestString;
  644. Var
  645. S : String;
  646. begin
  647. Result := '';
  648. S:='1.23';
  649. S[2]:=DecimalSeparator;
  650. AssertExpression('strtofloat('''+S+''')',1.23);
  651. end;
  652. function TestBuiltins_TestFunctionstrtofloatdef: TTestString;
  653. begin
  654. Result := '';
  655. AssertExpression('strtofloatdef(''abc'',1.23)',1.23);
  656. end;
  657. function TestBuiltins_TestFunctionbooltostr: TTestString;
  658. begin
  659. Result := '';
  660. AssertExpression('booltostr(True)','True');
  661. end;
  662. function TestBuiltins_TestFunctionstrtobool: TTestString;
  663. begin
  664. Result := '';
  665. AssertExpression('strtobool(''0'')',false);
  666. end;
  667. function TestBuiltins_TestFunctionstrtobooldef: TTestString;
  668. begin
  669. Result := '';
  670. AssertExpression('strtobooldef(''XYZ'',True)',True);
  671. end;
  672. function TestBuiltins_TestFunctiondatetostr: TTestString;
  673. begin
  674. Result := '';
  675. FP.Identifiers.AddDateTimeVariable('A',Date);
  676. AssertExpression('DateToStr(A)',DateToStr(Date));
  677. end;
  678. function TestBuiltins_TestFunctiontimetostr: TTestString;
  679. Var
  680. T : TDateTime;
  681. begin
  682. Result := '';
  683. T:=Time;
  684. FP.Identifiers.AddDateTimeVariable('A',T);
  685. AssertExpression('TimeToStr(A)',TimeToStr(T));
  686. end;
  687. function TestBuiltins_TestFunctionstrtodate: TTestString;
  688. begin
  689. Result := '';
  690. FP.Identifiers.AddStringVariable('S',DateToStr(Date));
  691. AssertDateTimeExpression('StrToDate(S)',Date);
  692. end;
  693. function TestBuiltins_TestFunctionstrtodatedef: TTestString;
  694. begin
  695. Result := '';
  696. FP.Identifiers.AddDateTimeVariable('A',Date);
  697. AssertDateTimeExpression('StrToDateDef(''S'',A)',Date);
  698. end;
  699. function TestBuiltins_TestFunctionstrtotime: TTestString;
  700. Var
  701. T : TDateTime;
  702. begin
  703. Result := '';
  704. T:=Time;
  705. FP.Identifiers.AddStringVariable('S',TimeToStr(T));
  706. AssertDateTimeExpression('StrToTime(S)',T);
  707. end;
  708. function TestBuiltins_TestFunctionstrtotimedef: TTestString;
  709. Var
  710. T : TDateTime;
  711. begin
  712. Result := '';
  713. T:=Time;
  714. FP.Identifiers.AddDateTimeVariable('S',T);
  715. AssertDateTimeExpression('StrToTimeDef(''q'',S)',T);
  716. end;
  717. function TestBuiltins_TestFunctionstrtodatetime: TTestString;
  718. Var
  719. T : TDateTime;
  720. S : String;
  721. begin
  722. Result := '';
  723. T:=Now;
  724. S:=DateTimetostr(T);
  725. AssertDateTimeExpression('StrToDateTime('''+S+''')',T);
  726. end;
  727. function TestBuiltins_TestFunctionstrtodatetimedef: TTestString;
  728. Var
  729. T : TDateTime;
  730. S : String;
  731. begin
  732. Result := '';
  733. T:=Now;
  734. S:=DateTimetostr(T);
  735. FP.Identifiers.AddDateTimeVariable('S',T);
  736. AssertDateTimeExpression('StrToDateTimeDef('''+S+''',S)',T);
  737. end;
  738. function TestBuiltins_TestFunctionAggregateSum: TTestString;
  739. begin
  740. Result := '';
  741. FP.Identifiers.AddIntegerVariable('S',2);
  742. AssertAggregateExpression('sum(S)',10,5);
  743. end;
  744. function TestBuiltins_TestFunctionAggregateSumFloat: TTestString;
  745. begin
  746. Result := '';
  747. FP.Identifiers.AddFloatVariable('S',2.0);
  748. AssertAggregateExpression('sum(S)',10.0,5);
  749. end;
  750. function TestBuiltins_TestFunctionAggregateSumCurrency: TTestString;
  751. begin
  752. Result := '';
  753. FP.Identifiers.AddCurrencyVariable('S',2.0);
  754. AssertAggregateCurrExpression('sum(S)',Currency(10.0),5);
  755. end;
  756. function TestBuiltins_TestFunctionAggregateCount: TTestString;
  757. begin
  758. Result := '';
  759. AssertAggregateExpression('count',5,5);
  760. end;
  761. procedure DoAverage(var Result: TFPExpressionResult; ConstRef AName: ShortString);
  762. begin
  763. Inc(FValue);
  764. Result.ResInteger:=FValue;
  765. Result.ResultType:=rtInteger;
  766. end;
  767. procedure DoSeries(var Result: TFPExpressionResult; ConstRef AName: ShortString);
  768. Const
  769. Values : Array[1..10] of double =
  770. (1.3,1.8,1.1,9.9,1.4,2.4,5.8,6.5,7.8,8.1);
  771. begin
  772. Inc(FValue);
  773. Result.ResFloat:=Values[FValue];
  774. Result.ResultType:=rtFloat;
  775. end;
  776. function TestBuiltins_TestFunctionAggregateAvg: TTestString;
  777. begin
  778. Result := '';
  779. FP.Identifiers.AddVariable('S',rtInteger,@DoAverage);
  780. AssertAggregateExpression('avg(S)',5.5,10);
  781. end;
  782. function TestBuiltins_TestFunctionAggregateMin: TTestString;
  783. begin
  784. Result := '';
  785. FP.Identifiers.AddVariable('S',rtFloat,@DoSeries);
  786. AssertAggregateExpression('Min(S)',1.1,10);
  787. end;
  788. function TestBuiltins_TestFunctionAggregateMax: TTestString;
  789. begin
  790. Result := '';
  791. FP.Identifiers.AddVariable('S',rtFloat,@DoSeries);
  792. AssertAggregateExpression('Max(S)',9.9,10);
  793. end;
  794. procedure InitFileFormatSettings;
  795. begin
  796. FileFormatSettings := DefaultFormatSettings;
  797. FileFormatSettings.DecimalSeparator := '.';
  798. FileFormatSettings.DateSeparator := '-';
  799. FileFormatSettings.TimeSeparator := ':';
  800. FileFormatsettings.ShortDateFormat := 'yyyy-mm-dd';
  801. FileFormatSettings.LongTimeFormat := 'hh:nn:ss';
  802. end;
  803. procedure RegisterTests(aTop : PSuite);
  804. var
  805. lSuite : PSuite;
  806. begin
  807. InitFileFormatSettings;
  808. lSuite:=AddSuite('TBuiltinsManagerTests', @SuiteSetup, @SuiteTearDown,aTop, true);
  809. AddTest('TestCreate', @TestBuiltinsManager_TestCreate, lSuite);
  810. AddTest('TestVariable1', @TestBuiltinsManager_TestVariable1, lSuite);
  811. AddTest('TestVariable2', @TestBuiltinsManager_TestVariable2, lSuite);
  812. AddTest('TestVariable3', @TestBuiltinsManager_TestVariable3, lSuite);
  813. AddTest('TestVariable4', @TestBuiltinsManager_TestVariable4, lSuite);
  814. AddTest('TestVariable5', @TestBuiltinsManager_TestVariable5, lSuite);
  815. AddTest('TestVariable6', @TestBuiltinsManager_TestVariable6, lSuite);
  816. AddTest('TestVariable7', @TestBuiltinsManager_TestVariable7, lSuite);
  817. AddTest('TestFunction1', @TestBuiltinsManager_TestFunction1, lSuite);
  818. AddTest('TestFunction2', @TestBuiltinsManager_TestFunction2, lSuite);
  819. AddTest('TestDelete', @TestBuiltinsManager_TestDelete, lSuite);
  820. AddTest('TestRemove', @TestBuiltinsManager_TestRemove, lSuite);
  821. lSuite:=AddSuite('TBuiltinsTests', @SuiteSetup, @SuiteTearDown, aTop, True);
  822. AddTest('TestVariablepi', @TestBuiltins_TestVariablepi, lSuite);
  823. AddTest('TestFunctioncos', @TestBuiltins_TestFunctioncos, lSuite);
  824. AddTest('TestFunctionsin', @TestBuiltins_TestFunctionsin, lSuite);
  825. AddTest('TestFunctionarctan', @TestBuiltins_TestFunctionarctan, lSuite);
  826. AddTest('TestFunctionabs', @TestBuiltins_TestFunctionabs, lSuite);
  827. AddTest('TestFunctionsqr', @TestBuiltins_TestFunctionsqr, lSuite);
  828. AddTest('TestFunctionsqrt', @TestBuiltins_TestFunctionsqrt, lSuite);
  829. AddTest('TestFunctionexp', @TestBuiltins_TestFunctionexp, lSuite);
  830. AddTest('TestFunctionln', @TestBuiltins_TestFunctionln, lSuite);
  831. AddTest('TestFunctionlog', @TestBuiltins_TestFunctionlog, lSuite);
  832. AddTest('TestFunctionfrac', @TestBuiltins_TestFunctionfrac, lSuite);
  833. AddTest('TestFunctionint', @TestBuiltins_TestFunctionint, lSuite);
  834. AddTest('TestFunctionround', @TestBuiltins_TestFunctionround, lSuite);
  835. AddTest('TestFunctiontrunc', @TestBuiltins_TestFunctiontrunc, lSuite);
  836. AddTest('TestFunctionlength', @TestBuiltins_TestFunctionlength, lSuite);
  837. AddTest('TestFunctioncopy', @TestBuiltins_TestFunctioncopy, lSuite);
  838. AddTest('TestFunctiondelete', @TestBuiltins_TestFunctiondelete, lSuite);
  839. AddTest('TestFunctionpos', @TestBuiltins_TestFunctionpos, lSuite);
  840. AddTest('TestFunctionlowercase', @TestBuiltins_TestFunctionlowercase, lSuite);
  841. AddTest('TestFunctionuppercase', @TestBuiltins_TestFunctionuppercase, lSuite);
  842. AddTest('TestFunctionstringreplace', @TestBuiltins_TestFunctionstringreplace, lSuite);
  843. AddTest('TestFunctioncomparetext', @TestBuiltins_TestFunctioncomparetext, lSuite);
  844. AddTest('TestFunctiondate', @TestBuiltins_TestFunctiondate, lSuite);
  845. AddTest('TestFunctiontime', @TestBuiltins_TestFunctiontime, lSuite);
  846. AddTest('TestFunctionnow', @TestBuiltins_TestFunctionnow, lSuite);
  847. AddTest('TestFunctiondayofweek', @TestBuiltins_TestFunctiondayofweek, lSuite);
  848. AddTest('TestFunctionextractyear', @TestBuiltins_TestFunctionextractyear, lSuite);
  849. AddTest('TestFunctionextractmonth', @TestBuiltins_TestFunctionextractmonth, lSuite);
  850. AddTest('TestFunctionextractday', @TestBuiltins_TestFunctionextractday, lSuite);
  851. AddTest('TestFunctionextracthour', @TestBuiltins_TestFunctionextracthour, lSuite);
  852. AddTest('TestFunctionextractmin', @TestBuiltins_TestFunctionextractmin, lSuite);
  853. AddTest('TestFunctionextractsec', @TestBuiltins_TestFunctionextractsec, lSuite);
  854. AddTest('TestFunctionextractmsec', @TestBuiltins_TestFunctionextractmsec, lSuite);
  855. AddTest('TestFunctionencodedate', @TestBuiltins_TestFunctionencodedate, lSuite);
  856. AddTest('TestFunctionencodetime', @TestBuiltins_TestFunctionencodetime, lSuite);
  857. AddTest('TestFunctionencodedatetime', @TestBuiltins_TestFunctionencodedatetime, lSuite);
  858. AddTest('TestFunctionshortdayname', @TestBuiltins_TestFunctionshortdayname, lSuite);
  859. AddTest('TestFunctionshortmonthname', @TestBuiltins_TestFunctionshortmonthname, lSuite);
  860. AddTest('TestFunctionlongdayname', @TestBuiltins_TestFunctionlongdayname, lSuite);
  861. AddTest('TestFunctionlongmonthname', @TestBuiltins_TestFunctionlongmonthname, lSuite);
  862. AddTest('TestFunctionformatdatetime', @TestBuiltins_TestFunctionformatdatetime, lSuite);
  863. AddTest('TestFunctionshl', @TestBuiltins_TestFunctionshl, lSuite);
  864. AddTest('TestFunctionshr', @TestBuiltins_TestFunctionshr, lSuite);
  865. AddTest('TestFunctionIFS', @TestBuiltins_TestFunctionIFS, lSuite);
  866. AddTest('TestFunctionIFF', @TestBuiltins_TestFunctionIFF, lSuite);
  867. AddTest('TestFunctionIFD', @TestBuiltins_TestFunctionIFD, lSuite);
  868. AddTest('TestFunctionIFI', @TestBuiltins_TestFunctionIFI, lSuite);
  869. AddTest('TestFunctioninttostr', @TestBuiltins_TestFunctioninttostr, lSuite);
  870. AddTest('TestFunctionstrtoint', @TestBuiltins_TestFunctionstrtoint, lSuite);
  871. AddTest('TestFunctionstrtointdef', @TestBuiltins_TestFunctionstrtointdef, lSuite);
  872. AddTest('TestFunctionfloattostr', @TestBuiltins_TestFunctionfloattostr, lSuite);
  873. AddTest('TestFunctionstrtofloat', @TestBuiltins_TestFunctionstrtofloat, lSuite);
  874. AddTest('TestFunctionstrtofloatdef', @TestBuiltins_TestFunctionstrtofloatdef, lSuite);
  875. AddTest('TestFunctionbooltostr', @TestBuiltins_TestFunctionbooltostr, lSuite);
  876. AddTest('TestFunctionstrtobool', @TestBuiltins_TestFunctionstrtobool, lSuite);
  877. AddTest('TestFunctionstrtobooldef', @TestBuiltins_TestFunctionstrtobooldef, lSuite);
  878. AddTest('TestFunctiondatetostr', @TestBuiltins_TestFunctiondatetostr, lSuite);
  879. AddTest('TestFunctiontimetostr', @TestBuiltins_TestFunctiontimetostr, lSuite);
  880. AddTest('TestFunctionstrtodate', @TestBuiltins_TestFunctionstrtodate, lSuite);
  881. AddTest('TestFunctionstrtodatedef', @TestBuiltins_TestFunctionstrtodatedef, lSuite);
  882. AddTest('TestFunctionstrtotime', @TestBuiltins_TestFunctionstrtotime, lSuite);
  883. AddTest('TestFunctionstrtotimedef', @TestBuiltins_TestFunctionstrtotimedef, lSuite);
  884. AddTest('TestFunctionstrtodatetime', @TestBuiltins_TestFunctionstrtodatetime, lSuite);
  885. AddTest('TestFunctionstrtodatetimedef', @TestBuiltins_TestFunctionstrtodatetimedef, lSuite);
  886. AddTest('TestFunctionAggregateSum', @TestBuiltins_TestFunctionAggregateSum, lSuite);
  887. AddTest('TestFunctionAggregateSumFloat', @TestBuiltins_TestFunctionAggregateSumFloat, lSuite);
  888. AddTest('TestFunctionAggregateSumCurrency', @TestBuiltins_TestFunctionAggregateSumCurrency, lSuite);
  889. AddTest('TestFunctionAggregateCount', @TestBuiltins_TestFunctionAggregateCount, lSuite);
  890. AddTest('TestFunctionAggregateAvg', @TestBuiltins_TestFunctionAggregateAvg, lSuite);
  891. AddTest('TestFunctionAggregateMin', @TestBuiltins_TestFunctionAggregateMin, lSuite);
  892. AddTest('TestFunctionAggregateMax', @TestBuiltins_TestFunctionAggregateMax, lSuite);
  893. end;
  894. end.