tcreportstreamer.pp 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2022 by Michael van Canneyt and other members of the
  4. Free Pascal development team
  5. test report streamer
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit tcreportstreamer;
  13. {$mode objfpc}{$H+}
  14. {.$define writejson}
  15. {.$define verbosedebug}
  16. interface
  17. uses
  18. Classes, SysUtils, fpcunit, testregistry, fpcanvas, fpjson,
  19. fpreport,fpreportstreamer;
  20. type
  21. TReportStreamTester = class(TTestCase)
  22. Private
  23. procedure FillBytes(S: TStream; AMax: Byte);
  24. protected
  25. FRD : TFPReportJSONStreamer;
  26. procedure SetUp; override;
  27. procedure TearDown; override;
  28. end;
  29. TTestReportDOM = class(TReportStreamTester)
  30. Public
  31. procedure TestStream(DoReset: Boolean);
  32. published
  33. procedure TestCreate;
  34. procedure TestAdd;
  35. procedure TestFind1;
  36. procedure TestFind2;
  37. procedure TestPush;
  38. procedure TestPop1;
  39. procedure TestStreamToHex;
  40. procedure TestStreamToHex2;
  41. procedure TestStreamEquals1;
  42. procedure TestStreamEquals2;
  43. procedure TestStreamEquals3;
  44. procedure TestStreamEquals4;
  45. procedure TestHexToStream;
  46. procedure TestWriteInteger1;
  47. procedure TestWriteString1;
  48. procedure TestWriteString2;
  49. procedure TestWriteBoolean1;
  50. procedure TestWriteBoolean2;
  51. procedure TestWriteFloat1;
  52. procedure TestWriteFloat2;
  53. procedure TestWriteFloat3;
  54. procedure TestWriteDateTime1;
  55. procedure TestWriteDateTime2;
  56. procedure TestWriteDateTime3;
  57. procedure TestWriteStream1;
  58. procedure TestWriteIntegerDiff1;
  59. procedure TestWriteIntegerDiff2;
  60. procedure TestWriteStringDiff1;
  61. procedure TestWriteStringDiff2;
  62. procedure TestWriteBooleanDiff1;
  63. procedure TestWriteBooleanDiff2;
  64. procedure TestWriteFloatDiff1;
  65. procedure TestWriteFloatDiff2;
  66. procedure TestWriteDateTimeDiff1;
  67. procedure TestWriteDateTimeDiff2;
  68. procedure TestWriteDateTimeDiff3;
  69. procedure TestWriteStreamDiff1;
  70. procedure TestWriteStreamDiff2;
  71. procedure TestWriteStreamDiff3;
  72. procedure TestReadInteger1;
  73. procedure TestReadInteger2;
  74. procedure TestReadInteger3;
  75. procedure TestReadString1;
  76. procedure TestReadString2;
  77. procedure TestReadString3;
  78. procedure TestReadDateTime1;
  79. procedure TestReadDateTime2;
  80. procedure TestReadDateTime3;
  81. procedure TestReadDateTime4;
  82. procedure TestReadDateTime5;
  83. procedure TestReadBoolean1;
  84. procedure TestReadBoolean2;
  85. procedure TestReadBoolean3;
  86. procedure TestReadBoolean4;
  87. procedure TestReadFloat1;
  88. procedure TestReadFloat2;
  89. procedure TestReadFloat3;
  90. procedure TestReadFloat4;
  91. procedure TestReadStream1;
  92. procedure TestReadStream2;
  93. procedure TestReadStream3;
  94. procedure TestALL;
  95. end;
  96. TTestReportFrameDom = Class(TReportStreamTester)
  97. private
  98. FF,F2 : TFPReportFrame;
  99. procedure FillFF;
  100. protected
  101. procedure Setup; override;
  102. procedure TearDown; override;
  103. published
  104. procedure TestWrite;
  105. procedure TestWriteDiff;
  106. procedure TestRead;
  107. end;
  108. TTestReportLayoutDom = Class(TReportStreamTester)
  109. private
  110. FL,F2 : TFPReportLayout;
  111. procedure FillFL;
  112. protected
  113. procedure Setup; override;
  114. procedure TearDown; override;
  115. published
  116. procedure TestWrite;
  117. procedure TestWriteDiff;
  118. procedure TestRead;
  119. end;
  120. TTestReportElementDOM = Class(TReportStreamTester)
  121. private
  122. FE,F2 : TFPReportElement;
  123. procedure FillFE;
  124. protected
  125. procedure Setup; override;
  126. procedure TearDown; override;
  127. published
  128. procedure TestWrite1;
  129. procedure TestWriteDiff1;
  130. procedure TestWriteDiff2;
  131. procedure TestRead1;
  132. procedure TestRead2;
  133. end;
  134. TTestReportElementWithChildrenDOM = class(TReportStreamTester)
  135. private
  136. FE, F2: TFPReportElementWithChildren;
  137. procedure FillFE;
  138. protected
  139. procedure Setup; override;
  140. procedure TearDown; override;
  141. published
  142. procedure TestWrite;
  143. procedure TestRead;
  144. end;
  145. TTestReportPageHeader = class(TReportStreamTester)
  146. private
  147. FE, F2: TFPReportPageHeaderBand;
  148. procedure FillFE;
  149. protected
  150. procedure Setup; override;
  151. procedure TearDown; override;
  152. published
  153. procedure TestWrite;
  154. procedure TestWrite2;
  155. procedure TestRead;
  156. end;
  157. implementation
  158. { TTestReportDOM }
  159. procedure TTestReportDOM.TestStream(DoReset: Boolean);
  160. Var
  161. S : TMemoryStream;
  162. B : Byte;
  163. T,H : String;
  164. begin
  165. S:=TMemoryStream.Create;
  166. try
  167. FillBytes(S,255);
  168. S.Position:=0;
  169. T:=FRD.StreamToHex(S);
  170. AssertEquals('Stream position is zero',0,S.Position);
  171. AssertEquals('Correct number of bytes returned by streamtohex',512,Length(T));
  172. For B:=0 to 255 do
  173. begin
  174. H:=Copy(T,1,2);
  175. Delete(T,1,2);
  176. AssertEquals(Format('Correct value at position %d',[b]),H,HexStr(B,2));
  177. end;
  178. Finally
  179. S.Free;
  180. end;
  181. end;
  182. procedure TTestReportDOM.TestCreate;
  183. begin
  184. AssertTrue('Failed on 1', Assigned(FRD.JSON));
  185. end;
  186. procedure TTestReportDOM.TestAdd;
  187. var
  188. E1, E2: TJSONObject;
  189. begin
  190. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  191. E1 := FRD.JSON;
  192. E2 := TJSONObject(FRD.NewElement('MyElement'));
  193. AssertNotNull('NewElement returns result', E2);
  194. AssertSame('NewElement is child of current element', E2, E1.Find('MyElement'));
  195. AssertEquals('New element created with correct name', '{ "MyElement" : {} }', E1.AsJSON);
  196. // AssertSame('New element is current element',E2,FRD.CurrentElement);
  197. end;
  198. procedure TTestReportDOM.TestFind1;
  199. var
  200. E1, E2, E3: TJSONObject;
  201. begin
  202. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  203. E1 := TJSONObject(FRD.NewElement('element1'));
  204. E2 := TJSONObject(FRD.NewElement('element2'));
  205. FRD.CurrentElement := E1;
  206. E3 := TJSONObject(FRD.FindChild('element2'));
  207. AssertEquals('Failed on 1', '{ "element1" : { "element2" : {} } }', FRD.JSON.AsJSON);
  208. AssertSame('Found element', E2, E3);
  209. end;
  210. procedure TTestReportDOM.TestFind2;
  211. var
  212. E1, E2, E3: TJSONObject;
  213. begin
  214. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  215. E1 := TJSONObject(FRD.NewElement('element1'));
  216. E2 := TJSONObject(FRD.NewElement('element2'));
  217. FRD.CurrentElement := E1;
  218. E3 := TJSONObject(FRD.FindChild('element3'));
  219. AssertNull('NonExisting element is null', E3);
  220. end;
  221. procedure TTestReportDOM.TestPush;
  222. var
  223. E1, E2: TJSONObject;
  224. begin
  225. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  226. E1 := TJSONObject(FRD.NewElement('element1'));
  227. AssertSame('Current element equals created', E1, FRD.CurrentElement);
  228. E2 := TJSONObject(FRD.NewElement('element2'));
  229. AssertEquals('New node pushed with correct name', '{ "element2" : {} }', E1.AsJSON);
  230. end;
  231. procedure TTestReportDOM.TestPop1;
  232. var
  233. E1, E2, E3: TJSONObject;
  234. begin
  235. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  236. E1 := TJSONObject(FRD.NewElement('element1'));
  237. AssertSame('Failed on 1', E1, FRD.CurrentElement);
  238. E2 := TJSONObject(FRD.PushElement('element2'));
  239. AssertSame('Failed on 2', E2, FRD.CurrentElement);
  240. AssertEquals('Failed on 3', '{ "element2" : {} }', E1.AsJSON);
  241. E3 := FRD.CurrentElement;
  242. AssertSame('Failed on 4', E3, TJSONObject(FRD.PopElement));
  243. end;
  244. procedure TTestReportDOM.TestStreamToHex;
  245. begin
  246. TestStream(True);
  247. end;
  248. procedure TTestReportDOM.TestStreamToHex2;
  249. begin
  250. TestStream(False);
  251. end;
  252. procedure TTestReportDOM.TestStreamEquals1;
  253. var
  254. S: TMemoryStream;
  255. begin
  256. S := TMemoryStream.Create;
  257. try
  258. AssertEquals('Same stream always equal', True, FRD.StreamsEqual(S, S));
  259. finally
  260. S.Free;
  261. end;
  262. end;
  263. procedure TTestReportDOM.TestStreamEquals2;
  264. var
  265. S1, S2: TMemoryStream;
  266. begin
  267. S1 := TMemoryStream.Create;
  268. try
  269. FillBytes(S1, 255);
  270. S2 := TMemoryStream.Create;
  271. try
  272. FillBytes(S2, 255);
  273. AssertEquals('Same content always equal', True, FRD.StreamsEqual(S1, S2));
  274. finally
  275. S2.Free;
  276. end;
  277. finally
  278. S1.Free;
  279. end;
  280. end;
  281. procedure TTestReportDOM.TestStreamEquals3;
  282. var
  283. S1, S2: TMemoryStream;
  284. begin
  285. S1 := TMemoryStream.Create;
  286. try
  287. FillBytes(S1, 255);
  288. S2 := TMemoryStream.Create;
  289. try
  290. FillBytes(S2, 254);
  291. AssertEquals('Different sizes makes not equal', False, FRD.StreamsEqual(S1, S2));
  292. finally
  293. S2.Free;
  294. end;
  295. finally
  296. S1.Free;
  297. end;
  298. end;
  299. procedure TTestReportDOM.TestStreamEquals4;
  300. var
  301. S1, S2: TMemoryStream;
  302. B: byte;
  303. begin
  304. S1 := TMemoryStream.Create;
  305. try
  306. FillBytes(S1, 255);
  307. AssertEquals(0, S1.Seek(0, soFromBeginning));
  308. B := 10;
  309. S1.WriteBuffer(B, 1);
  310. B := 12;
  311. S1.Position := 0;
  312. S1.ReadBuffer(B, 1);
  313. AssertEquals(10, B);
  314. AssertEquals(256, S1.Size);
  315. S2 := TMemoryStream.Create;
  316. try
  317. FillBytes(S2, 255);
  318. AssertEquals('Different streams makes not equal', False, FRD.StreamsEqual(S1, S2));
  319. finally
  320. S2.Free;
  321. end;
  322. finally
  323. S1.Free;
  324. end;
  325. end;
  326. procedure TTestReportDOM.TestHexToStream;
  327. var
  328. S: TMemoryStream;
  329. SS: TStringStream;
  330. H: string;
  331. begin
  332. S := TMemoryStream.Create;
  333. try
  334. FillBytes(S, 255);
  335. H := FRD.StreamToHex(S);
  336. SS := FRD.HexToStringStream(H);
  337. try
  338. AssertEquals('Size of stream is OK', 256, SS.Size);
  339. AssertEquals('HexToStringStream OK', True, FRD.StreamsEqual(S, SS));
  340. finally
  341. SS.Free;
  342. end;
  343. finally
  344. S.Free;
  345. end;
  346. end;
  347. procedure TTestReportDOM.TestWriteInteger1;
  348. var
  349. E: TJSONObject;
  350. begin
  351. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  352. E := TJSONObject(FRD.NewElement('MyElement'));
  353. FRD.WriteInteger('Int', 1);
  354. AssertSame('Current element not changed', E, FRD.CurrentElement);
  355. AssertEquals('Failed on 1', '{ "MyElement" : { "Int" : 1 } }', FRD.JSON.AsJSON);
  356. end;
  357. procedure TTestReportDOM.TestWriteString1;
  358. var
  359. E: TJSONObject;
  360. begin
  361. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  362. E := TJSONObject(FRD.NewElement('MyElement'));
  363. FRD.WriteString('Str', 'Aloha');
  364. AssertSame('Current element not changed', E, FRD.CurrentElement);
  365. AssertEquals('Failed on 1', '{ "MyElement" : { "Str" : "Aloha" } }', FRD.JSON.AsJSON);
  366. end;
  367. procedure TTestReportDOM.TestWriteString2;
  368. var
  369. E: TJSONObject;
  370. begin
  371. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  372. E := TJSONObject(FRD.NewElement('MyElement'));
  373. FRD.WriteString('Str', '');
  374. AssertSame('Current element not changed', E, FRD.CurrentElement);
  375. AssertEquals('Failed on 1', '{ "MyElement" : { "Str" : "" } }', FRD.JSON.AsJSON);
  376. end;
  377. procedure TTestReportDOM.TestWriteBoolean1;
  378. var
  379. E: TJSONObject;
  380. begin
  381. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  382. E := TJSONObject(FRD.NewElement('MyElement'));
  383. FRD.WriteBoolean('Bool', True);
  384. AssertSame('Current element not changed', E, FRD.CurrentElement);
  385. AssertEquals('Failed on 1', '{ "MyElement" : { "Bool" : true } }', FRD.JSON.AsJSON);
  386. end;
  387. procedure TTestReportDOM.TestWriteBoolean2;
  388. var
  389. E: TJSONObject;
  390. begin
  391. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  392. E := TJSONObject(FRD.NewElement('MyElement'));
  393. FRD.WriteBoolean('Bool', False);
  394. AssertSame('Current element not changed', E, FRD.CurrentElement);
  395. AssertEquals('Failed on 1', '{ "MyElement" : { "Bool" : false } }', FRD.JSON.AsJSON);
  396. end;
  397. procedure TTestReportDOM.TestWriteFloat1;
  398. var
  399. E: TJSONObject;
  400. begin
  401. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  402. E := TJSONObject(FRD.NewElement('MyElement'));
  403. FRD.WriteFloat('Float', 1.23);
  404. AssertSame('Current element not changed', E, FRD.CurrentElement);
  405. AssertEquals('Failed on 1', 1.23, FRD.JSON.FindPath('MyElement.Float').AsFloat);
  406. end;
  407. procedure TTestReportDOM.TestWriteFloat2;
  408. var
  409. E: TJSONObject;
  410. begin
  411. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  412. E := TJSONObject(FRD.NewElement('MyElement'));
  413. FRD.WriteFloat('Float', -1.23);
  414. AssertSame('Current element not changed', E, FRD.CurrentElement);
  415. AssertEquals('Failed on 1', -1.23, FRD.JSON.FindPath('MyElement.Float').AsFloat);
  416. end;
  417. procedure TTestReportDOM.TestWriteFloat3;
  418. var
  419. E: TJSONObject;
  420. x: Extended;
  421. begin
  422. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  423. E := TJSONObject(FRD.NewElement('MyElement'));
  424. x := 0.0;
  425. FRD.WriteFloat('Float', x);
  426. AssertSame('Current element not changed', E, FRD.CurrentElement);
  427. AssertEquals('Failed on 1', 0.0, FRD.JSON.FindPath('MyElement.Float').AsFloat);
  428. end;
  429. procedure TTestReportDOM.TestWriteDateTime1;
  430. var
  431. E: TJSONObject;
  432. D: TDateTime;
  433. begin
  434. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  435. E := TJSONObject(FRD.NewElement('MyElement'));
  436. D := EncodeDate(2008, 9, 18);
  437. FRD.WriteDateTime('Date', D);
  438. AssertSame('Current element not changed', E, FRD.CurrentElement);
  439. AssertEquals('Failed on 1', '{ "MyElement" : { "Date" : "20080918T000000" } }', FRD.JSON.AsJSON);
  440. end;
  441. procedure TTestReportDOM.TestWriteDateTime2;
  442. var
  443. E: TJSONObject;
  444. D: TDateTime;
  445. begin
  446. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  447. E := TJSONObject(FRD.NewElement('MyElement'));
  448. D := EncodeDate(2008, 9, 18) + EncodeTime(11,03,55,123);
  449. FRD.WriteDateTime('Date', D);
  450. AssertSame('Current element not changed', E, FRD.CurrentElement);
  451. AssertEquals('Failed on 1', '{ "MyElement" : { "Date" : "20080918T110355" } }', FRD.JSON.AsJSON);
  452. end;
  453. procedure TTestReportDOM.TestWriteDateTime3;
  454. var
  455. E: TJSONObject;
  456. D: TDateTime;
  457. begin
  458. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  459. E := TJSONObject(FRD.NewElement('MyElement'));
  460. D := EncodeTime(11,03,55,123);
  461. FRD.WriteDateTime('Date', D);
  462. AssertSame('Current element not changed', E, FRD.CurrentElement);
  463. AssertEquals('Failed on 1', '{ "MyElement" : { "Date" : "00000000T110355" } }', FRD.JSON.AsJSON);
  464. end;
  465. procedure TTestReportDOM.TestWriteStream1;
  466. var
  467. E: TJSONObject;
  468. S: TMemoryStream;
  469. begin
  470. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  471. E := TJSONObject(FRD.NewElement('MyElement'));
  472. S := TMemoryStream.Create;
  473. try
  474. FillBytes(S, 15);
  475. FRD.WriteStream('Stream', S);
  476. AssertSame('Current element not changed', E, FRD.CurrentElement);
  477. AssertEquals('Failed on 1', '{ "MyElement" : { "Stream" : "000102030405060708090A0B0C0D0E0F" } }', FRD.JSON.AsJSON);
  478. finally
  479. FreeAndNil(S);
  480. end;
  481. end;
  482. procedure TTestReportDOM.TestWriteIntegerDiff1;
  483. var
  484. E: TJSONObject;
  485. begin
  486. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  487. E := TJSONObject(FRD.NewElement('MyElement'));
  488. FRD.WriteIntegerDiff('Int', 1, 0);
  489. AssertSame('Current element not changed', E, FRD.CurrentElement);
  490. AssertEquals('Failed on 1', '{ "MyElement" : { "Int" : 1 } }', FRD.JSON.AsJSON);
  491. end;
  492. procedure TTestReportDOM.TestWriteIntegerDiff2;
  493. var
  494. E: TJSONObject;
  495. begin
  496. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  497. E := TJSONObject(FRD.NewElement('MyElement'));
  498. FRD.WriteIntegerDiff('Int', 1, 1);
  499. AssertSame('Current element not changed', E, FRD.CurrentElement);
  500. AssertEquals('Failed on 1', '{ "MyElement" : {} }', FRD.JSON.AsJSON);
  501. end;
  502. procedure TTestReportDOM.TestWriteStringDiff1;
  503. var
  504. E: TJSONObject;
  505. begin
  506. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  507. E := TJSONObject(FRD.NewElement('MyElement'));
  508. FRD.WriteStringDiff('Str', 'Aloha', 'mopa');
  509. AssertSame('Current element not changed', E, FRD.CurrentElement);
  510. AssertEquals('Failed on 1', '{ "MyElement" : { "Str" : "Aloha" } }', FRD.JSON.AsJSON);
  511. end;
  512. procedure TTestReportDOM.TestWriteStringDiff2;
  513. var
  514. E: TJSONObject;
  515. begin
  516. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  517. E := TJSONObject(FRD.NewElement('MyElement'));
  518. FRD.WriteStringDiff('Str', 'Aloha', 'Aloha');
  519. AssertSame('Current element not changed', E, FRD.CurrentElement);
  520. AssertEquals('Failed on 1', '{ "MyElement" : {} }', FRD.JSON.AsJSON);
  521. end;
  522. procedure TTestReportDOM.TestWriteBooleanDiff1;
  523. var
  524. E: TJSONObject;
  525. begin
  526. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  527. E := TJSONObject(FRD.NewElement('MyElement'));
  528. FRD.WriteBooleanDiff('Bool', True, False);
  529. AssertSame('Current element not changed', E, FRD.CurrentElement);
  530. AssertEquals('Failed on 1', '{ "MyElement" : { "Bool" : true } }', FRD.JSON.AsJSON);
  531. end;
  532. procedure TTestReportDOM.TestWriteBooleanDiff2;
  533. var
  534. E: TJSONObject;
  535. begin
  536. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  537. E := TJSONObject(FRD.NewElement('MyElement'));
  538. FRD.WriteBooleanDiff('Bool', True, True);
  539. AssertSame('Current element not changed', E, FRD.CurrentElement);
  540. AssertEquals('Failed on 1', '{ "MyElement" : {} }', FRD.JSON.AsJSON);
  541. end;
  542. procedure TTestReportDOM.TestWriteFloatDiff1;
  543. var
  544. E: TJSONObject;
  545. begin
  546. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  547. E := TJSONObject(FRD.NewElement('MyElement'));
  548. FRD.WriteFloatDiff('Float', 1.23, 1.24);
  549. AssertSame('Current element not changed', E, FRD.CurrentElement);
  550. AssertEquals('Failed on 1', 1.23, FRD.JSON.FindPath('MyElement.Float').AsFloat);
  551. end;
  552. procedure TTestReportDOM.TestWriteFloatDiff2;
  553. var
  554. E: TJSONObject;
  555. begin
  556. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  557. E := TJSONObject(FRD.NewElement('MyElement'));
  558. FRD.WriteFloatDiff('Float', 1.23, 1.23);
  559. AssertSame('Current element not changed', E, FRD.CurrentElement);
  560. AssertNull('Failed on 1', FRD.JSON.FindPath('MyElement.Float'));
  561. end;
  562. procedure TTestReportDOM.TestWriteDateTimeDiff1;
  563. var
  564. E: TJSONObject;
  565. D1, D2: TDateTime;
  566. begin
  567. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  568. E := TJSONObject(FRD.NewElement('MyElement'));
  569. D1 := EncodeDate(2008, 9, 18);
  570. D2 := EncodeDate(2001, 10, 28);
  571. FRD.WriteDateTimeDiff('Date', D1, D2);
  572. AssertSame('Current element not changed', E, FRD.CurrentElement);
  573. AssertEquals('Failed on 1', '{ "MyElement" : { "Date" : "20080918T000000" } }', FRD.JSON.AsJSON);
  574. end;
  575. procedure TTestReportDOM.TestWriteDateTimeDiff2;
  576. var
  577. E: TJSONObject;
  578. D1: TDateTime;
  579. begin
  580. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  581. E := TJSONObject(FRD.NewElement('MyElement'));
  582. D1 := EncodeDate(2008, 9, 18) + EncodeTime(0,0,0,1);
  583. FRD.WriteDateTimeDiff('Date', D1, D1);
  584. AssertSame('Current element not changed', E, FRD.CurrentElement);
  585. AssertEquals('Failed on 1', '{ "MyElement" : {} }', FRD.JSON.AsJSON);
  586. end;
  587. procedure TTestReportDOM.TestWriteDateTimeDiff3;
  588. var
  589. E: TJSONObject;
  590. D1: TDateTime;
  591. begin
  592. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  593. E := TJSONObject(FRD.NewElement('MyElement'));
  594. D1 := EncodeDate(2008, 9, 18);
  595. FRD.WriteDateTimeDiff('Date', D1, D1 + EncodeTime(0,0,0,1));
  596. AssertSame('Current element not changed', E, FRD.CurrentElement);
  597. AssertEquals('Failed on 1', '{ "MyElement" : { "Date" : "20080918T000000" } }', FRD.JSON.AsJSON);
  598. end;
  599. procedure TTestReportDOM.TestWriteStreamDiff1;
  600. var
  601. E: TJSONObject;
  602. S: TMemoryStream;
  603. begin
  604. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  605. E := TJSONObject(FRD.NewElement('MyElement'));
  606. S := TMemoryStream.Create;
  607. try
  608. FillBytes(S, 15);
  609. FRD.WriteStreamDiff('Stream', S, S);
  610. AssertSame('Current element not changed', E, FRD.CurrentElement);
  611. AssertEquals('Failed on 1', '{ "MyElement" : {} }', FRD.JSON.AsJSON);
  612. finally
  613. FreeAndNil(S);
  614. end;
  615. end;
  616. procedure TTestReportDOM.TestWriteStreamDiff2;
  617. var
  618. E: TJSONObject;
  619. S, T: TMemoryStream;
  620. begin
  621. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  622. E := TJSONObject(FRD.NewElement('MyElement'));
  623. S := TMemoryStream.Create;
  624. try
  625. FillBytes(S, 15);
  626. T := TMemoryStream.Create;
  627. try
  628. FillBytes(T, 15);
  629. FRD.WriteStreamDiff('Stream', S, T);
  630. AssertSame('Current element not changed', E, FRD.CurrentElement);
  631. AssertEquals('Failed on 1', '{ "MyElement" : {} }', FRD.JSON.AsJSON);
  632. finally
  633. FreeAndNil(T);
  634. end;
  635. finally
  636. FreeAndNil(S);
  637. end;
  638. end;
  639. procedure TTestReportDOM.TestWriteStreamDiff3;
  640. var
  641. E: TJSONObject;
  642. S, T: TMemoryStream;
  643. begin
  644. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  645. E := TJSONObject(FRD.NewElement('MyElement'));
  646. S := TMemoryStream.Create;
  647. try
  648. FillBytes(S, 15);
  649. T := TMemoryStream.Create;
  650. try
  651. FillBytes(T, 16);
  652. FRD.WriteStreamDiff('Stream', S, T);
  653. AssertSame('Current element not changed', E, FRD.CurrentElement);
  654. AssertEquals('Failed on 1', '{ "MyElement" : { "Stream" : "000102030405060708090A0B0C0D0E0F" } }', FRD.JSON.AsJSON)
  655. finally
  656. FreeAndNil(T);
  657. end;
  658. finally
  659. FreeAndNil(S);
  660. end;
  661. end;
  662. procedure TTestReportDOM.TestReadInteger1;
  663. var
  664. E: TJSONObject;
  665. begin
  666. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  667. E := TJSONObject(FRD.NewElement('MyElement'));
  668. FRD.WriteInteger('Int', 1);
  669. AssertSame('Current element not changed', E, FRD.CurrentElement);
  670. AssertEquals('Reading integer property', 1, FRD.ReadInteger('Int', -1));
  671. AssertSame('Current element not changed', E, FRD.CurrentElement);
  672. end;
  673. procedure TTestReportDOM.TestReadInteger2;
  674. var
  675. E: TJSONObject;
  676. begin
  677. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  678. E := TJSONObject(FRD.NewElement('MyElement'));
  679. AssertEquals('Reading non-existent integer property', -1, FRD.ReadInteger('Int', -1));
  680. AssertEquals('Reading non-existent integer property', -2, FRD.ReadInteger('Int', -2));
  681. end;
  682. procedure TTestReportDOM.TestReadInteger3;
  683. var
  684. E: TJSONObject;
  685. begin
  686. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  687. E := TJSONObject(FRD.NewElement('MyElement'));
  688. FRD.WriteString('Int', 'Aloha');
  689. AssertSame('Current element not changed', E, FRD.CurrentElement);
  690. AssertEquals('Reading wrongly typed integer property', -1, FRD.ReadInteger('Int', -1));
  691. AssertSame('Current element not changed', E, FRD.CurrentElement);
  692. end;
  693. procedure TTestReportDOM.TestReadString1;
  694. var
  695. E: TJSONObject;
  696. begin
  697. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  698. E := TJSONObject(FRD.NewElement('MyElement'));
  699. FRD.WriteString('Str', 'Aloha');
  700. AssertSame('Current element not changed', E, FRD.CurrentElement);
  701. AssertEquals('Reading string property', 'Aloha', FRD.ReadString('Str', '(none)'));
  702. AssertSame('Current element not changed', E, FRD.CurrentElement);
  703. end;
  704. procedure TTestReportDOM.TestReadString2;
  705. var
  706. E: TJSONObject;
  707. begin
  708. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  709. E := TJSONObject(FRD.NewElement('MyElement'));
  710. AssertSame('Current element not changed', E, FRD.CurrentElement);
  711. AssertEquals('Reading non-existent string property', '(none)', FRD.ReadString('Str', '(none)'));
  712. AssertSame('Current element not changed', E, FRD.CurrentElement);
  713. end;
  714. procedure TTestReportDOM.TestReadString3;
  715. var
  716. E: TJSONObject;
  717. begin
  718. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  719. E := TJSONObject(FRD.NewElement('MyElement'));
  720. FRD.WriteInteger('Str', 1);
  721. AssertSame('Current element not changed', E, FRD.CurrentElement);
  722. AssertEquals('Reading wrongly typed string property', '(none)', FRD.ReadString('Str', '(none)'));
  723. AssertSame('Current element not changed', E, FRD.CurrentElement);
  724. end;
  725. procedure TTestReportDOM.TestReadDateTime1;
  726. var
  727. E: TJSONObject;
  728. D: TDateTime;
  729. begin
  730. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  731. E := TJSONObject(FRD.NewElement('MyElement'));
  732. D := EncodeDate(2008, 9, 18);
  733. FRD.WriteDateTime('Date', D);
  734. AssertSame('Current element not changed', E, FRD.CurrentElement);
  735. AssertEquals('Reading date property', D, FRD.ReadDateTime('Date', D-1));
  736. end;
  737. procedure TTestReportDOM.TestReadDateTime2;
  738. var
  739. E: TJSONObject;
  740. D: TDateTime;
  741. begin
  742. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  743. E := TJSONObject(FRD.NewElement('MyElement'));
  744. D := EncodeDate(2008, 9, 18) + EncodeTime(11, 3, 55, 123);
  745. FRD.WriteDateTime('Date', D);
  746. AssertSame('Current element not changed', E, FRD.CurrentElement);
  747. AssertEquals('Reading date property', D, FRD.ReadDateTime('Date', D-1));
  748. end;
  749. procedure TTestReportDOM.TestReadDateTime3;
  750. var
  751. E: TJSONObject;
  752. D: TDateTime;
  753. begin
  754. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  755. E := TJSONObject(FRD.NewElement('MyElement'));
  756. D := EncodeTime(11, 3, 55, 123);
  757. AssertSame('Current element not changed', E, FRD.CurrentElement);
  758. AssertEquals('Reading non-existent time property', D, FRD.ReadDateTime('Date', D));
  759. end;
  760. procedure TTestReportDOM.TestReadDateTime4;
  761. var
  762. E: TJSONObject;
  763. D: TDateTime;
  764. begin
  765. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  766. E := TJSONObject(FRD.NewElement('MyElement'));
  767. D := EncodeDate(2008, 9, 18);
  768. FRD.WriteString('Date', '20080918');
  769. AssertSame('Current element not changed', E, FRD.CurrentElement);
  770. AssertEquals('Reading date-only property', D, FRD.ReadDateTime('Date', D));
  771. end;
  772. procedure TTestReportDOM.TestReadDateTime5;
  773. var
  774. E: TJSONObject;
  775. D: TDateTime;
  776. begin
  777. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  778. E := TJSONObject(FRD.NewElement('MyElement'));
  779. D := EncodeDate(2008, 9, 18);
  780. FRD.WriteDateTime('Date', D);
  781. AssertSame('Current element not changed', E, FRD.CurrentElement);
  782. AssertEquals('Reading date property', D, FRD.ReadDateTime('Date', D-1));
  783. end;
  784. procedure TTestReportDOM.TestReadBoolean1;
  785. var
  786. E: TJSONObject;
  787. begin
  788. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  789. E := TJSONObject(FRD.NewElement('MyElement'));
  790. FRD.WriteBoolean('Bool', True);
  791. AssertSame('Current element not changed', E, FRD.CurrentElement);
  792. AssertEquals('Reading true boolean property', True, FRD.ReadBoolean('Bool', False));
  793. AssertSame('Current element not changed', E, FRD.CurrentElement);
  794. end;
  795. procedure TTestReportDOM.TestReadBoolean2;
  796. var
  797. E: TJSONObject;
  798. begin
  799. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  800. E := TJSONObject(FRD.NewElement('MyElement'));
  801. FRD.WriteBoolean('Bool', False);
  802. AssertSame('Current element not changed', E, FRD.CurrentElement);
  803. AssertEquals('Reading true boolean property', False, FRD.ReadBoolean('Bool', True));
  804. AssertSame('Current element not changed', E, FRD.CurrentElement);
  805. end;
  806. procedure TTestReportDOM.TestReadBoolean3;
  807. var
  808. E: TJSONObject;
  809. begin
  810. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  811. E := TJSONObject(FRD.NewElement('MyElement'));
  812. FRD.WriteString('Bool', 'Aloha');
  813. AssertSame('Current element not changed', E, FRD.CurrentElement);
  814. AssertEquals('Reading wrongly typed boolean property', False, FRD.ReadBoolean('Bool', False));
  815. AssertSame('Current element not changed', E, FRD.CurrentElement);
  816. end;
  817. procedure TTestReportDOM.TestReadBoolean4;
  818. var
  819. E: TJSONObject;
  820. begin
  821. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  822. E := TJSONObject(FRD.NewElement('MyElement'));
  823. AssertSame('Current element not changed', E, FRD.CurrentElement);
  824. AssertEquals('Reading non-existant boolean property', False, FRD.ReadBoolean('Bool', False));
  825. AssertSame('Current element not changed', E, FRD.CurrentElement);
  826. end;
  827. procedure TTestReportDOM.TestReadFloat1;
  828. var
  829. E: TJSONObject;
  830. begin
  831. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  832. E := TJSONObject(FRD.NewElement('MyElement'));
  833. FRD.WriteFloat('Float', 1.23);
  834. AssertSame('Current element not changed', E, FRD.CurrentElement);
  835. AssertEquals('Reading float property', 1.23, FRD.ReadFloat('Float', 2.34), 0.001);
  836. AssertSame('Current element not changed', E, FRD.CurrentElement);
  837. end;
  838. procedure TTestReportDOM.TestReadFloat2;
  839. var
  840. E: TJSONObject;
  841. begin
  842. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  843. E := TJSONObject(FRD.NewElement('MyElement'));
  844. FRD.WriteString('Float', 'Aloha');
  845. AssertSame('Current element not changed', E, FRD.CurrentElement);
  846. AssertEquals('Reading wrongly typed float property', 2.34, FRD.ReadFloat('Float', 2.34), 0.001);
  847. AssertSame('Current element not changed', E, FRD.CurrentElement);
  848. end;
  849. procedure TTestReportDOM.TestReadFloat3;
  850. var
  851. E: TJSONObject;
  852. begin
  853. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  854. E := TJSONObject(FRD.NewElement('MyElement'));
  855. AssertSame('Current element not changed', E, FRD.CurrentElement);
  856. AssertEquals('Reading non existant float property', 2.34, FRD.ReadFloat('Float', 2.34), 0.001);
  857. AssertSame('Current element not changed', E, FRD.CurrentElement);
  858. end;
  859. procedure TTestReportDOM.TestReadFloat4;
  860. var
  861. E: TJSONObject;
  862. begin
  863. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  864. E := TJSONObject(FRD.NewElement('MyElement'));
  865. FRD.WriteInteger('Float', 1);
  866. AssertSame('Current element not changed', E, FRD.CurrentElement);
  867. AssertEquals('Reading integer formatted float property', 1.0, FRD.ReadFloat('Float', 2.34), 0.001);
  868. AssertSame('Current element not changed', E, FRD.CurrentElement);
  869. end;
  870. procedure TTestReportDOM.TestReadStream1;
  871. var
  872. E: TJSONObject;
  873. S, T: TMemoryStream;
  874. begin
  875. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  876. E := TJSONObject(FRD.NewElement('MyElement'));
  877. S := TMemoryStream.Create;
  878. try
  879. FillBytes(S, 15);
  880. FRD.WriteStream('Stream', S);
  881. AssertSame('Current element not changed', E, FRD.CurrentElement);
  882. T := TMemoryStream.Create;
  883. try
  884. AssertEquals('Reading stream data', True, FRD.ReadStream('Stream', T));
  885. AssertEquals('Read stream equals written stream', True, FRD.StreamsEqual(S, T));
  886. finally
  887. T.Free;
  888. end;
  889. finally
  890. FreeAndNil(S);
  891. end;
  892. end;
  893. procedure TTestReportDOM.TestReadStream2;
  894. var
  895. E: TJSONObject;
  896. T: TMemoryStream;
  897. begin
  898. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  899. E := TJSONObject(FRD.NewElement('MyElement'));
  900. FRD.WriteString('Stream', '');
  901. AssertSame('Current element not changed', E, FRD.CurrentElement);
  902. T := TMemoryStream.Create;
  903. try
  904. AssertEquals('Reading empty stream data', False, FRD.ReadStream('Stream', T));
  905. AssertEquals('Read stream is empty', 0, T.Size);
  906. finally
  907. T.Free;
  908. end;
  909. end;
  910. procedure TTestReportDOM.TestReadStream3;
  911. var
  912. E: TJSONObject;
  913. T: TMemoryStream;
  914. begin
  915. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  916. E := TJSONObject(FRD.NewElement('MyElement'));
  917. AssertSame('Current element not changed', E, FRD.CurrentElement);
  918. T := TMemoryStream.Create;
  919. try
  920. AssertEquals('Reading non-existent stream data', False, FRD.ReadStream('Stream', T));
  921. AssertEquals('Read stream is empty', 0, T.Size);
  922. finally
  923. T.Free;
  924. end;
  925. end;
  926. procedure TTestReportDOM.TestALL;
  927. var
  928. E: TJSONObject;
  929. rp: TFPReportPage;
  930. begin
  931. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  932. E := TJSONObject(FRD.NewElement('MyElement'));
  933. rp := TFPReportPage.Create(nil);
  934. try
  935. rp.WriteElement(FRD);
  936. {$ifdef verbosedebug}
  937. writeln('--------------');
  938. Writeln(FRD.JSON.AsJSON);
  939. writeln('--------------');
  940. {$endif}
  941. With FRD.JSON do
  942. begin
  943. AssertEquals('Failed on 1', '', FindPath('MyElement.Name').Asstring);
  944. AssertEquals('Failed on 2,',0.0, FindPath('MyElement.Layout.Top').AsFloat);
  945. AssertEquals('Failed on 3,',0.0, FindPath('MyElement.Layout.Left').AsFloat);
  946. AssertEquals('Failed on 4,',0.0, FindPath('MyElement.Layout.Height').AsFloat);
  947. AssertEquals('Failed on 5,',0.0, FindPath('MyElement.Layout.Width').AsFloat);
  948. end;
  949. finally
  950. rp.Free;
  951. end;
  952. end;
  953. { ---------------------------------------------------------------------
  954. General routines
  955. ---------------------------------------------------------------------}
  956. procedure TReportStreamTester.SetUp;
  957. begin
  958. FRD := TFPReportJSONStreamer.Create(nil);
  959. end;
  960. procedure TReportStreamTester.TearDown;
  961. begin
  962. {$ifdef writejson}
  963. writeln(FRD.JSON.FormatJSON);
  964. {$endif}
  965. FreeAndNil(FRD);
  966. end;
  967. procedure TReportStreamTester.FillBytes(S : TStream; AMax : Byte);
  968. Var
  969. B : Byte;
  970. begin
  971. For B:=0 to AMax do
  972. S.WriteBuffer(B,SizeOf(B));
  973. end;
  974. { ---------------------------------------------------------------------
  975. Actual test routines
  976. ---------------------------------------------------------------------}
  977. { TTestReportFrameDom }
  978. procedure TTestReportFrameDom.Setup;
  979. begin
  980. inherited Setup;
  981. FF:=TFPReportframe.Create(Nil);
  982. F2:=TFPReportframe.Create(Nil);
  983. end;
  984. procedure TTestReportFrameDom.TearDown;
  985. begin
  986. FreeAndNil(FF);
  987. FreeAndNil(F2);
  988. inherited TearDown;
  989. end;
  990. procedure TTestReportFrameDom.TestWrite;
  991. var
  992. FDoc: TJSONObject;
  993. begin
  994. FillFF;
  995. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  996. FDoc := FRD.JSON;
  997. FF.WriteElement(FRD, nil);
  998. // compare via JSON directly
  999. AssertEquals('Failed on 1', 2, FDoc.Get('Width', 1));
  1000. AssertEquals('Failed on 2', 'psDot', FDoc.Get('Pen', 'psSolid'));
  1001. AssertEquals('Failed on 3', 'fsRoundedRect', FDoc.Get('Shape', 'fsNone'));
  1002. AssertEquals('Failed on 4', 23, FDoc.Get('Color', 0));
  1003. AssertEquals('Failed on 5', Integer([flTop,flBottom]), FDoc.Get('Lines', 0));
  1004. // compare via streamer interface
  1005. AssertEquals('Failed on 6', 2, FRD.ReadInteger('Width', 1));
  1006. AssertEquals('Failed on 7', 'psDot', FRD.ReadString('Pen', 'psSolid'));
  1007. AssertEquals('Failed on 8', 'fsRoundedRect', FRD.ReadString('Shape', 'fsNone'));
  1008. AssertEquals('Failed on 9', 23, FRD.ReadInteger('Color', 0));
  1009. AssertEquals('Failed on 10', Integer([flTop,flBottom]), FRD.ReadInteger('Lines', 0));
  1010. end;
  1011. procedure TTestReportFrameDom.TestWriteDiff;
  1012. var
  1013. FDoc: TJSONObject;
  1014. begin
  1015. FillFF;
  1016. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  1017. FDoc := FRD.JSON;
  1018. FF.WriteElement(FRD, F2);
  1019. AssertEquals('Failed on 1', 2, FDoc.Get('Width', 0));
  1020. AssertEquals('Failed on 2', 'psDot', FDoc.Get('Pen', 'psSolid'));
  1021. AssertEquals('Failed on 3', 'fsRoundedRect', FDoc.Get('Shape', 'fsNone'));
  1022. AssertEquals('Failed on 4', 23, FDoc.Get('Color', 0));
  1023. AssertEquals('Failed on 5', Integer([flTop,flBottom]), FDoc.Get('Lines', 0));
  1024. end;
  1025. procedure TTestReportFrameDom.TestRead;
  1026. var
  1027. FDoc: TJSONObject;
  1028. begin
  1029. FillFF;
  1030. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  1031. FDoc := FRD.JSON;
  1032. FF.WriteElement(FRD, nil);
  1033. F2.ReadElement(FRD);
  1034. AssertEquals('Failed on 1', FF.Width, F2.Width);
  1035. AssertEquals('Failed on 2', Ord(FF.Pen), Ord(F2.Pen));
  1036. AssertEquals('Failed on 3', Ord(FF.Color), Ord(F2.Color));
  1037. AssertEquals('Failed on 4', Ord(FF.Shape), Ord(F2.Shape));
  1038. AssertEquals('Failed on 5', Integer(FF.Lines), Integer(F2.Lines));
  1039. end;
  1040. Procedure FillFrame(FF : TFPReportFrame);
  1041. begin
  1042. FF.Width:=2;
  1043. FF.Pen:=psDot;
  1044. FF.Shape:=fsRoundedRect;
  1045. FF.Color:=23;
  1046. FF.Lines:=[flTop,flBottom];
  1047. end;
  1048. procedure TTestReportFrameDom.FillFF;
  1049. begin
  1050. FillFrame(FF);
  1051. end;
  1052. { TTestReportLayoutDom }
  1053. Procedure FillLayout(FL : TFPReportLayout);
  1054. begin
  1055. FL.Top:=1.2;
  1056. FL.Left:=3.4;
  1057. FL.Width:=5.6;
  1058. FL.Height:=7.8;
  1059. end;
  1060. procedure TTestReportLayoutDom.FillFL;
  1061. begin
  1062. FillLayout(FL);
  1063. end;
  1064. procedure TTestReportLayoutDom.Setup;
  1065. begin
  1066. inherited Setup;
  1067. FL:=TFPReportLayout.Create(Nil);
  1068. F2:=TFPReportLayout.Create(Nil);
  1069. end;
  1070. procedure TTestReportLayoutDom.TearDown;
  1071. begin
  1072. FreeAndNil(FL);
  1073. FreeAndNil(F2);
  1074. inherited TearDown;
  1075. end;
  1076. procedure TTestReportLayoutDom.TestWrite;
  1077. var
  1078. FDoc: TJSONObject;
  1079. begin
  1080. FillFL;
  1081. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  1082. FDoc := FRD.JSON;
  1083. FL.WriteElement(FRD, nil);
  1084. // compare json directly
  1085. AssertEquals('Failed on 1', 1.2, FDoc.Get('Top', 0.0));
  1086. AssertEquals('Failed on 2', 3.4, FDoc.Get('Left', 0.0));
  1087. AssertEquals('Failed on 3', 5.6, FDoc.Get('Width', 0.0));
  1088. AssertEquals('Failed en 4', 7.8, FDoc.Get('Height', 0.0));
  1089. // compare via streamer interface
  1090. AssertEquals('Failed on 5', 1.2, FRD.ReadFloat('Top', 0.0));
  1091. AssertEquals('Failed on 6', 3.4, FRD.ReadFloat('Left', 0.0));
  1092. AssertEquals('Failed on 7', 5.6, FRD.ReadFloat('Width', 0.0));
  1093. AssertEquals('Failed en 8', 7.8, FRD.ReadFloat('Height', 0.0));
  1094. end;
  1095. procedure TTestReportLayoutDom.TestWriteDiff;
  1096. var
  1097. FDoc: TJSONObject;
  1098. begin
  1099. FillFL;
  1100. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  1101. FDoc := FRD.JSON;
  1102. FL.WriteElement(FRD, F2);
  1103. AssertEquals('Failed on 1', 1.2, FDoc.Get('Top', 0.0));
  1104. AssertEquals('Failed on 2', 3.4, FDoc.Get('Left', 0.0));
  1105. AssertEquals('Failed on 3', 5.6, FDoc.Get('Width', 0.0));
  1106. AssertEquals('Failed en 4', 7.8, FDoc.Get('Height', 0.0));
  1107. end;
  1108. procedure TTestReportLayoutDom.TestRead;
  1109. var
  1110. FDoc: TJSONObject;
  1111. begin
  1112. FillFL;
  1113. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  1114. FDoc := FRD.JSON;
  1115. FL.WriteElement(FRD, nil);
  1116. F2.ReadElement(FRD);
  1117. AssertEquals('Failed on 1', FL.Top, F2.Top);
  1118. AssertEquals('Failed on 2', FL.Left, F2.Left);
  1119. AssertEquals('Failed on 3', FL.Width, F2.Width);
  1120. AssertEquals('Failed on 4', FL.Height, F2.Height);
  1121. end;
  1122. { TTestReportElementDOM }
  1123. procedure TTestReportElementDOM.FillFE;
  1124. begin
  1125. FillLayout(FE.Layout);
  1126. FillFrame(FE.Frame);
  1127. end;
  1128. procedure TTestReportElementDOM.Setup;
  1129. begin
  1130. inherited Setup;
  1131. FE:=TFPReportElement.Create(Nil);
  1132. F2:=TFPReportElement.Create(Nil);
  1133. // FRD.JSON.Add('element');
  1134. end;
  1135. procedure TTestReportElementDOM.TearDown;
  1136. begin
  1137. FreeAndNil(F2);
  1138. FreeAndNil(FE);
  1139. inherited TearDown;
  1140. end;
  1141. procedure TTestReportElementDOM.TestWrite1;
  1142. var
  1143. E: TJSONObject;
  1144. begin
  1145. FillFE;
  1146. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  1147. FE.WriteElement(FRD, nil);
  1148. E := TJSONObject(FRD.FindChild('Layout'));
  1149. AssertNotNull('Failed on 1', E);
  1150. FRD.PushElement(E);
  1151. try
  1152. AssertEquals('Failed on 2', 1.2, FRD.ReadFloat('Top', 0.0));
  1153. AssertEquals('Failed on 3', 3.4, FRD.ReadFloat('Left', 0.0));
  1154. AssertEquals('Failed on 4', 5.6, FRD.ReadFloat('Width', 0.0));
  1155. AssertEquals('Failed en 5', 7.8, FRD.ReadFloat('Height', 0.0));
  1156. finally
  1157. FRD.PopElement;
  1158. end;
  1159. E := TJSONObject(FRD.FindChild('Frame'));
  1160. AssertNotNull('Failed on 6', E);
  1161. FRD.PushElement(E);
  1162. try
  1163. AssertEquals('Failed on 7', 2, FRD.ReadInteger('Width', 1));
  1164. AssertEquals('Failed on 8', 'psDot', FRD.ReadString('Pen', 'psSolid'));
  1165. AssertEquals('Failed on 9', 'fsRoundedRect', FRD.ReadString('Shape', 'fsNone'));
  1166. AssertEquals('Failed on 10', 23, FRD.ReadInteger('Color', 0));
  1167. AssertEquals('Failed on 11', Integer([flTop,flBottom]), FRD.ReadInteger('Lines', 0));
  1168. finally
  1169. FRD.PopElement;
  1170. end;
  1171. end;
  1172. procedure TTestReportElementDOM.TestWriteDiff1;
  1173. var
  1174. E: TJSONObject;
  1175. begin
  1176. FillFE;
  1177. AssertTrue('Failed on 0.1', FRD is TFPReportJSONStreamer);
  1178. E := FRD.CurrentElement;
  1179. FE.WriteElement(FRD, F2);
  1180. AssertSame('Failed on 0.2', E, FRD.CurrentElement);
  1181. E := TJSONObject(FRD.FindChild('Layout'));
  1182. AssertNotNull('Failed on 1', E);
  1183. FRD.PushElement(E);
  1184. try
  1185. AssertEquals('Failed on 2', 1.2, FRD.ReadFloat('Top', 0.0));
  1186. AssertEquals('Failed on 3', 3.4, FRD.ReadFloat('Left', 0.0));
  1187. AssertEquals('Failed on 4', 5.6, FRD.ReadFloat('Width', 0.0));
  1188. AssertEquals('Failed en 5', 7.8, FRD.ReadFloat('Height', 0.0));
  1189. finally
  1190. FRD.PopElement;
  1191. end;
  1192. E := TJSONObject(FRD.FindChild('Frame'));
  1193. AssertNotNull('Failed on 6', E);
  1194. FRD.PushElement(E);
  1195. try
  1196. AssertEquals('Failed on 7', 2, FRD.ReadInteger('Width', 1));
  1197. AssertEquals('Failed on 8', 'psDot', FRD.ReadString('Pen', 'psSolid'));
  1198. AssertEquals('Failed on 9', 'fsRoundedRect', FRD.ReadString('Shape', 'fsNone'));
  1199. AssertEquals('Failed on 10', 23, FRD.ReadInteger('Color', 0));
  1200. AssertEquals('Failed on 11', Integer([flTop,flBottom]), FRD.ReadInteger('Lines', 0));
  1201. finally
  1202. FRD.PopElement;
  1203. end;
  1204. end;
  1205. procedure TTestReportElementDOM.TestWriteDiff2;
  1206. var
  1207. E: TJSONObject;
  1208. begin
  1209. FillFE;
  1210. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  1211. E := FRD.CurrentElement;
  1212. F2.Frame.Assign(FE.Frame);
  1213. FE.WriteElement(FRD, F2);
  1214. AssertSame('Failed on 1', E, FRD.CurrentElement);
  1215. E := TJSONObject(FRD.FindChild('Layout'));
  1216. AssertNotNull('Failed on 2', E); // Layout was saved
  1217. E := TJSONObject(FRD.FindChild('Frame'));
  1218. AssertNull('Failed on 3', E); // Frame was not saved
  1219. end;
  1220. procedure TTestReportElementDOM.TestRead1;
  1221. begin
  1222. FillFE;
  1223. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  1224. FE.WriteElement(FRD, nil);
  1225. F2.ReadElement(FRD);
  1226. AssertEquals('Failed on 1', True, FE.Layout.Equals(F2.Layout));
  1227. AssertEquals('Failed on 2', True, FE.Frame.Equals(F2.Frame));
  1228. AssertEquals('Failed on 3', True, FE.Equals(F2));
  1229. F2.Visible := False;
  1230. AssertEquals('Failed on 4', False, FE.Equals(F2));
  1231. end;
  1232. procedure TTestReportElementDOM.TestRead2;
  1233. begin
  1234. FillFE;
  1235. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  1236. F2.Frame.Assign(FE.Frame);
  1237. // Only layout is written
  1238. FE.WriteElement(FRD, F2);
  1239. FreeAndNil(F2);
  1240. F2 := TFPReportElement.Create(Nil);
  1241. F2.ReadElement(FRD);
  1242. AssertEquals('Failed on 1', True, FE.Layout.Equals(F2.Layout));
  1243. AssertEquals('Failed on 2', False, FE.Frame.Equals(F2.Frame));
  1244. AssertEquals('Failed on 3', False, FE.Equals(F2));
  1245. end;
  1246. { TTestReportElementWithChildrenDOM }
  1247. procedure TTestReportElementWithChildrenDOM.FillFE;
  1248. var
  1249. E: TFPReportElement;
  1250. begin
  1251. FillLayout(FE.Layout);
  1252. FillFrame(FE.Frame);
  1253. // child 1
  1254. E := TFPReportMemo.Create(FE);
  1255. E.Name := 'Memo1';
  1256. E.Visible := True;
  1257. E.Layout.Left := 1;
  1258. // child 2
  1259. E := TFPReportMemo.Create(FE);
  1260. E.Name := 'Memo2';
  1261. E.Visible := False;
  1262. E.Layout.Left := 2;
  1263. end;
  1264. procedure TTestReportElementWithChildrenDOM.Setup;
  1265. begin
  1266. inherited Setup;
  1267. FE := TFPReportElementWithChildren.Create(Nil);
  1268. FE.Name := 'Component1';
  1269. F2 := TFPReportElementWithChildren.Create(Nil);
  1270. F2.Name := 'Component2';
  1271. end;
  1272. procedure TTestReportElementWithChildrenDOM.TearDown;
  1273. begin
  1274. FreeAndNil(F2);
  1275. FreeAndNil(FE);
  1276. inherited TearDown;
  1277. end;
  1278. procedure TTestReportElementWithChildrenDOM.TestWrite;
  1279. var
  1280. E: TJSONObject;
  1281. begin
  1282. FillFE;
  1283. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  1284. FE.WriteElement(FRD, nil);
  1285. E := TJSONObject(FRD.FindChild('Layout'));
  1286. AssertNotNull('Failed on 1', E);
  1287. FRD.PushElement(E);
  1288. try
  1289. AssertEquals('Failed on 2', 1.2, FRD.ReadFloat('Top', 0.0));
  1290. AssertEquals('Failed on 3', 3.4, FRD.ReadFloat('Left', 0.0));
  1291. AssertEquals('Failed on 4', 5.6, FRD.ReadFloat('Width', 0.0));
  1292. AssertEquals('Failed en 5', 7.8, FRD.ReadFloat('Height', 0.0));
  1293. finally
  1294. FRD.PopElement;
  1295. end;
  1296. E := TJSONObject(FRD.FindChild('Children'));
  1297. AssertNotNull('Failed on 6', E);
  1298. FRD.PushElement(E);
  1299. try
  1300. AssertEquals('Failed on 7', 2, FRD.ChildCount);
  1301. // child 1
  1302. E := TJSONObject(FRD.GetChild(0));
  1303. FRD.PushElement(E);
  1304. try
  1305. AssertEquals('Failed on 8', True, FRD.ReadBoolean('Visible', False));
  1306. finally
  1307. FRD.PopElement;
  1308. end;
  1309. // child 2
  1310. E := TJSONObject(FRD.GetChild(1));
  1311. FRD.PushElement(E);
  1312. try
  1313. AssertEquals('Failed on 9', False, FRD.ReadBoolean('Visible', True));
  1314. finally
  1315. FRD.PopElement;
  1316. end;
  1317. finally
  1318. FRD.PopElement;
  1319. end;
  1320. end;
  1321. procedure TTestReportElementWithChildrenDOM.TestRead;
  1322. begin
  1323. FillFE;
  1324. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  1325. FE.WriteElement(FRD, nil);
  1326. F2.ReadElement(FRD);
  1327. AssertEquals('Failed on 1', True, FE.Layout.Equals(F2.Layout));
  1328. AssertEquals('Failed on 2', True, FE.Frame.Equals(F2.Frame));
  1329. AssertEquals('Failed on 3', True, FE.Equals(F2));
  1330. F2.Visible := False;
  1331. AssertEquals('Failed on 4', False, FE.Equals(F2));
  1332. end;
  1333. { TTestReportPageHeader }
  1334. procedure TTestReportPageHeader.FillFE;
  1335. var
  1336. E: TFPReportMemo;
  1337. begin
  1338. FillLayout(FE.Layout);
  1339. FillFrame(FE.Frame);
  1340. // child 1
  1341. E := TFPReportMemo.Create(FE);
  1342. E.Name := 'Memo1';
  1343. E.Visible := True;
  1344. E.Layout.Left := 1;
  1345. // child 2
  1346. E := TFPReportMemo.Create(FE);
  1347. E.Name := 'Memo2';
  1348. E.Visible := False;
  1349. E.Layout.Left := 2;
  1350. E.TextAlignment.Horizontal := taCentered;
  1351. E.TextAlignment.Vertical := tlCenter;
  1352. end;
  1353. procedure TTestReportPageHeader.Setup;
  1354. begin
  1355. inherited Setup;
  1356. FE := TFPReportPageHeaderBand.Create(Nil);
  1357. FE.Name := 'Component1';
  1358. F2 := TFPReportPageHeaderBand.Create(Nil);
  1359. F2.Name := 'Component2';
  1360. end;
  1361. procedure TTestReportPageHeader.TearDown;
  1362. begin
  1363. FreeAndNil(F2);
  1364. FreeAndNil(FE);
  1365. inherited TearDown;
  1366. end;
  1367. procedure TTestReportPageHeader.TestWrite;
  1368. var
  1369. E: TJSONObject;
  1370. begin
  1371. FillFE;
  1372. AssertTrue('Failed on 0', FRD is TFPReportJSONStreamer);
  1373. FE.WriteElement(FRD, nil);
  1374. E := TJSONObject(FRD.FindChild('Layout'));
  1375. AssertNotNull('Failed on 1', E);
  1376. FRD.PushElement(E);
  1377. try
  1378. AssertEquals('Failed on 2', 1.2, FRD.ReadFloat('Top', 0.0));
  1379. AssertEquals('Failed on 3', 3.4, FRD.ReadFloat('Left', 0.0));
  1380. AssertEquals('Failed on 4', 5.6, FRD.ReadFloat('Width', 0.0));
  1381. AssertEquals('Failed en 5', 7.8, FRD.ReadFloat('Height', 0.0));
  1382. finally
  1383. FRD.PopElement;
  1384. end;
  1385. E := TJSONObject(FRD.FindChild('Children'));
  1386. AssertNotNull('Failed on 6', E);
  1387. FRD.PushElement(E);
  1388. try
  1389. AssertEquals('Failed on 7', 2, FRD.ChildCount);
  1390. // child 1
  1391. E := TJSONObject(FRD.GetChild(0));
  1392. FRD.PushElement(E);
  1393. try
  1394. AssertEquals('Failed on 8', True, FRD.ReadBoolean('Visible', False));
  1395. finally
  1396. FRD.PopElement;
  1397. end;
  1398. // child 2
  1399. E := TJSONObject(FRD.GetChild(1));
  1400. FRD.PushElement(E);
  1401. try
  1402. AssertEquals('Failed on 9', False, FRD.ReadBoolean('Visible', True));
  1403. finally
  1404. FRD.PopElement;
  1405. end;
  1406. finally
  1407. FRD.PopElement;
  1408. end;
  1409. E := TJSONObject(FRD.FindChild('VisibleOnPage'));
  1410. AssertNotNull('Failed on 10', E);
  1411. AssertEquals('Failed on 11', 'vpAll', E.Value);
  1412. end;
  1413. procedure TTestReportPageHeader.TestWrite2;
  1414. var
  1415. E: TJSONObject;
  1416. begin
  1417. FillFE;
  1418. FE.VisibleOnPage := vpNotOnFirst;
  1419. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  1420. FE.WriteElement(FRD, nil);
  1421. E := TJSONObject(FRD.FindChild('VisibleOnPage'));
  1422. AssertNotNull('Failed on 2', E);
  1423. AssertEquals('Failed on 3', 'vpNotOnFirst', E.Value);
  1424. end;
  1425. procedure TTestReportPageHeader.TestRead;
  1426. begin
  1427. FillFE;
  1428. FE.VisibleOnPage := vpNotOnFirst; // a non-default value
  1429. AssertTrue('Failed on 1', FRD is TFPReportJSONStreamer);
  1430. FE.WriteElement(FRD, nil);
  1431. F2.ReadElement(FRD);
  1432. AssertEquals('Failed on 2', True, FE.Layout.Equals(F2.Layout));
  1433. AssertEquals('Failed on 3', True, FE.Frame.Equals(F2.Frame));
  1434. AssertEquals('Failed on 4', True, FE.Equals(F2));
  1435. F2.Visible := False;
  1436. AssertEquals('Failed on 5', False, FE.Equals(F2));
  1437. end;
  1438. initialization
  1439. RegisterTests(
  1440. [
  1441. TTestReportDOM,
  1442. TTestReportFrameDom,
  1443. TTestReportLayoutDom,
  1444. TTestReportElementDOM,
  1445. TTestReportElementWithChildrenDOM,
  1446. TTestReportPageHeader
  1447. ]);
  1448. end.