testbufdatasetstreams.pas 14 KB

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