testsqlscript.pas 21 KB

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