testdbbasics.pas 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564
  1. unit TestDBBasics;
  2. {$IFDEF FPC}
  3. {$mode Delphi}{$H+}
  4. {$ENDIF}
  5. interface
  6. uses
  7. fpcunit, testutils, testregistry, testdecorator,
  8. Classes, SysUtils, db;
  9. type
  10. { TTestDBBasics }
  11. TTestDBBasics = class(TTestCase)
  12. private
  13. procedure TestOnFilterProc(DataSet: TDataSet; var Accept: Boolean);
  14. procedure TestfieldDefinition(AFieldType : TFieldType;ADatasize : integer;var ADS : TDataset; var AFld: TField);
  15. procedure TestcalculatedField_OnCalcfields(DataSet: TDataSet);
  16. procedure FTestDelete1(TestCancelUpdate : boolean);
  17. procedure FTestDelete2(TestCancelUpdate : boolean);
  18. procedure TestAddIndexFieldType(AFieldType : TFieldType; ActiveDS : boolean);
  19. protected
  20. procedure SetUp; override;
  21. procedure TearDown; override;
  22. published
  23. procedure TestCancelUpdDelete1;
  24. procedure TestCancelUpdDelete2;
  25. procedure TestBookmarks;
  26. procedure TestFirst;
  27. procedure TestDelete1;
  28. procedure TestDelete2;
  29. procedure TestIntFilter;
  30. procedure TestOnFilter;
  31. procedure TestStringFilter;
  32. procedure TestAddIndex;
  33. procedure TestInactSwitchIndex;
  34. procedure TestAddIndexInteger;
  35. procedure TestAddIndexSmallInt;
  36. procedure TestAddIndexBoolean;
  37. procedure TestAddIndexFloat;
  38. procedure TestAddIndexLargeInt;
  39. procedure TestAddIndexDateTime;
  40. procedure TestAddIndexCurrency;
  41. procedure TestAddIndexBCD;
  42. procedure TestAddIndexActiveDS;
  43. procedure TestAddIndexEditDS;
  44. procedure TestIndexFieldNames;
  45. procedure TestIndexFieldNamesAct;
  46. procedure TestNullAtOpen;
  47. procedure TestSupportIntegerFields;
  48. procedure TestSupportSmallIntFields;
  49. procedure TestSupportStringFields;
  50. procedure TestSupportBooleanFields;
  51. procedure TestSupportFloatFields;
  52. procedure TestSupportLargeIntFields;
  53. procedure TestSupportDateFields;
  54. procedure TestSupportCurrencyFields;
  55. procedure TestSupportBCDFields;
  56. procedure TestIsEmpty;
  57. procedure TestAppendOnEmptyDataset;
  58. procedure TestInsertOnEmptyDataset;
  59. procedure TestBufDatasetCancelUpd; //bug 6938
  60. procedure TestEofAfterFirst; //bug 7211
  61. procedure TestBufDatasetCancelUpd1;
  62. procedure TestDoubleClose;
  63. procedure TestCalculatedField;
  64. procedure TestAssignFieldftString;
  65. procedure TestAssignFieldftFixedChar;
  66. procedure TestSelectQueryBasics;
  67. procedure TestPostOnlyInEditState;
  68. procedure TestMove; // bug 5048
  69. procedure TestActiveBufferWhenClosed;
  70. procedure TestEOFBOFClosedDataset;
  71. procedure TestDataEventsResync;
  72. procedure TestBug7007;
  73. procedure TestBug6893;
  74. procedure TestRecordcountAfterReopen; // partly bug 8228
  75. procedure TestdeFieldListChange;
  76. procedure TestLastAppendCancel; // bug 5058
  77. procedure TestRecNo; // bug 5061
  78. procedure TestSetRecNo; // bug 6919
  79. procedure TestRequired;
  80. end;
  81. { TSQLTestSetup }
  82. TDBBasicsTestSetup = class(TTestSetup)
  83. protected
  84. procedure OneTimeSetup; override;
  85. procedure OneTimeTearDown; override;
  86. end;
  87. implementation
  88. uses toolsunit, bufdataset;
  89. type THackDataLink=class(TdataLink);
  90. procedure TTestDBBasics.TestIsEmpty;
  91. begin
  92. if not (DBConnector.GetNDataset(5) is TBufDataset) then
  93. Ignore('This test only applies to TBufDataset and descendents.');
  94. with tbufdataset(DBConnector.GetNDataset(True,1)) do
  95. begin
  96. open;
  97. delete;
  98. refresh;
  99. applyupdates;
  100. AssertTrue(IsEmpty);
  101. end;
  102. end;
  103. procedure TTestDBBasics.TestAppendOnEmptyDataset;
  104. begin
  105. with DBConnector.GetNDataset(0) do
  106. begin
  107. open;
  108. AssertTrue(CanModify);
  109. AssertTrue(eof);
  110. AssertTrue(bof);
  111. append;
  112. AssertFalse(Bof);
  113. AssertTrue(Eof);
  114. post;
  115. AssertFalse(eof);
  116. AssertFalse(bof);
  117. end;
  118. end;
  119. procedure TTestDBBasics.TestInsertOnEmptyDataset;
  120. begin
  121. with DBConnector.GetNDataset(0) do
  122. begin
  123. open;
  124. AssertTrue(CanModify);
  125. AssertTrue(eof);
  126. AssertTrue(bof);
  127. AssertTrue(IsEmpty);
  128. insert;
  129. AssertTrue(Bof);
  130. AssertTrue(Eof);
  131. AssertFalse(IsEmpty);
  132. post;
  133. AssertFalse(IsEmpty);
  134. AssertFalse(eof);
  135. AssertFalse(bof);
  136. end;
  137. end;
  138. procedure TTestDBBasics.TestSelectQueryBasics;
  139. var b : TFieldType;
  140. begin
  141. with DBConnector.GetNDataset(1) do
  142. begin
  143. Open;
  144. AssertEquals(1,RecNo);
  145. AssertEquals(1,RecordCount);
  146. AssertEquals(2,FieldCount);
  147. AssertTrue(CompareText('ID',fields[0].FieldName)=0);
  148. AssertTrue(CompareText('ID',fields[0].DisplayName)=0);
  149. AssertTrue('The datatype of the field ''ID'' is incorrect, it should be ftInteger',ftInteger=fields[0].DataType);
  150. AssertTrue(CompareText('NAME',fields[1].FieldName)=0);
  151. AssertTrue(CompareText('NAME',fields[1].DisplayName)=0);
  152. AssertTrue(ftString=fields[1].DataType);
  153. AssertEquals(1,fields[0].Value);
  154. AssertEquals('TestName1',fields[1].Value);
  155. Close;
  156. end;
  157. end;
  158. procedure TTestDBBasics.TestPostOnlyInEditState;
  159. begin
  160. with DBConnector.GetNDataset(1) do
  161. begin
  162. open;
  163. AssertException('Post was called in a non-edit state',EDatabaseError,Post);
  164. end;
  165. end;
  166. procedure TTestDBBasics.TestMove;
  167. var i,count : integer;
  168. aDatasource : TDataSource;
  169. aDatalink : TDataLink;
  170. ABufferCount : Integer;
  171. begin
  172. aDatasource := TDataSource.Create(nil);
  173. aDatalink := TTestDataLink.Create;
  174. aDatalink.DataSource := aDatasource;
  175. ABufferCount := 11;
  176. aDatalink.BufferCount := ABufferCount;
  177. DataEvents := '';
  178. for count := 0 to 32 do
  179. begin
  180. aDatasource.DataSet := DBConnector.GetNDataset(count);
  181. with aDatasource.Dataset do
  182. begin
  183. i := 1;
  184. Open;
  185. AssertEquals('deUpdateState:0;',DataEvents);
  186. DataEvents := '';
  187. while not EOF do
  188. begin
  189. AssertEquals(i,fields[0].AsInteger);
  190. AssertEquals('TestName'+inttostr(i),fields[1].AsString);
  191. inc(i);
  192. Next;
  193. if (i > ABufferCount) and not EOF then
  194. AssertEquals('deCheckBrowseMode:0;deDataSetScroll:-1;',DataEvents)
  195. else
  196. AssertEquals('deCheckBrowseMode:0;deDataSetScroll:0;',DataEvents);
  197. DataEvents := '';
  198. end;
  199. AssertEquals(count,i-1);
  200. close;
  201. AssertEquals('deUpdateState:0;',DataEvents);
  202. DataEvents := '';
  203. end;
  204. end;
  205. end;
  206. procedure TTestDBBasics.TestdeFieldListChange;
  207. var i,count : integer;
  208. aDatasource : TDataSource;
  209. aDatalink : TDataLink;
  210. ds : TDataset;
  211. begin
  212. aDatasource := TDataSource.Create(nil);
  213. aDatalink := TTestDataLink.Create;
  214. aDatalink.DataSource := aDatasource;
  215. ds := DBConnector.GetNDataset(1);
  216. with ds do
  217. begin
  218. aDatasource.DataSet := ds;
  219. DataEvents := '';
  220. open;
  221. Fields.add(tfield.Create(DBConnector.GetNDataset(1)));
  222. AssertEquals('deUpdateState:0;deFieldListChange:0;',DataEvents);
  223. DataEvents := '';
  224. fields.Clear;
  225. AssertEquals('deFieldListChange:0;',DataEvents)
  226. end;
  227. aDatasource.Free;
  228. aDatalink.Free;
  229. end;
  230. procedure TTestDBBasics.TestActiveBufferWhenClosed;
  231. begin
  232. with DBConnector.GetNDataset(0) do
  233. begin
  234. AssertNull(ActiveBuffer);
  235. open;
  236. AssertFalse('Activebuffer of an empty dataset shouldn''t be nil',ActiveBuffer = nil);
  237. end;
  238. end;
  239. procedure TTestDBBasics.TestEOFBOFClosedDataset;
  240. begin
  241. with DBConnector.GetNDataset(1) do
  242. begin
  243. AssertTrue(EOF);
  244. AssertTrue(BOF);
  245. open;
  246. close;
  247. AssertTrue(EOF);
  248. AssertTrue(BOF);
  249. end;
  250. end;
  251. procedure TTestDBBasics.TestDataEventsResync;
  252. var i,count : integer;
  253. aDatasource : TDataSource;
  254. aDatalink : TDataLink;
  255. ds : tdataset;
  256. begin
  257. aDatasource := TDataSource.Create(nil);
  258. aDatalink := TTestDataLink.Create;
  259. aDatalink.DataSource := aDatasource;
  260. ds := DBConnector.GetNDataset(6);
  261. ds.BeforeScroll := DBConnector.DataEvent;
  262. with ds do
  263. begin
  264. aDatasource.DataSet := ds;
  265. open;
  266. DataEvents := '';
  267. Resync([rmExact]);
  268. AssertEquals('deDataSetChange:0;',DataEvents);
  269. DataEvents := '';
  270. next;
  271. AssertEquals('deCheckBrowseMode:0;DataEvent;deDataSetScroll:0;',DataEvents);
  272. close;
  273. end;
  274. aDatasource.Free;
  275. aDatalink.Free;
  276. end;
  277. procedure TTestDBBasics.TestLastAppendCancel;
  278. var count : integer;
  279. begin
  280. for count := 0 to 32 do with DBConnector.GetNDataset(count) do
  281. begin
  282. open;
  283. Last;
  284. Append;
  285. Cancel;
  286. AssertEquals(count,fields[0].asinteger);
  287. AssertEquals(count,RecordCount);
  288. Close;
  289. end;
  290. end;
  291. procedure TTestDBBasics.TestRecNo;
  292. var i : longint;
  293. passed : boolean;
  294. begin
  295. with DBConnector.GetNDataset(0) do
  296. begin
  297. // Accessing RecNo on a closed dataset should raise an EDatabaseError or should
  298. // return 0
  299. passed := false;
  300. try
  301. i := recno;
  302. except on E: Exception do
  303. begin
  304. passed := E.classname = EDatabaseError.className
  305. end;
  306. end;
  307. if not passed then
  308. AssertEquals('Failed to get the RecNo from a closed dataset',0,RecNo);
  309. // Accessing Recordcount on a closed dataset should raise an EDatabaseError or should
  310. // return 0
  311. passed := false;
  312. try
  313. i := recordcount;
  314. except on E: Exception do
  315. begin
  316. passed := E.classname = EDatabaseError.className
  317. end;
  318. end;
  319. if not passed then
  320. AssertEquals('Failed to get the Recordcount from a closed dataset',0,RecNo);
  321. Open;
  322. AssertEquals(0,RecordCount);
  323. AssertEquals(0,RecNo);
  324. first;
  325. AssertEquals(0,RecordCount);
  326. AssertEquals(0,RecNo);
  327. last;
  328. AssertEquals(0,RecordCount);
  329. AssertEquals(0,RecNo);
  330. append;
  331. AssertEquals(0,RecNo);
  332. AssertEquals(0,RecordCount);
  333. first;
  334. AssertEquals(0,RecNo);
  335. AssertEquals(0,RecordCount);
  336. append;
  337. FieldByName('id').AsInteger := 1;
  338. AssertEquals(0,RecNo);
  339. AssertEquals(0,RecordCount);
  340. first;
  341. AssertEquals(1,RecNo);
  342. AssertEquals(1,RecordCount);
  343. last;
  344. AssertEquals(1,RecNo);
  345. AssertEquals(1,RecordCount);
  346. append;
  347. FieldByName('id').AsInteger := 1;
  348. AssertEquals(0,RecNo);
  349. AssertEquals(1,RecordCount);
  350. Close;
  351. end;
  352. end;
  353. procedure TTestDBBasics.TestSetRecNo;
  354. begin
  355. with DBConnector.GetNDataset(15) do
  356. begin
  357. Open;
  358. RecNo := 1;
  359. AssertEquals(1,fields[0].AsInteger);
  360. AssertEquals(1,RecNo);
  361. RecNo := 2;
  362. AssertEquals(2,fields[0].AsInteger);
  363. AssertEquals(2,RecNo);
  364. RecNo := 8;
  365. AssertEquals(8,fields[0].AsInteger);
  366. AssertEquals(8,RecNo);
  367. RecNo := 15;
  368. AssertEquals(15,fields[0].AsInteger);
  369. AssertEquals(15,RecNo);
  370. RecNo := 3;
  371. AssertEquals(3,fields[0].AsInteger);
  372. AssertEquals(3,RecNo);
  373. RecNo := 14;
  374. AssertEquals(14,fields[0].AsInteger);
  375. AssertEquals(14,RecNo);
  376. RecNo := 15;
  377. AssertEquals(15,fields[0].AsInteger);
  378. AssertEquals(15,RecNo);
  379. // test for exceptions...
  380. { RecNo := 16;
  381. AssertEquals(15,fields[0].AsInteger);
  382. AssertEquals(15,RecNo);}
  383. Close;
  384. end;
  385. end;
  386. procedure TTestDBBasics.TestRequired;
  387. begin
  388. with DBConnector.GetNDataset(2) do
  389. begin
  390. Open;
  391. FieldByName('ID').Required := True;
  392. Append;
  393. AssertException(EDatabaseError,Post);
  394. FieldByName('ID').AsInteger := 1000;
  395. Post;
  396. Close;
  397. end;
  398. end;
  399. procedure TTestDBBasics.SetUp;
  400. begin
  401. DBConnector.StartTest;
  402. end;
  403. procedure TTestDBBasics.TearDown;
  404. begin
  405. DBConnector.StopTest;
  406. end;
  407. procedure TTestDBBasics.TestBookmarks;
  408. var BM1,BM2,BM3,BM4,BM5 : TBookmark;
  409. begin
  410. with DBConnector.GetNDataset(true,14) do
  411. begin
  412. AssertNull(GetBookmark);
  413. open;
  414. BM1:=GetBookmark; // id=1, BOF
  415. next;next;
  416. BM2:=GetBookmark; // id=3
  417. next;next;next;
  418. BM3:=GetBookmark; // id=6
  419. next;next;next;next;next;next;next;next;
  420. BM4:=GetBookmark; // id=14
  421. next;
  422. BM5:=GetBookmark; // id=14, EOF
  423. GotoBookmark(BM2);
  424. AssertEquals(3,FieldByName('id').AsInteger);
  425. GotoBookmark(BM1);
  426. AssertEquals(1,FieldByName('id').AsInteger);
  427. GotoBookmark(BM3);
  428. AssertEquals(6,FieldByName('id').AsInteger);
  429. GotoBookmark(BM4);
  430. AssertEquals(14,FieldByName('id').AsInteger);
  431. GotoBookmark(BM3);
  432. AssertEquals(6,FieldByName('id').AsInteger);
  433. GotoBookmark(BM5);
  434. AssertEquals(14,FieldByName('id').AsInteger);
  435. GotoBookmark(BM1);
  436. AssertEquals(1,FieldByName('id').AsInteger);
  437. next;
  438. delete;
  439. GotoBookmark(BM2);
  440. AssertEquals(3,FieldByName('id').AsInteger);
  441. delete;delete;
  442. GotoBookmark(BM3);
  443. AssertEquals(6,FieldByName('id').AsInteger);
  444. GotoBookmark(BM1);
  445. AssertEquals(1,FieldByName('id').AsInteger);
  446. insert;
  447. fieldbyname('id').AsInteger:=20;
  448. insert;
  449. fieldbyname('id').AsInteger:=21;
  450. insert;
  451. fieldbyname('id').AsInteger:=22;
  452. insert;
  453. fieldbyname('id').AsInteger:=23;
  454. post;
  455. GotoBookmark(BM3);
  456. AssertEquals(6,FieldByName('id').AsInteger);
  457. GotoBookmark(BM1);
  458. AssertEquals(1,FieldByName('id').AsInteger);
  459. GotoBookmark(BM5);
  460. AssertEquals(14,FieldByName('id').AsInteger);
  461. end;
  462. end;
  463. procedure TTestDBBasics.TestFirst;
  464. var i : integer;
  465. begin
  466. with DBConnector.GetNDataset(true,14) do
  467. begin
  468. open;
  469. AssertEquals(1,FieldByName('ID').AsInteger);
  470. First;
  471. AssertEquals(1,FieldByName('ID').AsInteger);
  472. next;
  473. AssertEquals(2,FieldByName('ID').AsInteger);
  474. First;
  475. AssertEquals(1,FieldByName('ID').AsInteger);
  476. for i := 0 to 12 do
  477. next;
  478. AssertEquals(14,FieldByName('ID').AsInteger);
  479. First;
  480. AssertEquals(1,FieldByName('ID').AsInteger);
  481. close;
  482. end;
  483. end;
  484. procedure TTestDBBasics.TestDelete1;
  485. begin
  486. FTestDelete1(false);
  487. end;
  488. procedure TTestDBBasics.TestDelete2;
  489. begin
  490. FTestDelete2(false);
  491. end;
  492. procedure TTestDBBasics.TestCancelUpdDelete1;
  493. begin
  494. FTestDelete1(true);
  495. end;
  496. procedure TTestDBBasics.TestCancelUpdDelete2;
  497. begin
  498. FTestDelete2(true);
  499. end;
  500. procedure TTestDBBasics.FTestDelete1(TestCancelUpdate : boolean);
  501. // Test the deletion of records, including the first and the last one
  502. var i : integer;
  503. ds : TDataset;
  504. begin
  505. ds := DBConnector.GetNDataset(true,17);
  506. with ds do
  507. begin
  508. Open;
  509. for i := 0 to 16 do if i mod 4=0 then
  510. delete
  511. else
  512. next;
  513. First;
  514. for i := 0 to 16 do
  515. begin
  516. if i mod 4<>0 then
  517. begin
  518. AssertEquals(i+1,FieldByName('ID').AsInteger);
  519. AssertEquals('TestName'+inttostr(i+1),FieldByName('NAME').AsString);
  520. next;
  521. end;
  522. end;
  523. end;
  524. if TestCancelUpdate then
  525. begin
  526. if not (ds is TBufDataset) then
  527. Ignore('This test only applies to TBufDataset and descendents.');
  528. with TBufDataset(ds) do
  529. begin
  530. CancelUpdates;
  531. First;
  532. for i := 0 to 16 do
  533. begin
  534. AssertEquals(i+1,FieldByName('ID').AsInteger);
  535. AssertEquals('TestName'+inttostr(i+1),FieldByName('NAME').AsString);
  536. next;
  537. end;
  538. close;
  539. end;
  540. end;
  541. end;
  542. procedure TTestDBBasics.FTestDelete2(TestCancelUpdate : boolean);
  543. // Test the deletion of edited and appended records
  544. var i : integer;
  545. ds : TDataset;
  546. begin
  547. ds := DBConnector.GetNDataset(true,17);
  548. with ds do
  549. begin
  550. Open;
  551. for i := 0 to 16 do
  552. begin
  553. if i mod 4=0 then
  554. begin
  555. edit;
  556. fieldbyname('name').AsString:='this record will be gone soon';
  557. post;
  558. end;
  559. next;
  560. end;
  561. for i := 17 to 20 do
  562. begin
  563. append;
  564. fieldbyname('id').AsInteger:=i+1;
  565. fieldbyname('name').AsString:='TestName'+inttostr(i+1);
  566. post;
  567. end;
  568. first;
  569. for i := 0 to 20 do if i mod 4=0 then
  570. delete
  571. else
  572. next;
  573. First;
  574. i := 0;
  575. for i := 0 to 20 do
  576. begin
  577. if i mod 4<>0 then
  578. begin
  579. AssertEquals(i+1,FieldByName('ID').AsInteger);
  580. AssertEquals('TestName'+inttostr(i+1),FieldByName('NAME').AsString);
  581. next;
  582. end;
  583. end;
  584. end;
  585. if TestCancelUpdate then
  586. begin
  587. if not (ds is TBufDataset) then
  588. Ignore('This test only applies to TBufDataset and descendents.');
  589. with TBufDataset(ds) do
  590. begin
  591. CancelUpdates;
  592. First;
  593. for i := 0 to 16 do
  594. begin
  595. AssertEquals(i+1,FieldByName('ID').AsInteger);
  596. AssertEquals('TestName'+inttostr(i+1),FieldByName('NAME').AsString);
  597. next;
  598. end;
  599. close;
  600. end;
  601. end;
  602. end;
  603. procedure TTestDBBasics.TestOnFilterProc(DataSet: TDataSet; var Accept: Boolean);
  604. var a : TDataSetState;
  605. begin
  606. Accept := odd(Dataset.FieldByName('ID').AsInteger);
  607. end;
  608. procedure TTestDBBasics.TestOnFilter;
  609. var tel : byte;
  610. begin
  611. with DBConnector.GetNDataset(15) do
  612. begin
  613. OnFilterRecord := TestOnFilterProc;
  614. Filtered := True;
  615. Open;
  616. for tel := 1 to 8 do
  617. begin
  618. AssertTrue(odd(FieldByName('ID').asinteger));
  619. next;
  620. end;
  621. AssertTrue(EOF);
  622. end;
  623. end;
  624. procedure TTestDBBasics.TestIntFilter;
  625. var tel : byte;
  626. begin
  627. with DBConnector.GetNDataset(15) do
  628. begin
  629. Filtered := True;
  630. Filter := '(id>4) and (id<9)';
  631. Open;
  632. for tel := 5 to 8 do
  633. begin
  634. AssertEquals(tel,FieldByName('ID').asinteger);
  635. next;
  636. end;
  637. AssertTrue(EOF);
  638. Close;
  639. end;
  640. end;
  641. procedure TTestDBBasics.TestRecordcountAfterReopen;
  642. var
  643. datalink1: tdatalink;
  644. datasource1: tdatasource;
  645. query1: TDataSet;
  646. begin
  647. query1:= DBConnector.GetNDataset(11);
  648. datalink1:= TDataLink.create;
  649. datasource1:= tdatasource.create(nil);
  650. try
  651. datalink1.datasource:= datasource1;
  652. datasource1.dataset:= query1;
  653. query1.active := true;
  654. query1.active := False;
  655. AssertEquals(0, THackDataLink(datalink1).RecordCount);
  656. query1.active := true;
  657. AssertTrue(THackDataLink(datalink1).RecordCount>0);
  658. query1.active := false;
  659. finally
  660. datalink1.free;
  661. datasource1.free;
  662. end;
  663. end;
  664. procedure TTestDBBasics.TestStringFilter;
  665. var tel : byte;
  666. begin
  667. with DBConnector.GetNDataset(15) do
  668. begin
  669. Open;
  670. //FilterOptions := [foNoPartialCompare];
  671. //FilterOptions := [];
  672. Filter := '(name=''*Name3'')';
  673. Filtered := True;
  674. AssertFalse(EOF);
  675. AssertEquals(3,FieldByName('ID').asinteger);
  676. AssertEquals('TestName3',FieldByName('NAME').asstring);
  677. next;
  678. AssertTrue(EOF);
  679. Close;
  680. end;
  681. end;
  682. procedure TTestDBBasics.TestAddIndexFieldType(AFieldType: TFieldType; ActiveDS : boolean);
  683. var ds : TBufDataset;
  684. FList : TStringList;
  685. LastValue : Variant;
  686. begin
  687. ds := DBConnector.GetFieldDataset as TBufDataset;
  688. with ds do
  689. begin
  690. if not ActiveDS then
  691. begin
  692. AddIndex('testindex','F'+FieldTypeNames[AfieldType]);
  693. IndexName:='testindex';
  694. end
  695. else
  696. MaxIndexesCount := 3;
  697. try
  698. open;
  699. except
  700. if not assigned(ds.FindField('F'+FieldTypeNames[AfieldType])) then
  701. Ignore('Fields of the type ' + FieldTypeNames[AfieldType] + ' are not supported by this type of dataset')
  702. else
  703. raise;
  704. end;
  705. if ActiveDS then
  706. begin
  707. if not assigned(ds.FindField('F'+FieldTypeNames[AfieldType])) then
  708. Ignore('Fields of the type ' + FieldTypeNames[AfieldType] + ' are not supported by this type of dataset');
  709. AddIndex('testindex','F'+FieldTypeNames[AfieldType]);
  710. IndexName:='testindex';
  711. First;
  712. end;
  713. LastValue:=null;
  714. while not eof do
  715. begin
  716. AssertTrue(LastValue<=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant);
  717. LastValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant;
  718. Next;
  719. end;
  720. while not bof do
  721. begin
  722. AssertTrue(LastValue>=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant);
  723. LastValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant;
  724. Prior;
  725. end;
  726. end;
  727. end;
  728. procedure TTestDBBasics.TestAddIndexSmallInt;
  729. begin
  730. TestAddIndexFieldType(ftSmallint,False);
  731. end;
  732. procedure TTestDBBasics.TestAddIndexBoolean;
  733. begin
  734. TestAddIndexFieldType(ftBoolean,False);
  735. end;
  736. procedure TTestDBBasics.TestAddIndexFloat;
  737. begin
  738. TestAddIndexFieldType(ftFloat,False);
  739. end;
  740. procedure TTestDBBasics.TestAddIndexInteger;
  741. begin
  742. TestAddIndexFieldType(ftInteger,False);
  743. end;
  744. procedure TTestDBBasics.TestAddIndexLargeInt;
  745. begin
  746. TestAddIndexFieldType(ftLargeint,False);
  747. end;
  748. procedure TTestDBBasics.TestAddIndexDateTime;
  749. begin
  750. TestAddIndexFieldType(ftDateTime,False);
  751. end;
  752. procedure TTestDBBasics.TestAddIndexCurrency;
  753. begin
  754. TestAddIndexFieldType(ftCurrency,False);
  755. end;
  756. procedure TTestDBBasics.TestAddIndexBCD;
  757. begin
  758. TestAddIndexFieldType(ftBCD,False);
  759. end;
  760. procedure TTestDBBasics.TestAddIndex;
  761. var ds : TBufDataset;
  762. AFieldType : TFieldType;
  763. FList : TStringList;
  764. i : integer;
  765. begin
  766. ds := DBConnector.GetFieldDataset as TBufDataset;
  767. with ds do
  768. begin
  769. AFieldType:=ftString;
  770. AddIndex('testindex','F'+FieldTypeNames[AfieldType]);
  771. FList := TStringList.Create;
  772. FList.Sorted:=true;
  773. FList.CaseSensitive:=True;
  774. FList.Duplicates:=dupAccept;
  775. open;
  776. while not eof do
  777. begin
  778. flist.Add(FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
  779. Next;
  780. end;
  781. IndexName:='testindex';
  782. first;
  783. i:=0;
  784. while not eof do
  785. begin
  786. AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
  787. inc(i);
  788. Next;
  789. end;
  790. while not bof do
  791. begin
  792. dec(i);
  793. AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
  794. Prior;
  795. end;
  796. end;
  797. end;
  798. procedure TTestDBBasics.TestInactSwitchIndex;
  799. // Test if the default-index is properly build when the active index is not
  800. // the default-index while opening then dataset
  801. var ds : TBufDataset;
  802. AFieldType : TFieldType;
  803. i : integer;
  804. begin
  805. ds := DBConnector.GetFieldDataset as TBufDataset;
  806. with ds do
  807. begin
  808. AFieldType:=ftString;
  809. AddIndex('testindex','F'+FieldTypeNames[AfieldType]);
  810. IndexName:='testindex';
  811. open;
  812. IndexName:=''; // This should set the default index (default_order)
  813. first;
  814. i := 0;
  815. while not eof do
  816. begin
  817. AssertEquals(testStringValues[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
  818. inc(i);
  819. Next;
  820. end;
  821. end;
  822. end;
  823. procedure TTestDBBasics.TestAddIndexActiveDS;
  824. var ds : TBufDataset;
  825. I : integer;
  826. begin
  827. TestAddIndexFieldType(ftString,true);
  828. end;
  829. procedure TTestDBBasics.TestAddIndexEditDS;
  830. var ds : TBufDataset;
  831. I : integer;
  832. LastValue : String;
  833. begin
  834. ds := DBConnector.GetNDataset(True,5) as TBufDataset;
  835. with ds do
  836. begin
  837. MaxIndexesCount:=3;
  838. open;
  839. edit;
  840. FieldByName('name').asstring := 'Zz';
  841. post;
  842. next;
  843. next;
  844. edit;
  845. FieldByName('name').asstring := 'aA';
  846. post;
  847. AddIndex('test','name');
  848. first;
  849. ds.IndexName:='test';
  850. first;
  851. LastValue:=FieldByName('name').AsString;
  852. while not eof do
  853. begin
  854. AssertTrue(LastValue<=FieldByName('name').AsString);
  855. Next;
  856. end;
  857. end;
  858. end;
  859. procedure TTestDBBasics.TestIndexFieldNamesAct;
  860. var ds : TBufDataset;
  861. AFieldType : TFieldType;
  862. FList : TStringList;
  863. i : integer;
  864. begin
  865. ds := DBConnector.GetFieldDataset as TBufDataset;
  866. with ds do
  867. begin
  868. AFieldType:=ftString;
  869. FList := TStringList.Create;
  870. FList.Sorted:=true;
  871. FList.CaseSensitive:=True;
  872. FList.Duplicates:=dupAccept;
  873. open;
  874. while not eof do
  875. begin
  876. flist.Add(FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
  877. Next;
  878. end;
  879. IndexFieldNames:='F'+FieldTypeNames[AfieldType];
  880. first;
  881. i:=0;
  882. while not eof do
  883. begin
  884. AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
  885. inc(i);
  886. Next;
  887. end;
  888. while not bof do
  889. begin
  890. dec(i);
  891. AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
  892. Prior;
  893. end;
  894. AssertEquals('F'+FieldTypeNames[AfieldType],IndexFieldNames);
  895. IndexFieldNames:='ID';
  896. first;
  897. i:=0;
  898. while not eof do
  899. begin
  900. AssertEquals(testStringValues[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
  901. inc(i);
  902. Next;
  903. end;
  904. AssertEquals('ID',IndexFieldNames);
  905. IndexFieldNames:='';
  906. first;
  907. i:=0;
  908. while not eof do
  909. begin
  910. AssertEquals(testStringValues[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
  911. inc(i);
  912. Next;
  913. end;
  914. AssertEquals('',IndexFieldNames);
  915. end;
  916. end;
  917. procedure TTestDBBasics.TestIndexFieldNames;
  918. var ds : TBufDataset;
  919. AFieldType : TFieldType;
  920. PrevValue : String;
  921. begin
  922. ds := DBConnector.GetFieldDataset as TBufDataset;
  923. with ds do
  924. begin
  925. AFieldType:=ftString;
  926. IndexFieldNames:='F'+FieldTypeNames[AfieldType];
  927. open;
  928. PrevValue:='';
  929. while not eof do
  930. begin
  931. AssertTrue(FieldByName('F'+FieldTypeNames[AfieldType]).AsString>=PrevValue);
  932. PrevValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsString;
  933. Next;
  934. end;
  935. AssertEquals('F'+FieldTypeNames[AfieldType],IndexFieldNames);
  936. end;
  937. end;
  938. procedure TTestDBBasics.TestcalculatedField_OnCalcfields(DataSet: TDataSet);
  939. begin
  940. case dataset.fieldbyname('ID').asinteger of
  941. 1 : dataset.fieldbyname('CALCFLD').AsInteger := 5;
  942. 2 : dataset.fieldbyname('CALCFLD').AsInteger := 70000;
  943. 3 : dataset.fieldbyname('CALCFLD').Clear;
  944. 4 : dataset.fieldbyname('CALCFLD').AsInteger := 1234;
  945. 10 : dataset.fieldbyname('CALCFLD').Clear;
  946. else
  947. dataset.fieldbyname('CALCFLD').AsInteger := 1;
  948. end;
  949. end;
  950. procedure TTestDBBasics.TestCalculatedField;
  951. var ds : TDataset;
  952. AFld1, AFld2, AFld3 : Tfield;
  953. begin
  954. ds := DBConnector.GetNDataset(5);
  955. with ds do
  956. begin
  957. AFld1 := TIntegerField.Create(ds);
  958. AFld1.FieldName := 'ID';
  959. AFld1.DataSet := ds;
  960. AFld2 := TStringField.Create(ds);
  961. AFld2.FieldName := 'NAME';
  962. AFld2.DataSet := ds;
  963. AFld3 := TIntegerField.Create(ds);
  964. AFld3.FieldName := 'CALCFLD';
  965. AFld3.DataSet := ds;
  966. Afld3.FieldKind := fkCalculated;
  967. AssertEquals(3,FieldCount);
  968. ds.OnCalcFields := TestcalculatedField_OnCalcfields;
  969. open;
  970. AssertEquals(1,FieldByName('ID').asinteger);
  971. AssertEquals(5,FieldByName('CALCFLD').asinteger);
  972. next;
  973. AssertEquals(70000,FieldByName('CALCFLD').asinteger);
  974. next;
  975. AssertEquals(true,FieldByName('CALCFLD').isnull);
  976. next;
  977. AssertEquals(1234,FieldByName('CALCFLD').AsInteger);
  978. edit;
  979. FieldByName('ID').AsInteger := 10;
  980. post;
  981. AssertEquals(true,FieldByName('CALCFLD').isnull);
  982. close;
  983. AFld1.Free;
  984. AFld2.Free;
  985. AFld3.Free;
  986. end;
  987. end;
  988. procedure TTestDBBasics.TestEofAfterFirst;
  989. begin
  990. with DBConnector.GetNDataset(0) do
  991. begin
  992. open;
  993. AssertTrue(eof);
  994. AssertTrue(BOF);
  995. first;
  996. AssertTrue(eof);
  997. AssertTrue(BOF);
  998. end;
  999. end;
  1000. procedure TTestDBBasics.TestfieldDefinition(AFieldType : TFieldType;ADatasize : integer;var ADS : TDataset; var AFld: TField);
  1001. var i : byte;
  1002. begin
  1003. ADS := DBConnector.GetFieldDataset;
  1004. ADS.Open;
  1005. AFld := ADS.FindField('F'+FieldTypeNames[AfieldType]);
  1006. if not assigned (AFld) then
  1007. Ignore('Fields of the type ' + FieldTypeNames[AfieldType] + ' are not supported by this type of dataset');
  1008. AssertTrue(Afld.DataType = AFieldType);
  1009. AssertEquals(ADatasize,Afld.DataSize );
  1010. end;
  1011. procedure TTestDBBasics.TestSupportIntegerFields;
  1012. var i : byte;
  1013. ds : TDataset;
  1014. Fld : TField;
  1015. begin
  1016. TestfieldDefinition(ftInteger,4,ds,Fld);
  1017. for i := 0 to testValuesCount-1 do
  1018. begin
  1019. AssertEquals(testIntValues[i],Fld.AsInteger);
  1020. ds.Next;
  1021. end;
  1022. ds.close;
  1023. end;
  1024. procedure TTestDBBasics.TestSupportSmallIntFields;
  1025. var i : byte;
  1026. ds : TDataset;
  1027. Fld : TField;
  1028. begin
  1029. TestfieldDefinition(ftSmallint,2,ds,Fld);
  1030. for i := 0 to testValuesCount-1 do
  1031. begin
  1032. AssertEquals(testSmallIntValues[i],Fld.AsInteger);
  1033. ds.Next;
  1034. end;
  1035. ds.close;
  1036. end;
  1037. procedure TTestDBBasics.TestSupportStringFields;
  1038. var i : byte;
  1039. ds : TDataset;
  1040. Fld : TField;
  1041. begin
  1042. TestfieldDefinition(ftString,11,ds,Fld);
  1043. for i := 0 to testValuesCount-1 do
  1044. begin
  1045. AssertEquals(testStringValues[i],Fld.AsString);
  1046. ds.Next;
  1047. end;
  1048. ds.close;
  1049. end;
  1050. procedure TTestDBBasics.TestSupportBooleanFields;
  1051. var i : byte;
  1052. ds : TDataset;
  1053. Fld : TField;
  1054. begin
  1055. TestfieldDefinition(ftBoolean,2,ds,Fld);
  1056. for i := 0 to testValuesCount-1 do
  1057. begin
  1058. AssertEquals(testBooleanValues[i],Fld.AsBoolean);
  1059. ds.Next;
  1060. end;
  1061. ds.close;
  1062. end;
  1063. procedure TTestDBBasics.TestSupportFloatFields;
  1064. var i : byte;
  1065. ds : TDataset;
  1066. Fld : TField;
  1067. begin
  1068. TestfieldDefinition(ftFloat,8,ds,Fld);
  1069. for i := 0 to testValuesCount-1 do
  1070. begin
  1071. AssertEquals(testFloatValues[i],Fld.AsFloat);
  1072. ds.Next;
  1073. end;
  1074. ds.close;
  1075. end;
  1076. procedure TTestDBBasics.TestSupportLargeIntFields;
  1077. var i : byte;
  1078. ds : TDataset;
  1079. Fld : TField;
  1080. begin
  1081. TestfieldDefinition(ftLargeint,8,ds,Fld);
  1082. for i := 0 to testValuesCount-1 do
  1083. begin
  1084. AssertEquals(testLargeIntValues[i],Fld.AsLargeInt);
  1085. ds.Next;
  1086. end;
  1087. ds.close;
  1088. end;
  1089. procedure TTestDBBasics.TestSupportDateFields;
  1090. var i : byte;
  1091. ds : TDataset;
  1092. Fld : TField;
  1093. begin
  1094. TestfieldDefinition(ftDate,8,ds,Fld);
  1095. for i := 0 to testValuesCount-1 do
  1096. begin
  1097. AssertEquals(testDateValues[i],FormatDateTime('yyyy/mm/dd',Fld.AsDateTime));
  1098. ds.Next;
  1099. end;
  1100. ds.close;
  1101. end;
  1102. procedure TTestDBBasics.TestSupportCurrencyFields;
  1103. var i : byte;
  1104. ds : TDataset;
  1105. Fld : TField;
  1106. begin
  1107. TestfieldDefinition(ftCurrency,8,ds,Fld);
  1108. for i := 0 to testValuesCount-1 do
  1109. begin
  1110. AssertEquals(testCurrencyValues[i],Fld.AsCurrency);
  1111. AssertEquals(testCurrencyValues[i],Fld.AsFloat);
  1112. ds.Next;
  1113. end;
  1114. ds.close;
  1115. end;
  1116. procedure TTestDBBasics.TestSupportBCDFields;
  1117. var i : byte;
  1118. ds : TDataset;
  1119. Fld : TField;
  1120. begin
  1121. TestfieldDefinition(ftBCD,8,ds,Fld);
  1122. for i := 0 to testValuesCount-1 do
  1123. begin
  1124. AssertEquals(testCurrencyValues[i],Fld.AsCurrency);
  1125. AssertEquals(testCurrencyValues[i],Fld.AsFloat);
  1126. ds.Next;
  1127. end;
  1128. ds.close;
  1129. end;
  1130. procedure TTestDBBasics.TestDoubleClose;
  1131. begin
  1132. with DBConnector.GetNDataset(1) do
  1133. begin
  1134. close;
  1135. close;
  1136. open;
  1137. close;
  1138. close;
  1139. end;
  1140. end;
  1141. procedure TTestDBBasics.TestAssignFieldftString;
  1142. var AParam : TParam;
  1143. AField : TField;
  1144. begin
  1145. AParam := TParam.Create(nil);
  1146. with DBConnector.GetNDataset(1) do
  1147. begin
  1148. open;
  1149. AField := fieldbyname('name');
  1150. AParam.AssignField(AField);
  1151. AssertTrue(ftString=AParam.DataType);
  1152. close;
  1153. end;
  1154. AParam.Free;
  1155. end;
  1156. procedure TTestDBBasics.TestAssignFieldftFixedChar;
  1157. var AParam : TParam;
  1158. AField : TField;
  1159. begin
  1160. AParam := TParam.Create(nil);
  1161. with DBConnector.GetNDataset(1) do
  1162. begin
  1163. open;
  1164. AField := fieldbyname('name');
  1165. (AField as tstringfield).FixedChar := true;
  1166. AParam.AssignField(AField);
  1167. AssertTrue(ftFixedChar=AParam.DataType);
  1168. close;
  1169. end;
  1170. AParam.Free;
  1171. end;
  1172. procedure TTestDBBasics.TestBufDatasetCancelUpd;
  1173. var i : byte;
  1174. begin
  1175. if not (DBConnector.GetNDataset(5) is TBufDataset) then
  1176. Ignore('This test only applies to TBufDataset and descendents.');
  1177. with DBConnector.GetNDataset(5) as TBufDataset do
  1178. begin
  1179. open;
  1180. next;
  1181. next;
  1182. edit;
  1183. FieldByName('name').AsString := 'changed';
  1184. post;
  1185. next;
  1186. delete;
  1187. CancelUpdates;
  1188. First;
  1189. for i := 1 to 5 do
  1190. begin
  1191. AssertEquals(i,fields[0].AsInteger);
  1192. AssertEquals('TestName'+inttostr(i),fields[1].AsString);
  1193. Next;
  1194. end;
  1195. end;
  1196. end;
  1197. procedure TTestDBBasics.Testbug7007;
  1198. var
  1199. datalink1: tdatalink;
  1200. datasource1: tdatasource;
  1201. query1: TDataSet;
  1202. begin
  1203. query1:= DBConnector.GetNDataset(6);
  1204. datalink1:= TTestDataLink.create;
  1205. datasource1:= tdatasource.create(nil);
  1206. try
  1207. datalink1.datasource:= datasource1;
  1208. datasource1.dataset:= query1;
  1209. datalink1.datasource:= datasource1;
  1210. DataEvents := '';
  1211. query1.open;
  1212. datalink1.buffercount:= query1.recordcount;
  1213. AssertEquals('deUpdateState:0;',DataEvents);
  1214. AssertEquals(0, datalink1.ActiveRecord);
  1215. AssertEquals(6, datalink1.RecordCount);
  1216. AssertEquals(6, query1.RecordCount);
  1217. AssertEquals(1, query1.RecNo);
  1218. DataEvents := '';
  1219. query1.append;
  1220. AssertEquals('deCheckBrowseMode:0;deUpdateState:0;deDataSetChange:0;',DataEvents);
  1221. AssertEquals(5, datalink1.ActiveRecord);
  1222. AssertEquals(6, datalink1.RecordCount);
  1223. AssertEquals(6, query1.RecordCount);
  1224. AssertTrue(query1.RecNo in [0,7]);
  1225. DataEvents := '';
  1226. query1.cancel;
  1227. AssertEquals('deCheckBrowseMode:0;deUpdateState:0;deDataSetChange:0;',DataEvents);
  1228. AssertEquals(5, datalink1.ActiveRecord);
  1229. AssertEquals(6, datalink1.RecordCount);
  1230. AssertEquals(6, query1.RecordCount);
  1231. AssertEquals(6, query1.RecNo);
  1232. finally
  1233. datalink1.free;
  1234. datasource1.free;
  1235. end;
  1236. end;
  1237. procedure TTestDBBasics.TestBug6893;
  1238. var
  1239. datalink1: tdatalink;
  1240. datasource1: tdatasource;
  1241. query1: TDataSet;
  1242. begin
  1243. query1:= DBConnector.GetNDataset(25);
  1244. datalink1:= TDataLink.create;
  1245. datasource1:= tdatasource.create(nil);
  1246. try
  1247. datalink1.datasource:= datasource1;
  1248. datasource1.dataset:= query1;
  1249. datalink1.buffercount:= 5;
  1250. query1.active := true;
  1251. query1.MoveBy(20);
  1252. AssertEquals(5, THackDataLink(datalink1).Firstrecord);
  1253. AssertEquals(4, datalink1.ActiveRecord);
  1254. AssertEquals(21, query1.RecNo);
  1255. query1.active := False;
  1256. AssertEquals(0, THackDataLink(datalink1).Firstrecord);
  1257. AssertEquals(0, datalink1.ActiveRecord);
  1258. query1.active := true;
  1259. AssertEquals(0, THackDataLink(datalink1).Firstrecord);
  1260. AssertEquals(0, datalink1.ActiveRecord);
  1261. AssertEquals(1, query1.RecNo);
  1262. finally
  1263. datalink1.free;
  1264. datasource1.free;
  1265. end;
  1266. end;
  1267. procedure TTestDBBasics.TestBufDatasetCancelUpd1;
  1268. var i : byte;
  1269. begin
  1270. if not (DBConnector.GetNDataset(5) is TBufDataset) then
  1271. Ignore('This test only applies to TBufDataset and descendents.');
  1272. with DBConnector.GetNDataset(5) as TBufDataset do
  1273. begin
  1274. open;
  1275. next;
  1276. next;
  1277. delete;
  1278. insert;
  1279. FieldByName('id').AsInteger := 100;
  1280. post;
  1281. CancelUpdates;
  1282. last;
  1283. for i := 5 downto 1 do
  1284. begin
  1285. AssertEquals(i,fields[0].AsInteger);
  1286. AssertEquals('TestName'+inttostr(i),fields[1].AsString);
  1287. Prior;
  1288. end;
  1289. end;
  1290. end;
  1291. procedure TTestDBBasics.TestNullAtOpen;
  1292. begin
  1293. with dbconnector.getndataset(0) do
  1294. begin
  1295. active:= true;
  1296. AssertTrue('Field isn''t NULL on a just-opened empty dataset',fieldbyname('id').IsNull);
  1297. append;
  1298. AssertTrue('Field isn''t NULL after append on an empty dataset',fieldbyname('id').IsNull);
  1299. fieldbyname('id').asinteger:= 123;
  1300. cancel;
  1301. AssertTrue('Field isn''t NULL after cancel',fieldbyname('id').IsNull);
  1302. end;
  1303. end;
  1304. { TSQLTestSetup }
  1305. procedure TDBBasicsTestSetup.OneTimeSetup;
  1306. begin
  1307. InitialiseDBConnector;
  1308. end;
  1309. procedure TDBBasicsTestSetup.OneTimeTearDown;
  1310. begin
  1311. FreeAndNil(DBConnector);
  1312. end;
  1313. initialization
  1314. RegisterTestDecorator(TDBBasicsTestSetup, TTestDBBasics);
  1315. end.