64 bit integer handling in JSON format

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@807 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa 2009-05-24 15:26:40 +00:00
parent 6031b4b828
commit 1ce28d56b6
2 changed files with 58 additions and 29 deletions

View File

@ -43,7 +43,7 @@ type
TJonRPCVersion = ( jsonRPC_10, jsonRPC_11 );
TJsonInteger = Integer;
TEnumIntType = Integer;
TEnumIntType = Int64;
EJsonRpcException = class(EBaseRemoteException)
end;
@ -67,6 +67,10 @@ type
Const AName : string;
const AValue : TJsonInteger
) : TJSONData;virtual;abstract;
function CreateInt64Buffer(
Const AName : string;
const AValue : Int64
) : TJSONData;virtual;
function CreateFloatBuffer(
Const AName : string;
const AValue : TJSONFloat
@ -499,7 +503,7 @@ procedure TJsonRpcBaseFormatter.PutInt64(
const AData : Int64
);
begin
StackTop().CreateIntBuffer(AName,AData);
StackTop().CreateInt64Buffer(AName,AData);
end;
procedure TJsonRpcBaseFormatter.PutStr(
@ -627,8 +631,14 @@ procedure TJsonRpcBaseFormatter.GetInt64(
var AName : String;
var AData : Int64
);
var
locBuffer : TJSONData;
begin
AData := GetDataBuffer(AName).AsInteger;
locBuffer := GetDataBuffer(AName);
if ( locBuffer.JSONType = jtNumber ) and ( TJSONNumber(locBuffer).NumberType = ntInteger ) then
AData := locBuffer.AsInteger
else
AData := Round(locBuffer.AsFloat);
end;
procedure TJsonRpcBaseFormatter.GetFloat(
@ -1170,7 +1180,7 @@ begin
{$ENDIF}
enumData := 0;
If ( ATypeInfo^.Kind = tkInteger ) Then
GetInt(ATypeInfo,AName,enumData)
GetInt64(ATypeInfo,AName,enumData)
Else
GetEnum(ATypeInfo,AName,enumData);
Case GetTypeData(ATypeInfo)^.OrdType Of
@ -1294,7 +1304,7 @@ begin
{$ENDIF}
enumData := 0;
If ( ATypeInfo^.Kind = tkInteger ) Then
GetInt(ATypeInfo,locName,enumData)
GetInt64(ATypeInfo,locName,enumData)
Else
GetEnum(ATypeInfo,locName,enumData);
Case GetTypeData(ATypeInfo)^.OrdType Of
@ -1434,6 +1444,14 @@ begin
FScopeType := AScopeType;
end;
function TStackItem.CreateInt64Buffer(
const AName : string;
const AValue : Int64
) : TJSONData;
begin
Result := CreateFloatBuffer(AName,AValue);
end;
{ TObjectStackItem }
function TObjectStackItem.GetDataObject() : TJSONObject;

View File

@ -24,7 +24,7 @@ uses
TestFrameWork, ActiveX,
{$ENDIF}
TypInfo,
base_service_intf, wst_types, server_service_intf, service_intf;
test_suite_utils, base_service_intf, wst_types, server_service_intf, service_intf;
type
@ -386,7 +386,7 @@ type
{ TTestFormatterSimpleType }
TTestFormatterSimpleType= class(TTestCase)
TTestFormatterSimpleType= class(TWstBaseTest)
protected
function CreateFormatter(ARootType : PTypeInfo):IFormatterBase;virtual;abstract;
function Support_ComplextType_with_SimpleContent():Boolean;virtual;
@ -632,7 +632,7 @@ uses base_binary_formatter, base_soap_formatter, base_xmlrpc_formatter, record_r
, server_service_soap, soap_formatter,
server_service_xmlrpc, xmlrpc_formatter,
binary_streamer, server_binary_formatter, binary_formatter,
test_suite_utils, object_serializer;
object_serializer;
function CompareNodes(const A,B : PDataBuffer) : Boolean;overload;forward;
@ -1220,7 +1220,7 @@ begin
end;
procedure TTestFormatterSimpleType.Test_Int_32;
const VAL_1 = 121076; VAL_2 : LongInt = -101276;
const VAL_1 = 3294967295; VAL_2 : LongInt = -101276;
Var
f : IFormatterBase;
s : TMemoryStream;
@ -1254,7 +1254,7 @@ begin
f.Get(TypeInfo(LongInt),x,intVal_S);
f.EndScopeRead();
CheckEquals(VAL_1,intVal_U);
Check( ( VAL_1 = intVal_U ) );
CheckEquals(VAL_2,intVal_S);
Finally
s.Free();
@ -1314,7 +1314,7 @@ begin
end;
procedure TTestFormatterSimpleType.Test_Int_64;
const VAL_1 = 121076; VAL_2 : Int64 = -101276;
const VAL_1 = $FFFFFFFFFF; VAL_2 : Int64 = -$FFFFFFFFF0;
Var
f : IFormatterBase;
s : TMemoryStream;
@ -2074,6 +2074,15 @@ begin
end;
procedure TTestFormatter.Test_Int_WithClass;
const
CONST_Val_8U = $FE;
CONST_Val_8S = -$7F;
CONST_Val_16U = $FFFE;
CONST_Val_16S = -$7FFF;
CONST_Val_32U = $FFFFFFFE;
CONST_Val_32S = -$7FFFFFFF;
CONST_Val_64U = $FFFFFFFFFFFFF;
CONST_Val_64S = -$FFFFFFFFFFFFF;
Var
f : IFormatterBase;
s : TMemoryStream;
@ -2083,14 +2092,14 @@ begin
s := Nil;
a := TClass_Int.Create();
Try
a.Val_8U := 8;
a.Val_8S := -8;
a.Val_16U := 16;
a.Val_16S := -16;
a.Val_32U := 32;
a.Val_32S := -32;
a.Val_64U := 64;
a.Val_64S := -64;
a.Val_8U := CONST_Val_8U;
a.Val_8S := CONST_Val_8S;
a.Val_16U := CONST_Val_16U;
a.Val_16S := CONST_Val_16S;
a.Val_32U := CONST_Val_32U;
a.Val_32S := CONST_Val_32S;
a.Val_64U := CONST_Val_64U;
a.Val_64S := CONST_Val_64S;
f := CreateFormatter(TypeInfo(TClass_Int));
@ -2112,14 +2121,14 @@ begin
f.Get(TypeInfo(TClass_Int),x,a);
f.EndScopeRead();
CheckEquals(8,a.Val_8U);
CheckEquals(-8,a.Val_8S);
CheckEquals(16,a.Val_16U);
CheckEquals(-16,a.Val_16S);
CheckEquals(32,a.Val_32U);
CheckEquals(-32,a.Val_32S);
CheckEquals(64,a.Val_64U);
CheckEquals(-64,a.Val_64S);
CheckEquals(CONST_Val_8U,a.Val_8U);
CheckEquals(CONST_Val_8S,a.Val_8S);
CheckEquals(CONST_Val_16U,a.Val_16U);
CheckEquals(CONST_Val_16S,a.Val_16S);
CheckEquals(CONST_Val_32U,a.Val_32U);
CheckEquals(CONST_Val_32S,a.Val_32S);
CheckEquals(CONST_Val_64U,a.Val_64U);
CheckEquals(CONST_Val_64S,a.Val_64S);
Finally
a.Free();
s.Free();
@ -2218,7 +2227,7 @@ begin
end;
procedure TTestFormatter.Test_CplxInt64SimpleContent_WithClass;
const VAL_S = -12; VAL_U = 10; VAL_X = 121;
const VAL_S = -$FFFFFFFFFF; VAL_U = $FFFFFFFFFFFF; VAL_X = 121;
VAL_STR_S = 'Test Attribute S'; VAL_STR_U = 'Test Attribute U'; VAL_STR_X = 'test it';
var
f : IFormatterBase;
@ -3424,7 +3433,9 @@ begin
end;
procedure TTestFormatter.Test_Int64SArray();
const AR_LEN = 5; VAL_AR : array[0..(AR_LEN-1)] of Int64 = (-12,-34,100,200,180);
const AR_LEN = 5; VAL_AR : array[0..(AR_LEN-1)] of Int64 =
( -$FFFFFFFFFF,-$FFFF123FFF,$FFFFFFFFFF2,$FFFFFFFFFF2F,$FFFFFFFFFF24
);
var
a : TArrayOfInt64SRemotable;
i : Integer;