mirror of
				https://github.com/notepad-plus-plus/notepad-plus-plus.git
				synced 2025-10-30 02:53:52 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			563 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			563 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| unit unitTest;
 | |
| 
 | |
| 
 | |
| interface
 | |
| 
 | |
| uses
 | |
|   System.SysUtils, System.Types, System.Classes;
 | |
| 
 | |
| 
 | |
| { Free function 1, declaration }
 | |
| 
 | |
| function FreeFunc1(const Param: integer): integer;
 | |
| 
 | |
| 
 | |
| type
 | |
| // -----------------------------------------------------------------------------
 | |
| // TStdClass
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
|   TStdClass = class(TObject)
 | |
|   private type
 | |
|     TStdInternalClass = class(TObject)
 | |
|     private
 | |
|       FName: string;
 | |
|       FId:   integer;
 | |
| 
 | |
|     public
 | |
|       constructor Create;
 | |
|       destructor  Destroy; override;
 | |
| 
 | |
|       procedure   CopyTo(Dest: TStdInternalClass);
 | |
| 
 | |
|       property    Name: string  read FName write FName;
 | |
|       property    Id:   integer read FId   write FId;
 | |
|     end;
 | |
| 
 | |
|   private
 | |
|     FId:    integer;
 | |
|     FValue: string;
 | |
| 
 | |
|     class var FInstCnt: integer;
 | |
| 
 | |
|     class function Init(Cnt: integer): boolean;
 | |
|     class function DeInit(Cnt: integer): boolean;
 | |
|     class function ToType<X: class, constructor>(const Value: string): X;
 | |
| 
 | |
|     procedure      SetValue(const Value: string);
 | |
| 
 | |
|   public
 | |
|     constructor    Create;
 | |
|     destructor     Destroy; override;
 | |
| 
 | |
|     function       Convert<X: class, constructor>(const Value: string): X;
 | |
| 
 | |
|     class property InstCnt:   integer read FInstCnt;
 | |
| 
 | |
|     property       PropId:    integer read FId    write FId;
 | |
|     property       PropValue: string  read FValue write SetValue;
 | |
| 
 | |
|   end;
 | |
| 
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // TGenericClass<T>
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
|   TGenericClass<T> = class(TObject)
 | |
|   private type
 | |
|     TGenericInternalClass<I, K> = class(TObject)
 | |
|     strict private
 | |
|       FName:  string;
 | |
|       FId:    I;
 | |
|       FValue: K;
 | |
| 
 | |
|     public
 | |
|       constructor Create;
 | |
|       destructor  Destroy; override;
 | |
| 
 | |
|       procedure   CopyTo<J>(Dest: TGenericInternalClass<I, K>);
 | |
| 
 | |
|       property    Name:  string read FName  write FName;
 | |
|       property    Id:    I      read FId    write FId;
 | |
|       property    Value: K      read FValue write FValue;
 | |
|     end;
 | |
| 
 | |
|   strict private
 | |
|     FId:    integer;
 | |
|     FValue: T;
 | |
| 
 | |
|     class var FInstCnt: integer;
 | |
| 
 | |
|     class function Init<I>(Cnt: integer): boolean;
 | |
|     class function DeInit(Cnt: integer): boolean;
 | |
| 
 | |
|     procedure      SetValue(const Value: T);
 | |
| 
 | |
|   public
 | |
|     constructor    Create;
 | |
|     destructor     Destroy; override;
 | |
| 
 | |
|     class property InstCnt:   integer read FInstCnt;
 | |
| 
 | |
|     property       PropId:    integer read FId    write FId;
 | |
|     property       PropValue: T       read FValue write SetValue;
 | |
| 
 | |
|   end;
 | |
| 
 | |
| 
 | |
| 
 | |
| type
 | |
| // -----------------------------------------------------------------------------
 | |
| // TEnum
 | |
| // -----------------------------------------------------------------------------
 | |
|   TEnum = (enMember1, enMember2, enMember3);
 | |
| 
 | |
|   TEnumHelper = record helper for TEnum
 | |
|   public
 | |
|     function       ToString: string;
 | |
|     class function FromString(const AString: string): TEnum; static;
 | |
|   end;
 | |
| 
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // TStdClassHelper
 | |
| // -----------------------------------------------------------------------------
 | |
|   TStdClassHelper = class helper for TStdClass
 | |
|   public
 | |
|     function       AsString: string;
 | |
|     class function FromString(const AString: string): TStdClass; static;
 | |
|   end;
 | |
| 
 | |
| 
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // Free routines declarations
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
| procedure FreeProc1(AParam: integer);
 | |
| 
 | |
| function  FreeFunc2(const AParam: string): integer; inline;
 | |
| procedure FreeProc2(AParam: integer);
 | |
| 
 | |
| {function  UnusedFreeFunc1(ANum: double): cardinal;}
 | |
