testspecifictbufdataset.pas 5.7 KB

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