mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-05 00:41:26 +02:00

* Added test for lookup-fields which currently fails for sqldb because TSQLQuert.Lookup isnt implemented git-svn-id: trunk@12738 -
2152 lines
50 KiB
ObjectPascal
2152 lines
50 KiB
ObjectPascal
unit TestDBBasics;
|
|
|
|
{$IFDEF FPC}
|
|
{$mode Delphi}{$H+}
|
|
{$ENDIF}
|
|
|
|
interface
|
|
|
|
uses
|
|
fpcunit, testutils, testregistry, testdecorator,
|
|
Classes, SysUtils, db;
|
|
|
|
type
|
|
|
|
{ TTestDBBasics }
|
|
|
|
TTestDBBasics = class(TTestCase)
|
|
private
|
|
procedure TestOnFilterProc(DataSet: TDataSet; var Accept: Boolean);
|
|
procedure TestfieldDefinition(AFieldType : TFieldType;ADatasize : integer;var ADS : TDataset; var AFld: TField);
|
|
procedure TestcalculatedField_OnCalcfields(DataSet: TDataSet);
|
|
|
|
procedure FTestDelete1(TestCancelUpdate : boolean);
|
|
procedure FTestDelete2(TestCancelUpdate : boolean);
|
|
procedure FTestXMLDatasetDefinition(ADataset : TDataset);
|
|
procedure TestAddIndexFieldType(AFieldType : TFieldType; ActiveDS : boolean);
|
|
protected
|
|
procedure SetUp; override;
|
|
procedure TearDown; override;
|
|
published
|
|
procedure TestFileNameProperty;
|
|
procedure TestClientDatasetAsMemDataset;
|
|
procedure TestCancelUpdDelete1;
|
|
procedure TestCancelUpdDelete2;
|
|
procedure TestSafeAsXML;
|
|
procedure TestAppendInsertRecord;
|
|
procedure TestBookmarks;
|
|
procedure TestBookmarkValid;
|
|
|
|
procedure TestLocate;
|
|
|
|
procedure TestFirst;
|
|
procedure TestDelete1;
|
|
procedure TestDelete2;
|
|
procedure TestIntFilter;
|
|
procedure TestOnFilter;
|
|
procedure TestStringFilter;
|
|
|
|
procedure TestSetFieldValues;
|
|
procedure TestGetFieldValues;
|
|
|
|
procedure TestAddIndex;
|
|
procedure TestAddDescIndex;
|
|
procedure TestAddCaseInsIndex;
|
|
procedure TestInactSwitchIndex;
|
|
|
|
procedure TestAddIndexInteger;
|
|
procedure TestAddIndexSmallInt;
|
|
procedure TestAddIndexBoolean;
|
|
procedure TestAddIndexFloat;
|
|
procedure TestAddIndexLargeInt;
|
|
procedure TestAddIndexDateTime;
|
|
procedure TestAddIndexCurrency;
|
|
procedure TestAddIndexBCD;
|
|
|
|
procedure TestAddIndexActiveDS;
|
|
procedure TestAddIndexEditDS;
|
|
|
|
procedure TestIndexFieldNames;
|
|
procedure TestIndexFieldNamesAct;
|
|
|
|
procedure TestIndexCurRecord;
|
|
|
|
procedure TestAddDblIndex;
|
|
procedure TestIndexEditRecord;
|
|
|
|
procedure TestNullAtOpen;
|
|
|
|
procedure TestSupportIntegerFields;
|
|
procedure TestSupportSmallIntFields;
|
|
procedure TestSupportStringFields;
|
|
procedure TestSupportBooleanFields;
|
|
procedure TestSupportFloatFields;
|
|
procedure TestSupportLargeIntFields;
|
|
procedure TestSupportDateFields;
|
|
procedure TestSupportCurrencyFields;
|
|
procedure TestSupportBCDFields;
|
|
procedure TestSupportFixedStringFields;
|
|
|
|
procedure TestIsEmpty;
|
|
procedure TestAppendOnEmptyDataset;
|
|
procedure TestInsertOnEmptyDataset;
|
|
|
|
procedure TestBufDatasetCancelUpd; //bug 6938
|
|
procedure TestEofAfterFirst; //bug 7211
|
|
procedure TestBufDatasetCancelUpd1;
|
|
procedure TestMultipleDeleteUpdateBuffer;
|
|
procedure TestDoubleDelete;
|
|
procedure TestDoubleClose;
|
|
procedure TestCalculatedField;
|
|
procedure TestAssignFieldftString;
|
|
procedure TestAssignFieldftFixedChar;
|
|
procedure TestSelectQueryBasics;
|
|
procedure TestPostOnlyInEditState;
|
|
procedure TestMove; // bug 5048
|
|
procedure TestActiveBufferWhenClosed;
|
|
procedure TestEOFBOFClosedDataset;
|
|
procedure TestDataEventsResync;
|
|
procedure TestBug7007;
|
|
procedure TestBug6893;
|
|
procedure TestRecordcountAfterReopen; // partly bug 8228
|
|
procedure TestdeFieldListChange;
|
|
procedure TestLastAppendCancel; // bug 5058
|
|
procedure TestRecNo; // bug 5061
|
|
procedure TestSetRecNo; // bug 6919
|
|
procedure TestRequired;
|
|
procedure TestCanModifySpecialFields;
|
|
end;
|
|
|
|
{ TSQLTestSetup }
|
|
|
|
TDBBasicsTestSetup = class(TTestSetup)
|
|
protected
|
|
procedure OneTimeSetup; override;
|
|
procedure OneTimeTearDown; override;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses toolsunit, bufdataset, variants, strutils;
|
|
|
|
type THackDataLink=class(TdataLink);
|
|
|
|
procedure TTestDBBasics.TestIsEmpty;
|
|
begin
|
|
if not (DBConnector.GetNDataset(5) is TBufDataset) then
|
|
Ignore('This test only applies to TBufDataset and descendents.');
|
|
with tbufdataset(DBConnector.GetNDataset(True,1)) do
|
|
begin
|
|
open;
|
|
delete;
|
|
refresh;
|
|
applyupdates;
|
|
AssertTrue(IsEmpty);
|
|
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAppendOnEmptyDataset;
|
|
begin
|
|
with DBConnector.GetNDataset(0) do
|
|
begin
|
|
open;
|
|
AssertTrue(CanModify);
|
|
AssertTrue(eof);
|
|
AssertTrue(bof);
|
|
append;
|
|
FieldByName('id').AsInteger:=0;
|
|
AssertFalse(Bof);
|
|
AssertTrue(Eof);
|
|
post;
|
|
AssertFalse(eof);
|
|
AssertFalse(bof);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestInsertOnEmptyDataset;
|
|
begin
|
|
with DBConnector.GetNDataset(0) do
|
|
begin
|
|
open;
|
|
AssertTrue(CanModify);
|
|
AssertTrue(eof);
|
|
AssertTrue(bof);
|
|
AssertTrue(IsEmpty);
|
|
insert;
|
|
FieldByName('id').AsInteger:=0;
|
|
AssertTrue(Bof);
|
|
AssertTrue(Eof);
|
|
AssertFalse(IsEmpty);
|
|
post;
|
|
AssertFalse(IsEmpty);
|
|
AssertFalse(eof);
|
|
AssertFalse(bof);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSelectQueryBasics;
|
|
var b : TFieldType;
|
|
begin
|
|
with DBConnector.GetNDataset(1) do
|
|
begin
|
|
Open;
|
|
|
|
AssertEquals(1,RecNo);
|
|
AssertEquals(1,RecordCount);
|
|
|
|
AssertEquals(2,FieldCount);
|
|
|
|
AssertTrue(CompareText('ID',fields[0].FieldName)=0);
|
|
AssertTrue(CompareText('ID',fields[0].DisplayName)=0);
|
|
AssertTrue('The datatype of the field ''ID'' is incorrect, it should be ftInteger',ftInteger=fields[0].DataType);
|
|
|
|
AssertTrue(CompareText('NAME',fields[1].FieldName)=0);
|
|
AssertTrue(CompareText('NAME',fields[1].DisplayName)=0);
|
|
AssertTrue(ftString=fields[1].DataType);
|
|
|
|
AssertEquals(1,fields[0].Value);
|
|
AssertEquals('TestName1',fields[1].Value);
|
|
|
|
Close;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestPostOnlyInEditState;
|
|
begin
|
|
with DBConnector.GetNDataset(1) do
|
|
begin
|
|
open;
|
|
AssertException('Post was called in a non-edit state',EDatabaseError,Post);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestMove;
|
|
var i,count : integer;
|
|
aDatasource : TDataSource;
|
|
aDatalink : TDataLink;
|
|
ABufferCount : Integer;
|
|
|
|
begin
|
|
aDatasource := TDataSource.Create(nil);
|
|
aDatalink := TTestDataLink.Create;
|
|
aDatalink.DataSource := aDatasource;
|
|
ABufferCount := 11;
|
|
aDatalink.BufferCount := ABufferCount;
|
|
DataEvents := '';
|
|
for count := 0 to 32 do
|
|
begin
|
|
aDatasource.DataSet := DBConnector.GetNDataset(count);
|
|
with aDatasource.Dataset do
|
|
begin
|
|
i := 1;
|
|
Open;
|
|
AssertEquals('deUpdateState:0;',DataEvents);
|
|
DataEvents := '';
|
|
while not EOF do
|
|
begin
|
|
AssertEquals(i,fields[0].AsInteger);
|
|
AssertEquals('TestName'+inttostr(i),fields[1].AsString);
|
|
inc(i);
|
|
|
|
Next;
|
|
if (i > ABufferCount) and not EOF then
|
|
AssertEquals('deCheckBrowseMode:0;deDataSetScroll:-1;DataSetScrolled:1;',DataEvents)
|
|
else
|
|
AssertEquals('deCheckBrowseMode:0;deDataSetScroll:0;DataSetScrolled:0;',DataEvents);
|
|
DataEvents := '';
|
|
end;
|
|
AssertEquals(count,i-1);
|
|
close;
|
|
AssertEquals('deUpdateState:0;',DataEvents);
|
|
DataEvents := '';
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestdeFieldListChange;
|
|
|
|
var i,count : integer;
|
|
aDatasource : TDataSource;
|
|
aDatalink : TDataLink;
|
|
ds : TDataset;
|
|
|
|
begin
|
|
aDatasource := TDataSource.Create(nil);
|
|
aDatalink := TTestDataLink.Create;
|
|
aDatalink.DataSource := aDatasource;
|
|
ds := DBConnector.GetNDataset(1);
|
|
with ds do
|
|
begin
|
|
aDatasource.DataSet := ds;
|
|
DataEvents := '';
|
|
open;
|
|
Fields.add(tfield.Create(DBConnector.GetNDataset(1)));
|
|
AssertEquals('deUpdateState:0;deFieldListChange:0;',DataEvents);
|
|
DataEvents := '';
|
|
fields.Clear;
|
|
AssertEquals('deFieldListChange:0;',DataEvents)
|
|
end;
|
|
aDatasource.Free;
|
|
aDatalink.Free;
|
|
end;
|
|
|
|
|
|
procedure TTestDBBasics.TestActiveBufferWhenClosed;
|
|
begin
|
|
with DBConnector.GetNDataset(0) do
|
|
begin
|
|
AssertNull(ActiveBuffer);
|
|
open;
|
|
AssertFalse('Activebuffer of an empty dataset shouldn''t be nil',ActiveBuffer = nil);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestEOFBOFClosedDataset;
|
|
begin
|
|
with DBConnector.GetNDataset(1) do
|
|
begin
|
|
AssertTrue(EOF);
|
|
AssertTrue(BOF);
|
|
open;
|
|
close;
|
|
AssertTrue(EOF);
|
|
AssertTrue(BOF);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestDataEventsResync;
|
|
var i,count : integer;
|
|
aDatasource : TDataSource;
|
|
aDatalink : TDataLink;
|
|
ds : tdataset;
|
|
|
|
begin
|
|
aDatasource := TDataSource.Create(nil);
|
|
aDatalink := TTestDataLink.Create;
|
|
aDatalink.DataSource := aDatasource;
|
|
ds := DBConnector.GetNDataset(6);
|
|
ds.BeforeScroll := DBConnector.DataEvent;
|
|
with ds do
|
|
begin
|
|
aDatasource.DataSet := ds;
|
|
open;
|
|
DataEvents := '';
|
|
Resync([rmExact]);
|
|
AssertEquals('deDataSetChange:0;',DataEvents);
|
|
DataEvents := '';
|
|
next;
|
|
AssertEquals('deCheckBrowseMode:0;DataEvent;deDataSetScroll:0;DataSetScrolled:1;',DataEvents);
|
|
close;
|
|
end;
|
|
aDatasource.Free;
|
|
aDatalink.Free;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestLastAppendCancel;
|
|
|
|
var count : integer;
|
|
|
|
begin
|
|
for count := 0 to 32 do with DBConnector.GetNDataset(count) do
|
|
begin
|
|
open;
|
|
|
|
Last;
|
|
Append;
|
|
Cancel;
|
|
|
|
AssertEquals(count,fields[0].asinteger);
|
|
AssertEquals(count,RecordCount);
|
|
|
|
Close;
|
|
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestRecNo;
|
|
var i : longint;
|
|
passed : boolean;
|
|
begin
|
|
with DBConnector.GetNDataset(0) do
|
|
begin
|
|
// Accessing RecNo on a closed dataset should raise an EDatabaseError or should
|
|
// return 0
|
|
passed := false;
|
|
try
|
|
i := recno;
|
|
except on E: Exception do
|
|
begin
|
|
passed := E.classname = EDatabaseError.className
|
|
end;
|
|
end;
|
|
if not passed then
|
|
AssertEquals('Failed to get the RecNo from a closed dataset',0,RecNo);
|
|
|
|
// Accessing Recordcount on a closed dataset should raise an EDatabaseError or should
|
|
// return 0
|
|
passed := false;
|
|
try
|
|
i := recordcount;
|
|
except on E: Exception do
|
|
begin
|
|
passed := E.classname = EDatabaseError.className
|
|
end;
|
|
end;
|
|
if not passed then
|
|
AssertEquals('Failed to get the Recordcount from a closed dataset',0,RecNo);
|
|
|
|
Open;
|
|
|
|
AssertEquals(0,RecordCount);
|
|
AssertEquals(0,RecNo);
|
|
|
|
first;
|
|
AssertEquals(0,RecordCount);
|
|
AssertEquals(0,RecNo);
|
|
|
|
last;
|
|
AssertEquals(0,RecordCount);
|
|
AssertEquals(0,RecNo);
|
|
|
|
append;
|
|
AssertEquals(0,RecNo);
|
|
AssertEquals(0,RecordCount);
|
|
|
|
first;
|
|
AssertEquals(0,RecNo);
|
|
AssertEquals(0,RecordCount);
|
|
|
|
append;
|
|
FieldByName('id').AsInteger := 1;
|
|
AssertEquals(0,RecNo);
|
|
AssertEquals(0,RecordCount);
|
|
|
|
first;
|
|
AssertEquals(1,RecNo);
|
|
AssertEquals(1,RecordCount);
|
|
|
|
last;
|
|
AssertEquals(1,RecNo);
|
|
AssertEquals(1,RecordCount);
|
|
|
|
append;
|
|
FieldByName('id').AsInteger := 1;
|
|
AssertEquals(0,RecNo);
|
|
AssertEquals(1,RecordCount);
|
|
|
|
Close;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSetRecNo;
|
|
begin
|
|
with DBConnector.GetNDataset(15) do
|
|
begin
|
|
Open;
|
|
RecNo := 1;
|
|
AssertEquals(1,fields[0].AsInteger);
|
|
AssertEquals(1,RecNo);
|
|
|
|
RecNo := 2;
|
|
AssertEquals(2,fields[0].AsInteger);
|
|
AssertEquals(2,RecNo);
|
|
|
|
RecNo := 8;
|
|
AssertEquals(8,fields[0].AsInteger);
|
|
AssertEquals(8,RecNo);
|
|
|
|
RecNo := 15;
|
|
AssertEquals(15,fields[0].AsInteger);
|
|
AssertEquals(15,RecNo);
|
|
|
|
RecNo := 3;
|
|
AssertEquals(3,fields[0].AsInteger);
|
|
AssertEquals(3,RecNo);
|
|
|
|
RecNo := 14;
|
|
AssertEquals(14,fields[0].AsInteger);
|
|
AssertEquals(14,RecNo);
|
|
|
|
RecNo := 15;
|
|
AssertEquals(15,fields[0].AsInteger);
|
|
AssertEquals(15,RecNo);
|
|
|
|
// test for exceptions...
|
|
{ RecNo := 16;
|
|
AssertEquals(15,fields[0].AsInteger);
|
|
AssertEquals(15,RecNo);}
|
|
|
|
Close;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestRequired;
|
|
begin
|
|
with DBConnector.GetNDataset(2) do
|
|
begin
|
|
Open;
|
|
FieldByName('ID').Required := True;
|
|
Append;
|
|
AssertException(EDatabaseError,Post);
|
|
FieldByName('ID').AsInteger := 1000;
|
|
Post;
|
|
Close;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TTestDBBasics.SetUp;
|
|
begin
|
|
DBConnector.StartTest;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TearDown;
|
|
begin
|
|
DBConnector.StopTest;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestCanModifySpecialFields;
|
|
var ds : TDataset;
|
|
lds : TDataset;
|
|
fld : TField;
|
|
begin
|
|
lds := DBConnector.GetNDataset(10);
|
|
ds := DBConnector.GetNDataset(5);
|
|
with ds do
|
|
begin
|
|
Fld := TIntegerField.Create(ds);
|
|
Fld.FieldName:='ID';
|
|
Fld.DataSet:=ds;
|
|
|
|
Fld := TStringField.Create(ds);
|
|
Fld.FieldName:='LookupFld';
|
|
Fld.FieldKind:=fkLookup;
|
|
Fld.DataSet:=ds;
|
|
Fld.LookupDataSet:=lds;
|
|
Fld.LookupResultField:='NAME';
|
|
Fld.LookupKeyFields:='ID';
|
|
Fld.KeyFields:='ID';
|
|
|
|
lds.Open;
|
|
Open;
|
|
AssertTrue(FieldByName('ID').CanModify);
|
|
AssertFalse(FieldByName('LookupFld').CanModify);
|
|
AssertFalse(FieldByName('ID').ReadOnly);
|
|
AssertFalse(FieldByName('LookupFld').ReadOnly);
|
|
|
|
AssertEquals(1,FieldByName('ID').AsInteger);
|
|
AssertEquals('name1',FieldByName('LookupFld').AsString);
|
|
close;
|
|
lds.Close;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSafeAsXML;
|
|
var ds : TDataset;
|
|
LoadDs: TBufDataset;
|
|
begin
|
|
ds := DBConnector.GetNDataset(true,5);
|
|
if not (ds is TBufDataset) then
|
|
Ignore('This test only applies to TBufDataset and descendents.');
|
|
|
|
ds.open;
|
|
TBufDataset(ds).SaveToFile('test.xml');
|
|
ds.close;
|
|
|
|
LoadDs := TBufDataset.Create(nil);
|
|
LoadDs.LoadFromFile('test.xml');
|
|
FTestXMLDatasetDefinition(LoadDS);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestFileNameProperty;
|
|
var ds : TDataset;
|
|
LoadDs: TBufDataset;
|
|
begin
|
|
ds := DBConnector.GetNDataset(true,5);
|
|
if not (ds is TBufDataset) then
|
|
Ignore('This test only applies to TBufDataset and descendents.');
|
|
|
|
ds.open;
|
|
TBufDataset(ds).FileName:='test.xml';
|
|
ds.close;
|
|
|
|
ds := DBConnector.GetNDataset(True,7);
|
|
TBufDataset(ds).FileName:='test.xml';
|
|
ds.Open;
|
|
FTestXMLDatasetDefinition(Ds);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestClientDatasetAsMemDataset;
|
|
var ds : TBufDataset;
|
|
i : integer;
|
|
begin
|
|
ds := TBufDataset.Create(nil);
|
|
DS.FieldDefs.Add('ID',ftInteger);
|
|
DS.FieldDefs.Add('NAME',ftString,50);
|
|
DS.CreateDataset;
|
|
DS.Open;
|
|
for i := 1 to 10 do
|
|
begin
|
|
ds.Append;
|
|
ds.FieldByName('ID').AsInteger := i;
|
|
ds.FieldByName('NAME').AsString := 'TestName' + inttostr(i);
|
|
DS.Post;
|
|
end;
|
|
ds.first;
|
|
for i := 1 to 10 do
|
|
begin
|
|
AssertEquals(i,ds.fieldbyname('ID').asinteger);
|
|
AssertEquals('TestName' + inttostr(i),ds.fieldbyname('NAME').AsString);
|
|
ds.next;
|
|
end;
|
|
AssertTrue(ds.EOF);
|
|
DS.Close;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAppendInsertRecord;
|
|
begin
|
|
with DBConnector.GetNDataset(true,6) do
|
|
begin
|
|
open;
|
|
// InsertRecord should insert a record, set the values, post the record and
|
|
// make the new record active.
|
|
InsertRecord([152,'TestInsRec']);
|
|
AssertEquals(152,fields[0].AsInteger);
|
|
AssertEquals('TestInsRec',fields[1].AsString);
|
|
AssertTrue(state=dsBrowse);
|
|
|
|
// AppendRecord should append a record, further the same as InsertRecord
|
|
AppendRecord([151,'TestInsRec']);
|
|
AssertEquals(151,fields[0].AsInteger);
|
|
AssertEquals('TestInsRec',fields[1].AsString);
|
|
AssertTrue(state=dsBrowse);
|
|
next;
|
|
AssertTrue(EOF);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestBookmarks;
|
|
var BM1,BM2,BM3,BM4,BM5 : TBookmark;
|
|
begin
|
|
with DBConnector.GetNDataset(true,14) do
|
|
begin
|
|
AssertNull(GetBookmark);
|
|
open;
|
|
BM1:=GetBookmark; // id=1, BOF
|
|
next;next;
|
|
BM2:=GetBookmark; // id=3
|
|
next;next;next;
|
|
BM3:=GetBookmark; // id=6
|
|
next;next;next;next;next;next;next;next;
|
|
BM4:=GetBookmark; // id=14
|
|
next;
|
|
BM5:=GetBookmark; // id=14, EOF
|
|
|
|
GotoBookmark(BM2);
|
|
AssertEquals(3,FieldByName('id').AsInteger);
|
|
|
|
GotoBookmark(BM1);
|
|
AssertEquals(1,FieldByName('id').AsInteger);
|
|
|
|
GotoBookmark(BM3);
|
|
AssertEquals(6,FieldByName('id').AsInteger);
|
|
|
|
GotoBookmark(BM4);
|
|
AssertEquals(14,FieldByName('id').AsInteger);
|
|
|
|
GotoBookmark(BM3);
|
|
AssertEquals(6,FieldByName('id').AsInteger);
|
|
|
|
GotoBookmark(BM5);
|
|
AssertEquals(14,FieldByName('id').AsInteger);
|
|
|
|
GotoBookmark(BM1);
|
|
AssertEquals(1,FieldByName('id').AsInteger);
|
|
|
|
next;
|
|
delete;
|
|
|
|
GotoBookmark(BM2);
|
|
AssertEquals(3,FieldByName('id').AsInteger);
|
|
|
|
delete;delete;
|
|
|
|
GotoBookmark(BM3);
|
|
AssertEquals(6,FieldByName('id').AsInteger);
|
|
|
|
GotoBookmark(BM1);
|
|
AssertEquals(1,FieldByName('id').AsInteger);
|
|
insert;
|
|
fieldbyname('id').AsInteger:=20;
|
|
insert;
|
|
fieldbyname('id').AsInteger:=21;
|
|
insert;
|
|
fieldbyname('id').AsInteger:=22;
|
|
insert;
|
|
fieldbyname('id').AsInteger:=23;
|
|
post;
|
|
|
|
GotoBookmark(BM3);
|
|
AssertEquals(6,FieldByName('id').AsInteger);
|
|
|
|
GotoBookmark(BM1);
|
|
AssertEquals(1,FieldByName('id').AsInteger);
|
|
|
|
GotoBookmark(BM5);
|
|
AssertEquals(14,FieldByName('id').AsInteger);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestBookmarkValid;
|
|
var BM1,BM2,BM3,BM4,BM5 : TBookmark;
|
|
begin
|
|
with DBConnector.GetNDataset(true,14) do
|
|
begin
|
|
BM1 := Nil;
|
|
AssertFalse(BookmarkValid(BM1));
|
|
open;
|
|
BM1:=GetBookmark; // id=1, BOF
|
|
AssertTrue(BookmarkValid(BM1));
|
|
next;next;
|
|
BM2:=GetBookmark; // id=3
|
|
AssertTrue(BookmarkValid(BM2));
|
|
next;next;next;
|
|
BM3:=GetBookmark; // id=6
|
|
AssertTrue(BookmarkValid(BM3));
|
|
next;next;next;next;next;next;next;next;
|
|
BM4:=GetBookmark; // id=14
|
|
AssertTrue(BookmarkValid(BM4));
|
|
next;
|
|
BM5:=GetBookmark; // id=14, EOF
|
|
AssertTrue(BookmarkValid(BM5));
|
|
|
|
AssertTrue(BookmarkValid(BM4));
|
|
AssertTrue(BookmarkValid(BM3));
|
|
AssertTrue(BookmarkValid(BM2));
|
|
AssertTrue(BookmarkValid(BM1));
|
|
GotoBookmark(BM2);
|
|
AssertTrue(BookmarkValid(BM5));
|
|
AssertTrue(BookmarkValid(BM4));
|
|
AssertTrue(BookmarkValid(BM3));
|
|
AssertTrue(BookmarkValid(BM2));
|
|
AssertTrue(BookmarkValid(BM1));
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestLocate;
|
|
begin
|
|
with DBConnector.GetNDataset(true,13) do
|
|
begin
|
|
open;
|
|
asserttrue(Locate('id',vararrayof([5]),[]));
|
|
AssertEquals(5,FieldByName('id').AsInteger);
|
|
AssertFalse(Locate('id',vararrayof([15]),[]));
|
|
asserttrue(Locate('id',vararrayof([12]),[]));
|
|
AssertEquals(12,FieldByName('id').AsInteger);
|
|
close;
|
|
open;
|
|
asserttrue(Locate('id',vararrayof([12]),[]));
|
|
AssertEquals(12,FieldByName('id').AsInteger);
|
|
asserttrue(Locate('id;name',vararrayof([4,'TestName4']),[]));
|
|
AssertEquals(4,FieldByName('id').AsInteger);
|
|
|
|
assertFalse(Locate('id;name',vararrayof([4,'TestName5']),[]));
|
|
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSetFieldValues;
|
|
var PassException : boolean;
|
|
begin
|
|
with DBConnector.GetNDataset(true,11) do
|
|
begin
|
|
open;
|
|
first;
|
|
edit;
|
|
FieldValues['id']:=5;
|
|
post;
|
|
AssertEquals('TestName1',FieldByName('name').AsString);
|
|
AssertEquals(5,FieldByName('id').AsInteger);
|
|
edit;
|
|
FieldValues['name']:='FieldValuesTestName';
|
|
post;
|
|
AssertEquals('FieldValuesTestName',FieldByName('name').AsString);
|
|
AssertEquals(5,FieldByName('id').AsInteger);
|
|
edit;
|
|
FieldValues['id;name']:= VarArrayOf([243,'ValuesTestName']);
|
|
post;
|
|
AssertEquals('ValuesTestName',FieldByName('name').AsString);
|
|
AssertEquals(243,FieldByName('id').AsInteger);
|
|
|
|
PassException:=false;
|
|
try
|
|
edit;
|
|
FieldValues['id;name;fake']:= VarArrayOf([243,'ValuesTestName',4]);
|
|
except
|
|
on E: EDatabaseError do PassException := True;
|
|
end;
|
|
post;
|
|
AssertTrue(PassException);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestGetFieldValues;
|
|
var AVar : Variant;
|
|
PassException : boolean;
|
|
begin
|
|
with DBConnector.GetNDataset(true,14) do
|
|
begin
|
|
open;
|
|
AVar:=FieldValues['id'];
|
|
AssertEquals(AVar,1);
|
|
|
|
AVar:=FieldValues['name'];
|
|
AssertEquals(AVar,'TestName1');
|
|
|
|
AVar:=FieldValues['id;name'];
|
|
AssertEquals(AVar[0],1);
|
|
AssertEquals(AVar[1],'TestName1');
|
|
|
|
AVar:=FieldValues['name;id;'];
|
|
AssertEquals(AVar[1],1);
|
|
AssertEquals(AVar[0],'TestName1');
|
|
|
|
PassException:=false;
|
|
try
|
|
AVar:=FieldValues['name;id;fake'];
|
|
except
|
|
on E: EDatabaseError do PassException := True;
|
|
end;
|
|
AssertTrue(PassException);
|
|
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestFirst;
|
|
var i : integer;
|
|
begin
|
|
with DBConnector.GetNDataset(true,14) do
|
|
begin
|
|
open;
|
|
AssertEquals(1,FieldByName('ID').AsInteger);
|
|
First;
|
|
AssertEquals(1,FieldByName('ID').AsInteger);
|
|
next;
|
|
AssertEquals(2,FieldByName('ID').AsInteger);
|
|
First;
|
|
AssertEquals(1,FieldByName('ID').AsInteger);
|
|
for i := 0 to 12 do
|
|
next;
|
|
AssertEquals(14,FieldByName('ID').AsInteger);
|
|
First;
|
|
AssertEquals(1,FieldByName('ID').AsInteger);
|
|
close;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestDelete1;
|
|
begin
|
|
FTestDelete1(false);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestDelete2;
|
|
begin
|
|
FTestDelete2(false);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestCancelUpdDelete1;
|
|
begin
|
|
FTestDelete1(true);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestCancelUpdDelete2;
|
|
begin
|
|
FTestDelete2(true);
|
|
end;
|
|
|
|
procedure TTestDBBasics.FTestDelete1(TestCancelUpdate : boolean);
|
|
// Test the deletion of records, including the first and the last one
|
|
var i : integer;
|
|
ds : TDataset;
|
|
begin
|
|
ds := DBConnector.GetNDataset(true,17);
|
|
with ds do
|
|
begin
|
|
Open;
|
|
|
|
for i := 0 to 16 do if i mod 4=0 then
|
|
delete
|
|
else
|
|
next;
|
|
|
|
First;
|
|
for i := 0 to 16 do
|
|
begin
|
|
if i mod 4<>0 then
|
|
begin
|
|
AssertEquals(i+1,FieldByName('ID').AsInteger);
|
|
AssertEquals('TestName'+inttostr(i+1),FieldByName('NAME').AsString);
|
|
next;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
if TestCancelUpdate then
|
|
begin
|
|
if not (ds is TBufDataset) then
|
|
Ignore('This test only applies to TBufDataset and descendents.');
|
|
with TBufDataset(ds) do
|
|
begin
|
|
CancelUpdates;
|
|
|
|
First;
|
|
for i := 0 to 16 do
|
|
begin
|
|
AssertEquals(i+1,FieldByName('ID').AsInteger);
|
|
AssertEquals('TestName'+inttostr(i+1),FieldByName('NAME').AsString);
|
|
next;
|
|
end;
|
|
|
|
close;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.FTestDelete2(TestCancelUpdate : boolean);
|
|
// Test the deletion of edited and appended records
|
|
var i : integer;
|
|
ds : TDataset;
|
|
begin
|
|
ds := DBConnector.GetNDataset(true,17);
|
|
with ds do
|
|
begin
|
|
Open;
|
|
|
|
for i := 0 to 16 do
|
|
begin
|
|
if i mod 4=0 then
|
|
begin
|
|
edit;
|
|
fieldbyname('name').AsString:='this record will be gone soon';
|
|
post;
|
|
end;
|
|
next;
|
|
end;
|
|
|
|
for i := 17 to 20 do
|
|
begin
|
|
append;
|
|
fieldbyname('id').AsInteger:=i+1;
|
|
fieldbyname('name').AsString:='TestName'+inttostr(i+1);
|
|
post;
|
|
end;
|
|
|
|
first;
|
|
for i := 0 to 20 do if i mod 4=0 then
|
|
delete
|
|
else
|
|
next;
|
|
|
|
First;
|
|
i := 0;
|
|
for i := 0 to 20 do
|
|
begin
|
|
if i mod 4<>0 then
|
|
begin
|
|
AssertEquals(i+1,FieldByName('ID').AsInteger);
|
|
AssertEquals('TestName'+inttostr(i+1),FieldByName('NAME').AsString);
|
|
next;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
if TestCancelUpdate then
|
|
begin
|
|
if not (ds is TBufDataset) then
|
|
Ignore('This test only applies to TBufDataset and descendents.');
|
|
with TBufDataset(ds) do
|
|
begin
|
|
CancelUpdates;
|
|
|
|
First;
|
|
for i := 0 to 16 do
|
|
begin
|
|
AssertEquals(i+1,FieldByName('ID').AsInteger);
|
|
AssertEquals('TestName'+inttostr(i+1),FieldByName('NAME').AsString);
|
|
next;
|
|
end;
|
|
|
|
close;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.FTestXMLDatasetDefinition(ADataset: TDataset);
|
|
var i : integer;
|
|
begin
|
|
AssertEquals(2,ADataset.FieldDefs.Count);
|
|
AssertEquals(2,ADataset.Fields.Count);
|
|
AssertTrue(SameText('ID',ADataset.Fields[0].FieldName));
|
|
AssertTrue(SameText('NAME',ADataset.Fields[1].FieldName));
|
|
AssertTrue('Incorrect fieldtype',ADataset.fields[1].DataType=ftString);
|
|
i := 1;
|
|
while not ADataset.EOF do
|
|
begin
|
|
AssertEquals('TestName'+inttostr(i),ADataset.FieldByName('name').AsString);
|
|
ADataset.Next;
|
|
inc(i);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestOnFilterProc(DataSet: TDataSet; var Accept: Boolean);
|
|
|
|
var a : TDataSetState;
|
|
begin
|
|
Accept := odd(Dataset.FieldByName('ID').AsInteger);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestOnFilter;
|
|
var tel : byte;
|
|
begin
|
|
with DBConnector.GetNDataset(15) do
|
|
begin
|
|
OnFilterRecord := TestOnFilterProc;
|
|
Filtered := True;
|
|
Open;
|
|
for tel := 1 to 8 do
|
|
begin
|
|
AssertTrue(odd(FieldByName('ID').asinteger));
|
|
next;
|
|
end;
|
|
AssertTrue(EOF);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestIntFilter;
|
|
var tel : byte;
|
|
begin
|
|
with DBConnector.GetNDataset(15) do
|
|
begin
|
|
Filtered := True;
|
|
Filter := '(id>4) and (id<9)';
|
|
Open;
|
|
for tel := 5 to 8 do
|
|
begin
|
|
AssertEquals(tel,FieldByName('ID').asinteger);
|
|
next;
|
|
end;
|
|
AssertTrue(EOF);
|
|
Close;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestRecordcountAfterReopen;
|
|
var
|
|
datalink1: tdatalink;
|
|
datasource1: tdatasource;
|
|
query1: TDataSet;
|
|
|
|
begin
|
|
query1:= DBConnector.GetNDataset(11);
|
|
datalink1:= TDataLink.create;
|
|
datasource1:= tdatasource.create(nil);
|
|
try
|
|
datalink1.datasource:= datasource1;
|
|
datasource1.dataset:= query1;
|
|
|
|
query1.active := true;
|
|
query1.active := False;
|
|
AssertEquals(0, THackDataLink(datalink1).RecordCount);
|
|
query1.active := true;
|
|
AssertTrue(THackDataLink(datalink1).RecordCount>0);
|
|
query1.active := false;
|
|
finally
|
|
datalink1.free;
|
|
datasource1.free;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestStringFilter;
|
|
var tel : byte;
|
|
begin
|
|
with DBConnector.GetNDataset(15) do
|
|
begin
|
|
Open;
|
|
//FilterOptions := [foNoPartialCompare];
|
|
//FilterOptions := [];
|
|
Filter := '(name=''*Name3'')';
|
|
Filtered := True;
|
|
AssertFalse(EOF);
|
|
AssertEquals(3,FieldByName('ID').asinteger);
|
|
AssertEquals('TestName3',FieldByName('NAME').asstring);
|
|
next;
|
|
AssertTrue(EOF);
|
|
Close;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddIndexFieldType(AFieldType: TFieldType; ActiveDS : boolean);
|
|
var ds : TBufDataset;
|
|
FList : TStringList;
|
|
LastValue : Variant;
|
|
StrValue : String;
|
|
begin
|
|
ds := DBConnector.GetFieldDataset as TBufDataset;
|
|
with ds do
|
|
begin
|
|
|
|
if not ActiveDS then
|
|
begin
|
|
AddIndex('testindex','F'+FieldTypeNames[AfieldType],[]);
|
|
IndexName:='testindex';
|
|
end
|
|
else
|
|
MaxIndexesCount := 3;
|
|
|
|
try
|
|
open;
|
|
except
|
|
if not assigned(ds.FindField('F'+FieldTypeNames[AfieldType])) then
|
|
Ignore('Fields of the type ' + FieldTypeNames[AfieldType] + ' are not supported by this type of dataset')
|
|
else
|
|
raise;
|
|
end;
|
|
|
|
if ActiveDS then
|
|
begin
|
|
if not assigned(ds.FindField('F'+FieldTypeNames[AfieldType])) then
|
|
Ignore('Fields of the type ' + FieldTypeNames[AfieldType] + ' are not supported by this type of dataset');
|
|
AddIndex('testindex','F'+FieldTypeNames[AfieldType],[]);
|
|
IndexName:='testindex';
|
|
First;
|
|
end;
|
|
|
|
LastValue:=null;
|
|
while not eof do
|
|
begin
|
|
if AFieldType=ftString then
|
|
AssertTrue(AnsiCompareStr(VarToStr(LastValue),VarToStr(FieldByName('F'+FieldTypeNames[AfieldType]).AsString))<=0)
|
|
else
|
|
AssertTrue(LastValue<=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant);
|
|
LastValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant;
|
|
Next;
|
|
end;
|
|
|
|
while not bof do
|
|
begin
|
|
if AFieldType=ftString then
|
|
AssertTrue(AnsiCompareStr(VarToStr(LastValue),VarToStr(FieldByName('F'+FieldTypeNames[AfieldType]).AsString))>=0)
|
|
else
|
|
AssertTrue(LastValue>=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant);
|
|
LastValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsVariant;
|
|
Prior;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddIndexSmallInt;
|
|
begin
|
|
TestAddIndexFieldType(ftSmallint,False);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddIndexBoolean;
|
|
begin
|
|
TestAddIndexFieldType(ftBoolean,False);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddIndexFloat;
|
|
begin
|
|
TestAddIndexFieldType(ftFloat,False);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddIndexInteger;
|
|
begin
|
|
TestAddIndexFieldType(ftInteger,False);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddIndexLargeInt;
|
|
begin
|
|
TestAddIndexFieldType(ftLargeint,False);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddIndexDateTime;
|
|
begin
|
|
TestAddIndexFieldType(ftDateTime,False);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddIndexCurrency;
|
|
begin
|
|
TestAddIndexFieldType(ftCurrency,False);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddIndexBCD;
|
|
begin
|
|
TestAddIndexFieldType(ftBCD,False);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddIndex;
|
|
var ds : TBufDataset;
|
|
AFieldType : TFieldType;
|
|
FList : TStringList;
|
|
i : integer;
|
|
begin
|
|
ds := DBConnector.GetFieldDataset as TBufDataset;
|
|
with ds do
|
|
begin
|
|
|
|
AFieldType:=ftString;
|
|
AddIndex('testindex','F'+FieldTypeNames[AfieldType],[]);
|
|
FList := TStringList.Create;
|
|
FList.Sorted:=true;
|
|
FList.CaseSensitive:=True;
|
|
FList.Duplicates:=dupAccept;
|
|
open;
|
|
|
|
while not eof do
|
|
begin
|
|
flist.Add(FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
Next;
|
|
end;
|
|
|
|
IndexName:='testindex';
|
|
first;
|
|
i:=0;
|
|
|
|
while not eof do
|
|
begin
|
|
AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
inc(i);
|
|
Next;
|
|
end;
|
|
|
|
while not bof do
|
|
begin
|
|
dec(i);
|
|
AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
Prior;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddDescIndex;
|
|
var ds : TBufDataset;
|
|
AFieldType : TFieldType;
|
|
FList : TStringList;
|
|
i : integer;
|
|
begin
|
|
ds := DBConnector.GetFieldDataset as TBufDataset;
|
|
with ds do
|
|
begin
|
|
|
|
AFieldType:=ftString;
|
|
AddIndex('testindex','F'+FieldTypeNames[AfieldType],[],'F'+FieldTypeNames[AfieldType]);
|
|
FList := TStringList.Create;
|
|
FList.Sorted:=true;
|
|
FList.CaseSensitive:=True;
|
|
FList.Duplicates:=dupAccept;
|
|
open;
|
|
|
|
while not eof do
|
|
begin
|
|
flist.Add(FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
Next;
|
|
end;
|
|
|
|
IndexName:='testindex';
|
|
first;
|
|
i:=FList.Count-1;
|
|
|
|
while not eof do
|
|
begin
|
|
AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
dec(i);
|
|
Next;
|
|
end;
|
|
|
|
while not bof do
|
|
begin
|
|
inc(i);
|
|
AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
Prior;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddCaseInsIndex;
|
|
var ds : TBufDataset;
|
|
AFieldType : TFieldType;
|
|
FList : TStringList;
|
|
i : integer;
|
|
begin
|
|
ds := DBConnector.GetFieldDataset as TBufDataset;
|
|
with ds do
|
|
begin
|
|
|
|
AFieldType:=ftString;
|
|
AddIndex('testindex','F'+FieldTypeNames[AfieldType],[],'','F'+FieldTypeNames[AfieldType]);
|
|
FList := TStringList.Create;
|
|
FList.Sorted:=true;
|
|
FList.Duplicates:=dupAccept;
|
|
open;
|
|
|
|
while not eof do
|
|
begin
|
|
flist.Add(FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
Next;
|
|
end;
|
|
|
|
IndexName:='testindex';
|
|
first;
|
|
i:=0;
|
|
|
|
while not eof do
|
|
begin
|
|
AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
inc(i);
|
|
Next;
|
|
end;
|
|
|
|
while not bof do
|
|
begin
|
|
dec(i);
|
|
AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
Prior;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestInactSwitchIndex;
|
|
// Test if the default-index is properly build when the active index is not
|
|
// the default-index while opening then dataset
|
|
var ds : TBufDataset;
|
|
AFieldType : TFieldType;
|
|
i : integer;
|
|
begin
|
|
ds := DBConnector.GetFieldDataset as TBufDataset;
|
|
with ds do
|
|
begin
|
|
|
|
AFieldType:=ftString;
|
|
AddIndex('testindex','F'+FieldTypeNames[AfieldType],[]);
|
|
IndexName:='testindex';
|
|
open;
|
|
IndexName:=''; // This should set the default index (default_order)
|
|
first;
|
|
|
|
i := 0;
|
|
|
|
while not eof do
|
|
begin
|
|
AssertEquals(testStringValues[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
inc(i);
|
|
Next;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddIndexActiveDS;
|
|
var ds : TBufDataset;
|
|
I : integer;
|
|
begin
|
|
TestAddIndexFieldType(ftString,true);
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddIndexEditDS;
|
|
var ds : TBufDataset;
|
|
I : integer;
|
|
LastValue : String;
|
|
begin
|
|
ds := DBConnector.GetNDataset(True,5) as TBufDataset;
|
|
with ds do
|
|
begin
|
|
MaxIndexesCount:=3;
|
|
open;
|
|
edit;
|
|
FieldByName('name').asstring := 'Zz';
|
|
post;
|
|
next;
|
|
next;
|
|
edit;
|
|
FieldByName('name').asstring := 'aA';
|
|
post;
|
|
|
|
AddIndex('test','name',[]);
|
|
|
|
first;
|
|
ds.IndexName:='test';
|
|
first;
|
|
LastValue:=FieldByName('name').AsString;
|
|
while not eof do
|
|
begin
|
|
AssertTrue(AnsiCompareStr(LastValue,FieldByName('name').AsString)<=0);
|
|
Next;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestIndexFieldNamesAct;
|
|
var ds : TBufDataset;
|
|
AFieldType : TFieldType;
|
|
FList : TStringList;
|
|
i : integer;
|
|
begin
|
|
ds := DBConnector.GetFieldDataset as TBufDataset;
|
|
with ds do
|
|
begin
|
|
AFieldType:=ftString;
|
|
FList := TStringList.Create;
|
|
FList.Sorted:=true;
|
|
FList.CaseSensitive:=True;
|
|
FList.Duplicates:=dupAccept;
|
|
open;
|
|
|
|
while not eof do
|
|
begin
|
|
flist.Add(FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
Next;
|
|
end;
|
|
|
|
IndexFieldNames:='F'+FieldTypeNames[AfieldType];
|
|
first;
|
|
i:=0;
|
|
|
|
while not eof do
|
|
begin
|
|
AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
inc(i);
|
|
Next;
|
|
end;
|
|
|
|
while not bof do
|
|
begin
|
|
dec(i);
|
|
AssertEquals(flist[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
Prior;
|
|
end;
|
|
|
|
AssertEquals('F'+FieldTypeNames[AfieldType],IndexFieldNames);
|
|
|
|
IndexFieldNames:='ID';
|
|
first;
|
|
i:=0;
|
|
|
|
while not eof do
|
|
begin
|
|
AssertEquals(testStringValues[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
inc(i);
|
|
Next;
|
|
end;
|
|
|
|
AssertEquals('ID',IndexFieldNames);
|
|
|
|
IndexFieldNames:='';
|
|
first;
|
|
i:=0;
|
|
|
|
while not eof do
|
|
begin
|
|
AssertEquals(testStringValues[i],FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
inc(i);
|
|
Next;
|
|
end;
|
|
|
|
AssertEquals('',IndexFieldNames);
|
|
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestIndexCurRecord;
|
|
// Test if the currentrecord stays the same after an index change
|
|
var ds : TBufDataset;
|
|
AFieldType : TFieldType;
|
|
i : integer;
|
|
OldID : Integer;
|
|
OldStringValue : string;
|
|
begin
|
|
ds := DBConnector.GetFieldDataset as TBufDataset;
|
|
with ds do
|
|
begin
|
|
AFieldType:=ftString;
|
|
AddIndex('testindex','F'+FieldTypeNames[AfieldType],[]);
|
|
open;
|
|
|
|
for i := 0 to (testValuesCount div 3) do
|
|
Next;
|
|
|
|
OldID:=FieldByName('id').AsInteger;
|
|
OldStringValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsString;
|
|
|
|
IndexName:='testindex';
|
|
|
|
AssertEquals(OldID,FieldByName('id').AsInteger);
|
|
AssertEquals(OldStringValue,FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
|
|
next;
|
|
AssertTrue(OldStringValue<=FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
prior;
|
|
prior;
|
|
AssertTrue(OldStringValue>=FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
|
|
OldID:=FieldByName('id').AsInteger;
|
|
OldStringValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsString;
|
|
|
|
IndexName:='';
|
|
|
|
AssertEquals(OldID,FieldByName('id').AsInteger);
|
|
AssertEquals(OldStringValue,FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
|
|
next;
|
|
AssertEquals(OldID+1,FieldByName('ID').AsInteger);
|
|
prior;
|
|
prior;
|
|
AssertEquals(OldID-1,FieldByName('ID').AsInteger);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAddDblIndex;
|
|
var ds : TBufDataset;
|
|
LastInteger : Integer;
|
|
LastString : string;
|
|
begin
|
|
ds := DBConnector.GetFieldDataset as TBufDataset;
|
|
with ds do
|
|
begin
|
|
|
|
AddIndex('testindex','F'+FieldTypeNames[ftString]+';F'+FieldTypeNames[ftInteger],[]);
|
|
open;
|
|
|
|
IndexName:='testindex';
|
|
first;
|
|
|
|
LastString:='';
|
|
while not eof do
|
|
begin
|
|
AssertTrue(AnsiCompareStr(FieldByName('F'+FieldTypeNames[ftString]).AsString,LastString)>=0);
|
|
LastString:= FieldByName('F'+FieldTypeNames[ftString]).AsString;
|
|
|
|
LastInteger:=-MaxInt;
|
|
while (FieldByName('F'+FieldTypeNames[ftString]).AsString=LastString) and not eof do
|
|
begin
|
|
AssertTrue(FieldByName('F'+FieldTypeNames[ftInteger]).AsInteger>=LastInteger);
|
|
LastInteger:=FieldByName('F'+FieldTypeNames[ftInteger]).AsInteger;
|
|
next;
|
|
end;
|
|
end;
|
|
while not bof do
|
|
begin
|
|
AssertTrue(AnsiCompareStr(FieldByName('F'+FieldTypeNames[ftString]).AsString,LastString)<=0);
|
|
LastString:= FieldByName('F'+FieldTypeNames[ftString]).AsString;
|
|
|
|
LastInteger:=+MaxInt;
|
|
while (FieldByName('F'+FieldTypeNames[ftString]).AsString=LastString) and not bof do
|
|
begin
|
|
AssertTrue(FieldByName('F'+FieldTypeNames[ftInteger]).AsInteger<=LastInteger);
|
|
LastInteger:=FieldByName('F'+FieldTypeNames[ftInteger]).AsInteger;
|
|
prior;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestIndexEditRecord;
|
|
var ds : TBufDataset;
|
|
AFieldType : TFieldType;
|
|
i : integer;
|
|
OldID : Integer;
|
|
OldStringValue : string;
|
|
begin
|
|
ds := DBConnector.GetFieldDataset as TBufDataset;
|
|
with ds do
|
|
begin
|
|
AFieldType:=ftString;
|
|
AddIndex('testindex','F'+FieldTypeNames[AfieldType],[]);
|
|
IndexName:='testindex';
|
|
open;
|
|
OldStringValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsString;
|
|
next;
|
|
AssertTrue(OldStringValue<=FieldByName('F'+FieldTypeNames[AfieldType]).AsString);
|
|
OldStringValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsString;
|
|
next;
|
|
AssertTrue(AnsiCompareStr(OldStringValue,FieldByName('F'+FieldTypeNames[AfieldType]).AsString)<=0);
|
|
prior;
|
|
|
|
edit;
|
|
FieldByName('F'+FieldTypeNames[AfieldType]).AsString := 'ZZZ';
|
|
post;
|
|
prior;
|
|
AssertTrue(AnsiCompareStr('ZZZ',FieldByName('F'+FieldTypeNames[AfieldType]).AsString)>=0);
|
|
next;
|
|
next;
|
|
AssertTrue(AnsiCompareStr('ZZZ',FieldByName('F'+FieldTypeNames[AfieldType]).AsString)<=0);
|
|
close;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestIndexFieldNames;
|
|
var ds : TBufDataset;
|
|
AFieldType : TFieldType;
|
|
PrevValue : String;
|
|
begin
|
|
ds := DBConnector.GetFieldDataset as TBufDataset;
|
|
with ds do
|
|
begin
|
|
AFieldType:=ftString;
|
|
|
|
IndexFieldNames:='F'+FieldTypeNames[AfieldType];
|
|
|
|
open;
|
|
PrevValue:='';
|
|
while not eof do
|
|
begin
|
|
AssertTrue(AnsiCompareStr(FieldByName('F'+FieldTypeNames[AfieldType]).AsString,PrevValue)>=0);
|
|
PrevValue:=FieldByName('F'+FieldTypeNames[AfieldType]).AsString;
|
|
Next;
|
|
end;
|
|
|
|
AssertEquals('F'+FieldTypeNames[AfieldType],IndexFieldNames);
|
|
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TTestDBBasics.TestcalculatedField_OnCalcfields(DataSet: TDataSet);
|
|
begin
|
|
case dataset.fieldbyname('ID').asinteger of
|
|
1 : dataset.fieldbyname('CALCFLD').AsInteger := 5;
|
|
2 : dataset.fieldbyname('CALCFLD').AsInteger := 70000;
|
|
3 : dataset.fieldbyname('CALCFLD').Clear;
|
|
4 : dataset.fieldbyname('CALCFLD').AsInteger := 1234;
|
|
10 : dataset.fieldbyname('CALCFLD').Clear;
|
|
else
|
|
dataset.fieldbyname('CALCFLD').AsInteger := 1;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestCalculatedField;
|
|
var ds : TDataset;
|
|
AFld1, AFld2, AFld3 : Tfield;
|
|
begin
|
|
ds := DBConnector.GetNDataset(5);
|
|
with ds do
|
|
begin
|
|
AFld1 := TIntegerField.Create(ds);
|
|
AFld1.FieldName := 'ID';
|
|
AFld1.DataSet := ds;
|
|
|
|
AFld2 := TStringField.Create(ds);
|
|
AFld2.FieldName := 'NAME';
|
|
AFld2.DataSet := ds;
|
|
|
|
AFld3 := TIntegerField.Create(ds);
|
|
AFld3.FieldName := 'CALCFLD';
|
|
AFld3.DataSet := ds;
|
|
Afld3.FieldKind := fkCalculated;
|
|
|
|
AssertEquals(3,FieldCount);
|
|
ds.OnCalcFields := TestcalculatedField_OnCalcfields;
|
|
open;
|
|
AssertEquals(1,FieldByName('ID').asinteger);
|
|
AssertEquals(5,FieldByName('CALCFLD').asinteger);
|
|
next;
|
|
AssertEquals(70000,FieldByName('CALCFLD').asinteger);
|
|
next;
|
|
AssertEquals(true,FieldByName('CALCFLD').isnull);
|
|
next;
|
|
AssertEquals(1234,FieldByName('CALCFLD').AsInteger);
|
|
edit;
|
|
FieldByName('ID').AsInteger := 10;
|
|
post;
|
|
AssertEquals(true,FieldByName('CALCFLD').isnull);
|
|
close;
|
|
AFld1.Free;
|
|
AFld2.Free;
|
|
AFld3.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestEofAfterFirst;
|
|
begin
|
|
with DBConnector.GetNDataset(0) do
|
|
begin
|
|
open;
|
|
AssertTrue(eof);
|
|
AssertTrue(BOF);
|
|
first;
|
|
AssertTrue(eof);
|
|
AssertTrue(BOF);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestfieldDefinition(AFieldType : TFieldType;ADatasize : integer;var ADS : TDataset; var AFld: TField);
|
|
|
|
var i : byte;
|
|
|
|
begin
|
|
ADS := DBConnector.GetFieldDataset;
|
|
ADS.Open;
|
|
|
|
AFld := ADS.FindField('F'+FieldTypeNames[AfieldType]);
|
|
|
|
if not assigned (AFld) then
|
|
Ignore('Fields of the type ' + FieldTypeNames[AfieldType] + ' are not supported by this type of dataset');
|
|
AssertTrue(Afld.DataType = AFieldType);
|
|
AssertEquals(ADatasize,Afld.DataSize );
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSupportIntegerFields;
|
|
|
|
var i : byte;
|
|
ds : TDataset;
|
|
Fld : TField;
|
|
|
|
begin
|
|
TestfieldDefinition(ftInteger,4,ds,Fld);
|
|
|
|
for i := 0 to testValuesCount-1 do
|
|
begin
|
|
AssertEquals(testIntValues[i],Fld.AsInteger);
|
|
ds.Next;
|
|
end;
|
|
ds.close;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSupportSmallIntFields;
|
|
|
|
var i : byte;
|
|
ds : TDataset;
|
|
Fld : TField;
|
|
|
|
begin
|
|
TestfieldDefinition(ftSmallint,2,ds,Fld);
|
|
|
|
for i := 0 to testValuesCount-1 do
|
|
begin
|
|
AssertEquals(testSmallIntValues[i],Fld.AsInteger);
|
|
ds.Next;
|
|
end;
|
|
ds.close;
|
|
end;
|
|
|
|
|
|
procedure TTestDBBasics.TestSupportStringFields;
|
|
|
|
var i : byte;
|
|
ds : TDataset;
|
|
Fld : TField;
|
|
|
|
begin
|
|
TestfieldDefinition(ftString,11,ds,Fld);
|
|
|
|
for i := 0 to testValuesCount-1 do
|
|
begin
|
|
AssertEquals(testStringValues[i],Fld.AsString);
|
|
ds.Next;
|
|
end;
|
|
ds.close;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSupportBooleanFields;
|
|
|
|
var i : byte;
|
|
ds : TDataset;
|
|
Fld : TField;
|
|
|
|
begin
|
|
TestfieldDefinition(ftBoolean,2,ds,Fld);
|
|
|
|
for i := 0 to testValuesCount-1 do
|
|
begin
|
|
AssertEquals(testBooleanValues[i],Fld.AsBoolean);
|
|
ds.Next;
|
|
end;
|
|
ds.close;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSupportFloatFields;
|
|
|
|
var i : byte;
|
|
ds : TDataset;
|
|
Fld : TField;
|
|
|
|
begin
|
|
TestfieldDefinition(ftFloat,8,ds,Fld);
|
|
|
|
for i := 0 to testValuesCount-1 do
|
|
begin
|
|
AssertEquals(testFloatValues[i],Fld.AsFloat);
|
|
ds.Next;
|
|
end;
|
|
ds.close;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSupportLargeIntFields;
|
|
|
|
var i : byte;
|
|
ds : TDataset;
|
|
Fld : TField;
|
|
|
|
begin
|
|
TestfieldDefinition(ftLargeint,8,ds,Fld);
|
|
|
|
for i := 0 to testValuesCount-1 do
|
|
begin
|
|
AssertEquals(testLargeIntValues[i],Fld.AsLargeInt);
|
|
ds.Next;
|
|
end;
|
|
ds.close;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSupportDateFields;
|
|
|
|
var i : byte;
|
|
ds : TDataset;
|
|
Fld : TField;
|
|
|
|
begin
|
|
TestfieldDefinition(ftDate,8,ds,Fld);
|
|
|
|
for i := 0 to testValuesCount-1 do
|
|
begin
|
|
AssertEquals(testDateValues[i],FormatDateTime('yyyy/mm/dd',Fld.AsDateTime));
|
|
ds.Next;
|
|
end;
|
|
ds.close;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSupportCurrencyFields;
|
|
|
|
var i : byte;
|
|
ds : TDataset;
|
|
Fld : TField;
|
|
|
|
begin
|
|
TestfieldDefinition(ftCurrency,8,ds,Fld);
|
|
|
|
for i := 0 to testValuesCount-1 do
|
|
begin
|
|
AssertEquals(testCurrencyValues[i],Fld.AsCurrency);
|
|
AssertEquals(testCurrencyValues[i],Fld.AsFloat);
|
|
ds.Next;
|
|
end;
|
|
ds.close;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSupportBCDFields;
|
|
|
|
var i : byte;
|
|
ds : TDataset;
|
|
Fld : TField;
|
|
|
|
begin
|
|
TestfieldDefinition(ftBCD,8,ds,Fld);
|
|
|
|
for i := 0 to testValuesCount-1 do
|
|
begin
|
|
AssertEquals(testCurrencyValues[i],Fld.AsCurrency);
|
|
AssertEquals(testCurrencyValues[i],Fld.AsFloat);
|
|
ds.Next;
|
|
end;
|
|
ds.close;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestSupportFixedStringFields;
|
|
var i : byte;
|
|
ds : TDataset;
|
|
Fld : TField;
|
|
|
|
begin
|
|
TestfieldDefinition(ftFixedChar,10,ds,Fld);
|
|
for i := 0 to testValuesCount-1 do
|
|
begin
|
|
if Fld.IsNull then // If the field is null, .AsString always returns an empty, non-padded string
|
|
AssertEquals(testStringValues[i],Fld.AsString)
|
|
else
|
|
AssertEquals(PadRight(testStringValues[i],10),Fld.AsString);
|
|
ds.Next;
|
|
end;
|
|
ds.close;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestDoubleClose;
|
|
begin
|
|
with DBConnector.GetNDataset(1) do
|
|
begin
|
|
close;
|
|
close;
|
|
open;
|
|
close;
|
|
close;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAssignFieldftString;
|
|
var AParam : TParam;
|
|
AField : TField;
|
|
begin
|
|
AParam := TParam.Create(nil);
|
|
|
|
with DBConnector.GetNDataset(1) do
|
|
begin
|
|
open;
|
|
AField := fieldbyname('name');
|
|
AParam.AssignField(AField);
|
|
AssertTrue(ftString=AParam.DataType);
|
|
close;
|
|
end;
|
|
AParam.Free;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestAssignFieldftFixedChar;
|
|
var AParam : TParam;
|
|
AField : TField;
|
|
begin
|
|
AParam := TParam.Create(nil);
|
|
with DBConnector.GetNDataset(1) do
|
|
begin
|
|
open;
|
|
AField := fieldbyname('name');
|
|
(AField as tstringfield).FixedChar := true;
|
|
AParam.AssignField(AField);
|
|
AssertTrue(ftFixedChar=AParam.DataType);
|
|
close;
|
|
end;
|
|
AParam.Free;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestBufDatasetCancelUpd;
|
|
var i : byte;
|
|
begin
|
|
if not (DBConnector.GetNDataset(5) is TBufDataset) then
|
|
Ignore('This test only applies to TBufDataset and descendents.');
|
|
with DBConnector.GetNDataset(5) as TBufDataset do
|
|
begin
|
|
open;
|
|
next;
|
|
next;
|
|
|
|
edit;
|
|
FieldByName('name').AsString := 'changed';
|
|
post;
|
|
next;
|
|
delete;
|
|
|
|
CancelUpdates;
|
|
|
|
First;
|
|
|
|
for i := 1 to 5 do
|
|
begin
|
|
AssertEquals(i,fields[0].AsInteger);
|
|
AssertEquals('TestName'+inttostr(i),fields[1].AsString);
|
|
Next;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.Testbug7007;
|
|
|
|
var
|
|
datalink1: tdatalink;
|
|
datasource1: tdatasource;
|
|
query1: TDataSet;
|
|
|
|
begin
|
|
query1:= DBConnector.GetNDataset(6);
|
|
datalink1:= TTestDataLink.create;
|
|
datasource1:= tdatasource.create(nil);
|
|
try
|
|
datalink1.datasource:= datasource1;
|
|
datasource1.dataset:= query1;
|
|
datalink1.datasource:= datasource1;
|
|
|
|
DataEvents := '';
|
|
query1.open;
|
|
datalink1.buffercount:= query1.recordcount;
|
|
AssertEquals('deUpdateState:0;',DataEvents);
|
|
AssertEquals(0, datalink1.ActiveRecord);
|
|
AssertEquals(6, datalink1.RecordCount);
|
|
AssertEquals(6, query1.RecordCount);
|
|
AssertEquals(1, query1.RecNo);
|
|
|
|
DataEvents := '';
|
|
query1.append;
|
|
AssertEquals('deCheckBrowseMode:0;deUpdateState:0;deDataSetChange:0;',DataEvents);
|
|
AssertEquals(5, datalink1.ActiveRecord);
|
|
AssertEquals(6, datalink1.RecordCount);
|
|
AssertEquals(6, query1.RecordCount);
|
|
AssertTrue(query1.RecNo in [0,7]);
|
|
|
|
DataEvents := '';
|
|
query1.cancel;
|
|
AssertEquals('deCheckBrowseMode:0;deUpdateState:0;deDataSetChange:0;',DataEvents);
|
|
AssertEquals(5, datalink1.ActiveRecord);
|
|
AssertEquals(6, datalink1.RecordCount);
|
|
AssertEquals(6, query1.RecordCount);
|
|
AssertEquals(6, query1.RecNo);
|
|
finally
|
|
datalink1.free;
|
|
datasource1.free;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestBug6893;
|
|
var
|
|
datalink1: tdatalink;
|
|
datasource1: tdatasource;
|
|
query1: TDataSet;
|
|
|
|
begin
|
|
query1:= DBConnector.GetNDataset(25);
|
|
datalink1:= TDataLink.create;
|
|
datasource1:= tdatasource.create(nil);
|
|
try
|
|
datalink1.datasource:= datasource1;
|
|
datasource1.dataset:= query1;
|
|
|
|
datalink1.buffercount:= 5;
|
|
query1.active := true;
|
|
query1.MoveBy(20);
|
|
|
|
AssertEquals(5, THackDataLink(datalink1).Firstrecord);
|
|
AssertEquals(4, datalink1.ActiveRecord);
|
|
AssertEquals(21, query1.RecNo);
|
|
|
|
query1.active := False;
|
|
|
|
AssertEquals(0, THackDataLink(datalink1).Firstrecord);
|
|
AssertEquals(0, datalink1.ActiveRecord);
|
|
|
|
query1.active := true;
|
|
|
|
AssertEquals(0, THackDataLink(datalink1).Firstrecord);
|
|
AssertEquals(0, datalink1.ActiveRecord);
|
|
AssertEquals(1, query1.RecNo);
|
|
|
|
finally
|
|
datalink1.free;
|
|
datasource1.free;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestBufDatasetCancelUpd1;
|
|
var i : byte;
|
|
begin
|
|
if not (DBConnector.GetNDataset(5) is TBufDataset) then
|
|
Ignore('This test only applies to TBufDataset and descendents.');
|
|
with DBConnector.GetNDataset(5) as TBufDataset do
|
|
begin
|
|
open;
|
|
next;
|
|
next;
|
|
|
|
delete;
|
|
insert;
|
|
FieldByName('id').AsInteger := 100;
|
|
post;
|
|
|
|
CancelUpdates;
|
|
|
|
last;
|
|
|
|
for i := 5 downto 1 do
|
|
begin
|
|
AssertEquals(i,fields[0].AsInteger);
|
|
AssertEquals('TestName'+inttostr(i),fields[1].AsString);
|
|
Prior;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestMultipleDeleteUpdateBuffer;
|
|
var ds : TDataset;
|
|
begin
|
|
ds := DBConnector.GetNDataset(true,5);
|
|
if not (ds is TBufDataset) then
|
|
Ignore('This test only applies to TBufDataset and descendents.');
|
|
|
|
ds.open;
|
|
with TBufDataset(ds) do
|
|
begin
|
|
AssertEquals(0,ChangeCount);
|
|
edit;
|
|
fieldbyname('id').asinteger := 500;
|
|
fieldbyname('name').AsString := 'JoJo';
|
|
post;
|
|
AssertEquals(1,ChangeCount);
|
|
next; next;
|
|
Delete;
|
|
AssertEquals(2,ChangeCount);
|
|
Delete;
|
|
AssertEquals(3,ChangeCount);
|
|
CancelUpdates;
|
|
end;
|
|
ds.close;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestDoubleDelete;
|
|
var ds : TBufDataset;
|
|
begin
|
|
ds := TBufDataset(DBConnector.GetNDataset(true,5));
|
|
if not (ds is TBufDataset) then
|
|
Ignore('This test only applies to TBufDataset and descendents.');
|
|
|
|
with ds do
|
|
begin
|
|
open;
|
|
next; next;
|
|
Delete;
|
|
Delete;
|
|
|
|
first;
|
|
AssertEquals(1,fieldbyname('id').AsInteger);
|
|
next;
|
|
AssertEquals(2,fieldbyname('id').AsInteger);
|
|
next;
|
|
AssertEquals(5,fieldbyname('id').AsInteger);
|
|
|
|
CancelUpdates;
|
|
|
|
first;
|
|
AssertEquals(1,fieldbyname('id').AsInteger);
|
|
next;
|
|
AssertEquals(2,fieldbyname('id').AsInteger);
|
|
next;
|
|
AssertEquals(3,fieldbyname('id').AsInteger);
|
|
next;
|
|
AssertEquals(4,fieldbyname('id').AsInteger);
|
|
next;
|
|
AssertEquals(5,fieldbyname('id').AsInteger);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestDBBasics.TestNullAtOpen;
|
|
begin
|
|
with dbconnector.getndataset(0) do
|
|
begin
|
|
active:= true;
|
|
AssertTrue('Field isn''t NULL on a just-opened empty dataset',fieldbyname('id').IsNull);
|
|
append;
|
|
AssertTrue('Field isn''t NULL after append on an empty dataset',fieldbyname('id').IsNull);
|
|
fieldbyname('id').asinteger:= 123;
|
|
cancel;
|
|
AssertTrue('Field isn''t NULL after cancel',fieldbyname('id').IsNull);
|
|
end;
|
|
|
|
end;
|
|
|
|
{ TSQLTestSetup }
|
|
procedure TDBBasicsTestSetup.OneTimeSetup;
|
|
begin
|
|
InitialiseDBConnector;
|
|
end;
|
|
|
|
procedure TDBBasicsTestSetup.OneTimeTearDown;
|
|
begin
|
|
FreeAndNil(DBConnector);
|
|
end;
|
|
|
|
initialization
|
|
RegisterTestDecorator(TDBBasicsTestSetup, TTestDBBasics);
|
|
end.
|