| 
 | |
| procedure FreeProc3(AParam: integer); overload; inline;
 | |
| procedure FreeProc3(AParam: string); overload; inline;
 | |
| 
 | |
| (*
 | |
| function  UnusedFreeFunc2(ANum: double): cardinal;
 | |
| function  UnusedFreeFunc3(ANum: double): cardinal;
 | |
| *)
 | |
| 
 | |
| 
 | |
| 
 | |
| implementation
 | |
| 
 | |
| {R *.dfm}
 | |
| 
 | |
| 
 | |
| type
 | |
| // -----------------------------------------------------------------------------
 | |
| // Internal classes
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
|   TInternalClass = class(TObject)
 | |
|   public
 | |
|     function    Init(Cnt: integer): boolean;
 | |
|     procedure   SetValue(Cnt: integer);
 | |
|     
 | |
|   end;
 | |
|   
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // Free routines
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
| { Free function 3, forward declaration}
 | |
| 
 | |
| function FreeFunc3(const Param: integer): integer; forward;
 | |
| 
 | |
| 
 | |
| 
 | |
| { Free function 1, definition }
 | |
| 
 | |
| function FreeFunc1(const Param: integer): integer;
 | |
| begin
 | |
|   //
 | |
| 
 | |
|   Result := 0;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| { Free procedure 1, definition }
 | |
| 
 | |
| procedure FreeProc1(AParam: integer);
 | |
| begin
 | |
|   // Do something
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| { Free function 2, definition }
 | |
| 
 | |
| function FreeFunc2(const AParam: string): integer;
 | |
| begin
 | |
|   // Do something
 | |
| 
 | |
