testspecifictbufdataset.pas 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. unit TestSpecificTBufDataset;
  2. {
  3. Unit tests which are specific to stand-alone TBufDataset-datasets. (So not
  4. for derived datasets like TQuery )
  5. }
  6. {$IFDEF FPC}
  7. {$mode Delphi}{$H+}
  8. {$ENDIF}
  9. interface
  10. uses
  11. {$IFDEF FPC}
  12. fpcunit, testregistry, BufDataset,
  13. {$ELSE FPC}
  14. TestFramework,
  15. {$ENDIF FPC}
  16. Classes, SysUtils, db, ToolsUnit;
  17. type
  18. { TTestSpecificTBufDataset }
  19. TTestSpecificTBufDataset = class(TDBBasicsTestCase)
  20. private
  21. procedure TestDataset(ABufDataset: TBufDataset; AutoInc: boolean = false);
  22. function GetAutoIncDataset: TBufDataset;
  23. procedure IntTestAutoIncFieldStreaming(XML: boolean);
  24. protected
  25. procedure SetUp; override;
  26. procedure TearDown; override;
  27. published
  28. procedure CreateDatasetFromFielddefs;
  29. procedure CreateDatasetFromFields;
  30. procedure TestOpeningNonExistingDataset;
  31. procedure TestCreationDatasetWithCalcFields;
  32. procedure TestAutoIncField;
  33. procedure TestAutoIncFieldStreaming;
  34. procedure TestAutoIncFieldStreamingXML;
  35. Procedure TestRecordCount;
  36. Procedure TestClear;
  37. procedure TestCopyFromDataset; //is copied dataset identical to original?
  38. procedure TestCopyFromDatasetMoved; //move record then copy. Is copy identical? Has record position changed?
  39. end;
  40. implementation
  41. uses
  42. {$ifdef fpc}
  43. //
  44. {$endif fpc}
  45. variants,
  46. FmtBCD;
  47. { TTestSpecificTBufDataset }
  48. procedure TTestSpecificTBufDataset.TestDataset(ABufDataset: TBufDataset;
  49. AutoInc: boolean);
  50. var
  51. i : integer;
  52. begin
  53. for i := 1 to 10 do
  54. begin
  55. ABufDataset.Append;
  56. if not AutoInc then
  57. ABufDataset.FieldByName('ID').AsInteger := i;
  58. ABufDataset.FieldByName('NAME').AsString := 'TestName' + inttostr(i);
  59. ABufDataset.Post;
  60. end;
  61. ABufDataset.first;
  62. for i := 1 to 10 do
  63. begin
  64. CheckEquals(i,ABufDataset.fieldbyname('ID').asinteger);
  65. CheckEquals('TestName' + inttostr(i),ABufDataset.fieldbyname('NAME').AsString);
  66. ABufDataset.next;
  67. end;
  68. CheckTrue(ABufDataset.EOF);
  69. end;
  70. function TTestSpecificTBufDataset.GetAutoIncDataset: TBufDataset;
  71. var
  72. ds : TBufDataset;
  73. f: TField;
  74. begin
  75. ds := TBufDataset.Create(nil);
  76. F := TAutoIncField.Create(ds);
  77. F.FieldName:='ID';
  78. F.DataSet:=ds;
  79. F := TStringField.Create(ds);
  80. F.FieldName:='NAME';
  81. F.DataSet:=ds;
  82. F.Size:=50;
  83. DS.CreateDataset;
  84. TestDataset(ds,True);
  85. result := ds;
  86. end;
  87. procedure TTestSpecificTBufDataset.IntTestAutoIncFieldStreaming(XML: boolean);
  88. var
  89. ds : TBufDataset;
  90. fn: string;
  91. begin
  92. ds := GetAutoIncDataset;
  93. fn := GetTempFileName;
  94. if xml then
  95. ds.SaveToFile(fn,dfXML)
  96. else
  97. ds.SaveToFile(fn);
  98. DS.Close;
  99. ds.Free;
  100. ds := TBufDataset.Create(nil);
  101. ds.LoadFromFile(fn);
  102. ds.Last;
  103. CheckEquals(10,ds.FieldByName('Id').AsInteger);
  104. ds.Append;
  105. ds.FieldByName('NAME').asstring := 'Test';
  106. ds.Post;
  107. CheckEquals(11,ds.FieldByName('Id').AsInteger);
  108. ds.Free;
  109. DeleteFile(fn);
  110. end;
  111. procedure TTestSpecificTBufDataset.SetUp;
  112. begin
  113. DBConnector.StartTest(TestName);
  114. end;
  115. procedure TTestSpecificTBufDataset.TearDown;
  116. begin
  117. DBConnector.StopTest(TestName);
  118. end;
  119. procedure TTestSpecificTBufDataset.CreateDatasetFromFielddefs;
  120. var ds : TBufDataset;
  121. begin
  122. ds := TBufDataset.Create(nil);
  123. DS.FieldDefs.Add('ID',ftInteger);
  124. DS.FieldDefs.Add('NAME',ftString,50);
  125. DS.CreateDataset;
  126. TestDataset(ds);
  127. DS.Close;
  128. DS.CreateDataset;
  129. TestDataset(ds);
  130. end;
  131. procedure TTestSpecificTBufDataset.CreateDatasetFromFields;
  132. var ds : TBufDataset;
  133. f: TField;
  134. begin
  135. ds := TBufDataset.Create(nil);
  136. F := TIntegerField.Create(ds);
  137. F.FieldName:='ID';
  138. F.DataSet:=ds;
  139. F := TStringField.Create(ds);
  140. F.FieldName:='NAME';
  141. F.DataSet:=ds;
  142. F.Size:=50;
  143. DS.CreateDataset;
  144. TestDataset(ds);
  145. DS.Close;
  146. DS.CreateDataset;
  147. TestDataset(ds);
  148. end;
  149. procedure TTestSpecificTBufDataset.TestOpeningNonExistingDataset;
  150. var ds : TBufDataset;
  151. f: TField;
  152. begin
  153. ds := TBufDataset.Create(nil);
  154. F := TIntegerField.Create(ds);
  155. F.FieldName:='ID';
  156. F.DataSet:=ds;
  157. CheckException(ds.Open,EDatabaseError);
  158. ds.Free;
  159. ds := TBufDataset.Create(nil);
  160. DS.FieldDefs.Add('ID',ftInteger);
  161. CheckException(ds.Open,EDatabaseError);
  162. ds.Free;
  163. end;
  164. procedure TTestSpecificTBufDataset.TestCreationDatasetWithCalcFields;
  165. var ds : TBufDataset;
  166. f: TField;
  167. i: integer;
  168. begin
  169. ds := TBufDataset.Create(nil);
  170. try
  171. F := TIntegerField.Create(ds);
  172. F.FieldName:='ID';
  173. F.Required:=True;
  174. F.DataSet:=ds;
  175. F := TStringField.Create(ds);
  176. F.FieldName:='NAME';
  177. F.Required:=False;
  178. F.DataSet:=ds;
  179. F.Size:=50;
  180. F := TStringField.Create(ds);
  181. F.FieldKind:=fkCalculated;
  182. F.FieldName:='NAME_CALC';
  183. F.DataSet:=ds;
  184. F.Size:=50;
  185. F := TStringField.Create(ds);
  186. F.FieldKind:=fkLookup;
  187. F.FieldName:='NAME_LKP';
  188. F.LookupDataSet:=DBConnector.GetNDataset(5);
  189. F.KeyFields:='ID';
  190. F.LookupKeyFields:='ID';
  191. F.LookupResultField:='NAME';
  192. F.DataSet:=ds;
  193. F.Size:=50;
  194. DS.CreateDataset;
  195. TestDataset(ds);
  196. CheckTrue(ds.FieldDefs[0].Required, 'Required');
  197. CheckFalse(ds.FieldDefs[1].Required, 'not Required');
  198. for i := 0 to ds.FieldDefs.Count-1 do
  199. begin
  200. CheckNotEquals(ds.FieldDefs[i].Name,'NAME_CALC');
  201. CheckNotEquals(ds.FieldDefs[i].Name,'NAME_LKP');
  202. end;
  203. DS.Close;
  204. finally
  205. ds.Free;
  206. end;
  207. end;
  208. procedure TTestSpecificTBufDataset.TestAutoIncField;
  209. var
  210. ds : TBufDataset;
  211. begin
  212. ds := GetAutoIncDataset;
  213. DS.Close;
  214. ds.Free;
  215. end;
  216. procedure TTestSpecificTBufDataset.TestAutoIncFieldStreaming;
  217. begin
  218. IntTestAutoIncFieldStreaming(false);
  219. end;
  220. procedure TTestSpecificTBufDataset.TestAutoIncFieldStreamingXML;
  221. begin
  222. IntTestAutoIncFieldStreaming(true);
  223. end;
  224. procedure TTestSpecificTBufDataset.TestRecordCount;
  225. var
  226. BDS:TBufDataSet;
  227. begin
  228. BDS:=TBufDataSet.Create(nil);
  229. BDS.FieldDefs.Add('ID',ftLargeint);
  230. BDS.CreateDataSet;
  231. BDS.AppendRecord([1]);
  232. BDS.AppendRecord([2]);
  233. BDS.AppendRecord([3]);
  234. BDS.Close;
  235. AssertEquals('IsEmpty: ',True,BDS.IsEmpty);
  236. AssertEquals('RecordCount: ',0,BDS.RecordCount);
  237. end;
  238. procedure TTestSpecificTBufDataset.TestClear;
  239. const
  240. testValuesCount=3;
  241. var
  242. i: integer;
  243. begin
  244. with DBConnector.GetNDataset(10) as TBufDataset do
  245. begin
  246. Open;
  247. Clear;
  248. AssertTrue('Dataset Closed',Not Active);
  249. AssertEquals('No fields',0,Fields.Count);
  250. AssertEquals('No fielddefs',0,FieldDefs.Count);
  251. // test after FieldDefs are Cleared, if internal structures are updated properly
  252. // create other FieldDefs
  253. FieldDefs.Add('Fs', ftString, 20);
  254. FieldDefs.Add('Fi', ftInteger);
  255. FieldDefs.Add('Fi2', ftInteger);
  256. // use only Open without CreateTable
  257. CreateDataset;
  258. AssertTrue('Empty dataset',IsEmpty);
  259. // add some data
  260. for i:=1 to testValuesCount do
  261. AppendRecord([TestStringValues[i], TestIntValues[i], TestIntValues[i]]);
  262. // check data
  263. AssertEquals('Record count',testValuesCount, RecordCount);
  264. First;
  265. for i:=1 to testValuesCount do
  266. begin
  267. AssertEquals('Field FS, Record '+InttoStr(i),TestStringValues[i], FieldByName('Fs').AsString);
  268. AssertEquals('Field Fi2, Record '+InttoStr(i),TestIntValues[i], FieldByName('Fi2').AsInteger);
  269. Next;
  270. end;
  271. CheckTrue(Eof);
  272. end;
  273. end;
  274. procedure TTestSpecificTBufDataset.TestCopyFromDataset;
  275. var bufds1, bufds2: TBufDataset;
  276. begin
  277. bufds1:=DBConnector.GetFieldDataset as TBufDataset;
  278. bufds2:=DBConnector.GetNDataset(0) as TBufDataset;
  279. bufds1.Open;
  280. bufds2.CopyFromDataset(bufds1);
  281. CheckFieldDatasetValues(bufds2);
  282. end;
  283. procedure TTestSpecificTBufDataset.TestCopyFromDatasetMoved;
  284. var
  285. bufds1, bufds2: TBufDataset;
  286. CurrentID,NewID: integer;
  287. begin
  288. bufds1:=DBConnector.GetFieldDataset as TBufDataset;
  289. bufds2:=DBConnector.GetNDataset(0) as TBufDataset;
  290. bufds1.Open;
  291. bufds1.Next; //this should not influence the copydataset step.
  292. CurrentID:=bufds1.FieldByName('ID').AsInteger;
  293. bufds2.CopyFromDataset(bufds1);
  294. CheckFieldDatasetValues(bufds2);
  295. NewID:=bufds1.FieldByName('ID').AsInteger;
  296. AssertEquals('Mismatch between ID field contents - the record has moved.',CurrentID,NewID);
  297. end;
  298. initialization
  299. {$ifdef fpc}
  300. if uppercase(dbconnectorname)='BUFDATASET' then
  301. begin
  302. RegisterTestDecorator(TDBBasicsTestSetup, TTestSpecificTBufDataset);
  303. end;
  304. {$endif fpc}
  305. end.