testspecifictbufdataset.pas 8.5 KB

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