utcchainstream.pp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. unit utcchainstream;
  2. {$mode ObjFPC}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testregistry, chainstream;
  6. Type
  7. { TTestChainStream }
  8. TTestChainStream = Class (TTestCase)
  9. private
  10. FStreams : Array of TStream;
  11. FStream: TChainedStream;
  12. procedure ClearStreams;
  13. Public
  14. Function CreateStream(aOffset,aCount : Word) : TStream;
  15. Procedure CreateChainedStream(Sizes : Array of Word; aOffset : Word = 0);
  16. Procedure Setup; override;
  17. Procedure TearDown; override;
  18. Property Stream : TChainedStream Read FStream;
  19. Published
  20. Procedure TestEmpty;
  21. Procedure TestCreateStream;
  22. Procedure TestCreateStreams;
  23. Procedure TestCreateStreams2;
  24. Procedure TestOneStreamRead;
  25. Procedure TestTwoStreamsRead;
  26. Procedure TestTwoStreamsReadCrossBuffer;
  27. Procedure TestTwoStreamsWrite;
  28. Procedure TestTwoStreamsWriteCrossBuffer;
  29. Procedure TestStreamsSeekFromEnd1;
  30. Procedure TestStreamsSeekFromEnd2;
  31. Procedure TestStreamsSeekFromBeginning1;
  32. Procedure TestStreamsSeekFromBeginning2;
  33. Procedure TestStreamsSeekFromCurrent1;
  34. Procedure TestStreamsSeekFromCurrent2;
  35. end;
  36. implementation
  37. { TTestChainStream }
  38. function TTestChainStream.CreateStream(aOffset, aCount: Word): TStream;
  39. Var
  40. I : integer;
  41. begin
  42. Result:=TMemoryStream.Create;
  43. For I:=0 to aCount-1 do
  44. begin
  45. Result.WriteBuffer(aOffset,SizeOf(Word));
  46. Inc(aOffset);
  47. end;
  48. Result.Position:=0;
  49. end;
  50. procedure TTestChainStream.CreateChainedStream(Sizes: array of Word; aOffset : Word = 0);
  51. Var
  52. I : integer;
  53. aSize : Word;
  54. begin
  55. ClearStreams;
  56. SetLength(FStreams,Length(Sizes));
  57. For I:=0 to Length(FStreams)-1 do
  58. begin
  59. aSize:=Sizes[i];
  60. FStreams[i]:=CreateStream(aOffset,aSize);
  61. Inc(aOffset,aSize);
  62. end;
  63. FStream:=TChainedStream.Create(FStreams,False);
  64. end;
  65. procedure TTestChainStream.Setup;
  66. begin
  67. inherited Setup;
  68. end;
  69. procedure TTestChainStream.ClearStreams;
  70. var
  71. I : Integer;
  72. begin
  73. if Assigned(FStream) then
  74. begin
  75. if FStream.OwnsStreams then
  76. FStreams:=[];
  77. FStream.Free;
  78. end;
  79. For I:=0 to Length(FStreams)-1 do
  80. FStreams[i].Free;
  81. end;
  82. procedure TTestChainStream.TearDown;
  83. begin
  84. ClearStreams;
  85. inherited TearDown;
  86. end;
  87. procedure TTestChainStream.TestEmpty;
  88. begin
  89. AssertNull('No stream',FStream);
  90. AssertEquals('No streams',0,Length(FStreams));
  91. end;
  92. procedure TTestChainStream.TestCreateStream;
  93. var
  94. S : TStream;
  95. I,W : Word;
  96. begin
  97. S:=CreateStream(10,3);
  98. try
  99. AssertEquals('Stream position',0,S.Position);
  100. AssertEquals('Stream size',6,S.Size);
  101. For I:=10 to 12 do
  102. begin
  103. S.ReadBuffer(W,SizeOf(Word));
  104. AssertEquals('Correct byte read',I,W);
  105. end;
  106. finally
  107. S.Free;
  108. end;
  109. end;
  110. procedure TTestChainStream.TestCreateStreams;
  111. begin
  112. CreateChainedStream([10]);
  113. AssertEquals('Correct stream count',1,Length(FStreams));
  114. AssertEquals('Count',1,Stream.StreamCount);
  115. AssertSame('Stream',FStreams[0],Stream.Streams[0]);
  116. AssertEquals('Total size',20,Stream.Size);
  117. end;
  118. procedure TTestChainStream.TestCreateStreams2;
  119. begin
  120. CreateChainedStream([10,10]);
  121. AssertEquals('Correct stream count',2,Length(FStreams));
  122. AssertEquals('Count',2,Stream.StreamCount);
  123. AssertSame('Stream 0',FStreams[0],Stream.Streams[0]);
  124. AssertSame('Stream 1',FStreams[1],Stream.Streams[1]);
  125. AssertEquals('Total size',40,Stream.Size);
  126. end;
  127. procedure TTestChainStream.TestOneStreamRead;
  128. Var
  129. I : Integer;
  130. W : Word;
  131. begin
  132. CreateChainedStream([10]);
  133. For I:=0 to 9 do
  134. begin
  135. Stream.ReadBuffer(W,SizeOf(W));
  136. AssertEquals('Correct bytes read',I,W)
  137. end;
  138. end;
  139. procedure TTestChainStream.TestTwoStreamsRead;
  140. Var
  141. I : Integer;
  142. W : Word;
  143. begin
  144. CreateChainedStream([10,10]);
  145. For I:=0 to 19 do
  146. begin
  147. Stream.ReadBuffer(W,SizeOf(W));
  148. AssertEquals('Correct bytes read',I,W)
  149. end;
  150. end;
  151. procedure TTestChainStream.TestTwoStreamsReadCrossBuffer;
  152. Var
  153. I : Integer;
  154. W : Array of Word;
  155. begin
  156. SetLength(W,20);
  157. CreateChainedStream([10,10]);
  158. Stream.ReadBuffer(W[0],Length(W)*SizeOf(Word));
  159. For I:=0 to 19 do
  160. begin
  161. AssertEquals('Correct bytes read',I,W[i])
  162. end;
  163. end;
  164. procedure TTestChainStream.TestTwoStreamsWrite;
  165. Var
  166. I : Integer;
  167. W : Word;
  168. begin
  169. CreateChainedStream([10,10]);
  170. For I:=100 to 119 do
  171. begin
  172. W:=I;
  173. Stream.WriteBuffer(W,SizeOf(W));
  174. end;
  175. Stream.Position:=0;
  176. For I:=100 to 119 do
  177. begin
  178. Stream.ReadBuffer(W,SizeOf(W));
  179. AssertEquals('Correct bytes read',I,W)
  180. end;
  181. end;
  182. procedure TTestChainStream.TestTwoStreamsWriteCrossBuffer;
  183. Var
  184. I : Integer;
  185. W : Array of Word;
  186. WW : Word;
  187. begin
  188. SetLength(W,20);
  189. For I:=0 to 19 do
  190. W[i]:=I;
  191. CreateChainedStream([10,10]);
  192. Stream.WriteBuffer(W[0],Length(W)*SizeOf(Word));
  193. FStreams[0].Position:=0;
  194. For I:=0 to 9 do
  195. begin
  196. FStreams[0].ReadBuffer(WW,SizeOf(WW));
  197. AssertEquals('Correct bytes read',I,WW)
  198. end;
  199. FStreams[1].Position:=0;
  200. For I:=10 to 19 do
  201. begin
  202. FStreams[1].ReadBuffer(WW,SizeOf(WW));
  203. AssertEquals('Correct bytes read',I,WW)
  204. end;
  205. end;
  206. procedure TTestChainStream.TestStreamsSeekFromEnd1;
  207. Var
  208. W : Word;
  209. begin
  210. CreateChainedStream([10,10]);
  211. AssertEquals('Seek',38,Stream.Seek(-2,soEnd));
  212. Stream.ReadBuffer(W,SizeOf(Word));
  213. AssertEquals('Correct read',19,W);
  214. AssertEquals('Seek 2',20,Stream.Seek(-20,soEnd));
  215. Stream.ReadBuffer(W,SizeOf(Word));
  216. AssertEquals('Correct read 2',10,W);
  217. AssertEquals('Seek 3',18,Stream.Seek(-22,soEnd));
  218. Stream.ReadBuffer(W,SizeOf(Word));
  219. AssertEquals('Correct read 2',9,W);
  220. end;
  221. procedure TTestChainStream.TestStreamsSeekFromEnd2;
  222. Var
  223. W : Word;
  224. begin
  225. CreateChainedStream([10,10,10]);
  226. AssertEquals('Seek',0,Stream.Seek(-60,soEnd));
  227. Stream.ReadBuffer(W,SizeOf(Word));
  228. AssertEquals('Correct read ',0,W);
  229. AssertEquals('Seek',30,Stream.Seek(-30,soEnd));
  230. Stream.ReadBuffer(W,SizeOf(Word));
  231. AssertEquals('Correct read ',15,W);
  232. end;
  233. procedure TTestChainStream.TestStreamsSeekFromBeginning1;
  234. Var
  235. W : Word;
  236. begin
  237. CreateChainedStream([10,10]);
  238. AssertEquals('Seek',38,Stream.Seek(38,soBeginning));
  239. Stream.ReadBuffer(W,SizeOf(Word));
  240. AssertEquals('Correct read',19,W);
  241. AssertEquals('Seek 2',20,Stream.Seek(20,soBeginning));
  242. Stream.ReadBuffer(W,SizeOf(Word));
  243. AssertEquals('Correct read 2',10,W);
  244. AssertEquals('Seek 3',18,Stream.Seek(18,soBeginning));
  245. Stream.ReadBuffer(W,SizeOf(Word));
  246. AssertEquals('Correct read 2',9,W);
  247. end;
  248. procedure TTestChainStream.TestStreamsSeekFromBeginning2;
  249. Var
  250. W : Word;
  251. begin
  252. CreateChainedStream([10,10,10]);
  253. AssertEquals('Seek',0,Stream.Seek(0,soBeginning));
  254. Stream.ReadBuffer(W,SizeOf(Word));
  255. AssertEquals('Correct read ',0,W);
  256. AssertEquals('Seek',30,Stream.Seek(30,soBeginning));
  257. Stream.ReadBuffer(W,SizeOf(Word));
  258. AssertEquals('Correct read ',15,W);
  259. AssertEquals('Seek',50,Stream.Seek(50,soBeginning));
  260. Stream.ReadBuffer(W,SizeOf(Word));
  261. AssertEquals('Correct read ',25,W);
  262. end;
  263. procedure TTestChainStream.TestStreamsSeekFromCurrent1;
  264. Var
  265. W : Word;
  266. begin
  267. CreateChainedStream([10,10]);
  268. AssertEquals('Seek',4,Stream.Seek(4,soCurrent));
  269. Stream.ReadBuffer(W,SizeOf(Word));
  270. AssertEquals('Correct read 1',2,W);
  271. AssertEquals('Position after read 1',6,Stream.Position);
  272. AssertEquals('Seek 2',26,Stream.Seek(20,soCurrent));
  273. Stream.ReadBuffer(W,SizeOf(Word));
  274. AssertEquals('Correct read 2',13,W);
  275. AssertEquals('Position after read 2',28,Stream.Position);
  276. AssertEquals('Seek 3',32,Stream.Seek(4,soCurrent));
  277. Stream.ReadBuffer(W,SizeOf(Word));
  278. AssertEquals('Correct read 3',16,W);
  279. AssertEquals('Position after read 2',34,Stream.Position);
  280. end;
  281. procedure TTestChainStream.TestStreamsSeekFromCurrent2;
  282. Var
  283. W : Word;
  284. I : Integer;
  285. begin
  286. CreateChainedStream([10,10]);
  287. For I:=1 to 15 do
  288. Stream.ReadBuffer(W,SizeOf(Word));
  289. AssertEquals('Position after reading data',30,Stream.Position);
  290. AssertEquals('Seek',26,Stream.Seek(-4,soCurrent));
  291. Stream.ReadBuffer(W,SizeOf(Word));
  292. AssertEquals('Correct read 1',13,W);
  293. AssertEquals('Position after read 1',28,Stream.Position);
  294. AssertEquals('Seek 2',8,Stream.Seek(-20,soCurrent));
  295. Stream.ReadBuffer(W,SizeOf(Word));
  296. AssertEquals('Correct read 2',4,W);
  297. AssertEquals('Position after read 2',10,Stream.Position);
  298. AssertEquals('Seek 3',6,Stream.Seek(-4,soCurrent));
  299. Stream.ReadBuffer(W,SizeOf(Word));
  300. AssertEquals('Correct read 3',3,W);
  301. AssertEquals('Position after read 2',8,Stream.Position);
  302. end;
  303. initialization
  304. RegisterTest(TTestChainStream);
  305. end.