utcchainstream.pp 8.4 KB

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