Просмотр исходного кода

* test for Data dictionary diff mechanism

git-svn-id: trunk@11545 -
michael 17 лет назад
Родитель
Сommit
c2dc42bb89
2 измененных файлов с 395 добавлено и 0 удалено
  1. 1 0
      .gitattributes
  2. 394 0
      packages/fcl-db/tests/testdddiff.pp

+ 1 - 0
.gitattributes

@@ -1325,6 +1325,7 @@ packages/fcl-db/tests/sqldbtoolsunit.pas -text
 packages/fcl-db/tests/testbasics.pas svneol=native#text/plain
 packages/fcl-db/tests/testdatasources.pas svneol=native#text/plain
 packages/fcl-db/tests/testdbbasics.pas -text
+packages/fcl-db/tests/testdddiff.pp svneol=native#text/plain
 packages/fcl-db/tests/testfieldtypes.pas svneol=native#text/plain
 packages/fcl-db/tests/testsqlscript.pas svneol=native#text/plain
 packages/fcl-db/tests/toolsunit.pas -text

+ 394 - 0
packages/fcl-db/tests/testdddiff.pp

@@ -0,0 +1,394 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2008 by the Free Pascal development team
+
+    FPCUnit fpdddiff test.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit testdddiff;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, testregistry, fpcunit, fpdddiff, fpdatadict;
+
+type
+
+  { TMyDiff }
+
+  TMyDiff = class (TCustomDDDiffer)
+  private
+    FMsg: TStringlist;
+    function GetIndexName (ID : TDDIndexDef) : string;
+    function GetFieldName (FD : TDDFieldDef) : string;
+  protected
+    procedure TableDifference (DiffType: TDifferenceType; SourceTable, TargetTable: TDDTableDef); override;
+    procedure IndexDifference (DiffType: TDifferenceType; SourceIndex, TargetIndex: TDDIndexDef); override;
+    procedure FieldDifference (DiffType: TDifferenceType; SourceField, TargetField: TDDFieldDef); override;
+  public
+    Constructor create;
+    destructor destroy; override;
+  public
+    property Messages : TStringlist read FMsg;
+  end;
+  
+  { TTestDDDiff }
+
+  TTestDDDiff = class (TTestcase)
+  private
+    Differ : TMyDiff;
+    SourceDD, TargetDD : TFPDataDictionary;
+    procedure SetupSourceDD;
+    procedure SetupTargetDD;
+    function CreateTable (DD: TFPDataDictionary; tablename:string) : TDDTableDef;
+    procedure AssertMessageCount (ACount: integer);
+    procedure AssertMessage (AMessage: string);
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure TestEquals;
+    procedure TestSourceTable;
+    procedure TestTargetTable;
+    procedure TestSourceField;
+    procedure TestTargetField;
+    procedure TestSourceIndex;
+    procedure TestTargetIndex;
+    procedure TestFieldType;
+    procedure TestFieldSize;
+    procedure TestFieldPrecision;
+    procedure TestFieldDefExpression;
+    procedure TestFieldRequired;
+    procedure TestIndexOptions;
+    procedure TestIndexExpression;
+    procedure TestIndexFields;
+    procedure TestIndexDescFields;
+    procedure TestIndexCaseInsFields;
+  end;
+  
+  
+implementation
+
+uses db;
+
+{ TMyDiff }
+
+function TMyDiff.GetIndexName(ID: TDDIndexDef): string;
+begin
+  result := TDDIndexdefs(ID.Collection).TableName + '.' + ID.IndexName;
+end;
+
+function TMyDiff.GetFieldName(FD: TDDFieldDef): string;
+begin
+  result := TDDFielddefs(FD.Collection).TableName + '.' + FD.FieldName;
+end;
+
+procedure TMyDiff.TableDifference(DiffType: TDifferenceType; SourceTable,
+  TargetTable: TDDTableDef);
+begin
+  case DiffType of
+    dtMissing: FMsg.Add (format('ST %s', [SourceTable.TableName]));
+    dtSurplus: FMsg.Add (format('TT %s', [TargetTable.TableName]));
+    dtDifferent: FMsg.Add (format('DT', [TargetTable.TableName]));
+  end;
+end;
+
+procedure TMyDiff.IndexDifference(DiffType: TDifferenceType; SourceIndex,
+  TargetIndex: TDDIndexDef);
+begin
+  case DiffType of
+    dtMissing: FMsg.Add (format('SI %s', [getindexname(SourceIndex)]));
+    dtSurplus: FMsg.Add (format('TI %s', [getindexname(TargetIndex)]));
+    dtDifferent: FMsg.Add (format('DI %s', [getindexname(TargetIndex)]));
+  end;
+end;
+
+procedure TMyDiff.FieldDifference(DiffType: TDifferenceType; SourceField,
+  TargetField: TDDFieldDef);
+begin
+  case DiffType of
+    dtMissing: FMsg.Add (format('SF %s', [getfieldname(SourceField)]));
+    dtSurplus: FMsg.Add (format('TF %s', [getfieldname(TargetField)]));
+    dtDifferent: FMsg.Add (format('DF %s', [getfieldname(TargetField)]));
+  end;
+end;
+
+constructor TMyDiff.create;
+begin
+  inherited;
+  FMsg := TStringlist.Create;
+end;
+
+destructor TMyDiff.destroy;
+begin
+  FMsg.Free;
+  inherited destroy;
+end;
+
+{ TTestDDDiff }
+
+procedure TTestDDDiff.SetupSourceDD;
+begin
+  SourceDD := TFPDataDictionary.Create;
+  CreateTable (SourceDD, 'EERSTE');
+  CreateTable (SourceDD, 'TWEEDE');
+end;
+
+procedure TTestDDDiff.SetupTargetDD;
+begin
+  TargetDD := TFPDataDictionary.Create;
+  CreateTable (TargetDD, 'EERSTE');
+  CreateTable (TargetDD, 'TWEEDE');
+end;
+
+function TTestDDDiff.CreateTable(DD: TFPDataDictionary; tablename: string): TDDTableDef;
+begin
+  result := dd.Tables.AddTable(tablename);
+  with result.Fields.AddField('ID') do
+    begin
+    FieldType := ftLargeint;
+    Required:=True;
+    end;
+  with result.Fields.AddField('eerste') do
+    begin
+    FieldType := ftString;
+    Required:=True;
+    Size := 25;
+    end;
+  with result.Fields.AddField('Tweede') do
+    begin
+    FieldType := ftFloat;
+    Required:=False;
+    Size := 12;
+    Precision := 4;
+    end;
+  with result.Fields.AddField('Extralang') do
+    begin
+    FieldType := ftString;
+    Required:=false;
+    Size := 1024;
+    end;
+  with result.Indexes.AddDDIndexDef('Primary') do
+    begin
+    Fields:='ID';
+    options := [ixPrimary];
+    end;
+  with result.Indexes.AddDDIndexDef('UniqueEerste') do
+    begin
+    Fields:='eerste,tweede';
+    DescFields:='eerste';
+    options := [ixUnique];
+    end;
+end;
+
+procedure TTestDDDiff.AssertMessageCount(ACount: integer);
+begin
+  AssertEquals('Number of differences', ACount, Differ.Messages.count);
+end;
+
+procedure TTestDDDiff.AssertMessage(AMessage: string);
+begin
+  if Differ.Messages.count > 1 then
+    Fail ('More differences then expected: expected '+AMessage+', got '+differ.Messages.Commatext)
+  else if Differ.messages.count = 0 then
+    Fail ('No differences found, expected 1: '+AMessage);
+  AssertEquals ('Difference detected,', AMessage, Differ.Messages[0])
+end;
+
+procedure TTestDDDiff.SetUp;
+begin
+  inherited SetUp;
+  SetupSourceDD;
+  SetupTargetDD;
+  Differ := TMyDiff.Create;
+  Differ.SourceDD := SourceDD;
+  Differ.TargetDD := TargetDD;
+end;
+
+procedure TTestDDDiff.TearDown;
+begin
+  Differ.Free;
+  FreeAndNil(SourceDD);
+  FreeAndNil(TargetDD);
+  inherited TearDown;
+end;
+
+procedure TTestDDDiff.TestEquals;
+begin
+  Differ.Compare(diffAll);
+  AssertMessageCount (0);
+end;
+
+procedure TTestDDDiff.TestSourceTable;
+begin
+  SourceDD.Tables.AddTable ('eentabel');
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('ST eentabel');
+end;
+
+procedure TTestDDDiff.TestTargetTable;
+begin
+  TargetDD.Tables.AddTable ('eentabel');
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('TT eentabel');
+end;
+
+procedure TTestDDDiff.TestSourceField;
+begin
+  with SourceDD.Tables.TableByName('TWEEDE').AddField ('extra') do
+    begin
+    FieldType := ftCurrency;
+    size := 12;
+    precision := 2;
+    required := true;
+    end;
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('SF TWEEDE.extra');
+end;
+
+procedure TTestDDDiff.TestTargetField;
+begin
+  with TargetDD.Tables.TableByName('TWEEDE').AddField ('extra') do
+    begin
+    FieldType := ftCurrency;
+    size := 12;
+    precision := 2;
+    required := true;
+    end;
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('TF TWEEDE.extra');
+end;
+
+procedure TTestDDDiff.TestSourceIndex;
+begin
+  with SourceDD.Tables.TableByName('TWEEDE').Indexes.AddIndex ('extra') do
+    begin
+    Fields := 'Tweede';
+    Options := [ixUnique];
+    end;
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('SI TWEEDE.extra');
+end;
+
+procedure TTestDDDiff.TestTargetIndex;
+begin
+  with TargetDD.Tables.TableByName('TWEEDE').Indexes.AddIndex ('extra') do
+    begin
+    Fields := 'Tweede';
+    Options := [ixUnique];
+    end;
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('TI TWEEDE.extra');
+end;
+
+procedure TTestDDDiff.TestFieldType;
+begin
+  with SourceDD.Tables.TableByName('TWEEDE').Fields.FieldByName ('tweede') do
+    FieldType := ftCurrency;
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('DF TWEEDE.Tweede');
+end;
+
+procedure TTestDDDiff.TestFieldSize;
+begin
+  with SourceDD.Tables.TableByName('TWEEDE').Fields.FieldByName ('tweede') do
+    Size := 16;
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('DF TWEEDE.Tweede');
+end;
+
+procedure TTestDDDiff.TestFieldPrecision;
+begin
+  with SourceDD.Tables.TableByName('TWEEDE').Fields.FieldByName ('tweede') do
+    Precision := 0;
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('DF TWEEDE.Tweede');
+end;
+
+procedure TTestDDDiff.TestFieldDefExpression;
+begin
+  with SourceDD.Tables.TableByName('TWEEDE').Fields.FieldByName ('tweede') do
+    DefaultExpression := '258.2345';
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('DF TWEEDE.Tweede');
+end;
+
+procedure TTestDDDiff.TestFieldRequired;
+begin
+  with SourceDD.Tables.TableByName('TWEEDE').Fields.FieldByName ('tweede') do
+    Required := true;
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('DF TWEEDE.Tweede');
+end;
+
+procedure TTestDDDiff.TestIndexOptions;
+begin
+  with SourceDD.Tables.TableByName('TWEEDE').Indexes.IndexByName('UniqueEerste') do
+    Options := [ixUnique, ixDescending];
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('DI TWEEDE.UniqueEerste');
+end;
+
+procedure TTestDDDiff.TestIndexExpression;
+begin
+  with SourceDD.Tables.TableByName('TWEEDE').Indexes.IndexByName('UniqueEerste') do
+    Expression := 'Eerste+Tweede';
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('DI TWEEDE.UniqueEerste');
+end;
+
+procedure TTestDDDiff.TestIndexFields;
+begin
+  with SourceDD.Tables.TableByName('TWEEDE').Indexes.IndexByName('UniqueEerste') do
+    Fields := 'Eerste';
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('DI TWEEDE.UniqueEerste');
+end;
+
+procedure TTestDDDiff.TestIndexDescFields;
+begin
+  with SourceDD.Tables.TableByName('TWEEDE').Indexes.IndexByName('UniqueEerste') do
+    DescFields := 'Tweede';
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('DI TWEEDE.UniqueEerste');
+end;
+
+procedure TTestDDDiff.TestIndexCaseInsFields;
+begin
+  with SourceDD.Tables.TableByName('TWEEDE').Indexes.IndexByName('UniqueEerste') do
+    CaseInsFields := 'Eesrte';
+  Differ.Compare(diffAll);
+  AssertMessageCount (1);
+  AssertMessage ('DI TWEEDE.UniqueEerste');
+end;
+
+initialization
+
+  RegisterTest (TTestDDDiff);
+  
+end.
+