tcstream.pp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890
  1. { TStream classes tests.
  2. Copyright (C) 2020 Michael Van Canneyt [email protected]
  3. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public
  4. License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version
  5. with the following modification:
  6. As a special exception, the copyright holders of this library give you permission to link this library with independent modules
  7. to produce an executable, regardless of the license terms of these independent modules,and to copy and distribute the resulting
  8. executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions
  9. of the license of that module. An independent module is a module which is not derived from or based on this library. If you
  10. modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do
  11. not wish to do so, delete this exception statement from your version.
  12. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details.
  14. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free
  15. Software Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA.
  16. }
  17. unit tcstream;
  18. {$mode objfpc}{$H+}
  19. interface
  20. uses
  21. Classes, SysUtils, fpcunit, testregistry;
  22. type
  23. { TTestStream }
  24. TTestStream= class(TTestCase)
  25. protected
  26. FStream : TStream;
  27. procedure SetUp; override;
  28. procedure TearDown; override;
  29. procedure AssertBytes(B : Array of Byte; aMessage : string = ''; ObserveEndian : Boolean = True); overload;
  30. // procedure AssertBytes(B : TBytes; aMessage : string = '');overload;
  31. Function CreateBytes(aCount : integer) : TBytes;
  32. Property Stream : TStream Read FStream;
  33. published
  34. procedure TestHookUp;
  35. Procedure TestBytes;
  36. Procedure TestBytesLarge;
  37. Procedure TestBytesLargeCopy;
  38. Procedure TestByte;
  39. Procedure TestByteBuffer;
  40. Procedure TestInt8;
  41. Procedure TestInt8Buffer;
  42. Procedure TestUInt8;
  43. Procedure TestUInt8Buffer;
  44. Procedure TestSmallint;
  45. Procedure TestSmallintBuffer;
  46. Procedure TestInt16;
  47. Procedure TestInt16Neg;
  48. Procedure TestInt16Buffer;
  49. Procedure TestUInt16;
  50. Procedure TestUInt16Buffer;
  51. Procedure TestInt32;
  52. Procedure TestInt32Neg;
  53. Procedure TestInt32Buffer;
  54. Procedure TestUInt32;
  55. Procedure TestUInt32Buffer;
  56. Procedure TestInt64;
  57. Procedure TestInt64Neg;
  58. Procedure TestInt64Buffer;
  59. Procedure TestBoolean;
  60. Procedure TestBooleanBuffer;
  61. Procedure TestWideChar;
  62. Procedure TestWideCharBuffer;
  63. Procedure TestDouble;
  64. Procedure TestDoubleBuffer;
  65. {$ifndef ECMASCRIPT}
  66. Procedure TestAnsiChar;
  67. Procedure TestAnsicharBuffer;
  68. Procedure TestSingle;
  69. Procedure TestSingleBuffer;
  70. Procedure TestExtended;
  71. Procedure TestExtendedBuffer;
  72. {$endif}
  73. end;
  74. { TTestBigendianStream }
  75. TTestBigendianStream= class(TTestStream)
  76. Public
  77. Procedure Setup; override;
  78. end;
  79. { TTestStringStream }
  80. TTestStringStream = class(TTestCase)
  81. private
  82. FStream: TStringStream;
  83. Public
  84. Procedure TearDown; override;
  85. Procedure DoCreate(S : String);
  86. Property Stream : TStringStream Read FStream;
  87. Published
  88. Procedure TestDataStringEmpty;
  89. Procedure TestDataString;
  90. Procedure TestWrite;
  91. Procedure TestRead;
  92. Procedure TestReadString;
  93. Procedure TestWriteString;
  94. Procedure TestCopyFrom;
  95. end;
  96. implementation
  97. { TTestStringStream }
  98. procedure TTestStringStream.TearDown;
  99. begin
  100. FreeAndNil(FStream);
  101. inherited TearDown;
  102. end;
  103. procedure TTestStringStream.DoCreate(S: String);
  104. begin
  105. FreeAndNil(FStream);
  106. FStream:=TStringStream.Create(S);
  107. end;
  108. procedure TTestStringStream.TestDataStringEmpty;
  109. begin
  110. DoCreate('');
  111. AssertEquals('Empty','',Stream.DataString);
  112. end;
  113. procedure TTestStringStream.TestDataString;
  114. begin
  115. DoCreate('ABCD');
  116. AssertEquals('Non-empty','ABCD',Stream.DataString);
  117. end;
  118. procedure TTestStringStream.TestWrite;
  119. begin
  120. DoCreate('');
  121. Stream.WriteBufferData('A');
  122. Stream.WriteBufferData('B');
  123. Stream.WriteBufferData('C');
  124. Stream.WriteBufferData('D');
  125. AssertEquals('Write Contents','ABCD',Stream.DataString);
  126. end;
  127. procedure TTestStringStream.TestRead;
  128. Var
  129. S : String;
  130. C : Char;
  131. I : Integer;
  132. begin
  133. S:='ABCD';
  134. DoCreate(S);
  135. For I:=1 to Length(S) do
  136. begin
  137. Stream.ReadBufferData(C);
  138. AssertEquals(Format('Character at',[i]),S[i],C);
  139. end;
  140. end;
  141. procedure TTestStringStream.TestReadString;
  142. Var
  143. S : String;
  144. begin
  145. S:='ABCDEFGH';
  146. DoCreate(S);
  147. AssertEquals('2 characters','AB',Stream.ReadString(4));
  148. AssertEquals('Top off characters','CDEFGH',Stream.ReadString(22));
  149. end;
  150. procedure TTestStringStream.TestWriteString;
  151. begin
  152. DoCreate('');
  153. Stream.WriteString('AB');
  154. AssertEquals('Length 1',4,Stream.Size);
  155. AssertEquals('Datastring 1','AB',Stream.DataString);
  156. Stream.WriteString('CDEFGH');
  157. AssertEquals('Length 2',16,Stream.Size);
  158. AssertEquals('Datastring 2','ABCDEFGH',Stream.DataString);
  159. end;
  160. procedure TTestStringStream.TestCopyFrom;
  161. Var
  162. S2 : TStringStream;
  163. begin
  164. DoCreate('ABCD');
  165. S2:=TStringStream.Create('');
  166. try
  167. S2.CopyFrom(Stream,0);
  168. AssertEquals('Copied correctly','ABCD',S2.DataString);
  169. finally
  170. S2.Free;
  171. end;
  172. end;
  173. { TTestBigendianStream }
  174. procedure TTestBigendianStream.Setup;
  175. begin
  176. inherited Setup;
  177. Stream.Endian:=Tendian.Big;
  178. end;
  179. procedure TTestStream.TestHookUp;
  180. begin
  181. AssertNotNull('Have Stream',Stream);
  182. end;
  183. procedure TTestStream.TestBytes;
  184. Var
  185. B : TBytes;
  186. begin
  187. B:=CreateBytes(4);
  188. Stream.Write(B,4);
  189. AssertBytes(B,'Bytes, ignoring endianness',False);
  190. end;
  191. procedure TTestStream.TestBytesLarge;
  192. Var
  193. B : TBytes;
  194. begin
  195. B:=CreateBytes(8000);
  196. Stream.Write(B,Length(B));
  197. AssertBytes(B,'Bytes, ignoring endianness',False);
  198. end;
  199. procedure TTestStream.TestBytesLargeCopy;
  200. Var
  201. B : TBytes;
  202. S : TStream;
  203. begin
  204. S:=TBytesStream.Create([]);
  205. B:=CreateBytes(8000);
  206. S.Write(B,Length(B));
  207. Stream.CopyFrom(S,0);
  208. S.Free;
  209. AssertBytes(B,'Bytes, ignoring endianness',False);
  210. end;
  211. procedure TTestStream.TestByte;
  212. Var
  213. S,D : Byte;
  214. begin
  215. D:=0;
  216. S:=13;
  217. AssertEquals('Bytes written',1,Stream.WriteData(S));
  218. AssertBytes([S]);
  219. Stream.Position:=0;
  220. AssertEquals('Bytes read',1,Stream.ReadData(D));
  221. AssertEquals('Written data read correctly',S,D);
  222. end;
  223. procedure TTestStream.TestByteBuffer;
  224. Var
  225. S,D : Byte;
  226. begin
  227. D:=0;
  228. S:=13;
  229. Stream.WriteBufferData(S);
  230. AssertBytes([S]);
  231. Stream.Position:=0;
  232. Stream.ReadBufferData(D);
  233. AssertEquals('Written data read correctly',S,D);
  234. end;
  235. procedure TTestStream.TestInt8;
  236. Var
  237. S,D : Int8;
  238. begin
  239. D:=0;
  240. S:=-13;
  241. AssertEquals('Bytes written',1,Stream.WriteData(S));
  242. AssertBytes([S]);
  243. Stream.Position:=0;
  244. AssertEquals('Bytes read',1,Stream.ReadData(D));
  245. AssertEquals('Written data read correctly',S,D);
  246. end;
  247. procedure TTestStream.TestInt8Buffer;
  248. Var
  249. S,D : Int8;
  250. begin
  251. D:=0;
  252. S:=-13;
  253. Stream.WriteBufferData(S);
  254. AssertBytes([S]);
  255. Stream.Position:=0;
  256. Stream.ReadBufferData(D);
  257. AssertEquals('Written data read correctly',S,D);
  258. end;
  259. procedure TTestStream.TestUInt8;
  260. Var
  261. S,D : UInt8;
  262. begin
  263. D:=0;
  264. S:=139;
  265. AssertEquals('Bytes written',1,Stream.WriteData(S));
  266. AssertBytes([S]);
  267. Stream.Position:=0;
  268. AssertEquals('Bytes read',1,Stream.ReadData(D));
  269. AssertEquals('Written data read correctly',S,D);
  270. end;
  271. procedure TTestStream.TestUInt8Buffer;
  272. Var
  273. S,D : UInt8;
  274. begin
  275. D:=0;
  276. S:=139;
  277. Stream.WriteBufferData(S);
  278. AssertBytes([S]);
  279. Stream.Position:=0;
  280. Stream.ReadBufferData(D);
  281. AssertEquals('Written data read correctly',S,D);
  282. end;
  283. procedure TTestStream.TestSmallint;
  284. Var
  285. S,D : SmallInt;
  286. begin
  287. D:=0;
  288. S:=127*256+13;
  289. AssertEquals('Bytes written',2,Stream.WriteData(S));
  290. AssertBytes([13,127]);
  291. Stream.Position:=0;
  292. AssertEquals('Bytes read',2,Stream.ReadData(D));
  293. AssertEquals('Written data read correctly',S,D);
  294. end;
  295. procedure TTestStream.TestSmallintBuffer;
  296. Var
  297. S,D : SmallInt;
  298. begin
  299. D:=0;
  300. S:=127*256+13;
  301. Stream.WriteBufferData(S);
  302. AssertBytes([13,127]);
  303. Stream.Position:=0;
  304. Stream.ReadBufferData(D);
  305. AssertEquals('Written data read correctly',S,D);
  306. end;
  307. procedure TTestStream.TestInt16;
  308. Var
  309. S,D : Int16;
  310. begin
  311. D:=0;
  312. S:=127*256+13;
  313. AssertEquals('Bytes written',2,Stream.WriteData(S));
  314. AssertBytes([13,127]);
  315. Stream.Position:=0;
  316. AssertEquals('Bytes read',2,Stream.ReadData(D));
  317. AssertEquals('Written data read correctly',S,D);
  318. end;
  319. procedure TTestStream.TestInt16Neg;
  320. Var
  321. S,D : Int16;
  322. begin
  323. D:=0;
  324. S:=-4086; // $F00A;
  325. AssertEquals('Bytes written',2,Stream.WriteData(S));
  326. AssertBytes([$0A,$F0]);
  327. Stream.Position:=0;
  328. AssertEquals('Bytes read',2,Stream.ReadData(D));
  329. AssertEquals('Written data read correctly',S,D);
  330. end;
  331. procedure TTestStream.TestInt16Buffer;
  332. Var
  333. S,D : Int16;
  334. begin
  335. D:=0;
  336. S:=127*256+13;
  337. Stream.WriteBufferData(S);
  338. AssertBytes([13,127]);
  339. Stream.Position:=0;
  340. Stream.ReadBufferData(D);
  341. AssertEquals('Written data read correctly',S,D);
  342. end;
  343. procedure TTestStream.TestUInt16;
  344. Var
  345. S,D : UInt16;
  346. begin
  347. D:=0;
  348. S:=$F00A; // 61450
  349. AssertEquals('Bytes written',2,Stream.WriteData(S));
  350. AssertBytes([$0A,$F0]);
  351. Stream.Position:=0;
  352. AssertEquals('Bytes read',2,Stream.ReadData(D));
  353. AssertEquals('Written data read correctly',S,D);
  354. end;
  355. procedure TTestStream.TestUInt16Buffer;
  356. Var
  357. S,D : UInt16;
  358. begin
  359. D:=0;
  360. S:=$F00A;
  361. Stream.WriteBufferData(S);
  362. AssertBytes([$0A,$F0]);
  363. Stream.Position:=0;
  364. Stream.ReadBufferData(D);
  365. AssertEquals('Written data read correctly',S,D);
  366. end;
  367. procedure TTestStream.TestInt32;
  368. Var
  369. S,D : Int32;
  370. begin
  371. D:=0;
  372. // 2131560201
  373. S:=(127 shl 24) + (13 shl 16) + (7 shl 8) + 9;
  374. AssertEquals('Bytes written',4,Stream.WriteData(S));
  375. AssertBytes([9,7,13,127]);
  376. Stream.Position:=0;
  377. AssertEquals('Bytes read',4,Stream.ReadData(D));
  378. AssertEquals('Written data read correctly',S,D);
  379. end;
  380. procedure TTestStream.TestInt32Neg;
  381. Var
  382. S,D : Int32;
  383. begin
  384. D:=0;
  385. // -2146629879
  386. S:=Int32((128 shl 24) + (13 shl 16) + (7 shl 8) + 9);
  387. AssertEquals('Bytes written',4,Stream.WriteData(S));
  388. AssertBytes([9,7,13,128]);
  389. Stream.Position:=0;
  390. AssertEquals('Bytes read',4,Stream.ReadData(D));
  391. AssertEquals('Written data read correctly',S,D);
  392. end;
  393. procedure TTestStream.TestInt32Buffer;
  394. Var
  395. S,D : Int32;
  396. begin
  397. D:=0;
  398. // 2131560201
  399. S:=(127 shl 24) + (13 shl 16) + (7 shl 8) + 9;
  400. Stream.WriteBufferData(S);
  401. AssertBytes([9,7,13,127]);
  402. Stream.Position:=0;
  403. Stream.ReadBufferData(D);
  404. AssertEquals('Written data read correctly',S,D);
  405. end;
  406. procedure TTestStream.TestUInt32;
  407. Var
  408. S,D : UInt32;
  409. begin
  410. D:=0;
  411. // 2148337417
  412. S:=UINT32((128 shl 24) + (13 shl 16) + (7 shl 8) + 9);
  413. AssertEquals('Bytes written',4,Stream.WriteData(S));
  414. AssertBytes([9,7,13,128]);
  415. Stream.Position:=0;
  416. AssertEquals('Bytes read',4,Stream.ReadData(D));
  417. AssertEquals('Written data read correctly',S,D);
  418. end;
  419. procedure TTestStream.TestUInt32Buffer;
  420. Var
  421. S,D : UInt32;
  422. begin
  423. D:=0;
  424. // 2148337417
  425. S:=UINT32((128 shl 24) + (13 shl 16) + (7 shl 8) + 9);
  426. Stream.WriteBufferData(S);
  427. AssertBytes([9,7,13,128]);
  428. Stream.Position:=0;
  429. Stream.ReadBufferData(D);
  430. AssertEquals('Written data read correctly',S,D);
  431. end;
  432. procedure TTestStream.TestInt64;
  433. Var
  434. S,D : {$IFDEF ECMASCRIPT}NativeLargeInt{$else}Int64{$endif};
  435. begin
  436. D:=0;
  437. // 9154981354848060679
  438. // Javascript only has 52 bits : 7737333974279
  439. S:={$IFNDEF ECMASCRIPT} (127 shl 24) + (13 shl 16) {$endif}+ (7 shl 8) + 9;
  440. S:=(S shl 32) + ((125 shl 24) + (11 shl 16) + (5 shl 8) + 7);
  441. AssertEquals('Bytes written',8,Stream.WriteData(S));
  442. {$ifndef ECMASCRIPT}
  443. AssertBytes([7,5,11,125,9,7,{$IFNDEF ECMASCRIPT} 13,127 {$ELSE} 0,0 {$ENDIF}]);
  444. {$ENDIF}
  445. Stream.Position:=0;
  446. AssertEquals('Bytes read',8,Stream.ReadData(D));
  447. AssertEquals('Written data read correctly',S,D);
  448. end;
  449. procedure TTestStream.TestInt64Neg;
  450. Var
  451. S,D : {$IFDEF ECMASCRIPT}NativeLargeInt{$else}Int64{$endif};
  452. begin
  453. D:=0;
  454. {$IFNDEF ECMASCRIPT}
  455. // -9219705124773231353
  456. S:=Int64((128 shl 24) + (13 shl 16) + (7 shl 8) + 9);
  457. S:=Int64((S shl 32) + ((128 shl 24) + (11 shl 16) + (5 shl 8) + 7));
  458. AssertEquals('Bytes written',8,Stream.WriteData(S));
  459. AssertBytes([7,5,11,128,9,7,13,128]);
  460. Stream.Position:=0;
  461. AssertEquals('Bytes read',8,Stream.ReadData(D));
  462. AssertEquals('Written data read correctly',S,D);
  463. {$ELSE}
  464. S:=-9000199254740991;
  465. AssertEquals('Bytes written',8,Stream.WriteData(S));
  466. Stream.Position:=0;
  467. AssertEquals('Bytes read',8,Stream.ReadData(D));
  468. AssertEquals('Written data read correctly',S,D);
  469. {$ENDIF}
  470. end;
  471. procedure TTestStream.TestInt64Buffer;
  472. Var
  473. S,D : {$IFDEF ECMASCRIPT}NativeLargeInt{$else}Int64{$endif};
  474. begin
  475. D:=0;
  476. // 9154981354848060679
  477. // 7737333974279 for ECMAScript
  478. S:={$IFNDEF ECMASCRIPT} (127 shl 24) + (13 shl 16) {$endif}+ (7 shl 8) + 9;
  479. S:=(S shl 32) + ((125 shl 24) + (11 shl 16) + (5 shl 8) + 7);
  480. Stream.WriteBufferData(S);
  481. {$IFNDEF ECMASCRIPT}
  482. AssertBytes([7,5,11,125,9,7,13,127]);
  483. {$ENDIF}
  484. Stream.Position:=0;
  485. Stream.ReadBufferData(D);
  486. AssertEquals('Written data read correctly',S,D);
  487. end;
  488. procedure TTestStream.TestBoolean;
  489. Var
  490. S,D : Boolean;
  491. begin
  492. D:=False;
  493. // 9154981354848060679
  494. S:=True;
  495. AssertEquals('Bytes written',1,Stream.WriteData(S));
  496. AssertBytes([1]);
  497. Stream.Position:=0;
  498. AssertEquals('Bytes read',1,Stream.ReadData(D));
  499. AssertEquals('Written data read correctly',S,D);
  500. end;
  501. procedure TTestStream.TestBooleanBuffer;
  502. Var
  503. S,D : Boolean;
  504. begin
  505. D:=False;
  506. // 9154981354848060679
  507. S:=True;
  508. Stream.WriteBufferData(S);
  509. AssertBytes([1]);
  510. Stream.Position:=0;
  511. Stream.ReadBufferData(D);
  512. AssertEquals('Written data read correctly',S,D);
  513. end;
  514. {$IFNDEF ECMASCRIPT}
  515. procedure TTestStream.TestAnsiChar;
  516. Var
  517. S,D : AnsiChar;
  518. begin
  519. D:=#0;
  520. S:='A';
  521. AssertEquals('Bytes written',1,Stream.WriteData(S));
  522. AssertBytes([Ord(S)]);
  523. Stream.Position:=0;
  524. AssertEquals('Bytes read',1,Stream.ReadData(D));
  525. AssertEquals('Written data read correctly',S,D);
  526. end;
  527. procedure TTestStream.TestAnsicharBuffer;
  528. Var
  529. S,D : AnsiChar;
  530. begin
  531. D:=#0;
  532. S:='A';
  533. Stream.WriteBufferData(S);
  534. AssertBytes([Ord(S)]);
  535. Stream.Position:=0;
  536. Stream.ReadBufferData(D);
  537. AssertEquals('Written data read correctly',S,D);
  538. end;
  539. {$endif}
  540. procedure TTestStream.TestWideChar;
  541. Var
  542. S,D : WideChar;
  543. begin
  544. D:=#0;
  545. S:='A';
  546. AssertEquals('Bytes written',2,Stream.WriteData(S));
  547. AssertBytes([Ord(S),0]);
  548. Stream.Position:=0;
  549. AssertEquals('Bytes read',2,Stream.ReadData(D));
  550. AssertEquals('Written data read correctly',Ord(S),Ord(D));
  551. end;
  552. procedure TTestStream.TestWideCharBuffer;
  553. Var
  554. S,D : WideChar;
  555. begin
  556. D:=#0;
  557. S:='A';
  558. Stream.WriteBufferData(S);
  559. AssertBytes([Ord(S),0]);
  560. Stream.Position:=0;
  561. Stream.ReadBufferData(D);
  562. AssertEquals('Written data read correctly',Ord(S),Ord(D));
  563. end;
  564. {$ifndef ECMASCRIPT}
  565. procedure TTestStream.TestSingle;
  566. Var
  567. S,D : Single;
  568. B : TBytes = Nil;
  569. begin
  570. D:=0;
  571. S:=123.45;
  572. AssertEquals('Bytes written',4,Stream.WriteData(S));
  573. Setlength(B,4);
  574. With TSingleRec(S) do
  575. begin
  576. B[0]:=Bytes[0];
  577. B[1]:=Bytes[1];
  578. B[2]:=Bytes[2];
  579. B[3]:=Bytes[3];
  580. end;
  581. AssertBytes(B);
  582. Stream.Position:=0;
  583. AssertEquals('Bytes read',4,Stream.ReadData(D));
  584. AssertEquals('Written data read correctly',S,D,0.0001);
  585. end;
  586. procedure TTestStream.TestSingleBuffer;
  587. Var
  588. S,D : Single;
  589. B : TBytes = Nil;
  590. begin
  591. D:=0;
  592. S:=123.45;
  593. Stream.WriteBufferData(S);
  594. Setlength(B,4);
  595. With TSingleRec(S) do
  596. begin
  597. B[0]:=Bytes[0];
  598. B[1]:=Bytes[1];
  599. B[2]:=Bytes[2];
  600. B[3]:=Bytes[3];
  601. end;
  602. AssertBytes(B);
  603. Stream.Position:=0;
  604. Stream.ReadBufferData(D);
  605. AssertEquals('Written data read correctly',S,D,0.0001);
  606. end;
  607. {$endif}
  608. procedure TTestStream.TestDouble;
  609. Var
  610. S,D : Double;
  611. B : TBytes;
  612. {$ifndef ECMASCRIPT}
  613. i : integer;
  614. {$endif}
  615. begin
  616. B:=Default(TBytes);
  617. D:=0;
  618. S:=123.45;
  619. AssertEquals('Bytes written',8,Stream.WriteData(S));
  620. Setlength(B,8);
  621. {$ifndef ECMASCRIPT}
  622. With TDoubleRec(S) do
  623. For I:=0 to 7 do
  624. B[I]:=Bytes[I];
  625. AssertBytes(B);
  626. {$endif}
  627. Stream.Position:=0;
  628. AssertEquals('Bytes read',8,Stream.ReadData(D));
  629. AssertEquals('Written data read correctly',S,D,0.0001);
  630. end;
  631. procedure TTestStream.TestDoubleBuffer;
  632. Var
  633. S,D : Double;
  634. B : TBytes;
  635. {$ifndef ECMASCRIPT}
  636. i : integer;
  637. {$endif}
  638. begin
  639. B:=Default(TBytes);
  640. D:=0;
  641. S:=123.45;
  642. Stream.WriteBufferData(S);
  643. Setlength(B,8);
  644. {$ifndef ECMASCRIPT}
  645. With TDoubleRec(S) do
  646. For I:=0 to 7 do
  647. B[I]:=Bytes[I];
  648. AssertBytes(B);
  649. {$endif}
  650. Stream.Position:=0;
  651. Stream.ReadBufferData(D);
  652. AssertEquals('Written data read correctly',S,D,0.0001);
  653. end;
  654. {$ifndef ECMASCRIPT}
  655. procedure TTestStream.TestExtended;
  656. Var
  657. S,D : Extended;
  658. B : TBytes = Nil;
  659. i : integer;
  660. begin
  661. D:=0;
  662. S:=123.45;
  663. AssertEquals('Bytes written',10,Stream.WriteData(S));
  664. Setlength(B,10);
  665. With TExtended80Rec(S) do
  666. For I:=0 to 9 do
  667. B[I]:=Bytes[I];
  668. AssertBytes(B);
  669. Stream.Position:=0;
  670. AssertEquals('Bytes read',10,Stream.ReadData(D));
  671. AssertEquals('Written data read correctly',S,D,0.0001);
  672. end;
  673. procedure TTestStream.TestExtendedBuffer;
  674. Var
  675. S,D : Extended;
  676. B : TBytes = Nil;
  677. i : integer;
  678. begin
  679. D:=0;
  680. S:=123.45;
  681. Stream.WriteBufferData(S);
  682. Setlength(B,10);
  683. With TExtended80Rec(S) do
  684. For I:=0 to 9 do
  685. B[I]:=Bytes[I];
  686. AssertBytes(B);
  687. Stream.Position:=0;
  688. Stream.ReadBufferData(D);
  689. AssertEquals('Written data read correctly',S,D,0.0001);
  690. end;
  691. {$endif}
  692. procedure TTestStream.SetUp;
  693. Var
  694. B : TBytes;
  695. begin
  696. B:=Default(TBytes);
  697. SetLength(B,0);
  698. FStream:=TBytesStream.Create(B);
  699. end;
  700. procedure TTestStream.TearDown;
  701. begin
  702. FreeAndNil(FStream);
  703. end;
  704. procedure TTestStream.AssertBytes(B: array of Byte; aMessage: string = ''; ObserveEndian : Boolean = True);
  705. Var
  706. L,I,E: integer;
  707. A : Byte;
  708. SB : TBytes;
  709. begin
  710. if AMessage<>'' then
  711. aMessage:=aMessage+': ';
  712. AssertEquals(aMessage+'Length bytes equals',Length(B),FStream.Size);
  713. SB:=TBytesStream(Stream).Bytes;
  714. L:=Length(B);
  715. for I:=0 to L-1 do
  716. begin
  717. E:=Byte(B[i] and $FF);
  718. if ObserveEndian and (Stream.Endian=Tendian.Big) then
  719. A:=SB[L-1-i]
  720. else
  721. A:=SB[i];
  722. AssertEquals(aMessage+'Byte['+IntToStr(I)+'] equals',E,A);
  723. end;
  724. end;
  725. {
  726. procedure TTestStream.AssertBytes(B: TBytes; aMessage : string = '');
  727. Var
  728. I : integer;
  729. SB : TBytes;
  730. begin
  731. if AMessage<>'' then
  732. aMessage:=aMessage+': ';
  733. AssertEquals(aMessage+'Length bytes equals',Length(B),FStream.Size);
  734. SB:=TBytesStream(Stream).Bytes;
  735. for I:=0 to Length(B)-1 do
  736. AssertEquals(aMessage+'Byte['+IntToStr(I)+'] equals',B[i],SB[i]);
  737. end;
  738. }
  739. function TTestStream.CreateBytes(aCount: integer): TBytes;
  740. Var
  741. I : Integer;
  742. begin
  743. Result:=Nil;
  744. SetLength(Result,aCount);
  745. For I:=0 to aCount-1 do
  746. Result[I]:=I+1;
  747. end;
  748. initialization
  749. RegisterTests([{TTestStream,TTestBigendianStream,}TTestStringStream]);
  750. end.