* Mantis #21922, improve testsuite for bufdatasets.

Joint patch of Lacak2, Ludo Brands & Reinier Olislagers 

git-svn-id: trunk@21200 -
This commit is contained in:
marco 2012-05-02 20:46:26 +00:00
parent 614a192d87
commit 87e010462b

View File

@ -1,5 +1,12 @@
unit BufDatasetToolsUnit; unit BufDatasetToolsUnit;
{ Sets up bufdataset for testing.
Tests expect Get*Dataset tho return a dataset with structure and test data, but closed.
A closed BufDataset normally has no data, so these tests won't work.
To circumvent this, this unit saves the dataset contents to file and reloads them on opening using BufDataset persistence mechanism.
}
{$mode objfpc}{$H+} {$mode objfpc}{$H+}
interface interface
@ -11,7 +18,12 @@ uses
type type
{ TbufdatasetConnector } { TbufdatasetConnector }
{ TbufdatasetDBConnector }
TbufdatasetDBConnector = class(TDBConnector) TbufdatasetDBConnector = class(TDBConnector)
private
FUniDirectional: boolean;
protected protected
procedure CreateNDatasets; override; procedure CreateNDatasets; override;
procedure CreateFieldDataset; override; procedure CreateFieldDataset; override;
@ -19,38 +31,60 @@ type
procedure DropFieldDataset; override; procedure DropFieldDataset; override;
Function InternalGetNDataset(n : integer) : TDataset; override; Function InternalGetNDataset(n : integer) : TDataset; override;
Function InternalGetFieldDataset : TDataSet; override; Function InternalGetFieldDataset : TDataSet; override;
procedure SetTestUniDirectional(const AValue: boolean); override;
function GetTestUniDirectional: boolean; override;
end; end;
implementation implementation
type
{ TPersistentBufDataSet }
TPersistentBufDataSet=class(TBufDataset)
private
TempFileName:string;
public
destructor Destroy; override;
end;
{ TPersistentBufDataSet }
destructor TPersistentBufDataSet.Destroy;
begin
Close; // no locks on TempFileName
DeleteFile(TempFileName);
inherited Destroy;
end;
{ TbufdatasetDBConnector } { TbufdatasetDBConnector }
procedure TbufdatasetDBConnector.CreateNDatasets; procedure TbufdatasetDBConnector.CreateNDatasets;
begin begin
// All datasets only exist in memory, so nothing has to be done // All datasets are created in InternalGet*Dataset
end; end;
procedure TbufdatasetDBConnector.CreateFieldDataset; procedure TbufdatasetDBConnector.CreateFieldDataset;
begin begin
// All datasets only exist in memory, so nothing has to be done // All datasets are created in InternalGet*Dataset
end; end;
procedure TbufdatasetDBConnector.DropNDatasets; procedure TbufdatasetDBConnector.DropNDatasets;
begin begin
// All datasets only exist in memory, so nothing has to be done // All datasets are created in InternalGet*Dataset and cleaned up when destroyed
end; end;
procedure TbufdatasetDBConnector.DropFieldDataset; procedure TbufdatasetDBConnector.DropFieldDataset;
begin begin
// All datasets only exist in memory, so nothing has to be done // All datasets are created in InternalGet*Dataset and cleaned up when destroyed
end; end;
function TbufdatasetDBConnector.InternalGetNDataset(n: integer): TDataset; function TbufdatasetDBConnector.InternalGetNDataset(n: integer): TDataset;
var BufDataset : TBufDataset; var BufDataset : TPersistentBufDataSet;
i : integer; i : integer;
begin begin
BufDataset := TBufDataset.Create(nil); BufDataset := TPersistentBufDataSet.Create(nil);
BufDataset.FieldDefs.Add('ID',ftInteger); BufDataset.FieldDefs.Add('ID',ftInteger);
BufDataset.FieldDefs.Add('NAME',ftString,50); BufDataset.FieldDefs.Add('NAME',ftString,50);
BufDataset.CreateDataset; BufDataset.CreateDataset;
@ -62,31 +96,37 @@ begin
BufDataset.FieldByName('NAME').AsString := 'TestName' + inttostr(i); BufDataset.FieldByName('NAME').AsString := 'TestName' + inttostr(i);
BufDataset.Post; BufDataset.Post;
end; end;
BufDataset.Close; BufDataset.TempFileName:=GetTempFileName;
BufDataset.FileName:=BufDataset.TempFileName;
BufDataset.Close; // Save data into file
Result := BufDataset; Result := BufDataset;
end; end;
function TbufdatasetDBConnector.InternalGetFieldDataset : TDataSet; function TbufdatasetDBConnector.InternalGetFieldDataset : TDataSet;
var BufDataset : TBufDataset; var BufDataset : TPersistentBufDataSet;
i : integer; i : integer;
begin begin
BufDataset := TBufDataset.Create(nil); // Values >= 24:00:00.000 can't be handled by bufdataset
testTimeValues[2] := '23:59:59.000';
testTimeValues[3] := '23:59:59.003';
BufDataset := TPersistentBufDataSet.Create(nil);
with BufDataset do with BufDataset do
begin begin
//todo: this is based on memds. UniDirectional := FUniDirectional;
//check and add bufdataset supported fields
FieldDefs.Add('ID',ftInteger); FieldDefs.Add('ID',ftInteger);
FieldDefs.Add('FSTRING',ftString,10); FieldDefs.Add('FSTRING',ftString,10);
FieldDefs.Add('FSMALLINT',ftSmallint); FieldDefs.Add('FSMALLINT',ftSmallint);
FieldDefs.Add('FINTEGER',ftInteger); FieldDefs.Add('FINTEGER',ftInteger);
// FieldDefs.Add('FWORD',ftWord); // Not supported by BufDataset:
// FieldDefs.Add('FWORD',ftWord);
FieldDefs.Add('FBOOLEAN',ftBoolean); FieldDefs.Add('FBOOLEAN',ftBoolean);
FieldDefs.Add('FFLOAT',ftFloat); FieldDefs.Add('FFLOAT',ftFloat);
// FieldDefs.Add('FCURRENCY',ftCurrency); FieldDefs.Add('FCURRENCY',ftCurrency);
// FieldDefs.Add('FBCD',ftBCD); FieldDefs.Add('FBCD',ftBCD);
FieldDefs.Add('FDATE',ftDate); FieldDefs.Add('FDATE',ftDate);
FieldDefs.Add('FTIME',ftTime); FieldDefs.Add('FTIME',ftTime);
FieldDefs.Add('FDATETIME',ftDateTime); FieldDefs.Add('FDATETIME',ftDateTime);
@ -102,16 +142,30 @@ begin
FieldByName('FINTEGER').AsInteger := testIntValues[i]; FieldByName('FINTEGER').AsInteger := testIntValues[i];
FieldByName('FBOOLEAN').AsBoolean := testBooleanValues[i]; FieldByName('FBOOLEAN').AsBoolean := testBooleanValues[i];
FieldByName('FFLOAT').AsFloat := testFloatValues[i]; FieldByName('FFLOAT').AsFloat := testFloatValues[i];
ShortDateFormat := 'yyyy-mm-dd'; FieldByName('FCURRENCY').AsCurrency := testCurrencyValues[i];
FieldByName('FDATE').AsDateTime := StrToDate(testDateValues[i]); FieldByName('FBCD').AsCurrency := testCurrencyValues[i];
FieldByName('FDATE').AsDateTime := StrToDateTime(testDateValues[i], Self.FormatSettings);
FieldByName('FTIME').AsDateTime := StrToTime(testTimeValues[i], Self.FormatSettings);
FieldByName('FLARGEINT').AsLargeInt := testLargeIntValues[i]; FieldByName('FLARGEINT').AsLargeInt := testLargeIntValues[i];
Post; Post;
end; end;
Close; BufDataset.TempFileName:=GetTempFileName;
BufDataset.FileName:=BufDataset.TempFileName;
Close; // Save data into file
end; end;
Result := BufDataset; Result := BufDataset;
end; end;
procedure TbufdatasetDBConnector.SetTestUniDirectional(const AValue: boolean);
begin
FUniDirectional := AValue;
end;
function TbufdatasetDBConnector.GetTestUniDirectional: boolean;
begin
Result := FUniDirectional;
end;
initialization initialization
RegisterClass(TbufdatasetDBConnector); RegisterClass(TbufdatasetDBConnector);
end. end.