anchor.diff:    Inc(FWrittenLinesCount);
   end;
   
  +{ TMethodHolderRec }
  +
  +function TMethodHolderRec.FuncMethod(const StrParam : String; IntParam : Integer; out ObjParam : TObject) : TTypeKind;
  +begin
  +  Result := Default(TTypeKind);
  +end;
  +
  +procedure TMethodHolderRec.ProcMethod(const StrParam : String; IntParam : Integer; out ObjParam : TObject);
  +begin
  +  {NOP}
  +end;
  +
   { TestTLogger }
   
   procedure TestTLogger.DoSetUp;
  
positive.code:     public
        property LastWrittenLine : String read FLastWrittenLine;
        property WrittenLinesCount : Integer read FWrittenLinesCount;
    end;
  
    { SUT }
  
negative.code: end;
  
  procedure TestTLogger.TestEnterMethod;
  const
    STR_VAL = String('<TestEnterMethod>');
    INT_VAL = Integer(777);
  begin
    { Case #1 }
  
    SUT.EnterMethod(TMethodHolderObj, @TMethodHolderObj.ProcMethod, [STR_VAL, INT_VAL, Self]);
  
    CheckEquals(1, FOutput.WrittenLinesCount, 'WrittenLinesCount = 1');
    CheckEquals(1, FOutput.SectionLevel, 'SectionLevel = 1');
    CheckTrue(FOutput.LastWrittenLine.Contains(TMethodHolderObj.ClassName),
      'CheckTrue::LastWrittenLine.Contains(TMethodHolderObj.ClassName)<Case #1>');
    CheckTrue(FOutput.LastWrittenLine.Contains(TMethodHolderObj.MethodName(@TMethodHolderObj.ProcMethod)),
      'CheckTrue::LastWrittenLine.Contains(TMethodHolderObj.MethodName)<Case #1>');
    CheckTrue(FOutput.LastWrittenLine.Contains(STR_VAL), 'CheckTrue::LastWrittenLine.Contains(STR_VAL)<Case #1>');
    CheckTrue(FOutput.LastWrittenLine.Contains(INT_VAL.ToString), 'CheckTrue::LastWrittenLine.Contains(INT_VAL)<Case #1>');
    CheckTrue(FOutput.LastWrittenLine.Contains(Self.ToString), 'CheckTrue::LastWrittenLine.Contains(Self)<Case #1>');
  
    { Case #2 }
  
    SUT.EnterMethod(TMethodHolderObj, @TMethodHolderObj.FuncMethod, [STR_VAL, INT_VAL, Self]);
  
    CheckEquals(2, FOutput.WrittenLinesCount, 'WrittenLinesCount = 2');
    CheckEquals(2, FOutput.SectionLevel, 'SectionLevel = 2');
    CheckTrue(FOutput.LastWrittenLine.Contains(TMethodHolderObj.ClassName),
      'CheckTrue::LastWrittenLine.Contains(TMethodHolderObj.ClassName)<Case #2>');
    CheckTrue(FOutput.LastWrittenLine.Contains(TMethodHolderObj.MethodName(@TMethodHolderObj.FuncMethod)),
      'CheckTrue::LastWrittenLine.Contains(TMethodHolderObj.MethodName)<Case #2>');
    CheckTrue(FOutput.LastWrittenLine.Contains(STR_VAL), 'CheckTrue::LastWrittenLine.Contains(STR_VAL)<Case #2>');
    CheckTrue(FOutput.LastWrittenLine.Contains(INT_VAL.ToString), 'CheckTrue::LastWrittenLine.Contains(INT_VAL)<Case #2>');
    CheckTrue(FOutput.LastWrittenLine.Contains(Self.ToString), 'CheckTrue::LastWrittenLine.Contains(Self)<Case #2>');
  end;
  
  procedure TestTLogger.TestEnterMethod1;
  const
    STR_VAL = String('<TestEnterMethod1>');
    INT_VAL = Integer(777);
  begin
    { Case #1 }
  
    SUT.EnterMethod(TypeInfo(TMethodHolderRec), @TMethodHolderRec.ProcMethod, [STR_VAL, INT_VAL, Self]);
  
    CheckEquals(1, FOutput.WrittenLinesCount, 'WrittenLinesCount = 1');
    CheckEquals(1, FOutput.SectionLevel, 'SectionLevel = 1');
    CheckTrue(FOutput.LastWrittenLine.Contains(GetTypeName(TypeInfo(TMethodHolderRec))),
      'CheckTrue::LastWrittenLine.Contains(GetTypeName)<Case #1>');
    CheckTrue(FOutput.LastWrittenLine.Contains('ProcMethod'),
      'CheckTrue::LastWrittenLine.Contains(<MethodName>)<Case #1>');
    CheckTrue(FOutput.LastWrittenLine.Contains(STR_VAL), 'CheckTrue::LastWrittenLine.Contains(STR_VAL)<Case #1>');
    CheckTrue(FOutput.LastWrittenLine.Contains(INT_VAL.ToString), 'CheckTrue::LastWrittenLine.Contains(INT_VAL)<Case #1>');
    CheckTrue(FOutput.LastWrittenLine.Contains(Self.ToString), 'CheckTrue::LastWrittenLine.Contains(Self)<Case #1>');
  
    { Case #2 }
  
    SUT.EnterMethod(TypeInfo(TMethodHolderRec), @TMethodHolderRec.FuncMethod, [STR_VAL, INT_VAL, Self]);
  
    CheckEquals(2, FOutput.WrittenLinesCount, 'WrittenLinesCount = 2');
    CheckEquals(2, FOutput.SectionLevel, 'SectionLevel = 2');
    CheckTrue(FOutput.LastWrittenLine.Contains(GetTypeName(TypeInfo(TMethodHolderRec))),
      'CheckTrue::LastWrittenLine.Contains(GetTypeName)<Case #2>');
    CheckTrue(FOutput.LastWrittenLine.Contains('ProcMethod'),
      'CheckTrue::LastWrittenLine.Contains(<MethodName>)<Case #2>');
    CheckTrue(FOutput.LastWrittenLine.Contains(STR_VAL), 'CheckTrue::LastWrittenLine.Contains(STR_VAL)<Case #2>');
    CheckTrue(FOutput.LastWrittenLine.Contains(INT_VAL.ToString), 'CheckTrue::LastWrittenLine.Contains(INT_VAL)<Case #2>');
    CheckTrue(FOutput.LastWrittenLine.Contains(Self.ToString), 'CheckTrue::LastWrittenLine.Contains(Self)<Case #2>');
  end;
  
  procedure TestTLogger.TestLeaveMethod;
  const
    STR_VAL = String('<TestLeaveMethod>');
  begin
    { Case #1 }
  
    SUT.LeaveMethod(TMethodHolderObj, @TMethodHolderObj.ProcMethod, STR_VAL);
  
    CheckEquals(1, FOutput.WrittenLinesCount, 'WrittenLinesCount = 1');
    CheckEquals(1, FOutput.SectionLevel, 'SectionLevel = 1');
    CheckTrue(FOutput.LastWrittenLine.Contains(TMethodHolderObj.ClassName),
      'CheckTrue::LastWrittenLine.Contains(TMethodHolderObj.ClassName)<Case #1>');
    CheckTrue(FOutput.LastWrittenLine.Contains(TMethodHolderObj.MethodName(@TMethodHolderObj.ProcMethod)),
      'CheckTrue::LastWrittenLine.Contains(TMethodHolderObj.MethodName)<Case #1>');
    CheckTrue(FOutput.LastWrittenLine.Contains(STR_VAL), 'CheckTrue::LastWrittenLine.Contains(STR_VAL)<Case #1>');
  
    { Case #2 }
  
    SUT.LeaveMethod(TMethodHolderObj, @TMethodHolderObj.FuncMethod, STR_VAL);
  
    CheckEquals(2, FOutput.WrittenLinesCount, 'WrittenLinesCount = 2');
    CheckEquals(2, FOutput.SectionLevel, 'SectionLevel = 2');
    CheckTrue(FOutput.LastWrittenLine.Contains(TMethodHolderObj.ClassName),
      'CheckTrue::LastWrittenLine.Contains(TMethodHolderObj.ClassName)<Case #2>');
    CheckTrue(FOutput.LastWrittenLine.Contains(TMethodHolderObj.MethodName(@TMethodHolderObj.FuncMethod)),
      'CheckTrue::LastWrittenLine.Contains(TMethodHolderObj.MethodName)<Case #2>');
    CheckTrue(FOutput.LastWrittenLine.Contains(STR_VAL), 'CheckTrue::LastWrittenLine.Contains(STR_VAL)<Case #2>');
  end;
  
  procedure TestTLogger.TestLeaveMethod1;
  const
    STR_VAL = String('<TestLeaveMethod1>');
  begin
    { Case #1 }
  
    SUT.LeaveMethod(TypeInfo(TMethodHolderRec), @TMethodHolderRec.ProcMethod, STR_VAL);
  
    CheckEquals(1, FOutput.WrittenLinesCount, 'WrittenLinesCount = 1');
    CheckEquals(1, FOutput.SectionLevel, 'SectionLevel = 1');
    CheckTrue(FOutput.LastWrittenLine.Contains(GetTypeName(TypeInfo(TMethodHolderRec))),
      'CheckTrue::LastWrittenLine.Contains(GetTypeName)<Case #1>');
    CheckTrue(FOutput.LastWrittenLine.Contains('ProcMethod'),
      'CheckTrue::LastWrittenLine.Contains(<MethodName>)<Case #1>');
    CheckTrue(FOutput.LastWrittenLine.Contains(STR_VAL), 'CheckTrue::LastWrittenLine.Contains(STR_VAL)<Case #1>');
  
    { Case #2 }
  
    SUT.LeaveMethod(TypeInfo(TMethodHolderRec), @TMethodHolderRec.FuncMethod, STR_VAL);
  
    CheckEquals(2, FOutput.WrittenLinesCount, 'WrittenLinesCount = 2');
    CheckEquals(2, FOutput.SectionLevel, 'SectionLevel = 2');
    CheckTrue(FOutput.LastWrittenLine.Contains(GetTypeName(TypeInfo(TMethodHolderRec))),
      'CheckTrue::LastWrittenLine.Contains(GetTypeName)<Case #2>');
    CheckTrue(FOutput.LastWrittenLine.Contains('ProcMethod'),
      'CheckTrue::LastWrittenLine.Contains(<MethodName>)<Case #2>');
    CheckTrue(FOutput.LastWrittenLine.Contains(STR_VAL), 'CheckTrue::LastWrittenLine.Contains(STR_VAL)<Case #2>');
  end;
  
  procedure TestTLogger.TestLog;
  