Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2014-06

TDD

3 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

francisco prieto

Chicos,

Les deje en Github el fuente de los programas utilizados para el TDD que explica Carlos Peix en el video.

https://github.com/fajprieto/Tdd

Algunas aclaraciones al respecto:

1) Si bien use PascalMock para el test, como el desarrollo lo hice en Windows XP, tuve que modificar uno de los archivos (NoRefCountObject.pas). El original que vino con la librer�a esta con la extension ori.

2) Para poder crear el proyecto de Test eleg� en Lazarus "FPCUnit Test Application".

3) Tratando de ser lo mas claro posible cree los siguientes archivos:

CasosTest: Contiene todos los test del modelo
oTocadiscosIO: Contiene el objeto Tocadiscos
iDetectorDisco: Contiene la interfase DetectorDisco iActuadorBrazo: Contiene la interfase ActuadorBrazo iMotorPlato: Contiene la interfase MotorPlato

4) Si bien esto es un ejemplo muy sencillo necesitar�a:

a) Revisen el c�digo generado y vean si se puede optimizar de alguna manera, ya que lo usar� de ejemplo para mis desarrollos.

b) La librer�a PascalMock la puse en un directorio aparte, pero para que funcionara, abr� el inspector de proyectos y le agregue la ubicaci�n del archivo PascalMock.pas, ya que mi idea es usar la misma librer�a en varios proyectos. No se si esto se hace as� o si hay alguna manera mejor de hacerlo.

c) En cuanto el c�digo este revisado si quieren armo un video similar al de Carlos Peix, pero utilizando Lazarus y PascalMock. Puedo ir explicando lo que voy haciendo pero voy a necesitar letra de parte de los sabios. En primer lugar para que quede lo mejor documentado posible y en segundo lugar para que nos quede como ejemplo.

Espero sus comentarios.

Saludos,

Pancho
C�rdoba
Argentina
------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140625/ae095628/attachment.html>

Reply by email

Antonio Evora
to francisco prieto

Buenas Francisco.
He realizado las siguientes modificaciones para que compile y se ejecute bajo linux (por si deseas a�adirlas):

