testbufdatasetstreams.pas 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  1. unit TestBufDatasetStreams;
  2. {$IFDEF FPC}
  3. {$mode objfpc}{$H+}
  4. {$ENDIF}
  5. interface
  6. uses
  7. fpcunit, testregistry, Classes, SysUtils, db, BufDataset;
  8. type
  9. { TTestBufDatasetStreams }
  10. TUpdDatasetProc = procedure(ADataset : TCustomBufDataset) of object;
  11. // Use this class, it implements some abstract methods
  12. { TMyCustomBufDataset }
  13. TMyCustomBufDataset = Class(TCustomBufDataset)
  14. protected
  15. procedure LoadBlobIntoBuffer(FieldDef: TFieldDef; ABlobBuf: PBufBlobField); override;
  16. end;
  17. TTestBufDatasetStreams = class(TTestCase)
  18. private
  19. procedure CompareDatasets(ADataset1, ADataset2 : TDataset);
  20. procedure TestChangesApplyUpdates(AUpdDatasetProc : TUpdDatasetProc; Inserts: Boolean=False);
  21. procedure TestChangesCancelUpdates(AUpdDatasetProc : TUpdDatasetProc);
  22. procedure TestChanges(AUpdDatasetProc : TUpdDatasetProc; AFormat : TDataPacketFormat=dfBinary);
  23. procedure TestChangesXML(AUpdDatasetProc : TUpdDatasetProc);
  24. procedure SimpleEditChange(ADataset: TCustomBufDataset);
  25. procedure SimpleDeleteChange(ADataset: TCustomBufDataset);
  26. procedure MoreDeletesChange(ADataset: TCustomBufDataset);
  27. procedure SimpleInsertChange(ADataset: TCustomBufDataset);
  28. procedure MoreInsertsChange(ADataset: TCustomBufDataset);
  29. procedure SeveralEditsChange(ADataset: TCustomBufDataset);
  30. procedure DeleteAllChange(ADataset: TCustomBufDataset);
  31. procedure DeleteAllInsertChange(ADataset: TCustomBufDataset);
  32. procedure NullInsertChange(ADataset: TCustomBufDataset);
  33. procedure NullEditChange(ADataset: TCustomBufDataset);
  34. procedure AppendDeleteChange(ADataset: TCustomBufDataset);
  35. procedure TestStreamingDataFields(AFormat: TDataPacketFormat);
  36. procedure TestStreamingNullFields(AFormat: TDataPacketFormat);
  37. protected
  38. procedure SetUp; override;
  39. procedure TearDown; override;
  40. published
  41. procedure TestSimpleEditCancelUpd;
  42. procedure TestSimpleDeleteCancelUpd;
  43. procedure TestMoreDeletesCancelUpd;
  44. procedure TestSimpleInsertCancelUpd;
  45. procedure MoreInsertsCancelUpd;
  46. procedure SeveralEditsCancelUpd;
  47. procedure DeleteAllCancelUpd;
  48. procedure DeleteAllInsertCancelUpd;
  49. procedure AppendDeleteCancelUpd;
  50. procedure TestSimpleEditApplUpd;
  51. procedure TestSimpleDeleteApplUpd;
  52. procedure TestMoreDeletesApplUpd;
  53. procedure TestSimpleInsertApplUpd;
  54. procedure MoreInsertsApplUpd;
  55. procedure SeveralEditsApplUpd;
  56. procedure DeleteAllApplUpd;
  57. procedure DeleteAllInsertApplUpd;
  58. procedure NullInsertUpdateApplUpd;
  59. procedure TestBasicsXML;
  60. procedure TestSimpleEditXML;
  61. procedure TestSimpleDeleteXML;
  62. procedure TestMoreDeletesXML;
  63. procedure TestSimpleInsertXML;
  64. procedure TestMoreInsertsXML;
  65. procedure TestSeveralEditsXML;
  66. procedure TestDeleteAllXML;
  67. procedure TestDeleteAllInsertXML;
  68. procedure TestStreamingDataFieldsBIN;
  69. procedure TestStreamingDataFieldsXML;
  70. procedure TestStreamingBigBlobFieldsXML;
  71. procedure TestStreamingNullFieldsBIN;
  72. procedure TestStreamingNullFieldsXML;
  73. procedure TestStreamingCalculatedFieldsXML;
  74. procedure TestAppendDeleteBIN;
  75. procedure TestFileNameProperty;
  76. procedure TestXmlFileRecognition;
  77. procedure TestCloseDatasetNoConnection; // bug 17623
  78. end;
  79. implementation
  80. uses toolsunit, SQLDBToolsUnit, sqldb, XMLDatapacketReader;
  81. const TestXMLFileName = 'test.xml';
  82. TestBINFileName = 'test.dat';
  83. TestFileNames: array[TDataPacketFormat] of string = (TestBINFileName, TestXMLFileName, TestXMLFileName, '');
  84. { TMyCustomBufDataset }
  85. procedure TMyCustomBufDataset.LoadBlobIntoBuffer(FieldDef: TFieldDef; ABlobBuf: PBufBlobField);
  86. begin
  87. Raise ENotImplemented.Create('LoadBlobIntoBuffer not implemented');
  88. end;
  89. procedure TTestBufDatasetStreams.CompareDatasets(ADataset1,
  90. ADataset2: TDataset);
  91. begin
  92. ADataset1.First;
  93. ADataset2.First;
  94. while not ADataset1.EOF do
  95. begin
  96. AssertEquals(ADataset1.FieldByName('ID').AsInteger,ADataset2.FieldByName('ID').AsInteger);
  97. AssertEquals(ADataset1.FieldByName('NAME').AsString,ADataset2.FieldByName('NAME').AsString);
  98. ADataset1.Next;
  99. ADataset2.Next;
  100. end;
  101. end;
  102. procedure TTestBufDatasetStreams.TestChangesApplyUpdates(
  103. AUpdDatasetProc: TUpdDatasetProc; Inserts : Boolean);
  104. var OrgDs,
  105. ChangedDs : TCustomBufDataset;
  106. begin
  107. OrgDs := DBConnector.GetNDataset(true,15) as TCustomBufDataset;
  108. OrgDs.Open;
  109. AUpdDatasetProc(OrgDs);
  110. OrgDs.ApplyUpdates;
  111. if Inserts then
  112. begin
  113. ChangedDs := TSQLDBConnector(DBConnector).Query;
  114. ChangedDs.Close;
  115. TSQLQuery(ChangedDS).SQL.Text:='SELECT * FROM FPDEV WHERE (ID < 16) or (ID>100) ORDER BY ID';
  116. OrgDs.IndexFieldNames:='ID';
  117. OrgDs.First;
  118. end
  119. else
  120. ChangedDs := DBConnector.GetNDataset(true,15) as TCustomBufDataset;
  121. ChangedDs.Open;
  122. CompareDatasets(OrgDs,ChangedDs);
  123. end;
  124. procedure TTestBufDatasetStreams.TestChangesCancelUpdates(
  125. AUpdDatasetProc: TUpdDatasetProc);
  126. var OrgDs,
  127. ChangedDs : TCustomBufDataset;
  128. begin
  129. OrgDs := DBConnector.GetNDataset(true,15) as TCustomBufDataset;
  130. OrgDs.Open;
  131. AUpdDatasetProc(OrgDs);
  132. OrgDs.CancelUpdates;
  133. ChangedDs := DBConnector.GetNDataset(true,15) as TCustomBufDataset;
  134. ChangedDs.Open;
  135. CompareDatasets(OrgDs,ChangedDs);
  136. end;
  137. procedure TTestBufDatasetStreams.TestChanges(AUpdDatasetProc: TUpdDatasetProc;
  138. AFormat: TDataPacketFormat);
  139. var FileName: string;
  140. SaveDs,
  141. LoadDs : TCustomBufDataset;
  142. begin
  143. FileName := TestFileNames[AFormat];
  144. SaveDs := DBConnector.GetNDataset(true,15) as TCustomBufDataset;
  145. SaveDs.Open;
  146. AUpdDatasetProc(SaveDs);
  147. SaveDs.SaveToFile(FileName, AFormat);
  148. LoadDs := TMyCustomBufDataset.Create(nil);
  149. LoadDs.LoadFromFile(FileName);
  150. CompareDatasets(SaveDs,LoadDs);
  151. SaveDs.Close;
  152. SaveDs.Open;
  153. LoadDs.CancelUpdates;
  154. CompareDatasets(SaveDs,LoadDs);
  155. SaveDs.Close;
  156. LoadDs.Free;
  157. DeleteFile(FileName);
  158. end;
  159. procedure TTestBufDatasetStreams.TestChangesXML(AUpdDatasetProc: TUpdDatasetProc);
  160. begin
  161. TestChanges(AUpdDatasetProc, dfXML);
  162. end;
  163. procedure TTestBufDatasetStreams.SimpleEditChange(ADataset: TCustomBufDataset);
  164. begin
  165. ADataset.next;
  166. ADataset.edit;
  167. ADataset.FieldByName('name').AsString:='jojo';
  168. ADataset.Post;
  169. end;
  170. procedure TTestBufDatasetStreams.SimpleDeleteChange(ADataset: TCustomBufDataset);
  171. begin
  172. ADataset.Next;
  173. ADataset.Delete;
  174. end;
  175. procedure TTestBufDatasetStreams.MoreDeletesChange(ADataset: TCustomBufDataset);
  176. begin
  177. with ADataset do
  178. begin
  179. Delete;
  180. Next;
  181. // Next is to test what happens if the delete-buffer of one record is linked
  182. // to another deleted record
  183. Delete;
  184. Delete;
  185. Next;
  186. Next;
  187. Next;
  188. Next;
  189. // Next is to test two delete-update buffers which are linked to one record
  190. Delete;
  191. Prior;
  192. Delete;
  193. Last;
  194. Delete;
  195. end;
  196. end;
  197. procedure TTestBufDatasetStreams.SimpleInsertChange(ADataset: TCustomBufDataset);
  198. begin
  199. ADataset.next;
  200. ADataset.insert;
  201. ADataset.FieldByName('id').AsInteger:=500;
  202. ADataset.FieldByName('name').AsString:='TestName0500';
  203. ADataset.Post;
  204. end;
  205. procedure TTestBufDatasetStreams.MoreInsertsChange(ADataset: TCustomBufDataset);
  206. begin
  207. with ADataset do
  208. begin
  209. insert;
  210. FieldByName('id').AsInteger:=501;
  211. FieldByName('name').AsString:='TestName0501';
  212. Post;
  213. next;
  214. next;
  215. insert;
  216. FieldByName('id').AsInteger:=502;
  217. FieldByName('name').AsString:='TestName0502';
  218. Post;
  219. next;
  220. insert;
  221. FieldByName('id').AsInteger:=503;
  222. FieldByName('name').AsString:='TestName0503';
  223. Post;
  224. next;
  225. insert;
  226. FieldByName('id').AsInteger:=504;
  227. FieldByName('name').AsString:='TestName0504';
  228. Post;
  229. insert;
  230. FieldByName('id').AsInteger:=505;
  231. FieldByName('name').AsString:='TestName0505';
  232. Post;
  233. last;
  234. insert;
  235. FieldByName('id').AsInteger:=506;
  236. FieldByName('name').AsString:='TestName0506';
  237. Post;
  238. Append;
  239. FieldByName('id').AsInteger:=507;
  240. FieldByName('name').AsString:='TestName0507';
  241. Post;
  242. end;
  243. end;
  244. procedure TTestBufDatasetStreams.SeveralEditsChange(ADataset: TCustomBufDataset);
  245. begin
  246. with ADataset do
  247. begin
  248. edit;
  249. fieldbyname('id').asinteger := 500;
  250. fieldbyname('name').AsString := 'JoJo';
  251. post;
  252. next; next;
  253. Delete;
  254. Delete;
  255. next;next;
  256. insert;
  257. fieldbyname('id').asinteger := 501;
  258. post;
  259. end;
  260. end;
  261. procedure TTestBufDatasetStreams.DeleteAllChange(ADataset: TCustomBufDataset);
  262. begin
  263. with ADataset do
  264. while not eof do delete;
  265. end;
  266. procedure TTestBufDatasetStreams.DeleteAllInsertChange(ADataset: TCustomBufDataset);
  267. begin
  268. DeleteAllChange(ADataset);
  269. with ADataset do
  270. begin
  271. insert;
  272. fieldbyname('ID').AsInteger:=5;
  273. post;
  274. end;
  275. end;
  276. procedure TTestBufDatasetStreams.NullInsertChange(ADataset: TCustomBufDataset);
  277. begin
  278. with ADataset do
  279. begin
  280. AssertTrue(Locate('ID',11,[]));
  281. Delete; //11
  282. Delete; //12
  283. Delete; //13
  284. Delete; //14
  285. Append;
  286. FieldByName('ID').AsInteger:=11;
  287. //FieldByName('NAME').Clear;
  288. Post;
  289. AppendRecord([12,'AfterNull']);
  290. AppendRecord([13,null]);
  291. AppendRecord([14,'AfterNull']);
  292. //Append; Post;
  293. end;
  294. end;
  295. procedure TTestBufDatasetStreams.NullEditChange(ADataset: TCustomBufDataset);
  296. var i: integer;
  297. begin
  298. //depends on procedure TTestBufDatasetStreams.NullInsertChange
  299. if ADataSet is TSQLQuery then
  300. with ADataset as TSQLQuery do
  301. begin
  302. AssertTrue(Locate('ID',11,[]));
  303. for i:=11 to 14 do
  304. begin
  305. Edit;
  306. FieldByName('NAME').AsString:='TestName'+inttostr(i);
  307. Post;
  308. Next;
  309. end;
  310. UpdateMode:=upWhereAll; //test when also null fields will be in where
  311. end;
  312. end;
  313. procedure TTestBufDatasetStreams.AppendDeleteChange(ADataset: TCustomBufDataset);
  314. begin
  315. // Tests bugs #19593, #21994
  316. with ADataset do
  317. begin
  318. AppendRecord([16,'TestName16']);
  319. AppendRecord([17,'TestName17']);
  320. Prior;
  321. Prior;
  322. Delete; // 15 update-buffer of deleted record is linked to 16
  323. Delete; // 16 inserted-deleted and linked by 15
  324. AppendRecord([18,'TestName18']); // again append after delete
  325. end;
  326. end;
  327. procedure TTestBufDatasetStreams.TestSimpleEditCancelUpd;
  328. begin
  329. TestChangesCancelUpdates(@SimpleEditChange);
  330. end;
  331. procedure TTestBufDatasetStreams.TestSimpleDeleteCancelUpd;
  332. begin
  333. TestChangesCancelUpdates(@SimpleDeleteChange);
  334. end;
  335. procedure TTestBufDatasetStreams.TestMoreDeletesCancelUpd;
  336. begin
  337. TestChangesCancelUpdates(@MoreDeletesChange);
  338. end;
  339. procedure TTestBufDatasetStreams.TestSimpleInsertCancelUpd;
  340. begin
  341. TestChangesCancelUpdates(@SimpleInsertChange);
  342. end;
  343. procedure TTestBufDatasetStreams.MoreInsertsCancelUpd;
  344. begin
  345. TestChangesCancelUpdates(@MoreInsertsChange);
  346. end;
  347. procedure TTestBufDatasetStreams.SeveralEditsCancelUpd;
  348. begin
  349. TestChangesCancelUpdates(@SeveralEditsChange);
  350. end;
  351. procedure TTestBufDatasetStreams.DeleteAllCancelUpd;
  352. begin
  353. TestChangesCancelUpdates(@DeleteAllChange);
  354. end;
  355. procedure TTestBufDatasetStreams.DeleteAllInsertCancelUpd;
  356. begin
  357. TestChangesCancelUpdates(@DeleteAllInsertChange);
  358. end;
  359. procedure TTestBufDatasetStreams.AppendDeleteCancelUpd;
  360. begin
  361. TestChangesCancelUpdates(@AppendDeleteChange);
  362. end;
  363. procedure TTestBufDatasetStreams.TestBasicsXML;
  364. var SaveDs: TCustomBufDataset;
  365. LoadDs: TCustomBufDataset;
  366. begin
  367. SaveDs := DBConnector.GetNDataset(true,15) as TCustomBufDataset;
  368. SaveDs.Open;
  369. SaveDs.SaveToFile(TestXMLFileName, dfXML);
  370. LoadDs := TMyCustomBufDataset.Create(nil);
  371. LoadDs.LoadFromFile(TestXMLFileName);
  372. CompareDatasets(SaveDs,LoadDs);
  373. LoadDs.Free;
  374. end;
  375. procedure TTestBufDatasetStreams.TestSimpleEditXML;
  376. begin
  377. TestChangesXML(@SimpleEditChange);
  378. end;
  379. procedure TTestBufDatasetStreams.TestSimpleDeleteXML;
  380. begin
  381. TestChangesXML(@SimpleDeleteChange);
  382. end;
  383. procedure TTestBufDatasetStreams.TestMoreDeletesXML;
  384. begin
  385. TestChangesXML(@MoreDeletesChange);
  386. end;
  387. procedure TTestBufDatasetStreams.TestSimpleInsertXML;
  388. begin
  389. TestChangesXML(@SimpleInsertChange);
  390. end;
  391. procedure TTestBufDatasetStreams.TestMoreInsertsXML;
  392. begin
  393. TestChangesXML(@MoreInsertsChange);
  394. end;
  395. procedure TTestBufDatasetStreams.TestSeveralEditsXML;
  396. begin
  397. TestChangesXML(@SeveralEditsChange);
  398. end;
  399. procedure TTestBufDatasetStreams.TestDeleteAllXML;
  400. begin
  401. TestChangesXML(@DeleteAllChange);
  402. end;
  403. procedure TTestBufDatasetStreams.TestDeleteAllInsertXML;
  404. begin
  405. TestChangesXML(@DeleteAllInsertChange);
  406. end;
  407. procedure TTestBufDatasetStreams.TestStreamingDataFields(AFormat: TDataPacketFormat);
  408. var SaveDs: TCustomBufDataset;
  409. LoadDs: TCustomBufDataset;
  410. i: integer;
  411. begin
  412. SaveDs := DBConnector.GetFieldDataset as TCustomBufDataset;
  413. SaveDs.Open;
  414. SaveDs.SaveToFile(TestFileNames[AFormat], AFormat);
  415. LoadDs := TMyCustomBufDataset.Create(nil);
  416. LoadDs.LoadFromFile(TestFileNames[AFormat]);
  417. AssertEquals(SaveDs.FieldCount, LoadDs.FieldCount);
  418. LoadDS.First;
  419. SaveDS.First;
  420. while not LoadDS.EOF do
  421. begin
  422. for i:=0 to LoadDS.FieldCount-1 do
  423. // all FieldTypes supports GetAsString
  424. AssertEquals(LoadDS.Fields[i].FieldName, SaveDS.Fields[i].AsString, LoadDS.Fields[i].AsString);
  425. LoadDS.Next;
  426. SaveDS.Next;
  427. end;
  428. LoadDs.Free;
  429. end;
  430. procedure TTestBufDatasetStreams.TestStreamingDataFieldsBIN;
  431. begin
  432. TestStreamingDataFields(dfBinary);
  433. end;
  434. procedure TTestBufDatasetStreams.TestStreamingDataFieldsXML;
  435. begin
  436. TestStreamingDataFields(dfXML);
  437. end;
  438. procedure TTestBufDatasetStreams.TestStreamingBigBlobFieldsXML;
  439. var
  440. SaveDs: TCustomBufDataset;
  441. LoadDs: TCustomBufDataset;
  442. j: integer;
  443. i: byte;
  444. s: string;
  445. f: file of byte;
  446. fn: string;
  447. fs: TMemoryStream;
  448. begin
  449. // Create a temp. file with blob-data.
  450. fn := GetTempFileName;
  451. assign(f,fn);
  452. Rewrite(f);
  453. s := 'This is a blob-field test file.';
  454. for j := 0 to 250 do
  455. begin
  456. for i := 1 to length(s) do
  457. write(f,ord(s[i]));
  458. for i := 0 to 255 do
  459. write(f,i);
  460. end;
  461. close(f);
  462. try
  463. // Open dataset and set blob-field-data to content of blob-file.
  464. SaveDs := DBConnector.GetFieldDataset(true) as TCustomBufDataset;
  465. SaveDs.Open;
  466. SaveDs.Edit;
  467. TBlobField(SaveDs.FieldByName('FBLOB')).LoadFromFile(fn);
  468. SaveDs.Post;
  469. // Save this dataset to file.
  470. SaveDs.SaveToFile(TestXMLFileName,dfXML);
  471. // Load this file in another dataset
  472. LoadDs := TMyCustomBufDataset.Create(nil);
  473. try
  474. LoadDs.LoadFromFile(TestXMLFileName);
  475. LoadDS.First;
  476. // Compare the content of the blob-field with the file on disc
  477. fs := TMemoryStream.Create;
  478. try
  479. TBlobField(SaveDs.FieldByName('FBLOB')).SaveToStream(fs);
  480. fs.Seek(0,soBeginning);
  481. assign(f,fn);
  482. reset(f);
  483. for j := 0 to fs.Size-1 do
  484. begin
  485. read(f,i);
  486. CheckEquals(i,fs.ReadByte);
  487. end;
  488. finally
  489. fs.free;
  490. end;
  491. finally
  492. LoadDs.Free;
  493. end;
  494. finally
  495. DeleteFile(fn);
  496. end;
  497. end;
  498. procedure TTestBufDatasetStreams.TestStreamingNullFields(AFormat: TDataPacketFormat);
  499. var
  500. SaveDs: TCustomBufDataset;
  501. LoadDs: TCustomBufDataset;
  502. i: integer;
  503. begin
  504. SaveDs := DBConnector.GetFieldDataset(true) as TCustomBufDataset;
  505. with SaveDs do
  506. begin
  507. Open;
  508. Next;
  509. Edit;
  510. // set all fields, which are not required to null
  511. for i:=0 to FieldCount-1 do
  512. if not Fields[i].Required and not Fields[i].ReadOnly then
  513. Fields[i].Clear;
  514. Post;
  515. // check if they are null
  516. for i:=0 to FieldCount-1 do
  517. if not Fields[i].Required and not Fields[i].ReadOnly then
  518. AssertTrue(Fields[i].FieldName, Fields[i].IsNull);
  519. SaveToFile(TestFileNames[AFormat], AFormat);
  520. end;
  521. LoadDs := TMyCustomBufDataset.Create(nil);
  522. try
  523. LoadDs.LoadFromFile(TestFileNames[AFormat]);
  524. AssertEquals(SaveDs.FieldCount, LoadDs.FieldCount);
  525. SaveDs.First;
  526. while not SaveDs.EOF do
  527. begin
  528. for i:=0 to SaveDs.FieldCount-1 do
  529. AssertEquals(SaveDs.Fields[i].FieldName, SaveDs.Fields[i].IsNull, LoadDs.Fields[i].IsNull);
  530. LoadDs.Next;
  531. SaveDs.Next;
  532. end;
  533. finally
  534. LoadDs.Free;
  535. end;
  536. end;
  537. procedure TTestBufDatasetStreams.TestStreamingNullFieldsBIN;
  538. begin
  539. TestStreamingNullFields(dfBinary);
  540. end;
  541. procedure TTestBufDatasetStreams.TestStreamingNullFieldsXML;
  542. begin
  543. TestStreamingNullFields(dfXML);
  544. end;
  545. procedure TTestBufDatasetStreams.TestStreamingCalculatedFieldsXML;
  546. var
  547. ADataset: TCustomBufDataset;
  548. f: tfield;
  549. begin
  550. ADataset := DBConnector.GetNDataset(true,10) as TCustomBufDataset;
  551. f := TIntegerField.Create(ADataset);
  552. f.FieldName:='ID';
  553. f.dataset := ADataset;
  554. f := TIntegerField.Create(ADataset);
  555. f.FieldName:='CalcID';
  556. f.dataset := ADataset;
  557. f.FieldKind:=fkCalculated;
  558. f := TStringField.Create(ADataset);
  559. f.FieldName:='NAME';
  560. f.dataset := ADataset;
  561. ADataset.Open;
  562. ADataset.SaveToFile(TestXMLFileName,dfXML);
  563. ADataset.Close;
  564. ADataset.LoadFromFile(TestXMLFileName,dfXML);
  565. AssertEquals(1, ADataset.FieldByName('ID').AsInteger);
  566. AssertEquals('TestName1', ADataset.FieldByName('NAME').AsString);
  567. ADataset.Close;
  568. end;
  569. procedure TTestBufDatasetStreams.TestAppendDeleteBIN;
  570. begin
  571. TestChanges(@AppendDeleteChange);
  572. end;
  573. procedure TTestBufDatasetStreams.TestFileNameProperty;
  574. var ds : TDataset;
  575. LoadDs: TDataset;
  576. begin
  577. ds := DBConnector.GetNDataset(true,5);
  578. ds.open;
  579. TCustomBufDataset(ds).FileName:=TestBINFileName;
  580. ds.close;
  581. LoadDs := DBConnector.GetNDataset(True,2);
  582. TCustomBufDataset(LoadDs).FileName:=TestBINFileName;
  583. LoadDs.Open;
  584. ds := DBConnector.GetNDataset(true,4);
  585. ds.Open;
  586. CompareDatasets(ds,LoadDs);
  587. ds.close;
  588. LoadDs.close;
  589. end;
  590. procedure TTestBufDatasetStreams.TestXmlFileRecognition;
  591. var ds : TDataset;
  592. LoadDs: TDataset;
  593. begin
  594. ds := DBConnector.GetNDataset(true,5);
  595. ds.open;
  596. TCustomBufDataset(ds).SaveToFile(TestXMLFileName,dfXML);
  597. ds.close;
  598. LoadDs := DBConnector.GetNDataset(True,2);
  599. TCustomBufDataset(LoadDs).FileName:=TestXMLFileName;
  600. LoadDs.Open;
  601. ds := DBConnector.GetNDataset(true,4);
  602. ds.Open;
  603. CompareDatasets(ds,LoadDs);
  604. ds.close;
  605. LoadDs.close;
  606. end;
  607. procedure TTestBufDatasetStreams.TestCloseDatasetNoConnection;
  608. var SaveDs: TCustomBufDataset;
  609. LoadDs: TCustomBufDataset;
  610. Conn: TSQLConnection;
  611. begin
  612. SaveDs := DBConnector.GetNDataset(true,15) as TSQLQuery;
  613. SaveDs.Open;
  614. SaveDs.SaveToFile(TestXMLFileName,dfXML);
  615. SaveDs.Close;
  616. Conn := TSQLConnectionClass(TSQLDBConnector(DBConnector).Connection.ClassType).Create(nil);
  617. LoadDs := TSQLQuery.Create(nil);
  618. LoadDs.DataBase:=Conn;
  619. LoadDs.LoadFromFile(TestXMLFileName);
  620. LoadDs.Next;
  621. LoadDs.Close;
  622. LoadDs.Free;
  623. Conn.Free;
  624. end;
  625. procedure TTestBufDatasetStreams.TestSimpleEditApplUpd;
  626. begin
  627. TestChangesApplyUpdates(@SimpleEditChange);
  628. end;
  629. procedure TTestBufDatasetStreams.TestSimpleDeleteApplUpd;
  630. begin
  631. TestChangesApplyUpdates(@SimpleDeleteChange);
  632. end;
  633. procedure TTestBufDatasetStreams.TestMoreDeletesApplUpd;
  634. begin
  635. TestChangesApplyUpdates(@MoreDeletesChange);
  636. end;
  637. procedure TTestBufDatasetStreams.TestSimpleInsertApplUpd;
  638. begin
  639. TestChangesApplyUpdates(@SimpleInsertChange,True);
  640. end;
  641. procedure TTestBufDatasetStreams.MoreInsertsApplUpd;
  642. begin
  643. TestChangesApplyUpdates(@MoreInsertsChange,True);
  644. end;
  645. procedure TTestBufDatasetStreams.SeveralEditsApplUpd;
  646. begin
  647. TestChangesApplyUpdates(@SeveralEditsChange, True);
  648. end;
  649. procedure TTestBufDatasetStreams.DeleteAllApplUpd;
  650. begin
  651. TestChangesApplyUpdates(@DeleteAllChange, False);
  652. end;
  653. procedure TTestBufDatasetStreams.DeleteAllInsertApplUpd;
  654. begin
  655. TestChangesApplyUpdates(@DeleteAllInsertChange, False);
  656. end;
  657. procedure TTestBufDatasetStreams.NullInsertUpdateApplUpd;
  658. begin
  659. TestChangesApplyUpdates(@NullInsertChange, True);
  660. TestChangesApplyUpdates(@NullEditChange, True);
  661. end;
  662. procedure TTestBufDatasetStreams.SetUp;
  663. begin
  664. DBConnector.StartTest(TestName);
  665. end;
  666. procedure TTestBufDatasetStreams.TearDown;
  667. begin
  668. DBConnector.StopTest(TestName);
  669. end;
  670. initialization
  671. if uppercase(dbconnectorname)='SQL' then
  672. RegisterTestDecorator(TDBBasicsTestSetup, TTestBufDatasetStreams);
  673. end.