program project2;
uses
SysUtils;
procedure Test(ADateTime: TDateTime; AFormat: String; Expected: String);
var
s: String;
begin
s := FormatDateTime(AFormat, ADateTime, [fdoInterval]);
Write(AFormat, ': ', ADateTime, ' ---> ');
Write(s, ' (expected: ', Expected, ')');
if Expected = s then
WriteLn(' ---> OK')
else
WriteLn(' ---> ERROR');
end;
var
sum: TDateTime;
i: Integer;
begin
Test(1/SecsPerDay, '[h]:nn:ss', '0:00:01');
Test(0.5, '[h]:nn', '12:00');
Test(0.75, '[h]:nn', '18:00');
Test(0.9999999999999, '[h]:nn:ss', '24:00:00');
Test(1.0000000000001, '[h]:nn:ss', '24:00:00');
Test(-0.75, '[h]:nn', '-18:00');
Test(-0.9999999999999, '[h]:nn:ss', '-24:00:00');
Test(-1.0000000000001, '[h]:nn:ss', '-24:00:00');
// Accumulated worktime over 21 days, 8 hours per day:
sum := 0.0;
for i:=1 to 21 do
sum := sum + 8/24; // 8 hours
Test(sum, '[h]:nn:ss', IntToStr(21*8)+':00:00');
Test(sum, '[h]:nn:ss.zzz', IntToStr(21*8)+':00:00.000');
WriteLn;
Test(1.0/24 - 0.05/MSecsPerDay, '[n]:ss', '60:00');
Test(24/24-0.1/MSecsPerDay, '[n]:ss', IntToStr(24*60)+':00');
Test(24/24+0.1/MSecsPerDay, '[n]:ss', IntToStr(24*60)+':00');
Test(25/24-0.1/MSecsPerDay, '[n]:ss', IntToStr(25*60)+':00');
Test(25/24+0.1/MSecsPerDay, '[n]:ss', IntToStr(25*60)+':00');
Test(-1.0/24 - 0.05/MSecsPerDay, '[n]:ss', '-60:00');
Test(-24/24-0.1/MSecsPerDay, '[n]:ss', IntToStr(-24*60)+':00');
Test(-24/24+0.1/MSecsPerDay, '[n]:ss', IntToStr(-24*60)+':00');
Test(-25/24-0.1/MSecsPerDay, '[n]:ss', IntToStr(-25*60)+':00');
Test(-25/24+0.1/MSecsPerDay, '[n]:ss', IntToStr(-25*60)+':00');
WriteLn;
Test(1.0/24 - 0.05/MSecsPerDay, '[s]', '3600');
Test(24/24-0.1/MSecsPerDay, '[s]', IntToStr(24*60*60));
Test(24/24+0.1/MSecsPerDay, '[s]', IntToStr(24*60*60));
Test(25/24-0.1/MSecsPerDay, '[s]', IntToStr(25*60*60));
Test(25/24+0.1/MSecsPerDay, '[s]', IntToStr(25*60*60));
Test(-1.0/24 - 0.05/MSecsPerDay, '[s]', '-3600');
Test(-24/24-0.1/MSecsPerDay, '[s]', IntToStr(-24*60*60));
Test(-24/24+0.1/MSecsPerDay, '[s]', IntToStr(-24*60*60));
Test(-25/24-0.1/MSecsPerDay, '[s]', IntToStr(-25*60*60));
Test(-25/24+0.1/MSecsPerDay, '[s]', IntToStr(-25*60*60));
WriteLn;
Write('Press ENTER to close');
ReadLn;
end.