fcl-db: csvdataset: take into account Delimiter when saving, open file with fmCreate when saving + tests; bug #33432

git-svn-id: trunk@39009 -
This commit is contained in:
lacak 2018-05-17 06:29:51 +00:00
parent 3d6d020fca
commit 77dc0597e9
2 changed files with 59 additions and 23 deletions

View File

@ -217,6 +217,7 @@ Var
begin
FBuilder:=TCSVBuilder.Create;
FBuilder.Assign(FOptions);
FBuilder.SetOutput(Stream);
if FOptions.FirstLineAsFieldNames then
begin
@ -375,7 +376,7 @@ Var
begin
First;
MergeChangeLog;
P:=TCSVDataPacketReader.Create(Self,AStream,FCSVOPtions);
P:=TCSVDataPacketReader.Create(Self,AStream,FCSVOptions);
try
GetDatasetPacket(P);
finally
@ -388,7 +389,7 @@ Var
F : TFileStream;
begin
F:=TFileStream.Create(AFileName,fmOpenRead or fmShareDenyWrite);
F:=TFileStream.Create(AFileName, fmCreate);
try
SaveToCSVStream(F);
finally

View File

@ -32,12 +32,14 @@ type
Procedure TestLoad2fieldsFirstLineAsNames;
Procedure TestLoad2fields;
Procedure TestLoad2Records2fields;
Procedure TestLoad2Records2fieldsTabDelim;
Procedure TestSaveEmptyDefault;
Procedure TestSaveEmptyFirstLineAsNames;
Procedure TestSaveOneRecordDefault;
Procedure TestSaveOneRecordFirstLineAsNames;
Procedure TestSaveTwoRecordsDefault;
Procedure TestSaveTwoRecordsFirstLineAsNames;
Procedure TestSaveTwoRecordsFirstLineAsNamesTabDelim;
Procedure TestSaveOneRecord2FieldsDefault;
Procedure TestSaveOneRecord2FieldsFirstLineAsNames;
Procedure TestLoadPriorFieldDefs;
@ -72,7 +74,7 @@ begin
end;
end;
Procedure TTestCSVDataset.LoadFromLines(Const Lines : Array of string);
procedure TTestCSVDataset.LoadFromLines(const Lines: array of string);
Var
L : TStringList;
@ -90,7 +92,7 @@ begin
end;
end;
Procedure TTestCSVDataset.SaveToLines(Const Lines: TStrings);
procedure TTestCSVDataset.SaveToLines(const Lines: TStrings);
Var
S : TStringStream;
@ -110,7 +112,7 @@ begin
end;
end;
Procedure TTestCSVDataset.AssertLines(Const Lines: Array of string);
procedure TTestCSVDataset.AssertLines(const Lines: array of string);
Var
L : TStrings;
@ -127,7 +129,7 @@ begin
end;
end;
Procedure TTestCSVDataset.TestLoadEmptyDefault;
procedure TTestCSVDataset.TestLoadEmptyDefault;
begin
LoadFromLines(['a']);
AssertEquals('Active',True,CSVDataset.Active);
@ -138,7 +140,7 @@ begin
AssertEquals('field contents','a',CSVDataset.Fields[0].AsString);
end;
Procedure TTestCSVDataset.TestLoadEmptyFirstLineAsNames;
procedure TTestCSVDataset.TestLoadEmptyFirstLineAsNames;
begin
CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
@ -151,7 +153,7 @@ begin
AssertEquals('Empty',True,CSVDataset.EOF and CSVDataset.BOF);
end;
Procedure TTestCSVDataset.TestLoad2fieldsFirstLineAsNames;
procedure TTestCSVDataset.TestLoad2fieldsFirstLineAsNames;
begin
CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
CSVDataset.CSVOptions.DefaultFieldLength:=128;
@ -165,7 +167,7 @@ begin
AssertEquals('Empty',True,CSVDataset.EOF and CSVDataset.BOF);
end;
Procedure TTestCSVDataset.TestLoad2fields;
procedure TTestCSVDataset.TestLoad2fields;
begin
CSVDataset.CSVOptions.DefaultFieldLength:=128;
@ -182,7 +184,7 @@ begin
AssertEquals('field 1 contents','b',CSVDataset.Fields[1].AsString);
end;
Procedure TTestCSVDataset.TestLoad2Records2fields;
procedure TTestCSVDataset.TestLoad2Records2fields;
begin
CSVDataset.CSVOptions.DefaultFieldLength:=128;
LoadFromLines(['a,b','c,d']);
@ -204,14 +206,35 @@ begin
AssertEquals('At EOF',True,CSVDataset.EOF);
end;
Procedure TTestCSVDataset.TestSaveEmptyDefault;
procedure TTestCSVDataset.TestLoad2Records2fieldsTabDelim;
begin
CSVDataset.CSVOptions.Delimiter:=#9;
CSVDataset.CSVOptions.DefaultFieldLength:=10;
CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
LoadFromLines(['f_a'#9'f_b','a1'#9'b1','a2'#9'b2']);
AssertEquals('Active',True,CSVDataset.Active);
AssertEquals('field count',2,CSVDataset.FieldDefs.Count);
AssertEquals('field 0 name','f_a',CSVDataset.FieldDefs[0].Name);
AssertEquals('field 0 size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[0].Size);
AssertEquals('field 1 name','f_b',CSVDataset.FieldDefs[1].Name);
AssertEquals('field 1 size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[1].Size);
AssertEquals('field 0 contents','a1',CSVDataset.Fields[0].AsString);
AssertEquals('field 1 contents','b1',CSVDataset.Fields[1].AsString);
CSVDataset.Next;
AssertEquals('field 0 contents','a2',CSVDataset.Fields[0].AsString);
AssertEquals('field 1 contents','b2',CSVDataset.Fields[1].AsString);
CSVDataset.Next;
AssertEquals('At EOF',True,CSVDataset.EOF);
end;
procedure TTestCSVDataset.TestSaveEmptyDefault;
begin
CSVDataset.FieldDefs.Add('a',ftString);
CSVDataset.CreateDataset;
AssertLines([]);
end;
Procedure TTestCSVDataset.TestSaveEmptyFirstLineAsNames;
procedure TTestCSVDataset.TestSaveEmptyFirstLineAsNames;
begin
CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
CSVDataset.FieldDefs.Add('a',ftString);
@ -219,7 +242,7 @@ begin
AssertLines(['a']);
end;
Procedure TTestCSVDataset.TestSaveOneRecordDefault;
procedure TTestCSVDataset.TestSaveOneRecordDefault;
begin
// CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
CSVDataset.FieldDefs.Add('a',ftString,20);
@ -230,7 +253,7 @@ begin
AssertLines(['b']);
end;
Procedure TTestCSVDataset.TestSaveOneRecordFirstLineAsNames;
procedure TTestCSVDataset.TestSaveOneRecordFirstLineAsNames;
begin
CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
CSVDataset.FieldDefs.Add('a',ftString,20);
@ -241,7 +264,7 @@ begin
AssertLines(['a','b']);
end;
Procedure TTestCSVDataset.TestSaveTwoRecordsDefault;
procedure TTestCSVDataset.TestSaveTwoRecordsDefault;
begin
CSVDataset.FieldDefs.Add('a',ftString,20);
CSVDataset.CreateDataset;
@ -254,7 +277,7 @@ begin
AssertLines(['b','c']);
end;
Procedure TTestCSVDataset.TestSaveTwoRecordsFirstLineAsNames;
procedure TTestCSVDataset.TestSaveTwoRecordsFirstLineAsNames;
begin
CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
CSVDataset.FieldDefs.Add('a',ftString,20);
@ -268,7 +291,19 @@ begin
AssertLines(['a','b','c']);
end;
Procedure TTestCSVDataset.TestSaveOneRecord2FieldsDefault;
procedure TTestCSVDataset.TestSaveTwoRecordsFirstLineAsNamesTabDelim;
begin
CSVDataset.CSVOptions.Delimiter:=#9;
CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
CSVDataset.FieldDefs.Add('f_a',ftString,2);
CSVDataset.FieldDefs.Add('f_b',ftString,2);
CSVDataset.CreateDataset;
CSVDataset.InsertRecord(['a2','b2']);
CSVDataset.InsertRecord(['a1','b1']);
AssertLines(['f_a'#9'f_b','a1'#9'b1','a2'#9'b2']);
end;
procedure TTestCSVDataset.TestSaveOneRecord2FieldsDefault;
begin
CSVDataset.FieldDefs.Add('a',ftString,20);
CSVDataset.FieldDefs.Add('b',ftString,20);
@ -280,7 +315,7 @@ begin
AssertLines(['c,d']);
end;
Procedure TTestCSVDataset.TestSaveOneRecord2FieldsFirstLineAsNames;
procedure TTestCSVDataset.TestSaveOneRecord2FieldsFirstLineAsNames;
begin
CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
CSVDataset.FieldDefs.Add('a',ftString,20);
@ -293,7 +328,7 @@ begin
AssertLines(['a,b','c,d']);
end;
Procedure TTestCSVDataset.TestLoadPriorFieldDefs;
procedure TTestCSVDataset.TestLoadPriorFieldDefs;
begin
CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
CSVDataset.FieldDefs.Add('a',ftString,20);
@ -310,7 +345,7 @@ begin
AssertEquals('field 1 contents',2,CSVDataset.Fields[1].AsInteger);
end;
Procedure TTestCSVDataset.TestLoadPriorFieldDefsNoFieldNames;
procedure TTestCSVDataset.TestLoadPriorFieldDefsNoFieldNames;
begin
CSVDataset.FieldDefs.Add('a',ftString,20);
CSVDataset.FieldDefs.Add('b',ftInteger,4);
@ -326,7 +361,7 @@ begin
AssertEquals('field 1 contents',2,CSVDataset.Fields[1].AsInteger);
end;
Procedure TTestCSVDataset.TestLoadPriorFieldDefsNoFieldNamesWrongCount;
procedure TTestCSVDataset.TestLoadPriorFieldDefsNoFieldNamesWrongCount;
Var
OK : Boolean;
@ -343,7 +378,7 @@ begin
Fail('Expected exception, but none raised');
end;
Procedure TTestCSVDataset.TestLoadPriorFieldDefsFieldNamesWrongCount;
procedure TTestCSVDataset.TestLoadPriorFieldDefsFieldNamesWrongCount;
const
EM = 'DS : CSV File Field count (1) does not match dataset field count (2).';
@ -365,7 +400,7 @@ begin
Fail(OK);
end;
Procedure TTestCSVDataset.TestLoadPriorFieldDefsFieldNamesWrongNames;
procedure TTestCSVDataset.TestLoadPriorFieldDefsFieldNamesWrongNames;
const
EM = 'DS : CSV File field 1: name "c" does not match dataset field name "b".';
Var