|   Result := 0;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| {
 | |
| // Unused free function 1, definition
 | |
| 
 | |
| function UnusedFreeFunc1(ANum: double): cardinal;
 | |
| begin
 | |
|   // Do something
 | |
| 
 | |
|   Result := 0;
 | |
| end;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| { Free procedure 2, definition }
 | |
| procedure FreeProc2(AParam: integer);
 | |
| begin
 | |
|   // Do something
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| (*
 | |
| // Unused free function 2, definition
 | |
| 
 | |
| function UnusedFreeFunc2(ANum: double): cardinal;
 | |
| begin
 | |
|   // Do something
 | |
| 
 | |
|   Result := 0;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| { Unused free function 3, definition }
 | |
| 
 | |
| function UnusedFreeFunc3(ANum: double): cardinal;
 | |
| begin
 | |
|   // Do something
 | |
| 
 | |
|   Result := 0;
 | |
| end;
 | |
| *)
 | |
| 
 | |
| 
 | |
| 
 | |
| { Free procedure 3 (overloaded), definition }
 | |
| 
 | |
| procedure FreeProc3(AParam: integer);
 | |
| begin
 | |
|   //
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| procedure FreeProc3(AParam: string);
 | |
| begin
 | |
|   //
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| { Free procedure 4, forward declaration}
 | |
| 
 | |
| procedure FreeProc4(const Param: integer); forward;
 | |
| 
 | |
| 
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // TStdClass
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
| constructor TStdClass.Create;
 | |
| begin
 | |
|   inherited;
 | |
| 
 | |
|   Init(Succ(InstCnt));
 | |
| end;
 | |
| 
 | |
| 
 | |
| destructor TStdClass.Destroy;
 | |
| begin
 | |
|   DeInit(Pred(InstCnt));
 | |
| 
 | |
|   inherited;
 | |
| end;
 | |
| 
 | |
| 
 | |
| class function TStdClass.Init(Cnt: integer): boolean;
 | |
| begin
 | |
|   FInstCnt := Cnt;
 | |
|   Result   := true;
 | |
| end;
 | |
| 
 | |
| 
 | |
| class function TStdClass.DeInit(Cnt: integer): boolean;
 | |
| begin
 | |
|   FInstCnt := Cnt;
 | |
|   Result   := true;
 | |
| end;
 | |
| 
 | |
| 
 | |
| class function TStdClass.ToType<X>(const Value: string): X;
 | |
| begin
 | |
|   Result := X.Create;
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure TStdClass.SetValue(const Value: string);
 | |
| begin
 | |
|   FValue := Value;
 | |
| end;
 | |
| 
 | |
| 
 | |
| function TStdClass.Convert<X>(const Value: string): X;
 | |
| begin
 | |
|   Result := ToType<X>(Value);
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // TStdClass.TStdInternalClass
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
| constructor TStdClass.TStdInternalClass.Create;
 | |
| begin
 | |
|   inherited;
 | |
| 
 | |
|   //
 | |
| end;
 | |
| 
 | |
| 
 | |
| destructor TStdClass.TStdInternalClass.Destroy;
 | |
| begin
 | |
|   //
 | |
| 
 | |
|   inherited;
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure TStdClass.TStdInternalClass.CopyTo(Dest: TStdInternalClass);
 | |
| begin
 | |
|   Dest.Name := Name;
 | |
|   Dest.Id   := Id;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // Free routines
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
| { Free function 3 with internal procedure, definition }
 | |
| 
 | |
| function FreeFunc3(const Param: integer): integer;
 | |
| 
 | |
|   procedure InternalProc1(const Param: integer);
 | |
|   begin
 | |
|     //
 | |
|   end;
 | |
| 
 | |
| begin
 | |
|   //
 | |
| 
 | |
|   Result := 0;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| { Free procedure 4 with internal function, definition }
 | |
| 
 | |
| procedure FreeProc4(const Param: integer);
 | |
| 
 | |
|   function InternalFunc1(const Param: integer): string;
 | |
|   begin
 | |
|     //
 | |
| 
 | |
|     Result := '';
 | |
|   end;
 | |
| 
 | |
| begin
 | |
|   //
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| { Free procedure 5 with internal procedure preceeded by a comment, declaration & definition }
 | |
| 
 | |
| procedure FreeProc5;
 | |
| 
 | |
|   // Internal routine
 | |
|   procedure InternalProc2;
 | |
|   begin
 | |
|     //
 | |
|   end;
 | |
| 
 | |
| begin
 | |
|   //
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| { Free procedure 6 (inline), declaration & definition }
 | |
| 
 | |
| procedure FreeProc6; inline;
 | |
| begin
 | |
|   //
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // TGenericClass<T>
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
| constructor TGenericClass<T>.Create;
 | |
| begin
 | |
|   inherited;
 | |
| 
 | |
|   Init<string>(Succ(InstCnt));
 | |
| end;
 | |
| 
 | |
| 
 | |
| destructor TGenericClass<T>.Destroy;
 | |
| begin
 | |
|   DeInit(Pred(InstCnt));
 | |
| 
 | |
|   inherited;
 | |
| end;
 | |
| 
 | |
| 
 | |
| // This is a class function
 | |
| class function TGenericClass<T>.Init<I>(Cnt: integer): boolean;
 | |
| begin
 | |
|   FInstCnt := Cnt;
 | |
|   Result   := true;
 | |
| end;
 | |
| 
 | |
| 
 | |
| // This is a class function
 | |
| class function TGenericClass<T>.DeInit(Cnt: integer): boolean;
 | |
| begin
 | |
|   FInstCnt := Cnt;
 | |
|   Result   := true;
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure TGenericClass<T>.SetValue(const Value: T);
 | |
| begin
 | |
|   FValue := Value;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // TGenericClass<T>.TGenericInternalClass<I, K>
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
| constructor TGenericClass<T>.TGenericInternalClass<I, K>.Create;
 | |
| begin
 | |
|   inherited;
 | |
| 
 | |
|   FName  := '';
 | |
|   FId    := Default(I);
 | |
|   FValue := Default(K);
 | |
| end;
 | |
| 
 | |
| 
 | |
| destructor TGenericClass<T>.TGenericInternalClass<I, K>.Destroy;
 | |
| begin
 | |
|   //
 | |
| 
 | |
|   inherited;
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure TGenericClass<T>.TGenericInternalClass<I, K>.CopyTo<J>(Dest: TGenericInternalClass<I, K>);
 | |
| begin
 | |
|   Dest.Name  := Name;
 | |
|   Dest.Id    := Id;
 | |
|   Dest.Value := Value;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // TInternalClass
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
| function TInternalClass.Init(Cnt: integer): boolean;
 | |
| begin
 | |
|   Result := true;
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure TInternalClass.SetValue(Cnt: integer);
 | |
| begin
 | |
|   //
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // TEnumHelper
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
| function TEnumHelper.ToString: string;
 | |
| begin
 | |
|   case Self of
 | |
|     enMember2: Result := 'Member 2';
 | |
|     enMember3: Result := 'Member 3';
 | |
|     else       Result := 'Unknown';
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| class function TEnumHelper.FromString(const AString: string): TEnum;
 | |
| begin
 | |
|   if SameText(AString, 'Member 2') then
 | |
|     Result := enMember2
 | |
| 
 | |
|   else if SameText(AString, 'Member 3') then
 | |
|     Result := enMember3
 | |
| 
 | |
|   else
 | |
|     Result := enMember1;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // TStdClassHelper
 | |
| // -----------------------------------------------------------------------------
 | |
| 
 | |
| function TStdClassHelper.AsString: string;
 | |
| begin
 | |
|   Result := 'TStdClass instance';
 | |
| end;
 | |
| 
 | |
| 
 | |
| class function TStdClassHelper.FromString(const AString: string): TStdClass;
 | |
| begin
 | |
|   Result := TStdClass.Create.Convert<TStdClass>(AString);
 | |
| end;
 | |
| 
 | |
| 
 | |
| end.
 |