testdbbasics.pas 28 KB

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