TestCodeType.pas

Модуль описывающий интерфейсы тестирования TestCode

Const - Константы

MAX_POS_TESTMETHOD

  const  
   MAX_POS_TESTMETHOD = $FFFFFFF;

Используйте при регистрации метода в IRegisterMethod. Замените параметр iSortPrioritet на MAX_POS_TESTMETHOD если вам нужно удалить тестируемый объект Object.Free
Пример:

// Free class
   IRegisterMethod(tmFree  ,'tmFree'  ,'Test Free component'
   ,pAddOneEmptyParam    // Auto add test parameter
   ,MAX_POS_TESTMETHOD); // Last index test position
 

Type - Типы

TTestResultParam - Код возврата тестирования

type
 TTestResultParam=(
    // Выполнения теста
              trNone      = 0  //  теста не было
             ,trOk        = 3  // Тест пройден
             ,trTestNotCreated = 8 // тест еще не создан
             ,trBreakTest = 10 // Прерывание теста по команде
             ,trError     = 13 // Ошибка, тест не пройден
             ,trException = 16 // Во время работы было исключение
 
    // Ошибки регистрации
             ,trErrParamCount = 30 // Ошибка в количестве параметров
             ,trErrParamType  = 31 // Ошибка в типе параметра (число,строка)
             ,trErrRegister   = 32 // Ошибка при регистрации теста
 
            ,trUnknowResult = 63   // Использовать как заглушку для не созданного теста
             );

TTypeDataStore - Сохраненный тип данных

type
 TTypeDataStore = (
  tdsInteger     = 0   ,
  tdsBoolean     = 1   ,
  tdsAnsiChar    = 2   ,
  tdsExtended    = 3   ,
  tdsShortString = 4   , //конвертация в tdsAnsiString
  tdsPointer     = 5   ,
  tdsPAnsiChar   = 6   ,
  tdsObject      = 7   ,
  tdsClass       = 8   ,
  tdsWideChar    = 9   ,
  tdsPWideChar   = 10  ,
  tdsAnsiString  = 11  ,
  tdsCurrency    = 12  , // конвертация to tdsExtended
  tdsVariant     = 13  , // отключено, конвертация в tdsNone
  tdsInterface   = 14  ,
  tdsWideString  = 15  ,
  tdsInt64       = 16  ,
  tdsUnicodeString = 17,
  tdsNone        = 99 // неизвестный тип или не поддерживаемый тип
  );

TDisableInit - определение функции отключающей тест

   type
    TPIndexValue=  PInteger;
    TDisableInit=function(var wsErr:WideString):Boolean  of object;

Методы регистрации теста

  type
   TTestRegisterMethod = procedure of object;
   TTestMethodsRun     = function( IMethod:IRunMethodParam):TTestResultParam  of object;

Пример:

  L_pIndexTCalculate   := IRegisterClass(TCalc._RegisterMethod,TCalc._TestMethods,'TCalc','Class Calculater');

TTestType - тип тестирования метода

 TTestType=(tEmptyParam=0 // неиспользутся
  ,tTestCodeOnly=1 // тестирование кода (по умолчанию)         
 );

TMethodAddParam - типы параметров

 TMethodAddParam = ( pAddManualOnly = 0 // ручное добавление
                    ,pAddOneEmptyParam =1 // автоматическое добавление одного параметра
                   );

Пример:

 // Create class for test
   IRegisterMethod(tmCreate,'tmCreate','Test Create component'
   ,pAddOneEmptyParam    // Auto add test parameter
    ,1);                 // First index test position
 
// Test methods  - pAddManualOnly - default
   IRegisterMethod(tmPlus  ,'tmPlus'  ,'Test Plus operation');
    IRegisterMethodParams([2,2],[4],'2+2=4');
 
 

TParamCheckOption - проверка параметров перед тестом

   TParamCheckOption = (poCountParam // проверка на количество параметров
                  ,poHardTypeParam   // проверка на тип параметра
                  );
   TParamCheckOptions = set of TParamCheckOption;
 

Пример:

 // Create class for test
   IRegisterMethod(tmCreate,'tmCreate','Test Create component'
   ,pAddOneEmptyParam    // Auto add test parameter
    ,1);                 // First index test position
 
// Test methods  - default [poCountParam]
   IRegisterMethod(tmPlus  ,'tmPlus'  ,'Test Plus operation');
    IRegisterMethodParams([2,2],[4],'2+2=4');
 
   IRegisterMethod(tmTestStringChar ,'tmTestStringChar'  ,'Test String operation',pAddManualOnly,100,[poCountParam,poHardTypeParam]);
    IRegisterMethodParams(['aaa','bbb'],['aaabbb'],'aaa+bbb=aaabbb');
    IRegisterMethodParams(['a','bbb'],['abbb'],'a+bbb=abbb');// Error poHardTypeParam     
 

Интерфейсы

