Test_MathExpression.dpr 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712
  1. (* _ _
  2. * | |__ _ __ ___ ___ | | __
  3. * | '_ \| '__/ _ \ / _ \| |/ /
  4. * | |_) | | | (_) | (_) | <
  5. * |_.__/|_| \___/ \___/|_|\_\
  6. *
  7. * Microframework which helps to develop web Pascal applications.
  8. *
  9. * Copyright (c) 2012-2020 Silvio Clecio <[email protected]>
  10. *
  11. * Brook framework is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU Lesser General Public
  13. * License as published by the Free Software Foundation; either
  14. * version 2.1 of the License, or (at your option) any later version.
  15. *
  16. * Brook framework is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  19. * Lesser General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU Lesser General Public
  22. * License along with Brook framework; if not, write to the Free Software
  23. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  24. *)
  25. program Test_MathExpression;
  26. {$I Tests.inc}
  27. uses
  28. SysUtils,
  29. StrUtils,
  30. Math,
  31. Classes,
  32. libsagui,
  33. Marshalling,
  34. Platform,
  35. BrookUtility,
  36. BrookLibraryLoader,
  37. BrookMathExpression,
  38. Test;
  39. var
  40. FakeHandle: Pointer = Pointer(1);
  41. FakeComponentHandle: TComponent;
  42. FakeErrType: sg_expr_err_type;
  43. FakeFlag: Boolean;
  44. type
  45. TFakeMathExpression = class(TBrookMathExpression)
  46. private
  47. FFakeError: TBrookMathExpressionError;
  48. public
  49. constructor Create(AOwner: TComponent); override;
  50. procedure FakeOnError(Sender: TObject; AError: TBrookMathExpressionError);
  51. function FakeOnExtension(Sender: TObject;
  52. AExtension: TBrookMathExpressionExtension): Double;
  53. procedure FakeOnActivate(Sender: TObject);
  54. procedure FakeOnDeactivate(Sender: TObject);
  55. property FakeError: TBrookMathExpressionError read FFakeError;
  56. end;
  57. procedure TFakeMathExpression.FakeOnError(Sender: TObject;
  58. AError: TBrookMathExpressionError);
  59. begin
  60. FFakeError := AError;
  61. end;
  62. constructor TFakeMathExpression.Create(AOwner: TComponent);
  63. begin
  64. inherited Create(AOwner);
  65. OnExtension := FakeOnExtension;
  66. OnError := FakeOnError;
  67. OnActivate := FakeOnActivate;
  68. OnDeactivate := FakeOnDeactivate;
  69. FFakeError := Default(TBrookMathExpressionError);
  70. end;
  71. {$IFDEF FPC}
  72. {$PUSH}{$WARN 6058 OFF}
  73. {$ENDIF}
  74. function TFakeMathExpression.FakeOnExtension(Sender: TObject;
  75. AExtension: TBrookMathExpressionExtension): Double;
  76. begin
  77. if AExtension.HasArgs then
  78. case IndexText(AExtension.Ident, ['mysum', 'mymult']) of
  79. 0: Exit(AExtension.Args[0] + AExtension.Args[1]);
  80. 1: Exit(AExtension.Args[0] * AExtension.Args[1]);
  81. end;
  82. Result := NaN;
  83. end;
  84. {$IFDEF FPC}
  85. {$POP}
  86. {$ENDIF}
  87. procedure TFakeMathExpression.FakeOnActivate(Sender: TObject);
  88. begin
  89. FakeFlag := True;
  90. end;
  91. procedure TFakeMathExpression.FakeOnDeactivate(Sender: TObject);
  92. begin
  93. FakeFlag := True;
  94. end;
  95. function fake_expr_near(expr: Psg_expr): cint; cdecl;
  96. begin
  97. Assert(expr = FakeHandle);
  98. Result := 123;
  99. end;
  100. function fake_expr_err(expr: Psg_expr): sg_expr_err_type; cdecl;
  101. begin
  102. Assert(expr = FakeHandle);
  103. Result := FakeErrType;
  104. end;
  105. function fake_expr_strerror(expr: Psg_expr): Pcchar; cdecl;
  106. var
  107. M: TMarshaller;
  108. begin
  109. Assert(expr = FakeHandle);
  110. Result := M.ToCString('abc123');
  111. end;
  112. function fake_expr_arg(args: Psg_expr_argument; index: cint): cdouble; cdecl;
  113. begin
  114. Assert(args = FakeHandle);
  115. Assert(index = 123);
  116. Result := 12.34;
  117. end;
  118. procedure Test_MathExpressionErrorCreate;
  119. var
  120. E: TBrookMathExpressionError;
  121. begin
  122. E := TBrookMathExpressionError.Create(FakeHandle);
  123. Assert(E.Handle = FakeHandle);
  124. end;
  125. procedure DoMathExpressionErrorNearLibNotLoaded;
  126. begin
  127. TBrookMathExpressionError.Create(FakeHandle).Near;
  128. end;
  129. procedure Test_MathExpressionErrorNear;
  130. var
  131. E: TBrookMathExpressionError;
  132. begin
  133. sg_expr_near := fake_expr_near;
  134. E := TBrookMathExpressionError.Create(FakeHandle);
  135. Assert(E.Near = 123);
  136. TBrookLibraryLoader.Unload;
  137. try
  138. AssertExcept(DoMathExpressionErrorNearLibNotLoaded, ESgLibNotLoaded,
  139. Format(SSgLibNotLoaded, [SG_LIB_NAME]));
  140. finally
  141. TBrookLibraryLoader.Load;
  142. end;
  143. end;
  144. procedure DoMathExpressionErrorKindLibNotLoaded;
  145. begin
  146. TBrookMathExpressionError.Create(FakeHandle).Kind;
  147. end;
  148. procedure Test_MathExpressionErrorKind;
  149. var
  150. E: TBrookMathExpressionError;
  151. begin
  152. sg_expr_err := fake_expr_err;
  153. E := TBrookMathExpressionError.Create(FakeHandle);
  154. FakeErrType := -1;
  155. Assert(E.Kind = ekNone);
  156. FakeErrType := SG_EXPR_ERR_UNKNOWN;
  157. Assert(E.Kind = ekUnknown);
  158. FakeErrType := SG_EXPR_ERR_UNEXPECTED_NUMBER;
  159. Assert(E.Kind = ekUnexpectedNumber);
  160. FakeErrType := SG_EXPR_ERR_UNEXPECTED_WORD;
  161. Assert(E.Kind = ekUnexpectedWord);
  162. FakeErrType := SG_EXPR_ERR_UNEXPECTED_PARENS;
  163. Assert(E.Kind = ekUnexpectedParens);
  164. FakeErrType := SG_EXPR_ERR_MISSING_OPERAND;
  165. Assert(E.Kind = ekMissingOperand);
  166. FakeErrType := SG_EXPR_ERR_UNKNOWN_OPERATOR;
  167. Assert(E.Kind = ekUnknownOperator);
  168. FakeErrType := SG_EXPR_ERR_INVALID_FUNC_NAME;
  169. Assert(E.Kind = ekInvalidFuncName);
  170. FakeErrType := SG_EXPR_ERR_BAD_PARENS;
  171. Assert(E.Kind = ekBadParens);
  172. FakeErrType := SG_EXPR_ERR_TOO_FEW_FUNC_ARGS;
  173. Assert(E.Kind = ekTooFewFuncArgs);
  174. FakeErrType := SG_EXPR_ERR_FIRST_ARG_IS_NOT_VAR;
  175. Assert(E.Kind = ekFirstArgIsNotVar);
  176. FakeErrType := SG_EXPR_ERR_BAD_VARIABLE_NAME;
  177. Assert(E.Kind = ekBadVariableName);
  178. FakeErrType := SG_EXPR_ERR_BAD_ASSIGNMENT;
  179. Assert(E.Kind = ekBadAssignment);
  180. TBrookLibraryLoader.Unload;
  181. try
  182. AssertExcept(DoMathExpressionErrorKindLibNotLoaded, ESgLibNotLoaded,
  183. Format(SSgLibNotLoaded, [SG_LIB_NAME]));
  184. finally
  185. TBrookLibraryLoader.Load;
  186. end;
  187. end;
  188. procedure DoMathExpressionErrorMessageLibNotLoaded;
  189. begin
  190. TBrookMathExpressionError.Create(FakeHandle).Message;
  191. end;
  192. procedure Test_MathExpressionErrorMessage;
  193. var
  194. E: TBrookMathExpressionError;
  195. begin
  196. sg_expr_strerror := fake_expr_strerror;
  197. E := TBrookMathExpressionError.Create(FakeHandle);
  198. Assert(E.Message = 'abc123');
  199. TBrookLibraryLoader.Unload;
  200. try
  201. AssertExcept(DoMathExpressionErrorMessageLibNotLoaded, ESgLibNotLoaded,
  202. Format(SSgLibNotLoaded, [SG_LIB_NAME]));
  203. finally
  204. TBrookLibraryLoader.Load;
  205. end;
  206. end;
  207. procedure Test_MathExpressionErrorHandle;
  208. var
  209. E1, E2: TBrookMathExpressionError;
  210. begin
  211. E1 := TBrookMathExpressionError.Create(nil);
  212. E2 := TBrookMathExpressionError.Create(FakeHandle);
  213. Assert(not Assigned(E1.Handle));
  214. Assert(Assigned(E2.Handle));
  215. Assert(E2.Handle = FakeHandle);
  216. end;
  217. procedure Test_MathExpressionExtensionCreate;
  218. var
  219. E1, E2: TBrookMathExpressionExtension;
  220. begin
  221. E1 := TBrookMathExpressionExtension.Create(nil, '');
  222. E2 := TBrookMathExpressionExtension.Create(FakeHandle, 'abc123');
  223. Assert(E1.Ident = '');
  224. Assert(not Assigned(E1.Handle));
  225. Assert(E2.Ident = 'abc123');
  226. Assert(Assigned(E2.Handle));
  227. end;
  228. procedure Test_MathExpressionExtensionHasArgs;
  229. var
  230. E1, E2: TBrookMathExpressionExtension;
  231. begin
  232. E1 := TBrookMathExpressionExtension.Create(nil, '');
  233. E2 := TBrookMathExpressionExtension.Create(FakeHandle, 'abc123');
  234. Assert(not E1.HasArgs);
  235. Assert(E2.HasArgs);
  236. end;
  237. procedure DoMathExpressionErrorArgsLibNotLoaded;
  238. begin
  239. TBrookMathExpressionExtension.Create(FakeHandle, 'abc123').Args[0];
  240. end;
  241. procedure Test_MathExpressionExtensionArgs;
  242. var
  243. E1, E2: TBrookMathExpressionExtension;
  244. begin
  245. E1 := TBrookMathExpressionExtension.Create(nil, '');
  246. E2 := TBrookMathExpressionExtension.Create(FakeHandle, 'abc123');
  247. sg_expr_arg := fake_expr_arg;
  248. Assert(E1.Args[0].ToString = NaN.ToString);
  249. Assert(E1[0].ToString = NaN.ToString);
  250. Assert(E2.Args[123].ToString = Double(12.34).ToString);
  251. Assert(E2[123].ToString = Double(12.34).ToString);
  252. TBrookLibraryLoader.Unload;
  253. try
  254. AssertExcept(DoMathExpressionErrorArgsLibNotLoaded, ESgLibNotLoaded,
  255. Format(SSgLibNotLoaded, [SG_LIB_NAME]));
  256. finally
  257. TBrookLibraryLoader.Load;
  258. end;
  259. end;
  260. procedure Test_MathExpressionExtensionIdent;
  261. var
  262. E1, E2: TBrookMathExpressionExtension;
  263. begin
  264. E1 := TBrookMathExpressionExtension.Create(nil, '');
  265. E2 := TBrookMathExpressionExtension.Create(FakeHandle, 'abc123');
  266. Assert(E1.Ident = '');
  267. Assert(not Assigned(E1.Handle));
  268. Assert(E2.Ident = 'abc123');
  269. end;
  270. procedure Test_MathExpressionExtensionHandle;
  271. var
  272. E1, E2: TBrookMathExpressionExtension;
  273. begin
  274. E1 := TBrookMathExpressionExtension.Create(nil, '');
  275. E2 := TBrookMathExpressionExtension.Create(FakeHandle, 'abc123');
  276. Assert(not Assigned(E1.Handle));
  277. Assert(Assigned(E2.Handle));
  278. Assert(E2.Handle = FakeHandle);
  279. end;
  280. procedure Test_MathExpressionCreate;
  281. var
  282. E1, E2: TBrookMathExpression;
  283. begin
  284. FakeComponentHandle := TComponent.Create(nil);
  285. E1 := TBrookMathExpression.Create(nil);
  286. E2 := TBrookMathExpression.Create(FakeComponentHandle);
  287. try
  288. Assert(not Assigned(E1.Owner));
  289. Assert(Assigned(E2.Owner));
  290. Assert(E2.Owner = FakeComponentHandle);
  291. Assert(Assigned(E1.Extensions));
  292. E1.Active := True;
  293. Assert(E1.Active);
  294. TBrookLibraryLoader.Unload;
  295. try
  296. Assert(not E1.Active);
  297. finally
  298. TBrookLibraryLoader.Load;
  299. end;
  300. finally
  301. E1.Destroy;
  302. E2.Destroy;
  303. FakeComponentHandle.Free;
  304. end;
  305. end;
  306. procedure Test_MathExpressionOpen;
  307. var
  308. E: TBrookMathExpression;
  309. begin
  310. E := TBrookMathExpression.Create(nil);
  311. try
  312. Assert(not E.Active);
  313. E.Open;
  314. Assert(E.Active);
  315. finally
  316. E.Free;
  317. end;
  318. end;
  319. procedure Test_MathExpressionClose;
  320. var
  321. E: TBrookMathExpression;
  322. begin
  323. E := TBrookMathExpression.Create(nil);
  324. try
  325. Assert(not E.Active);
  326. E.Open;
  327. Assert(E.Active);
  328. E.Close;
  329. Assert(not E.Active);
  330. finally
  331. E.Free;
  332. end;
  333. end;
  334. procedure DoMathExpressionCompileInactiveMathExpression(
  335. const AArgs: array of const);
  336. var
  337. E: TBrookMathExpressionError;
  338. begin
  339. TBrookMathExpression(AArgs[0].VObject).Compile('1+2', E);
  340. end;
  341. procedure Test_MathExpressionCompile;
  342. var
  343. M1: TBrookMathExpression;
  344. M2: TFakeMathExpression;
  345. E: TBrookMathExpressionError;
  346. begin
  347. M1 := TBrookMathExpression.Create(nil);
  348. try
  349. Assert(not M1.Compiled);
  350. M1.Open;
  351. Assert(M1.Compile('1+2', E));
  352. Assert(M1.Compile('(1+2', E));
  353. M1.Clear;
  354. Assert(not M1.Compile('(1+2', E));
  355. Assert(E.Near = 4);
  356. Assert(E.Message.Trim = 'Bad parenthesis.');
  357. Assert(E.Kind = ekBadParens);
  358. Assert(not M1.Compile('1++2', E));
  359. Assert(E.Near = 2);
  360. Assert(E.Message.Trim = 'Missing expected operand.');
  361. Assert(E.Kind = ekMissingOperand);
  362. M1.Close;
  363. AssertExcept(DoMathExpressionCompileInactiveMathExpression,
  364. EInvalidOpException, SBrookInactiveMathExpression, [M1]);
  365. M1.Open;
  366. TBrookLibraryLoader.Unload;
  367. try
  368. AssertExcept(DoMathExpressionCompileInactiveMathExpression,
  369. EInvalidOpException, SBrookInactiveMathExpression, [M1]);
  370. finally
  371. TBrookLibraryLoader.Load;
  372. end;
  373. finally
  374. M1.Free;
  375. end;
  376. M2 := TFakeMathExpression.Create(nil);
  377. try
  378. M2.Open;
  379. Assert(not M2.Compile('(1+2'));
  380. Assert(M2.FakeError.Near = 4);
  381. Assert(M2.FakeError.Message.Trim = 'Bad parenthesis.');
  382. Assert(M2.FakeError.Kind = ekBadParens);
  383. Assert(not M2.Compile('1++2'));
  384. Assert(M2.FakeError.Near = 2);
  385. Assert(M2.FakeError.Message.Trim = 'Missing expected operand.');
  386. Assert(M2.FakeError.Kind = ekMissingOperand);
  387. finally
  388. M2.Free;
  389. end;
  390. end;
  391. procedure Test_MathExpressionClear;
  392. var
  393. M: TBrookMathExpression;
  394. begin
  395. M := TBrookMathExpression.Create(nil);
  396. try
  397. M.Open;
  398. M.Compile('1+2');
  399. Assert(M.Compiled);
  400. M.Clear;
  401. Assert(not M.Compiled);
  402. M.Clear;
  403. M.Clear;
  404. finally
  405. M.Free;
  406. end;
  407. end;
  408. procedure Test_MathExpressionEvaluate;
  409. var
  410. M: TBrookMathExpression;
  411. begin
  412. M := TBrookMathExpression.Create(nil);
  413. try
  414. M.Open;
  415. Assert(not M.Compiled);
  416. M.Expression := '1.2+3.4';
  417. Assert(M.Evaluate.ToString = Double(4.6).ToString);
  418. Assert(M.Compiled);
  419. Assert(M.Evaluate.ToString = Double(4.6).ToString);
  420. finally
  421. M.Free;
  422. end;
  423. end;
  424. procedure DoMathExpressionGetVariableInactiveMathExpression(
  425. const AArgs: array of const);
  426. begin
  427. TBrookMathExpression(AArgs[0].VObject).GetVariable('foo');
  428. end;
  429. procedure Test_MathExpressionGetVariable;
  430. var
  431. M: TBrookMathExpression;
  432. begin
  433. M := TBrookMathExpression.Create(nil);
  434. try
  435. M.Open;
  436. Assert(M.GetVariable('foo').ToString = Double(0).ToString);
  437. M.SetVariable('foo', 12.34);
  438. Assert(M.GetVariable('foo').ToString = Double(12.34).ToString);
  439. M.Expression := 'foo=56.78';
  440. M.Evaluate;
  441. Assert(M.GetVariable('foo').ToString = Double(56.78).ToString);
  442. M.Close;
  443. AssertExcept(DoMathExpressionGetVariableInactiveMathExpression,
  444. EInvalidOpException, SBrookInactiveMathExpression, [M]);
  445. finally
  446. M.Free;
  447. end;
  448. end;
  449. procedure DoMathExpressionSetVariableInactiveMathExpression(
  450. const AArgs: array of const);
  451. begin
  452. TBrookMathExpression(AArgs[0].VObject).SetVariable('foo', 12.34);
  453. end;
  454. procedure Test_MathExpressionSetVariable;
  455. var
  456. M: TBrookMathExpression;
  457. begin
  458. M := TBrookMathExpression.Create(nil);
  459. try
  460. M.Open;
  461. M.Expression := 'foo+56.78';
  462. Assert(M.GetVariable('foo').ToString = Double(0).ToString);
  463. M.SetVariable('foo', 12.34);
  464. Assert(M.GetVariable('foo').ToString = Double(12.34).ToString);
  465. Assert(M.Evaluate.ToString = Double(69.12).ToString);
  466. M.Close;
  467. AssertExcept(DoMathExpressionSetVariableInactiveMathExpression,
  468. EInvalidOpException, SBrookInactiveMathExpression, [M]);
  469. finally
  470. M.Free;
  471. end;
  472. end;
  473. procedure Test_MathExpressionCompiled;
  474. var
  475. M: TBrookMathExpression;
  476. begin
  477. M := TBrookMathExpression.Create(nil);
  478. try
  479. M.Open;
  480. Assert(not M.Compiled);
  481. M.Compile('1+2');
  482. Assert(M.Compiled);
  483. M.Close;
  484. Assert(not M.Compiled);
  485. finally
  486. M.Free;
  487. end;
  488. end;
  489. procedure Test_MathExpressionVariables;
  490. var
  491. M: TBrookMathExpression;
  492. begin
  493. M := TBrookMathExpression.Create(nil);
  494. try
  495. M.Open;
  496. M.Expression := 'foo+bar';
  497. M.Variables['foo'] := 12.34;
  498. M['bar'] := 56.78;
  499. Assert(M.Evaluate.ToString = Double(69.12).ToString);
  500. finally
  501. M.Free;
  502. end;
  503. end;
  504. procedure Test_MathExpressionActive;
  505. var
  506. M: TBrookMathExpression;
  507. begin
  508. M := TBrookMathExpression.Create(nil);
  509. try
  510. Assert(not M.Active);
  511. M.Active := not M.Active;
  512. Assert(M.Active);
  513. M.Active := True;
  514. Assert(M.Active);
  515. finally
  516. M.Free;
  517. end;
  518. end;
  519. procedure Test_MathExpressionExpression;
  520. var
  521. M: TBrookMathExpression;
  522. begin
  523. M := TBrookMathExpression.Create(nil);
  524. try
  525. M.Open;
  526. Assert(M.Expression.IsEmpty);
  527. M.Expression := '1.2+3.4';
  528. Assert(M.Expression = '1.2+3.4');
  529. Assert(M.Evaluate.ToString = Double(4.6).ToString);
  530. Assert(M.Compiled);
  531. M.Expression := '1+2';
  532. Assert(not M.Compiled);
  533. finally
  534. M.Free;
  535. end;
  536. end;
  537. procedure Test_MathExpressionExtensions;
  538. var
  539. M: TFakeMathExpression;
  540. begin
  541. M := TFakeMathExpression.Create(nil);
  542. try
  543. M.Open;
  544. Assert(Assigned(M.Extensions));
  545. M.Expression := 'mysum(1.2, 3.4) + mymult(5.6, 7.8)';
  546. Assert(M.Evaluate.ToString = NaN.ToString);
  547. M.Extensions.AddStrings(['mysum', 'mymult']);
  548. Assert(M.Evaluate.ToString = Double(48.28).ToString);
  549. finally
  550. M.Free;
  551. end;
  552. end;
  553. procedure Test_MathExpressionOnExtension;
  554. begin
  555. Test_MathExpressionExtensions;
  556. end;
  557. procedure Test_MathExpressionOnError;
  558. var
  559. M: TFakeMathExpression;
  560. begin
  561. M := TFakeMathExpression.Create(nil);
  562. try
  563. M.Open;
  564. Assert(not M.Compile('(1+2'));
  565. Assert(M.FakeError.Near = 4);
  566. Assert(M.FakeError.Message.Trim = 'Bad parenthesis.');
  567. Assert(M.FakeError.Kind = ekBadParens);
  568. Assert(not M.Compile('1++2'));
  569. Assert(M.FakeError.Near = 2);
  570. Assert(M.FakeError.Message.Trim = 'Missing expected operand.');
  571. Assert(M.FakeError.Kind = ekMissingOperand);
  572. finally
  573. M.Free;
  574. end;
  575. end;
  576. procedure Test_MathExpressionOnActivate;
  577. var
  578. M: TFakeMathExpression;
  579. begin
  580. M := TFakeMathExpression.Create(nil);
  581. try
  582. M.OnActivate := M.FakeOnActivate;
  583. FakeFlag := False;
  584. M.Open;
  585. Assert(FakeFlag);
  586. finally
  587. M.Free;
  588. end;
  589. end;
  590. procedure Test_MathExpressionOnDeactivate;
  591. var
  592. M: TFakeMathExpression;
  593. begin
  594. M := TFakeMathExpression.Create(nil);
  595. try
  596. M.Open;
  597. M.OnDeactivate := M.FakeOnDeactivate;
  598. FakeFlag := False;
  599. M.Close;
  600. Assert(FakeFlag);
  601. finally
  602. M.Free;
  603. end;
  604. end;
  605. procedure Test_MathExpression_Evaluate;
  606. begin
  607. Assert(Evaluate('').ToString = NaN.ToString);
  608. Assert(Evaluate('1.2+3.4').ToString = Double(4.6).ToString);
  609. Assert(Evaluate('foo=9.8, bar=7.6, foo + bar').ToString = Double(17.4).ToString);
  610. end;
  611. begin
  612. {$IF (NOT DEFINED(FPC)) AND DEFINED(DEBUG)}
  613. ReportMemoryLeaksOnShutdown := True;
  614. {$ENDIF}
  615. TBrookLibraryLoader.Load;
  616. try
  617. Test_MathExpressionErrorCreate;
  618. Test_MathExpressionErrorNear;
  619. Test_MathExpressionErrorKind;
  620. Test_MathExpressionErrorMessage;
  621. Test_MathExpressionErrorHandle;
  622. Test_MathExpressionExtensionCreate;
  623. Test_MathExpressionExtensionHasArgs;
  624. Test_MathExpressionExtensionArgs;
  625. Test_MathExpressionExtensionIdent;
  626. Test_MathExpressionExtensionHandle;
  627. Test_MathExpressionCreate;
  628. // Test_MathExpressionDestroy - not required
  629. Test_MathExpressionOpen;
  630. Test_MathExpressionClose;
  631. Test_MathExpressionCompile;
  632. Test_MathExpressionClear;
  633. Test_MathExpressionEvaluate;
  634. Test_MathExpressionGetVariable;
  635. Test_MathExpressionSetVariable;
  636. Test_MathExpressionCompiled;
  637. Test_MathExpressionVariables;
  638. Test_MathExpressionActive;
  639. Test_MathExpressionExpression;
  640. Test_MathExpressionExtensions;
  641. Test_MathExpressionOnExtension;
  642. Test_MathExpressionOnError;
  643. Test_MathExpressionOnActivate;
  644. Test_MathExpressionOnDeactivate;
  645. Test_MathExpression_Evaluate;
  646. finally
  647. TBrookLibraryLoader.Unload;
  648. end;
  649. end.