From e0593d7e6a84abd6cd2829e663a17f934beee5c7 Mon Sep 17 00:00:00 2001 From: joost Date: Fri, 21 Mar 2008 14:28:34 +0000 Subject: [PATCH] * Test for CalculateFields * Added cwstring unit on unix to avoid Widestring-issues git-svn-id: trunk@10520 - --- packages/fcl-db/tests/dbftoolsunit.pas | 7 +++ packages/fcl-db/tests/testdatasources.pas | 73 ++++++++++++++++++++++- 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/packages/fcl-db/tests/dbftoolsunit.pas b/packages/fcl-db/tests/dbftoolsunit.pas index 54ca638144..ce3aa26142 100644 --- a/packages/fcl-db/tests/dbftoolsunit.pas +++ b/packages/fcl-db/tests/dbftoolsunit.pas @@ -33,6 +33,7 @@ type procedure RefreshInternalCalcFields(Buffer: PChar); override; procedure InternalInitFieldDefs; override; procedure CalculateFields(Buffer: PChar); override; + procedure ClearCalcFields(Buffer: PChar); override; end; implementation @@ -188,6 +189,12 @@ begin inherited CalculateFields(Buffer); end; +procedure TDbfTraceDataset.ClearCalcFields(Buffer: PChar); +begin + DataEvents := DataEvents + 'ClearCalcFields' + ';'; + inherited ClearCalcFields(Buffer); +end; + initialization RegisterClass(TDBFDBConnector); end. diff --git a/packages/fcl-db/tests/testdatasources.pas b/packages/fcl-db/tests/testdatasources.pas index ccd8bc0825..0fbae0d426 100644 --- a/packages/fcl-db/tests/testdatasources.pas +++ b/packages/fcl-db/tests/testdatasources.pas @@ -16,6 +16,7 @@ type TTestDatasources = class(TTestCase) private procedure FieldNotifyEvent(Sender: TField); + procedure DatasetNotifyEvent(Dataset: TDataset); protected procedure SetUp; override; procedure TearDown; override; @@ -31,11 +32,12 @@ type procedure TestDataEvent7; procedure TestCalcFirstRecord1; procedure TestRefreshLookupList; + procedure TestCalculateFields; end; implementation -uses ToolsUnit, dbf, testregistry, variants; +uses ToolsUnit, dbf, testregistry, variants{$IFDEF UNIX},cwstring {$ENDIF}; type THackDataset=class(TDataset); THackDataLink=class(TDatalink); @@ -47,6 +49,11 @@ begin DataEvents := DataEvents + 'FieldNotifyEvent' + ';'; end; +procedure TTestDatasources.DatasetNotifyEvent(Dataset: TDataset); +begin + DataEvents := DataEvents + 'DatasetNotifyEvent' + ';'; +end; + procedure TTestDatasources.SetUp; begin DBConnector.StartTest; @@ -306,7 +313,7 @@ begin DataEvents := ''; AutoCalcFields:=True; THackDataset(ds).DataEvent(deFieldChange,PtrInt(AFld)); - AssertEquals('CalculateFields;deFieldChange:ID;',DataEvents); + AssertEquals('CalculateFields;ClearCalcFields;deFieldChange:ID;',DataEvents); AFld := FieldByName('calcfld'); DataEvents := ''; @@ -485,7 +492,6 @@ end; procedure TTestDatasources.TestRefreshLookupList; var ds, lkpDs : TDataset; AFld1, AFld2, AFld3 : Tfield; - ExceptionOccured : boolean; Var1,Var2 : Variant; procedure TestLookupList; @@ -559,6 +565,67 @@ begin end; end; +procedure TTestDatasources.TestCalculateFields; +var ds, lkpDs : TDataset; + AFld1, AFld2, AFld3 : Tfield; + StoreValue : Variant; + Buffer: pchar; +begin + ds := DBConnector.GetTraceDataset(False); + lkpDs := 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); + with AFld3 do + begin + FieldName := 'LookupFld'; + FieldKind := fkLookup; + DataSet := ds; + LookupDataSet := lkpDs; + LookupKeyFields:='name'; + LookupResultField:='ID'; + KeyFields := 'name'; + end; + ds.OnCalcFields:=DatasetNotifyEvent; + lkpds.Open; + open; + Buffer:=ds.ActiveBuffer; + + // If the state is dsInternalCalc, only the OnCalcField event should be called + THackDataset(ds).SetState(dsInternalCalc); + DataEvents:=''; + StoreValue:=AFld3.Value; + THackDataset(ds).CalculateFields(Buffer); + AssertEquals('CalculateFields;DatasetNotifyEvent;',DataEvents); + AssertEquals(VarToStr(StoreValue),VarToSTr(AFld3.Value)); + THackDataset(ds).SetState(dsBrowse); + + // Also if the dataset is Unidirectional, only the OnCalcField event should be called + THackDataset(ds).SetUniDirectional(True); + DataEvents:=''; + StoreValue:=AFld3.Value; + THackDataset(ds).CalculateFields(Buffer); + AssertEquals('CalculateFields;DatasetNotifyEvent;',DataEvents); + AssertEquals(VarToStr(StoreValue),VarToSTr(AFld3.Value)); + THackDataset(ds).SetUniDirectional(False); + + // Else, the value of all the lookup fields should get calculated + DataEvents:=''; + THackDataset(ds).CalculateFields(Buffer); + AssertEquals('CalculateFields;ClearCalcFields;DatasetNotifyEvent;',DataEvents); + // This assertion fails because of bug 11027 + //AssertEquals('1',VarToStr(StoreValue)); + end; +end; + initialization if uppercase(dbconnectorname)='DBF' then RegisterTest(TTestDatasources); end.