IResultValue - Интерфейс возвращаемых значений параметров

    IResultValue=interface
      ['{999297E2-97B4-4CA8-9FD1-8358C184D84E}']
      Function AsInteger:Integer;
      Function AsBoolean:boolean;
      Function AsObject:TObject;
      Function AsClass:TClass;
      Function AsExtended:Extended; // ссохраняет значение без бесконечной дроби
      Function AsExtended_RecurrDecimal:Extended;  // с бесконечной дробью
      Function AsCurrency:currency; // convert to tdsExtended 
      Function AsVariant:Variant;
      Function AsInterface:IInterface;//Pointer;
      Function AsInt64:int64;
 
      Function AsDateTime:TDateTime;
 
      Function AsAnsiChar:AnsiChar;
      Function AsPAnsiChar:PAnsiChar;
 
      Function AsWideChar:WideChar;
      Function AsPWideChar:PWideChar;
 
      // use all strings
      Function AsPointer:Pointer;
      //      AsAnsiString:AnsiString;
      Function AsAnsiString_GetSize:integer;
      Function AsAnsiString_GetDataAll(var Dest):integer;
      Function AsAnsiString_GetData(var Dest;iCount:integer;iOffset:Integer=0):integer;
 
//      Function AsWideString:WideString;
      Function  AsWideString_GetSize:integer;
      Function AsWideString_GetDataAll(var Dest):integer;
      Function AsWideString_GetData(var Dest;iCount:integer;iOffset:Integer=0):integer;
 
//      Function AsUnicodeString:UnicodeString;
      Function  AsUnicodeString_GetSize:integer;
      Function AsUnicodeString_GetDataAll(var Dest):integer;
      Function AsUnicodeString_GetData(var Dest;iCount:integer;iOffset:Integer=0):integer;
 
 
      Function AsType:TTypeDataStore; //Type stores
      Function IsCompareType(tOut:TTypeDataStore):boolean; //Type compatibility check
 
    end;

IResultBuff - Интерфейс буфера для тестирования

   type
    IResultBuff=interface
    ['{0B0B12B5-7369-4D7D-A07E-A4CE215643E5}']
      Function IsExists:boolean;
      Function AsBuff_Size:integer;
      Function AsBuff_Data(var Dest;iCount:integer;iOffset:Integer=0):integer;
    end;

IRunMethodParam - интерфейс параметров для тестирования кода

type
    IRunMethodParam=interface
     ['{2FF6D5C8-F137-46F0-8A88-FD4BD2C2F93A}']
 
      function GetAutoConvertParam: Boolean;
      procedure SetAutoConvertParam(const Value: Boolean);
 
     function IGetNumParamUser:integer; // кол-во параметров записанные в вызове, для проверки в ф-ии тестирования
      function IReg_CodeResult_Ok:TTestResultParam; // какой тип возврата, что тест пройден
 
     // значения открытых параметров для тестов
     function IGetArrParamCount:integer;
     function IGetArrParam(iIndexValue:integer):IResultValue;
      function IGetArrParamBuff:IResultBuff;
     function IGetArrResultForTestMethodCount:integer;
     function IGetArrResultForTestMethod(iIndexValue:integer):IResultValue;
      function IGetArrReultBuff:IResultBuff;
      Function IsCompareTypes(tStore,tOut:TTypeDataStore):boolean;
 
     // Count  runs
     function IGetCountRunStep:Integer;
     function IGetCountRun:Integer;
 
    // получить макс таймаут, после которого ошибка
     function IGetMaxTimeOut:Integer;
 
     // возвращает признак необходимости прервать тест 
       function INeedBreakTest:boolean;
       function INeedBreakTestPointer:PBoolean;
     // autoconvert paramterd in code
       property IAutoConvertParam:Boolean read GetAutoConvertParam write SetAutoConvertParam  ;
 
    end;

