testsqlscript.pas 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2008 by the Free Pascal development team
  4. FPCUnit SQLScript test.
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit testcsqlscript;
  12. {$mode objfpc}{$H+}
  13. interface
  14. uses
  15. Classes, SysUtils, testregistry, sqlscript, fpcunit;
  16. type
  17. { TMyScript }
  18. TMyScript = class (TCustomSQLScript)
  19. private
  20. FExcept: string;
  21. FStatements : TStrings;
  22. FDirectives : TStrings;
  23. FCommits : integer;
  24. protected
  25. procedure ExecuteStatement (SQLStatement: TStrings; var StopExecution: Boolean); override;
  26. procedure ExecuteDirective (Directive, Argument: String; var StopExecution: Boolean); override;
  27. procedure ExecuteCommit; override;
  28. procedure DefaultDirectives; override;
  29. public
  30. constructor create (AnOwner: TComponent); override;
  31. destructor destroy; override;
  32. function StatementsExecuted : string;
  33. function DirectivesExecuted : string;
  34. property DoException : string read FExcept write FExcept;
  35. property Aborted;
  36. property Line;
  37. property Directives;
  38. property Defines;
  39. property Script;
  40. property Terminator;
  41. property CommentsinSQL;
  42. property UseSetTerm;
  43. property UseCommit;
  44. property UseDefines;
  45. property OnException;
  46. end;
  47. { TTestSQLScript }
  48. TTestSQLScript = class (TTestCase)
  49. private
  50. Script : TMyScript;
  51. exceptionstatement,
  52. exceptionmessage : string;
  53. UseContinue : boolean;
  54. procedure Add (s :string);
  55. procedure AssertStatDir (Statements, Directives : string);
  56. procedure DoExecution;
  57. procedure ExceptionHandler(Sender: TObject; Statement: TStrings; TheException: Exception; var Continue: boolean);
  58. procedure TestDirectiveOnException3;
  59. protected
  60. procedure SetUp; override;
  61. procedure TearDown; override;
  62. published
  63. procedure TestCreateDefaults;
  64. procedure TestTerminator;
  65. procedure TestSetTerm;
  66. procedure TestUseSetTerm;
  67. procedure TestComments;
  68. procedure TestUseComments;
  69. procedure TestCommit;
  70. procedure TestUseCommit;
  71. procedure TestDefine;
  72. procedure TestUndefine;
  73. procedure TestUndef;
  74. procedure TestIfdef1;
  75. procedure TestIfdef2;
  76. procedure TestIfndef1;
  77. procedure TestIfndef2;
  78. procedure TestElse1;
  79. procedure TestElse2;
  80. procedure TestEndif1;
  81. procedure TestEndif2;
  82. procedure TestUseDefines;
  83. procedure TestTermInComment;
  84. procedure TestTermInQuotes1;
  85. procedure TestTermInQuotes2;
  86. procedure TestCommentInComment;
  87. procedure TestCommentInQuotes1;
  88. procedure TestCommentInQuotes2;
  89. procedure TestQuote1InComment;
  90. procedure TestQuote2InComment;
  91. procedure TestQuoteInQuotes1;
  92. procedure TestQuoteInQuotes2;
  93. procedure TestStatementStop;
  94. procedure TestDirectiveStop;
  95. procedure TestStatementExeception;
  96. procedure TestDirectiveException;
  97. procedure TestCommitException;
  98. procedure TestStatementOnExeception1;
  99. procedure TestStatementOnExeception2;
  100. procedure TestDirectiveOnException1;
  101. procedure TestDirectiveOnException2;
  102. procedure TestCommitOnException1;
  103. procedure TestCommitOnException2;
  104. end;
  105. { TTestEventSQLScript }
  106. TTestEventSQLScript = class (TTestCase)
  107. private
  108. Script : TEventSQLScript;
  109. StopToSend : boolean;
  110. Received : string;
  111. notifycount : integer;
  112. LastSender : TObject;
  113. procedure Notify (Sender : TObject);
  114. procedure NotifyStatement (Sender: TObject; SQL_Statement: TStrings; var StopExecution: Boolean);
  115. procedure NotifyDirective (Sender: TObject; Directive, Argument: AnsiString; var StopExecution: Boolean);
  116. protected
  117. procedure SetUp; override;
  118. procedure TearDown; override;
  119. published
  120. procedure TestStatement;
  121. procedure TestStatementStop;
  122. procedure TestDirective;
  123. procedure TestDirectiveStop;
  124. procedure TestCommit;
  125. procedure TestBeforeExec;
  126. procedure TestAfterExec;
  127. end;
  128. implementation
  129. { TMyScript }
  130. procedure TMyScript.ExecuteStatement(SQLStatement: TStrings; var StopExecution: Boolean);
  131. var s : string;
  132. r : integer;
  133. begin
  134. if (SQLStatement.count = 1) and (compareText(SQLStatement[0],'END')=0) then
  135. StopExecution := true;
  136. s := '';
  137. for r := 0 to SQLstatement.count-1 do
  138. begin
  139. if s <> '' then
  140. s := s + ' ';
  141. s := s + SQLStatement[r];
  142. end;
  143. FStatements.Add (s);
  144. if DoException <> '' then
  145. raise exception.create(DoException);
  146. end;
  147. procedure TMyScript.ExecuteDirective(Directive, Argument: String; var StopExecution: Boolean);
  148. begin
  149. if Directive = 'STOP' then
  150. StopExecution := true;
  151. if Argument = '' then
  152. FDirectives.Add (Directive)
  153. else
  154. FDirectives.Add (format('%s(%s)', [Directive, Argument]));
  155. if DoException <> '' then
  156. raise exception.create(DoException);
  157. end;
  158. procedure TMyScript.ExecuteCommit;
  159. begin
  160. inc (FCommits);
  161. if DoException <> '' then
  162. raise exception.create(DoException);
  163. end;
  164. procedure TMyScript.DefaultDirectives;
  165. begin
  166. inherited DefaultDirectives;
  167. directives.add ('STOP');
  168. end;
  169. constructor TMyScript.create (AnOwner: TComponent);
  170. begin
  171. inherited create (AnOwner);
  172. FStatements := TStringlist.Create;
  173. FDirectives := TStringlist.Create;
  174. FCommits := 0;
  175. DoException := '';
  176. end;
  177. destructor TMyScript.destroy;
  178. begin
  179. FStatements.Free;
  180. FDirectives.Free;
  181. inherited destroy;
  182. end;
  183. function TMyScript.StatementsExecuted: string;
  184. begin
  185. result := FStatements.Commatext;
  186. end;
  187. function TMyScript.DirectivesExecuted: string;
  188. begin
  189. result := FDirectives.Commatext;
  190. end;
  191. { TTestSQLScript }
  192. procedure TTestSQLScript.Add(s: string);
  193. begin
  194. Script.Script.Add (s);
  195. end;
  196. procedure TTestSQLScript.AssertStatDir(Statements, Directives: string);
  197. begin
  198. AssertEquals ('Executed Statements', Statements, script.StatementsExecuted);
  199. AssertEquals ('Executed Directives', Directives, script.DirectivesExecuted);
  200. end;
  201. procedure TTestSQLScript.DoExecution;
  202. begin
  203. script.execute;
  204. end;
  205. procedure TTestSQLScript.ExceptionHandler(Sender: TObject; Statement: TStrings;
  206. TheException: Exception; var Continue: boolean);
  207. var r : integer;
  208. s : string;
  209. begin
  210. Continue := UseContinue;
  211. if Statement.count > 0 then
  212. s := Statement[0];
  213. for r := 1 to Statement.count-1 do
  214. s := s + ',' + Statement[r];
  215. exceptionstatement := s;
  216. exceptionmessage := TheException.message;
  217. end;
  218. procedure TTestSQLScript.SetUp;
  219. begin
  220. inherited SetUp;
  221. Script := TMyscript.Create (nil);
  222. end;
  223. procedure TTestSQLScript.TearDown;
  224. begin
  225. Script.Free;
  226. inherited TearDown;
  227. end;
  228. procedure TTestSQLScript.TestCreateDefaults;
  229. begin
  230. with Script do
  231. begin
  232. AssertEquals ('Terminator', ';', Terminator);
  233. AssertTrue ('UseCommit', UseCommit);
  234. AssertTrue ('UseSetTerm', UseSetTerm);
  235. AssertTrue ('UseDefines', UseDefines);
  236. AssertTrue ('CommentsInSQL', CommentsInSQL);
  237. AssertFalse ('Aborted', Aborted);
  238. AssertEquals ('Line', 0, Line);
  239. AssertEquals ('Defines', 0, Defines.count);
  240. AssertEquals ('Directives', 10, Directives.count);
  241. end;
  242. end;
  243. procedure TTestSQLScript.TestTerminator;
  244. begin
  245. script.terminator := '!';
  246. Add('doe!iets!');
  247. Add('anders!');
  248. script.execute;
  249. AssertStatDir('doe,iets,anders', '');
  250. end;
  251. procedure TTestSQLScript.TestSetTerm;
  252. begin
  253. script.UseSetTerm:=true;
  254. Add('SET TERM !;');
  255. script.execute;
  256. AssertEquals ('terminator', '!', script.terminator);
  257. AssertStatDir('', '');
  258. end;
  259. procedure TTestSQLScript.TestUseSetTerm;
  260. begin
  261. script.UseSetTerm:=false;
  262. Script.Directives.Add ('SET TERM');
  263. Add('SET TERM !;');
  264. script.execute;
  265. AssertEquals ('terminator', ';', script.terminator);
  266. AssertStatDir('', '"SET TERM(!)"');
  267. end;
  268. procedure TTestSQLScript.TestComments;
  269. begin
  270. script.CommentsInSQL := true;
  271. Add('/* comment */');
  272. Add('statement;');
  273. script.execute;
  274. AssertStatDir ('"/* comment */ statement"', '');
  275. end;
  276. procedure TTestSQLScript.TestUseComments;
  277. begin
  278. script.CommentsInSQL := false;
  279. Add('/* comment */');
  280. Add('statement;');
  281. script.execute;
  282. AssertStatDir ('statement', '');
  283. end;
  284. procedure TTestSQLScript.TestCommit;
  285. begin
  286. script.UseCommit := true;
  287. Add('commit;');
  288. script.execute;
  289. AssertEquals ('Commits', 1, script.FCommits);
  290. AssertStatDir ('', '');
  291. end;
  292. procedure TTestSQLScript.TestUseCommit;
  293. begin
  294. script.UseCommit := false;
  295. with script.Directives do
  296. Delete(IndexOf('COMMIT'));
  297. Add('commit;');
  298. script.execute;
  299. AssertEquals ('Commits', 0, script.FCommits);
  300. AssertStatDir ('commit', '');
  301. end;
  302. procedure TTestSQLScript.TestDefine;
  303. begin
  304. script.UseDefines := true;
  305. Add ('#define iets;');
  306. script.execute;
  307. AssertStatDir ('', '');
  308. AssertEquals ('Aantal defines', 1, script.defines.count);
  309. AssertEquals ('Juiste define', 'iets', script.Defines[0]);
  310. end;
  311. procedure TTestSQLScript.TestUndefine;
  312. begin
  313. script.UseDefines := true;
  314. script.defines.Add ('iets');
  315. Add ('#undefine iets;');
  316. script.execute;
  317. AssertStatDir ('', '');
  318. AssertEquals ('Aantal defines', 0, script.defines.count);
  319. end;
  320. procedure TTestSQLScript.TestUndef;
  321. begin
  322. script.UseDefines := true;
  323. script.defines.Add ('iets');
  324. Add ('#Undef iets;');
  325. script.execute;
  326. AssertStatDir ('', '');
  327. AssertEquals ('Aantal defines', 0, script.defines.count);
  328. end;
  329. procedure TTestSQLScript.TestIfdef1;
  330. begin
  331. script.UseDefines := true;
  332. script.defines.add ('iets');
  333. Add('#ifdef iets;');
  334. Add('doe iets;');
  335. script.execute;
  336. AssertStatDir('"doe iets"', '');
  337. end;
  338. procedure TTestSQLScript.TestIfdef2;
  339. begin
  340. script.UseDefines := true;
  341. Add('#ifdef iets;');
  342. Add('doe iets;');
  343. script.execute;
  344. AssertStatDir('', '');
  345. end;
  346. procedure TTestSQLScript.TestIfndef1;
  347. begin
  348. script.UseDefines := true;
  349. Add('#ifndef iets;');
  350. Add('doe iets;');
  351. script.execute;
  352. AssertStatDir('"doe iets"', '');
  353. end;
  354. procedure TTestSQLScript.TestIfndef2;
  355. begin
  356. script.UseDefines := true;
  357. script.defines.add ('iets');
  358. Add('#ifndef iets;');
  359. Add('doe iets;');
  360. script.execute;
  361. AssertStatDir('', '');
  362. end;
  363. procedure TTestSQLScript.TestElse1;
  364. begin
  365. script.UseDefines := true;
  366. script.defines.add ('iets');
  367. Add('#ifdef iets;');
  368. Add('doe iets;');
  369. add('#else;');
  370. add('anders;');
  371. script.execute;
  372. AssertStatDir('"doe iets"', '');
  373. end;
  374. procedure TTestSQLScript.TestElse2;
  375. begin
  376. script.UseDefines := true;
  377. script.defines.add ('iets');
  378. Add('#ifndef iets;');
  379. Add('doe iets;');
  380. add('#else;');
  381. add('anders;');
  382. script.execute;
  383. AssertStatDir('anders', '');
  384. end;
  385. procedure TTestSQLScript.TestEndif1;
  386. begin
  387. script.UseDefines := true;
  388. Add('#ifdef iets;');
  389. Add('doe iets;');
  390. add('#endif;');
  391. add('anders;');
  392. script.execute;
  393. AssertStatDir('anders', '');
  394. end;
  395. procedure TTestSQLScript.TestEndif2;
  396. begin
  397. script.UseDefines := true;
  398. Add('#ifndef iets;');
  399. Add('doe iets;');
  400. add('#endif;');
  401. add('anders;');
  402. script.execute;
  403. AssertStatDir('"doe iets",anders', '');
  404. end;
  405. procedure TTestSQLScript.TestUseDefines;
  406. begin
  407. script.UseDefines := false;
  408. Add('#ifndef iets;');
  409. Add('doe iets;');
  410. add('#endif;');
  411. add('anders;');
  412. script.execute;
  413. AssertStatDir('"doe iets",anders', '#IFNDEF(iets),#ENDIF');
  414. end;
  415. procedure TTestSQLScript.TestTermInComment;
  416. begin
  417. script.CommentsInSQL := false;
  418. Add('/* terminator ; */iets;');
  419. script.execute;
  420. AssertStatDir('iets', '');
  421. end;
  422. procedure TTestSQLScript.TestTermInQuotes1;
  423. begin
  424. script.CommentsInSQL := false;
  425. Add('iets '';'';');
  426. script.execute;
  427. AssertStatDir('"iets '';''"', '');
  428. end;
  429. procedure TTestSQLScript.TestTermInQuotes2;
  430. begin
  431. script.CommentsInSQL := false;
  432. Add('iets ";";');
  433. script.execute;
  434. AssertStatDir('"iets "";"""', '');
  435. end;
  436. procedure TTestSQLScript.TestCommentInComment;
  437. begin
  438. script.CommentsInSQL := false;
  439. Add('/* meer /* */iets;');
  440. script.execute;
  441. AssertStatDir('iets', '');
  442. end;
  443. procedure TTestSQLScript.TestCommentInQuotes1;
  444. begin
  445. script.CommentsInSQL := false;
  446. Add('iets ''/* meer */'';');
  447. script.execute;
  448. AssertStatDir('"iets ''/* meer */''"', '');
  449. end;
  450. procedure TTestSQLScript.TestCommentInQuotes2;
  451. begin
  452. script.CommentsInSQL := false;
  453. Add('iets "/* meer */";');
  454. script.execute;
  455. AssertStatDir('"iets ""/* meer */"""', '');
  456. end;
  457. procedure TTestSQLScript.TestQuote1InComment;
  458. begin
  459. script.CommentsInSQL := false;
  460. Add('/* s''morgens */iets;');
  461. script.execute;
  462. AssertStatDir('iets', '');
  463. end;
  464. procedure TTestSQLScript.TestQuote2InComment;
  465. begin
  466. script.CommentsInSQL := false;
  467. Add('/* s"morgens */iets;');
  468. script.execute;
  469. AssertStatDir('iets', '');
  470. end;
  471. procedure TTestSQLScript.TestQuoteInQuotes1;
  472. begin
  473. script.CommentsInSQL := false;
  474. Add('iets ''s"morgens'';');
  475. script.execute;
  476. AssertStatDir('"iets ''s""morgens''"', '');
  477. end;
  478. procedure TTestSQLScript.TestQuoteInQuotes2;
  479. begin
  480. script.CommentsInSQL := false;
  481. Add('iets "s''morgens";');
  482. script.execute;
  483. AssertStatDir('"iets ""s''morgens"""', '');
  484. end;
  485. procedure TTestSQLScript.TestStatementStop;
  486. begin
  487. Add('END;meer;');
  488. script.execute;
  489. AssertStatDir('END', '');
  490. end;
  491. procedure TTestSQLScript.TestDirectiveStop;
  492. begin
  493. Add('Stop;meer;');
  494. script.execute;
  495. AssertStatDir('', 'STOP');
  496. end;
  497. procedure TTestSQLScript.TestStatementExeception;
  498. begin
  499. Add('iets;');
  500. script.DoException:='FOUT';
  501. AssertException (exception, @DoExecution);
  502. AssertStatDir('iets', '');
  503. end;
  504. procedure TTestSQLScript.TestDirectiveException;
  505. begin
  506. Add('iets;');
  507. script.Directives.Add('IETS');
  508. script.DoException := 'FOUT';
  509. AssertException (exception, @DoExecution);
  510. AssertStatDir('', 'IETS');
  511. end;
  512. procedure TTestSQLScript.TestCommitException;
  513. begin
  514. Add ('commit;');
  515. script.DoException := 'FOUT';
  516. AssertException (exception, @DoExecution);
  517. AssertStatDir('', '');
  518. AssertEquals ('Commit count', 1, Script.FCommits);
  519. end;
  520. procedure TTestSQLScript.TestStatementOnExeception1;
  521. begin
  522. UseContinue := true;
  523. script.DoException := 'Fout';
  524. Add ('foutief;');
  525. script.OnException:=@ExceptionHandler;
  526. Script.Execute;
  527. AssertEquals ('exception message', 'Fout', exceptionmessage);
  528. AssertEquals ('exception statement', 'foutief', exceptionstatement);
  529. end;
  530. procedure TTestSQLScript.TestStatementOnExeception2;
  531. begin
  532. UseContinue := false;
  533. script.DoException := 'Fout';
  534. Add ('foutief;');
  535. script.OnException:=@ExceptionHandler;
  536. AssertException (exception, @DoExecution);
  537. AssertEquals ('exception message', 'Fout', exceptionmessage);
  538. AssertEquals ('exception statement', 'foutief', exceptionstatement);
  539. end;
  540. procedure TTestSQLScript.TestDirectiveOnException1;
  541. begin
  542. UseContinue := true;
  543. script.DoException := 'Fout';
  544. Add ('foutief;');
  545. Script.Directives.Add ('FOUTIEF');
  546. script.OnException:=@ExceptionHandler;
  547. Script.Execute;
  548. AssertEquals ('exception message', 'Fout', exceptionmessage);
  549. AssertEquals ('exception statement', 'FOUTIEF', exceptionstatement);
  550. end;
  551. procedure TTestSQLScript.TestDirectiveOnException2;
  552. begin
  553. UseContinue := False;
  554. script.DoException := 'Fout';
  555. Add ('foutief;');
  556. Script.Directives.Add ('FOUTIEF');
  557. script.OnException:=@ExceptionHandler;
  558. AssertException (exception, @DoExecution);
  559. AssertEquals ('exception message', 'Fout', exceptionmessage);
  560. AssertEquals ('exception statement', 'FOUTIEF', exceptionstatement);
  561. end;
  562. procedure TTestSQLScript.TestDirectiveOnException3;
  563. begin
  564. UseContinue := true;
  565. script.DoException := 'Fout';
  566. Add ('foutief probleem;');
  567. Script.Directives.Add ('FOUTIEF');
  568. script.OnException:=@ExceptionHandler;
  569. Script.Execute;
  570. AssertEquals ('exception message', 'Fout', exceptionmessage);
  571. AssertEquals ('exception statement', 'FOUTIEF,probleem', exceptionstatement);
  572. end;
  573. procedure TTestSQLScript.TestCommitOnException1;
  574. begin
  575. UseContinue := true;
  576. script.DoException := 'Fout';
  577. Add ('Commit;');
  578. script.OnException:=@ExceptionHandler;
  579. Script.Execute;
  580. AssertEquals ('exception message', 'Fout', exceptionmessage);
  581. AssertEquals ('exception statement', 'COMMIT', exceptionstatement);
  582. AssertEquals ('commit count', 1, Script.FCommits);
  583. end;
  584. procedure TTestSQLScript.TestCommitOnException2;
  585. begin
  586. UseContinue := false;
  587. script.DoException := 'Fout';
  588. Add ('Commit;');
  589. script.OnException:=@ExceptionHandler;
  590. AssertException (exception, @DoExecution);
  591. AssertEquals ('exception message', 'Fout', exceptionmessage);
  592. AssertEquals ('exception statement', 'COMMIT', exceptionstatement);
  593. AssertEquals ('commit count', 1, Script.FCommits);
  594. end;
  595. { TTestEventSQLScript }
  596. procedure TTestEventSQLScript.Notify(Sender: TObject);
  597. begin
  598. inc (NotifyCount);
  599. LastSender := Sender;
  600. end;
  601. procedure TTestEventSQLScript.NotifyStatement(Sender: TObject;
  602. SQL_Statement: TStrings; var StopExecution: Boolean);
  603. var r : integer;
  604. s : string;
  605. begin
  606. StopExecution := StopToSend;
  607. if SQL_Statement.count > 0 then
  608. begin
  609. s := SQL_Statement[0];
  610. for r := 1 to SQL_Statement.count-1 do
  611. s := s + ';' + SQL_Statement[r];
  612. if SQL_Statement.count > 1 then
  613. s := '"' + s + '"';
  614. end
  615. else
  616. s := '';
  617. if received <> '' then
  618. received := received + ';' + s
  619. else
  620. received := s;
  621. LastSender := Sender;
  622. end;
  623. procedure TTestEventSQLScript.NotifyDirective(Sender: TObject; Directive,
  624. Argument: AnsiString; var StopExecution: Boolean);
  625. var s : string;
  626. begin
  627. StopExecution := StopToSend;
  628. if Argument = '' then
  629. s := Directive
  630. else
  631. s := format ('%s(%s)', [Directive, Argument]);
  632. if received <> '' then
  633. received := received + ';' + s
  634. else
  635. received := s;
  636. LastSender := Sender;
  637. end;
  638. procedure TTestEventSQLScript.SetUp;
  639. begin
  640. inherited SetUp;
  641. Script := TEventSQLScript.Create (nil);
  642. notifycount := 0;
  643. Received := '';
  644. LastSender := nil;
  645. end;
  646. procedure TTestEventSQLScript.TearDown;
  647. begin
  648. Script.Free;
  649. inherited TearDown;
  650. end;
  651. procedure TTestEventSQLScript.TestStatement;
  652. begin
  653. StopToSend:=false;
  654. Script.OnSQLStatement := @NotifyStatement;
  655. Script.Script.Text := 'stat1;stat2;';
  656. script.execute;
  657. AssertEquals ('Received', 'stat1;stat2', received);
  658. AssertSame ('Sender', script, LastSender);
  659. end;
  660. procedure TTestEventSQLScript.TestStatementStop;
  661. begin
  662. StopToSend:=true;
  663. Script.OnSQLStatement := @NotifyStatement;
  664. Script.Script.Text := 'stat1;stat2;';
  665. script.execute;
  666. AssertEquals ('Received', 'stat1', received);
  667. AssertSame ('Sender', script, LastSender);
  668. end;
  669. procedure TTestEventSQLScript.TestDirective;
  670. begin
  671. StopToSend:=false;
  672. Script.OnSQLStatement := @NotifyStatement;
  673. Script.OnDirective := @NotifyDirective;
  674. script.Directives.Add ('STAT1');
  675. Script.Script.Text := 'stat1 ik;stat2;';
  676. script.execute;
  677. AssertEquals ('Received', 'STAT1(ik);stat2', received);
  678. AssertSame ('Sender', script, LastSender);
  679. end;
  680. procedure TTestEventSQLScript.TestDirectiveStop;
  681. begin
  682. StopToSend:=true;
  683. Script.OnSQLStatement := @NotifyStatement;
  684. Script.OnDirective := @NotifyDirective;
  685. script.Directives.Add ('STAT1');
  686. Script.Script.Text := 'stat1 ik;stat2;';
  687. script.execute;
  688. AssertEquals ('Received', 'STAT1(ik)', received);
  689. AssertSame ('Sender', script, LastSender);
  690. end;
  691. procedure TTestEventSQLScript.TestCommit;
  692. begin
  693. Script.OnCommit := @Notify;
  694. Script.Script.Text := 'iets; commit; anders;';
  695. script.execute;
  696. AssertEquals ('NotifyCount', 1, NotifyCount);
  697. AssertSame ('Sender', script, LastSender);
  698. end;
  699. procedure TTestEventSQLScript.TestBeforeExec;
  700. begin
  701. Script.BeforeExecute := @Notify;
  702. Script.Script.Text := 'update iets; anders iets;';
  703. script.execute;
  704. AssertEquals ('NotifyCount', 1, NotifyCount);
  705. AssertSame ('Sender', script, LastSender);
  706. end;
  707. procedure TTestEventSQLScript.TestAfterExec;
  708. begin
  709. Script.AfterExecute := @Notify;
  710. Script.Script.Text := 'update iets; anders iets; en meer;';
  711. script.execute;
  712. AssertEquals ('NotifyCount', 1, NotifyCount);
  713. AssertSame ('Sender', script, LastSender);
  714. end;
  715. initialization
  716. RegisterTests ([TTestSQLScript, TTestEventSQLScript]);
  717. end.