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 내장형 언어 ^^*