https://bitbucket.org/ingword/mindstream/src/3af3741086ab8eee3217eb1ed3d778526159627b/Tests/Module/TestmsSerializeController.pas?at=MS-6_AddTestToMindStream
https://bitbucket.org/ingword/mindstream/commits/branch/MS-6_AddTestToMindStream
Размножение тестов относительно параметра. В данном случае - относительно TmsRegisteredShapes.
https://bitbucket.org/ingword/mindstream/commits/branch/MS-6_AddTestToMindStream
Размножение тестов относительно параметра. В данном случае - относительно TmsRegisteredShapes.
unit TestmsSerializeController; interface uses TestFramework, msSerializeController, msDiagramm, msShape, msRegisteredShapes, System.Types, System.Classes ; type TmsShapeClassCheck = TmsShapeClassLambda; TmsShapeTestPrim = class abstract(TTestCase) public class procedure CheckShapes(aCheck: TmsShapeClassCheck); end;//TmsShapeTestPrim TmsShapeTestContext = record rMethodName: string; rSeed: Integer; rDiagrammName : String; rShapesCount : Integer; rShapeClass: RmsShape; constructor Create(aMethodName: string; aSeed: Integer; aDiagrammName : String; aShapesCount : Integer; aShapeClass: RmsShape); end;//TmsShapeTestContext TmsFileLambda = reference to procedure (aFile: TFileStream); TmsDiagrammCheck = reference to procedure (aDiagramm : TmsDiagramm); TestTmsSerializeControllerPrim = class abstract(TmsShapeTestPrim) protected f_Coords : array of TPoint; f_Context : TmsShapeTestContext; protected procedure SetUp; override; procedure CheckFileWithEtalon(const aFileName: String); function MakeFileName(const aTestName: String; aShapeClass: RmsShape): String; function TestResultsFileName(aShapeClass: RmsShape): String; procedure SaveDiagrammAndCheck(aShapeClass: RmsShape; aDiagramm: TmsDiagramm); function ShapesCount: Integer; procedure CreateDiagrammAndCheck(aCheck : TmsDiagrammCheck; const aName: String); procedure CreateDiagrammWithShapeAndSaveAndCheck(aShapeClass: RmsShape); function TestSerializeMethodName: String; virtual; procedure DeserializeDiargammAndCheck(aCheck: TmsDiagrammCheck; aShapeClass: RmsShape); procedure TestDeSerializeForShapeClass(aShapeClass: RmsShape); procedure TestDeSerializeViaShapeCheckForShapeClass(aShapeClass: RmsShape); function ShapeClass: RmsShape; procedure OutToFileAndCheck(aLambda: TmsFileLambda); public constructor Create(const aContext: TmsShapeTestContext); virtual; end;//TestTmsSerializeControllerPrim TestTmsSerializeController = class abstract(TestTmsSerializeControllerPrim) published procedure TestSerialize; procedure TestDeSerialize; procedure TestDeSerializeViaShapeCheck; procedure TestShapeName; procedure TestDiagrammName; end;//TestTmsSerializeController TmsParametrizedShapeTest = class(TestTmsSerializeController) private f_TestSerializeMethodName : String; protected function TestSerializeMethodName: String; override; public constructor Create(const aContext: TmsShapeTestContext); override; end;//TmsParametrizedShapeTest RmsParametrizedShapeTest = class of TmsParametrizedShapeTest; TmsParametrizedShapeTestSuite = class(TTestSuite) private constructor CreatePrim; public procedure AddTests(testClass: TTestCaseClass); override; class function Create: ITest; end;//TmsParametrizedShapeTestSuite implementation uses System.SysUtils, msTriangle, msRectangle, msCircle, msRoundedRectangle, msMover, Winapi.Windows, System.Rtti, System.TypInfo, FMX.Objects ; function TestTmsSerializeControllerPrim.MakeFileName(const aTestName: String; aShapeClass: RmsShape): String; var l_Folder : String; begin l_Folder := ExtractFilePath(ParamStr(0)) + 'TestResults\'; ForceDirectories(l_Folder); Result := l_Folder + ClassName + '_' + aTestName + '_' + aShapeClass.ClassName + '.json'; end; procedure TestTmsSerializeControllerPrim.CheckFileWithEtalon(const aFileName: String); var l_FileSerialized, l_FileEtalon: TStringList; l_FileNameEtalon : String; begin l_FileNameEtalon := aFileName + '.etalon' + ExtractFileExt(aFileName); if FileExists(l_FileNameEtalon) then begin l_FileSerialized := TStringList.Create; l_FileSerialized.LoadFromFile(aFileName); l_FileEtalon := TStringList.Create; l_FileEtalon.LoadFromFile(l_FileNameEtalon); CheckTrue(l_FileEtalon.Equals(l_FileSerialized)); FreeAndNil(l_FileSerialized); FreeAndNil(l_FileEtalon); end//FileExists(l_FileNameEtalon) else begin CopyFile(PWideChar(aFileName),PWideChar(l_FileNameEtalon),True); end;//FileExists(l_FileNameEtalon) end; function TestTmsSerializeControllerPrim.TestResultsFileName(aShapeClass: RmsShape): String; begin Result := MakeFileName(Name, aShapeClass); end; procedure TestTmsSerializeControllerPrim.SaveDiagrammAndCheck(aShapeClass: RmsShape; aDiagramm: TmsDiagramm); var l_FileNameTest : String; begin l_FileNameTest := TestResultsFileName(aShapeClass); TmsSerializeController.Serialize(l_FileNameTest, aDiagramm); CheckFileWithEtalon(l_FileNameTest); end; function TestTmsSerializeControllerPrim.ShapesCount: Integer; begin Result := f_Context.rShapesCount; end; constructor TmsShapeTestContext.Create(aMethodName: string; aSeed: Integer; aDiagrammName : String; aShapesCount : Integer; aShapeClass: RmsShape); begin rMethodName := aMethodName; rSeed := aSeed; rDiagrammName := aDiagrammName; rShapesCount := aShapesCount; rShapeClass := aShapeClass end; procedure TestTmsSerializeControllerPrim.SetUp; var l_Index : Integer; l_X : Integer; l_Y : Integer; begin inherited; RandSeed := f_Context.rSeed; SetLength(f_Coords, ShapesCount); for l_Index := 0 to Pred(ShapesCount) do begin l_X := Random(100); l_Y := Random(200); f_Coords[l_Index] := TPoint.Create(l_X, l_Y); end;//for l_Index end; procedure TestTmsSerializeControllerPrim.CreateDiagrammAndCheck(aCheck : TmsDiagrammCheck; const aName: String); var l_Diagramm: TmsDiagramm; l_Image: TImage; begin l_Image := nil; try l_Diagramm := TmsDiagramm.Create(l_Image, aName); try aCheck(l_Diagramm); finally FreeAndNil(l_Diagramm); end;//try..finally finally FreeAndNil(l_Image); end;//try..finally end; procedure TestTmsSerializeControllerPrim.CreateDiagrammWithShapeAndSaveAndCheck(aShapeClass: RmsShape); begin CreateDiagrammAndCheck( procedure (aDiagramm : TmsDiagramm) var l_P : TPoint; begin for l_P in f_Coords do aDiagramm.ShapeList.Add(aShapeClass.Create(TmsMakeShapeContext.Create(TPointF.Create(l_P.X, l_P.Y), nil))); SaveDiagrammAndCheck(aShapeClass, aDiagramm); end , f_Context.rDiagrammName ); end; procedure TestTmsSerializeController.TestSerialize; begin CreateDiagrammWithShapeAndSaveAndCheck(ShapeClass); end; function TestTmsSerializeControllerPrim.TestSerializeMethodName: String; begin Result := 'TestSerialize'; end; procedure TestTmsSerializeControllerPrim.DeserializeDiargammAndCheck(aCheck: TmsDiagrammCheck; aShapeClass: RmsShape); begin CreateDiagrammAndCheck( procedure (aDiagramm : TmsDiagramm) begin TmsSerializeController.DeSerialize(MakeFileName(TestSerializeMethodName, aShapeClass), aDiagramm); aCheck(aDiagramm); end , '' ); end; procedure TestTmsSerializeControllerPrim.TestDeSerializeForShapeClass(aShapeClass: RmsShape); begin DeserializeDiargammAndCheck( procedure (aDiagramm: TmsDiagramm) begin SaveDiagrammAndCheck(aShapeClass, aDiagramm); end , aShapeClass ); end; procedure TestTmsSerializeController.TestDeSerialize; begin TestDeSerializeForShapeClass(ShapeClass); end; constructor TestTmsSerializeControllerPrim.Create(const aContext: TmsShapeTestContext); begin inherited Create(aContext.rMethodName); f_Context := aContext; end; procedure TestTmsSerializeControllerPrim.TestDeSerializeViaShapeCheckForShapeClass(aShapeClass: RmsShape); begin DeserializeDiargammAndCheck( procedure (aDiagramm: TmsDiagramm) var l_Shape : TmsShape; l_Index : Integer; begin Check(aDiagramm.Name = f_Context.rDiagrammName); Check(aDiagramm.ShapeList <> nil); Check(aDiagramm.ShapeList.Count = ShapesCount); Check(Length(f_Coords) = aDiagramm.ShapeList.Count); for l_Index := 0 to Pred(aDiagramm.ShapeList.Count) do begin l_Shape := aDiagramm.ShapeList[l_Index].HackInstance As TmsShape; Check(l_Shape.ClassType = aShapeClass); Check(l_Shape.StartPoint.X = f_Coords[l_Index].X); Check(l_Shape.StartPoint.Y = f_Coords[l_Index].Y); end;//for l_Shape end , aShapeClass ); end; procedure TestTmsSerializeController.TestDeSerializeViaShapeCheck; begin TestDeSerializeViaShapeCheckForShapeClass(ShapeClass); end; procedure TestTmsSerializeControllerPrim.OutToFileAndCheck(aLambda: TmsFileLambda); var l_FileNameTest : String; l_FS : TFileStream; begin l_FileNameTest := TestResultsFileName(ShapeClass); l_FS := TFileStream.Create(l_FileNameTest, fmCreate); try aLambda(l_FS); finally FreeAndNil(l_FS); end;//try..finally CheckFileWithEtalon(l_FileNameTest); end; procedure TestTmsSerializeController.TestShapeName; begin OutToFileAndCheck( procedure (aFile: TFileStream) begin aFile.Write(AnsiString(ShapeClass.ClassName)[1], Length(ShapeClass.ClassName)); end ); end; procedure TestTmsSerializeController.TestDiagrammName; begin OutToFileAndCheck( procedure (aFile: TFileStream) begin aFile.Write(AnsiString(f_Context.rDiagrammName)[1], Length(f_Context.rDiagrammName)); end ); end; class procedure TmsShapeTestPrim.CheckShapes(aCheck: TmsShapeClassCheck); begin TmsRegisteredShapes.IterateShapes( procedure (aShapeClass: RmsShape) begin if not aShapeClass.InheritsFrom(TmsMover) then aCheck(aShapeClass); end ); end; function TestTmsSerializeControllerPrim.ShapeClass: RmsShape; begin Result := f_Context.rShapeClass; end; function TmsParametrizedShapeTest.TestSerializeMethodName: String; begin Result := f_TestSerializeMethodName + inherited TestSerializeMethodName; end; constructor TmsParametrizedShapeTest.Create(const aContext: TmsShapeTestContext); begin inherited Create(aContext); FTestName := f_Context.rShapeClass.ClassName + '.' + aContext.rMethodName; f_TestSerializeMethodName := f_Context.rShapeClass.ClassName + '.'; end; // TmsParametrizedShapeTestSuite constructor TmsParametrizedShapeTestSuite.CreatePrim; begin inherited Create(TmsParametrizedShapeTest); end; class function TmsParametrizedShapeTestSuite.Create: ITest; begin Result := CreatePrim; end; procedure TmsParametrizedShapeTestSuite.AddTests(testClass: TTestCaseClass); begin Assert(testClass.InheritsFrom(TmsParametrizedShapeTest)); RandSeed := 10; TmsShapeTestPrim.CheckShapes( procedure (aShapeClass: RmsShape) var l_Method: TRttiMethod; l_DiagrammName : String; l_Seed : Integer; l_ShapesCount : Integer; begin l_Seed := Random(High(l_Seed)); l_DiagrammName := 'Диаграмма №' + IntToStr(Random(10)); l_ShapesCount := Random(1000) + 1; for l_Method in TRttiContext.Create.GetType(testClass).GetMethods do if (l_Method.Visibility = mvPublished) then AddTest(RmsParametrizedShapeTest(testClass).Create(TmsShapeTestContext.Create(l_Method.Name, l_Seed, l_DiagrammName, l_ShapesCount, aShapeClass))); end ); end; initialization RegisterTest(TmsParametrizedShapeTestSuite.Create); end.
Комментариев нет:
Отправить комментарий