<code>
unit NoRefCountObject;
interface
type
   // TNoRefCountObject
   //
   {: Base object to implement interfaces without reference counting }
   TNoRefCountObject =  class(TObject, IInterface)
   protected
     function QueryInterface({$IFDEF
FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) :
longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
     function _AddRef: longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
     function _Release: longint;{$IFNDEF
WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
   end;
implementation

{ TNoRefCountObject }

function TNoRefCountObject.QueryInterface({$IFDEF
FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) :
longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
begin
   if GetInterface(IID, Obj) then
     Result := 0
   else
     Result := E_NOINTERFACE;
end;
function TNoRefCountObject._AddRef: longint;{$IFNDEF
WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
begin
   Result := -1;
end;
function TNoRefCountObject._Release: longint;{$IFNDEF
WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
begin
   Result := -1;
end;
end.
</code>
<code>
unit VariantsUtil;
interface

uses

   // Delphi
   Variants,
   SysUtils
   ;
type
   TVariantArray = array of Variant;
   //: convert an array of const to an array of variants
   procedure ConstArrayToVariantArray(const AValues : array of const;
     var ADest: TVariantArray);
   //: convert an array of variant to a text representation
   function VariantArrayToString(const AVarArray: TVariantArray): string;
   //: convert a variant to an integer
   function Var2Int(Value: Variant): Integer;
   //: convert a variant to a pointer
   function Var2Ptr(Value: Variant): Pointer;
   //: convert a pointer to a variant
   function Ptr2Var(Value: Pointer): Variant;
   //: convert a variant to an object
   function Var2Obj(Value: Variant): TObject;
   //: convert an object to a variant
   function Obj2Var(Value: TObject): Variant;
   //: convert a variant to an interface
   function Var2Intf(Value: Variant): IInterface;
   //: convert an interface to a variant
   function Intf2Var(Value: IInterface): Variant;
implementation
// ConstArrayToVariantArray
//
procedure ConstArrayToVariantArray(const AValues : array of const;
   var ADest: TVariantArray);
var
   i : Integer;
begin
   SetLength(ADest, Length(AValues));
   for i := Low(AValues) to High(AValues) do
   begin
     with AValues[i] do
     begin
       case VType of
         vtInteger: ADest[i] := VInteger;
         vtInt64: ADest[i] := VInt64^;
         vtBoolean: ADest[i] := VBoolean;
         vtChar: ADest[i] := VChar;
         vtExtended: ADest[i] := VExtended^;
         vtString: ADest[i] := VString^;
         vtPointer: ADest[i] := Integer(VPointer);
         vtPChar: ADest[i] := StrPas(VPChar);
         vtObject: ADest[i]:= Pointer(VObject);
         vtAnsiString: ADest[i] := String(VAnsiString);
         vtCurrency: ADest[i] := VCurrency^;
         vtVariant: ADest[i] := VVariant^;
         vtInterface: ADest[i]:= Integer(VPointer);
       else
         raise Exception.Create ('invalid data type ' + IntToStr(VType))
       end;
     end;
   end;
end;
// VariantArrayToString
//
function VariantArrayToString(const AVarArray: TVariantArray): string;
var
   I: Integer;
begin
   Result := '';
   for i := Low(AVarArray) to High(AVarArray) do
   begin
     if Length(Result) > 0 then
       Result := Result + ', ';
     if VarIsNull(AVarArray[I]) then
       Result := Result + 'ignored'
     else
       Result := Result + VarToStr(AVarArray[I]);
   end;
   Result := '('+Result+')';
end;
function Var2Int(Value: Variant): Integer;
begin
   Result := Value;
end;
function Var2Ptr(Value: Variant): Pointer;
begin
   Result := Pointer(Var2Int(Value));
end;
function Ptr2Var(Value: Pointer): Variant;
begin
   Result := Integer(Value);
end;
function Var2Obj(Value: Variant): TObject;
begin
   Result := TObject(Var2Ptr(Value));
end;
function Obj2Var(Value: TObject): Variant;
begin
   Result := pointer(Value);
end;
function Var2Intf(Value: Variant): IInterface;
begin
   Result := IInterface(Var2Ptr(Value));
end;
function Intf2Var(Value: IInterface): Variant;
begin
   Result := Ptr2Var(Value);
end;
end.
</code>

Tiene buena pinta.

Un cordial saludo.

Reply by email

francisco prieto
to Antonio Evora

Fantastico Antonio...

Ya me van a explicar porque hay que realizar esos cambios... porque esto se trata de 2 cosas....

1) Trasmitir mis conocimientos de TDD al grupo.
2) Aprender a fondo FreePacal...

Ahora estoy haciendo un ejemplo con el framework Brook y consultado una base de datos para mostrarlo en una grilla con Bootstrap... realmente el lenguaje es fantastico.

Saludos y Gracias,

Pancho

2014-07-01 8:40 GMT-03:00 Antonio Evora <aevorar en gmail.com>:

Show quoted text 196 lines
Buenas Francisco. He realizado las siguientes modificaciones para que compile y se ejecute bajo linux (por si deseas a�adirlas): <code> unit NoRefCountObject; interface type // TNoRefCountObject // {: Base object to implement interfaces without reference counting } TNoRefCountObject = class(TObject, IInterface) protected function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ ENDIF}; function _AddRef: longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ ENDIF}; function _Release: longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ ENDIF}; end; implementation { TNoRefCountObject } function TNoRefCountObject.QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; begin if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE; end; function TNoRefCountObject._AddRef: longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; begin Result := -1; end; function TNoRefCountObject._Release: longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; begin Result := -1; end; end. </code> <code> unit VariantsUtil; interface uses // Delphi Variants, SysUtils ; type TVariantArray = array of Variant; //: convert an array of const to an array of variants procedure ConstArrayToVariantArray(const AValues : array of const; var ADest: TVariantArray); //: convert an array of variant to a text representation function VariantArrayToString(const AVarArray: TVariantArray): string; //: convert a variant to an integer function Var2Int(Value: Variant): Integer; //: convert a variant to a pointer function Var2Ptr(Value: Variant): Pointer; //: convert a pointer to a variant function Ptr2Var(Value: Pointer): Variant; //: convert a variant to an object function Var2Obj(Value: Variant): TObject; //: convert an object to a variant function Obj2Var(Value: TObject): Variant; //: convert a variant to an interface function Var2Intf(Value: Variant): IInterface; //: convert an interface to a variant function Intf2Var(Value: IInterface): Variant; implementation // ConstArrayToVariantArray // procedure ConstArrayToVariantArray(const AValues : array of const; var ADest: TVariantArray); var i : Integer; begin SetLength(ADest, Length(AValues)); for i := Low(AValues) to High(AValues) do begin with AValues[i] do begin case VType of vtInteger: ADest[i] := VInteger; vtInt64: ADest[i] := VInt64^; vtBoolean: ADest[i] := VBoolean; vtChar: ADest[i] := VChar; vtExtended: ADest[i] := VExtended^; vtString: ADest[i] := VString^; vtPointer: ADest[i] := Integer(VPointer); vtPChar: ADest[i] := StrPas(VPChar); vtObject: ADest[i]:= Pointer(VObject); vtAnsiString: ADest[i] := String(VAnsiString); vtCurrency: ADest[i] := VCurrency^; vtVariant: ADest[i] := VVariant^; vtInterface: ADest[i]:= Integer(VPointer); else raise Exception.Create ('invalid data type ' + IntToStr(VType)) end; end; end; end; // VariantArrayToString // function VariantArrayToString(const AVarArray: TVariantArray): string; var I: Integer; begin Result := ''; for i := Low(AVarArray) to High(AVarArray) do begin if Length(Result) > 0 then Result := Result + ', '; if VarIsNull(AVarArray[I]) then Result := Result + 'ignored' else Result := Result + VarToStr(AVarArray[I]); end; Result := '('+Result+')'; end; function Var2Int(Value: Variant): Integer; begin Result := Value; end; function Var2Ptr(Value: Variant): Pointer; begin Result := Pointer(Var2Int(Value)); end; function Ptr2Var(Value: Pointer): Variant; begin Result := Integer(Value); end; function Var2Obj(Value: Variant): TObject; begin Result := TObject(Var2Ptr(Value)); end; function Obj2Var(Value: TObject): Variant; begin Result := pointer(Value); end; function Var2Intf(Value: Variant): IInterface; begin Result := IInterface(Var2Ptr(Value)); end; function Intf2Var(Value: IInterface): Variant; begin Result := Ptr2Var(Value); end; end. </code> Tiene buena pinta. Un cordial saludo. _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140701/d54515c8/attachment.html>

Reply by email