|
@@ -0,0 +1,159 @@
|
|
|
+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.
|
|
|
+
|