fppdf_test.pas 45 KB

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