testspecifictbufdataset.pas 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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, testutils, testregistry, testdecorator, BufDataset,
  13. {$ELSE FPC}
  14. TestFramework,
  15. {$ENDIF FPC}
  16. Classes, SysUtils, db, ToolsUnit;
  17. type
  18. { TTestSpecificTBufDataset }
  19. TTestSpecificTBufDataset = class(TTestCase)
  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. end;
  37. implementation
  38. uses
  39. {$ifdef fpc}
  40. //
  41. {$endif fpc}
  42. variants,
  43. strutils,
  44. FmtBCD;
  45. { TTestSpecificTBufDataset }
  46. procedure TTestSpecificTBufDataset.TestDataset(ABufDataset: TBufDataset;
  47. AutoInc: boolean);
  48. var
  49. i : integer;
  50. begin
  51. for i := 1 to 10 do
  52. begin
  53. ABufDataset.Append;
  54. if not AutoInc then
  55. ABufDataset.FieldByName('ID').AsInteger := i;
  56. ABufDataset.FieldByName('NAME').AsString := 'TestName' + inttostr(i);
  57. ABufDataset.Post;
  58. end;
  59. ABufDataset.first;
  60. for i := 1 to 10 do
  61. begin
  62. CheckEquals(i,ABufDataset.fieldbyname('ID').asinteger);
  63. CheckEquals('TestName' + inttostr(i),ABufDataset.fieldbyname('NAME').AsString);
  64. ABufDataset.next;
  65. end;
  66. CheckTrue(ABufDataset.EOF);
  67. end;
  68. function TTestSpecificTBufDataset.GetAutoIncDataset: TBufDataset;
  69. var
  70. ds : TBufDataset;
  71. f: TField;
  72. begin
  73. ds := TBufDataset.Create(nil);
  74. F := TAutoIncField.Create(ds);
  75. F.FieldName:='ID';
  76. F.DataSet:=ds;
  77. F := TStringField.Create(ds);
  78. F.FieldName:='NAME';
  79. F.DataSet:=ds;
  80. F.Size:=50;
  81. DS.CreateDataset;
  82. TestDataset(ds,True);
  83. result := ds;
  84. end;
  85. procedure TTestSpecificTBufDataset.IntTestAutoIncFieldStreaming(XML: boolean);
  86. var
  87. ds : TBufDataset;
  88. fn: string;
  89. begin
  90. ds := GetAutoIncDataset;
  91. fn := GetTempFileName;
  92. if xml then
  93. ds.SaveToFile(fn,dfXML)
  94. else
  95. ds.SaveToFile(fn);
  96. DS.Close;
  97. ds.Free;
  98. ds := TBufDataset.Create(nil);
  99. ds.LoadFromFile(fn);
  100. ds.Last;
  101. CheckEquals(10,ds.FieldByName('Id').AsInteger);
  102. ds.Append;
  103. ds.FieldByName('NAME').asstring := 'Test';
  104. ds.Post;
  105. CheckEquals(11,ds.FieldByName('Id').AsInteger);
  106. ds.Free;
  107. DeleteFile(fn);
  108. end;
  109. procedure TTestSpecificTBufDataset.SetUp;
  110. begin
  111. DBConnector.StartTest(TestName);
  112. end;
  113. procedure TTestSpecificTBufDataset.TearDown;
  114. begin
  115. DBConnector.StopTest(TestName);
  116. end;
  117. procedure TTestSpecificTBufDataset.CreateDatasetFromFielddefs;
  118. var ds : TBufDataset;
  119. begin
  120. ds := TBufDataset.Create(nil);
  121. DS.FieldDefs.Add('ID',ftInteger);
  122. DS.FieldDefs.Add('NAME',ftString,50);
  123. DS.CreateDataset;
  124. TestDataset(ds);
  125. DS.Close;
  126. DS.CreateDataset;
  127. TestDataset(ds);
  128. end;
  129. procedure TTestSpecificTBufDataset.CreateDatasetFromFields;
  130. var ds : TBufDataset;
  131. f: TField;
  132. begin
  133. ds := TBufDataset.Create(nil);
  134. F := TIntegerField.Create(ds);
  135. F.FieldName:='ID';
  136. F.DataSet:=ds;
  137. F := TStringField.Create(ds);
  138. F.FieldName:='NAME';
  139. F.DataSet:=ds;
  140. F.Size:=50;
  141. DS.CreateDataset;
  142. TestDataset(ds);
  143. DS.Close;
  144. DS.CreateDataset;
  145. TestDataset(ds);
  146. end;
  147. procedure TTestSpecificTBufDataset.TestOpeningNonExistingDataset;
  148. var ds : TBufDataset;
  149. f: TField;
  150. begin
  151. ds := TBufDataset.Create(nil);
  152. F := TIntegerField.Create(ds);
  153. F.FieldName:='ID';
  154. F.DataSet:=ds;
  155. CheckException(ds.Open,EDatabaseError);
  156. ds.Free;
  157. ds := TBufDataset.Create(nil);
  158. DS.FieldDefs.Add('ID',ftInteger);
  159. CheckException(ds.Open,EDatabaseError);
  160. ds.Free;
  161. end;
  162. procedure TTestSpecificTBufDataset.TestCreationDatasetWithCalcFields;
  163. var ds : TBufDataset;
  164. f: TField;
  165. i: integer;
  166. begin
  167. ds := TBufDataset.Create(nil);
  168. try
  169. F := TIntegerField.Create(ds);
  170. F.FieldName:='ID';
  171. F.DataSet:=ds;
  172. F := TStringField.Create(ds);
  173. F.FieldName:='NAME';
  174. F.DataSet:=ds;
  175. F.Size:=50;
  176. F := TStringField.Create(ds);
  177. F.FieldKind:=fkCalculated;
  178. F.FieldName:='NAME_CALC';
  179. F.DataSet:=ds;
  180. F.Size:=50;
  181. F := TStringField.Create(ds);
  182. F.FieldKind:=fkLookup;
  183. F.FieldName:='NAME_LKP';
  184. F.LookupDataSet:=DBConnector.GetNDataset(5);
  185. F.KeyFields:='ID';
  186. F.LookupKeyFields:='ID';
  187. F.LookupResultField:='NAME';
  188. F.DataSet:=ds;
  189. F.Size:=50;
  190. DS.CreateDataset;
  191. TestDataset(ds);
  192. for i := 0 to ds.FieldDefs.Count-1 do
  193. begin
  194. CheckNotEquals(ds.FieldDefs[i].Name,'NAME_CALC');
  195. CheckNotEquals(ds.FieldDefs[i].Name,'NAME_LKP');
  196. end;
  197. DS.Close;
  198. finally
  199. ds.Free;
  200. end;
  201. end;
  202. procedure TTestSpecificTBufDataset.TestAutoIncField;
  203. var
  204. ds : TBufDataset;
  205. begin
  206. ds := GetAutoIncDataset;
  207. DS.Close;
  208. ds.Free;
  209. end;
  210. procedure TTestSpecificTBufDataset.TestAutoIncFieldStreaming;
  211. begin
  212. IntTestAutoIncFieldStreaming(false);
  213. end;
  214. procedure TTestSpecificTBufDataset.TestAutoIncFieldStreamingXML;
  215. begin
  216. IntTestAutoIncFieldStreaming(true);
  217. end;
  218. procedure TTestSpecificTBufDataset.TestRecordCount;
  219. var
  220. BDS:TBufDataSet;
  221. begin
  222. BDS:=TBufDataSet.Create(nil);
  223. BDS.FieldDefs.Add('ID',ftLargeint);
  224. BDS.CreateDataSet;
  225. BDS.AppendRecord([1]);
  226. BDS.AppendRecord([2]);
  227. BDS.AppendRecord([3]);
  228. BDS.Close;
  229. AssertEquals('IsEmpty: ',True,BDS.IsEmpty);
  230. AssertEquals('RecordCount: ',0,BDS.RecordCount);
  231. end;
  232. initialization
  233. {$ifdef fpc}
  234. if uppercase(dbconnectorname)='BUFDATASET' then
  235. begin
  236. RegisterTestDecorator(TDBBasicsTestSetup, TTestSpecificTBufDataset);
  237. end;
  238. {$endif fpc}
  239. end.