testdbbasics.pas 36 KB

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