testbufdatasetstreams.pas 11 KB

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