testdbbasics.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962
  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. protected
  17. procedure SetUp; override;
  18. procedure TearDown; override;
  19. published
  20. procedure TestIntFilter;
  21. procedure TestOnFilter;
  22. procedure TestStringFilter;
  23. procedure TestNullAtOpen;
  24. procedure TestSupportIntegerFields;
  25. procedure TestSupportSmallIntFields;
  26. procedure TestSupportStringFields;
  27. procedure TestSupportBooleanFields;
  28. procedure TestSupportFloatFields;
  29. procedure TestSupportLargeIntFields;
  30. procedure TestSupportDateFields;
  31. procedure TestIsEmpty;
  32. procedure TestAppendOnEmptyDataset;
  33. procedure TestInsertOnEmptyDataset;
  34. procedure TestBufDatasetCancelUpd; //bug 6938
  35. procedure TestEofAfterFirst; //bug 7211
  36. procedure TestBufDatasetCancelUpd1;
  37. procedure TestDoubleClose;
  38. procedure TestCalculatedField;
  39. procedure TestAssignFieldftString;
  40. procedure TestAssignFieldftFixedChar;
  41. procedure TestSelectQueryBasics;
  42. procedure TestPostOnlyInEditState;
  43. procedure TestMove; // bug 5048
  44. procedure TestActiveBufferWhenClosed;
  45. procedure TestEOFBOFClosedDataset;
  46. procedure TestDataEventsResync;
  47. procedure TestBug7007;
  48. procedure TestBug6893;
  49. procedure TestRecordcountAfterReopen; // partly bug 8228
  50. procedure TestdeFieldListChange;
  51. procedure TestLastAppendCancel; // bug 5058
  52. procedure TestRecNo; // bug 5061
  53. procedure TestSetRecNo; // bug 6919
  54. procedure TestRequired;
  55. end;
  56. { TSQLTestSetup }
  57. TDBBasicsTestSetup = class(TTestSetup)
  58. protected
  59. procedure OneTimeSetup; override;
  60. procedure OneTimeTearDown; override;
  61. end;
  62. implementation
  63. uses toolsunit, bufdataset;
  64. type THackDataLink=class(TdataLink);
  65. procedure TTestDBBasics.TestIsEmpty;
  66. begin
  67. if not (DBConnector.GetNDataset(5) is TBufDataset) then
  68. Ignore('This test only applies to TBufDataset and descendents.');
  69. with tbufdataset(DBConnector.GetNDataset(True,1)) do
  70. begin
  71. open;
  72. delete;
  73. refresh;
  74. applyupdates;
  75. AssertTrue(IsEmpty);
  76. end;
  77. end;
  78. procedure TTestDBBasics.TestAppendOnEmptyDataset;
  79. begin
  80. with DBConnector.GetNDataset(0) do
  81. begin
  82. open;
  83. AssertTrue(CanModify);
  84. AssertTrue(eof);
  85. AssertTrue(bof);
  86. append;
  87. AssertFalse(Bof);
  88. AssertTrue(Eof);
  89. post;
  90. AssertFalse(eof);
  91. AssertFalse(bof);
  92. end;
  93. end;
  94. procedure TTestDBBasics.TestInsertOnEmptyDataset;
  95. begin
  96. with DBConnector.GetNDataset(0) do
  97. begin
  98. open;
  99. AssertTrue(CanModify);
  100. AssertTrue(eof);
  101. AssertTrue(bof);
  102. AssertTrue(IsEmpty);
  103. insert;
  104. AssertTrue(Bof);
  105. AssertTrue(Eof);
  106. AssertFalse(IsEmpty);
  107. post;
  108. AssertFalse(IsEmpty);
  109. AssertFalse(eof);
  110. AssertFalse(bof);
  111. end;
  112. end;
  113. procedure TTestDBBasics.TestSelectQueryBasics;
  114. var b : TFieldType;
  115. begin
  116. with DBConnector.GetNDataset(1) do
  117. begin
  118. Open;
  119. AssertEquals(1,RecNo);
  120. AssertEquals(1,RecordCount);
  121. AssertEquals(2,FieldCount);
  122. AssertTrue(CompareText('ID',fields[0].FieldName)=0);
  123. AssertTrue(CompareText('ID',fields[0].DisplayName)=0);
  124. AssertTrue('The datatype of the field ''ID'' is incorrect, it should be ftInteger',ftInteger=fields[0].DataType);
  125. AssertTrue(CompareText('NAME',fields[1].FieldName)=0);
  126. AssertTrue(CompareText('NAME',fields[1].DisplayName)=0);
  127. AssertTrue(ftString=fields[1].DataType);
  128. AssertEquals(1,fields[0].Value);
  129. AssertEquals('TestName1',fields[1].Value);
  130. Close;
  131. end;
  132. end;
  133. procedure TTestDBBasics.TestPostOnlyInEditState;
  134. begin
  135. with DBConnector.GetNDataset(1) do
  136. begin
  137. open;
  138. AssertException('Post was called in a non-edit state',EDatabaseError,Post);
  139. end;
  140. end;
  141. procedure TTestDBBasics.TestMove;
  142. var i,count : integer;
  143. aDatasource : TDataSource;
  144. aDatalink : TDataLink;
  145. ABufferCount : Integer;
  146. begin
  147. aDatasource := TDataSource.Create(nil);
  148. aDatalink := TTestDataLink.Create;
  149. aDatalink.DataSource := aDatasource;
  150. ABufferCount := 11;
  151. aDatalink.BufferCount := ABufferCount;
  152. DataEvents := '';
  153. for count := 0 to 32 do
  154. begin
  155. aDatasource.DataSet := DBConnector.GetNDataset(count);
  156. with aDatasource.Dataset do
  157. begin
  158. i := 1;
  159. Open;
  160. AssertEquals('deUpdateState:0;',DataEvents);
  161. DataEvents := '';
  162. while not EOF do
  163. begin
  164. AssertEquals(i,fields[0].AsInteger);
  165. AssertEquals('TestName'+inttostr(i),fields[1].AsString);
  166. inc(i);
  167. Next;
  168. if (i > ABufferCount) and not EOF then
  169. AssertEquals('deCheckBrowseMode:0;deDataSetScroll:-1;',DataEvents)
  170. else
  171. AssertEquals('deCheckBrowseMode:0;deDataSetScroll:0;',DataEvents);
  172. DataEvents := '';
  173. end;
  174. AssertEquals(count,i-1);
  175. close;
  176. AssertEquals('deUpdateState:0;',DataEvents);
  177. DataEvents := '';
  178. end;
  179. end;
  180. end;
  181. procedure TTestDBBasics.TestdeFieldListChange;
  182. var i,count : integer;
  183. aDatasource : TDataSource;
  184. aDatalink : TDataLink;
  185. ds : TDataset;
  186. begin
  187. aDatasource := TDataSource.Create(nil);
  188. aDatalink := TTestDataLink.Create;
  189. aDatalink.DataSource := aDatasource;
  190. ds := DBConnector.GetNDataset(1);
  191. with ds do
  192. begin
  193. aDatasource.DataSet := ds;
  194. DataEvents := '';
  195. open;
  196. Fields.add(tfield.Create(DBConnector.GetNDataset(1)));
  197. AssertEquals('deUpdateState:0;deFieldListChange:0;',DataEvents);
  198. DataEvents := '';
  199. fields.Clear;
  200. AssertEquals('deFieldListChange:0;',DataEvents)
  201. end;
  202. aDatasource.Free;
  203. aDatalink.Free;
  204. end;
  205. procedure TTestDBBasics.TestActiveBufferWhenClosed;
  206. begin
  207. with DBConnector.GetNDataset(0) do
  208. begin
  209. AssertNull(ActiveBuffer);
  210. open;
  211. AssertFalse('Activebuffer of an empty dataset shouldn''t be nil',ActiveBuffer = nil);
  212. end;
  213. end;
  214. procedure TTestDBBasics.TestEOFBOFClosedDataset;
  215. begin
  216. with DBConnector.GetNDataset(1) do
  217. begin
  218. AssertTrue(EOF);
  219. AssertTrue(BOF);
  220. open;
  221. close;
  222. AssertTrue(EOF);
  223. AssertTrue(BOF);
  224. end;
  225. end;
  226. procedure TTestDBBasics.TestDataEventsResync;
  227. var i,count : integer;
  228. aDatasource : TDataSource;
  229. aDatalink : TDataLink;
  230. ds : tdataset;
  231. begin
  232. aDatasource := TDataSource.Create(nil);
  233. aDatalink := TTestDataLink.Create;
  234. aDatalink.DataSource := aDatasource;
  235. ds := DBConnector.GetNDataset(6);
  236. ds.BeforeScroll := DBConnector.DataEvent;
  237. with ds do
  238. begin
  239. aDatasource.DataSet := ds;
  240. open;
  241. DataEvents := '';
  242. Resync([rmExact]);
  243. AssertEquals('deDataSetChange:0;',DataEvents);
  244. DataEvents := '';
  245. next;
  246. AssertEquals('deCheckBrowseMode:0;DataEvent;deDataSetScroll:0;',DataEvents);
  247. close;
  248. end;
  249. aDatasource.Free;
  250. aDatalink.Free;
  251. end;
  252. procedure TTestDBBasics.TestLastAppendCancel;
  253. var count : integer;
  254. begin
  255. for count := 0 to 32 do with DBConnector.GetNDataset(count) do
  256. begin
  257. open;
  258. Last;
  259. Append;
  260. Cancel;
  261. AssertEquals(count,fields[0].asinteger);
  262. AssertEquals(count,RecordCount);
  263. Close;
  264. end;
  265. end;
  266. procedure TTestDBBasics.TestRecNo;
  267. var i : longint;
  268. passed : boolean;
  269. begin
  270. with DBConnector.GetNDataset(0) do
  271. begin
  272. // Accessing RecNo on a closed dataset should raise an EDatabaseError or should
  273. // return 0
  274. passed := false;
  275. try
  276. i := recno;
  277. except on E: Exception do
  278. begin
  279. passed := E.classname = EDatabaseError.className
  280. end;
  281. end;
  282. if not passed then
  283. AssertEquals('Failed to get the RecNo from a closed dataset',0,RecNo);
  284. // Accessing Recordcount on a closed dataset should raise an EDatabaseError or should
  285. // return 0
  286. passed := false;
  287. try
  288. i := recordcount;
  289. except on E: Exception do
  290. begin
  291. passed := E.classname = EDatabaseError.className
  292. end;
  293. end;
  294. if not passed then
  295. AssertEquals('Failed to get the Recordcount from a closed dataset',0,RecNo);
  296. Open;
  297. AssertEquals(0,RecordCount);
  298. AssertEquals(0,RecNo);
  299. first;
  300. AssertEquals(0,RecordCount);
  301. AssertEquals(0,RecNo);
  302. last;
  303. AssertEquals(0,RecordCount);
  304. AssertEquals(0,RecNo);
  305. append;
  306. AssertEquals(0,RecNo);
  307. AssertEquals(0,RecordCount);
  308. first;
  309. AssertEquals(0,RecNo);
  310. AssertEquals(0,RecordCount);
  311. append;
  312. FieldByName('id').AsInteger := 1;
  313. AssertEquals(0,RecNo);
  314. AssertEquals(0,RecordCount);
  315. first;
  316. AssertEquals(1,RecNo);
  317. AssertEquals(1,RecordCount);
  318. last;
  319. AssertEquals(1,RecNo);
  320. AssertEquals(1,RecordCount);
  321. append;
  322. FieldByName('id').AsInteger := 1;
  323. AssertEquals(0,RecNo);
  324. AssertEquals(1,RecordCount);
  325. Close;
  326. end;
  327. end;
  328. procedure TTestDBBasics.TestSetRecNo;
  329. begin
  330. with DBConnector.GetNDataset(15) do
  331. begin
  332. Open;
  333. RecNo := 1;
  334. AssertEquals(1,fields[0].AsInteger);
  335. AssertEquals(1,RecNo);
  336. RecNo := 2;
  337. AssertEquals(2,fields[0].AsInteger);
  338. AssertEquals(2,RecNo);
  339. RecNo := 8;
  340. AssertEquals(8,fields[0].AsInteger);
  341. AssertEquals(8,RecNo);
  342. RecNo := 15;
  343. AssertEquals(15,fields[0].AsInteger);
  344. AssertEquals(15,RecNo);
  345. RecNo := 3;
  346. AssertEquals(3,fields[0].AsInteger);
  347. AssertEquals(3,RecNo);
  348. RecNo := 14;
  349. AssertEquals(14,fields[0].AsInteger);
  350. AssertEquals(14,RecNo);
  351. RecNo := 15;
  352. AssertEquals(15,fields[0].AsInteger);
  353. AssertEquals(15,RecNo);
  354. // test for exceptions...
  355. { RecNo := 16;
  356. AssertEquals(15,fields[0].AsInteger);
  357. AssertEquals(15,RecNo);}
  358. Close;
  359. end;
  360. end;
  361. procedure TTestDBBasics.TestRequired;
  362. begin
  363. with DBConnector.GetNDataset(2) do
  364. begin
  365. Open;
  366. FieldByName('ID').Required := True;
  367. Append;
  368. AssertException(EDatabaseError,Post);
  369. FieldByName('ID').AsInteger := 1000;
  370. Post;
  371. Close;
  372. end;
  373. end;
  374. procedure TTestDBBasics.SetUp;
  375. begin
  376. DBConnector.StartTest;
  377. end;
  378. procedure TTestDBBasics.TearDown;
  379. begin
  380. DBConnector.StopTest;
  381. end;
  382. procedure TTestDBBasics.TestOnFilterProc(DataSet: TDataSet; var Accept: Boolean);
  383. var a : TDataSetState;
  384. begin
  385. Accept := odd(Dataset.FieldByName('ID').AsInteger);
  386. end;
  387. procedure TTestDBBasics.TestOnFilter;
  388. var tel : byte;
  389. begin
  390. with DBConnector.GetNDataset(15) do
  391. begin
  392. OnFilterRecord := TestOnFilterProc;
  393. Filtered := True;
  394. Open;
  395. for tel := 1 to 8 do
  396. begin
  397. AssertTrue(odd(FieldByName('ID').asinteger));
  398. next;
  399. end;
  400. AssertTrue(EOF);
  401. end;
  402. end;
  403. procedure TTestDBBasics.TestIntFilter;
  404. var tel : byte;
  405. begin
  406. with DBConnector.GetNDataset(15) do
  407. begin
  408. Filtered := True;
  409. Filter := '(id>4) and (id<9)';
  410. Open;
  411. for tel := 5 to 8 do
  412. begin
  413. AssertEquals(tel,FieldByName('ID').asinteger);
  414. next;
  415. end;
  416. AssertTrue(EOF);
  417. Close;
  418. end;
  419. end;
  420. procedure TTestDBBasics.TestRecordcountAfterReopen;
  421. var
  422. datalink1: tdatalink;
  423. datasource1: tdatasource;
  424. query1: TDataSet;
  425. begin
  426. query1:= DBConnector.GetNDataset(11);
  427. datalink1:= TDataLink.create;
  428. datasource1:= tdatasource.create(nil);
  429. try
  430. datalink1.datasource:= datasource1;
  431. datasource1.dataset:= query1;
  432. query1.active := true;
  433. query1.active := False;
  434. AssertEquals(0, THackDataLink(datalink1).RecordCount);
  435. query1.active := true;
  436. AssertTrue(THackDataLink(datalink1).RecordCount>0);
  437. query1.active := false;
  438. finally
  439. datalink1.free;
  440. datasource1.free;
  441. end;
  442. end;
  443. procedure TTestDBBasics.TestStringFilter;
  444. var tel : byte;
  445. begin
  446. with DBConnector.GetNDataset(15) do
  447. begin
  448. Open;
  449. //FilterOptions := [foNoPartialCompare];
  450. //FilterOptions := [];
  451. Filter := '(name=''*Name3'')';
  452. Filtered := True;
  453. AssertFalse(EOF);
  454. AssertEquals(3,FieldByName('ID').asinteger);
  455. AssertEquals('TestName3',FieldByName('NAME').asstring);
  456. next;
  457. AssertTrue(EOF);
  458. Close;
  459. end;
  460. end;
  461. procedure TTestDBBasics.TestcalculatedField_OnCalcfields(DataSet: TDataSet);
  462. begin
  463. case dataset.fieldbyname('ID').asinteger of
  464. 1 : dataset.fieldbyname('CALCFLD').AsInteger := 5;
  465. 2 : dataset.fieldbyname('CALCFLD').AsInteger := 70000;
  466. 3 : dataset.fieldbyname('CALCFLD').Clear;
  467. 4 : dataset.fieldbyname('CALCFLD').AsInteger := 1234;
  468. 10 : dataset.fieldbyname('CALCFLD').Clear;
  469. else
  470. dataset.fieldbyname('CALCFLD').AsInteger := 1;
  471. end;
  472. end;
  473. procedure TTestDBBasics.TestCalculatedField;
  474. var ds : TDataset;
  475. AFld1, AFld2, AFld3 : Tfield;
  476. begin
  477. ds := DBConnector.GetNDataset(5);
  478. with ds do
  479. begin
  480. AFld1 := TIntegerField.Create(ds);
  481. AFld1.FieldName := 'ID';
  482. AFld1.DataSet := ds;
  483. AFld2 := TStringField.Create(ds);
  484. AFld2.FieldName := 'NAME';
  485. AFld2.DataSet := ds;
  486. AFld3 := TIntegerField.Create(ds);
  487. AFld3.FieldName := 'CALCFLD';
  488. AFld3.DataSet := ds;
  489. Afld3.FieldKind := fkCalculated;
  490. AssertEquals(3,FieldCount);
  491. ds.OnCalcFields := TestcalculatedField_OnCalcfields;
  492. open;
  493. AssertEquals(1,FieldByName('ID').asinteger);
  494. AssertEquals(5,FieldByName('CALCFLD').asinteger);
  495. next;
  496. AssertEquals(70000,FieldByName('CALCFLD').asinteger);
  497. next;
  498. AssertEquals(true,FieldByName('CALCFLD').isnull);
  499. next;
  500. AssertEquals(1234,FieldByName('CALCFLD').AsInteger);
  501. edit;
  502. FieldByName('ID').AsInteger := 10;
  503. post;
  504. AssertEquals(true,FieldByName('CALCFLD').isnull);
  505. close;
  506. AFld1.Free;
  507. AFld2.Free;
  508. AFld3.Free;
  509. end;
  510. end;
  511. procedure TTestDBBasics.TestEofAfterFirst;
  512. begin
  513. with DBConnector.GetNDataset(0) do
  514. begin
  515. open;
  516. AssertTrue(eof);
  517. AssertTrue(BOF);
  518. first;
  519. AssertTrue(eof);
  520. AssertTrue(BOF);
  521. end;
  522. end;
  523. procedure TTestDBBasics.TestfieldDefinition(AFieldType : TFieldType;ADatasize : integer;var ADS : TDataset; var AFld: TField);
  524. var i : byte;
  525. begin
  526. ADS := DBConnector.GetFieldDataset;
  527. ADS.Open;
  528. AFld := ADS.FindField('F'+FieldTypeNames[AfieldType]);
  529. AssertNotNull('Fields of the type ' + FieldTypeNames[AfieldType] + ' are not supported by this type of dataset',AFld);
  530. AssertTrue(Afld.DataType = AFieldType);
  531. AssertEquals(ADatasize,Afld.DataSize );
  532. end;
  533. procedure TTestDBBasics.TestSupportIntegerFields;
  534. var i : byte;
  535. ds : TDataset;
  536. Fld : TField;
  537. begin
  538. TestfieldDefinition(ftInteger,4,ds,Fld);
  539. for i := 0 to testValuesCount-1 do
  540. begin
  541. AssertEquals(testIntValues[i],Fld.AsInteger);
  542. ds.Next;
  543. end;
  544. ds.close;
  545. end;
  546. procedure TTestDBBasics.TestSupportSmallIntFields;
  547. var i : byte;
  548. ds : TDataset;
  549. Fld : TField;
  550. begin
  551. TestfieldDefinition(ftSmallint,2,ds,Fld);
  552. for i := 0 to testValuesCount-1 do
  553. begin
  554. AssertEquals(testSmallIntValues[i],Fld.AsInteger);
  555. ds.Next;
  556. end;
  557. ds.close;
  558. end;
  559. procedure TTestDBBasics.TestSupportStringFields;
  560. var i : byte;
  561. ds : TDataset;
  562. Fld : TField;
  563. begin
  564. TestfieldDefinition(ftString,11,ds,Fld);
  565. for i := 0 to testValuesCount-1 do
  566. begin
  567. AssertEquals(testStringValues[i],Fld.AsString);
  568. ds.Next;
  569. end;
  570. ds.close;
  571. end;
  572. procedure TTestDBBasics.TestSupportBooleanFields;
  573. var i : byte;
  574. ds : TDataset;
  575. Fld : TField;
  576. begin
  577. TestfieldDefinition(ftBoolean,2,ds,Fld);
  578. for i := 0 to testValuesCount-1 do
  579. begin
  580. AssertEquals(testBooleanValues[i],Fld.AsBoolean);
  581. ds.Next;
  582. end;
  583. ds.close;
  584. end;
  585. procedure TTestDBBasics.TestSupportFloatFields;
  586. var i : byte;
  587. ds : TDataset;
  588. Fld : TField;
  589. begin
  590. TestfieldDefinition(ftFloat,8,ds,Fld);
  591. for i := 0 to testValuesCount-1 do
  592. begin
  593. AssertEquals(testFloatValues[i],Fld.AsFloat);
  594. ds.Next;
  595. end;
  596. ds.close;
  597. end;
  598. procedure TTestDBBasics.TestSupportLargeIntFields;
  599. var i : byte;
  600. ds : TDataset;
  601. Fld : TField;
  602. begin
  603. TestfieldDefinition(ftLargeint,8,ds,Fld);
  604. for i := 0 to testValuesCount-1 do
  605. begin
  606. AssertEquals(testLargeIntValues[i],Fld.AsLargeInt);
  607. ds.Next;
  608. end;
  609. ds.close;
  610. end;
  611. procedure TTestDBBasics.TestSupportDateFields;
  612. var i : byte;
  613. ds : TDataset;
  614. Fld : TField;
  615. begin
  616. TestfieldDefinition(ftDate,8,ds,Fld);
  617. for i := 0 to testValuesCount-1 do
  618. begin
  619. AssertEquals(testDateValues[i],FormatDateTime('yyyy/mm/dd',Fld.AsDateTime));
  620. ds.Next;
  621. end;
  622. ds.close;
  623. end;
  624. procedure TTestDBBasics.TestDoubleClose;
  625. begin
  626. with DBConnector.GetNDataset(1) do
  627. begin
  628. close;
  629. close;
  630. open;
  631. close;
  632. close;
  633. end;
  634. end;
  635. procedure TTestDBBasics.TestAssignFieldftString;
  636. var AParam : TParam;
  637. AField : TField;
  638. begin
  639. AParam := TParam.Create(nil);
  640. with DBConnector.GetNDataset(1) do
  641. begin
  642. open;
  643. AField := fieldbyname('name');
  644. AParam.AssignField(AField);
  645. AssertTrue(ftString=AParam.DataType);
  646. close;
  647. end;
  648. AParam.Free;
  649. end;
  650. procedure TTestDBBasics.TestAssignFieldftFixedChar;
  651. var AParam : TParam;
  652. AField : TField;
  653. begin
  654. AParam := TParam.Create(nil);
  655. with DBConnector.GetNDataset(1) do
  656. begin
  657. open;
  658. AField := fieldbyname('name');
  659. (AField as tstringfield).FixedChar := true;
  660. AParam.AssignField(AField);
  661. AssertTrue(ftFixedChar=AParam.DataType);
  662. close;
  663. end;
  664. AParam.Free;
  665. end;
  666. procedure TTestDBBasics.TestBufDatasetCancelUpd;
  667. var i : byte;
  668. begin
  669. if not (DBConnector.GetNDataset(5) is TBufDataset) then
  670. Ignore('This test only applies to TBufDataset and descendents.');
  671. with DBConnector.GetNDataset(5) as TBufDataset do
  672. begin
  673. open;
  674. next;
  675. next;
  676. edit;
  677. FieldByName('name').AsString := 'changed';
  678. post;
  679. next;
  680. delete;
  681. CancelUpdates;
  682. First;
  683. for i := 1 to 5 do
  684. begin
  685. AssertEquals(i,fields[0].AsInteger);
  686. AssertEquals('TestName'+inttostr(i),fields[1].AsString);
  687. Next;
  688. end;
  689. end;
  690. end;
  691. procedure TTestDBBasics.Testbug7007;
  692. var
  693. datalink1: tdatalink;
  694. datasource1: tdatasource;
  695. query1: TDataSet;
  696. begin
  697. query1:= DBConnector.GetNDataset(6);
  698. datalink1:= TTestDataLink.create;
  699. datasource1:= tdatasource.create(nil);
  700. try
  701. datalink1.datasource:= datasource1;
  702. datasource1.dataset:= query1;
  703. datalink1.datasource:= datasource1;
  704. DataEvents := '';
  705. query1.open;
  706. datalink1.buffercount:= query1.recordcount;
  707. AssertEquals('deUpdateState:0;',DataEvents);
  708. AssertEquals(0, datalink1.ActiveRecord);
  709. AssertEquals(6, datalink1.RecordCount);
  710. AssertEquals(6, query1.RecordCount);
  711. AssertEquals(1, query1.RecNo);
  712. DataEvents := '';
  713. query1.append;
  714. AssertEquals('deCheckBrowseMode:0;deUpdateState:0;deDataSetChange:0;',DataEvents);
  715. AssertEquals(5, datalink1.ActiveRecord);
  716. AssertEquals(6, datalink1.RecordCount);
  717. AssertEquals(6, query1.RecordCount);
  718. AssertTrue(query1.RecNo in [0,7]);
  719. DataEvents := '';
  720. query1.cancel;
  721. AssertEquals('deCheckBrowseMode:0;deUpdateState:0;deDataSetChange:0;',DataEvents);
  722. AssertEquals(5, datalink1.ActiveRecord);
  723. AssertEquals(6, datalink1.RecordCount);
  724. AssertEquals(6, query1.RecordCount);
  725. AssertEquals(6, query1.RecNo);
  726. finally
  727. datalink1.free;
  728. datasource1.free;
  729. end;
  730. end;
  731. procedure TTestDBBasics.TestBug6893;
  732. var
  733. datalink1: tdatalink;
  734. datasource1: tdatasource;
  735. query1: TDataSet;
  736. begin
  737. query1:= DBConnector.GetNDataset(25);
  738. datalink1:= TDataLink.create;
  739. datasource1:= tdatasource.create(nil);
  740. try
  741. datalink1.datasource:= datasource1;
  742. datasource1.dataset:= query1;
  743. datalink1.buffercount:= 5;
  744. query1.active := true;
  745. query1.MoveBy(20);
  746. AssertEquals(5, THackDataLink(datalink1).Firstrecord);
  747. AssertEquals(4, datalink1.ActiveRecord);
  748. AssertEquals(21, query1.RecNo);
  749. query1.active := False;
  750. AssertEquals(0, THackDataLink(datalink1).Firstrecord);
  751. AssertEquals(0, datalink1.ActiveRecord);
  752. query1.active := true;
  753. AssertEquals(0, THackDataLink(datalink1).Firstrecord);
  754. AssertEquals(0, datalink1.ActiveRecord);
  755. AssertEquals(1, query1.RecNo);
  756. finally
  757. datalink1.free;
  758. datasource1.free;
  759. end;
  760. end;
  761. procedure TTestDBBasics.TestBufDatasetCancelUpd1;
  762. var i : byte;
  763. begin
  764. if not (DBConnector.GetNDataset(5) is TBufDataset) then
  765. Ignore('This test only applies to TBufDataset and descendents.');
  766. with DBConnector.GetNDataset(5) as TBufDataset do
  767. begin
  768. open;
  769. next;
  770. next;
  771. delete;
  772. insert;
  773. FieldByName('id').AsInteger := 100;
  774. post;
  775. CancelUpdates;
  776. last;
  777. for i := 5 downto 1 do
  778. begin
  779. AssertEquals(i,fields[0].AsInteger);
  780. AssertEquals('TestName'+inttostr(i),fields[1].AsString);
  781. Prior;
  782. end;
  783. end;
  784. end;
  785. procedure TTestDBBasics.TestNullAtOpen;
  786. begin
  787. with dbconnector.getndataset(0) do
  788. begin
  789. active:= true;
  790. AssertTrue('Field isn''t NULL on a just-opened empty dataset',fieldbyname('id').IsNull);
  791. append;
  792. AssertTrue('Field isn''t NULL after append on an empty dataset',fieldbyname('id').IsNull);
  793. fieldbyname('id').asinteger:= 123;
  794. cancel;
  795. AssertTrue('Field isn''t NULL after cancel',fieldbyname('id').IsNull);
  796. end;
  797. end;
  798. { TSQLTestSetup }
  799. procedure TDBBasicsTestSetup.OneTimeSetup;
  800. begin
  801. InitialiseDBConnector;
  802. end;
  803. procedure TDBBasicsTestSetup.OneTimeTearDown;
  804. begin
  805. FreeAndNil(DBConnector);
  806. end;
  807. initialization
  808. RegisterTestDecorator(TDBBasicsTestSetup, TTestDBBasics);
  809. end.