testdbbasics.pas 38 KB

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