ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/testsuite/Test18.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: 8086 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 Test18;
28    
29     {$mode objfpc}{$H+}
30    
31     {Test 18: Cached Updates}
32    
33     { Description
34     }
35    
36     interface
37    
38     uses
39     Classes, SysUtils, TestApplication, IBXTestBase, Db, IB, IBCustomDataSet;
40    
41     const
42     aTestID = '18';
43     aTestTitle = 'Cached Updates';
44    
45     type
46    
47     { TTest18 }
48    
49     TTest18 = class(TIBXTestBase)
50     private
51     FIBDataset: TIBDataSet;
52     procedure HandleUpdateRecord(DataSet: TDataSet; UpdateKind: TUpdateKind;
53     var UpdateAction: TIBUpdateAction);
54     procedure HandleUpdateError(DataSet: TDataSet; E: EDatabaseError;
55     UpdateKind: TUpdateKind; var TheUpdateAction: TIBUpdateAction);
56     procedure DoTest(aUnidirectional: boolean);
57     protected
58     procedure CreateObjects(Application: TTestApplication); override;
59     function GetTestID: AnsiString; override;
60     function GetTestTitle: AnsiString; override;
61     procedure InitTest; override;
62     public
63     procedure RunTest(CharSet: AnsiString; SQLDialect: integer); override;
64     end;
65    
66    
67     implementation
68    
69     { TTest18 }
70    
71     procedure TTest18.HandleUpdateRecord(DataSet: TDataSet;
72     UpdateKind: TUpdateKind; var UpdateAction: TIBUpdateAction);
73     begin
74     writeln(Outfile,'Update Record Called for ',UpdateKind);
75     PrintDatasetRow(DataSet);
76     UpdateAction := uaApply;
77     end;
78    
79     procedure TTest18.HandleUpdateError(DataSet: TDataSet; E: EDatabaseError;
80     UpdateKind: TUpdateKind; var TheUpdateAction: TIBUpdateAction);
81     begin
82     writeln(Outfile,'Update Error raised: ',E.Message);
83     TheUpdateAction := uaFail;
84     end;
85    
86     procedure TTest18.DoTest(aUnidirectional: boolean);
87     var lastkey: integer;
88     begin
89     with FIBDataSet do
90     begin
91     Unidirectional := aUnidirectional;
92     Active := true;
93     writeln(Outfile,'Unidirectional caching = ',aUnidirectional);
94     writeln(OutFile,'Simple Append i.e. caching of inserted records and cancel');
95     if aUnidirectional then Insert else Append;
96     FieldByName('PlainText').AsString := 'This is a test';
97     Post;
98     if aUnidirectional then Insert else Append;
99     FieldByName('PlainText').AsString := 'This is another test';
100     Post;
101     PrintDataSet(FIBDataSet);
102     writeln(Outfile,'Cancel Updates');
103     CancelUpdates;
104     PrintDataSet(FIBDataSet);
105     writeln(Outfile,'Now reopen and show empty');
106     Active := false;
107     Active := true;
108     PrintDataSet(FIBDataSet);
109    
110     writeln(Outfile);
111     writeln(OutFile,'Simple Append i.e. caching of inserted records and apply updates');
112     if aUnidirectional then Insert else Append;
113     FieldByName('PlainText').AsString := 'This is a test';
114     Post;
115     if aUnidirectional then Insert else Append;
116     FieldByName('PlainText').AsString := 'This is another test';
117     Post;
118     if aUnidirectional then Insert else Append;
119     FieldByName('PlainText').AsString := 'And another';
120     Post;
121     PrintDataSet(FIBDataSet);
122     writeln(Outfile,'Apply Updates');
123     ApplyUpdates;
124     PrintDataSet(FIBDataSet);
125     writeln(Outfile,'Now reopen and show still there');
126     Active := false;
127     Active := true;
128     PrintDataSet(FIBDataSet);
129    
130     writeln(OutFile);
131     writeln(OutFile,'Update of First and Last records and cancel');
132     First;
133     Edit;
134     FieldByName('PlainText').AsString := 'This is an updated test';
135     Post;
136     Last;
137     Edit;
138     FieldByName('PlainText').AsString := 'This is another updated test';
139     Post;
140     PrintDataSet(FIBDataSet);
141     writeln(Outfile,'Cancel Updates');
142     CancelUpdates;
143     PrintDataSet(FIBDataSet);
144     writeln(Outfile,'Now reopen and show no change');
145     Active := false;
146     Active := true;
147     PrintDataSet(FIBDataSet);
148    
149     writeln(OutFile);
150     writeln(OutFile,'Update of First and Last records and apply');
151     First;
152     Edit;
153     FieldByName('PlainText').AsString := 'This is an updated test';
154     Post;
155     Last;
156     Edit;
157     FieldByName('PlainText').AsString := 'This is another updated test';
158     Post;
159     PrintDataSet(FIBDataSet);
160     writeln(Outfile,'Apply Updates');
161     ApplyUpdates;
162     PrintDataSet(FIBDataSet);
163     writeln(Outfile,'Now reopen and show still there');
164     Active := false;
165     Active := true;
166     PrintDataSet(FIBDataSet);
167    
168     writeln(OutFile);
169     writeln(OutFile,'Update of First and Last records and implicitly apply');
170     DataSetCloseAction := dcSaveChanges;
171     First;
172     Edit;
173     FieldByName('PlainText').AsString := 'This is an updated test (implicit apply updates)';
174     Active := false;
175     Active := true;
176     PrintDataSet(FIBDataSet);
177    
178     writeln(OutFile);
179     writeln(OutFile,'Delete First and Last records and Cancel');
180     First;
181     Delete;
182     Last;
183     Delete;
184     PrintDataSet(FIBDataSet);
185     writeln(Outfile,'Cancel Updates');
186     CancelUpdates;
187     PrintDataSet(FIBDataSet);
188     writeln(Outfile,'Now reopen and show no change');
189     Active := false;
190     Active := true;
191     PrintDataSet(FIBDataSet);
192    
193     writeln(OutFile);
194     writeln(OutFile,'Delete First and Last records and Apply');
195     First;
196     Delete;
197     Last;
198     Delete;
199     PrintDataSet(FIBDataSet);
200     writeln(Outfile,'Apply Updates');
201     ApplyUpdates;
202     PrintDataSet(FIBDataSet);
203     writeln(Outfile,'Now reopen and show no change');
204     Active := false;
205     Active := true;
206     PrintDataSet(FIBDataSet);
207    
208     writeln(OutFile);
209     writeln(OutFile, 'Test Error Handling');
210     First;
211     lastkey := FieldByName('KEYFIELD').AsInteger;
212     Append;
213     FieldByName('KEYFIELD').AsInteger := lastkey;
214     Post;
215     PrintDataSet(FIBDataSet);
216     try
217     ApplyUpdates;
218     except on E: Exception do
219     writeln(OutFile,'Exception caught: ',E.Message);
220     end;
221     CancelUpdates;
222     end;
223     end;
224    
225     procedure TTest18.CreateObjects(Application: TTestApplication);
226     begin
227     inherited CreateObjects(Application);
228     FIBDataSet := TIBDataSet.Create(Application);
229     with FIBDataSet do
230     begin
231     Name := 'IBTestData';
232     Database := IBDatabase;
233     Transaction := IBTransaction;
234     SelectSQL.Add('Select * From IBDataSetTest');
235     InsertSQL.Add('Insert into IBDataSetTest(KeyField,PlainText) Values (:KeyField,:PlainText)');
236     ModifySQL.Add('Update IBDataSetTest Set KeyField = :KeyField, PlainText = :PlainText Where KeyField = :Old_KeyField');
237     DeleteSQL.Add('Delete from IBDataSetTest Where KeyField = :old_KeyField');
238     RefreshSQL.Add('Select * from IBDataSetTest Where KeyField = :KeyField');
239     GeneratorField.Field := 'KeyField';
240     GeneratorField.Generator := 'AGENERATOR';
241     GeneratorField.Increment := 1;
242     CachedUpdates := true;
243     OnUpdateRecord := @HandleUpdateRecord;
244     OnUpdateError := @HandleUpdateError;
245     end;
246     end;
247    
248     function TTest18.GetTestID: AnsiString;
249     begin
250     Result := aTestID;
251     end;
252    
253     function TTest18.GetTestTitle: AnsiString;
254     begin
255     Result := aTestTitle;
256     end;
257    
258     procedure TTest18.InitTest;
259     begin
260     IBDatabase.DatabaseName := Owner.GetNewDatabaseName;
261     IBDatabase.CreateIfNotExists := true;
262     ReadWriteTransaction;
263     end;
264    
265     procedure TTest18.RunTest(CharSet: AnsiString; SQLDialect: integer);
266     begin
267     IBDatabase.CreateDatabase;
268     try
269     IBTransaction.Active := true;
270     DoTest(false);
271     // DoTest(true); {See https://bugs.freepascal.org/view.php?id=37900}
272     finally
273     IBDatabase.DropDatabase;
274     end;
275     end;
276    
277     initialization
278     RegisterTest(TTest18);
279    
280     end.
281