testbufdatasetstreams.pas 11 KB

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