testbufdatasetstreams.pas 12 KB

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