XSD Date related implementations :

* TDurationRemotable : duration 
  * TTimeRemotable : time 
  * TDateRemotable : date
  * TDateTimeRemotable : dateTime


git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@901 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa
2009-07-08 18:52:13 +00:00
parent e50a7fa3dc
commit 3b875dfea2
7 changed files with 553 additions and 127 deletions

View File

@ -400,6 +400,14 @@ type
{ TDateRemotable } { TDateRemotable }
TDateRemotable = class(TBaseDateRemotable) TDateRemotable = class(TBaseDateRemotable)
public
class function ToStr(const ADate : TDateTimeRec):string;override;
class function Parse(const ABuffer : string):TDateTimeRec;override;
end;
{ TDateTimeRemotable }
TDateTimeRemotable = class(TBaseDateRemotable)
protected protected
function GetDatepart(const AIndex : Integer) : Integer;override; function GetDatepart(const AIndex : Integer) : Integer;override;
public public
@ -1734,7 +1742,8 @@ begin
r.Register(sXSD_NS,TypeInfo(Double),'double').AddPascalSynonym('Double'); r.Register(sXSD_NS,TypeInfo(Double),'double').AddPascalSynonym('Double');
r.Register(sXSD_NS,TypeInfo(Extended),'decimal').AddPascalSynonym('Extended'); r.Register(sXSD_NS,TypeInfo(Extended),'decimal').AddPascalSynonym('Extended');
r.Register(sXSD_NS,TypeInfo(TDateRemotable),'dateTime').AddPascalSynonym('TDateRemotable'); r.Register(sXSD_NS,TypeInfo(TDateTimeRemotable),'dateTime').AddPascalSynonym('TDateTimeRemotable');
r.Register(sXSD_NS,TypeInfo(TDateRemotable),'date').AddPascalSynonym('TDateRemotable');
{$IFDEF WST_HAS_TDURATIONREMOTABLE} {$IFDEF WST_HAS_TDURATIONREMOTABLE}
r.Register(sXSD_NS,TypeInfo(TDurationRemotable),'duration').AddPascalSynonym('TDurationRemotable'); r.Register(sXSD_NS,TypeInfo(TDurationRemotable),'duration').AddPascalSynonym('TDurationRemotable');
{$ELSE WST_HAS_TDURATIONREMOTABLE} {$ELSE WST_HAS_TDURATIONREMOTABLE}
@ -5632,17 +5641,29 @@ end;
{ TDateRemotable } { TDateRemotable }
class function TDateRemotable.ToStr(const ADate: TDateTimeRec): string; class function TDateRemotable.ToStr(const ADate : TDateTimeRec) : string;
begin begin
Result := xsd_DateTimeToStr(ADate); Result := xsd_DateTimeToStr(ADate,xdkDate);
end; end;
class function TDateRemotable.Parse(const ABuffer: string): TDateTimeRec; class function TDateRemotable.Parse(const ABuffer : string) : TDateTimeRec;
begin begin
Result := xsd_StrToDate(ABuffer); Result := xsd_StrToDate(ABuffer,xdkDate);
end; end;
function TDateRemotable.GetDatepart(const AIndex: Integer): Integer; { TDateTimeRemotable }
class function TDateTimeRemotable.ToStr(const ADate: TDateTimeRec): string;
begin
Result := xsd_DateTimeToStr(ADate,xdkDateTime);
end;
class function TDateTimeRemotable.Parse(const ABuffer: string): TDateTimeRec;
begin
Result := xsd_StrToDate(ABuffer,xdkDateTime);
end;
function TDateTimeRemotable.GetDatepart(const AIndex: Integer): Integer;
begin begin
case AIndex of case AIndex of
3 : Result := HourOf(AsDate); 3 : Result := HourOf(AsDate);
@ -5675,7 +5696,7 @@ class procedure TBaseDateRemotable.Save(
var var
buffer : string; buffer : string;
begin begin
buffer := TDateRemotable(AObject).AsString; buffer := TBaseDateRemotable(AObject).AsString;
AStore.BeginObject(AName,ATypeInfo); AStore.BeginObject(AName,ATypeInfo);
try try
AStore.PutScopeInnerValue(TypeInfo(string),buffer); AStore.PutScopeInnerValue(TypeInfo(string),buffer);
@ -5697,7 +5718,7 @@ begin
try try
strBuffer := ''; strBuffer := '';
AStore.GetScopeInnerValue(TypeInfo(string),strBuffer); AStore.GetScopeInnerValue(TypeInfo(string),strBuffer);
(AObject as TDateRemotable).AsString := strBuffer (AObject as TBaseDateRemotable).AsString := strBuffer
finally finally
AStore.EndScopeRead(); AStore.EndScopeRead();
end; end;
@ -5706,8 +5727,8 @@ end;
procedure TBaseDateRemotable.Assign(Source: TPersistent); procedure TBaseDateRemotable.Assign(Source: TPersistent);
begin begin
if Source.InheritsFrom(TDateRemotable) then begin if Source.InheritsFrom(TBaseDateRemotable) then begin
FDate := TDateRemotable(Source).FDate; FDate := TBaseDateRemotable(Source).FDate;
end else begin end else begin
inherited Assign(Source); inherited Assign(Source);
end; end;
@ -6847,8 +6868,8 @@ begin
end else begin end else begin
if Source.InheritsFrom(TTimeRemotable) then if Source.InheritsFrom(TTimeRemotable) then
Self.Data := TTimeRemotable(Source).Data Self.Data := TTimeRemotable(Source).Data
else if Source.InheritsFrom(TDateRemotable) then else if Source.InheritsFrom(TDateTimeRemotable) then
Self.Data := DateTimeToTimeRec(TDateRemotable(Source).AsUTCDate) Self.Data := DateTimeToTimeRec(TDateTimeRemotable(Source).AsUTCDate)
else else
inherited Assign(Source); inherited Assign(Source);
end; end;

View File

@ -1263,7 +1263,9 @@ begin
if ( ATypeInfo^.Kind = tkClass ) then begin if ( ATypeInfo^.Kind = tkClass ) then begin
locClass := GetTypeData(ATypeInfo)^.ClassType; locClass := GetTypeData(ATypeInfo)^.ClassType;
if locClass.InheritsFrom(TAbstractSimpleRemotable) then begin if locClass.InheritsFrom(TAbstractSimpleRemotable) then begin
if locClass.InheritsFrom(TDateRemotable) then if locClass.InheritsFrom(TDateTimeRemotable) or
locClass.InheritsFrom(TDateRemotable)
then
locScopeType := stXmlRpcDate locScopeType := stXmlRpcDate
else else
locScopeType := stSimpleContent; locScopeType := stSimpleContent;

View File

@ -65,11 +65,27 @@ const
Negative : False; Negative : False;
); );
function xsd_TryStrToDate(const AStr : string; out ADate : TDateTimeRec) : Boolean; type
function xsd_StrToDate(const AStr : string) : TDateTimeRec; {$IFDEF USE_INLINE}inline;{$ENDIF} TXsdDateKind = ( xdkDateTime, xdkDate );
function xsd_DateTimeToStr(const ADate : TDateTimeRec) : string;overload; function xsd_TryStrToDate(
function xsd_DateTimeToStr(const ADate : TDateTime) : string;overload; const AStr : string;
out ADate : TDateTimeRec;
const ADateKind : TXsdDateKind
) : Boolean;
function xsd_StrToDate(
const AStr : string;
const ADateKind : TXsdDateKind
) : TDateTimeRec; {$IFDEF USE_INLINE}inline;{$ENDIF}
function xsd_DateTimeToStr(
const ADate : TDateTimeRec;
const ADateKind : TXsdDateKind
) : string; overload;
function xsd_DateTimeToStr(
const ADate : TDateTime;
const ADateKind : TXsdDateKind
) : string;overload;
function xsd_TimeToStr(const ATime : TTimeRec) : string; function xsd_TimeToStr(const ATime : TTimeRec) : string;
function xsd_TryStrToTime(const AStr : string; out ADate : TTimeRec) : Boolean; function xsd_TryStrToTime(const AStr : string; out ADate : TTimeRec) : Boolean;
@ -184,7 +200,11 @@ begin
( a.MinuteOffset = b.MinuteOffset ); ( a.MinuteOffset = b.MinuteOffset );
end; end;
function xsd_TryStrToDate(const AStr : string; out ADate : TDateTimeRec) : Boolean; function xsd_TryStrToDate(
const AStr : string;
out ADate : TDateTimeRec;
const ADateKind : TXsdDateKind
) : Boolean;
const const
DATE_SEP_CHAR = '-'; TIME_MARKER_CHAR = 'T'; TIME_SEP_CHAR = ':'; DATE_SEP_CHAR = '-'; TIME_MARKER_CHAR = 'T'; TIME_SEP_CHAR = ':';
var var
@ -262,30 +282,38 @@ begin
if ReadInt(m,DATE_SEP_CHAR) then begin if ReadInt(m,DATE_SEP_CHAR) then begin
Inc(bufferPos); Inc(bufferPos);
if ReadInt(d,#0) then begin if ReadInt(d,#0) then begin
Inc(bufferPos);
tz_hh := 0; tz_hh := 0;
tz_mn := 0; tz_mn := 0;
if ( bufferPos > bufferLen ) then begin hh := 0;
hh := 0; mn := 0;
mn := 0; ss := 0;
ss := 0; ssss := 0;
ssss := 0; if ( bufferPos >= bufferLen ) then begin
ok := True; ok := True;
end else begin end else begin
ok := ( buffer[bufferPos -1] = TIME_MARKER_CHAR ) and ReadInt(hh,TIME_SEP_CHAR); ok := ( buffer[bufferPos] in [TIME_MARKER_CHAR,'-','+'] );
if ok then begin if ok then begin
Inc(bufferPos); if ( buffer[bufferPos] = TIME_MARKER_CHAR ) then begin
ok := ReadInt(mn,TIME_SEP_CHAR);
if ok then begin
Inc(bufferPos); Inc(bufferPos);
ok := ReadInt(ss,#0); ok := ( ADateKind = xdkDateTime ) and ReadInt(hh,TIME_SEP_CHAR);
if ok and ( bufferPos < bufferLen ) and ( buffer[bufferPos] = '.' ) then begin if ok then begin
Inc(bufferPos); Inc(bufferPos);
ok := ReadMiliSeconds(ssss); ok := ReadInt(mn,TIME_SEP_CHAR);
end else begin if ok then begin
ssss := 0; Inc(bufferPos);
ok := ReadInt(ss,#0);
if ok and ( bufferPos < bufferLen ) and ( buffer[bufferPos] = '.' ) then begin
Inc(bufferPos);
ok := ReadMiliSeconds(ssss);
end else begin
ssss := 0;
end;
end;
end; end;
if ok and ( bufferPos < bufferLen ) then begin end;
if ok and ( bufferPos < bufferLen ) then begin
ok := ( buffer[bufferPos] in ['-','+'] );
if ok then begin
tz_negative := ( buffer[bufferPos] = '-' ); tz_negative := ( buffer[bufferPos] = '-' );
Inc(bufferPos); Inc(bufferPos);
ok := ReadInt(tz_hh,TIME_SEP_CHAR); ok := ReadInt(tz_hh,TIME_SEP_CHAR);
@ -319,18 +347,25 @@ begin
end; end;
end; end;
function xsd_StrToDate(const AStr : string) : TDateTimeRec; function xsd_StrToDate(
const AStr : string;
const ADateKind : TXsdDateKind
) : TDateTimeRec;
begin begin
if not xsd_TryStrToDate(AStr,Result) then if not xsd_TryStrToDate(AStr,Result,ADateKind) then
raise EConvertError.CreateFmt(SERR_InvalidDate,[AStr]); raise EConvertError.CreateFmt(SERR_InvalidDate,[AStr]);
end; end;
{$HINTS OFF} {$HINTS OFF}
function xsd_DateTimeToStr(const ADate : TDateTimeRec) : string; function xsd_DateTimeToStr(
const ADate : TDateTimeRec;
const ADateKind : TXsdDateKind
) : string;
var var
locDate : TDateTime; locDate : TDateTime;
d, m, y : Word; d, m, y : Word;
hh, mn, ss, ssss : Word; hh, mn, ss, ssss : Word;
locRes : string;
begin begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
locDate := ADate.Date; locDate := ADate.Date;
@ -338,21 +373,30 @@ begin
locDate := IncHour(locDate,-ADate.HourOffset); locDate := IncHour(locDate,-ADate.HourOffset);
if ( ADate.MinuteOffset <> 0 ) then if ( ADate.MinuteOffset <> 0 ) then
locDate := IncMinute(locDate,-ADate.MinuteOffset); locDate := IncMinute(locDate,-ADate.MinuteOffset);
DecodeDateTime(locDate,y,m,d,hh,mn,ss,ssss); if ( ADateKind = xdkDate ) then begin
if ( ssss = 0 ) then DecodeDate(locDate,y,m,d);
Result := Format('%.4d-%.2d-%.2dT%.2d:%.2d:%.2dZ',[y,m,d, hh,mn,ss]) locRes := Format('%.4d-%.2d-%.2d',[y,m,d]);
else end else begin
Result := Format('%.4d-%.2d-%.2dT%.2d:%.2d:%.2d.%.3dZ',[y,m,d, hh,mn,ss,ssss]); DecodeDateTime(locDate,y,m,d,hh,mn,ss,ssss);
if ( ssss = 0 ) then
locRes := Format('%.4d-%.2d-%.2dT%.2d:%.2d:%.2dZ',[y,m,d, hh,mn,ss])
else
locRes := Format('%.4d-%.2d-%.2dT%.2d:%.2d:%.2d.%.3dZ',[y,m,d, hh,mn,ss,ssss]);
end;
Result := locRes;
end; end;
{$HINTS ON} {$HINTS ON}
function xsd_DateTimeToStr(const ADate : TDateTime) : string; function xsd_DateTimeToStr(
const ADate : TDateTime;
const ADateKind : TXsdDateKind
) : string;
var var
tmpDate : TDateTimeRec; tmpDate : TDateTimeRec;
begin begin
FillChar(tmpDate,SizeOf(TDateTimeRec),#0); FillChar(tmpDate,SizeOf(TDateTimeRec),#0);
tmpDate.Date := ADate; tmpDate.Date := ADate;
Result := xsd_DateTimeToStr(tmpDate); Result := xsd_DateTimeToStr(tmpDate,ADateKind);
end; end;
function xsd_TimeToStr(const ATime : TTimeRec) : string; function xsd_TimeToStr(const ATime : TTimeRec) : string;

View File

@ -36,6 +36,8 @@ type
{$ENDIF WST_DELPHI} {$ENDIF WST_DELPHI}
published published
procedure xsd_TryStrToDate_date_only(); procedure xsd_TryStrToDate_date_only();
procedure xsd_TryStrToDate_date_timezone_1();
procedure xsd_TryStrToDate_date_timezone_2();
procedure xsd_TryStrToDate_date_time(); procedure xsd_TryStrToDate_date_time();
procedure xsd_TryStrToDate_date_time_fractional_second(); procedure xsd_TryStrToDate_date_time_fractional_second();
procedure xsd_TryStrToDate_date_bad_separator(); procedure xsd_TryStrToDate_date_bad_separator();
@ -78,11 +80,11 @@ begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
FillChar(d,SizeOf(d),#0); FillChar(d,SizeOf(d),#0);
d.Date := EncodeDate(1976,10,12) + EncodeTime(23,34,56,0); d.Date := EncodeDate(1976,10,12) + EncodeTime(23,34,56,0);
CheckEquals(sDATE_1, xsd_DateTimeToStr(d)); CheckEquals(sDATE_1, xsd_DateTimeToStr(d,xdkDateTime));
FillChar(d,SizeOf(d),#0); FillChar(d,SizeOf(d),#0);
d.Date := EncodeDate(987,06,12) - EncodeTime(20,34,56,0); d.Date := EncodeDate(987,06,12) - EncodeTime(20,34,56,0);
CheckEquals(sDATE_2, xsd_DateTimeToStr(d)); CheckEquals(sDATE_2, xsd_DateTimeToStr(d,xdkDateTime));
end; end;
procedure TTest_DateUtils.xsd_DateTimeToStr_2(); procedure TTest_DateUtils.xsd_DateTimeToStr_2();
@ -93,10 +95,10 @@ var
d : TDateTime; d : TDateTime;
begin begin
d := EncodeDate(1976,10,12) + EncodeTime(23,34,56,0); d := EncodeDate(1976,10,12) + EncodeTime(23,34,56,0);
CheckEquals(sDATE_1, xsd_DateTimeToStr(d)); CheckEquals(sDATE_1, xsd_DateTimeToStr(d,xdkDateTime));
d := EncodeDate(987,06,12) - EncodeTime(20,34,56,0); d := EncodeDate(987,06,12) - EncodeTime(20,34,56,0);
CheckEquals(sDATE_2, xsd_DateTimeToStr(d)); CheckEquals(sDATE_2, xsd_DateTimeToStr(d,xdkDateTime));
end; end;
procedure TTest_DateUtils.xsd_DateTimeToStr_fractional_second_1(); procedure TTest_DateUtils.xsd_DateTimeToStr_fractional_second_1();
@ -109,15 +111,15 @@ var
begin begin
FillChar(d,SizeOf(d),#0); FillChar(d,SizeOf(d),#0);
d.Date := EncodeDate(1976,10,12) + EncodeTime(23,34,56,7); d.Date := EncodeDate(1976,10,12) + EncodeTime(23,34,56,7);
CheckEquals(sDATE_1, xsd_DateTimeToStr(d)); CheckEquals(sDATE_1, xsd_DateTimeToStr(d,xdkDateTime));
FillChar(d,SizeOf(d),#0); FillChar(d,SizeOf(d),#0);
d.Date := EncodeDate(1976,10,12) + EncodeTime(23,34,56,78); d.Date := EncodeDate(1976,10,12) + EncodeTime(23,34,56,78);
CheckEquals(sDATE_2, xsd_DateTimeToStr(d)); CheckEquals(sDATE_2, xsd_DateTimeToStr(d,xdkDateTime));
FillChar(d,SizeOf(d),#0); FillChar(d,SizeOf(d),#0);
d.Date := EncodeDate(1976,10,12) + EncodeTime(23,34,56,789); d.Date := EncodeDate(1976,10,12) + EncodeTime(23,34,56,789);
CheckEquals(sDATE_3, xsd_DateTimeToStr(d)); CheckEquals(sDATE_3, xsd_DateTimeToStr(d,xdkDateTime));
end; end;
procedure TTest_DateUtils.xsd_DateTimeToStr_fractional_second_2(); procedure TTest_DateUtils.xsd_DateTimeToStr_fractional_second_2();
@ -130,15 +132,15 @@ var
begin begin
FillChar(d,SizeOf(d),#0); FillChar(d,SizeOf(d),#0);
d := EncodeDate(1976,10,12) + EncodeTime(23,34,56,7); d := EncodeDate(1976,10,12) + EncodeTime(23,34,56,7);
CheckEquals(sDATE_1, xsd_DateTimeToStr(d)); CheckEquals(sDATE_1, xsd_DateTimeToStr(d,xdkDateTime));
FillChar(d,SizeOf(d),#0); FillChar(d,SizeOf(d),#0);
d := EncodeDate(1976,10,12) + EncodeTime(23,34,56,78); d := EncodeDate(1976,10,12) + EncodeTime(23,34,56,78);
CheckEquals(sDATE_2, xsd_DateTimeToStr(d)); CheckEquals(sDATE_2, xsd_DateTimeToStr(d,xdkDateTime));
FillChar(d,SizeOf(d),#0); FillChar(d,SizeOf(d),#0);
d := EncodeDate(1976,10,12) + EncodeTime(23,34,56,789); d := EncodeDate(1976,10,12) + EncodeTime(23,34,56,789);
CheckEquals(sDATE_3, xsd_DateTimeToStr(d)); CheckEquals(sDATE_3, xsd_DateTimeToStr(d,xdkDateTime));
end; end;
procedure TTest_DateUtils.xsd_DateTimeToStr_timezone_1(); procedure TTest_DateUtils.xsd_DateTimeToStr_timezone_1();
@ -150,7 +152,7 @@ begin
FillChar(d,SizeOf(d),#0); FillChar(d,SizeOf(d),#0);
d.Date := EncodeDate(2002,10,10) + EncodeTime(12,0,0,0); d.Date := EncodeDate(2002,10,10) + EncodeTime(12,0,0,0);
d.HourOffset := 5; d.HourOffset := 5;
CheckEquals('2002-10-10T07:00:00Z', xsd_DateTimeToStr(d)); CheckEquals('2002-10-10T07:00:00Z', xsd_DateTimeToStr(d,xdkDateTime));
end; end;
procedure TTest_DateUtils.xsd_TimeToStr_1(); procedure TTest_DateUtils.xsd_TimeToStr_1();
@ -335,10 +337,10 @@ var
begin begin
s := '23:34:56+12:34'; s := '23:34:56+12:34';
Check(xsd_TryStrToTime(s,d)); Check(xsd_TryStrToTime(s,d));
CheckEquals(d.Hour,23,'Hour'); CheckEquals(23,d.Hour,'Hour');
CheckEquals(d.Minute,34,'Minute'); CheckEquals(34,d.Minute,'Minute');
CheckEquals(d.Second,56,'Second'); CheckEquals(56,d.Second,'Second');
CheckEquals(d.MilliSecond,0,'MilliSecond'); CheckEquals(0,d.MilliSecond,'MilliSecond');
CheckEquals(12,d.HourOffset,'HourOffset'); CheckEquals(12,d.HourOffset,'HourOffset');
CheckEquals(34,d.MinuteOffset,'MinuteOffset'); CheckEquals(34,d.MinuteOffset,'MinuteOffset');
end; end;
@ -350,10 +352,10 @@ var
begin begin
s := '23:34:56-01:23'; s := '23:34:56-01:23';
Check(xsd_TryStrToTime(s,d)); Check(xsd_TryStrToTime(s,d));
CheckEquals(d.Hour,23,'Hour'); CheckEquals(23,d.Hour,'Hour');
CheckEquals(d.Minute,34,'Minute'); CheckEquals(34,d.Minute,'Minute');
CheckEquals(d.Second,56,'Second'); CheckEquals(56,d.Second,'Second');
CheckEquals(d.MilliSecond,0,'MilliSecond'); CheckEquals(0,d.MilliSecond,'MilliSecond');
CheckEquals(-1,d.HourOffset,'HourOffset'); CheckEquals(-1,d.HourOffset,'HourOffset');
CheckEquals(-23,d.MinuteOffset,'MinuteOffset'); CheckEquals(-23,d.MinuteOffset,'MinuteOffset');
end; end;
@ -365,10 +367,10 @@ var
begin begin
s := '23:34:56.78+12:34'; s := '23:34:56.78+12:34';
Check(xsd_TryStrToTime(s,d)); Check(xsd_TryStrToTime(s,d));
CheckEquals(d.Hour,23,'Hour'); CheckEquals(23,d.Hour,'Hour');
CheckEquals(d.Minute,34,'Minute'); CheckEquals(34,d.Minute,'Minute');
CheckEquals(d.Second,56,'Second'); CheckEquals(56,d.Second,'Second');
CheckEquals(d.MilliSecond,78,'MilliSecond'); CheckEquals(78,d.MilliSecond,'MilliSecond');
CheckEquals(12,d.HourOffset,'HourOffset'); CheckEquals(12,d.HourOffset,'HourOffset');
CheckEquals(34,d.MinuteOffset,'MinuteOffset'); CheckEquals(34,d.MinuteOffset,'MinuteOffset');
end; end;
@ -380,10 +382,10 @@ var
begin begin
s := '23:34:56.789-01:23'; s := '23:34:56.789-01:23';
Check(xsd_TryStrToTime(s,d)); Check(xsd_TryStrToTime(s,d));
CheckEquals(d.Hour,23,'Hour'); CheckEquals(23,d.Hour,'Hour');
CheckEquals(d.Minute,34,'Minute'); CheckEquals(34,d.Minute,'Minute');
CheckEquals(d.Second,56,'Second'); CheckEquals(56,d.Second,'Second');
CheckEquals(d.MilliSecond,789,'MilliSecond'); CheckEquals(789,d.MilliSecond,'MilliSecond');
CheckEquals(-1,d.HourOffset,'HourOffset'); CheckEquals(-1,d.HourOffset,'HourOffset');
CheckEquals(-23,d.MinuteOffset,'MinuteOffset'); CheckEquals(-23,d.MinuteOffset,'MinuteOffset');
end; end;
@ -394,7 +396,7 @@ const
var var
d : TDateTimeRec; d : TDateTimeRec;
begin begin
CheckEquals(False,xsd_TryStrToDate(DATE_STR,d),Format('"%s" is not a valid date.',[DATE_STR])); CheckEquals(False,xsd_TryStrToDate(DATE_STR,d,xdkDateTime),Format('"%s" is not a valid date.',[DATE_STR]));
end; end;
{$IFDEF FPC} {$IFDEF FPC}
@ -430,17 +432,73 @@ var
begin begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
s := '1976-10-12'; s := '1976-10-12';
d := xsd_StrToDate(s); d := xsd_StrToDate(s,xdkDateTime);
DecodeDate(d.Date,y,m,dy); DecodeDate(d.Date,y,m,dy);
CheckEquals(y,1976,'Year'); CheckEquals(1976,y,'Year');
CheckEquals(m,10,'Month'); CheckEquals(10,m,'Month');
CheckEquals(dy,12,'Day'); CheckEquals(12,dy,'Day');
DecodeTime(d.Date,hh,mn,ss,ssss); DecodeTime(d.Date,hh,mn,ss,ssss);
CheckEquals(hh,0,'Hour'); CheckEquals(0,hh,'Hour');
CheckEquals(mn,0,'Minute'); CheckEquals(0,mn,'Minute');
CheckEquals(ss,0,'Second'); CheckEquals(0,ss,'Second');
CheckEquals(0,d.HourOffset,'HourOffset'); CheckEquals(0,d.HourOffset,'HourOffset');
CheckEquals(0,d.MinuteOffset,'MinuteOffset'); CheckEquals(0,d.MinuteOffset,'MinuteOffset');
d := xsd_StrToDate(s,xdkDate);
DecodeDate(d.Date,y,m,dy);
CheckEquals(1976,y,'Year');
CheckEquals(10,m,'Month');
CheckEquals(12,dy,'Day');
DecodeTime(d.Date,hh,mn,ss,ssss);
CheckEquals(0,hh,'Hour');
CheckEquals(0,mn,'Minute');
CheckEquals(0,ss,'Second');
CheckEquals(0,d.HourOffset,'HourOffset');
CheckEquals(0,d.MinuteOffset,'MinuteOffset');
end;
procedure TTest_DateUtils.xsd_TryStrToDate_date_timezone_1();
var
s : string;
d : TDateTimeRec;
y,m,dy : Word;
hh,mn,ss, ssss : Word;
begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
s := '1976-10-12+11:34';
d := xsd_StrToDate(s,xdkDate);
DecodeDate(d.Date,y,m,dy);
CheckEquals(1976,y,'Year');
CheckEquals(10,m,'Month');
CheckEquals(12,dy,'Day');
DecodeTime(d.Date,hh,mn,ss,ssss);
CheckEquals(0,hh,'Hour');
CheckEquals(0,mn,'Minute');
CheckEquals(0,ss,'Second');
CheckEquals(11,d.HourOffset,'HourOffset');
CheckEquals(34,d.MinuteOffset,'MinuteOffset');
end;
procedure TTest_DateUtils.xsd_TryStrToDate_date_timezone_2();
var
s : string;
d : TDateTimeRec;
y,m,dy : Word;
hh,mn,ss, ssss : Word;
begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
s := '1976-10-12-11:34';
d := xsd_StrToDate(s,xdkDate);
DecodeDate(d.Date,y,m,dy);
CheckEquals(1976,y,'Year');
CheckEquals(10,m,'Month');
CheckEquals(12,dy,'Day');
DecodeTime(d.Date,hh,mn,ss,ssss);
CheckEquals(0,hh,'Hour');
CheckEquals(0,mn,'Minute');
CheckEquals(0,ss,'Second');
CheckEquals(-11,d.HourOffset,'HourOffset');
CheckEquals(-34,d.MinuteOffset,'MinuteOffset');
end; end;
procedure TTest_DateUtils.xsd_TryStrToDate_date_time(); procedure TTest_DateUtils.xsd_TryStrToDate_date_time();
@ -452,15 +510,15 @@ var
begin begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
s := '1976-10-12T23:34:56'; s := '1976-10-12T23:34:56';
d := xsd_StrToDate(s); d := xsd_StrToDate(s,xdkDateTime);
DecodeDate(d.Date,y,m,dy); DecodeDate(d.Date,y,m,dy);
CheckEquals(y,1976,'Year'); CheckEquals(1976,y,'Year');
CheckEquals(m,10,'Month'); CheckEquals(10,m,'Month');
CheckEquals(dy,12,'Day'); CheckEquals(12,dy,'Day');
DecodeTime(d.Date,hh,mn,ss,ssss); DecodeTime(d.Date,hh,mn,ss,ssss);
CheckEquals(hh,23,'Hour'); CheckEquals(23,hh,'Hour');
CheckEquals(mn,34,'Minute'); CheckEquals(34,mn,'Minute');
CheckEquals(ss,56,'Second'); CheckEquals(56,ss,'Second');
CheckEquals(0,d.HourOffset,'HourOffset'); CheckEquals(0,d.HourOffset,'HourOffset');
CheckEquals(0,d.MinuteOffset,'MinuteOffset'); CheckEquals(0,d.MinuteOffset,'MinuteOffset');
end; end;
@ -471,7 +529,7 @@ const
var var
d : TDateTimeRec; d : TDateTimeRec;
begin begin
CheckEquals(False,xsd_TryStrToDate(DATE_STR,d),Format('"%s" is not a valid date.',[DATE_STR])); CheckEquals(False,xsd_TryStrToDate(DATE_STR,d,xdkDateTime),Format('"%s" is not a valid date.',[DATE_STR]));
end; end;
procedure TTest_DateUtils.xsd_TryStrToDate_date_time_fractional_second(); procedure TTest_DateUtils.xsd_TryStrToDate_date_time_fractional_second();
@ -486,7 +544,7 @@ procedure TTest_DateUtils.xsd_TryStrToDate_date_time_fractional_second();
y,m,dy : Word; y,m,dy : Word;
hh,mn,ss, ssss : Word; hh,mn,ss, ssss : Word;
begin begin
d := xsd_StrToDate(AString); d := xsd_StrToDate(AString,xdkDateTime);
DecodeDate(d.Date,y,m,dy); DecodeDate(d.Date,y,m,dy);
CheckEquals(AY,y,'Year'); CheckEquals(AY,y,'Year');
CheckEquals(AM,m,'Month'); CheckEquals(AM,m,'Month');
@ -519,7 +577,7 @@ var
begin begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
s := '1976-10-12T23:34:56+12:34'; s := '1976-10-12T23:34:56+12:34';
d := xsd_StrToDate(s); d := xsd_StrToDate(s,xdkDateTime);
DecodeDate(d.Date,y,m,dy); DecodeDate(d.Date,y,m,dy);
CheckEquals(y,1976,'Year'); CheckEquals(y,1976,'Year');
CheckEquals(m,10,'Month'); CheckEquals(m,10,'Month');
@ -541,7 +599,7 @@ var
begin begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
s := '1976-10-12T23:34:56-01:23'; s := '1976-10-12T23:34:56-01:23';
d := xsd_StrToDate(s); d := xsd_StrToDate(s,xdkDateTime);
DecodeDate(d.Date,y,m,dy); DecodeDate(d.Date,y,m,dy);
CheckEquals(y,1976,'Year'); CheckEquals(y,1976,'Year');
CheckEquals(m,10,'Month'); CheckEquals(m,10,'Month');
@ -563,7 +621,7 @@ var
begin begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
s := '1976-10-12T23:34:56Z'; s := '1976-10-12T23:34:56Z';
d := xsd_StrToDate(s); d := xsd_StrToDate(s,xdkDateTime);
DecodeDate(d.Date,y,m,dy); DecodeDate(d.Date,y,m,dy);
CheckEquals(y,1976,'Year'); CheckEquals(y,1976,'Year');
CheckEquals(m,10,'Month'); CheckEquals(m,10,'Month');
@ -585,7 +643,7 @@ var
begin begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
s := '1976-10-12T23:34:56+00:00'; s := '1976-10-12T23:34:56+00:00';
d := xsd_StrToDate(s); d := xsd_StrToDate(s,xdkDateTime);
DecodeDate(d.Date,y,m,dy); DecodeDate(d.Date,y,m,dy);
CheckEquals(y,1976,'Year'); CheckEquals(y,1976,'Year');
CheckEquals(m,10,'Month'); CheckEquals(m,10,'Month');
@ -598,7 +656,7 @@ begin
CheckEquals(0,d.MinuteOffset,'MinuteOffset'); CheckEquals(0,d.MinuteOffset,'MinuteOffset');
s := '1976-10-12T23:34:56-00:00'; s := '1976-10-12T23:34:56-00:00';
d := xsd_StrToDate(s); d := xsd_StrToDate(s,xdkDateTime);
DecodeDate(d.Date,y,m,dy); DecodeDate(d.Date,y,m,dy);
CheckEquals(y,1976,'Year'); CheckEquals(y,1976,'Year');
CheckEquals(m,10,'Month'); CheckEquals(m,10,'Month');

View File

@ -24,7 +24,8 @@ uses
const const
TestFilesPath = {$IFDEF WST_DELPHI}'.' +{$ENDIF WST_DELPHI}'.' + PathDelim + 'files' + PathDelim; TestFilesPath = {$IFDEF WST_DELPHI}'.' +{$ENDIF WST_DELPHI}'.' + PathDelim + 'files' + PathDelim;
EPSILON_DATE = 0.00004;
type type
{ TWstBaseTest } { TWstBaseTest }

View File

@ -296,9 +296,9 @@ type
procedure Equal(); procedure Equal();
end; end;
{ TTest_TDateRemotable } { TTest_TDateTimeRemotable }
TTest_TDateRemotable = class(TTestCase) TTest_TDateTimeRemotable = class(TTestCase)
published published
procedure FormatDate(); procedure FormatDate();
procedure FormatDate_ZERO(); procedure FormatDate_ZERO();
@ -314,6 +314,24 @@ type
procedure Year(); procedure Year();
end; end;
{ TTest_TDateTimeRemotable }
TTest_TDateRemotable = class(TTestCase)
published
procedure FormatDate();
procedure FormatDate_ZERO();
procedure ParseDate();
procedure Assign();
procedure Equal();
procedure AsDate();
procedure AsUTCDate();
procedure HourOffset();
procedure HourOffset_invalid_values();
procedure MinuteOffset();
procedure MinuteOffset_invalid_values();
procedure Year();
end;
{ TTest_TDurationRemotable } { TTest_TDurationRemotable }
TTest_TDurationRemotable = class(TTestCase) TTest_TDurationRemotable = class(TTestCase)
@ -2240,9 +2258,9 @@ begin
end; end;
end; end;
{ TTest_TDateRemotable } { TTest_TDateTimeRemotable }
procedure TTest_TDateRemotable.FormatDate(); procedure TTest_TDateTimeRemotable.FormatDate();
const const
sDATE_1 = '1976-10-12T23:34:56'; sDATE_1 = '1976-10-12T23:34:56';
sDATE_2 = '0987-06-12T20:34:56'; sDATE_2 = '0987-06-12T20:34:56';
@ -2251,9 +2269,288 @@ var
begin begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
d := EncodeDate(1976,10,12) + EncodeTime(23,34,56,0); d := EncodeDate(1976,10,12) + EncodeTime(23,34,56,0);
CheckEquals(sDATE_1, Copy(TDateRemotable.ToStr(d),1,Length(sDATE_1))); CheckEquals(sDATE_1, Copy(TDateTimeRemotable.ToStr(d),1,Length(sDATE_1)));
d := EncodeDate(987,06,12) - EncodeTime(20,34,56,0); d := EncodeDate(987,06,12) - EncodeTime(20,34,56,0);
CheckEquals(sDATE_2, Copy(TDateTimeRemotable.ToStr(d),1,Length(sDATE_2)));
end;
procedure TTest_TDateTimeRemotable.ParseDate();
var
s : string;
objd : TDateTimeRemotable;
d : TDateTimeRec;
y,m,dy : Word;
hh,mn,ss, ssss : Word;
begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
s := '1976-10-12T23:34:56';
d := TDateTimeRemotable.Parse(s);
DecodeDateTime(d.Date,y,m,dy, hh,mn,ss,ssss);
CheckEquals(1976,y,'Year');
CheckEquals(10,m,'Month');
CheckEquals(12,dy,'Day');
CheckEquals(23,hh,'Hour');
CheckEquals(34,mn,'Minute');
CheckEquals(56,ss,'Second');
objd := TDateTimeRemotable.Create();
try
objd.AsDate := d.Date;
CheckEquals(1976,objd.Year,'Year');
CheckEquals(10,objd.Month,'Month');
CheckEquals(12,objd.Day,'Day');
CheckEquals(23,objd.Hour,'Hour');
CheckEquals(34,objd.Minute,'Minute');
CheckEquals(56,objd.Second,'Second');
finally
FreeAndNil(objd);
end;
end;
procedure TTest_TDateTimeRemotable.Assign();
var
a, b : TDateTimeRemotable;
begin
b := nil;
a := TDateTimeRemotable.Create();
try
b := TDateTimeRemotable.Create();
Check(IsZero(a.AsDate - b.AsDate));
a.AsDate := Now();
b.Assign(a);
Check(IsZero(a.AsDate - b.AsDate));
a.AsDate := Now() + 1;
a.Assign(b);
Check(IsZero(a.AsDate - b.AsDate));
finally
b.Free();
a.Free();
end;
end;
procedure TTest_TDateTimeRemotable.Equal();
var
a, b : TDateTimeRemotable;
c : TClass_A;
begin
c := nil;
b := nil;
a := TDateTimeRemotable.Create();
try
b := TDateTimeRemotable.Create();
c := TClass_A.Create();
CheckEquals(False,a.Equal(nil));
CheckEquals(False,a.Equal(c));
a.AsDate := Now();
b.AsDate := a.AsDate;
CheckEquals(True,a.Equal(b));
CheckEquals(True,b.Equal(a));
a.AsDate := a.AsDate + 1;
CheckEquals(False,a.Equal(b));
CheckEquals(False,b.Equal(a));
finally
c.Free();
b.Free();
a.Free();
end;
end;
procedure TTest_TDateTimeRemotable.FormatDate_ZERO();
const sDATE = '1899-12-30T00:00:00';
var
d : TDateTime;
begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
d := 0;
CheckEquals(sDATE, Copy(TDateTimeRemotable.ToStr(d),1,Length(sDATE)));
end;
procedure TTest_TDateTimeRemotable.AsDate();
var
d : TDateTime;
locObj : TDateTimeRemotable;
begin
d := EncodeDateTime(1976,10,12,13,14,15,0);
locObj := TDateTimeRemotable.Create();
try
locObj.AsDate := d;
CheckEquals(d, locObj.AsDate);
locObj.HourOffset := 4;
locObj.MinuteOffset := 5;
CheckEquals(d, locObj.AsDate);
// test while (Hour|Minute)Offset is not null
locObj.HourOffset := 4;
locObj.MinuteOffset := 5;
locObj.AsDate := d;
CheckEquals(d, locObj.AsDate);
finally
locObj.Free();
end;
end;
procedure TTest_TDateTimeRemotable.AsUTCDate();
var
d, dd : TDateTime;
locObj : TDateTimeRemotable;
begin
d := EncodeDateTime(1976,10,12,13,14,15,0);
locObj := TDateTimeRemotable.Create();
try
locObj.AsUTCDate := d;
CheckEquals(d, locObj.AsUTCDate);
locObj.HourOffset := 4;
locObj.MinuteOffset := 5;
dd := date_utils.IncHour(d,-locObj.HourOffset);
dd := date_utils.IncMinute(dd,-locObj.MinuteOffset);
CheckEquals(dd, locObj.AsUTCDate);
// test while (Hour|Minute)Offset is not null
locObj.AsUTCDate := dd;
CheckEquals(dd, locObj.AsUTCDate);
finally
locObj.Free();
end;
end;
procedure TTest_TDateTimeRemotable.HourOffset();
var
locObj : TDateTimeRemotable;
begin
locObj := TDateTimeRemotable.Create();
try
locObj.HourOffset := -5;
CheckEquals(-5, locObj.HourOffset);
locObj.HourOffset := 0;
CheckEquals(0, locObj.HourOffset);
locObj.HourOffset := 1;
CheckEquals(1, locObj.HourOffset);
locObj.HourOffset := 2;
CheckEquals(2, locObj.HourOffset);
finally
locObj.Free();
end;
end;
procedure TTest_TDateTimeRemotable.MinuteOffset();
var
locObj : TDateTimeRemotable;
begin
locObj := TDateTimeRemotable.Create();
try
locObj.MinuteOffset := -54;
CheckEquals(-54, locObj.MinuteOffset);
locObj.MinuteOffset := 0;
CheckEquals(0, locObj.MinuteOffset);
locObj.MinuteOffset := 20;
CheckEquals(20, locObj.MinuteOffset);
locObj.MinuteOffset := 56;
CheckEquals(56, locObj.MinuteOffset);
finally
locObj.Free();
end;
end;
procedure TTest_TDateTimeRemotable.HourOffset_invalid_values();
var
locObj : TDateTimeRemotable;
procedure check_invalid_value(const AValue : ShortInt);
var
ok : Boolean;
begin
try
locObj.HourOffset := AValue;
ok := False;
except
ok := True;
end;
Check(ok, Format('"%d" is not a valid hour offset',[AValue]));
end;
begin
locObj := TDateTimeRemotable.Create();
try
check_invalid_value(-50);
check_invalid_value(-24);
check_invalid_value(-15);
check_invalid_value(15);
check_invalid_value(24);
check_invalid_value(50);
finally
locObj.Free();
end;
end;
procedure TTest_TDateTimeRemotable.MinuteOffset_invalid_values();
var
locObj : TDateTimeRemotable;
procedure check_invalid_value(const AValue : ShortInt);
var
ok : Boolean;
begin
try
locObj.MinuteOffset := AValue;
ok := False;
except
ok := True;
end;
Check(ok, Format('"%d" is not a valid minute offset',[AValue]));
end;
begin
locObj := TDateTimeRemotable.Create();
try
check_invalid_value(-60);
check_invalid_value(-74);
check_invalid_value(-85);
check_invalid_value(65);
check_invalid_value(74);
check_invalid_value(80);
finally
locObj.Free();
end;
end;
procedure TTest_TDateTimeRemotable.Year();
var
locObj : TDateTimeRemotable;
begin
locObj := TDateTimeRemotable.Create();
try
locObj.AsDate := EncodeDate(1976,10,12);
CheckEquals(1976, locObj.Year);
locObj.AsDate := EncodeDate(2000,10,12);
CheckEquals(2000, locObj.Year);
locObj.AsDate := EncodeDate(2,10,12);
CheckEquals(2, locObj.Year);
{locObj.AsDate := EncodeDate(-1976,10,12);
CheckEquals(-1976, locObj.Year);}
finally
locObj.Free();
end;
end;
{ TTest_TDateRemotable }
procedure TTest_TDateRemotable.FormatDate();
const
sDATE_1 = '1976-10-12';
sDATE_2 = '0987-06-12';
var
d : TDateTime;
begin
d := EncodeDate(1976,10,12);
CheckEquals(sDATE_1, Copy(TDateRemotable.ToStr(d),1,Length(sDATE_1)));
d := EncodeDate(987,06,12);
CheckEquals(sDATE_2, Copy(TDateRemotable.ToStr(d),1,Length(sDATE_2))); CheckEquals(sDATE_2, Copy(TDateRemotable.ToStr(d),1,Length(sDATE_2)));
end; end;
@ -2265,26 +2562,19 @@ var
y,m,dy : Word; y,m,dy : Word;
hh,mn,ss, ssss : Word; hh,mn,ss, ssss : Word;
begin begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? s := '1976-10-12';
s := '1976-10-12T23:34:56';
d := TDateRemotable.Parse(s); d := TDateRemotable.Parse(s);
DecodeDateTime(d.Date,y,m,dy, hh,mn,ss,ssss); DecodeDateTime(d.Date,y,m,dy, hh,mn,ss,ssss);
CheckEquals(y,1976,'Year'); CheckEquals(1976,y,'Year');
CheckEquals(m,10,'Month'); CheckEquals(10,m,'Month');
CheckEquals(dy,12,'Day'); CheckEquals(12,dy,'Day');
CheckEquals(hh,23,'Hour');
CheckEquals(mn,34,'Minute');
CheckEquals(ss,56,'Second');
objd := TDateRemotable.Create(); objd := TDateRemotable.Create();
try try
objd.AsDate := d.Date; objd.AsDate := d.Date;
CheckEquals(objd.Year,1976,'Year'); CheckEquals(1976,objd.Year,'Year');
CheckEquals(objd.Month,10,'Month'); CheckEquals(10,objd.Month,'Month');
CheckEquals(objd.Day,12,'Day'); CheckEquals(12,objd.Day,'Day');
CheckEquals(objd.Hour,23,'Hour');
CheckEquals(objd.Minute,34,'Minute');
CheckEquals(objd.Second,56,'Second');
finally finally
FreeAndNil(objd); FreeAndNil(objd);
end; end;
@ -2300,11 +2590,11 @@ begin
b := TDateRemotable.Create(); b := TDateRemotable.Create();
Check(IsZero(a.AsDate - b.AsDate)); Check(IsZero(a.AsDate - b.AsDate));
a.AsDate := Now(); a.AsDate := Date();
b.Assign(a); b.Assign(a);
Check(IsZero(a.AsDate - b.AsDate)); Check(IsZero(a.AsDate - b.AsDate));
a.AsDate := Now() + 1; a.AsDate := Date() + 1;
a.Assign(b); a.Assign(b);
Check(IsZero(a.AsDate - b.AsDate)); Check(IsZero(a.AsDate - b.AsDate));
finally finally
@ -2328,7 +2618,7 @@ begin
CheckEquals(False,a.Equal(nil)); CheckEquals(False,a.Equal(nil));
CheckEquals(False,a.Equal(c)); CheckEquals(False,a.Equal(c));
a.AsDate := Now(); a.AsDate := Date();
b.AsDate := a.AsDate; b.AsDate := a.AsDate;
CheckEquals(True,a.Equal(b)); CheckEquals(True,a.Equal(b));
CheckEquals(True,b.Equal(a)); CheckEquals(True,b.Equal(a));
@ -2344,11 +2634,10 @@ begin
end; end;
procedure TTest_TDateRemotable.FormatDate_ZERO(); procedure TTest_TDateRemotable.FormatDate_ZERO();
const sDATE = '1899-12-30T00:00:00'; const sDATE = '1899-12-30';
var var
d : TDateTime; d : TDateTime;
begin begin
//'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
d := 0; d := 0;
CheckEquals(sDATE, Copy(TDateRemotable.ToStr(d),1,Length(sDATE))); CheckEquals(sDATE, Copy(TDateRemotable.ToStr(d),1,Length(sDATE)));
end; end;
@ -2358,7 +2647,7 @@ var
d : TDateTime; d : TDateTime;
locObj : TDateRemotable; locObj : TDateRemotable;
begin begin
d := EncodeDateTime(1976,10,12,13,14,15,0); d := EncodeDate(1976,10,12);
locObj := TDateRemotable.Create(); locObj := TDateRemotable.Create();
try try
locObj.AsDate := d; locObj.AsDate := d;
@ -2382,7 +2671,7 @@ var
d, dd : TDateTime; d, dd : TDateTime;
locObj : TDateRemotable; locObj : TDateRemotable;
begin begin
d := EncodeDateTime(1976,10,12,13,14,15,0); d := EncodeDate(1976,10,12);
locObj := TDateRemotable.Create(); locObj := TDateRemotable.Create();
try try
locObj.AsUTCDate := d; locObj.AsUTCDate := d;
@ -2395,7 +2684,7 @@ begin
// test while (Hour|Minute)Offset is not null // test while (Hour|Minute)Offset is not null
locObj.AsUTCDate := dd; locObj.AsUTCDate := dd;
CheckEquals(dd, locObj.AsUTCDate); CheckEquals(dd, locObj.AsUTCDate,EPSILON_DATE);
finally finally
locObj.Free(); locObj.Free();
end; end;
@ -4013,6 +4302,7 @@ initialization
RegisterTest('Support',TTest_TObjectCollectionRemotable.Suite); RegisterTest('Support',TTest_TObjectCollectionRemotable.Suite);
RegisterTest('Support',TTest_TBaseComplexRemotable.Suite); RegisterTest('Support',TTest_TBaseComplexRemotable.Suite);
RegisterTest('Support',TTest_TStringBufferRemotable.Suite); RegisterTest('Support',TTest_TStringBufferRemotable.Suite);
RegisterTest('Support-Date',TTest_TDateTimeRemotable.Suite);
RegisterTest('Support-Date',TTest_TDateRemotable.Suite); RegisterTest('Support-Date',TTest_TDateRemotable.Suite);
RegisterTest('Support-Date',TTest_TDurationRemotable.Suite); RegisterTest('Support-Date',TTest_TDurationRemotable.Suite);
RegisterTest('Support-Date',TTest_TTimeRemotable.Suite); RegisterTest('Support-Date',TTest_TTimeRemotable.Suite);

View File

@ -42,7 +42,8 @@ type
private private
FVal_32S: LongInt; FVal_32S: LongInt;
FVal_Bool: Boolean; FVal_Bool: Boolean;
FVal_Date: TDateRemotable; FVal_Date : TDateRemotable;
FVal_DateTime: TDateTimeRemotable;
FVal_Enum: TTestEnum; FVal_Enum: TTestEnum;
FVal_String: string; FVal_String: string;
FVal_Time : TTimeRemotable; FVal_Time : TTimeRemotable;
@ -62,6 +63,7 @@ type
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
property Val_UnicodeString : UnicodeString Read FVal_UnicodeString Write FVal_UnicodeString; property Val_UnicodeString : UnicodeString Read FVal_UnicodeString Write FVal_UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
property Val_DateTime : TDateTimeRemotable read FVal_DateTime write FVal_DateTime;
property Val_Date : TDateRemotable read FVal_Date write FVal_Date; property Val_Date : TDateRemotable read FVal_Date write FVal_Date;
property Val_Time : TTimeRemotable read FVal_Time write FVal_Time; property Val_Time : TTimeRemotable read FVal_Time write FVal_Time;
End; End;
@ -2945,6 +2947,7 @@ end;
procedure TTestFormatter.Test_Object(); procedure TTestFormatter.Test_Object();
const const
DATE_VALUE = 39000; DATE_VALUE = 39000;
DATETIME_VALUE = 39000.1234;
TIME_VALUE = '01:23:45.789Z'; TIME_VALUE = '01:23:45.789Z';
Var Var
f : IFormatterBase; f : IFormatterBase;
@ -2964,6 +2967,7 @@ begin
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
a.ObjProp.Val_String := '456'; a.ObjProp.Val_String := '456';
a.ObjProp.Val_WideString := 'wide456'; a.ObjProp.Val_WideString := 'wide456';
a.ObjProp.Val_DateTime.AsDate := DATETIME_VALUE;
a.ObjProp.Val_Date.AsDate := DATE_VALUE; a.ObjProp.Val_Date.AsDate := DATE_VALUE;
a.ObjProp.Val_Time.AsString := TIME_VALUE; a.ObjProp.Val_Time.AsString := TIME_VALUE;
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
@ -2981,7 +2985,7 @@ begin
f.EndScope(); f.EndScope();
s := TMemoryStream.Create(); s := TMemoryStream.Create();
f.SaveToStream(s); f.SaveToStream(s);
FreeAndNil(a); FreeAndNil(a);
a := TClass_B.Create(); a := TClass_B.Create();
@ -3006,6 +3010,7 @@ begin
CheckEquals(Ord(teFour),Ord(a.ObjProp.Val_Enum)); CheckEquals(Ord(teFour),Ord(a.ObjProp.Val_Enum));
CheckEquals('456',a.ObjProp.Val_String); CheckEquals('456',a.ObjProp.Val_String);
CheckEquals(WideString('wide456'),a.ObjProp.Val_WideString); CheckEquals(WideString('wide456'),a.ObjProp.Val_WideString);
CheckEquals(TDateTimeRemotable.ToStr(DATETIME_VALUE),TDateTimeRemotable.ToStr(a.ObjProp.Val_DateTime.AsDate));
CheckEquals(TDateRemotable.ToStr(DATE_VALUE),TDateRemotable.ToStr(a.ObjProp.Val_Date.AsDate)); CheckEquals(TDateRemotable.ToStr(DATE_VALUE),TDateRemotable.ToStr(a.ObjProp.Val_Date.AsDate));
CheckEquals(TIME_VALUE,a.ObjProp.Val_Time.AsString); CheckEquals(TIME_VALUE,a.ObjProp.Val_Time.AsString);
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
@ -4657,7 +4662,7 @@ begin
Check( ls.IndexOf('intv') >= 0 ); Check( ls.IndexOf('intv') >= 0 );
x := 'a'; x := 'a';
f.BeginObjectRead(x,TypeInfo(TClass_A)); f.BeginObjectRead(x,TypeInfo(TClass_A));
CheckEquals(7{$IFDEF WST_UNICODESTRING}+1{$ENDIF}, f.GetScopeItemNames(ls), 'GetScopeItemNames.Count(a)'); CheckEquals(8{$IFDEF WST_UNICODESTRING}+1{$ENDIF}, f.GetScopeItemNames(ls), 'GetScopeItemNames.Count(a)');
Check( ls.IndexOf('Val_Bool') >= 0 ); Check( ls.IndexOf('Val_Bool') >= 0 );
Check( ls.IndexOf('Val_Enum') >= 0 ); Check( ls.IndexOf('Val_Enum') >= 0 );
Check( ls.IndexOf('Val_String') >= 0 ); Check( ls.IndexOf('Val_String') >= 0 );
@ -4666,7 +4671,7 @@ begin
x := 'b'; x := 'b';
f.BeginObjectRead(x,TypeInfo(TClass_A)); f.BeginObjectRead(x,TypeInfo(TClass_A));
CheckEquals(7{$IFDEF WST_UNICODESTRING}+1{$ENDIF}, f.GetScopeItemNames(ls), 'GetScopeItemNames.Count(b)'); CheckEquals(8{$IFDEF WST_UNICODESTRING}+1{$ENDIF}, f.GetScopeItemNames(ls), 'GetScopeItemNames.Count(b)');
Check( ls.IndexOf('Val_Bool') >= 0 ); Check( ls.IndexOf('Val_Bool') >= 0 );
Check( ls.IndexOf('Val_Enum') >= 0 ); Check( ls.IndexOf('Val_Enum') >= 0 );
Check( ls.IndexOf('Val_String') >= 0 ); Check( ls.IndexOf('Val_String') >= 0 );
@ -4755,6 +4760,7 @@ end;
procedure TTestSOAPFormatter.do_test_Object(const AProps, AFilename: string); procedure TTestSOAPFormatter.do_test_Object(const AProps, AFilename: string);
const const
DATE_VALUE = 39000; DATE_VALUE = 39000;
DATETIME_VALUE = 39000.1234;
TIME_VALUE = '01:23:45.789Z'; TIME_VALUE = '01:23:45.789Z';
Var Var
f : IFormatterBase; f : IFormatterBase;
@ -4774,6 +4780,7 @@ begin
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
a.ObjProp.Val_String := '456'; a.ObjProp.Val_String := '456';
a.ObjProp.Val_WideString := 'wide456'; a.ObjProp.Val_WideString := 'wide456';
a.ObjProp.Val_DateTime.AsDate := DATETIME_VALUE;
a.ObjProp.Val_Date.AsDate := DATE_VALUE; a.ObjProp.Val_Date.AsDate := DATE_VALUE;
a.ObjProp.Val_Time.AsString := TIME_VALUE; a.ObjProp.Val_Time.AsString := TIME_VALUE;
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
@ -4794,8 +4801,8 @@ begin
s := TMemoryStream.Create(); s := TMemoryStream.Create();
f.SaveToStream(s); f.SaveToStream(s);
FreeAndNil(a); FreeAndNil(a);
//if not IsStrEmpty(AFilename) then if not IsStrEmpty(AFilename) then
//s.SaveToFile(wstExpandLocalFileName(AFilename)); s.SaveToFile(wstExpandLocalFileName(AFilename));
a := TClass_B.Create(); a := TClass_B.Create();
f := CreateFormatter(TypeInfo(TClass_B)); f := CreateFormatter(TypeInfo(TClass_B));
@ -4820,6 +4827,7 @@ begin
CheckEquals(Ord(teFour),Ord(a.ObjProp.Val_Enum)); CheckEquals(Ord(teFour),Ord(a.ObjProp.Val_Enum));
CheckEquals('456',a.ObjProp.Val_String); CheckEquals('456',a.ObjProp.Val_String);
CheckEquals(WideString('wide456'),a.ObjProp.Val_WideString); CheckEquals(WideString('wide456'),a.ObjProp.Val_WideString);
CheckEquals(TDateTimeRemotable.ToStr(DATETIME_VALUE),TDateTimeRemotable.ToStr(a.ObjProp.Val_DateTime.AsDate));
CheckEquals(TDateRemotable.ToStr(DATE_VALUE),TDateRemotable.ToStr(a.ObjProp.Val_Date.AsDate)); CheckEquals(TDateRemotable.ToStr(DATE_VALUE),TDateRemotable.ToStr(a.ObjProp.Val_Date.AsDate));
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
CheckEquals('unicode456',a.ObjProp.Val_UnicodeString); CheckEquals('unicode456',a.ObjProp.Val_UnicodeString);
@ -6297,6 +6305,7 @@ end;
constructor TClass_A.Create(); constructor TClass_A.Create();
begin begin
inherited Create(); inherited Create();
FVal_DateTime := TDateTimeRemotable.Create();
FVal_Date := TDateRemotable.Create(); FVal_Date := TDateRemotable.Create();
FVal_Time := TTimeRemotable.Create(); FVal_Time := TTimeRemotable.Create();
end; end;
@ -6305,6 +6314,7 @@ destructor TClass_A.Destroy();
begin begin
FreeAndNil(FVal_Time); FreeAndNil(FVal_Time);
FreeAndNil(FVal_Date); FreeAndNil(FVal_Date);
FreeAndNil(FVal_DateTime);
inherited Destroy(); inherited Destroy();
end; end;