ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/testsuite/Test17.pas
Revision: 323
Committed: Thu Feb 25 12:14:35 2021 UTC (3 years, 9 months ago) by tony
Content type: text/x-pascal
File size: 14395 byte(s)
Log Message:
Fixed Merged

File Contents

# User Rev Content
1 tony 323 (*
2     * IBX Test suite. This program is used to test the IBX non-visual
3     * components and provides a semi-automated pass/fail check for each test.
4     *
5     * The contents of this file are subject to the Initial Developer's
6     * Public License Version 1.0 (the "License"); you may not use this
7     * file except in compliance with the License. You may obtain a copy
8     * of the License here:
9     *
10     * http://www.firebirdsql.org/index.php?op=doc&id=idpl
11     *
12     * Software distributed under the License is distributed on an "AS
13     * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14     * implied. See the License for the specific language governing rights
15     * and limitations under the License.
16     *
17     * The Initial Developer of the Original Code is Tony Whyman.
18     *
19     * The Original Code is (C) 2021 Tony Whyman, MWA Software
20     * (http://www.mwasoftware.co.uk).
21     *
22     * All Rights Reserved.
23     *
24     * Contributor(s): ______________________________________.
25     *
26     *)
27 tony 315 unit Test17;
28    
29     {$mode objfpc}{$H+}
30    
31     {Test 17: TIBDataSet Tests}
32    
33     { Description
34    
35     TIBDataset Insert/Update/Delete tests.
36     }
37    
38     interface
39    
40     uses
41     Classes, SysUtils, TestApplication, IBXTestBase, DB, IB, IBCustomDataSet;
42    
43     const
44     aTestID = '17';
45     aTestTitle = 'TIBDataset Tests';
46    
47     type
48    
49     { TTest1 }
50    
51     { TTest17 }
52    
53     TTest17 = class(TIBXTestBase)
54     private
55     FIBDataSet1: TIBDataSet;
56     FIBDataSet2: TIBDataSet;
57     procedure HandleDeleteReturning(Sender: TObject; QryResults: IResults);
58     procedure HandleBeforeOpen(DataSet: TDataSet);
59     procedure HandleAfterOpen(DataSet: TDataSet);
60     procedure HandleBeforeClose(DataSet: TDataSet);
61     procedure HandleAfterClose(DataSet: TDataSet);
62     procedure HandleBeforeInsert(DataSet: TDataSet);
63     procedure HandleAfterInsert(DataSet: TDataSet);
64     procedure HandleBeforeEdit(DataSet: TDataSet);
65     procedure HandleAfterEdit(DataSet: TDataSet);
66     procedure HandleBeforePost(DataSet: TDataSet);
67     procedure HandleAfterPost(DataSet: TDataSet);
68     procedure HandleBeforeCancel(DataSet: TDataSet);
69     procedure HandleAfterCancel(DataSet: TDataSet);
70     procedure HandleBeforeDelete(DataSet: TDataSet);
71     procedure HandleAfterDelete(DataSet: TDataSet);
72     procedure HandleBeforeScroll(DataSet: TDataSet);
73     procedure HandleAfterScroll(DataSet: TDataSet);
74     procedure HandleBeforeRefresh(DataSet: TDataSet);
75     procedure HandleAfterRefresh(DataSet: TDataSet);
76     procedure ValidatePostOK(Sender: TObject; var CancelPost: boolean);
77     procedure ValidatePostCancel(Sender: TObject; var CancelPost: boolean);
78     procedure HandlePostError(DataSet: TDataSet; E: EDatabaseError;
79     var DataAction: TDataAction);
80     protected
81     procedure CreateObjects(Application: TTestApplication); override;
82     function GetTestID: AnsiString; override;
83     function GetTestTitle: AnsiString; override;
84     procedure InitTest; override;
85     public
86     procedure RunTest(CharSet: AnsiString; SQLDialect: integer); override;
87     end;
88    
89    
90     implementation
91    
92     { TTest17 }
93    
94     procedure TTest17.HandleDeleteReturning(Sender: TObject; QryResults: IResults);
95     begin
96     writeln(OutFile,'Delete Returning');
97     ReportResult(QryResults);
98     writeln(OutFile);
99     end;
100    
101     procedure TTest17.HandleBeforeOpen(DataSet: TDataSet);
102     Begin
103     writeln(Outfile,'Dataset Event BeforeOpen: State = ',DataSet.State);
104     end;
105     procedure TTest17.HandleAfterOpen(DataSet: TDataSet);
106     Begin
107     writeln(Outfile,'Dataset Event AfterOpen: State = ',DataSet.State);
108     end;
109     procedure TTest17.HandleBeforeClose(DataSet: TDataSet);
110     Begin
111     writeln(Outfile,'Dataset Event BeforeClose: State = ',DataSet.State);
112     end;
113     procedure TTest17.HandleAfterClose(DataSet: TDataSet);
114     Begin
115     writeln(Outfile,'Dataset Event AfterClose: State = ',DataSet.State);
116     end;
117     procedure TTest17.HandleBeforeInsert(DataSet: TDataSet);
118     Begin
119     writeln(Outfile,'Dataset Event BeforeInsert: State = ',DataSet.State);
120     end;
121     procedure TTest17.HandleAfterInsert(DataSet: TDataSet);
122     Begin
123     writeln(Outfile,'Dataset Event AfterInsert: State = ',DataSet.State);
124     end;
125     procedure TTest17.HandleBeforeEdit(DataSet: TDataSet);
126     Begin
127     writeln(Outfile,'Dataset Event BeforeEdit: State = ',DataSet.State);
128     end;
129     procedure TTest17.HandleAfterEdit(DataSet: TDataSet);
130     Begin
131     writeln(Outfile,'Dataset Event AfterEdit: State = ',DataSet.State);
132     end;
133     procedure TTest17.HandleBeforePost(DataSet: TDataSet);
134     Begin
135     writeln(Outfile,'Dataset Event BeforePost: State = ',DataSet.State);
136     end;
137     procedure TTest17.HandleAfterPost(DataSet: TDataSet);
138     Begin
139     writeln(Outfile,'Dataset Event AfterPost: State = ',DataSet.State);
140     end;
141     procedure TTest17.HandleBeforeCancel(DataSet: TDataSet);
142     Begin
143     writeln(Outfile,'Dataset Event BeforeCancel: State = ',DataSet.State);
144     end;
145     procedure TTest17.HandleAfterCancel(DataSet: TDataSet);
146     Begin
147     writeln(Outfile,'Dataset Event AfterCancel: State = ',DataSet.State);
148     end;
149     procedure TTest17.HandleBeforeDelete(DataSet: TDataSet);
150     Begin
151     writeln(Outfile,'Dataset Event BeforeDelete: State = ',DataSet.State);
152     end;
153     procedure TTest17.HandleAfterDelete(DataSet: TDataSet);
154     Begin
155     writeln(Outfile,'Dataset Event AfterDelete: State = ',DataSet.State);
156     end;
157     procedure TTest17.HandleBeforeScroll(DataSet: TDataSet);
158     Begin
159     writeln(Outfile,'Dataset Event BeforeScroll: State = ',DataSet.State);
160     end;
161     procedure TTest17.HandleAfterScroll(DataSet: TDataSet);
162     Begin
163     writeln(Outfile,'Dataset Event AfterScroll: State = ',DataSet.State);
164     end;
165     procedure TTest17.HandleBeforeRefresh(DataSet: TDataSet);
166     Begin
167     writeln(Outfile,'Dataset Event BeforeRefresh: State = ',DataSet.State);
168     end;
169     procedure TTest17.HandleAfterRefresh(DataSet: TDataSet);
170     Begin
171     writeln(Outfile,'Dataset Event AfterRefresh: State = ',DataSet.State);
172     end;
173    
174     procedure TTest17.ValidatePostOK(Sender: TObject; var CancelPost: boolean);
175     begin
176     writeln(Outfile,'Validate Post OK called');
177     CancelPost := false;
178     end;
179    
180     procedure TTest17.ValidatePostCancel(Sender: TObject; var CancelPost: boolean);
181     begin
182     writeln(Outfile,'Validate Post Cancel called');
183     CancelPost := true;
184     end;
185    
186     procedure TTest17.HandlePostError(DataSet: TDataSet; E: EDatabaseError;
187     var DataAction: TDataAction);
188     begin
189     writeln(Outfile,'Post Error Called: ',E.Message);
190     DataAction := daFail;
191     end;
192    
193     procedure TTest17.CreateObjects(Application: TTestApplication);
194     begin
195     inherited CreateObjects(Application);
196     FIBDataSet1 := TIBDataSet.Create(Application);
197     with FIBDataSet1 do
198     begin
199     Database := IBDatabase;
200     Transaction := IBTransaction;
201     Unidirectional := false;
202     SelectSQL.Add('Select * From IBDataSetTest');
203     InsertSQL.Add('Insert into IBDataSetTest(KeyField,PlainText) Values (:KeyField,:PlainText)');
204     ModifySQL.Add('Update IBDataSetTest Set KeyField = :KeyField, PlainText = :PlainText Where KeyField = :Old_KeyField');
205     DeleteSQL.Add('Delete from IBDataSetTest Where KeyField = :old_KeyField');
206     RefreshSQL.Add('Select * from IBDataSetTest Where KeyField = :KeyField');
207     GeneratorField.Field := 'KeyField';
208     GeneratorField.Generator := 'AGENERATOR';
209     GeneratorField.Increment := 1;
210     OnPostError := @HandlePostError;
211     end;
212     FIBDataSet2 := TIBDataSet.Create(Application);
213     with FIBDataSet2 do
214     begin
215     Database := IBDatabase;
216     Transaction := IBTransaction;
217     Unidirectional := false;
218     SelectSQL.Add('Select * From IBDataSetTest');
219     InsertSQL.Add('Insert into IBDataSetTest(KeyField,PlainText) Values (Gen_ID(AGenerator,1),:PlainText) Returning KeyField, TextAndKey');
220     ModifySQL.Add('Update IBDataSetTest Set KeyField = :KeyField, PlainText = :PlainText Where KeyField = :Old_KeyField Returning TextAndKey,ServerSideText');
221     DeleteSQL.Add('Delete from IBDataSetTest Where KeyField = :old_KeyField Returning KeyField');
222     RefreshSQL.Add('Select * from IBDataSetTest Where KeyField = :KeyField');
223     OnDeleteReturning := @HandleDeleteReturning;
224     BeforeOpen := @HandleBeforeOpen;
225     AfterOpen := @HandleAfterOpen;
226     BeforeClose := @HandleBeforeClose;
227     AfterClose := @HandleAfterClose;
228     BeforeInsert := @HandleBeforeInsert;
229     AfterInsert := @HandleAfterInsert;
230     BeforeEdit := @HandleBeforeEdit;
231     AfterEdit := @HandleAfterEdit;
232     BeforePost := @HandleBeforePost;
233     AfterPost := @HandleAfterPost;
234     BeforeCancel := @HandleBeforeCancel;
235     AfterCancel := @HandleAfterCancel;
236     BeforeDelete := @HandleBeforeDelete;
237     AfterDelete := @HandleAfterDelete;
238     BeforeScroll := @HandleBeforeScroll;
239     AfterScroll := @HandleAfterScroll;
240     BeforeRefresh := @HandleBeforeRefresh;
241     AfterRefresh := @HandleAfterRefresh;
242     end;
243     end;
244    
245     function TTest17.GetTestID: AnsiString;
246     begin
247     Result := aTestID;
248     end;
249    
250     function TTest17.GetTestTitle: AnsiString;
251     begin
252     Result := aTestTitle;
253     end;
254    
255     procedure TTest17.InitTest;
256     begin
257     IBDatabase.DatabaseName := Owner.GetNewDatabaseName;
258     IBDatabase.CreateIfNotExists := true;
259     ReadWriteTransaction;
260     end;
261    
262     procedure TTest17.RunTest(CharSet: AnsiString; SQLDialect: integer);
263     var lastKey: integer;
264     begin
265     IBDatabase.CreateDatabase;
266     try
267     IBTransaction.Active := true;
268     with FIBDataSet1 do
269     begin
270     Active := true;
271     writeln(OutFile,'FIBDataSet1: Simple Append');
272     Append;
273     // writeln(outfile,'BOF = ',BOF,', EOF = ',EOF);
274     FieldByName('PlainText').AsString := 'This is a test';
275     Post;
276     PrintDataSetRow(FIBDataSet1);
277     Refresh;
278     writeln(OutFile,'After Refresh');
279     PrintDataSetRow(FIBDataSet1);
280     writeln(OutFile,'Append and Update');
281     Append;
282     FieldByName('PlainText').AsString := 'This is another test';
283     Post;
284     PrintDataSetRow(FIBDataSet1);
285     Edit;
286     FieldByName('PlainText').AsString := 'This is the update test';
287     Post;
288     PrintDataSetRow(FIBDataSet1);
289     writeln(OutFile,'Now delete the first row');
290     PrintDataSet(FIBDataSet1);
291     First;
292     Delete;
293     PrintDataSet(FIBDataSet1);
294     writeln(Outfile,'On Post KeyField Assignment');
295     FIBDataSet1.GeneratorField.ApplyOnEvent := gaeOnPostRecord;
296     Append;
297     FieldByName('PlainText').AsString := 'On Post KeyField test';
298     PrintDataSetRow(FIBDataSet1);
299     Post;
300     writeln(Outfile,'Row data after post');
301     PrintDataSetRow(FIBDataSet1);
302     FIBDataSet1.GeneratorField.ApplyOnEvent := gaeOnNewRecord; {restore}
303    
304     writeln(Outfile,'Catch a Post Error - duplicate key');
305     lastkey := FieldByName('KeyField').AsInteger;
306     Append;
307     FieldByName('KeyField').AsInteger := lastkey;
308     FieldByName('PlainText').AsString := 'On Post Error test';
309     try
310     Post;
311     except on E: Exception do
312     writeln(Outfile,'Exception handled: ',E.Message);
313     end;
314    
315     IBTransaction.Rollback;
316     IBTransaction.Active := true;
317     DataSetCloseAction := dcSaveChanges;
318     Active := true;
319     writeln(OutFile,'FIBDataSet1: Simple Append with automatic posting on close');
320     Append;
321     FieldByName('PlainText').AsString := 'This is a test';
322     Active := false;
323     Active := true;
324     PrintDataSet(FIBDataSet1);
325    
326     IBTransaction.Rollback;
327     IBTransaction.Active := true;
328     DataSetCloseAction := dcDiscardChanges;
329     Active := true;
330     writeln(OutFile,'FIBDataSet1: Simple Append with discard on close');
331     Append;
332     FieldByName('PlainText').AsString := 'This is a test';
333     Active := false;
334     Active := true;
335     PrintDataSet(FIBDataSet1);
336    
337     {See https://bugs.freepascal.org/view.php?id=37900}
338    
339     (* IBTransaction.Rollback;
340     IBTransaction.Active := true;
341     writeln(Outfile);
342     writeln(Outfile,'Unidirectional editing');
343     Unidirectional := true;
344     Active := true;
345     writeln(OutFile,'FIBDataSet1: Simple Append - unidirectional');
346     Insert;
347     writeln(outfile,'BOF = ',BOF,', EOF = ',EOF);
348     FieldByName('PlainText').AsString := 'This is a test - unidirectional';
349     PrintDataSetRow(FIBDataSet1);
350     Post;
351     writeln(outfile,'BOF = ',BOF,', EOF = ',EOF);
352     PrintDataSetRow(FIBDataSet1);
353     Refresh;
354     writeln(OutFile,'After Refresh - unidirectional');
355     PrintDataSetRow(FIBDataSet1);
356     writeln(OutFile,'Append and Update');
357     Insert;
358     FieldByName('PlainText').AsString := 'This is another test - unidirectional';
359     Post;
360     PrintDataSetRow(FIBDataSet1);
361     Edit;
362     FieldByName('PlainText').AsString := 'This is the update test - unidirectional';
363     Post;
364     PrintDataSetRow(FIBDataSet1);
365     writeln(OutFile,'Now delete the first row - unidirectional');
366     PrintDataSet(FIBDataSet1);
367     First;
368     Delete;
369     PrintDataSet(FIBDataSet1);
370     writeln(Outfile,'Ensure dataset saved to database');
371     Active := false;
372     Active := true;
373     PrintDataSet(FIBDataSet1); *)
374    
375     end;
376     writeln(Outfile,'==================================');
377     IBTransaction.Rollback;
378     IBTransaction.Active := true;
379     with FIBDataSet2 do
380     begin
381     Active := true;
382     writeln(OutFile,'FIBDataSet2: Simple Append');
383     Append;
384     FieldByName('PlainText').AsString := 'This is a test';
385     Post;
386     PrintDataSetRow(FIBDataSet2);
387     Refresh;
388     writeln(OutFile,'After Refresh');
389     PrintDataSetRow(FIBDataSet2);
390     writeln(OutFile,'Append and Update');
391     Append;
392     FieldByName('PlainText').AsString := 'This is another test';
393     Post;
394     PrintDataSetRow(FIBDataSet2);
395     Edit;
396     FieldByName('PlainText').AsString := 'This is the update test';
397     Post;
398     PrintDataSetRow(FIBDataSet2);
399     writeln(OutFile,'Now delete the first row');
400     PrintDataSet(FIBDataSet2);
401     First;
402     Delete;
403     PrintDataSet(FIBDataSet2);
404     OnValidatePost := @ValidatePostOK;
405     writeln(Outfile,'Validate Post OK');
406     Append;
407     FieldByName('PlainText').AsString := 'This is a validated Post';
408     Post;
409     PrintDataSetRow(FIBDataSet2);
410     OnValidatePost := @ValidatePostCancel;
411     writeln(Outfile,'Validate Post Cancel');
412     Append;
413     FieldByName('PlainText').AsString := 'This is a validated Post which should have been cancelled';
414     Post;
415     PrintDataSetRow(FIBDataSet2);
416     OnValidatePost := nil;
417     writeln(OutFile,'FIBDataSet2: Simple Append with Forced Refresh');
418     ForcedRefresh := true;
419     Append;
420     FieldByName('PlainText').AsString := 'This is a test';
421     Post;
422     PrintDataSetRow(FIBDataSet2);
423    
424     end;
425     finally
426     IBDatabase.DropDatabase;
427     end;
428     end;
429    
430     initialization
431     RegisterTest(TTest17);
432    
433     end.
434