testdbbasics.pas 43 KB

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