testdbbasics.pas 49 KB

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