mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-27 18:13:47 +02:00
179 lines
4.3 KiB
ObjectPascal
179 lines
4.3 KiB
ObjectPascal
unit TestSpecificTMemDataSet;
|
|
|
|
{
|
|
Unit tests which are specific to TMemDataset
|
|
}
|
|
|
|
{$mode objfpc}{$H+}
|
|
{$codepage UTF8}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils,
|
|
testregistry,
|
|
ToolsUnit;
|
|
|
|
type
|
|
|
|
{ TTestSpecificTMemDataset }
|
|
|
|
TTestSpecificTMemDataset = class(TDBBasicsTestCase)
|
|
private
|
|
protected
|
|
published
|
|
procedure TestClear;
|
|
procedure TestFileName;
|
|
procedure TestCopyFromDataset; //is copied dataset identical to original?
|
|
procedure TestCopyFromDatasetMoved; //move record then copy. Is copy identical? Has record position changed?
|
|
Procedure TestLocateUTF8;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
MemDS, db;
|
|
|
|
const
|
|
Test_FileName='test.dat';
|
|
|
|
{ TTestSpecificTMemDataset }
|
|
|
|
procedure TTestSpecificTMemDataset.TestClear;
|
|
const
|
|
testValuesCount=3;
|
|
var
|
|
i: integer;
|
|
begin
|
|
with DBConnector.GetNDataset(10) as TMemDataset do
|
|
begin
|
|
Open;
|
|
Clear;
|
|
// test after FieldDefs are Cleared, if internal structures are updated properly
|
|
// create other FieldDefs
|
|
FieldDefs.Add('Fs', ftString, 20);
|
|
FieldDefs.Add('Fi', ftInteger);
|
|
FieldDefs.Add('Fi2', ftInteger);
|
|
// use only Open without CreateTable
|
|
Open;
|
|
CheckTrue(IsEmpty);
|
|
CheckEquals(0, DataSize);
|
|
// add some data
|
|
for i:=1 to testValuesCount do
|
|
AppendRecord([TestStringValues[i], TestIntValues[i], TestIntValues[i]]);
|
|
// check data
|
|
CheckEquals(testValuesCount, RecordCount);
|
|
First;
|
|
for i:=1 to testValuesCount do
|
|
begin
|
|
CheckEquals(TestStringValues[i], FieldByName('Fs').AsString);
|
|
CheckEquals(TestIntValues[i], FieldByName('Fi2').AsInteger);
|
|
Next;
|
|
end;
|
|
CheckTrue(Eof);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestSpecificTMemDataset.TestFileName;
|
|
var memds1, memds2: TMemDataset;
|
|
begin
|
|
memds1:=DBConnector.GetFieldDataset as TMemDataset;
|
|
memds2:=DBConnector.GetNDataset(0) as TMemDataset;
|
|
|
|
memds1.Open;
|
|
memds1.SaveToFile(Test_FileName);
|
|
memds1.Close;
|
|
memds1.Clear;
|
|
|
|
memds1.FileName:=Test_FileName;
|
|
memds1.Open;
|
|
CheckFieldDatasetValues(memds1);
|
|
|
|
// try read same file into different dataset, testing if FieldDefs are updated properly
|
|
memds2.FileName:=Test_FileName;
|
|
memds2.Open;
|
|
CheckFieldDatasetValues(memds2);
|
|
DeleteFile(memds2.FileName);
|
|
end;
|
|
|
|
procedure TTestSpecificTMemDataset.TestCopyFromDataset;
|
|
var memds1, memds2: TMemDataset;
|
|
i: integer;
|
|
begin
|
|
memds1:=DBConnector.GetFieldDataset as TMemDataset;
|
|
memds2:=DBConnector.GetNDataset(0) as TMemDataset;
|
|
|
|
memds1.Open;
|
|
// insert 1st row with all NULL values
|
|
memds1.Insert; memds1.Post;
|
|
memds2.CopyFromDataset(memds1);
|
|
// check if 1st row has all NULL values
|
|
for i:=0 to memds2.FieldCount-1 do CheckTrue(memds2.Fields[i].IsNull, 'IsNull');
|
|
memds2.Delete;
|
|
CheckFieldDatasetValues(memds2);
|
|
end;
|
|
|
|
procedure TTestSpecificTMemDataset.TestCopyFromDatasetMoved;
|
|
var
|
|
memds1, memds2: TMemDataset;
|
|
CurrentID,NewID: integer;
|
|
begin
|
|
memds1:=DBConnector.GetFieldDataset as TMemDataset;
|
|
memds2:=DBConnector.GetNDataset(0) as TMemDataset;
|
|
|
|
memds1.Open;
|
|
memds1.Next; //this should not influence the copydataset step.
|
|
CurrentID:=memds1.FieldByName('ID').AsInteger;
|
|
memds2.CopyFromDataset(memds1);
|
|
CheckFieldDatasetValues(memds2);
|
|
NewID:=memds1.FieldByName('ID').AsInteger;
|
|
CheckEquals(CurrentID,NewID,'Mismatch between ID field contents - the record has moved.');
|
|
end;
|
|
|
|
procedure TTestSpecificTMemDataset.TestLocateUTF8;
|
|
Var
|
|
MemDataset1: TMemDataset;
|
|
S : UTF8String;
|
|
begin
|
|
MemDataset1:=TMemDataset.Create(Nil);
|
|
With MemDataset1 do
|
|
try
|
|
FieldDefs.Add('first',ftString,40,0,true,False,1,cp_UTF8);
|
|
FieldDefs.Add('second',ftString,40,0,true,False,2,cp_ACP);
|
|
CreateTable;
|
|
Active:=True;
|
|
Append;
|
|
Fields[0].AsUTF8String:='♯abcd';
|
|
Fields[1].AsString:='native';
|
|
Post;
|
|
Append;
|
|
Fields[0].AsUTF8String:='défaut';
|
|
Fields[1].AsString:='morenative';
|
|
Post;
|
|
First;
|
|
While not eof do
|
|
begin
|
|
S:=fields[0].AsUTF8String;
|
|
Writeln(S);
|
|
next;
|
|
end;
|
|
First;
|
|
AssertTrue('UTF8 1 ok',Locate('first','♯abcd',[]));
|
|
AssertTrue('UTF8 2 ok',Locate('first','défaut',[]));
|
|
AssertTrue('ANSI 1 ok',Locate('second','native',[]));
|
|
AssertTrue('ANSI 1 ok',Locate('second','morenative',[]));
|
|
finally
|
|
Free;
|
|
end;
|
|
end;
|
|
|
|
|
|
initialization
|
|
|
|
if uppercase(dbconnectorname)='MEMDS' then
|
|
begin
|
|
RegisterTestDecorator(TDBBasicsTestSetup, TTestSpecificTMemDataset);
|
|
end;
|
|
|
|
end.
|