IRegisterTestCode - Интерфейс регистрации моделей, классов, методов для тестирования

    IRegisterTestCode=interface
    ['{F74FEF67-4EBA-4182-9C42-3580B19BDF61}']
      //  USE ONLY -> LevelTestUnit.pas
      // Samples:    TestCodeLevelUnits.IRegisterLevelUnit(ltApplication,'ltApplication','Applications');
    Procedure IRegisterLevelUnit(vLevelUnit:variant;const wsName,wsDescription:WideString);
 
    // Регистрация имени группы в которой будет приложение
    Procedure  IRegisterGroupApplications(const wsGroupName:WideString='';wsGroupDescription:WideString='');
 
    // регистрация приложения необходима если тестируется одновременно приложение и DLL
    Function   IRegisterApplication(hInstanceApp:NativeUInt;const wsDescription:WideString='';procNeedDisableInit:TDisableInit=nil;iSortPrioritet:integer=100):TPIndexValue;
 
 
    // регистрация юнита
    Function IRegisterUnit(vLevelTest:variant // TLevelTestRun -> TestCodeLevelUnits.pas
              ;const sNameUnit:WideString;sDescription:WideString=''
              ;procNeedDisableInit:TDisableInit=nil // Проверка при загрузке теста на его отключение 
              ;iSortPrioritet:integer=100           // позиция в списке юнитов 
              ;pIndexApp_NilDefault:TPIndexValue=nil  // указатель на номер приложения
              ):TPIndexValue; // Id Unit
 
      // регистрация класса
      Function IRegisterClass(RegMethod:TTestRegisterMethod;TestMethodRun:TTestMethodsRun
                            ;const wsClassName:WideString
                             ;wsDescription:WideString=''
              ;procNeedDisableInit:TDisableInit=nil  // Проверка при загрузке теста на его отключение 
                        ;iSortPrioritet:integer=100  // позиция в списке классов
                            ;pIndexUnit_NilDefault:TPIndexValue=nil // указатель на номер приложения и юнита
                            ;pIndexApp_NilDefault:TPIndexValue=nil
                             )
            :TPIndexValue; // Id Class
 
    Function IRegisterMethodList(const ArrNames :array of Variant// [vENumMethodName,vENumMethodName] array methods list with empty params
         ;wsNames:WideString=''  // имена методов через разделитель 'Meth1,Meth2'
         ;wsDescription:WideString=''
         ;chSeparator:WideChar=','  // separator text
         ;iSortPrioritet:integer=100  // create positions default
         ):boolean;// True or False Registrations
 
 
    Function IRegisterMethod(vENumMethodName
                             :variant  //custom types
                             ;const wsNamesMethod:WideString
                             ;wsDesc:WideString=''
                             ;tAddParam:TMethodAddParam=pAddManualOnly
                             ;iSortPrioritet:integer=100
                             ;tParamCheckOptions:TParamCheckOptions=[poCountParam{,poHardTypeParam}]
                             ;ttTestType:TTestType=tTestCodeOnly
                             ;pIndexClass_NilDefault:TPIndexValue=nil
                             ;pIndexUnit_NilDefault:TPIndexValue=nil
                            ;pIndexApp_NilDefault:TPIndexValue=nil
           ):boolean;
 
    Function IRegisterMethodParams(
                      arrParams        // test in params
                       ,arrResultCMP   // test check params
                        :array of const;
                       sName:WideString
                       ;ErrCode_Ok:TTestResultParam=trOk
                        ;bIsAutoConvertParam:boolean=True  // AnsiChar to AnsiString,WideChar,WideString;  integer to int64,extended
                        ;iTimeOutMS:Integer=5000 // wait normal work test 5sec
                        ;iCountRun:Integer=1     // count run test
                       ;ttTestType:TTestType=tTestCodeOnly // test code
 
                       ;sReserveStrParam:WideString=''
                       ;pIndMethod:TPIndexValue=nil
                       ):boolean;
    Function IRegisterMethodParamsBuff(
                      arrParams  
                       ,arrResultCMP 
                        :array of const;
                        BuffParam:Pointer;iBuffParamSize:Integer; // Add buff param
                        BuffResultCMP:Pointer;iBuffResultSize:Integer;
                       sName:WideString
                       ;ErrCode_Ok:TTestResultParam=trOk
                        ;bIsAutoConvertParam:boolean=True
                        ;iTimeOutMS:Integer=5000  
                        ;iCountRun:Integer=1   
                       ;ttTestType:TTestType=tTestCodeOnly  
 
                       ;sReserveStrParam:WideString=''
                       ;pIndMethod:TPIndexValue=nil
                       ):boolean;
      // Set positions for registrations methods and params
      function ISetDefaultIndClassUnitApp(pIndClass:TPIndexValue;pIndUnit:TPIndexValue=nil;pIndApp:TPIndexValue=nil):boolean;
    end;

Функции

Конвертация

Конвертирует выражение Sets в Int64

  function Conv_Set2int64(const value;iSize:integer): int64;
  Procedure Conv_int642Set(const i64:Int64; var value;iSize:integer);

Пример:

 type
  TTypeTest=(ts1,ts2,ts3,ts4);
  TTypeTestSet=set of TTypeTest;
 ...
var 
  SS:TTypeTestSet;
begin
      ...  
         SS:=[ts1,ts3];
 
      GetTestMe.ITestCode.IRegisterMethodParams([
           ,Conv_Set2int64(SS,SizeOf(SS))
        ]
        ,[],'Check Set');
 
     ...   
 
         Conv_int642Set(IMethod.IGetArrParam(5).AsInt64,SS,SizeOf(SS));
             if SS<>SS2 then begin
              Exit;
             end;
         result:=trOk;
 

Получение строк

function IMethod_AsAnsiString(const IResValue:IResultValue):AnsiString;
function IMethod_AsWideString(const IResValue:IResultValue):WideString;
function IMethod_AsUnicodeString(const IResValue:IResultValue):UnicodeString;

Пример:

var
 sA:AnsiString;
begin
 ...
     sA:=IMethod_AsAnsiString(IMethod.IGetArrParam(i));

"Сон" и прерывание теста

 // Sleep and Break Test
 Procedure  CPUTSleep_1MS_Break(msec:Cardinal;var bIsBreak:boolean);
 Procedure  CPUTSleep_10MS_Break(msec:Cardinal;var bIsBreak:boolean);
 Procedure  CPUTSleep_100MS_Break(msec:Cardinal;var bIsBreak:boolean);

Пример:

var
  pB:PBoolean;
begin
 ...
             pB:=IMethod.INeedBreakTestPointer;
              CPUTSleep_100MS_Break(20000,pB^);