pas2js/test/tcstream.pp
2019-07-12 20:50:50 +00:00

847 lines
17 KiB
ObjectPascal

unit tcstream;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, fpcunit, testregistry;
type
{ TTestStream }
TTestStream= class(TTestCase)
protected
FStream : TStream;
procedure SetUp; override;
procedure TearDown; override;
procedure AssertBytes(B : Array of Byte; aMessage : string = ''; ObserveEndian : Boolean = True); overload;
// procedure AssertBytes(B : TBytes; aMessage : string = '');overload;
Function CreateBytes(aCount : integer) : TBytes;
Property Stream : TStream Read FStream;
published
procedure TestHookUp;
Procedure TestBytes;
Procedure TestBytesLarge;
Procedure TestBytesLargeCopy;
Procedure TestByte;
Procedure TestByteBuffer;
Procedure TestInt8;
Procedure TestInt8Buffer;
Procedure TestUInt8;
Procedure TestUInt8Buffer;
Procedure TestSmallint;
Procedure TestSmallintBuffer;
Procedure TestInt16;
Procedure TestInt16Neg;
Procedure TestInt16Buffer;
Procedure TestUInt16;
Procedure TestUInt16Buffer;
Procedure TestInt32;
Procedure TestInt32Neg;
Procedure TestInt32Buffer;
Procedure TestUInt32;
Procedure TestUInt32Buffer;
Procedure TestInt64;
Procedure TestInt64Neg;
Procedure TestInt64Buffer;
Procedure TestBoolean;
Procedure TestBooleanBuffer;
Procedure TestWideChar;
Procedure TestWideCharBuffer;
Procedure TestDouble;
Procedure TestDoubleBuffer;
{$ifndef ECMASCRIPT}
Procedure TestAnsiChar;
Procedure TestAnsicharBuffer;
Procedure TestSingle;
Procedure TestSingleBuffer;
Procedure TestExtended;
Procedure TestExtendedBuffer;
{$endif}
end;
{ TTestBigendianStream }
TTestBigendianStream= class(TTestStream)
Public
Procedure Setup; override;
end;
{ TTestStringStream }
TTestStringStream = class(TTestCase)
private
FStream: TStringStream;
Public
Procedure TearDown; override;
Procedure DoCreate(S : String);
Property Stream : TStringStream Read FStream;
Published
Procedure TestDataStringEmpty;
Procedure TestDataString;
Procedure TestWrite;
Procedure TestRead;
Procedure TestCopyFrom;
end;
implementation
{ TTestStringStream }
procedure TTestStringStream.TearDown;
begin
FreeAndNil(FStream);
inherited TearDown;
end;
procedure TTestStringStream.DoCreate(S: String);
begin
FreeAndNil(FStream);
FStream:=TStringStream.Create(S);
end;
procedure TTestStringStream.TestDataStringEmpty;
begin
DoCreate('');
AssertEquals('Empty','',Stream.DataString);
end;
procedure TTestStringStream.TestDataString;
begin
DoCreate('ABCD');
AssertEquals('Non-empty','ABCD',Stream.DataString);
end;
procedure TTestStringStream.TestWrite;
begin
DoCreate('');
Stream.WriteBufferData('A');
Stream.WriteBufferData('B');
Stream.WriteBufferData('C');
Stream.WriteBufferData('D');
AssertEquals('Write Contents','ABCD',Stream.DataString);
end;
procedure TTestStringStream.TestRead;
Var
S : String;
C : Char;
I : Integer;
begin
S:='ABCD';
DoCreate(S);
For I:=1 to Length(S) do
begin
Stream.ReadBufferData(C);
AssertEquals(Format('Character at',[i]),S[i],C);
end;
end;
procedure TTestStringStream.TestCopyFrom;
Var
S2 : TStringStream;
begin
DoCreate('ABCD');
S2:=TStringStream.Create('');
try
S2.CopyFrom(Stream,0);
AssertEquals('Copied correctly','ABCD',S2.DataString);
finally
S2.Free;
end;
end;
{ TTestBigendianStream }
procedure TTestBigendianStream.Setup;
begin
inherited Setup;
Stream.Endian:=Tendian.Big;
end;
procedure TTestStream.TestHookUp;
begin
AssertNotNull('Have Stream',Stream);
end;
procedure TTestStream.TestBytes;
Var
B : TBytes;
begin
B:=CreateBytes(4);
Stream.Write(B,4);
AssertBytes(B,'Bytes, ignoring endianness',False);
end;
procedure TTestStream.TestBytesLarge;
Var
B : TBytes;
begin
B:=CreateBytes(8000);
Stream.Write(B,Length(B));
AssertBytes(B,'Bytes, ignoring endianness',False);
end;
procedure TTestStream.TestBytesLargeCopy;
Var
B : TBytes;
S : TStream;
begin
S:=TBytesStream.Create([]);
B:=CreateBytes(8000);
S.Write(B,Length(B));
Stream.CopyFrom(S,0);
S.Free;
AssertBytes(B,'Bytes, ignoring endianness',False);
end;
procedure TTestStream.TestByte;
Var
S,D : Byte;
begin
D:=0;
S:=13;
AssertEquals('Bytes written',1,Stream.WriteData(S));
AssertBytes([S]);
Stream.Position:=0;
AssertEquals('Bytes read',1,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestByteBuffer;
Var
S,D : Byte;
begin
D:=0;
S:=13;
Stream.WriteBufferData(S);
AssertBytes([S]);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestInt8;
Var
S,D : Int8;
begin
D:=0;
S:=-13;
AssertEquals('Bytes written',1,Stream.WriteData(S));
AssertBytes([S]);
Stream.Position:=0;
AssertEquals('Bytes read',1,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestInt8Buffer;
Var
S,D : Int8;
begin
D:=0;
S:=-13;
Stream.WriteBufferData(S);
AssertBytes([S]);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestUInt8;
Var
S,D : UInt8;
begin
D:=0;
S:=139;
AssertEquals('Bytes written',1,Stream.WriteData(S));
AssertBytes([S]);
Stream.Position:=0;
AssertEquals('Bytes read',1,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestUInt8Buffer;
Var
S,D : UInt8;
begin
D:=0;
S:=139;
Stream.WriteBufferData(S);
AssertBytes([S]);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestSmallint;
Var
S,D : SmallInt;
begin
D:=0;
S:=127*256+13;
AssertEquals('Bytes written',2,Stream.WriteData(S));
AssertBytes([13,127]);
Stream.Position:=0;
AssertEquals('Bytes read',2,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestSmallintBuffer;
Var
S,D : SmallInt;
begin
D:=0;
S:=127*256+13;
Stream.WriteBufferData(S);
AssertBytes([13,127]);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestInt16;
Var
S,D : Int16;
begin
D:=0;
S:=127*256+13;
AssertEquals('Bytes written',2,Stream.WriteData(S));
AssertBytes([13,127]);
Stream.Position:=0;
AssertEquals('Bytes read',2,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestInt16Neg;
Var
S,D : Int16;
begin
D:=0;
S:=-4086; // $F00A;
AssertEquals('Bytes written',2,Stream.WriteData(S));
AssertBytes([$0A,$F0]);
Stream.Position:=0;
AssertEquals('Bytes read',2,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestInt16Buffer;
Var
S,D : Int16;
begin
D:=0;
S:=127*256+13;
Stream.WriteBufferData(S);
AssertBytes([13,127]);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestUInt16;
Var
S,D : UInt16;
begin
D:=0;
S:=$F00A; // 61450
AssertEquals('Bytes written',2,Stream.WriteData(S));
AssertBytes([$0A,$F0]);
Stream.Position:=0;
AssertEquals('Bytes read',2,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestUInt16Buffer;
Var
S,D : UInt16;
begin
D:=0;
S:=$F00A;
Stream.WriteBufferData(S);
AssertBytes([$0A,$F0]);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestInt32;
Var
S,D : Int32;
begin
D:=0;
// 2131560201
S:=(127 shl 24) + (13 shl 16) + (7 shl 8) + 9;
AssertEquals('Bytes written',4,Stream.WriteData(S));
AssertBytes([9,7,13,127]);
Stream.Position:=0;
AssertEquals('Bytes read',4,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestInt32Neg;
Var
S,D : Int32;
begin
D:=0;
// -2146629879
S:=Int32((128 shl 24) + (13 shl 16) + (7 shl 8) + 9);
AssertEquals('Bytes written',4,Stream.WriteData(S));
AssertBytes([9,7,13,128]);
Stream.Position:=0;
AssertEquals('Bytes read',4,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestInt32Buffer;
Var
S,D : Int32;
begin
D:=0;
// 2131560201
S:=(127 shl 24) + (13 shl 16) + (7 shl 8) + 9;
Stream.WriteBufferData(S);
AssertBytes([9,7,13,127]);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestUInt32;
Var
S,D : UInt32;
begin
D:=0;
// 2148337417
S:=UINT32((128 shl 24) + (13 shl 16) + (7 shl 8) + 9);
AssertEquals('Bytes written',4,Stream.WriteData(S));
AssertBytes([9,7,13,128]);
Stream.Position:=0;
AssertEquals('Bytes read',4,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestUInt32Buffer;
Var
S,D : UInt32;
begin
D:=0;
// 2148337417
S:=UINT32((128 shl 24) + (13 shl 16) + (7 shl 8) + 9);
Stream.WriteBufferData(S);
AssertBytes([9,7,13,128]);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestInt64;
Var
S,D : {$IFDEF ECMASCRIPT}NativeLargeInt{$else}Int64{$endif};
begin
D:=0;
// 9154981354848060679
// Javascript only has 52 bits : 7737333974279
S:={$IFNDEF ECMASCRIPT} (127 shl 24) + (13 shl 16) {$endif}+ (7 shl 8) + 9;
S:=(S shl 32) + ((125 shl 24) + (11 shl 16) + (5 shl 8) + 7);
AssertEquals('Bytes written',8,Stream.WriteData(S));
{$ifndef ECMASCRIPT}
AssertBytes([7,5,11,125,9,7,{$IFNDEF ECMASCRIPT} 13,127 {$ELSE} 0,0 {$ENDIF}]);
{$ENDIF}
Stream.Position:=0;
AssertEquals('Bytes read',8,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestInt64Neg;
Var
S,D : {$IFDEF ECMASCRIPT}NativeLargeInt{$else}Int64{$endif};
begin
D:=0;
{$IFNDEF ECMASCRIPT}
// -9219705124773231353
S:=Int64((128 shl 24) + (13 shl 16) + (7 shl 8) + 9);
S:=Int64((S shl 32) + ((128 shl 24) + (11 shl 16) + (5 shl 8) + 7));
AssertEquals('Bytes written',8,Stream.WriteData(S));
AssertBytes([7,5,11,128,9,7,13,128]);
Stream.Position:=0;
AssertEquals('Bytes read',8,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
{$ELSE}
S:=-9000199254740991;
AssertEquals('Bytes written',8,Stream.WriteData(S));
Stream.Position:=0;
AssertEquals('Bytes read',8,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
{$ENDIF}
end;
procedure TTestStream.TestInt64Buffer;
Var
S,D : {$IFDEF ECMASCRIPT}NativeLargeInt{$else}Int64{$endif};
begin
D:=0;
// 9154981354848060679
// 7737333974279 for ECMAScript
S:={$IFNDEF ECMASCRIPT} (127 shl 24) + (13 shl 16) {$endif}+ (7 shl 8) + 9;
S:=(S shl 32) + ((125 shl 24) + (11 shl 16) + (5 shl 8) + 7);
Stream.WriteBufferData(S);
{$IFNDEF ECMASCRIPT}
AssertBytes([7,5,11,125,9,7,13,127]);
{$ENDIF}
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestBoolean;
Var
S,D : Boolean;
begin
D:=False;
// 9154981354848060679
S:=True;
AssertEquals('Bytes written',1,Stream.WriteData(S));
AssertBytes([1]);
Stream.Position:=0;
AssertEquals('Bytes read',1,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestBooleanBuffer;
Var
S,D : Boolean;
begin
D:=False;
// 9154981354848060679
S:=True;
Stream.WriteBufferData(S);
AssertBytes([1]);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D);
end;
{$IFNDEF ECMASCRIPT}
procedure TTestStream.TestAnsiChar;
Var
S,D : AnsiChar;
begin
D:=#0;
S:='A';
AssertEquals('Bytes written',1,Stream.WriteData(S));
AssertBytes([Ord(S)]);
Stream.Position:=0;
AssertEquals('Bytes read',1,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D);
end;
procedure TTestStream.TestAnsicharBuffer;
Var
S,D : AnsiChar;
begin
D:=#0;
S:='A';
Stream.WriteBufferData(S);
AssertBytes([Ord(S)]);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D);
end;
{$endif}
procedure TTestStream.TestWideChar;
Var
S,D : WideChar;
begin
D:=#0;
S:='A';
AssertEquals('Bytes written',2,Stream.WriteData(S));
AssertBytes([Ord(S),0]);
Stream.Position:=0;
AssertEquals('Bytes read',2,Stream.ReadData(D));
AssertEquals('Written data read correctly',Ord(S),Ord(D));
end;
procedure TTestStream.TestWideCharBuffer;
Var
S,D : WideChar;
begin
D:=#0;
S:='A';
Stream.WriteBufferData(S);
AssertBytes([Ord(S),0]);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',Ord(S),Ord(D));
end;
{$ifndef ECMASCRIPT}
procedure TTestStream.TestSingle;
Var
S,D : Single;
B : TBytes = Nil;
begin
D:=0;
S:=123.45;
AssertEquals('Bytes written',4,Stream.WriteData(S));
Setlength(B,4);
With TSingleRec(S) do
begin
B[0]:=Bytes[0];
B[1]:=Bytes[1];
B[2]:=Bytes[2];
B[3]:=Bytes[3];
end;
AssertBytes(B);
Stream.Position:=0;
AssertEquals('Bytes read',4,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D,0.0001);
end;
procedure TTestStream.TestSingleBuffer;
Var
S,D : Single;
B : TBytes = Nil;
begin
D:=0;
S:=123.45;
Stream.WriteBufferData(S);
Setlength(B,4);
With TSingleRec(S) do
begin
B[0]:=Bytes[0];
B[1]:=Bytes[1];
B[2]:=Bytes[2];
B[3]:=Bytes[3];
end;
AssertBytes(B);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D,0.0001);
end;
{$endif}
procedure TTestStream.TestDouble;
Var
S,D : Double;
B : TBytes;
{$ifndef ECMASCRIPT}
i : integer;
{$endif}
begin
B:=Default(TBytes);
D:=0;
S:=123.45;
AssertEquals('Bytes written',8,Stream.WriteData(S));
Setlength(B,8);
{$ifndef ECMASCRIPT}
With TDoubleRec(S) do
For I:=0 to 7 do
B[I]:=Bytes[I];
AssertBytes(B);
{$endif}
Stream.Position:=0;
AssertEquals('Bytes read',8,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D,0.0001);
end;
procedure TTestStream.TestDoubleBuffer;
Var
S,D : Double;
B : TBytes;
{$ifndef ECMASCRIPT}
i : integer;
{$endif}
begin
B:=Default(TBytes);
D:=0;
S:=123.45;
Stream.WriteBufferData(S);
Setlength(B,8);
{$ifndef ECMASCRIPT}
With TDoubleRec(S) do
For I:=0 to 7 do
B[I]:=Bytes[I];
AssertBytes(B);
{$endif}
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D,0.0001);
end;
{$ifndef ECMASCRIPT}
procedure TTestStream.TestExtended;
Var
S,D : Extended;
B : TBytes = Nil;
i : integer;
begin
D:=0;
S:=123.45;
AssertEquals('Bytes written',10,Stream.WriteData(S));
Setlength(B,10);
With TExtended80Rec(S) do
For I:=0 to 9 do
B[I]:=Bytes[I];
AssertBytes(B);
Stream.Position:=0;
AssertEquals('Bytes read',10,Stream.ReadData(D));
AssertEquals('Written data read correctly',S,D,0.0001);
end;
procedure TTestStream.TestExtendedBuffer;
Var
S,D : Extended;
B : TBytes = Nil;
i : integer;
begin
D:=0;
S:=123.45;
Stream.WriteBufferData(S);
Setlength(B,10);
With TExtended80Rec(S) do
For I:=0 to 9 do
B[I]:=Bytes[I];
AssertBytes(B);
Stream.Position:=0;
Stream.ReadBufferData(D);
AssertEquals('Written data read correctly',S,D,0.0001);
end;
{$endif}
procedure TTestStream.SetUp;
Var
B : TBytes;
begin
B:=Default(TBytes);
SetLength(B,0);
FStream:=TBytesStream.Create(B);
end;
procedure TTestStream.TearDown;
begin
FreeAndNil(FStream);
end;
procedure TTestStream.AssertBytes(B: array of Byte; aMessage: string = ''; ObserveEndian : Boolean = True);
Var
L,I,E: integer;
A : Byte;
SB : TBytes;
begin
if AMessage<>'' then
aMessage:=aMessage+': ';
AssertEquals(aMessage+'Length bytes equals',Length(B),FStream.Size);
SB:=TBytesStream(Stream).Bytes;
L:=Length(B);
for I:=0 to L-1 do
begin
E:=Byte(B[i] and $FF);
if ObserveEndian and (Stream.Endian=Tendian.Big) then
A:=SB[L-1-i]
else
A:=SB[i];
AssertEquals(aMessage+'Byte['+IntToStr(I)+'] equals',E,A);
end;
end;
{
procedure TTestStream.AssertBytes(B: TBytes; aMessage : string = '');
Var
I : integer;
SB : TBytes;
begin
if AMessage<>'' then
aMessage:=aMessage+': ';
AssertEquals(aMessage+'Length bytes equals',Length(B),FStream.Size);
SB:=TBytesStream(Stream).Bytes;
for I:=0 to Length(B)-1 do
AssertEquals(aMessage+'Byte['+IntToStr(I)+'] equals',B[i],SB[i]);
end;
}
function TTestStream.CreateBytes(aCount: integer): TBytes;
Var
I : Integer;
begin
Result:=Nil;
SetLength(Result,aCount);
For I:=0 to aCount-1 do
Result[I]:=I+1;
end;
initialization
// RegisterTests([TTestStream,TTestBigendianStream,TTestStringStream]);
end.