fpc/tests/test/units/sysutils/strtotimetest.pp
2010-02-03 15:10:14 +00:00

160 lines
5.1 KiB
ObjectPascal

program strtmtest;
{$ifdef FPC}
{$mode objfpc}{$H+}
{$else}
{$apptype console}
{$endif}
uses sysutils,sysconst{$ifndef fpc},windows{$endif};
{$ifndef fpc}
function defaultformatsettings:TFormatSettings;
begin
GetLocaleFormatSettings(getsystemdefaultlcid,result);
end;
{$endif}
var exitwitherror:integer =0;
fmt : TFormatSettings;
Procedure Check(TestNo : Integer; inputstr : String;shouldfailstrtotime:boolean=false;shouldfailcomparison:boolean=false;resultstr:string='');
var dt :TDateTime;
outputstr:ansistring;
begin
if TryStrToTime(inputstr,dt,fmt) then
begin
if shouldfailstrtotime then
begin
writeln('test ',TestNo,' should fail on strtotime while it didn''t ',timetostr(dt,fmt));
exitwitherror:=1;
end
else
begin
outputstr:=TimeToStr(dt,fmt); // note because of this bugs can also be in timetostr
if resultstr<>'' then
begin
if outputstr<>resultstr then
begin
writeln('test ',TestNo,' should be "',resultstr,'" is "',outputstr,'"');
exitwitherror:=1;
end;
exit; // don't do other comparisons
end;
if inputstr<>outputstr then
begin
if not shouldfailcomparison then
begin
writeln('test ',TestNo,' failed "',inputstr,'" <> "',outputstr,'"');
exitwitherror:=1;
end;
end
else
begin
if shouldfailcomparison then
begin
writeln('test ',TestNo,' succeeded "',inputstr,'" = "',outputstr,'", while it shouldn''t');
exitwitherror:=1;
end;
end;
end;
end
else
if not shouldfailstrtotime then
begin
Writeln('Test ',TestNo,' failed: ',inputstr);
exitwitherror:=1;
end;
end;
procedure setdecimalsep(c:char);
begin
fmt.DecimalSeparator:=c;
fmt.longtimeformat:='hh:nn:ss'+fmt.DecimalSeparator+'zzz';
end;
var value: word;
code : longint;
begin
fmt:=defaultformatsettings;
fmt.TimeSeparator:=':';
fmt.TimeAmstring:='AM';
fmt.TimePmstring:='PM';
setdecimalsep('.');
Check( 0,'12:34:45.789',false,false);
Check( 1,'12:34:45,789',true,false);
setdecimalsep(',');
Check( 2,'12:34:45.789',true,false);
Check( 3,'12:34:45,789',false,false);
Check( 4,'12 am',false,false,'00:00:00,000');
Check( 5,'pm 12:34',false,false,'12:34:00,000');
Check( 6,'12::45',true,false);
Check( 7,'12:34:56 px',true,false);
Check( 8,'12:34:5x',true,false);
Check( 9,'12:34:56:78:90',true,false);
Check(10,'5 am',false,false,'05:00:00,000');
Check(11,'5 pm',false,false,'17:00:00,000');
Check(12,'am 5',false,false,'05:00:00,000');
Check(13,'pm 5',false,false,'17:00:00,000');
fmt.longtimeformat:='hh:nn:ss'+fmt.DecimalSeparator+'zzz am/pm';
Check(14,'5 am',false,false,'05:00:00,000 am');
Check(15,'5 pm',false,false,'05:00:00,000 pm');
Check(16,'am 5',false,false,'05:00:00,000 am');
Check(17,'pm 5',false,false,'05:00:00,000 pm');
fmt.TimeAmstring:='AM';
fmt.TimePmstring:='PM';
fmt.longtimeformat:='hh:nn:ss'+fmt.DecimalSeparator+'zzz a/p';
Check(18,'am 5',false,false,'05:00:00,000 a');
Check(19,'pm 5',false,false,'05:00:00,000 p');
fmt.TimeAMString:='a'; fmt.TimePMString:='p';
Check(20,'a 5',false,false,'05:00:00,000 a');
Check(21,'p 5',false,false,'05:00:00,000 p');
Check(22,'12:',True,false);
Check(23,'13:14:',True,false);
Check(24,'a 17:00',True,false);
Check(25,'p 19:00',True,false);
Check(26,'1:2:3',false,false,'01:02:03,000 a');
Check(27,'1:4',false,false,'01:04:00,000 a');
Check(28,'111:2:3',True,false);
Check(29,'1:444',True,false);
Check(30,'1:2:333',True,false);
Check(31,'1:4:55,4',False,false,'01:04:55,004 a');
Check(32,'1:4:55,12',False,false,'01:04:55,012 a');
Check(33,'1:4:55,004',False,false,'01:04:55,004 a');
Check(34,'1:4:55,0012',False,false,'01:04:55,012 a');
Check(35,'1:4:55,004'#9'am',true,false,'01:04:55,004'#9'am');
Check(36,#9'1:4:55,0012',true,false,'01:04:55,012 a');
Check(37,' 1:4:55,4',False,false,'01:04:55,004 a');
Check(38,'1: 4:55,12',False,false,'01:04:55,012 a');
Check(39,'1:4: 55,004',False,false,'01:04:55,004 a');
Check(40,'1:4:55, 2',False,false,'01:04:55,002 a');
Check(41,'1:4:55, 4',False,false,'01:04:55,004 a'); // note more padding then needed
Check(42,'1: 4:55, 4',False,false,'01:04:55,004 a'); // note more padding then needed
Check(43,'1: 4: 55, 4',False,false,'01:04:55,004 a'); // note more padding then needed
Check(44,'1: 4: 55, 4',False,false,'01:04:55,004 a'); // note more padding then needed
Check(45,'1 4 55 4',True,false);
fmt.timeseparator:=' ';
Check(46,'01 04 55',True,false);
Check(47,'a 01',false,false,'01 00 00,000 a');
Check(52,'a01',false,false,'01 00 00,000 a');
fmt.TimeSeparator:=':';
Check(48,'1:4:55,0000000000000000000000012',false,false,'01:04:55,012 a');
Check(49,'1:4:55,0000100012',True,false);
Check(50,'1:4:55,000001012',True,false);
Check(51,'12:034:00056',false,false,'12:34:56,000 p');
exitcode:=exitwitherror;
{$ifndef fpc} // halt in delphi ide
readln;
{$endif}
end.