testbufdatasetstreams.pas 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. unit TestBufDatasetStreams;
  2. {$IFDEF FPC}
  3. {$mode objfpc}{$H+}
  4. {$ENDIF}
  5. interface
  6. uses
  7. fpcunit, testutils, testregistry, testdecorator,
  8. Classes, SysUtils, db, BufDataset;
  9. type
  10. { TTestBufDatasetStreams }
  11. TUpdDatasetProc = procedure(ADataset : TCustomBufDataset) of object;
  12. TTestBufDatasetStreams = class(TTestCase)
  13. private
  14. procedure CompareDatasets(ADataset1, ADataset2 : TDataset);
  15. procedure TestChangesApplyUpdates(AUpdDatasetProc : TUpdDatasetProc; Inserts: Boolean=False);
  16. procedure TestChangesCancelUpdates(AUpdDatasetProc : TUpdDatasetProc);
  17. procedure TestChangesXML(AUpdDatasetProc : TUpdDatasetProc);
  18. procedure SimpleEditChange(ADataset: TCustomBufDataset);
  19. procedure SimpleDeleteChange(ADataset: TCustomBufDataset);
  20. procedure MoreDeletesChange(ADataset: TCustomBufDataset);
  21. procedure SimpleInsertChange(ADataset: TCustomBufDataset);
  22. procedure MoreInsertsChange(ADataset: TCustomBufDataset);
  23. procedure SeveralEditsChange(ADataset: TCustomBufDataset);
  24. procedure DeleteAllChange(ADataset: TCustomBufDataset);
  25. procedure DeleteAllInsertChange(ADataset: TCustomBufDataset);
  26. protected
  27. procedure SetUp; override;
  28. procedure TearDown; override;
  29. published
  30. procedure TestSimpleEditCancelUpd;
  31. procedure TestSimpleDeleteCancelUpd;
  32. procedure TestMoreDeletesCancelUpd;
  33. procedure TestSimpleInsertCancelUpd;
  34. procedure MoreInsertsCancelUpd;
  35. procedure SeveralEditsCancelUpd;
  36. procedure DeleteAllCancelUpd;
  37. procedure DeleteAllInsertCancelUpd;
  38. procedure TestSimpleEditApplUpd;
  39. procedure TestSimpleDeleteApplUpd;
  40. procedure TestMoreDeletesApplUpd;
  41. procedure TestSimpleInsertApplUpd;
  42. procedure MoreInsertsApplUpd;
  43. procedure SeveralEditsApplUpd;
  44. procedure DeleteAllApplUpd;
  45. procedure DeleteAllInsertApplUpd;
  46. procedure TestBasicsXML;
  47. procedure TestSimpleEditXML;
  48. procedure TestSimpleDeleteXML;
  49. procedure TestMoreDeletesXML;
  50. procedure TestSimpleInsertXML;
  51. procedure TestMoreInsertsXML;
  52. procedure TestSeveralEditsXML;
  53. procedure TestDeleteAllXML;
  54. procedure TestDeleteAllInsertXML;
  55. procedure TestFileNameProperty;
  56. end;
  57. implementation
  58. uses toolsunit, SQLDBToolsUnit, sqldb, XMLDatapacketReader;
  59. procedure TTestBufDatasetStreams.CompareDatasets(ADataset1,
  60. ADataset2: TDataset);
  61. begin
  62. ADataset1.First;
  63. ADataset2.First;
  64. while not ADataset1.EOF do
  65. begin
  66. AssertEquals(ADataset1.FieldByName('ID').AsInteger,ADataset2.FieldByName('ID').AsInteger);
  67. AssertEquals(ADataset1.FieldByName('NAME').AsString,ADataset2.FieldByName('NAME').AsString);
  68. ADataset1.Next;
  69. ADataset2.Next;
  70. end;
  71. end;
  72. procedure TTestBufDatasetStreams.TestChangesApplyUpdates(
  73. AUpdDatasetProc: TUpdDatasetProc; Inserts : Boolean);
  74. var OrgDs,
  75. ChangedDs : TCustomBufDataset;
  76. begin
  77. OrgDs := DBConnector.GetNDataset(true,15) as TCustomBufDataset;
  78. OrgDs.Open;
  79. AUpdDatasetProc(OrgDs);
  80. OrgDs.ApplyUpdates;
  81. if Inserts then
  82. begin
  83. ChangedDs := TSQLDBConnector(DBConnector).Query;
  84. TSQLQuery(ChangedDS).SQL.Text:='SELECT * FROM FPDEV WHERE (ID < 16) or (ID>100) ORDER BY ID';
  85. OrgDs.IndexFieldNames:='ID';
  86. OrgDs.First;
  87. end
  88. else
  89. ChangedDs := DBConnector.GetNDataset(true,15) as TCustomBufDataset;
  90. ChangedDs.Open;
  91. CompareDatasets(OrgDs,ChangedDs);
  92. end;
  93. procedure TTestBufDatasetStreams.TestChangesCancelUpdates(
  94. AUpdDatasetProc: TUpdDatasetProc);
  95. var OrgDs,
  96. ChangedDs : TCustomBufDataset;
  97. begin
  98. OrgDs := DBConnector.GetNDataset(true,15) as TCustomBufDataset;
  99. OrgDs.Open;
  100. AUpdDatasetProc(OrgDs);
  101. OrgDs.CancelUpdates;
  102. ChangedDs := DBConnector.GetNDataset(true,15) as TCustomBufDataset;
  103. ChangedDs.Open;
  104. CompareDatasets(OrgDs,ChangedDs);
  105. end;
  106. procedure TTestBufDatasetStreams.TestChangesXML(AUpdDatasetProc: TUpdDatasetProc);
  107. var SaveDs,
  108. LoadDs : TCustomBufDataset;
  109. begin
  110. SaveDs := DBConnector.GetNDataset(true,15) as TCustomBufDataset;
  111. SaveDs.Open;
  112. AUpdDatasetProc(SaveDs);
  113. SaveDs.SaveToFile('Basics.xml',dfXML);
  114. LoadDs := TCustomBufDataset.Create(nil);
  115. LoadDs.LoadFromFile('Basics.xml');
  116. CompareDatasets(SaveDs,LoadDs);
  117. SaveDs.Close;
  118. SaveDs.Open;
  119. LoadDs.CancelUpdates;
  120. CompareDatasets(SaveDs,LoadDs);
  121. LoadDs.Free;
  122. end;
  123. procedure TTestBufDatasetStreams.SimpleEditChange(ADataset: TCustomBufDataset);
  124. begin
  125. ADataset.next;
  126. ADataset.edit;
  127. ADataset.FieldByName('name').AsString:='jojo';
  128. ADataset.Post;
  129. end;
  130. procedure TTestBufDatasetStreams.SimpleDeleteChange(ADataset: TCustomBufDataset);
  131. begin
  132. ADataset.Next;
  133. ADataset.Delete;
  134. end;
  135. procedure TTestBufDatasetStreams.MoreDeletesChange(ADataset: TCustomBufDataset);
  136. begin
  137. with ADataset do
  138. begin
  139. Delete;
  140. Next;
  141. // Next is to test what happens if the delete-buffer of one record is linked
  142. // to another deleted record
  143. Delete;
  144. Delete;
  145. Next;
  146. Next;
  147. Next;
  148. Next;
  149. // Next is to test two delete-update buffers which are linked to one record
  150. Delete;
  151. Prior;
  152. Delete;
  153. Last;
  154. Delete;
  155. end;
  156. end;
  157. procedure TTestBufDatasetStreams.SimpleInsertChange(ADataset: TCustomBufDataset);
  158. begin
  159. ADataset.next;
  160. ADataset.insert;
  161. ADataset.FieldByName('id').AsInteger:=500;
  162. ADataset.FieldByName('name').AsString:='TestName0500';
  163. ADataset.Post;
  164. end;
  165. procedure TTestBufDatasetStreams.MoreInsertsChange(ADataset: TCustomBufDataset);
  166. begin
  167. with ADataset do
  168. begin
  169. insert;
  170. FieldByName('id').AsInteger:=501;
  171. FieldByName('name').AsString:='TestName0501';
  172. Post;
  173. next;
  174. next;
  175. insert;
  176. FieldByName('id').AsInteger:=502;
  177. FieldByName('name').AsString:='TestName0502';
  178. Post;
  179. next;
  180. insert;
  181. FieldByName('id').AsInteger:=503;
  182. FieldByName('name').AsString:='TestName0503';
  183. Post;
  184. next;
  185. insert;
  186. FieldByName('id').AsInteger:=504;
  187. FieldByName('name').AsString:='TestName0504';
  188. Post;
  189. insert;
  190. FieldByName('id').AsInteger:=505;
  191. FieldByName('name').AsString:='TestName0505';
  192. Post;
  193. last;
  194. insert;
  195. FieldByName('id').AsInteger:=506;
  196. FieldByName('name').AsString:='TestName0506';
  197. Post;
  198. Append;
  199. FieldByName('id').AsInteger:=507;
  200. FieldByName('name').AsString:='TestName0507';
  201. Post;
  202. end;
  203. end;
  204. procedure TTestBufDatasetStreams.SeveralEditsChange(ADataset: TCustomBufDataset);
  205. begin
  206. with ADataset do
  207. begin
  208. edit;
  209. fieldbyname('id').asinteger := 500;
  210. fieldbyname('name').AsString := 'JoJo';
  211. post;
  212. next; next;
  213. Delete;
  214. Delete;
  215. next;next;
  216. insert;
  217. fieldbyname('id').asinteger := 501;
  218. post;
  219. end;
  220. end;
  221. procedure TTestBufDatasetStreams.DeleteAllChange(ADataset: TCustomBufDataset);
  222. begin
  223. with ADataset do
  224. while not eof do delete;
  225. end;
  226. procedure TTestBufDatasetStreams.DeleteAllInsertChange(ADataset: TCustomBufDataset);
  227. begin
  228. DeleteAllChange(ADataset);
  229. with ADataset do
  230. begin
  231. insert;
  232. fieldbyname('ID').AsInteger:=5;
  233. post;
  234. end;
  235. end;
  236. procedure TTestBufDatasetStreams.SetUp;
  237. begin
  238. DBConnector.StartTest;
  239. end;
  240. procedure TTestBufDatasetStreams.TearDown;
  241. begin
  242. DBConnector.StopTest;
  243. end;
  244. procedure TTestBufDatasetStreams.TestSimpleEditCancelUpd;
  245. begin
  246. TestChangesCancelUpdates(@SimpleEditChange);
  247. end;
  248. procedure TTestBufDatasetStreams.TestSimpleDeleteCancelUpd;
  249. begin
  250. TestChangesCancelUpdates(@SimpleDeleteChange);
  251. end;
  252. procedure TTestBufDatasetStreams.TestMoreDeletesCancelUpd;
  253. begin
  254. TestChangesCancelUpdates(@MoreDeletesChange);
  255. end;
  256. procedure TTestBufDatasetStreams.TestSimpleInsertCancelUpd;
  257. begin
  258. TestChangesCancelUpdates(@SimpleInsertChange);
  259. end;
  260. procedure TTestBufDatasetStreams.MoreInsertsCancelUpd;
  261. begin
  262. TestChangesCancelUpdates(@MoreInsertsChange);
  263. end;
  264. procedure TTestBufDatasetStreams.SeveralEditsCancelUpd;
  265. begin
  266. TestChangesCancelUpdates(@SeveralEditsChange);
  267. end;
  268. procedure TTestBufDatasetStreams.DeleteAllCancelUpd;
  269. begin
  270. TestChangesCancelUpdates(@DeleteAllChange);
  271. end;
  272. procedure TTestBufDatasetStreams.DeleteAllInsertCancelUpd;
  273. begin
  274. TestChangesCancelUpdates(@DeleteAllInsertChange);
  275. end;
  276. procedure TTestBufDatasetStreams.TestBasicsXML;
  277. var SaveDs: TCustomBufDataset;
  278. LoadDs: TCustomBufDataset;
  279. begin
  280. SaveDs := DBConnector.GetNDataset(true,15) as TCustomBufDataset;
  281. SaveDs.Open;
  282. SaveDs.SaveToFile('Basics.xml',dfXML);
  283. LoadDs := TCustomBufDataset.Create(nil);
  284. LoadDs.LoadFromFile('Basics.xml');
  285. CompareDatasets(SaveDs,LoadDs);
  286. LoadDs.Free;
  287. end;
  288. procedure TTestBufDatasetStreams.TestSimpleEditXML;
  289. begin
  290. TestChangesXML(@SimpleEditChange);
  291. end;
  292. procedure TTestBufDatasetStreams.TestSimpleDeleteXML;
  293. begin
  294. TestChangesXML(@SimpleDeleteChange);
  295. end;
  296. procedure TTestBufDatasetStreams.TestMoreDeletesXML;
  297. begin
  298. TestChangesXML(@MoreDeletesChange);
  299. end;
  300. procedure TTestBufDatasetStreams.TestSimpleInsertXML;
  301. begin
  302. TestChangesXML(@SimpleInsertChange);
  303. end;
  304. procedure TTestBufDatasetStreams.TestMoreInsertsXML;
  305. begin
  306. TestChangesXML(@MoreInsertsChange);
  307. end;
  308. procedure TTestBufDatasetStreams.TestSeveralEditsXML;
  309. begin
  310. TestChangesXML(@SeveralEditsChange);
  311. end;
  312. procedure TTestBufDatasetStreams.TestDeleteAllXML;
  313. begin
  314. TestChangesXML(@DeleteAllChange);
  315. end;
  316. procedure TTestBufDatasetStreams.TestDeleteAllInsertXML;
  317. begin
  318. TestChangesXML(@DeleteAllInsertChange);
  319. end;
  320. procedure TTestBufDatasetStreams.TestFileNameProperty;
  321. var ds : TDataset;
  322. LoadDs: TDataset;
  323. begin
  324. ds := DBConnector.GetNDataset(true,5);
  325. ds.open;
  326. TCustomBufDataset(ds).FileName:='test.dat';
  327. ds.close;
  328. LoadDs := DBConnector.GetNDataset(True,2);
  329. TCustomBufDataset(LoadDs).FileName:='test.dat';
  330. LoadDs.Open;
  331. ds := DBConnector.GetNDataset(true,4);
  332. ds.Open;
  333. CompareDatasets(ds,LoadDs);
  334. ds.close;
  335. LoadDs.close;
  336. end;
  337. procedure TTestBufDatasetStreams.TestSimpleEditApplUpd;
  338. begin
  339. TestChangesApplyUpdates(@SimpleEditChange);
  340. end;
  341. procedure TTestBufDatasetStreams.TestSimpleDeleteApplUpd;
  342. begin
  343. TestChangesApplyUpdates(@SimpleDeleteChange);
  344. end;
  345. procedure TTestBufDatasetStreams.TestMoreDeletesApplUpd;
  346. begin
  347. TestChangesApplyUpdates(@MoreDeletesChange);
  348. end;
  349. procedure TTestBufDatasetStreams.TestSimpleInsertApplUpd;
  350. begin
  351. TestChangesApplyUpdates(@SimpleInsertChange,True);
  352. end;
  353. procedure TTestBufDatasetStreams.MoreInsertsApplUpd;
  354. begin
  355. TestChangesApplyUpdates(@MoreInsertsChange,True);
  356. end;
  357. procedure TTestBufDatasetStreams.SeveralEditsApplUpd;
  358. begin
  359. TestChangesApplyUpdates(@SeveralEditsChange, True);
  360. end;
  361. procedure TTestBufDatasetStreams.DeleteAllApplUpd;
  362. begin
  363. TestChangesApplyUpdates(@DeleteAllChange, False);
  364. end;
  365. procedure TTestBufDatasetStreams.DeleteAllInsertApplUpd;
  366. begin
  367. TestChangesApplyUpdates(@DeleteAllInsertChange, False);
  368. end;
  369. initialization
  370. if uppercase(dbconnectorname)='SQL' then
  371. RegisterTestDecorator(TDBBasicsTestSetup, TTestBufDatasetStreams);
  372. end.