상세 컨텐츠

본문 제목

변칙으로 사용하는 TDD

프로그래밍/Delphi

by ryujt 2011. 7. 1. 00:37

본문


unit TimeUtils;

interface

uses
  Classes, SysUtils;

function Date2Str(ATime:integer):string;
function Time2Str(ATime:integer):string;

function IncTime(ATime,AValue:integer):integer;
function DecTime(ATime,AValue:integer):integer;

// 1/1000 초 단위를 10진표시 시간으로
function ms2Time(ms:int64):integer;
function Time2ms(ATime:integer):int64;

implementation

function Date2Str(ATime:integer):string;
begin
  Result := Format('%8d', [ATime]);
  Result := StringReplace(Result, ' ', '0', [rfReplaceAll]);
end;

function Time2Str(ATime:integer):string;
begin
  Result := Format('%6d', [ATime]);
  Result := StringReplace(Result, ' ', '0', [rfReplaceAll]);
end;

function IncTime(ATime,AValue:integer):integer;
var
  msTime, msValue : int64;
begin
  msTime  := Time2ms(ATime);
  msValue := Time2ms(AValue);

  Result := ms2Time(msTime + msValue);
end;

function DecTime(ATime,AValue:integer):integer;
var
  msTime, msValue : int64;
begin
  msTime  := Time2ms(ATime);
  msValue := Time2ms(AValue);

  Result := ms2Time(msTime - msValue);
end;

function ms2Time(ms:int64):integer;
var
  H, M, S : integer;
begin
  ms := ms div 1000;

  H := ms div (60 * 60);

  M := (ms div 60) mod 60;

  S := ms mod 60;

  Result := H * 10000 + M * 100 + S;
end;

function Time2ms(ATime:integer):int64;
var
  H, M, S : integer;
begin
  H := ATime div 10000;
  M := (ATime div 100) mod 100;
  S := (ATime mod 100);

  Result := (H*60*60 + M*60 + S) * 1000;
end;

begin
  {$IFDEF DEBUG}
    Assert(IncTime(120000, 100) = 120100, 'Error: IncTime');
    Assert(IncTime(120059,   1) = 120100, 'Error: IncTime');
    Assert(IncTime(115900, 100) = 120000, 'Error: IncTime');
    Assert(IncTime(115959,   1) = 120000, 'Error: IncTime');

    Assert(DecTime(120100, 100) = 120000, 'Error: IncTime');
    Assert(DecTime(120100,   1) = 120059, 'Error: IncTime');
    Assert(DecTime(115900, 100) = 115800, 'Error: IncTime');
    Assert(DecTime(120000,   1) = 115959, 'Error: IncTime');

    Assert(ms2Time(60*1000) = 000100, 'Error: ms2Time');
    Assert(ms2Time(60*1000 * 61) = 010100, 'Error: ms2Time');

    Assert(Time2ms(000100) = 60*1000, 'Error: Time2ms');
    Assert(Time2ms(010100) = 60*1000 * 61, 'Error: Time2ms');
  {$ENDIF}
end.

위의 코드처럼 델파이  각 유닛 하단에 테스트 케이스를 작성하면서 TDD를 흉내 낼 수 있습니다.  이런 형태의 장점은 TDD 프로젝트를 따로 관리 안해도 되고, private 메소드들에 대한 테스트 케이스를 작성하는데도 문제가 없습니다.

디버그 모드에서만 동작하도록 하면서, 테스트에 필요한 객체 및 자료를 생성하고 해제하는 코드를 집어넣어서 사용하시면 됩니다.  어찌보면 델파이는 TDD 내장형 언어 ^^*

관련글 더보기