fppdf_test.pas 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655
  1. unit fppdf_test;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils
  6. {$ifdef fptest}
  7. ,TestFramework
  8. {$else}
  9. ,fpcunit, testutils, testregistry
  10. {$endif}
  11. ,fppdf
  12. ;
  13. type
  14. TBasePDFTest = class(TTestCase)
  15. private
  16. FPDF: TPDFDocument;
  17. FStream: TStringStream;
  18. protected
  19. procedure SetUp; override;
  20. procedure TearDown; override;
  21. public
  22. property PDF: TPDFDocument read FPDF;
  23. property S: TStringStream read FStream;
  24. end;
  25. TTestPDFObject = class(TBasePDFTest)
  26. published
  27. procedure TestFloatStr;
  28. procedure TestWriteString;
  29. end;
  30. TTestTPDFDocumentObject = class(TBasePDFTest)
  31. published
  32. procedure TestSetWidth;
  33. end;
  34. TTestPDFBoolean = class(TBasePDFTest)
  35. published
  36. procedure TestWriteTrue;
  37. procedure TestWriteFalse;
  38. end;
  39. TTestPDFMoveTo = class(TBasePDFTest)
  40. published
  41. procedure TestCommandPDFFloat;
  42. procedure TestCommandPDFCoord;
  43. end;
  44. TTestPDFInteger = class(TBasePDFTest)
  45. published
  46. procedure TestWrite;
  47. end;
  48. TTestPDFReference = class(TBasePDFTest)
  49. published
  50. procedure TestWrite;
  51. end;
  52. TTestPDFName = class(TBasePDFTest)
  53. published
  54. procedure TestWrite;
  55. procedure TestValidNames1;
  56. procedure TestValidNames2;
  57. end;
  58. TTestPDFString = class(TBasePDFTest)
  59. published
  60. procedure TestWrite;
  61. procedure TestWriteEscaped;
  62. procedure TestWriteEscaped2;
  63. end;
  64. TTestPDFArray = class(TBasePDFTest)
  65. published
  66. procedure TestWrite;
  67. end;
  68. TTestPDFStream = class(TBasePDFTest)
  69. published
  70. procedure TestWrite;
  71. end;
  72. TTestPDFEmbeddedFont = class(TBasePDFTest)
  73. published
  74. procedure TestWrite;
  75. procedure TestWriteEmbeddedFont;
  76. end;
  77. TTestPDFText = class(TBasePDFTest)
  78. published
  79. procedure TestWrite;
  80. end;
  81. TTestPDFLineSegment = class(TBasePDFTest)
  82. published
  83. procedure TestCommand;
  84. procedure TestWrite;
  85. end;
  86. TTestTPDFRectangle = class(TBasePDFTest)
  87. published
  88. procedure TestWrite_NoFill_NoStroke;
  89. procedure TestWrite_Fill_Stroke;
  90. procedure TestWrite_NoFill_Stroke;
  91. procedure TestWrite_Fill_NoStroke;
  92. end;
  93. TTestPDFCurveC = class(TBasePDFTest)
  94. published
  95. procedure TestCommand;
  96. procedure TestWrite_Stroke;
  97. procedure TestWrite_NoStroke;
  98. end;
  99. TTestPDFCurveV = class(TBasePDFTest)
  100. published
  101. procedure TestWrite_Stroke;
  102. procedure TestWrite_NoStroke;
  103. end;
  104. TTestPDFCurveY = class(TBasePDFTest)
  105. published
  106. procedure TestWrite_Stroke;
  107. procedure TestWrite_NoStroke;
  108. end;
  109. TTestPDFEllipse = class(TBasePDFTest)
  110. published
  111. procedure TestWrite_NoFill_NoStroke;
  112. procedure TestWrite_Fill_NoStroke;
  113. procedure TestWrite_NoFill_Stroke;
  114. procedure TestWrite_Fill_Stroke;
  115. end;
  116. TTestPDFSurface = class(TBasePDFTest)
  117. published
  118. procedure TestWrite;
  119. procedure TestWrite_noFill;
  120. procedure TestWrite_noClose;
  121. end;
  122. TTestPDFImage = class(TBasePDFTest)
  123. published
  124. procedure TestWrite;
  125. end;
  126. TTestPDFLineStyle = class(TBasePDFTest)
  127. published
  128. procedure TestWrite_ppsSolid;
  129. procedure TestWrite_ppsDash;
  130. procedure TestWrite_ppsDot;
  131. procedure TestWrite_ppsDashDot;
  132. procedure TestWrite_ppsDashDotDot;
  133. end;
  134. TTestPDFColor = class(TBasePDFTest)
  135. published
  136. procedure TestWrite_Stroke;
  137. procedure TestWrite_noStroke;
  138. end;
  139. TTestPDFDictionaryItem = class(TBasePDFTest)
  140. published
  141. procedure TestWrite;
  142. end;
  143. TTestPDFDictionary = class(TBasePDFTest)
  144. published
  145. procedure TestWrite;
  146. end;
  147. TTestPDFXRef = class(TBasePDFTest)
  148. published
  149. procedure TestWrite;
  150. end;
  151. TTestPDFPage = class(TBasePDFTest)
  152. published
  153. procedure TestPageDocument;
  154. procedure TestPageDefaultUnitOfMeasure;
  155. procedure TestMatrix;
  156. procedure TestUnitOfMeasure_MM;
  157. procedure TestUnitOfMeasure_Inches;
  158. procedure TestUnitOfMeasure_CM;
  159. end;
  160. TTestCompressionDecompression = class(TTestCase)
  161. private
  162. function GetTestString: string;
  163. published
  164. procedure TestStreamCompressionDecompression;
  165. procedure TestStringCompressionDecompression;
  166. end;
  167. TTestTPDFImageItem = class(TTestCase)
  168. published
  169. procedure TestCreateStreamedData;
  170. end;
  171. implementation
  172. uses
  173. FPImage;
  174. type
  175. // so we can access Protected methods in the tests
  176. TMockPDFObject = class(TPDFObject);
  177. TMockPDFDocumentObject = class(TPDFDocumentObject);
  178. TMockPDFBoolean = class(TPDFBoolean);
  179. TMockPDFMoveTo = class(TPDFMoveTo);
  180. TMockPDFInteger = class(TPDFInteger);
  181. TMockPDFReference = class(TPDFReference);
  182. TMockPDFName = class(TPDFName);
  183. TMockPDFString = class(TPDFString);
  184. TMockPDFArray = class(TPDFArray);
  185. TMockPDFStream = class(TPDFStream);
  186. TMockPDFEmbeddedFont = class(TPDFEmbeddedFont);
  187. TMockPDFText = class(TPDFText);
  188. TMockPDFLineSegment = class(TPDFLineSegment);
  189. TMockPDFRectangle = class(TPDFRectangle);
  190. TMockPDFCurveC = class(TPDFCurveC);
  191. TMockPDFCurveV = class(TPDFCurveV);
  192. TMockPDFCurveY = class(TPDFCurveY);
  193. TMockPDFEllipse = class(TPDFEllipse);
  194. TMockPDFSurface = class(TPDFSurface);
  195. TMockPDFImage = class(TPDFImage);
  196. TMockPDFLineStyle = class(TPDFLineStyle);
  197. TMockPDFColor = class(TPDFColor);
  198. TMockPDFDictionaryItem = class(TPDFDictionaryItem);
  199. TMockPDFDictionary = class(TPDFDictionary);
  200. TMockPDFXRef = class(TPDFXRef);
  201. TMockPDFPage = class(TPDFPage);
  202. { TBasePDFTest }
  203. procedure TBasePDFTest.SetUp;
  204. begin
  205. inherited SetUp;
  206. FPDF := TPDFDocument.Create(nil);
  207. FStream := TStringStream.Create('');
  208. end;
  209. procedure TBasePDFTest.TearDown;
  210. begin
  211. FStream.Free;
  212. FPDF.Free;
  213. inherited TearDown;
  214. end;
  215. { TTestPDFObject }
  216. procedure TTestPDFObject.TestFloatStr;
  217. begin
  218. AssertEquals('Failed on 1', '0.12', TMockPDFObject.FloatStr(TPDFFLoat(0.12)));
  219. AssertEquals('Failed on 2', '12', TMockPDFObject.FloatStr(TPDFFLoat(12.00)));
  220. AssertEquals('Failed on 3', '12.3', TMockPDFObject.FloatStr(TPDFFLoat(12.30)));
  221. AssertEquals('Failed on 4', '12.34', TMockPDFObject.FloatStr(TPDFFLoat(12.34)));
  222. end;
  223. procedure TTestPDFObject.TestWriteString;
  224. var
  225. o: TMockPDFObject;
  226. begin
  227. o := TMockPDFObject.Create(PDF);
  228. try
  229. o.WriteString('Hello', S);
  230. AssertEquals('Failed on 1', 'Hello', s.DataString);
  231. finally
  232. o.Free;
  233. end;
  234. end;
  235. { TTestTPDFDocumentObject }
  236. procedure TTestTPDFDocumentObject.TestSetWidth;
  237. var
  238. o: TMockPDFDocumentObject;
  239. begin
  240. o := TMockPDFDocumentObject.Create(PDF);
  241. try
  242. o.SetWidth(TPDFFloat(300.5), S);
  243. AssertEquals('Failed on 1',
  244. '1 J'+CRLF+
  245. '300.5 w'+CRLF, // line width
  246. s.DataString);
  247. // this shouldn't cause any change
  248. o.SetWidth(TPDFFloat(300.5), S);
  249. AssertEquals('Failed on 1',
  250. '1 J'+CRLF+
  251. '300.5 w'+CRLF, // line width
  252. s.DataString);
  253. // but this will
  254. o.SetWidth(TPDFFloat(123), S);
  255. AssertEquals('Failed on 1',
  256. '1 J'+CRLF+
  257. '300.5 w'+CRLF+ // line width 300.5
  258. '1 J'+CRLF+
  259. '123 w'+CRLF, // line width 123
  260. s.DataString);
  261. finally
  262. o.Free;
  263. end;
  264. end;
  265. { TTestPDFBoolean }
  266. procedure TTestPDFBoolean.TestWriteTrue;
  267. var
  268. o: TPDFBoolean;
  269. begin
  270. o := TPDFBoolean.Create(PDF, True);
  271. try
  272. AssertEquals('Failed on 1', '', S.DataString);
  273. TMockPDFBoolean(o).Write(S);
  274. AssertEquals('Failed on 2', 'true', S.DataString);
  275. finally
  276. o.Free;
  277. end;
  278. end;
  279. procedure TTestPDFBoolean.TestWriteFalse;
  280. var
  281. o: TPDFBoolean;
  282. begin
  283. o := TPDFBoolean.Create(PDF, False);
  284. try
  285. AssertEquals('Failed on 1', '', S.DataString);
  286. TMockPDFBoolean(o).Write(S);
  287. AssertEquals('Failed on 2', 'false', S.DataString);
  288. finally
  289. o.Free;
  290. end;
  291. end;
  292. { TTestPDFMoveTo }
  293. procedure TTestPDFMoveTo.TestCommandPDFFloat;
  294. var
  295. o: TPDFMoveTo;
  296. begin
  297. o := TPDFMoveTo.Create(PDF, 10, 20);
  298. try
  299. AssertEquals('Failed on 1', '', S.DataString);
  300. TMockPDFMoveTo(o).Write(S);
  301. AssertEquals('Failed on 2', '10 20 m'+CRLF, S.DataString);
  302. finally
  303. o.Free;
  304. end;
  305. end;
  306. procedure TTestPDFMoveTo.TestCommandPDFCoord;
  307. var
  308. c: TPDFCoord;
  309. o: TPDFMoveTo;
  310. begin
  311. c.X := 10;
  312. c.Y := 20;
  313. o := TPDFMoveTo.Create(PDF, c);
  314. try
  315. AssertEquals('Failed on 1', '', S.DataString);
  316. TMockPDFMoveTo(o).Write(S);
  317. AssertEquals('Failed on 2', '10 20 m'+CRLF, S.DataString);
  318. finally
  319. o.Free;
  320. end;
  321. end;
  322. { TTestPDFInteger }
  323. procedure TTestPDFInteger.TestWrite;
  324. var
  325. o: TPDFInteger;
  326. begin
  327. o := TPDFInteger.Create(PDF, 15);
  328. try
  329. AssertEquals('Failed on 1', '', S.DataString);
  330. TMockPDFInteger(o).Write(S);
  331. AssertEquals('Failed on 2', '15', S.DataString);
  332. TMockPDFInteger(o).inc;
  333. TMockPDFInteger(o).Write(S);
  334. AssertEquals('Failed on 3', '1516', S.DataString);
  335. finally
  336. o.Free;
  337. end;
  338. end;
  339. { TTestPDFReference }
  340. procedure TTestPDFReference.TestWrite;
  341. var
  342. o: TPDFReference;
  343. begin
  344. o := TPDFReference.Create(PDF, 10);
  345. try
  346. AssertEquals('Failed on 1', '', S.DataString);
  347. TMockPDFReference(o).Write(S);
  348. AssertEquals('Failed on 2', '10 0 R', S.DataString);
  349. finally
  350. o.Free;
  351. end;
  352. end;
  353. { TTestPDFName }
  354. procedure TTestPDFName.TestWrite;
  355. var
  356. o: TPDFName;
  357. begin
  358. o := TPDFName.Create(PDF, 'Test');
  359. try
  360. AssertEquals('Failed on 1', '', S.DataString);
  361. TMockPDFName(o).Write(S);
  362. AssertEquals('Failed on 2', '/Test', S.DataString);
  363. finally
  364. o.Free;
  365. end;
  366. { Length1 seems to be a special case? }
  367. o := TPDFName.Create(PDF, 'Length1');
  368. try
  369. TMockPDFName(o).Write(S);
  370. AssertEquals('Failed on 2', '/Test/Length1', S.DataString);
  371. finally
  372. o.Free;
  373. end;
  374. end;
  375. procedure TTestPDFName.TestValidNames1;
  376. var
  377. o: TPDFName;
  378. begin
  379. o := TPDFName.Create(PDF, 'paired()parentheses');
  380. try
  381. AssertEquals('Failed on 1', '', S.DataString);
  382. TMockPDFName(o).Write(S);
  383. AssertEquals('Failed on 2', '/paired()parentheses', S.DataString);
  384. finally
  385. o.Free;
  386. end;
  387. end;
  388. procedure TTestPDFName.TestValidNames2;
  389. var
  390. o: TPDFName;
  391. begin
  392. o := TPDFName.Create(PDF, 'Adobe Green');
  393. try
  394. AssertEquals('Failed on 1', '', S.DataString);
  395. TMockPDFName(o).Write(S);
  396. AssertEquals('Failed on 2', '/Adobe Green', S.DataString);
  397. finally
  398. o.Free;
  399. end;
  400. end;
  401. { TTestPDFString }
  402. procedure TTestPDFString.TestWrite;
  403. var
  404. o: TPDFString;
  405. begin
  406. PDF.Options := []; // disable all compression
  407. o := TPDFString.Create(PDF, 'Test');
  408. try
  409. AssertEquals('Failed on 1', '', S.DataString);
  410. TMockPDFString(o).Write(S);
  411. AssertEquals('Failed on 2', '(Test)', S.DataString);
  412. finally
  413. o.Free;
  414. end;
  415. { Length1 seems to be a special case? }
  416. o := TPDFString.Create(PDF, #$C2#$A3+#$C2#$BB); // UTF-8 text of "£»"
  417. try
  418. TMockPDFString(o).Write(S); // write will convert UTF-8 to ANSI
  419. AssertEquals('Failed on 3', '(Test)('+#163#187+')', S.DataString);
  420. finally
  421. o.Free;
  422. end;
  423. end;
  424. { The symbols ( ) and \ get escaped before written to PDF }
  425. procedure TTestPDFString.TestWriteEscaped;
  426. var
  427. o: TPDFString;
  428. begin
  429. o := TPDFString.Create(PDF, 'a(b)c\def/g');
  430. try
  431. AssertEquals('Failed on 1', '', S.DataString);
  432. TMockPDFString(o).Write(S);
  433. AssertEquals('Failed on 2', '(a\(b\)c\\def/g)', S.DataString);
  434. finally
  435. o.Free;
  436. end;
  437. end;
  438. procedure TTestPDFString.TestWriteEscaped2;
  439. var
  440. o: TPDFString;
  441. begin
  442. o := TPDFString.Create(PDF, 'Special characters (*!&}^% and so on).');
  443. try
  444. AssertEquals('Failed on 1', '', S.DataString);
  445. TMockPDFString(o).Write(S);
  446. AssertEquals('Failed on 2', '(Special characters \(*!&}^% and so on\).)', S.DataString);
  447. finally
  448. o.Free;
  449. end;
  450. end;
  451. { TTestPDFArray }
  452. procedure TTestPDFArray.TestWrite;
  453. var
  454. o: TPDFArray;
  455. begin
  456. o := TPDFArray.Create(PDF);
  457. try
  458. AssertEquals('Failed on 1', '', S.DataString);
  459. TMockPDFArray(o).AddIntArray('1 2 3 4'); // no trailing space in string
  460. TMockPDFArray(o).Write(S);
  461. AssertEquals('Failed on 2', '[1 2 3 4]', S.DataString);
  462. TMockPDFArray(o).AddIntArray('1 2 3 4 '); // now we have a trailing space
  463. TMockPDFArray(o).Write(S);
  464. AssertEquals('Failed on 3', '[1 2 3 4][1 2 3 4 1 2 3 4]', S.DataString);
  465. finally
  466. o.Free;
  467. end;
  468. end;
  469. { TTestPDFStream }
  470. procedure TTestPDFStream.TestWrite;
  471. var
  472. o: TPDFStream;
  473. begin
  474. o := TPDFStream.Create(PDF, True);
  475. try
  476. TMockPDFStream(o).AddItem(TPDFString.Create(PDF, 'Hello World'));
  477. AssertEquals('Failed on 1', '', S.DataString);
  478. TMockPDFStream(o).Write(S);
  479. AssertEquals('Failed on 2', '(Hello World)', S.DataString);
  480. TMockPDFStream(o).AddItem(TPDFString.Create(PDF, '12345'));
  481. TMockPDFStream(o).Write(S);
  482. AssertEquals('Failed on 3', '(Hello World)(Hello World)(12345)', S.DataString);
  483. finally
  484. o.Free;
  485. end;
  486. end;
  487. { TTestPDFEmbeddedFont }
  488. procedure TTestPDFEmbeddedFont.TestWrite;
  489. var
  490. o: TPDFEmbeddedFont;
  491. begin
  492. o := TPDFEmbeddedFont.Create(PDF, 1, '16');
  493. try
  494. AssertEquals('Failed on 1', '', S.DataString);
  495. TMockPDFEmbeddedFont(o).Write(S);
  496. AssertEquals('Failed on 2', '/F1 16 Tf'+CRLF, S.DataString); // DON't change CRLF to anything else
  497. finally
  498. o.Free;
  499. end;
  500. end;
  501. procedure TTestPDFEmbeddedFont.TestWriteEmbeddedFont;
  502. var
  503. o: TPDFEmbeddedFont;
  504. lStream: TMemoryStream;
  505. str: String;
  506. begin
  507. PDF.Options := []; // disable compressed fonts
  508. str := 'Hello World';
  509. o := TPDFEmbeddedFont.Create(PDF, 1, '16');
  510. try
  511. AssertEquals('Failed on 1', '', S.DataString);
  512. lStream := TMemoryStream.Create;
  513. lStream.Write(str[1], Length(str));
  514. TMockPDFEmbeddedFont(o).WriteEmbeddedFont(PDF, lStream, S);
  515. lStream.Free;
  516. // DON't change CRLF to anything else
  517. AssertEquals('Failed on 2', CRLF+'stream'+CRLF+'Hello World'+CRLF+'endstream', S.DataString);
  518. finally
  519. o.Free;
  520. end;
  521. end;
  522. { TTestPDFText }
  523. procedure TTestPDFText.TestWrite;
  524. var
  525. o: TPDFText;
  526. x, y: TPDFFloat;
  527. begin
  528. x := 10.5;
  529. y := 20.0;
  530. o := TPDFText.Create(PDF, x, y, 'Hello World!');
  531. try
  532. AssertEquals('Failed on 1', '', S.DataString);
  533. TMockPDFText(o).Write(S);
  534. AssertEquals('Failed on 2',
  535. 'BT'+CRLF+
  536. '10.5 20 TD'+CRLF+
  537. '(Hello World!) Tj'+CRLF+
  538. 'ET'+CRLF,
  539. S.DataString);
  540. finally
  541. o.Free;
  542. end;
  543. end;
  544. { TTestPDFLineSegment }
  545. procedure TTestPDFLineSegment.TestCommand;
  546. var
  547. pos: TPDFCoord;
  548. begin
  549. pos.X := 10.0;
  550. pos.Y := 55.5;
  551. AssertEquals('Failed on 1', '10 55.5 l'+CRLF, TPDFLineSegment.Command(pos));
  552. end;
  553. procedure TTestPDFLineSegment.TestWrite;
  554. var
  555. o: TPDFLineSegment;
  556. Width, X1,Y1, X2,Y2: TPDFFLoat;
  557. begin
  558. Width := 2.0;
  559. X1 := 10.0;
  560. Y1 := 15.5;
  561. X2 := 50.0;
  562. Y2 := 55.5;
  563. o := TPDFLineSegment.Create(PDF, Width, X1, Y1, X2, Y2);
  564. try
  565. AssertEquals('Failed on 1', '', S.DataString);
  566. TMockPDFLineSegment(o).Write(S);
  567. AssertEquals('Failed on 2',
  568. '1 J'+CRLF+
  569. '2 w'+CRLF+ // line width
  570. '10 15.5 m'+CRLF+ // moveto command
  571. '50 55.5 l'+CRLF+ // line segment
  572. 'S'+CRLF, // end line segment
  573. S.DataString);
  574. finally
  575. o.Free;
  576. end;
  577. end;
  578. { TTestTPDFRectangle }
  579. procedure TTestTPDFRectangle.TestWrite_NoFill_NoStroke;
  580. var
  581. o: TMockPDFRectangle;
  582. lPosX, lPosY, lWidth, lHeight, lLineWidth: TPDFFLoat;
  583. begin
  584. lPosX := 10;
  585. lPosY := 11;
  586. lWidth := 100;
  587. lHeight := 200;
  588. lLineWidth := 1;
  589. o := TMockPDFRectangle.Create(PDF, lPosX, lPosY, lWidth, lHeight, lLineWidth, False, False);
  590. try
  591. AssertEquals('Failed on 1', '', S.DataString);
  592. o.Write(S);
  593. AssertEquals('Failed on 2',
  594. '10 11 100 200 re'+CRLF,
  595. S.DataString);
  596. finally
  597. o.Free;
  598. end;
  599. end;
  600. procedure TTestTPDFRectangle.TestWrite_Fill_Stroke;
  601. var
  602. o: TMockPDFRectangle;
  603. lPosX, lPosY, lWidth, lHeight, lLineWidth: TPDFFLoat;
  604. begin
  605. lPosX := 10;
  606. lPosY := 11;
  607. lWidth := 100;
  608. lHeight := 200;
  609. lLineWidth := 2;
  610. o := TMockPDFRectangle.Create(PDF, lPosX, lPosY, lWidth, lHeight, lLineWidth, True, True);
  611. try
  612. AssertEquals('Failed on 1', '', S.DataString);
  613. o.Write(S);
  614. AssertEquals('Failed on 2',
  615. '1 J'+CRLF+
  616. '2 w'+CRLF+
  617. '10 11 100 200 re'+CRLF+
  618. 'b'+CRLF,
  619. S.DataString);
  620. finally
  621. o.Free;
  622. end;
  623. end;
  624. procedure TTestTPDFRectangle.TestWrite_NoFill_Stroke;
  625. var
  626. o: TMockPDFRectangle;
  627. lPosX, lPosY, lWidth, lHeight, lLineWidth: TPDFFLoat;
  628. begin
  629. lPosX := 10;
  630. lPosY := 11;
  631. lWidth := 100;
  632. lHeight := 200;
  633. lLineWidth := 2;
  634. o := TMockPDFRectangle.Create(PDF, lPosX, lPosY, lWidth, lHeight, lLineWidth, False, True);
  635. try
  636. AssertEquals('Failed on 1', '', S.DataString);
  637. o.Write(S);
  638. AssertEquals('Failed on 2',
  639. '1 J'+CRLF+
  640. '2 w'+CRLF+
  641. '10 11 100 200 re'+CRLF+
  642. 'S'+CRLF,
  643. S.DataString);
  644. finally
  645. o.Free;
  646. end;
  647. end;
  648. procedure TTestTPDFRectangle.TestWrite_Fill_NoStroke;
  649. var
  650. o: TMockPDFRectangle;
  651. lPosX, lPosY, lWidth, lHeight, lLineWidth: TPDFFLoat;
  652. begin
  653. lPosX := 10;
  654. lPosY := 11;
  655. lWidth := 100;
  656. lHeight := 200;
  657. lLineWidth := 2;
  658. o := TMockPDFRectangle.Create(PDF, lPosX, lPosY, lWidth, lHeight, lLineWidth, True, False);
  659. try
  660. AssertEquals('Failed on 1', '', S.DataString);
  661. o.Write(S);
  662. AssertEquals('Failed on 2',
  663. '10 11 100 200 re'+CRLF+
  664. 'f'+CRLF,
  665. S.DataString);
  666. finally
  667. o.Free;
  668. end;
  669. end;
  670. { TTestPDFCurveC }
  671. procedure TTestPDFCurveC.TestCommand;
  672. var
  673. X1,Y1: TPDFFloat;
  674. X2,Y2: TPDFFloat;
  675. X3,Y3: TPDFFloat;
  676. s1: string;
  677. begin
  678. X1 := 10;
  679. Y1 := 11;
  680. X2 := 100;
  681. Y2 := 9;
  682. X3 := 200;
  683. Y3 := 250;
  684. s1 := TMockPDFCurveC.Command(x1, y1, x2, y2, x3, y3);
  685. AssertEquals('Failed on 1', '10 11 100 9 200 250 c'+CRLF, s1);
  686. end;
  687. procedure TTestPDFCurveC.TestWrite_Stroke;
  688. var
  689. o: TMockPDFCurveC;
  690. X1,Y1: TPDFFloat;
  691. X2,Y2: TPDFFloat;
  692. X3,Y3: TPDFFloat;
  693. lLineWidth: TPDFFLoat;
  694. begin
  695. X1 := 10;
  696. Y1 := 11;
  697. X2 := 100;
  698. Y2 := 9;
  699. X3 := 200;
  700. Y3 := 250;
  701. lLineWidth := 2;
  702. o := TMockPDFCurveC.Create(PDF, x1, y1, x2, y2, x3, y3, lLineWidth, True);
  703. try
  704. AssertEquals('Failed on 1', '', S.DataString);
  705. o.Write(S);
  706. AssertEquals('Failed on 2',
  707. '1 J'+CRLF+
  708. '2 w'+CRLF+
  709. '10 11 100 9 200 250 c'+CRLF+
  710. 'S'+CRLF,
  711. S.DataString);
  712. finally
  713. o.Free;
  714. end;
  715. end;
  716. procedure TTestPDFCurveC.TestWrite_NoStroke;
  717. var
  718. o: TMockPDFCurveC;
  719. X1,Y1: TPDFFloat;
  720. X2,Y2: TPDFFloat;
  721. X3,Y3: TPDFFloat;
  722. lLineWidth: TPDFFLoat;
  723. begin
  724. X1 := 10;
  725. Y1 := 11;
  726. X2 := 100;
  727. Y2 := 9;
  728. X3 := 200;
  729. Y3 := 250;
  730. lLineWidth := 2;
  731. o := TMockPDFCurveC.Create(PDF, x1, y1, x2, y2, x3, y3, lLineWidth, False);
  732. try
  733. AssertEquals('Failed on 1', '', S.DataString);
  734. o.Write(S);
  735. AssertEquals('Failed on 2',
  736. '10 11 100 9 200 250 c'+CRLF,
  737. S.DataString);
  738. finally
  739. o.Free;
  740. end;
  741. end;
  742. { TTestPDFCurveV }
  743. procedure TTestPDFCurveV.TestWrite_Stroke;
  744. var
  745. o: TMockPDFCurveV;
  746. X2,Y2: TPDFFloat;
  747. X3,Y3: TPDFFloat;
  748. lLineWidth: TPDFFLoat;
  749. begin
  750. X2 := 100;
  751. Y2 := 9;
  752. X3 := 200;
  753. Y3 := 250;
  754. lLineWidth := 2;
  755. o := TMockPDFCurveV.Create(PDF, x2, y2, x3, y3, lLineWidth, True);
  756. try
  757. AssertEquals('Failed on 1', '', S.DataString);
  758. o.Write(S);
  759. AssertEquals('Failed on 2',
  760. '1 J'+CRLF+
  761. '2 w'+CRLF+
  762. '100 9 200 250 v'+CRLF+
  763. 'S'+CRLF,
  764. S.DataString);
  765. finally
  766. o.Free;
  767. end;
  768. end;
  769. procedure TTestPDFCurveV.TestWrite_NoStroke;
  770. var
  771. o: TMockPDFCurveV;
  772. X2,Y2: TPDFFloat;
  773. X3,Y3: TPDFFloat;
  774. lLineWidth: TPDFFLoat;
  775. begin
  776. X2 := 100;
  777. Y2 := 9;
  778. X3 := 200;
  779. Y3 := 250;
  780. lLineWidth := 2;
  781. o := TMockPDFCurveV.Create(PDF, x2, y2, x3, y3, lLineWidth, False);
  782. try
  783. AssertEquals('Failed on 1', '', S.DataString);
  784. o.Write(S);
  785. AssertEquals('Failed on 2',
  786. '100 9 200 250 v'+CRLF,
  787. S.DataString);
  788. finally
  789. o.Free;
  790. end;
  791. end;
  792. { TTestPDFCurveY }
  793. procedure TTestPDFCurveY.TestWrite_Stroke;
  794. var
  795. o: TMockPDFCurveY;
  796. X2,Y2: TPDFFloat;
  797. X3,Y3: TPDFFloat;
  798. lLineWidth: TPDFFLoat;
  799. begin
  800. X2 := 100;
  801. Y2 := 9;
  802. X3 := 200;
  803. Y3 := 250;
  804. lLineWidth := 2;
  805. o := TMockPDFCurveY.Create(PDF, x2, y2, x3, y3, lLineWidth, True);
  806. try
  807. AssertEquals('Failed on 1', '', S.DataString);
  808. o.Write(S);
  809. AssertEquals('Failed on 2',
  810. '1 J'+CRLF+
  811. '2 w'+CRLF+
  812. '100 9 200 250 y'+CRLF+
  813. 'S'+CRLF,
  814. S.DataString);
  815. finally
  816. o.Free;
  817. end;
  818. end;
  819. procedure TTestPDFCurveY.TestWrite_NoStroke;
  820. var
  821. o: TMockPDFCurveY;
  822. X2,Y2: TPDFFloat;
  823. X3,Y3: TPDFFloat;
  824. lLineWidth: TPDFFLoat;
  825. begin
  826. X2 := 100;
  827. Y2 := 9;
  828. X3 := 200;
  829. Y3 := 250;
  830. lLineWidth := 2;
  831. o := TMockPDFCurveY.Create(PDF, x2, y2, x3, y3, lLineWidth, False);
  832. try
  833. AssertEquals('Failed on 1', '', S.DataString);
  834. o.Write(S);
  835. AssertEquals('Failed on 2',
  836. '100 9 200 250 y'+CRLF,
  837. S.DataString);
  838. finally
  839. o.Free;
  840. end;
  841. end;
  842. { TTestPDFEllipse }
  843. procedure TTestPDFEllipse.TestWrite_NoFill_NoStroke;
  844. var
  845. o: TMockPDFEllipse;
  846. lPosX, lPosY, lWidth, lHeight, lLineWidth: TPDFFloat;
  847. begin
  848. lPosX := 10;
  849. lPosY := 20;
  850. lWidth := 200;
  851. lHeight := 250;
  852. lLineWidth := 2;
  853. o := TMockPDFEllipse.Create(PDF, lPosX, lPosY, lWidth, lHeight, lLineWidth, False, False);
  854. try
  855. AssertEquals('Failed on 1', '', S.DataString);
  856. o.Write(S);
  857. AssertEquals('Failed on 2',
  858. // move to
  859. '10 145 m'+CRLF+
  860. // curveC 1
  861. '10 76.25 55 20 110 20 c'+CRLF+
  862. // curveC 2
  863. '165 20 210 76.25 210 145 c'+CRLF+
  864. // curveC 3
  865. '210 213.75 165 270 110 270 c'+CRLF+
  866. // curveC 4
  867. '55 270 10 213.75 10 145 c'+CRLF,
  868. S.DataString);
  869. finally
  870. o.Free;
  871. end;
  872. end;
  873. procedure TTestPDFEllipse.TestWrite_Fill_NoStroke;
  874. var
  875. o: TMockPDFEllipse;
  876. lPosX, lPosY, lWidth, lHeight, lLineWidth: TPDFFloat;
  877. begin
  878. lPosX := 10;
  879. lPosY := 20;
  880. lWidth := 200;
  881. lHeight := 250;
  882. lLineWidth := 2;
  883. o := TMockPDFEllipse.Create(PDF, lPosX, lPosY, lWidth, lHeight, lLineWidth, True, False);
  884. try
  885. AssertEquals('Failed on 1', '', S.DataString);
  886. o.Write(S);
  887. AssertEquals('Failed on 2',
  888. // move to
  889. '10 145 m'+CRLF+
  890. // curveC 1
  891. '10 76.25 55 20 110 20 c'+CRLF+
  892. // curveC 2
  893. '165 20 210 76.25 210 145 c'+CRLF+
  894. // curveC 3
  895. '210 213.75 165 270 110 270 c'+CRLF+
  896. // curveC 4
  897. '55 270 10 213.75 10 145 c'+CRLF+
  898. 'f'+CRLF,
  899. S.DataString);
  900. finally
  901. o.Free;
  902. end;
  903. end;
  904. procedure TTestPDFEllipse.TestWrite_NoFill_Stroke;
  905. var
  906. o: TMockPDFEllipse;
  907. lPosX, lPosY, lWidth, lHeight, lLineWidth: TPDFFloat;
  908. begin
  909. lPosX := 10;
  910. lPosY := 20;
  911. lWidth := 200;
  912. lHeight := 250;
  913. lLineWidth := 2;
  914. o := TMockPDFEllipse.Create(PDF, lPosX, lPosY, lWidth, lHeight, lLineWidth, False, True);
  915. try
  916. AssertEquals('Failed on 1', '', S.DataString);
  917. o.Write(S);
  918. AssertEquals('Failed on 2',
  919. '1 J'+CRLF+
  920. '2 w'+CRLF+
  921. // move to
  922. '10 145 m'+CRLF+
  923. // curveC 1
  924. '10 76.25 55 20 110 20 c'+CRLF+
  925. // curveC 2
  926. '165 20 210 76.25 210 145 c'+CRLF+
  927. // curveC 3
  928. '210 213.75 165 270 110 270 c'+CRLF+
  929. // curveC 4
  930. '55 270 10 213.75 10 145 c'+CRLF+
  931. 'S'+CRLF,
  932. S.DataString);
  933. finally
  934. o.Free;
  935. end;
  936. end;
  937. procedure TTestPDFEllipse.TestWrite_Fill_Stroke;
  938. var
  939. o: TMockPDFEllipse;
  940. lPosX, lPosY, lWidth, lHeight, lLineWidth: TPDFFloat;
  941. begin
  942. lPosX := 10;
  943. lPosY := 20;
  944. lWidth := 200;
  945. lHeight := 250;
  946. lLineWidth := 2;
  947. o := TMockPDFEllipse.Create(PDF, lPosX, lPosY, lWidth, lHeight, lLineWidth, True, True);
  948. try
  949. AssertEquals('Failed on 1', '', S.DataString);
  950. o.Write(S);
  951. AssertEquals('Failed on 2',
  952. '1 J'+CRLF+
  953. '2 w'+CRLF+
  954. // move to
  955. '10 145 m'+CRLF+
  956. // curveC 1
  957. '10 76.25 55 20 110 20 c'+CRLF+
  958. // curveC 2
  959. '165 20 210 76.25 210 145 c'+CRLF+
  960. // curveC 3
  961. '210 213.75 165 270 110 270 c'+CRLF+
  962. // curveC 4
  963. '55 270 10 213.75 10 145 c'+CRLF+
  964. 'b'+CRLF,
  965. S.DataString);
  966. finally
  967. o.Free;
  968. end;
  969. end;
  970. { TTestPDFSurface }
  971. procedure TTestPDFSurface.TestWrite;
  972. var
  973. o: TMockPDFSurface;
  974. ar: TPDFCoordArray;
  975. p1, p2, p3: TPDFCoord;
  976. begin
  977. SetLength(ar, 3);
  978. p1.X := 10; p1.Y := 20;
  979. p2.X := 30; p2.Y := 40;
  980. p3.X := 50; p3.Y := 60;
  981. ar[0] := p1;
  982. ar[1] := p2;
  983. ar[2] := p3;
  984. o := TMockPDFSurface.Create(PDF, ar, True, True);
  985. try
  986. AssertEquals('Failed on 1', '', S.DataString);
  987. o.Write(S);
  988. AssertEquals('Failed on 2',
  989. // move to - p0
  990. '10 20 m'+CRLF+
  991. // line segment - p1
  992. '30 40 l'+CRLF+
  993. // line segment - p2
  994. '50 60 l'+CRLF+
  995. 'h'+CRLF+ // close
  996. 'f'+CRLF, // fill
  997. S.DataString);
  998. finally
  999. SetLength(ar, 0);
  1000. o.Free;
  1001. end;
  1002. end;
  1003. procedure TTestPDFSurface.TestWrite_noFill;
  1004. var
  1005. o: TMockPDFSurface;
  1006. ar: TPDFCoordArray;
  1007. p1, p2, p3: TPDFCoord;
  1008. begin
  1009. SetLength(ar, 3);
  1010. p1.X := 10; p1.Y := 20;
  1011. p2.X := 30; p2.Y := 40;
  1012. p3.X := 50; p3.Y := 60;
  1013. ar[0] := p1;
  1014. ar[1] := p2;
  1015. ar[2] := p3;
  1016. o := TMockPDFSurface.Create(PDF, ar, True, False);
  1017. try
  1018. AssertEquals('Failed on 1', '', S.DataString);
  1019. o.Write(S);
  1020. AssertEquals('Failed on 2',
  1021. // move to - p0
  1022. '10 20 m'+CRLF+
  1023. // line segment - p1
  1024. '30 40 l'+CRLF+
  1025. // line segment - p2
  1026. '50 60 l'+CRLF+
  1027. 'h'+CRLF, // close
  1028. S.DataString);
  1029. finally
  1030. SetLength(ar, 0);
  1031. o.Free;
  1032. end;
  1033. end;
  1034. procedure TTestPDFSurface.TestWrite_noClose;
  1035. var
  1036. o: TMockPDFSurface;
  1037. ar: TPDFCoordArray;
  1038. p1, p2, p3: TPDFCoord;
  1039. begin
  1040. SetLength(ar, 3);
  1041. p1.X := 10; p1.Y := 20;
  1042. p2.X := 30; p2.Y := 40;
  1043. p3.X := 50; p3.Y := 60;
  1044. ar[0] := p1;
  1045. ar[1] := p2;
  1046. ar[2] := p3;
  1047. o := TMockPDFSurface.Create(PDF, ar, False, True);
  1048. try
  1049. AssertEquals('Failed on 1', '', S.DataString);
  1050. o.Write(S);
  1051. AssertEquals('Failed on 2',
  1052. // move to - p0
  1053. '10 20 m'+CRLF+
  1054. // line segment - p1
  1055. '30 40 l'+CRLF+
  1056. // line segment - p2
  1057. '50 60 l'+CRLF+
  1058. 'f'+CRLF, // fill
  1059. S.DataString);
  1060. finally
  1061. SetLength(ar, 0);
  1062. o.Free;
  1063. end;
  1064. end;
  1065. { TTestPDFImage }
  1066. procedure TTestPDFImage.TestWrite;
  1067. var
  1068. o: TMockPDFImage;
  1069. ar: TPDFCoordArray;
  1070. x, y: TPDFFLoat;
  1071. begin
  1072. x := 100;
  1073. y := 200;
  1074. o := TMockPDFImage.Create(PDF, x, y, 150, 75, 1);
  1075. try
  1076. AssertEquals('Failed on 1', '', S.DataString);
  1077. o.Write(S);
  1078. AssertEquals('Failed on 2',
  1079. // save graphics state
  1080. 'q'+CRLF+
  1081. '150 0 0 75 100 200 cm'+CRLF+
  1082. '/I1 Do'+CRLF+
  1083. // restore graphics state
  1084. 'Q'+CRLF,
  1085. S.DataString);
  1086. finally
  1087. SetLength(ar, 0);
  1088. o.Free;
  1089. end;
  1090. end;
  1091. { TTestPDFLineStyle }
  1092. procedure TTestPDFLineStyle.TestWrite_ppsSolid;
  1093. var
  1094. o: TMockPDFLineStyle;
  1095. begin
  1096. o := TMockPDFLineStyle.Create(PDF, ppsSolid, 1);
  1097. try
  1098. AssertEquals('Failed on 1', '', S.DataString);
  1099. o.Write(S);
  1100. AssertEquals('Failed on 2',
  1101. '[] 1 d'+CRLF,
  1102. S.DataString);
  1103. finally
  1104. o.Free;
  1105. end;
  1106. end;
  1107. procedure TTestPDFLineStyle.TestWrite_ppsDash;
  1108. var
  1109. o: TMockPDFLineStyle;
  1110. begin
  1111. o := TMockPDFLineStyle.Create(PDF, ppsDash, 2);
  1112. try
  1113. AssertEquals('Failed on 1', '', S.DataString);
  1114. o.Write(S);
  1115. AssertEquals('Failed on 2',
  1116. '[5 3] 2 d'+CRLF,
  1117. S.DataString);
  1118. finally
  1119. o.Free;
  1120. end;
  1121. end;
  1122. procedure TTestPDFLineStyle.TestWrite_ppsDot;
  1123. var
  1124. o: TMockPDFLineStyle;
  1125. begin
  1126. o := TMockPDFLineStyle.Create(PDF, ppsDot, 3);
  1127. try
  1128. AssertEquals('Failed on 1', '', S.DataString);
  1129. o.Write(S);
  1130. AssertEquals('Failed on 2',
  1131. '[1 3] 3 d'+CRLF,
  1132. S.DataString);
  1133. finally
  1134. o.Free;
  1135. end;
  1136. end;
  1137. procedure TTestPDFLineStyle.TestWrite_ppsDashDot;
  1138. var
  1139. o: TMockPDFLineStyle;
  1140. begin
  1141. o := TMockPDFLineStyle.Create(PDF, ppsDashDot, 4);
  1142. try
  1143. AssertEquals('Failed on 1', '', S.DataString);
  1144. o.Write(S);
  1145. AssertEquals('Failed on 2',
  1146. '[5 3 1 3] 4 d'+CRLF,
  1147. S.DataString);
  1148. finally
  1149. o.Free;
  1150. end;
  1151. end;
  1152. procedure TTestPDFLineStyle.TestWrite_ppsDashDotDot;
  1153. var
  1154. o: TMockPDFLineStyle;
  1155. begin
  1156. o := TMockPDFLineStyle.Create(PDF, ppsDashDotDot, 1);
  1157. try
  1158. AssertEquals('Failed on 1', '', S.DataString);
  1159. o.Write(S);
  1160. AssertEquals('Failed on 2',
  1161. '[5 3 1 3 1 3] 1 d'+CRLF,
  1162. S.DataString);
  1163. finally
  1164. o.Free;
  1165. end;
  1166. end;
  1167. { TTestPDFColor }
  1168. procedure TTestPDFColor.TestWrite_Stroke;
  1169. var
  1170. o: TMockPDFColor;
  1171. begin
  1172. o := TMockPDFColor.Create(PDF, True, $AABBCC);
  1173. try
  1174. AssertEquals('Failed on 1', '', S.DataString);
  1175. o.Write(S);
  1176. AssertEquals('Failed on 2',
  1177. '0.66 0.73 0.8 RG'+CRLF,
  1178. S.DataString);
  1179. finally
  1180. o.Free;
  1181. end;
  1182. end;
  1183. procedure TTestPDFColor.TestWrite_noStroke;
  1184. var
  1185. o: TMockPDFColor;
  1186. begin
  1187. o := TMockPDFColor.Create(PDF, False, $AABBCC);
  1188. try
  1189. AssertEquals('Failed on 1', '', S.DataString);
  1190. o.Write(S);
  1191. AssertEquals('Failed on 2',
  1192. '0.66 0.73 0.8 rg'+CRLF,
  1193. S.DataString);
  1194. finally
  1195. o.Free;
  1196. end;
  1197. end;
  1198. { TTestPDFDictionaryItem }
  1199. procedure TTestPDFDictionaryItem.TestWrite;
  1200. var
  1201. o: TMockPDFDictionaryItem;
  1202. v: TPDFString;
  1203. begin
  1204. v := TPDFString.Create(PDF, 'TestValue');
  1205. o := TMockPDFDictionaryItem.Create(PDF, 'tv', v);
  1206. try
  1207. AssertEquals('Failed on 1', '', S.DataString);
  1208. o.Write(S);
  1209. AssertEquals('Failed on 2',
  1210. '/tv (TestValue)'+CRLF,
  1211. S.DataString);
  1212. finally
  1213. o.Free;
  1214. end;
  1215. end;
  1216. { TTestPDFDictionary }
  1217. procedure TTestPDFDictionary.TestWrite;
  1218. var
  1219. o: TMockPDFDictionary;
  1220. v: TPDFString;
  1221. begin
  1222. v := TPDFString.Create(PDF, 'TestValue');
  1223. o := TMockPDFDictionary.Create(PDF);
  1224. o.AddName('key1','value1');
  1225. o.AddElement('key2', v);
  1226. o.AddInteger('key3', 1234);
  1227. o.AddString('key4', 'string4');
  1228. o.AddReference('key5', 987);
  1229. try
  1230. AssertEquals('Failed on 1', '', S.DataString);
  1231. o.Write(S);
  1232. AssertEquals('Failed on 2',
  1233. '<<'+CRLF+
  1234. '/key1 /value1'+CRLF+
  1235. '/key2 (TestValue)'+CRLF+
  1236. '/key3 1234'+CRLF+
  1237. '/key4 (string4)'+CRLF+
  1238. '/key5 987 0 R'+CRLF+
  1239. '>>',
  1240. S.DataString);
  1241. finally
  1242. o.Free;
  1243. end;
  1244. end;
  1245. { TTestPDFXRef }
  1246. procedure TTestPDFXRef.TestWrite;
  1247. var
  1248. o: TMockPDFXRef;
  1249. begin
  1250. o := TMockPDFXRef.Create(PDF);
  1251. try
  1252. AssertEquals('Failed on 1', '', S.DataString);
  1253. o.Write(S);
  1254. AssertEquals('Failed on 2',
  1255. '0000000000 00000 n'+CRLF,
  1256. S.DataString);
  1257. o.Offset := 234;
  1258. o.Write(S);
  1259. AssertEquals('Failed on 3',
  1260. '0000000000 00000 n'+CRLF+
  1261. '0000000234 00000 n'+CRLF,
  1262. S.DataString);
  1263. finally
  1264. o.Free;
  1265. end;
  1266. end;
  1267. { TTestPDFPage }
  1268. procedure TTestPDFPage.TestPageDocument;
  1269. var
  1270. p: TPDFPage;
  1271. begin
  1272. p := PDF.Pages.AddPage;
  1273. AssertTrue('Failed on 1', p.Document = PDF);
  1274. AssertTrue('Failed on 2', p.UnitOfMeasure = uomMillimeters);
  1275. end;
  1276. procedure TTestPDFPage.TestPageDefaultUnitOfMeasure;
  1277. var
  1278. p: TPDFPage;
  1279. begin
  1280. p := PDF.Pages.AddPage;
  1281. AssertTrue('Failed on 1', p.UnitOfMeasure = uomMillimeters);
  1282. end;
  1283. procedure TTestPDFPage.TestMatrix;
  1284. var
  1285. p: TPDFPage;
  1286. pt1, pt2: TPDFCoord;
  1287. begin
  1288. p := PDF.Pages.AddPage;
  1289. AssertTrue('Failed on 1', p.UnitOfMeasure = uomMillimeters);
  1290. AssertEquals('Failed on 2', mmToPDF(p.Matrix._21), p.Paper.H);
  1291. pt1.X := 10;
  1292. pt1.Y := 20;
  1293. pt2 := p.Matrix.Transform(pt1);
  1294. AssertEquals('Failed on 3', 10, pt2.X);
  1295. AssertEquals('Failed on 4', 297-20, pt2.Y, 0.1);
  1296. pt1 := p.Matrix.ReverseTransform(pt2);
  1297. AssertEquals('Failed on 5', 10, pt1.X);
  1298. AssertEquals('Failed on 6', 20, pt1.Y, 0.1);
  1299. end;
  1300. procedure TTestPDFPage.TestUnitOfMeasure_MM;
  1301. var
  1302. p: TPDFPage;
  1303. pt: TPDFCoord;
  1304. begin
  1305. p := PDF.Pages.AddPage;
  1306. p.UnitOfMeasure := uomMillimeters;
  1307. pt.X := 20;
  1308. pt.Y := 35;
  1309. TMockPDFPage(p).doUnitConversion(pt);
  1310. AssertEquals('Failed on 1', 56.69, pt.X, 0.01);
  1311. AssertEquals('Failed on 2', 99.21, pt.Y, 0.01);
  1312. pt.X := 40;
  1313. pt.Y := 20;
  1314. TMockPDFPage(p).doUnitConversion(pt);
  1315. AssertEquals('Failed on 3', 113.38, pt.X, 0.01);
  1316. AssertEquals('Failed on 4', 56.69, pt.Y, 0.01);
  1317. end;
  1318. procedure TTestPDFPage.TestUnitOfMeasure_Inches;
  1319. var
  1320. p: TPDFPage;
  1321. pt: TPDFCoord;
  1322. begin
  1323. p := PDF.Pages.AddPage;
  1324. p.UnitOfMeasure := uomInches;
  1325. pt.X := 1;
  1326. pt.Y := 1.5;
  1327. TMockPDFPage(p).doUnitConversion(pt);
  1328. AssertEquals('Failed on 1', 72.0, pt.X, 0.01);
  1329. AssertEquals('Failed on 2', 108.0, pt.Y, 0.01);
  1330. pt.X := 2;
  1331. pt.Y := 1;
  1332. TMockPDFPage(p).doUnitConversion(pt);
  1333. AssertEquals('Failed on 3', 144.0, pt.X, 0.01);
  1334. AssertEquals('Failed on 4', 72.0, pt.Y, 0.01);
  1335. end;
  1336. procedure TTestPDFPage.TestUnitOfMeasure_CM;
  1337. var
  1338. p: TPDFPage;
  1339. pt: TPDFCoord;
  1340. begin
  1341. p := PDF.Pages.AddPage;
  1342. p.UnitOfMeasure := uomMillimeters;
  1343. pt.X := 2.0;
  1344. pt.Y := 3.5;
  1345. TMockPDFPage(p).doUnitConversion(pt);
  1346. AssertEquals('Failed on 1', 5.669, pt.X, 0.01);
  1347. AssertEquals('Failed on 2', 9.921, pt.Y, 0.01);
  1348. pt.X := 4.0;
  1349. pt.Y := 2.0;
  1350. TMockPDFPage(p).doUnitConversion(pt);
  1351. AssertEquals('Failed on 3', 11.338, pt.X, 0.01);
  1352. AssertEquals('Failed on 4', 5.669, pt.Y, 0.01);
  1353. end;
  1354. { TTestCompressionDecompression }
  1355. function TTestCompressionDecompression.GetTestString: string;
  1356. var
  1357. i: integer;
  1358. lsLine: string;
  1359. begin
  1360. result := '';
  1361. lsLine := '';
  1362. for i := 1 to 1000 do
  1363. lsLine := lsLine + Chr(ord('A')+Random(ord('z')-ord('A')));
  1364. for i := 1 to 200 do
  1365. result := result + lsLine + LineEnding;
  1366. Result := 'Hello World';
  1367. end;
  1368. procedure TTestCompressionDecompression.TestStreamCompressionDecompression;
  1369. var
  1370. lSBefore: TStringStream;
  1371. lSAfter: TStringStream;
  1372. lCompressed: TMemoryStream;
  1373. lBefore: string;
  1374. lAfter: string;
  1375. begin
  1376. lBefore := GetTestString;
  1377. lSBefore := TStringStream.Create(lBefore);
  1378. lCompressed := TMemoryStream.Create;
  1379. CompressStream(lSBefore, lCompressed);
  1380. try
  1381. lSAfter := TStringStream.Create('');
  1382. DecompressStream(lCompressed, lSAfter);
  1383. lAfter := lSAfter.DataString;
  1384. AssertTrue('Compression failed. Strings are not the same. ' +IntToStr(Length(lBefore)) + ' vs ' + IntToStr(Length(lAfter)), lBefore = lAfter);
  1385. finally
  1386. lSBefore.Free;
  1387. lCompressed.Free;
  1388. lSAfter.Free;
  1389. end;
  1390. end;
  1391. procedure TTestCompressionDecompression.TestStringCompressionDecompression;
  1392. var
  1393. lBefore: string;
  1394. lCompressed: string;
  1395. lAfter: string;
  1396. s: TStringStream;
  1397. e: TStringStream;
  1398. begin
  1399. lBefore := GetTestString;
  1400. lCompressed := '';
  1401. CompressString(lBefore, lCompressed);
  1402. s := TStringStream.Create(lCompressed);
  1403. try
  1404. e := TStringStream.Create('');
  1405. s.Position := 0;
  1406. DecompressStream(s, e);
  1407. lAfter := e.DataString;
  1408. finally
  1409. e.Free;
  1410. s.Free;
  1411. end;
  1412. AssertTrue('Compression failed. Strings are not the same. ' +IntToStr(Length(lBefore)) + ' vs ' + IntToStr(Length(lAfter)), lBefore = lAfter);
  1413. end;
  1414. { TTestTPDFImageItem }
  1415. procedure TTestTPDFImageItem.TestCreateStreamedData;
  1416. var
  1417. itm: TPDFImageItem;
  1418. img: TFPMemoryImage;
  1419. b: TBytes;
  1420. begin
  1421. itm := TPDFImageItem.Create(nil);
  1422. try
  1423. itm.OwnsImage := True;
  1424. img := TFPMemoryImage.Create(5, 5);
  1425. itm.Image := img;
  1426. b := itm.StreamedData;
  1427. AssertEquals('Failed on 1', 75 {5*5*3}, Length(b));
  1428. finally
  1429. itm.Free;
  1430. end;
  1431. itm := TPDFImageItem.Create(nil);
  1432. try
  1433. itm.OwnsImage := True;
  1434. img := TFPMemoryImage.Create(10, 20);
  1435. itm.Image := img;
  1436. { this try..except as to prove that we had a bug before we fixed it. }
  1437. try
  1438. b := itm.StreamedData;
  1439. except
  1440. Fail('Failed on 2 - itm.StreamedData raised an exception');
  1441. end;
  1442. AssertEquals('Failed on 3', 600 {10*20*3}, Length(b));
  1443. finally
  1444. itm.Free;
  1445. end;
  1446. end;
  1447. initialization
  1448. RegisterTest(TTestPDFObject{$ifdef fptest}.Suite{$endif});
  1449. RegisterTest(TTestTPDFDocumentObject{$ifdef fptest}.Suite{$endif});
  1450. RegisterTest(TTestPDFBoolean{$ifdef fptest}.Suite{$endif});
  1451. RegisterTest(TTestPDFMoveTo{$ifdef fptest}.Suite{$endif});
  1452. RegisterTest(TTestPDFInteger{$ifdef fptest}.Suite{$endif});
  1453. RegisterTest(TTestPDFReference{$ifdef fptest}.Suite{$endif});
  1454. RegisterTest(TTestPDFName{$ifdef fptest}.Suite{$endif});
  1455. RegisterTest(TTestPDFString{$ifdef fptest}.Suite{$endif});
  1456. RegisterTest(TTestPDFArray{$ifdef fptest}.Suite{$endif});
  1457. RegisterTest(TTestPDFStream{$ifdef fptest}.Suite{$endif});
  1458. RegisterTest(TTestPDFEmbeddedFont{$ifdef fptest}.Suite{$endif});
  1459. RegisterTest(TTestPDFText{$ifdef fptest}.Suite{$endif});
  1460. RegisterTest(TTestPDFLineSegment{$ifdef fptest}.Suite{$endif});
  1461. RegisterTest(TTestTPDFRectangle{$ifdef fptest}.Suite{$endif});
  1462. RegisterTest(TTestPDFCurveC{$ifdef fptest}.Suite{$endif});
  1463. RegisterTest(TTestPDFCurveV{$ifdef fptest}.Suite{$endif});
  1464. RegisterTest(TTestPDFCurveY{$ifdef fptest}.Suite{$endif});
  1465. RegisterTest(TTestPDFEllipse{$ifdef fptest}.Suite{$endif});
  1466. RegisterTest(TTestPDFSurface{$ifdef fptest}.Suite{$endif});
  1467. RegisterTest(TTestPDFImage{$ifdef fptest}.Suite{$endif});
  1468. RegisterTest(TTestPDFLineStyle{$ifdef fptest}.Suite{$endif});
  1469. RegisterTest(TTestPDFColor{$ifdef fptest}.Suite{$endif});
  1470. RegisterTest(TTestPDFDictionaryItem{$ifdef fptest}.Suite{$endif});
  1471. RegisterTest(TTestPDFDictionary{$ifdef fptest}.Suite{$endif});
  1472. RegisterTest(TTestPDFXRef{$ifdef fptest}.Suite{$endif});
  1473. RegisterTest(TTestPDFPage{$ifdef fptest}.Suite{$endif});
  1474. RegisterTest(TTestCompressionDecompression{$ifdef fptest}.Suite{$endif});
  1475. RegisterTest(TTestTPDFImageItem{$ifdef fptest}.Suite{$endif});
  1476. end.