IdTestBuffer.pas 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. unit IdTestBuffer;
  2. interface
  3. uses
  4. IdTest,
  5. IdObjs,
  6. IdSys,
  7. IdGlobal,
  8. IdBuffer;
  9. type
  10. TIdTestBuffer = class(TIdTest)
  11. published
  12. procedure TestBufferToStream;
  13. procedure TestStreamToBuffer;
  14. procedure TestTypes;
  15. end;
  16. implementation
  17. const
  18. cString='12345';
  19. procedure TIdTestBuffer.TestBufferToStream;
  20. var
  21. aBuffer:TIdBuffer;
  22. aStream:TIdMemoryStream;
  23. begin
  24. aBuffer:=TIdBuffer.Create;
  25. aStream:=TIdMemoryStream.Create;
  26. try
  27. aBuffer.Write(cString);
  28. aBuffer.SaveToStream(aStream);
  29. aStream.Position := 0;
  30. Assert(ReadStringFromStream(aStream)=cString);
  31. Assert(aBuffer.Size=5);
  32. //extract with index=-1 and >0 to test execution paths
  33. //index>-1 doesn't delete data from buffer
  34. aStream.Size:=0;
  35. aBuffer.ExtractToStream(aStream,2,3);
  36. aStream.Position := 0;
  37. Assert(ReadStringFromStream(aStream)='45');
  38. Assert(aBuffer.Size=5);
  39. //does delete data from buffer
  40. aStream.Size:=0;
  41. aBuffer.ExtractToStream(aStream,3);
  42. aStream.Position := 0;
  43. Assert(ReadStringFromStream(aStream)='123');
  44. Assert(aBuffer.Size=2);
  45. aStream.Size:=0;
  46. aBuffer.ExtractToStream(aStream,2);
  47. aStream.Position := 0;
  48. Assert(ReadStringFromStream(aStream)='45');
  49. Assert(aBuffer.Size=0);
  50. finally
  51. Sys.FreeAndNil(aStream);
  52. Sys.FreeAndNil(aBuffer);
  53. end;
  54. end;
  55. procedure TIdTestBuffer.TestStreamToBuffer;
  56. var
  57. aBuffer:TIdBuffer;
  58. aStream:TIdMemoryStream;
  59. begin
  60. aBuffer:=TIdBuffer.Create;
  61. aStream:=TIdMemoryStream.Create;
  62. try
  63. WriteStringToStream(AStream, cString);
  64. aStream.Position:=0;
  65. //copy specific
  66. aBuffer.Write(aStream,2);
  67. Assert(aStream.Position=2);
  68. Assert(aBuffer.AsString='12');
  69. // aStream.Position := 0;
  70. //copy remaining
  71. aBuffer.Write(aStream,-1);
  72. Assert(aStream.Position=5);
  73. Assert(aBuffer.AsString=cString, aBuffer.AsString);
  74. //copy all. ensure stream position is >0,<size
  75. aBuffer.Clear;
  76. aStream.Position:=2;
  77. aBuffer.Write(aStream);
  78. Assert(aStream.Position=5);
  79. Assert(aBuffer.AsString=cString);
  80. finally
  81. Sys.FreeAndNil(aStream);
  82. Sys.FreeAndNil(aBuffer);
  83. end;
  84. end;
  85. procedure TIdTestBuffer.TestTypes;
  86. var
  87. b:TIdBuffer;
  88. //aInt:Integer;
  89. i64:Int64;
  90. aCardinal:Cardinal;
  91. aWord:Word;
  92. aByte:Byte;
  93. const
  94. //cInteger=2000000000;
  95. cCardinal=4000000000;
  96. cCardinal2=4000000001;
  97. c64=5000000000;
  98. c642=5000000001;
  99. cWord=60000;
  100. cWord2=60001;
  101. cByte=250;
  102. cByte2=255;
  103. begin
  104. b:=TIdBuffer.Create;
  105. try
  106. {
  107. //integer currently gets sent to the int64 overload
  108. aInt:=cInteger;
  109. b.Write(aInt);
  110. aInt:=Integer(b.ExtractToCardinal(0));
  111. Assert(aInt=cInteger);
  112. Assert(b.Size=0);
  113. }
  114. //write 2 different bytes
  115. aByte:=cByte;
  116. b.Write(aByte);
  117. Assert(b.Size=SizeOf(Byte));
  118. aByte:=cByte2;
  119. b.Write(aByte);
  120. Assert(b.Size=2*SizeOf(Byte));
  121. //read the 2nd byte. index>-1 so doesnt actually extract
  122. aByte:=b.ExtractToByte(SizeOf(Byte));
  123. Assert(b.Size=2*SizeOf(Byte));
  124. Assert(aByte=cByte2);
  125. //and extract the data, check expected order (FIFO)
  126. aByte:=b.ExtractToByte(-1);
  127. Assert(aByte=cByte);
  128. Assert(b.Size=SizeOf(Byte));
  129. aByte:=b.ExtractToByte(-1);
  130. Assert(aByte=cByte2);
  131. Assert(b.Size=0);
  132. aCardinal:=cCardinal;
  133. b.Write(aCardinal);
  134. aCardinal:=cCardinal2;
  135. b.Write(aCardinal);
  136. Assert(b.Size=2*SizeOf(Cardinal));
  137. aCardinal:=b.ExtractToCardinal(SizeOf(Cardinal));
  138. Assert(b.Size=2*SizeOf(Cardinal));
  139. Assert(aCardinal=cCardinal2);
  140. aCardinal:=b.ExtractToCardinal(-1);
  141. Assert(aCardinal=cCardinal);
  142. aCardinal:=b.ExtractToCardinal(-1);
  143. Assert(aCardinal=cCardinal2);
  144. Assert(b.Size=0);
  145. i64:=c64;
  146. b.Write(i64);
  147. i64:=c642;
  148. b.Write(i64);
  149. Assert(b.Size=2*SizeOf(Int64));
  150. i64:=b.ExtractToInt64(SizeOf(Int64));
  151. Assert(i64=c642);
  152. Assert(b.Size=2*SizeOf(Int64));
  153. i64:=b.ExtractToInt64(-1);
  154. Assert(i64=c64);
  155. i64:=b.ExtractToInt64(-1);
  156. Assert(i64=c642);
  157. Assert(b.Size=0);
  158. aWord:=cWord;
  159. b.Write(aWord);
  160. aWord:=cWord2;
  161. b.Write(aWord);
  162. Assert(b.Size=2*SizeOf(Word));
  163. aWord:=b.ExtractToWord(SizeOf(Word));
  164. Assert(aWord=cWord2);
  165. Assert(b.Size=2*SizeOf(Word));
  166. aWord:=b.ExtractToWord(-1);
  167. Assert(aWord=cWord);
  168. aWord:=b.ExtractToWord(-1);
  169. Assert(aWord=cWord2);
  170. Assert(b.Size=0);
  171. finally
  172. Sys.FreeAndNil(b);
  173. end;
  174. end;
  175. initialization
  176. TIdTest.RegisterTest(TIdTestBuffer);
  177. end.