tcbasereport.pp 102 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2022 by Michael van Canneyt and other members of the
  4. Free Pascal development team
  5. base report tests
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit tcbasereport;
  13. {$mode objfpc}{$H+}
  14. {.$define gdebug}
  15. interface
  16. uses
  17. Classes,
  18. SysUtils,
  19. fpcunit,
  20. testregistry,
  21. fpexprpars,
  22. fpCanvas,
  23. fpReport;
  24. type
  25. TMyFPReportComponent = class(TFPReportComponent)
  26. public
  27. procedure StartLayout; override;
  28. procedure EndLayout; override;
  29. procedure StartRender; override;
  30. procedure EndRender; override;
  31. end;
  32. TMyFPReportElement = class(TFPReportElement)
  33. private
  34. FChangedCalled: integer;
  35. public
  36. procedure CallChange;
  37. procedure ResetChanged;
  38. procedure DoChanged; override;
  39. property ChangedCalled: integer read FChangedCalled;
  40. end;
  41. TMyFPReportElementWithChildren = class(TFPReportElementWithChildren)
  42. private
  43. FChangedCalled: integer;
  44. public
  45. procedure CallChange;
  46. procedure ResetChanged;
  47. procedure DoChanged; override;
  48. property ChangedCalled: integer read FChangedCalled;
  49. end;
  50. TMyFPReportPageSize = class(TFPReportPageSize)
  51. private
  52. FChangedCalled: integer;
  53. public
  54. procedure ResetChanged;
  55. procedure Changed; override;
  56. property ChangedCalled: integer read FChangedCalled;
  57. end;
  58. TMyFPReportPage = class(TFPReportPage)
  59. private
  60. FChangedCalled: integer;
  61. FPrepareObjectsCalled: integer;
  62. procedure SetupPage;
  63. protected
  64. procedure PrepareObjects(aRTParent: TFPReportElement); override;
  65. public
  66. constructor Create(AOwner: TComponent); override;
  67. procedure ResetChanged;
  68. procedure DoChanged; override;
  69. property ChangedCalled: integer read FChangedCalled;
  70. end;
  71. TMyReportTitleBand = class(TFPReportCustomTitleBand)
  72. private
  73. FPrepareObjectsCalled: integer;
  74. protected
  75. procedure PrepareObjects(aRTParent: TFPReportElement); override;
  76. public
  77. constructor Create(AOwner: TComponent); override;
  78. end;
  79. TMyDataBand = class(TFPReportDataBand)
  80. private
  81. FPrepareObjectsCalled: integer;
  82. protected
  83. procedure PrepareObjects(aRTParent: TFPReportElement); override;
  84. public
  85. constructor Create(AOwner: TComponent); override;
  86. end;
  87. TMyCustomReport = class(TFPReport)
  88. end;
  89. TMyFPReportData = class(TFPReportData)
  90. private
  91. FCC: integer;
  92. FDFC: integer;
  93. FEC: integer;
  94. FFC: integer;
  95. FNC: integer;
  96. FOC: integer;
  97. FOE: boolean;
  98. FReportEOF: boolean;
  99. public
  100. procedure ResetCounts;
  101. procedure DoInitDataFields; override;
  102. procedure DoOpen; override;
  103. procedure DoFirst; override;
  104. procedure DoNext; override;
  105. procedure DoClose; override;
  106. function DoEOF: boolean; override;
  107. property InitDataFieldsCount: integer read FDFC;
  108. property OpenCount: integer read FOC;
  109. property FirstCount: integer read FFC;
  110. property NextCount: integer read FNC;
  111. property CloseCount: integer read FCC;
  112. property EOFCount: integer read FEC;
  113. property ReportEOF: boolean read FReportEOF write FReportEOF;
  114. property OldEOF: boolean read FOE;
  115. property Datafields;
  116. end;
  117. TTestFPPageSize = class(TTestCase)
  118. published
  119. procedure TestCreate;
  120. end;
  121. TTestFPPapers = class(TTestCase)
  122. protected
  123. FM: TFPReportPaperManager;
  124. procedure Setup; override;
  125. procedure TearDown; override;
  126. procedure RegisterPapers(ACount: integer; Local: boolean = True);
  127. end;
  128. TTestFPPaperManager = class(TTestFPPapers)
  129. private
  130. FAccess: integer;
  131. procedure TestAccess;
  132. protected
  133. procedure Setup; override;
  134. published
  135. procedure TestCreate;
  136. procedure TestRegister1;
  137. procedure TestRegister2;
  138. procedure TestRegister3;
  139. procedure TestRegisterDuplicate;
  140. procedure TestClear;
  141. procedure TestFind1;
  142. procedure TestFind2;
  143. procedure TestFind3;
  144. procedure IllegalAccess1;
  145. procedure IllegalAccess2;
  146. procedure IllegalAccess3;
  147. procedure IllegalAccess4;
  148. procedure IllegalAccess5;
  149. procedure IllegalAccess6;
  150. procedure IllegalAccess7;
  151. procedure IllegalAccess8;
  152. procedure TestWidth;
  153. procedure TestHeight;
  154. end;
  155. TTestFPReportPageSize = class(TTestFPPapers)
  156. private
  157. FP: TMyFPReportPageSize;
  158. protected
  159. procedure Setup; override;
  160. procedure TearDown; override;
  161. published
  162. procedure TestCreate;
  163. procedure TestCreateWithPage;
  164. procedure TestCreateByPage;
  165. procedure TestChanged1;
  166. procedure TestChanged2;
  167. procedure TestChanged3;
  168. procedure TestPaperName1;
  169. procedure TestPaperName2;
  170. procedure TestAssign;
  171. end;
  172. TBaseReportComponentTest = class(TTestCase)
  173. private
  174. FC: TMyFPReportComponent;
  175. procedure ExpectState(const aExpected: TFPReportState);
  176. protected
  177. procedure AssertEquals(Msg: string; const aExpected, AActual: TFPReportState); overload;
  178. procedure SetUp; override;
  179. procedure TearDown; override;
  180. end;
  181. TTestReportComponent = class(TBaseReportComponentTest)
  182. published
  183. procedure TestCreate;
  184. procedure TestLayoutState;
  185. procedure TestRenderState;
  186. end;
  187. TBaseReportElementTest = class(TTestCase)
  188. private
  189. FC: TMyFPReportElement;
  190. protected
  191. procedure SetUp; override;
  192. procedure TearDown; override;
  193. end;
  194. TReportElementTest = class(TBaseReportElementTest)
  195. published
  196. procedure TestCreate;
  197. procedure TestDoChange;
  198. procedure TestChangeCount;
  199. procedure TestChangeCountNested;
  200. procedure TestChangeCountNested2;
  201. procedure TestVisibleChanges;
  202. procedure TestLayoutChanges;
  203. procedure TestFrameChanges;
  204. procedure TestAssign;
  205. procedure TestEquals1;
  206. procedure TestEquals2;
  207. procedure TestEquals3;
  208. procedure TestEquals4;
  209. procedure TestEquals5;
  210. end;
  211. TTestReportChildren = class(TTestCase)
  212. private
  213. FC, FC2: TMyFPReportElementWithChildren;
  214. FChild: TFPReportElement;
  215. protected
  216. procedure SetUp; override;
  217. procedure TearDown; override;
  218. procedure WrongParent;
  219. published
  220. procedure TestCreate;
  221. procedure TestSetParent1;
  222. procedure TestSetParent2;
  223. procedure TestSetParent3;
  224. procedure TestSetParent4;
  225. procedure TestSetParent5;
  226. procedure TestSetParent6;
  227. end;
  228. TTestReportFrame = class(TBaseReportElementTest)
  229. published
  230. procedure TestCreate;
  231. procedure TestWidthChange;
  232. procedure TestColorChange;
  233. procedure TestPenStyleChange;
  234. procedure TestShapeChange;
  235. procedure TestLinesChange;
  236. procedure TestAssign;
  237. procedure TestEquals1;
  238. procedure TestEquals2;
  239. procedure TestEquals3;
  240. procedure TestEquals4;
  241. procedure TestEquals5;
  242. procedure TestEquals6;
  243. procedure TestEquals7;
  244. end;
  245. TTestReportLayout = class(TBaseReportElementTest)
  246. published
  247. procedure TestCreate;
  248. procedure TestTopChange;
  249. procedure TestLeftChange;
  250. procedure TestWidthChange;
  251. procedure TestHeightChange;
  252. procedure TestAssign;
  253. procedure TestEquals1;
  254. procedure TestEquals2;
  255. procedure TestEquals3;
  256. procedure TestEquals4;
  257. procedure TestEquals5;
  258. procedure TestEquals6;
  259. end;
  260. TTestCaseWithData = class(TTestCase)
  261. private
  262. FData: TFPReportUserData;
  263. FSL: TStringList;
  264. procedure InitializeData(const ACount: integer);
  265. procedure SetReportData(const ADataCount: Byte);
  266. procedure DoGetDataValue(Sender: TObject; const AValueName: string; var AValue: variant);
  267. procedure DoGetDataEOF(Sender: TObject; var IsEOF: boolean);
  268. protected
  269. procedure SetUp; override;
  270. procedure TearDown; override;
  271. public
  272. property Data: TFPReportUserData read FData write FData;
  273. end;
  274. TTestCaseWithDataAndReport = class(TTestCaseWithData)
  275. private
  276. FReport: TMyCustomReport;
  277. protected
  278. procedure SetUp; override;
  279. procedure TearDown; override;
  280. public
  281. property Report: TMyCustomReport read FReport write FReport;
  282. end;
  283. TTestReportPage = class(TTestCase)
  284. private
  285. FP: TMyFPReportPage;
  286. protected
  287. procedure Setup; override;
  288. procedure TearDown; override;
  289. published
  290. procedure TestCreate1;
  291. procedure TestCreate2;
  292. procedure TestCreate3;
  293. procedure TestPageSize1;
  294. procedure TestPageSize2;
  295. procedure TestPageSize3;
  296. procedure TestBand1;
  297. procedure TestBand2;
  298. procedure TestData;
  299. procedure TestAssign;
  300. procedure TestFindBand;
  301. end;
  302. TTestReportData = class(TTestCase)
  303. private
  304. FD: TMyFPReportData;
  305. FHandler: boolean;
  306. procedure AssertField(Prefix: string; F: TFPReportDataField; AFieldName: string;
  307. AFieldKind: TFPReportFieldKind; ADisplayWidth: integer = 0);
  308. protected
  309. procedure DoOpen(Sender: TObject);
  310. procedure DoNext(Sender: TObject);
  311. procedure Setup; override;
  312. procedure TearDown; override;
  313. procedure CreateFields;
  314. procedure DoFieldByName;
  315. published
  316. procedure TestCreate;
  317. procedure TestOpen1;
  318. procedure TestNext;
  319. procedure TestInitFieldDefs;
  320. procedure TestInitFieldDefs_OnlyAllowedOnce;
  321. procedure TestEOF1;
  322. procedure TestAddDatafield;
  323. procedure TestDatafieldAdd;
  324. procedure TestCreateFields;
  325. procedure TestDatafieldIndexOf1;
  326. procedure TestDatafieldIndexOf2;
  327. procedure TestFindField1;
  328. procedure TestFindField2;
  329. procedure TestFindByName1;
  330. procedure TestFindByName2;
  331. procedure TestFieldAssign;
  332. procedure TestGetValue;
  333. procedure TestEasyAccessProperties;
  334. end;
  335. { Testing UserData by pulling data from a DataField }
  336. TTestUserReportData = class(TTestCase)
  337. private
  338. FD: TFPReportUserData;
  339. FExpectName: string;
  340. FReturnValue: variant;
  341. procedure DoValue(Sender: TObject; const AValueName: string; var AValue: variant);
  342. protected
  343. procedure Setup; override;
  344. procedure TearDown; override;
  345. published
  346. procedure TestGetValue;
  347. end;
  348. { Testing UserData by pulling data from a StringList }
  349. TTestUserReportData2 = class(TTestCase)
  350. private
  351. FData: TFPReportUserData;
  352. FSL: TStringList;
  353. procedure DoGetValue(Sender: TObject; const AValueName: string; var AValue: variant);
  354. procedure DoGetEOF(Sender: TObject; var IsEOF: boolean);
  355. protected
  356. procedure Setup; override;
  357. procedure TearDown; override;
  358. published
  359. procedure TestGetValue;
  360. procedure TestOnGetEOF1;
  361. procedure TestOnGetEOF2;
  362. end;
  363. TTestDataBand = class(TTestCaseWithDataAndReport)
  364. private
  365. FDataBand: TFPReportDataBand;
  366. protected
  367. procedure Setup; override;
  368. procedure TearDown; override;
  369. published
  370. procedure TestData;
  371. procedure TestDataPropertyAutoSet;
  372. end;
  373. TTestCustomReport = class(TTestCase)
  374. private
  375. FRpt: TMyCustomReport;
  376. FBeginReportCount: integer;
  377. FEndReportCount: integer;
  378. FSL: TStringList;
  379. FData: TFPReportUserData;
  380. procedure HandleOnBeginReport;
  381. procedure HandleOnEndReport;
  382. procedure InitializeData(const ACount: integer);
  383. procedure SetReportData(const ADataCount: Byte);
  384. procedure DoGetDataValue(Sender: TObject; const AValueName: string; var AValue: variant);
  385. procedure DoGetDataEOF(Sender: TObject; var IsEOF: boolean);
  386. procedure DoGetDataFieldNames(Sender: TObject; List: TStrings);
  387. protected
  388. procedure Setup; override;
  389. procedure TearDown; override;
  390. public
  391. property Data: TFPReportUserData read FData;
  392. property Report: TMyCustomReport read FRpt write FRpt;
  393. published
  394. procedure TestBeginReportEvent;
  395. procedure TestEndReportEvent;
  396. procedure TestPagePrepareObjects;
  397. procedure TestBandPrepareObjects;
  398. procedure TestRTObjects1;
  399. procedure TestRTObjects2;
  400. procedure TestRTObjects3;
  401. procedure TestRTObjects4_OneDataItem;
  402. procedure TestRTObjects5_TwoDataItems;
  403. procedure TestInternalFunction_Page;
  404. procedure TestInternalFunction_Page_with_text;
  405. procedure TestInternalFunction_RecNo;
  406. procedure TestInternalFunction_Today;
  407. procedure TestInternalFunction_Today_with_text;
  408. procedure TestInternalFunction_Author;
  409. procedure TestInternalFunction_Author_with_text;
  410. procedure TestInternalFunction_Title;
  411. procedure TestInternalFunction_Title_with_text;
  412. end;
  413. { TTestReportMemo }
  414. TTestReportMemo = class(TTestCase)
  415. private
  416. FMemo: TFPReportMemo;
  417. procedure CauseFontNotFoundException;
  418. protected
  419. procedure SetUp; override;
  420. procedure TearDown; override;
  421. published
  422. procedure TestCreate;
  423. procedure TestPrepareTextBlocks;
  424. procedure TestPrepareTextBlocks_multiline_data;
  425. procedure TestPrepareTextBlocks_multiline_wraptext;
  426. procedure TestPrepareTextBlocks_multiline_wraptext_oneword;
  427. procedure TestPrepareTextBlocks_multiline_wraptext_oneword_overflow;
  428. procedure TestPrepareTextBlocks_multiline_wraptext_oneword_split;
  429. procedure TestRGBToReportColor;
  430. procedure TestHTMLColorToReportColor_length7;
  431. procedure TestHTMLColorToReportColor_length6;
  432. procedure TestHTMLColorToReportColor_length3;
  433. procedure TestCreateTestBlock;
  434. procedure TestCreateTestBlock_IsURL;
  435. procedure TestSubStr;
  436. procedure TestTokenCount;
  437. procedure TestToken;
  438. end;
  439. TTestBandList = class(TTestCase)
  440. private
  441. FList: TBandList;
  442. b1: TFPReportPageHeaderBand;
  443. b2: TFPReportTitleBand;
  444. b3: TFPReportDataBand;
  445. procedure CreateBands;
  446. procedure AddAllBandsToList;
  447. protected
  448. procedure SetUp; override;
  449. procedure TearDown; override;
  450. published
  451. procedure TestAdd;
  452. procedure TestItems;
  453. procedure TestClear;
  454. procedure TestDelete;
  455. procedure TestFind1;
  456. procedure TestFind2;
  457. end;
  458. { TTestVariableBase }
  459. TTestVariableBase = Class(TTestCase)
  460. Public
  461. Class procedure AssertEquals(Const Msg : String; AExpected,AActual : TResultType); overload;
  462. end;
  463. { TTestVariable }
  464. TTestVariable = Class(TTestVariableBase)
  465. private
  466. FVar: TFPReportVariable;
  467. Protected
  468. Procedure SetUp; override;
  469. Procedure TearDown; override;
  470. Property Variable : TFPReportVariable Read FVar;
  471. Published
  472. Procedure TestEmpty;
  473. Procedure TestName;
  474. Procedure TestBoolean;
  475. Procedure TestInteger;
  476. Procedure TestDateTime;
  477. Procedure TestFloat;
  478. Procedure TestString;
  479. Procedure TestExpressionResult;
  480. end;
  481. { TTestVariables }
  482. TTestVariables = Class(TTestVariableBase)
  483. private
  484. FVar: TFPReportVariables;
  485. FV : Array[0..2] of TFPReportVariable;
  486. procedure AddThree;
  487. Protected
  488. Procedure SetUp; override;
  489. Procedure TearDown; override;
  490. Property Variables : TFPReportVariables Read FVar;
  491. Published
  492. Procedure TestEmpty;
  493. Procedure TestAdd;
  494. Procedure TestIndexOf;
  495. Procedure TestFind;
  496. end;
  497. implementation
  498. uses
  499. TypInfo,
  500. DateUtils,
  501. fpTTF;
  502. type
  503. TMemoFriend = class(TFPReportMemo);
  504. { TTestVariables }
  505. procedure TTestVariables.SetUp;
  506. begin
  507. inherited SetUp;
  508. FVar:=TFPReportVariables.Create(Nil,TFPReportVariable);
  509. end;
  510. procedure TTestVariables.TearDown;
  511. begin
  512. FreeAndNil(FVar);
  513. inherited TearDown;
  514. end;
  515. procedure TTestVariables.TestEmpty;
  516. begin
  517. AssertNotNull('Have variables',Variables);
  518. AssertEquals('Variable count',0,Variables.Count);
  519. AssertTrue('Variable class',Variables.ItemClass.InheritsFrom(TFPReportVariable));
  520. end;
  521. procedure TTestVariables.TestAdd;
  522. Var
  523. V : TFPReportVariable;
  524. begin
  525. V:=Variables.addVariable('aName');
  526. AssertNotNull('Have result',V);
  527. AssertEquals('Correct name','aName',V.Name);
  528. AssertEquals('Correct type',rtString,V.DataType);
  529. AssertEquals('Correct value','',V.AsString);
  530. AssertEquals('Added to collection',1,Variables.Count);
  531. AssertSame('In array',V,Variables[0]);
  532. ExpectException('Cannot add twice',EReportError);
  533. V:=Variables.addVariable('aName');
  534. end;
  535. procedure TTestVariables.AddThree;
  536. Var
  537. I: integer;
  538. begin
  539. For I:=0 to 2 do
  540. FV[I]:=Variables.Addvariable('aName'+IntToStr(i+1));
  541. end;
  542. procedure TTestVariables.TestIndexOf;
  543. begin
  544. AddThree;
  545. AssertEquals('First',0,Variables.IndexOfVariable('aName1'));
  546. AssertEquals('Second',1,Variables.IndexOfVariable('aName2'));
  547. AssertEquals('Third',2,Variables.IndexOfVariable('aName3'));
  548. AssertEquals('NonExisting',-1,Variables.IndexOfVariable('aName4'));
  549. end;
  550. procedure TTestVariables.TestFind;
  551. begin
  552. AddThree;
  553. AssertSame('First',FV[0],Variables.FindVariable('aName1'));
  554. AssertSame('Second',FV[1],Variables.FindVariable('aName2'));
  555. AssertSame('Third',FV[2],Variables.FindVariable('aName3'));
  556. AssertNull('NonExisting',Variables.FindVariable('aName4'));
  557. end;
  558. { TTestVariableBase }
  559. class procedure TTestVariableBase.AssertEquals(const Msg: String; AExpected,
  560. AActual: TResultType);
  561. begin
  562. AssertEquals(Msg,GetEnumName(TypeInfo(TResultType),Ord(AExpected)),GetEnumName(TypeInfo(TResultType),Ord(AActual)))
  563. end;
  564. { TTestVariable }
  565. procedure TTestVariable.SetUp;
  566. begin
  567. inherited SetUp;
  568. FVar:=TFPReportVariable.Create(Nil);
  569. end;
  570. procedure TTestVariable.TearDown;
  571. begin
  572. FreeandNil(FVar);
  573. inherited TearDown;
  574. end;
  575. procedure TTestVariable.TestEmpty;
  576. begin
  577. AssertNotNull('Have variable', Variable);
  578. AssertEquals('Boolean type',rtBoolean,Variable.DataType);
  579. AssertFalse('Boolean default value',Variable.AsBoolean);
  580. end;
  581. procedure TTestVariable.TestName;
  582. begin
  583. Variable.Name:='me'; // OK
  584. Variable.Name:='me.me'; // OK
  585. ExpectException('Name must be identifier',EReportError);
  586. Variable.Name:='me me'; // not OK
  587. end;
  588. procedure TTestVariable.TestBoolean;
  589. Var
  590. R : TFPExpressionResult;
  591. begin
  592. Variable.DataType:=rtBoolean;
  593. AssertEquals('Boolean type remains',rtBoolean,Variable.DataType);
  594. AssertFalse('Boolean default value',Variable.AsBoolean);
  595. AssertEquals('Boolean as string','False',Variable.Value);
  596. Variable.DataType:=rtFloat;
  597. Variable.AsBoolean:=true;
  598. AssertEquals('Boolean type remains',rtBoolean,Variable.DataType);
  599. AssertEquals('Boolean as string','True',Variable.Value);
  600. AssertTrue('Boolean value',Variable.AsBoolean);
  601. R:=Variable.AsExpressionResult;
  602. AssertEquals('Correct result',rtBoolean,r.resulttype);
  603. AssertEquals('Correct value',True,r.resBoolean);
  604. ExpectException('Cannot fetch as other type',EConvertError);
  605. Variable.AsString;
  606. end;
  607. procedure TTestVariable.TestInteger;
  608. Var
  609. R : TFPExpressionResult;
  610. begin
  611. Variable.DataType:=rtInteger;
  612. AssertEquals('Integer type remains',rtInteger,Variable.DataType);
  613. AssertEquals('Integer default value',0,Variable.AsInteger);
  614. AssertEquals('Integer as string','0',Variable.Value);
  615. Variable.DataType:=rtFloat;
  616. Variable.AsInteger:=123;
  617. AssertEquals('Integer type remains',rtInteger,Variable.DataType);
  618. AssertEquals('Integer as string','123',Variable.Value);
  619. AssertEquals('Integer value',123,Variable.AsInteger);
  620. R:=Variable.AsExpressionResult;
  621. AssertEquals('Correct result',rtInteger,r.resulttype);
  622. AssertEquals('Correct value',123,r.resInteger);
  623. ExpectException('Cannot fetch as other type',EConvertError);
  624. Variable.AsString;
  625. end;
  626. procedure TTestVariable.TestDateTime;
  627. Var
  628. R : TFPExpressionResult;
  629. begin
  630. Variable.DataType:=rtDateTime;
  631. AssertEquals('DateTime type remains',rtDateTime,Variable.DataType);
  632. AssertEquals('DateTime default value',0.0,Variable.AsDateTime);
  633. AssertEquals('DateTime as string','00000000T000000',Variable.Value);
  634. Variable.DataType:=rtDateTime;
  635. Variable.AsDateTime:=Date;
  636. AssertEquals('DateTime type remains',rtDateTime,Variable.DataType);
  637. AssertEquals('DateTime as string',FormatDateTime('yyyymmdd"T"000000',Date),Variable.Value);
  638. AssertEquals('DateTime value',Date,Variable.AsDateTime);
  639. R:=Variable.AsExpressionResult;
  640. AssertEquals('Correct result',rtDateTime,r.resulttype);
  641. AssertEquals('Correct value',Date,r.resDateTime);
  642. ExpectException('Cannot fetch as other type',EConvertError);
  643. Variable.AsString;
  644. end;
  645. procedure TTestVariable.TestFloat;
  646. Var
  647. R : TFPExpressionResult;
  648. begin
  649. Variable.DataType:=rtFloat;
  650. AssertEquals('Float type remains',rtFloat,Variable.DataType);
  651. AssertEquals('Float default value',0.0,Variable.AsFloat);
  652. AssertEquals('Float as string',' 0.0000000000000000E+000',Variable.Value);
  653. Variable.DataType:=rtBoolean;
  654. Variable.AsFloat:=1.23;
  655. AssertEquals('Float type remains',rtFloat,Variable.DataType);
  656. AssertEquals('Float as string',' 1.2300000000000000E+000',Variable.Value);
  657. AssertEquals('Float value',1.23,Variable.AsFloat);
  658. R:=Variable.AsExpressionResult;
  659. AssertEquals('Correct result',rtFloat,r.resulttype);
  660. AssertEquals('Correct value',1.23,r.resFloat);
  661. ExpectException('Cannot fetch as other type',EConvertError);
  662. Variable.AsString;
  663. end;
  664. procedure TTestVariable.TestString;
  665. Var
  666. R : TFPExpressionResult;
  667. begin
  668. Variable.DataType:=rtString;
  669. AssertEquals('String type remains',rtString,Variable.DataType);
  670. AssertEquals('String default value','',Variable.AsString);
  671. AssertEquals('String as string','',Variable.Value);
  672. Variable.DataType:=rtBoolean;
  673. Variable.AsString:='abc';
  674. AssertEquals('String type remains',rtString,Variable.DataType);
  675. AssertEquals('String as string','abc',Variable.Value);
  676. AssertEquals('String value','abc',Variable.AsString);
  677. R:=Variable.AsExpressionResult;
  678. AssertEquals('Correct result',rtString,r.resulttype);
  679. AssertEquals('Correct value','abc',r.resString);
  680. ExpectException('Cannot fetch as other type',EConvertError);
  681. Variable.AsFloat;
  682. end;
  683. procedure TTestVariable.TestExpressionResult;
  684. Var
  685. R : TFPExpressionResult;
  686. begin
  687. R.ResultType:=rtFloat;
  688. R.ResFloat:=1.23;
  689. Variable.AsExpressionResult:=R;
  690. AssertEquals('Correct type ',rtFloat,Variable.DataType);
  691. AssertEquals('Correct value',1.23,Variable.AsFloat);
  692. R.ResultType:=rtBoolean;
  693. R.ResBoolean:=True;
  694. Variable.AsExpressionResult:=R;
  695. AssertEquals('Correct type ',rtBoolean,Variable.DataType);
  696. AssertEquals('Correct value',True,Variable.AsBoolean);
  697. R.ResultType:=rtString;
  698. R.ResString:='me';
  699. Variable.AsExpressionResult:=R;
  700. AssertEquals('Correct type ',rtString,Variable.DataType);
  701. AssertEquals('Correct value','me',Variable.AsString);
  702. R.ResultType:=rtDateTime;
  703. R.ResDateTime:=Date;
  704. Variable.AsExpressionResult:=R;
  705. AssertEquals('Correct type ',rtDateTime,Variable.DataType);
  706. AssertEquals('Correct value',Date,Variable.AsDateTime);
  707. R.ResultType:=rtinteger;
  708. R.ResInteger:=1234;
  709. Variable.AsExpressionResult:=R;
  710. AssertEquals('Correct type ',rtinteger,Variable.DataType);
  711. AssertEquals('Correct value',1234,Variable.AsInteger);
  712. end;
  713. { TTestCaseWithData }
  714. procedure TTestCaseWithData.InitializeData(const ACount: Integer);
  715. var
  716. i: integer;
  717. begin
  718. // data is coming from the stringlist this time
  719. FSL := TStringList.Create;
  720. if ACount < 1 then
  721. Exit;
  722. for i := 1 to ACount do
  723. FSL.Add('Item ' + IntToStr(i));
  724. end;
  725. procedure TTestCaseWithData.SetReportData(const ADataCount: Byte);
  726. begin
  727. if ADataCount < 1 then
  728. Exit;
  729. InitializeData(ADataCount);
  730. FData := TFPReportUserData.Create(nil);
  731. FData.OnGetValue := @DoGetDataValue;
  732. FData.OnGetEOF := @DoGetDataEOF;
  733. end;
  734. procedure TTestCaseWithData.DoGetDataValue(Sender: TObject; const AValueName: string; var AValue: variant);
  735. begin
  736. if AValueName = 'element' then
  737. AValue := FSL[FData.RecNo - 1];
  738. end;
  739. procedure TTestCaseWithData.DoGetDataEOF(Sender: TObject; var IsEOF: boolean);
  740. begin
  741. if FData.RecNo > FSL.Count then
  742. IsEOF := True
  743. else
  744. IsEOF := False;
  745. end;
  746. procedure TTestCaseWithData.SetUp;
  747. begin
  748. inherited SetUp;
  749. end;
  750. procedure TTestCaseWithData.TearDown;
  751. begin
  752. FreeAndNil(FData);
  753. FreeAndNil(FSL);
  754. inherited TearDown;
  755. end;
  756. { TTestCaseWithDataAndReport }
  757. procedure TTestCaseWithDataAndReport.SetUp;
  758. begin
  759. inherited SetUp;
  760. FReport := TMyCustomReport.Create(nil);
  761. end;
  762. procedure TTestCaseWithDataAndReport.TearDown;
  763. begin
  764. inherited TearDown;
  765. FreeAndNil(FReport);
  766. end;
  767. { TBaseReportComponentTest }
  768. procedure TBaseReportComponentTest.ExpectState(const aExpected: TFPReportState);
  769. begin
  770. AssertEquals('ReportComponent.ReportState: ', AExpected, FC.ReportState);
  771. end;
  772. procedure TBaseReportComponentTest.AssertEquals(Msg: string; const aExpected, AActual: TFPReportState);
  773. begin
  774. AssertEquals(Msg, GetEnumName(TypeInfo(TFPReportState), Ord(AExpected)),
  775. GetEnumName(TypeInfo(TFPReportState), Ord(AActual)));
  776. end;
  777. procedure TBaseReportComponentTest.SetUp;
  778. begin
  779. FC := TMyFPReportComponent.Create(nil);
  780. end;
  781. procedure TBaseReportComponentTest.TearDown;
  782. begin
  783. FreeAndNil(FC);
  784. end;
  785. { TTestReportComponent }
  786. procedure TTestReportComponent.TestCreate;
  787. begin
  788. ExpectState(rsDesign);
  789. end;
  790. procedure TTestReportComponent.TestLayoutState;
  791. begin
  792. FC.StartLayout;
  793. ExpectState(rsLayout);
  794. FC.EndLayout;
  795. ExpectState(rsDesign);
  796. end;
  797. procedure TTestReportComponent.TestRenderState;
  798. begin
  799. FC.StartRender;
  800. ExpectState(rsRender);
  801. FC.EndRender;
  802. ExpectState(rsDesign);
  803. end;
  804. { TMyFPReportComponent }
  805. procedure TMyFPReportComponent.StartLayout;
  806. begin
  807. inherited StartLayout;
  808. end;
  809. procedure TMyFPReportComponent.EndLayout;
  810. begin
  811. inherited EndLayout;
  812. end;
  813. procedure TMyFPReportComponent.StartRender;
  814. begin
  815. inherited StartRender;
  816. end;
  817. procedure TMyFPReportComponent.EndRender;
  818. begin
  819. inherited EndRender;
  820. end;
  821. { TMyFPReportElement }
  822. procedure TMyFPReportElement.CallChange;
  823. begin
  824. Changed;
  825. end;
  826. procedure TMyFPReportElement.ResetChanged;
  827. begin
  828. FChangedCalled := 0;
  829. end;
  830. procedure TMyFPReportElement.DoChanged;
  831. begin
  832. inherited DoChanged;
  833. Inc(FChangedCalled);
  834. end;
  835. { TBaseReportElementTest }
  836. procedure TBaseReportElementTest.SetUp;
  837. begin
  838. inherited SetUp;
  839. FC := TMyFPReportElement.Create(nil);
  840. end;
  841. procedure TBaseReportElementTest.TearDown;
  842. begin
  843. FreeAndNil(FC);
  844. inherited TearDown;
  845. end;
  846. { TReportElementTest }
  847. procedure TReportElementTest.TestCreate;
  848. begin
  849. AssertEquals('Create does not invoke changed', 0, FC.ChangedCalled);
  850. AssertNotNull('Create creates frame', FC.Frame);
  851. AssertEquals('Create creates frame of correct class', TFPReportFrame, FC.Frame.Classtype);
  852. AssertNotNull('Create creates layout', FC.Layout);
  853. AssertEquals('Create creates layout of correct class ', TFPReportLayout, FC.Layout.Classtype);
  854. AssertEquals('Created element is visible', True, FC.Visible);
  855. AssertNull('No parent at create', FC.Parent);
  856. end;
  857. procedure TReportElementTest.TestDoChange;
  858. begin
  859. FC.CallChange;
  860. AssertEquals('Change calls dochange', 1, FC.ChangedCalled);
  861. end;
  862. procedure TReportElementTest.TestChangeCount;
  863. begin
  864. FC.BeginUpdate;
  865. try
  866. FC.CallChange;
  867. AssertEquals('First Change does notcall dochange', 0, FC.ChangedCalled);
  868. FC.CallChange;
  869. AssertEquals('Second Change does not call dochange', 0, FC.ChangedCalled);
  870. finally
  871. FC.EndUpdate;
  872. end;
  873. AssertEquals('EndUpdate calls dochange once', 1, FC.ChangedCalled);
  874. end;
  875. procedure TReportElementTest.TestChangeCountNested;
  876. begin
  877. FC.BeginUpdate;
  878. try
  879. FC.CallChange;
  880. AssertEquals('First Change does notcall dochange', 0, FC.ChangedCalled);
  881. FC.BeginUpdate;
  882. try
  883. FC.CallChange;
  884. AssertEquals('Second Change does not call dochange', 0, FC.ChangedCalled);
  885. finally
  886. FC.EndUpdate;
  887. AssertEquals('First endupdate does not call dochange', 0, FC.ChangedCalled);
  888. end;
  889. finally
  890. FC.EndUpdate;
  891. end;
  892. AssertEquals('Second EndUpdate calls dochange once', 1, FC.ChangedCalled);
  893. end;
  894. procedure TReportElementTest.TestChangeCountNested2;
  895. begin
  896. FC.BeginUpdate;
  897. try
  898. FC.CallChange;
  899. AssertEquals('First Change does notcall dochange', 0, FC.ChangedCalled);
  900. FC.BeginUpdate;
  901. try
  902. FC.CallChange;
  903. AssertEquals('Second Change does not call dochange', 0, FC.ChangedCalled);
  904. FC.CallChange;
  905. AssertEquals('Third Change does not call dochange', 0, FC.ChangedCalled);
  906. finally
  907. FC.EndUpdate;
  908. AssertEquals('First endupdate does not call dochange', 0, FC.ChangedCalled);
  909. end;
  910. finally
  911. FC.EndUpdate;
  912. end;
  913. AssertEquals('Second EndUpdate calls dochange once', 1, FC.ChangedCalled);
  914. end;
  915. procedure TReportElementTest.TestVisibleChanges;
  916. begin
  917. FC.ResetChanged;
  918. FC.Visible := False;
  919. AssertEquals('Setting visible calls change', 1, FC.ChangedCalled);
  920. end;
  921. procedure TReportElementTest.TestLayoutChanges;
  922. var
  923. L: TFPreportLayout;
  924. begin
  925. L := TFPreportLayout.Create(nil);
  926. try
  927. FC.Layout := L;
  928. AssertEquals('Setting layout calls change', 1, FC.ChangedCalled);
  929. finally
  930. L.Free;
  931. end;
  932. end;
  933. procedure TReportElementTest.TestFrameChanges;
  934. var
  935. F: TFPreportFrame;
  936. begin
  937. F := TFPreportFrame.Create(nil);
  938. try
  939. FC.Frame := F;
  940. AssertEquals('Setting frame calls change', 1, FC.ChangedCalled);
  941. finally
  942. F.Free;
  943. end;
  944. end;
  945. procedure TReportElementTest.TestAssign;
  946. var
  947. E: TFPReportElement;
  948. begin
  949. E := TMyFPReportElement.Create(nil);
  950. try
  951. FC.Layout.Top := 1;
  952. FC.Frame.Width := 2;
  953. E.Assign(FC);
  954. AssertEquals('Assigned frame equal', True, FC.Frame.Equals(E.Frame));
  955. AssertEquals('Assigned layout equal', True, FC.Layout.Equals(FC.Layout));
  956. finally
  957. E.Free;
  958. end;
  959. end;
  960. procedure TReportElementTest.TestEquals1;
  961. begin
  962. AssertEquals('Self always returns equal', True, FC.Equals(FC));
  963. end;
  964. procedure TReportElementTest.TestEquals2;
  965. var
  966. E: TFPReportElement;
  967. begin
  968. E := TMyFPReportElement.Create(nil);
  969. try
  970. E.Assign(FC);
  971. AssertEquals('Assigned element returns equal', True, FC.Equals(E));
  972. AssertEquals('Assigned element returns equal', True, E.Equals(FC));
  973. finally
  974. E.Free;
  975. end;
  976. end;
  977. procedure TReportElementTest.TestEquals3;
  978. var
  979. E: TFPReportElement;
  980. begin
  981. E := TFPReportElement.Create(nil);
  982. try
  983. E.Assign(FC);
  984. AssertEquals('Different class makes unequal', True, FC.Equals(E));
  985. AssertEquals('Different class makes unequal', True, E.Equals(FC));
  986. finally
  987. E.Free;
  988. end;
  989. end;
  990. procedure TReportElementTest.TestEquals4;
  991. var
  992. E: TFPReportElement;
  993. begin
  994. E := TMyFPReportElement.Create(nil);
  995. try
  996. FC.Layout.Top := 1;
  997. E.Assign(FC);
  998. E.Layout.Top := 2;
  999. AssertEquals('Changed layout makes unequal', False, FC.Equals(E));
  1000. AssertEquals('Changed layout makes unequal', False, E.Equals(FC));
  1001. finally
  1002. E.Free;
  1003. end;
  1004. end;
  1005. procedure TReportElementTest.TestEquals5;
  1006. var
  1007. E: TFPReportElement;
  1008. begin
  1009. E := TMyFPReportElement.Create(nil);
  1010. try
  1011. FC.Layout.Top := 1;
  1012. E.Assign(FC);
  1013. E.Frame.Lines := [flLeft];
  1014. AssertEquals('Changed frame makes unequal', False, FC.Equals(E));
  1015. AssertEquals('Changed frame makes unequal', False, E.Equals(FC));
  1016. finally
  1017. E.Free;
  1018. end;
  1019. end;
  1020. { TTestReportFrame }
  1021. procedure TTestReportFrame.TestCreate;
  1022. begin
  1023. AssertEquals('Failed on 1', 1, FC.Frame.Width);
  1024. AssertEquals('Failed on 2',
  1025. GetEnumName(TYpeInfo(TFPPenStyle), Ord(psSolid)),
  1026. GetEnumName(TYpeInfo(TFPPenStyle), Ord(FC.Frame.Pen)));
  1027. if not (FC.Frame.Lines = []) then
  1028. Fail('Failed on 3');
  1029. AssertEquals('Failed on 4',
  1030. GetEnumName(TypeInfo(TFPReportFrameShape), Ord(fsNone)),
  1031. GetEnumName(TypeInfo(TFPReportFrameShape), Ord(FC.Frame.Shape)));
  1032. end;
  1033. procedure TTestReportFrame.TestWidthChange;
  1034. begin
  1035. FC.Frame.Width := 2;
  1036. AssertEquals('Setting Width calls onChange', 1, FC.ChangedCalled);
  1037. end;
  1038. procedure TTestReportFrame.TestColorChange;
  1039. begin
  1040. FC.Frame.Color := 3;
  1041. AssertEquals('Setting Solor calls onChange', 1, FC.ChangedCalled);
  1042. end;
  1043. procedure TTestReportFrame.TestPenStyleChange;
  1044. begin
  1045. FC.Frame.Pen := psDot;
  1046. AssertEquals('Setting pen calls onChange', 1, FC.ChangedCalled);
  1047. end;
  1048. procedure TTestReportFrame.TestShapeChange;
  1049. begin
  1050. FC.Frame.Shape := fsRoundedRect;
  1051. AssertEquals('Setting pen calls onChange', 1, FC.ChangedCalled);
  1052. end;
  1053. procedure TTestReportFrame.TestLinesChange;
  1054. begin
  1055. FC.Frame.Lines := [flBottom];
  1056. AssertEquals('Setting pen calls onChange', 1, FC.ChangedCalled);
  1057. end;
  1058. procedure TTestReportFrame.TestAssign;
  1059. var
  1060. F: TFPReportFrame;
  1061. begin
  1062. F := TFPReportFrame.Create(nil);
  1063. try
  1064. F.Width := 3;
  1065. F.Lines := [flBottom, flTop];
  1066. F.Color := 4;
  1067. F.Pen := psDot;
  1068. F.Shape := fsRoundedRect;
  1069. FC.Frame.Assign(F);
  1070. AssertSame('ReportElement not copied', FC, FC.Frame.ReportElement);
  1071. AssertEquals('Assert calls changed', 1, FC.ChangedCalled);
  1072. AssertEquals('Frame width equals 3', F.Width, FC.Frame.Width);
  1073. AssertEquals('Frame penstyle equals psDot',
  1074. GetEnumName(TYpeInfo(TFPPenStyle), Ord(F.Pen)),
  1075. GetEnumName(TYpeInfo(TFPPenStyle), Ord(FC.Frame.Pen)));
  1076. if not (FC.Frame.Lines = F.Lines) then
  1077. Fail('Frame lines not copied correctly');
  1078. AssertEquals('Frame shape correctly copied',
  1079. GetEnumName(TypeInfo(TFPReportFrameShape), Ord(F.Shape)),
  1080. GetEnumName(TypeInfo(TFPReportFrameShape), Ord(FC.Frame.Shape)));
  1081. finally
  1082. F.Free;
  1083. end;
  1084. end;
  1085. procedure TTestReportFrame.TestEquals1;
  1086. var
  1087. F: TFPReportFrame;
  1088. begin
  1089. F := TFPReportFrame.Create(nil);
  1090. try
  1091. FC.Frame.Width := 3;
  1092. FC.Frame.Lines := [flBottom, flTop];
  1093. FC.Frame.Color := 4;
  1094. FC.Frame.Pen := psDot;
  1095. FC.Frame.Shape := fsRoundedRect;
  1096. F.Assign(FC.Frame);
  1097. F.Width := 2;
  1098. AssertEquals('Width changed makes unequal', False, FC.Frame.Equals(F));
  1099. AssertEquals('Width changed makes unequal', False, F.Equals(FC.Frame));
  1100. finally
  1101. F.Free;
  1102. end;
  1103. end;
  1104. procedure TTestReportFrame.TestEquals2;
  1105. var
  1106. F: TFPReportFrame;
  1107. begin
  1108. F := TFPReportFrame.Create(nil);
  1109. try
  1110. FC.Frame.Width := 3;
  1111. FC.Frame.Lines := [flBottom, flTop];
  1112. FC.Frame.Color := 4;
  1113. FC.Frame.Pen := psDot;
  1114. FC.Frame.Shape := fsRoundedRect;
  1115. F.Assign(FC.Frame);
  1116. F.Color := 2;
  1117. AssertEquals('Color changed makes unequal', False, FC.Frame.Equals(F));
  1118. AssertEquals('Color changed makes unequal', False, F.Equals(FC.Frame));
  1119. finally
  1120. F.Free;
  1121. end;
  1122. end;
  1123. procedure TTestReportFrame.TestEquals3;
  1124. var
  1125. F: TFPReportFrame;
  1126. begin
  1127. F := TFPReportFrame.Create(nil);
  1128. try
  1129. FC.Frame.Width := 3;
  1130. FC.Frame.Lines := [flBottom, flTop];
  1131. FC.Frame.Color := 4;
  1132. FC.Frame.Pen := psDot;
  1133. FC.Frame.Shape := fsRoundedRect;
  1134. F.Assign(FC.Frame);
  1135. F.Pen := psDash;
  1136. AssertEquals('Pen changed makes unequal', False, FC.Frame.Equals(F));
  1137. AssertEquals('Pen changed makes unequal', False, F.Equals(FC.Frame));
  1138. finally
  1139. F.Free;
  1140. end;
  1141. end;
  1142. procedure TTestReportFrame.TestEquals4;
  1143. var
  1144. F: TFPReportFrame;
  1145. begin
  1146. F := TFPReportFrame.Create(nil);
  1147. try
  1148. FC.Frame.Width := 3;
  1149. FC.Frame.Lines := [flBottom, flTop];
  1150. FC.Frame.Color := 4;
  1151. FC.Frame.Pen := psDot;
  1152. FC.Frame.Shape := fsRoundedRect;
  1153. F.Assign(FC.Frame);
  1154. F.Shape := fsShadow;
  1155. AssertEquals('Shape changed makes unequal', False, FC.Frame.Equals(F));
  1156. AssertEquals('Shape changed makes unequal', False, F.Equals(FC.Frame));
  1157. finally
  1158. F.Free;
  1159. end;
  1160. end;
  1161. procedure TTestReportFrame.TestEquals5;
  1162. var
  1163. F: TFPReportFrame;
  1164. begin
  1165. F := TFPReportFrame.Create(nil);
  1166. try
  1167. FC.Frame.Width := 3;
  1168. FC.Frame.Lines := [flBottom, flTop];
  1169. FC.Frame.Color := 4;
  1170. FC.Frame.Pen := psDot;
  1171. FC.Frame.Shape := fsRoundedRect;
  1172. F.Assign(FC.Frame);
  1173. F.Lines := [flLeft, flRight];
  1174. AssertEquals('Lines changed makes unequal', False, FC.Frame.Equals(F));
  1175. AssertEquals('Lines changed makes unequal', False, F.Equals(FC.Frame));
  1176. finally
  1177. F.Free;
  1178. end;
  1179. end;
  1180. procedure TTestReportFrame.TestEquals6;
  1181. begin
  1182. AssertEquals('Same frame always equals', True, FC.Frame.Equals(FC.Frame));
  1183. end;
  1184. procedure TTestReportFrame.TestEquals7;
  1185. var
  1186. F: TFPReportFrame;
  1187. begin
  1188. F := TFPReportFrame.Create(nil);
  1189. try
  1190. FC.Frame.Width := 3;
  1191. FC.Frame.Lines := [flBottom, flTop];
  1192. FC.Frame.Color := 4;
  1193. FC.Frame.Pen := psDot;
  1194. FC.Frame.Shape := fsRoundedRect;
  1195. F.Assign(FC.Frame);
  1196. AssertEquals('Equals after assign', True, FC.Frame.Equals(F));
  1197. AssertEquals('Equals after assign', True, F.Equals(FC.Frame));
  1198. finally
  1199. F.Free;
  1200. end;
  1201. end;
  1202. { TTestReportLayout }
  1203. procedure TTestReportLayout.TestCreate;
  1204. begin
  1205. AssertEquals('Top is zero', 0, FC.Layout.top);
  1206. AssertEquals('Left is zero', 0, FC.Layout.Left);
  1207. AssertEquals('Width is zero', 0, FC.Layout.Width);
  1208. AssertEquals('Height is zero', 0, FC.Layout.Width);
  1209. end;
  1210. procedure TTestReportLayout.TestTopChange;
  1211. begin
  1212. FC.Layout.Top := 2;
  1213. AssertEquals('Setting top calls onChange', 1, FC.ChangedCalled);
  1214. end;
  1215. procedure TTestReportLayout.TestLeftChange;
  1216. begin
  1217. FC.Layout.Left := 2;
  1218. AssertEquals('Setting left calls onChange', 1, FC.ChangedCalled);
  1219. end;
  1220. procedure TTestReportLayout.TestWidthChange;
  1221. begin
  1222. FC.Layout.Width := 2;
  1223. AssertEquals('Setting width calls onChange', 1, FC.ChangedCalled);
  1224. end;
  1225. procedure TTestReportLayout.TestHeightChange;
  1226. begin
  1227. FC.Layout.Height := 2;
  1228. AssertEquals('Setting Height calls onChange', 1, FC.ChangedCalled);
  1229. end;
  1230. procedure TTestReportLayout.TestAssign;
  1231. var
  1232. L: TFPReportLayout;
  1233. begin
  1234. L := TFPReportlayout.Create(nil);
  1235. try
  1236. FC.Layout.Top := 1;
  1237. FC.Layout.Left := 1;
  1238. FC.Layout.Width := 10;
  1239. FC.Layout.Height := 10;
  1240. L.Assign(FC.Layout);
  1241. AssertEquals('Top correct', FC.Layout.Top, L.Top);
  1242. AssertEquals('Left correct', FC.Layout.Left, L.Left);
  1243. AssertEquals('Width correct', FC.Layout.Width, L.Width);
  1244. AssertEquals('Height correct', FC.Layout.Height, L.Height);
  1245. finally
  1246. L.Free;
  1247. end;
  1248. end;
  1249. procedure TTestReportLayout.TestEquals1;
  1250. var
  1251. L: TFPReportLayout;
  1252. begin
  1253. L := TFPReportlayout.Create(nil);
  1254. try
  1255. FC.Layout.Top := 1;
  1256. FC.Layout.Left := 1;
  1257. FC.Layout.Width := 10;
  1258. FC.Layout.Height := 10;
  1259. L.Assign(FC.Layout);
  1260. FC.Layout.Top := 2;
  1261. AssertEquals('Top changed makes unequal', False, FC.Layout.Equals(L));
  1262. AssertEquals('Top changed makes unequal', False, L.Equals(FC.Layout));
  1263. finally
  1264. L.Free;
  1265. end;
  1266. end;
  1267. procedure TTestReportLayout.TestEquals2;
  1268. var
  1269. L: TFPReportLayout;
  1270. begin
  1271. L := TFPReportlayout.Create(nil);
  1272. try
  1273. FC.Layout.Top := 1;
  1274. FC.Layout.Left := 1;
  1275. FC.Layout.Width := 10;
  1276. FC.Layout.Height := 10;
  1277. L.Assign(FC.Layout);
  1278. FC.Layout.Left := 2;
  1279. AssertEquals('Left changed makes unequal', False, FC.Layout.Equals(L));
  1280. AssertEquals('Left changed makes unequal', False, L.Equals(FC.Layout));
  1281. finally
  1282. L.Free;
  1283. end;
  1284. end;
  1285. procedure TTestReportLayout.TestEquals3;
  1286. var
  1287. L: TFPReportLayout;
  1288. begin
  1289. L := TFPReportlayout.Create(nil);
  1290. try
  1291. FC.Layout.Top := 1;
  1292. FC.Layout.Left := 1;
  1293. FC.Layout.Width := 10;
  1294. FC.Layout.Height := 10;
  1295. L.Assign(FC.Layout);
  1296. FC.Layout.Width := 2;
  1297. AssertEquals('Width changed makes unequal', False, FC.Layout.Equals(L));
  1298. AssertEquals('Width changed makes unequal', False, L.Equals(FC.Layout));
  1299. finally
  1300. L.Free;
  1301. end;
  1302. end;
  1303. procedure TTestReportLayout.TestEquals4;
  1304. var
  1305. L: TFPReportLayout;
  1306. begin
  1307. L := TFPReportlayout.Create(nil);
  1308. try
  1309. FC.Layout.Top := 1;
  1310. FC.Layout.Left := 1;
  1311. FC.Layout.Width := 10;
  1312. FC.Layout.Height := 10;
  1313. L.Assign(FC.Layout);
  1314. FC.Layout.Height := 2;
  1315. AssertEquals('Height changed makes unequal', False, FC.Layout.Equals(L));
  1316. AssertEquals('Height changed makes unequal', False, L.Equals(FC.Layout));
  1317. finally
  1318. L.Free;
  1319. end;
  1320. end;
  1321. procedure TTestReportLayout.TestEquals5;
  1322. var
  1323. L: TFPReportLayout;
  1324. begin
  1325. L := TFPReportlayout.Create(nil);
  1326. try
  1327. FC.Layout.Top := 1;
  1328. FC.Layout.Left := 1;
  1329. FC.Layout.Width := 10;
  1330. FC.Layout.Height := 10;
  1331. L.Assign(FC.Layout);
  1332. AssertEquals('Assign results in equal', True, FC.Layout.Equals(L));
  1333. AssertEquals('Assign results in equal', True, L.Equals(FC.Layout));
  1334. finally
  1335. L.Free;
  1336. end;
  1337. end;
  1338. procedure TTestReportLayout.TestEquals6;
  1339. begin
  1340. AssertEquals('Assign results in equal', True, FC.Layout.Equals(FC.Layout));
  1341. end;
  1342. { TTestReportChildren }
  1343. procedure TTestReportChildren.SetUp;
  1344. begin
  1345. FC := TMyFPReportElementWithChildren.Create(nil);
  1346. FC2 := TMyFPReportElementWithChildren.Create(nil);
  1347. FChild := TFPReportElement.Create(nil);
  1348. end;
  1349. procedure TTestReportChildren.TearDown;
  1350. begin
  1351. FreeAndNil(FChild);
  1352. FreeAndNil(FC);
  1353. FreeAndNil(FC2);
  1354. end;
  1355. procedure TTestReportChildren.WrongParent;
  1356. begin
  1357. FC.Parent := FChild;
  1358. end;
  1359. procedure TTestReportChildren.TestCreate;
  1360. begin
  1361. AssertEquals('No children at create', 0, FC.ChildCount);
  1362. end;
  1363. procedure TTestReportChildren.TestSetParent1;
  1364. begin
  1365. AssertException('Cannot set TReportElement as parent', EReportError, @WrongParent);
  1366. end;
  1367. procedure TTestReportChildren.TestSetParent2;
  1368. begin
  1369. FChild.parent := FC;
  1370. AssertSame('Parent was saved', FC, FChild.parent);
  1371. AssertEquals('Changed was called', 1, FC.ChangedCalled);
  1372. AssertEquals('Parent childcount is 1', 1, FC.ChildCount);
  1373. AssertSame('Parent first child is OK', FChild, FC.Child[0]);
  1374. end;
  1375. procedure TTestReportChildren.TestSetParent3;
  1376. var
  1377. E: TFPReportElementWithChildren;
  1378. begin
  1379. FChild.parent := FC;
  1380. AssertSame('Parent was saved', FC, FChild.parent);
  1381. AssertEquals('Parent childcount is 1', 1, FC.ChildCount);
  1382. AssertSame('Parent first child is OK', FChild, FC.Child[0]);
  1383. FC.ResetChanged;
  1384. FChild.Parent := FC2;
  1385. AssertSame('Parent was saved', FC2, FChild.parent);
  1386. AssertEquals('Changed was called', 1, FC.ChangedCalled);
  1387. AssertEquals('Old Parent childcount is 0', 0, FC.ChildCount);
  1388. AssertEquals('Parent childcount is 1', 1, FC2.ChildCount);
  1389. AssertSame('Parent first child is OK', FChild, FC2.Child[0]);
  1390. end;
  1391. procedure TTestReportChildren.TestSetParent4;
  1392. begin
  1393. FChild.parent := FC;
  1394. AssertSame('Parent was saved', FC, FChild.parent);
  1395. AssertEquals('Parent childcount is 1', 1, FC.ChildCount);
  1396. AssertSame('Parent first child is OK', FChild, FC.Child[0]);
  1397. FreeAndNil(FC);
  1398. //FChild is freed due to free of parent
  1399. //AssertNull('Child parent was removed when parent is freed', FChild.Parent);
  1400. FChild := Nil;
  1401. end;
  1402. procedure TTestReportChildren.TestSetParent6;
  1403. begin
  1404. FChild.parent := FC;
  1405. AssertSame('Parent was saved', FC, FChild.parent);
  1406. AssertEquals('Parent childcount is 1', 1, FC.ChildCount);
  1407. AssertSame('Parent first child is OK', FChild, FC.Child[0]);
  1408. FChild.parent := nil;
  1409. AssertNull('Child parent was removed when parent is freed', FChild.Parent);
  1410. end;
  1411. procedure TTestReportChildren.TestSetParent5;
  1412. begin
  1413. FChild.parent := FC;
  1414. AssertSame('Parent was saved', FC, FChild.parent);
  1415. AssertEquals('Parent childcount is 1', 1, FC.ChildCount);
  1416. AssertSame('Parent first child is OK', FChild, FC.Child[0]);
  1417. FreeAndNil(FChild);
  1418. AssertEquals('Child removed when freed', 0, FC.ChildCount);
  1419. end;
  1420. { TMyFPReportElementWithChildren }
  1421. procedure TMyFPReportElementWithChildren.CallChange;
  1422. begin
  1423. Changed;
  1424. end;
  1425. procedure TMyFPReportElementWithChildren.ResetChanged;
  1426. begin
  1427. FChangedCalled := 0;
  1428. end;
  1429. procedure TMyFPReportElementWithChildren.DoChanged;
  1430. begin
  1431. inherited DoChanged;
  1432. Inc(FChangedCalled);
  1433. end;
  1434. { TTestFPPageSize }
  1435. procedure TTestFPPageSize.TestCreate;
  1436. var
  1437. F: TFPReportPaperSize;
  1438. begin
  1439. F := TFPReportPaperSize.Create(1.23, 3.45);
  1440. try
  1441. AssertEquals('Width stored correctly', 1.23, F.Width, 0.001);
  1442. AssertEquals('Height stored correctly', 3.45, F.Height, 0.001);
  1443. finally
  1444. F.Free;
  1445. end;
  1446. end;
  1447. { TTestFPPaperManager }
  1448. procedure TTestFPPapers.Setup;
  1449. begin
  1450. FM := TFPReportPaperManager.Create(nil);
  1451. AssertNotNull(FM);
  1452. end;
  1453. procedure TTestFPPapers.TearDown;
  1454. begin
  1455. FreeAndNil(FM);
  1456. end;
  1457. procedure TTestFPPapers.RegisterPapers(ACount: integer; Local: boolean = True);
  1458. var
  1459. F: TFPReportPaperManager;
  1460. begin
  1461. if local then
  1462. F := FM
  1463. else
  1464. F := PaperManager;
  1465. if (ACount >= 1) then
  1466. F.RegisterPaper('P3', 1.0, 2.0);
  1467. if (ACount >= 2) then
  1468. F.RegisterPaper('P2', 4.0, 8.0);
  1469. if (ACount >= 3) then
  1470. F.RegisterPaper('P1', 16.0, 32.0);
  1471. end;
  1472. procedure TTestFPPaperManager.TestAccess;
  1473. begin
  1474. case FAccess of
  1475. 0: FM.PaperNames[-1];
  1476. 1: FM.PaperNames[FM.PaperCount];
  1477. 2: FM.PaperHeight[-1];
  1478. 3: FM.PaperHeight[FM.PaperCount];
  1479. 4: FM.PaperWidth[-1];
  1480. 5: FM.PaperWidth[FM.PaperCount];
  1481. 6: FM.WidthByName['NoPaper'];
  1482. 7: FM.HeightByName['NoPaper'];
  1483. end;
  1484. end;
  1485. procedure TTestFPPaperManager.Setup;
  1486. begin
  1487. inherited Setup;
  1488. FAccess := -1;
  1489. end;
  1490. procedure TTestFPPaperManager.TestCreate;
  1491. begin
  1492. AssertEquals('No registered papers', 0, FM.PaperCount);
  1493. end;
  1494. procedure TTestFPPaperManager.TestRegister1;
  1495. begin
  1496. RegisterPapers(1);
  1497. AssertEquals('1 registered paper', 1, FM.PaperCount);
  1498. AssertEquals('Correct name', 'P3', FM.PaperNames[0]);
  1499. end;
  1500. procedure TTestFPPaperManager.TestRegister2;
  1501. begin
  1502. RegisterPapers(2);
  1503. AssertEquals('2 registered papers', 2, FM.PaperCount);
  1504. AssertEquals('Correct name paper 1', 'P2', FM.PaperNames[0]);
  1505. AssertEquals('Correct name paper 2', 'P3', FM.PaperNames[1]);
  1506. end;
  1507. procedure TTestFPPaperManager.TestRegister3;
  1508. begin
  1509. RegisterPapers(3);
  1510. AssertEquals('3 registered papers', 3, FM.PaperCount);
  1511. AssertEquals('Correct name paper 1', 'P1', FM.PaperNames[0]);
  1512. AssertEquals('Correct name paper 2', 'P2', FM.PaperNames[1]);
  1513. AssertEquals('Correct name paper 3', 'P3', FM.PaperNames[2]);
  1514. end;
  1515. procedure TTestFPPaperManager.TestRegisterDuplicate;
  1516. begin
  1517. RegisterPapers(2);
  1518. AssertEquals('2 registered papers', 2, FM.PaperCount);
  1519. AssertEquals('Correct name paper 1', 'P2', FM.PaperNames[0]);
  1520. AssertEquals('Correct name paper 2', 'P3', FM.PaperNames[1]);
  1521. try
  1522. FM.RegisterPaper('P3', 10.0, 20.0);
  1523. Fail('We expected an exception to be raised.');
  1524. except
  1525. on E: Exception do
  1526. begin
  1527. AssertEquals('Exception class', 'EReportError', E.ClassName);
  1528. AssertEquals('Exception message', 'Paper name P3 already exists', E.Message);
  1529. end;
  1530. end;
  1531. end;
  1532. procedure TTestFPPaperManager.TestClear;
  1533. begin
  1534. RegisterPapers(2);
  1535. AssertEquals('2 registered papers', 2, FM.PaperCount);
  1536. AssertEquals('Correct name paper 1', 'P2', FM.PaperNames[0]);
  1537. AssertEquals('Correct name paper 2', 'P3', FM.PaperNames[1]);
  1538. FM.Clear;
  1539. AssertEquals('0 registered papers', 0, FM.PaperCount);
  1540. end;
  1541. procedure TTestFPPaperManager.TestFind1;
  1542. begin
  1543. AssertEquals('No paper registered', -1, FM.IndexOfPaper('P1'));
  1544. end;
  1545. procedure TTestFPPaperManager.TestFind2;
  1546. begin
  1547. RegisterPapers(3);
  1548. AssertEquals('No paper registered', -1, FM.IndexOfPaper('PA1'));
  1549. end;
  1550. procedure TTestFPPaperManager.TestFind3;
  1551. begin
  1552. RegisterPapers(3);
  1553. AssertEquals('3 registered papers', 3, FM.PaperCount);
  1554. AssertEquals('Find P1 OK', 0, FM.IndexOfPaper('P1'));
  1555. AssertEquals('Find P2 OK', 1, FM.IndexOfPaper('P2'));
  1556. AssertEquals('Find P3 OK', 2, FM.IndexOfPaper('P3'));
  1557. end;
  1558. procedure TTestFPPaperManager.IllegalAccess1;
  1559. begin
  1560. RegisterPapers(3);
  1561. FAccess := 0;
  1562. AssertException('Papername[-1]', EStringListError, @TestAccess);
  1563. end;
  1564. procedure TTestFPPaperManager.IllegalAccess2;
  1565. begin
  1566. RegisterPapers(3);
  1567. FAccess := 1;
  1568. AssertException('Papername[3]', EStringListError, @TestAccess);
  1569. end;
  1570. procedure TTestFPPaperManager.IllegalAccess3;
  1571. begin
  1572. RegisterPapers(3);
  1573. FAccess := 2;
  1574. AssertException('PaperHeight[-1]', EStringListError, @TestAccess);
  1575. end;
  1576. procedure TTestFPPaperManager.IllegalAccess4;
  1577. begin
  1578. RegisterPapers(3);
  1579. FAccess := 3;
  1580. AssertException('PaperHeight[3]', EStringListError, @TestAccess);
  1581. end;
  1582. procedure TTestFPPaperManager.IllegalAccess5;
  1583. begin
  1584. RegisterPapers(3);
  1585. FAccess := 4;
  1586. AssertException('PaperWidth[-1]', EStringListError, @TestAccess);
  1587. end;
  1588. procedure TTestFPPaperManager.IllegalAccess6;
  1589. begin
  1590. RegisterPapers(3);
  1591. FAccess := 5;
  1592. AssertException('PaperWidth[3]', EStringListError, @TestAccess);
  1593. end;
  1594. procedure TTestFPPaperManager.IllegalAccess7;
  1595. begin
  1596. RegisterPapers(3);
  1597. FAccess := 6;
  1598. AssertException('WidthByName[NoPaper]', EReportError, @TestAccess);
  1599. end;
  1600. procedure TTestFPPaperManager.IllegalAccess8;
  1601. begin
  1602. RegisterPapers(3);
  1603. FAccess := 7;
  1604. AssertException('WidthByName[NoPaper]', EReportError, @TestAccess);
  1605. end;
  1606. procedure TTestFPPaperManager.TestWidth;
  1607. begin
  1608. RegisterPapers(3);
  1609. AssertEquals('Paper width 0', 16.0, FM.PaperWidth[0]);
  1610. AssertEquals('Paper width 1', 4.0, FM.PaperWidth[1]);
  1611. AssertEquals('Paper width 2', 1.0, FM.PaperWidth[2]);
  1612. AssertEquals('Width[P1]', 16.0, FM.WidthByName['P1']);
  1613. AssertEquals('Width[P2]', 4.0, FM.WidthByName['P2']);
  1614. AssertEquals('Width[P3]', 1, FM.WidthByName['P3']);
  1615. end;
  1616. procedure TTestFPPaperManager.TestHeight;
  1617. begin
  1618. RegisterPapers(3);
  1619. AssertEquals('Paper height 0', 32.0, FM.PaperHeight[0]);
  1620. AssertEquals('Paper height 1', 8.0, FM.PaperHeight[1]);
  1621. AssertEquals('Paper height 2', 2.0, FM.PaperHeight[2]);
  1622. AssertEquals('Height[P1]', 32.0, FM.HeightByName['P1']);
  1623. AssertEquals('Height[P2]', 8.0, FM.HeightByName['P2']);
  1624. AssertEquals('Height[P3]', 2, FM.HeightByName['P3']);
  1625. end;
  1626. { TMyFPReportPageSize }
  1627. procedure TMyFPReportPageSize.ResetChanged;
  1628. begin
  1629. FChangedCalled := 0;
  1630. end;
  1631. procedure TMyFPReportPageSize.Changed;
  1632. begin
  1633. Inc(FChangedCalled);
  1634. inherited Changed;
  1635. end;
  1636. { TTestFPReportPageSize }
  1637. procedure TTestFPReportPageSize.Setup;
  1638. begin
  1639. inherited Setup;
  1640. FP := TMyFPReportPageSize.Create(nil);
  1641. end;
  1642. procedure TTestFPReportPageSize.TearDown;
  1643. begin
  1644. FreeAndNil(FP);
  1645. inherited TearDown;
  1646. end;
  1647. procedure TTestFPReportPageSize.TestCreate;
  1648. begin
  1649. AssertNull('No page', FP.Page);
  1650. AssertEquals('Zero width at create', 0.0, FP.Width);
  1651. AssertEquals('Zero height at create', 0.0, FP.Height);
  1652. AssertEquals('No paper name', '', FP.PaperName);
  1653. end;
  1654. procedure TTestFPReportPageSize.TestCreateWithPage;
  1655. var
  1656. P: TFPReportPage;
  1657. F: TFPReportPageSize;
  1658. begin
  1659. P := TFPReportPage.Create(nil);
  1660. try
  1661. F := TFPReportPageSize.Create(P);
  1662. try
  1663. AssertSame('Pagesize created with page has page as page', P, F.Page);
  1664. finally
  1665. F.Free;
  1666. end;
  1667. finally
  1668. P.Free
  1669. end;
  1670. end;
  1671. procedure TTestFPReportPageSize.TestCreateByPage;
  1672. var
  1673. P: TFPReportPage;
  1674. begin
  1675. P := TFPReportPage.Create(nil);
  1676. try
  1677. AssertSame('Pagesize created with page has page as page', P, P.PageSize.Page);
  1678. finally
  1679. P.Free
  1680. end;
  1681. end;
  1682. procedure TTestFPReportPageSize.TestChanged1;
  1683. begin
  1684. FP.Width := 1.23;
  1685. AssertEquals('Setting width triggers change', 1, FP.ChangedCalled);
  1686. end;
  1687. procedure TTestFPReportPageSize.TestChanged2;
  1688. begin
  1689. FP.Height := 1.23;
  1690. AssertEquals('Setting height triggers change', 1, FP.ChangedCalled);
  1691. end;
  1692. procedure TTestFPReportPageSize.TestChanged3;
  1693. begin
  1694. FP.PaperName := 'ABC';
  1695. AssertEquals('Setting paper name without associated paper does not trigger change', 0, FP.ChangedCalled);
  1696. end;
  1697. procedure TTestFPReportPageSize.TestPaperName1;
  1698. var
  1699. F: TFPReportPaperManager;
  1700. begin
  1701. F := PaperManager;
  1702. if F.PaperCount = 0 then
  1703. Registerpapers(3, False);
  1704. FP.PaperName := F.PaperNames[0];
  1705. AssertEquals('Setting papername sets width', F.PaperWidth[0], FP.Width);
  1706. AssertEquals('Setting papername sets height', F.PaperHeight[0], FP.Height);
  1707. AssertEquals('Setting papername calls changed once', 1, FP.ChangedCalled);
  1708. end;
  1709. procedure TTestFPReportPageSize.TestPaperName2;
  1710. var
  1711. F: TFPReportPaperManager;
  1712. begin
  1713. F := PaperManager;
  1714. if F.PaperCount = 0 then
  1715. Registerpapers(3, False);
  1716. FP.PaperName := F.PaperNames[0];
  1717. AssertEquals('Setting papername sets width', F.PaperWidth[0], FP.Width);
  1718. AssertEquals('Setting papername sets height', F.PaperHeight[0], FP.Height);
  1719. FP.ResetChanged;
  1720. FP.PaperName := 'aloha'; // Non existing
  1721. AssertEquals('Setting non-existing papername leaves width', F.PaperWidth[0], FP.Width);
  1722. AssertEquals('Setting non-existing papername leaves height', F.PaperHeight[0], FP.Height);
  1723. AssertEquals('Setting non-existing papername does not call changed', 0, FP.ChangedCalled);
  1724. end;
  1725. procedure TTestFPReportPageSize.TestAssign;
  1726. var
  1727. F: TMyFPreportPageSize;
  1728. begin
  1729. F := TMyFPreportPageSize.Create(nil);
  1730. try
  1731. FP.PaperName := 'me';
  1732. FP.Width := 1.23;
  1733. FP.Height := 4.56;
  1734. F.Assign(FP);
  1735. AssertEquals('Assign assigns Width', FP.Width, F.Width);
  1736. AssertEquals('Assign assigns height', FP.Height, F.Height);
  1737. AssertEquals('Assign assigns papername', FP.PaperName, F.PaperName);
  1738. AssertEquals('Assign calls Changed once', 1, F.ChangedCalled);
  1739. finally
  1740. F.Free;
  1741. end;
  1742. end;
  1743. { TMyFPReportPage }
  1744. procedure TMyFPReportPage.SetupPage;
  1745. begin
  1746. Orientation := poPortrait;
  1747. { paper size }
  1748. PageSize.PaperName := 'A4';
  1749. { page margins }
  1750. Margins.Left := 30;
  1751. Margins.Top := 20;
  1752. Margins.Right := 30;
  1753. Margins.Bottom := 20;
  1754. end;
  1755. procedure TMyFPReportPage.PrepareObjects(aRTParent: TFPReportElement);
  1756. begin
  1757. Inc(FPrepareObjectsCalled);
  1758. inherited PrepareObjects(aRTParent);
  1759. end;
  1760. constructor TMyFPReportPage.Create(AOwner: TComponent);
  1761. begin
  1762. inherited Create(AOwner);
  1763. Font.Name := 'LiberationSerif';
  1764. end;
  1765. procedure TMyFPReportPage.ResetChanged;
  1766. begin
  1767. FChangedCalled := 0;
  1768. end;
  1769. procedure TMyFPReportPage.DoChanged;
  1770. begin
  1771. Inc(FChangedCalled);
  1772. inherited DoChanged;
  1773. end;
  1774. { TMyReportTitleBand }
  1775. procedure TMyReportTitleBand.PrepareObjects(aRTParent: TFPReportElement);
  1776. begin
  1777. Inc(FPrepareObjectsCalled);
  1778. inherited PrepareObjects(aRTParent);
  1779. end;
  1780. constructor TMyReportTitleBand.Create(AOwner: TComponent);
  1781. begin
  1782. inherited Create(AOwner);
  1783. Layout.Height := 20;
  1784. end;
  1785. { TMyDataBand }
  1786. procedure TMyDataBand.PrepareObjects(aRTParent: TFPReportElement);
  1787. begin
  1788. Inc(FPrepareObjectsCalled);
  1789. inherited PrepareObjects(aRTParent);
  1790. end;
  1791. constructor TMyDataBand.Create(AOwner: TComponent);
  1792. begin
  1793. inherited Create(AOwner);
  1794. Layout.Height := 10;
  1795. end;
  1796. { TTestReportPage }
  1797. procedure TTestReportPage.Setup;
  1798. begin
  1799. inherited Setup;
  1800. FP := TMyFPReportPage.Create(nil);
  1801. end;
  1802. procedure TTestReportPage.TearDown;
  1803. begin
  1804. FreeAndNil(FP);
  1805. inherited TearDown;
  1806. end;
  1807. procedure TTestReportPage.TestCreate1;
  1808. begin
  1809. AssertNull('Created page without parent has no report', FP.Report);
  1810. AssertNotNull('Created page has margins', FP.Margins);
  1811. AssertNotNull('Created page has pagesize', FP.PageSize);
  1812. AssertEquals('Orientation is portrait', Ord(poPortrait), Ord(FP.Orientation));
  1813. AssertEquals('No bands', 0, FP.BandCount);
  1814. end;
  1815. procedure TTestReportPage.TestCreate2;
  1816. var
  1817. R: TFPReport;
  1818. P: TMyFPReportPage;
  1819. begin
  1820. R := TFPReport.Create(nil);
  1821. try
  1822. P := TMyFPReportPage.Create(nil);
  1823. try
  1824. P.Report := R;
  1825. AssertSame('Page owner is report when created', R, P.Report);
  1826. AssertEquals('Report has one page', 1, R.PageCount);
  1827. AssertSame('Page added to pages', P, R.Pages[0]);
  1828. finally
  1829. R.Free;
  1830. end;
  1831. AssertNull('Report has notified page', P.Report);
  1832. finally
  1833. P.Free;
  1834. end;
  1835. end;
  1836. procedure TTestReportPage.TestCreate3;
  1837. var
  1838. R: TFPReport;
  1839. P: TMyFPReportPage;
  1840. begin
  1841. R := TFPReport.Create(nil);
  1842. P := TMyFPReportPage.Create(R); // Lets try passing Report as the AOwner in constructor
  1843. try
  1844. AssertSame('Page report is set', R, P.Report);
  1845. AssertSame('Page added to pages', P, R.Pages[0]);
  1846. P.Report := nil;
  1847. AssertEquals('No more pages', 0, R.PageCount);
  1848. finally
  1849. // This will free P as well, because R was set as the owner
  1850. R.Free;
  1851. end;
  1852. end;
  1853. procedure TTestReportPage.TestPageSize1;
  1854. begin
  1855. FP.ResetChanged;
  1856. FP.BeginUpdate;
  1857. try
  1858. FP.PageSize.Width := 10;
  1859. FP.PageSize.Height := 20;
  1860. finally
  1861. FP.EndUpdate;
  1862. end;
  1863. AssertEquals('Changed called', 1, FP.ChangedCalled);
  1864. AssertEquals('Top is zero', 0, FP.Layout.Top);
  1865. AssertEquals('Left is zero', 0, FP.Layout.Left);
  1866. AssertEquals('Width is pagewidth', FP.PageSize.Width, FP.Layout.Width);
  1867. AssertEquals('Height is pageheight', FP.PageSize.Height, FP.Layout.Height);
  1868. end;
  1869. procedure TTestReportPage.TestPageSize2;
  1870. begin
  1871. FP.ResetChanged;
  1872. FP.BeginUpdate;
  1873. try
  1874. FP.PageSize.Width := 10;
  1875. FP.PageSize.Height := 20;
  1876. FP.Margins.Left := 1;
  1877. FP.Margins.Right := 2;
  1878. FP.Margins.Top := 3;
  1879. FP.Margins.Bottom := 4;
  1880. finally
  1881. FP.EndUpdate;
  1882. end;
  1883. AssertEquals('Changed called', 1, FP.ChangedCalled);
  1884. AssertEquals('Top is top margin', 3, FP.Layout.Top);
  1885. AssertEquals('Left is left margin', 1, FP.Layout.Left);
  1886. AssertEquals('Width is pagewidth-rightmargin-leftmargin', 7, FP.Layout.Width);
  1887. AssertEquals('Height is pageheight-topmargin-bottommargin', 13, FP.Layout.Height);
  1888. end;
  1889. procedure TTestReportPage.TestPageSize3;
  1890. begin
  1891. FP.ResetChanged;
  1892. FP.BeginUpdate;
  1893. try
  1894. FP.Orientation := poLandScape;
  1895. FP.PageSize.Width := 10;
  1896. FP.PageSize.Height := 20;
  1897. FP.Margins.Left := 1;
  1898. FP.Margins.Right := 2;
  1899. FP.Margins.Top := 3;
  1900. FP.Margins.Bottom := 4;
  1901. finally
  1902. FP.EndUpdate;
  1903. end;
  1904. AssertEquals('Changed called', 1, FP.ChangedCalled);
  1905. AssertEquals('Top is top margin', 3, FP.Layout.Top);
  1906. AssertEquals('Left is left margin', 1, FP.Layout.Left);
  1907. AssertEquals('Width is pageheight-rightmargin-leftmargin', 17, FP.Layout.Width);
  1908. AssertEquals('Height is pagewidth-topmargin-bottommargin', 3, FP.Layout.Height);
  1909. end;
  1910. procedure TTestReportPage.TestBand1;
  1911. var
  1912. B: TFPReportCustomBand;
  1913. begin
  1914. B := TFPReportCustomBand.Create(nil);
  1915. try
  1916. FP.ResetChanged;
  1917. B.Parent := FP;
  1918. AssertEquals('Changed called', 1, FP.ChangedCalled);
  1919. AssertSame('Parent stored correctly', FP, B.Page);
  1920. AssertEquals('Bandcount correct', 1, FP.BandCount);
  1921. AssertSame('Bands[0] correct', B, FP.Bands[0]);
  1922. finally
  1923. B.Free;
  1924. end;
  1925. AssertEquals('Bandcount correct', 0, FP.BandCount);
  1926. end;
  1927. procedure TTestReportPage.TestBand2;
  1928. var
  1929. B: TFPReportCustomBand;
  1930. P: TMyFPReportPage;
  1931. begin
  1932. P := TMyFPReportPage.Create(nil);
  1933. try
  1934. B := TFPReportCustomBand.Create(nil);
  1935. try
  1936. B.Parent := P;
  1937. AssertSame('Parent stored correctly', P, B.Page);
  1938. AssertEquals('Bandcount correct', 1, P.BandCount);
  1939. AssertSame('Bands[0] correct', B, P.Bands[0]);
  1940. finally
  1941. B.Free;
  1942. end;
  1943. AssertEquals('Page notified that Band is gone', 0, P.BandCount);
  1944. finally
  1945. P.Free;
  1946. end;
  1947. end;
  1948. procedure TTestReportPage.TestData;
  1949. var
  1950. FData: TFPReportData;
  1951. begin
  1952. FData := TFPReportData.Create(nil);
  1953. try
  1954. FP.Data := FData;
  1955. finally
  1956. FData.Free;
  1957. end;
  1958. AssertNull('Data is cleared', FP.Data);
  1959. end;
  1960. procedure TTestReportPage.TestAssign;
  1961. var
  1962. E: TFPReportPage;
  1963. begin
  1964. E := TFPReportPage.Create(nil);
  1965. try
  1966. FP.Layout.Top := 1;
  1967. FP.Frame.Width := 2;
  1968. E.Assign(FP);
  1969. AssertEquals('Failed on 1', True, FP.Frame.Equals(E.Frame));
  1970. AssertEquals('Failed on 2', True, FP.Layout.Equals(E.Layout));
  1971. AssertEquals('Failed on 3', Ord(E.Orientation), Ord(FP.Orientation));
  1972. AssertEquals('Failed on 4', True, FP.Margins.Equals(E.Margins));
  1973. finally
  1974. E.Free;
  1975. end;
  1976. end;
  1977. procedure TTestReportPage.TestFindBand;
  1978. var
  1979. t: TFPReportTitleBand;
  1980. h: TFPReportPageHeaderBand;
  1981. f: TFPReportPageFooterBand;
  1982. d: TFPReportDataBand;
  1983. begin
  1984. t := TFPReportTitleBand.Create(FP);
  1985. h := TFPReportPageHeaderBand.Create(FP);
  1986. f := TFPReportPageFooterBand.Create(FP);
  1987. d := TFPReportDataBand.Create(FP);
  1988. AssertTrue('failed on 1', h = FP.FindBand(TFPReportPageHeaderBand));
  1989. AssertTrue('failed on 2', t <> FP.FindBand(TFPReportPageHeaderBand));
  1990. AssertTrue('failed on 3', t = FP.FindBand(TFPReportTitleBand));
  1991. AssertTrue('failed on 4', f = FP.FindBand(TFPReportPageFooterBand));
  1992. AssertTrue('failed on 5', d = FP.FindBand(TFPReportDataBand));
  1993. AssertTrue('failed on 6', FP.FindBand(TFPReportChildBand) = nil);
  1994. end;
  1995. { TMyFPReportData }
  1996. procedure TMyFPReportData.ResetCounts;
  1997. begin
  1998. FCC := 0;
  1999. FDFC := 0;
  2000. FEC := 0;
  2001. FFC := 0;
  2002. FNC := 0;
  2003. FOC := 0;
  2004. end;
  2005. procedure TMyFPReportData.DoInitDataFields;
  2006. begin
  2007. inherited DoInitDataFields;
  2008. Inc(FDFC);
  2009. end;
  2010. procedure TMyFPReportData.DoOpen;
  2011. begin
  2012. inherited DoOpen;
  2013. Inc(FOC);
  2014. end;
  2015. procedure TMyFPReportData.DoFirst;
  2016. begin
  2017. inherited DoFirst;
  2018. Inc(FFC);
  2019. end;
  2020. procedure TMyFPReportData.DoNext;
  2021. begin
  2022. inherited DoNext;
  2023. Inc(FNC);
  2024. end;
  2025. procedure TMyFPReportData.DoClose;
  2026. begin
  2027. inherited DoClose;
  2028. Inc(FCC);
  2029. end;
  2030. function TMyFPReportData.DoEOF: boolean;
  2031. begin
  2032. FOE := inherited DoEOF;
  2033. Inc(FEC);
  2034. Result := FReportEOF;
  2035. end;
  2036. { TTestReportData }
  2037. procedure TTestReportData.DoOpen(Sender: TObject);
  2038. begin
  2039. FHandler := True;
  2040. AssertEquals('OnOpen called before DoOpen', 0, FD.OpenCount);
  2041. AssertEquals('OnOpen called before InitFieldDefs', 0, FD.InitDataFieldsCount);
  2042. end;
  2043. procedure TTestReportData.DoNext(Sender: TObject);
  2044. begin
  2045. FHandler := True;
  2046. AssertEquals('DoNext not yet called in handler', 0, FD.NextCount);
  2047. AssertEquals('Recno is already 2 in donext', 2, FD.RecNo);
  2048. end;
  2049. procedure TTestReportData.Setup;
  2050. begin
  2051. inherited Setup;
  2052. FD := TMyFPReportData.Create(nil);
  2053. FHandler := False;
  2054. end;
  2055. procedure TTestReportData.TearDown;
  2056. begin
  2057. FreeAndNil(FD);
  2058. inherited TearDown;
  2059. end;
  2060. procedure TTestReportData.CreateFields;
  2061. begin
  2062. FD.DataFields.AddField('string', rfkString).DisplayWidth := 10;
  2063. FD.DataFields.AddField('boolean', rfkBoolean).DisplayWidth := 20;
  2064. FD.DataFields.AddField('integer', rfkInteger).DisplayWidth := 30;
  2065. FD.DataFields.AddField('float', rfkFloat).DisplayWidth := 40;
  2066. FD.DataFields.AddField('datetime', rfkDateTime).DisplayWidth := 50;
  2067. FD.Datafields.AddField('stream', rfkStream).DisplayWidth := 60;
  2068. end;
  2069. procedure TTestReportData.DoFieldByName;
  2070. var
  2071. F: TFPReportDataField;
  2072. begin
  2073. F := FD.Datafields.FieldByName('ohlala');
  2074. end;
  2075. procedure TTestReportData.TestCreate;
  2076. begin
  2077. AssertEquals('Closed recno is 0', 0, FD.RecNo);
  2078. AssertNotNull('DataFields created', FD.DataFields);
  2079. AssertEquals('Closed fieldcount is 0', 0, FD.DataFields.Count);
  2080. AssertSame('Datafields reportdata is self', FD, FD.DataFields.ReportData);
  2081. end;
  2082. procedure TTestReportData.TestOpen1;
  2083. begin
  2084. FD.OnOpen := @DoOpen;
  2085. FD.Open;
  2086. AssertEquals('OnOpen Handler called', True, FHandler);
  2087. AssertEquals('DoOpen called once', 1, FD.OpenCount);
  2088. AssertEquals('InitFieldDefs called once', 1, FD.InitDataFieldsCount);
  2089. AssertEquals('Recno is 1', 1, FD.RecNo);
  2090. end;
  2091. procedure TTestReportData.TestNext;
  2092. begin
  2093. FD.OnNext := @DoNext;
  2094. FD.Open;
  2095. FHandler := False;
  2096. FD.Next;
  2097. AssertEquals('OnNext Handler called', True, FHandler);
  2098. AssertEquals('DoNext Called once', 1, FD.NextCount);
  2099. AssertEquals('Recno is 2 after next', 2, FD.RecNo);
  2100. end;
  2101. procedure TTestReportData.TestInitFieldDefs;
  2102. begin
  2103. FD.InitFieldDefs;
  2104. AssertEquals('InitFieldDefs called once', 1, FD.InitDataFieldsCount);
  2105. end;
  2106. procedure TTestReportData.TestInitFieldDefs_OnlyAllowedOnce;
  2107. begin
  2108. FD.Open;
  2109. AssertEquals('Failed on 1', 1, FD.InitDataFieldsCount);
  2110. try
  2111. FD.InitFieldDefs;
  2112. Fail('Failed on 2. - we should not have reached here.');
  2113. except
  2114. on E: Exception do
  2115. begin
  2116. AssertEquals('Failed on 3', E.ClassName, 'EReportError');
  2117. end;
  2118. end;
  2119. AssertEquals('Failed on 4', 1, FD.InitDataFieldsCount);
  2120. end;
  2121. procedure TTestReportData.TestEOF1;
  2122. begin
  2123. FD.ReportEOF := True;
  2124. AssertEquals('ReportEOF works correctly', True, FD.EOF);
  2125. AssertEquals('Inherited EOF returns false', False, FD.OldEOF);
  2126. end;
  2127. procedure TTestReportData.TestAddDatafield;
  2128. var
  2129. F: TFPReportDataField;
  2130. begin
  2131. F := FD.DataFields.AddField('test', rfkBoolean);
  2132. AssertEquals('Boolean field Added', Ord(rfkBoolean), Ord(F.FieldKind));
  2133. AssertEquals('test field name Added', 'test', F.fieldname);
  2134. AssertEquals('0 width field Added', 0, F.DisplayWidth);
  2135. end;
  2136. procedure TTestReportData.TestDatafieldAdd;
  2137. var
  2138. I: TCollectionItem;
  2139. F: TFPReportDataField;
  2140. begin
  2141. I := FD.Datafields.Add;
  2142. AssertEquals('add creates TFPReportDataField', TFPReportDataField, I.ClassType);
  2143. F := I as TFPReportDataField;
  2144. AssertEquals('Default field of string kind', Ord(rfkString), Ord(F.FieldKind));
  2145. AssertEquals('Default field name empty', '', F.FieldName);
  2146. AssertEquals('Default field with 0', 0, F.DisplayWidth);
  2147. end;
  2148. procedure TTestReportData.AssertField(Prefix: string; F: TFPReportDataField; AFieldName: string;
  2149. AFieldKind: TFPReportFieldKind; ADisplayWidth: integer = 0);
  2150. var
  2151. S1, S2: string;
  2152. begin
  2153. AssertEquals(Prefix + ' has correct field name', AfieldName, F.FieldName);
  2154. S1 := GetEnumName(TypeInfo(TFPReportFieldKind), Ord(AFieldKind));
  2155. S2 := GetEnumName(TypeInfo(TFPReportFieldKind), Ord(F.FieldKind));
  2156. AssertEquals(Prefix + ' has corrrect fieldkind', S1, S2);
  2157. AssertEquals(Prefix + ' has correct fieldwidth', ADisplayWidth, F.DisplayWidth);
  2158. end;
  2159. procedure TTestReportData.TestCreateFields;
  2160. begin
  2161. CreateFields;
  2162. AssertEquals('Correct field count', 6, FD.FieldCount);
  2163. AssertField('Field 0', FD.DataFields[0], 'string', rfkString, 10);
  2164. AssertField('Field 1', FD.DataFields[1], 'boolean', rfkBoolean, 20);
  2165. AssertField('Field 2', FD.DataFields[2], 'integer', rfkInteger, 30);
  2166. AssertField('Field 3', FD.DataFields[3], 'float', rfkFloat, 40);
  2167. AssertField('Field 4', FD.DataFields[4], 'datetime', rfkDateTime, 50);
  2168. AssertField('Field 5', FD.DataFields[5], 'stream', rfkStream, 60);
  2169. end;
  2170. procedure TTestReportData.TestDatafieldIndexOf1;
  2171. begin
  2172. CreateFields;
  2173. AssertEquals('Finds field at pos 0', 0, FD.DataFields.IndexOfField('string'));
  2174. AssertEquals('Finds field at pos 3', 3, FD.DataFields.IndexOfField('float'));
  2175. AssertEquals('Finds field at pos 5', 5, FD.DataFields.IndexOfField('stream'));
  2176. AssertEquals('Finds field (casing) at pos 3', 3, FD.DataFields.IndexOfField('Float'));
  2177. end;
  2178. procedure TTestReportData.TestDatafieldIndexOf2;
  2179. begin
  2180. AssertEquals('No fields returns -1', -1, FD.DataFields.IndexOfField('string'));
  2181. CreateFields;
  2182. AssertEquals('Non-existing field returns -1', -1, FD.DataFields.IndexOfField('stringlslsl'));
  2183. end;
  2184. procedure TTestReportData.TestFindField1;
  2185. begin
  2186. AssertNull('No fields returns Nil', FD.DataFields.FindField('string'));
  2187. CreateFields;
  2188. AssertNull('Non-existing fields returns Nil', FD.DataFields.FindField('stringsss'));
  2189. end;
  2190. procedure TTestReportData.TestFindField2;
  2191. begin
  2192. CreateFields;
  2193. AssertSame('FindField returns correct field', FD.DataFields[0], FD.DataFields.FindField('string'));
  2194. AssertSame('FindField returns correct field', FD.DataFields[3], FD.DataFields.FindField('float'));
  2195. AssertSame('FindField returns correct field (case insensitive)', FD.DataFields[3], FD.DataFields.FindField('floaT'));
  2196. end;
  2197. procedure TTestReportData.TestFindByName1;
  2198. begin
  2199. CreateFields;
  2200. AssertSame('FieldByName returns correct field', FD.DataFields[0], FD.DataFields.FieldByName('string'));
  2201. end;
  2202. procedure TTestReportData.TestFindByName2;
  2203. begin
  2204. CreateFields;
  2205. AssertException('FieldByName (non-existent) raises exception', EReportError, @DoFieldByName);
  2206. end;
  2207. procedure TTestReportData.TestFieldAssign;
  2208. var
  2209. F1, F2: TFPReportDataField;
  2210. begin
  2211. F1 := TFPReportDataField.Create(nil);
  2212. try
  2213. f2 := TFPReportDataField.Create(nil);
  2214. try
  2215. F1.FieldKind := rfkBoolean;
  2216. F1.FieldName := 'bool';
  2217. F1.DisplayWidth := 12;
  2218. F2.Assign(F1);
  2219. AssertField('Assigned ', F2, 'bool', rfkBoolean, 12);
  2220. finally
  2221. F2.Free;
  2222. end;
  2223. finally
  2224. F1.Free;
  2225. end;
  2226. end;
  2227. procedure TTestReportData.TestGetValue;
  2228. var
  2229. v: variant;
  2230. begin
  2231. CreateFields;
  2232. v := FD.Datafields[0].GetValue;
  2233. AssertTrue('Failed on 1', V = Null);
  2234. end;
  2235. procedure TTestReportData.TestEasyAccessProperties;
  2236. var
  2237. I: integer;
  2238. begin
  2239. CreateFields;
  2240. for I := 0 to FD.FieldCount - 1 do
  2241. AssertEquals('FieldNames array OK', FD.DataFields[0].FieldName, FD.FieldNames[0]);
  2242. for I := 0 to FD.FieldCount - 1 do
  2243. AssertEquals('FieldWidth array OK', FD.DataFields[0].DisplayWidth, FD.FieldWidths[FD.FieldNames[0]]);
  2244. for I := 0 to FD.FieldCount - 1 do
  2245. AssertEquals('FieldTypes array OK', Ord(FD.DataFields[0].FieldKind), Ord(FD.FieldTypes[FD.FieldNames[0]]));
  2246. end;
  2247. { TTestUserReportData }
  2248. procedure TTestUserReportData.Setup;
  2249. begin
  2250. FD := TFPReportUserData.Create(nil);
  2251. FD.DataFields.AddField('string', rfkString);
  2252. FD.OnGetValue := @DoValue;
  2253. inherited;
  2254. end;
  2255. procedure TTestUserReportData.TearDown;
  2256. begin
  2257. FreeAndNil(FD);
  2258. inherited TearDown;
  2259. end;
  2260. procedure TTestUserReportData.DoValue(Sender: TObject; const AValueName: string; var AValue: variant);
  2261. begin
  2262. AssertSame('DoValue Sender is reportdata', FD, Sender);
  2263. AssertEquals('DoValue gets correct value name', FExpectName, AValueName);
  2264. AValue := FReturnValue;
  2265. end;
  2266. procedure TTestUserReportData.TestGetValue;
  2267. begin
  2268. FExpectName := 'string';
  2269. FReturnValue := 10;
  2270. AssertEquals('Return value correct', 10, FD.DataFields[0].GetValue);
  2271. AssertEquals('FieldValues array value correct', 10, FD.FieldValues['string']);
  2272. end;
  2273. { TTestUserReportData2 }
  2274. procedure TTestUserReportData2.DoGetValue(Sender: TObject; const AValueName: string; var AValue: variant);
  2275. begin
  2276. if AValueName = 'element' then
  2277. AValue := FSL[FData.RecNo - 1];
  2278. end;
  2279. procedure TTestUserReportData2.DoGetEOF(Sender: TObject; var IsEOF: boolean);
  2280. begin
  2281. if FData.RecNo > FSL.Count then
  2282. IsEOF := True
  2283. else
  2284. IsEOF := False;
  2285. end;
  2286. procedure TTestUserReportData2.Setup;
  2287. begin
  2288. inherited Setup;
  2289. FData := TFPReportUserData.Create(nil);
  2290. FData.OnGetValue := @DoGetValue;
  2291. // data is coming from the stringlist this time
  2292. FSL := TStringList.Create;
  2293. FSL.Add('Item 1');
  2294. FSL.Add('Item 2');
  2295. FSL.Add('Item 3');
  2296. FSL.Add('Item 4');
  2297. end;
  2298. procedure TTestUserReportData2.TearDown;
  2299. begin
  2300. FData.Free;
  2301. FSL.Free;
  2302. inherited TearDown;
  2303. end;
  2304. procedure TTestUserReportData2.TestGetValue;
  2305. begin
  2306. FData.First;
  2307. AssertEquals('Failed on 1', 'Item 1', FData.FieldValues['element']);
  2308. FData.Next;
  2309. AssertEquals('Failed on 2', 'Item 2', FData.FieldValues['element']);
  2310. FData.Next;
  2311. AssertEquals('Failed on 3', 'Item 3', FData.FieldValues['element']);
  2312. FData.Next;
  2313. AssertEquals('Failed on 4', 'Item 4', FData.FieldValues['element']);
  2314. FData.Next;
  2315. end;
  2316. procedure TTestUserReportData2.TestOnGetEOF1;
  2317. var
  2318. i: integer;
  2319. begin
  2320. FData.First;
  2321. for i := 1 to FSL.Count do
  2322. FData.Next;
  2323. // Should be False, because we haven't assigned OnGetEOF event handler
  2324. AssertTrue('Failed on 1', FData.EOF = False);
  2325. end;
  2326. procedure TTestUserReportData2.TestOnGetEOF2;
  2327. var
  2328. i: integer;
  2329. begin
  2330. FData.OnGetEOF := @DoGetEOF;
  2331. FData.First;
  2332. for i := 1 to FSL.Count do
  2333. FData.Next;
  2334. AssertTrue('Failed on 1', FData.EOF = True);
  2335. end;
  2336. { TTestDataBand }
  2337. procedure TTestDataBand.Setup;
  2338. begin
  2339. FDataBand := TFPReportDataBand.Create(nil);
  2340. inherited Setup;
  2341. end;
  2342. procedure TTestDataBand.TearDown;
  2343. begin
  2344. FreeAndNil(FDataBand);
  2345. inherited TearDown;
  2346. end;
  2347. procedure TTestDataBand.TestData;
  2348. var
  2349. D: TFPReportData;
  2350. begin
  2351. D := TFPReportData.Create(nil);
  2352. try
  2353. FDataBand.Data := D;
  2354. AssertSame('Assigned data OK', D, FDataBand.Data)
  2355. finally
  2356. D.Free;
  2357. end;
  2358. AssertNull('Free notification of Data', FDataBand.Data);
  2359. end;
  2360. procedure TTestDataBand.TestDataPropertyAutoSet;
  2361. var
  2362. p: TMyFPReportPage;
  2363. DataBand: TMyDataBand;
  2364. D: TFPReportData;
  2365. begin
  2366. SetReportData(2);
  2367. p := TMyFPReportPage.Create(Report);
  2368. p.SetupPage;
  2369. p.Name := 'Page1';
  2370. p.Data := Data;
  2371. DataBand := TMyDataBand.Create(p);
  2372. // DataBand should have been assigned p.Data automatically
  2373. AssertSame('Failed on 1', TFPReportData(Data), DataBand.Data);
  2374. D := TFPReportData.Create(nil);
  2375. try
  2376. DataBand.Data := D;
  2377. AssertTrue('Failed on 2', p.Data <> DataBand.Data);
  2378. finally
  2379. D.Free;
  2380. end;
  2381. end;
  2382. { TTestCustomReport }
  2383. procedure TTestCustomReport.HandleOnBeginReport;
  2384. begin
  2385. Inc(FBeginReportCount);
  2386. end;
  2387. procedure TTestCustomReport.HandleOnEndReport;
  2388. begin
  2389. Inc(FEndReportCount);
  2390. end;
  2391. procedure TTestCustomReport.InitializeData(const ACount: integer);
  2392. var
  2393. i: integer;
  2394. begin
  2395. // data is coming from the stringlist this time
  2396. FSL := TStringList.Create;
  2397. if ACount < 1 then
  2398. Exit;
  2399. for i := 1 to ACount do
  2400. FSL.Add('Item ' + IntToStr(i));
  2401. end;
  2402. procedure TTestCustomReport.SetReportData(const ADataCount: Byte);
  2403. begin
  2404. if ADataCount < 1 then
  2405. Exit;
  2406. InitializeData(ADataCount);
  2407. FData := TFPReportUserData.Create(nil);
  2408. FData.OnGetValue := @DoGetDataValue;
  2409. FData.OnGetEOF := @DoGetDataEOF;
  2410. FData.OnGetNames := @DoGetDataFieldNames;
  2411. end;
  2412. procedure TTestCustomReport.DoGetDataValue(Sender: TObject; const AValueName: string; var AValue: variant);
  2413. begin
  2414. if AValueName = 'element' then
  2415. AValue := FSL[FData.RecNo - 1];
  2416. end;
  2417. procedure TTestCustomReport.DoGetDataEOF(Sender: TObject; var IsEOF: boolean);
  2418. begin
  2419. if FData.RecNo > FSL.Count then
  2420. IsEOF := True
  2421. else
  2422. IsEOF := False;
  2423. end;
  2424. procedure TTestCustomReport.Setup;
  2425. begin
  2426. inherited Setup;
  2427. PaperManager.Clear;
  2428. PaperManager.RegisterStandardSizes;
  2429. Report := TMyCustomReport.Create(nil);
  2430. FBeginReportCount := 0;
  2431. FEndReportCount := 0;
  2432. gTTFontCache.Clear;
  2433. gTTFontCache.SearchPath.Text := 'fonts';
  2434. gTTFontCache.BuildFontCache;
  2435. end;
  2436. procedure TTestCustomReport.TearDown;
  2437. begin
  2438. FreeAndNil(FRpt);
  2439. FreeAndNil(FData);
  2440. FreeAndNil(FSL);
  2441. inherited TearDown;
  2442. end;
  2443. procedure TTestCustomReport.DoGetDataFieldNames(Sender: TObject; List: TStrings);
  2444. begin
  2445. List.Add('element');
  2446. end;
  2447. procedure TTestCustomReport.TestBeginReportEvent;
  2448. begin
  2449. TMyFPReportPage.Create(Report); // add at least one page
  2450. Report.OnBeginReport := @HandleOnBeginReport;
  2451. AssertEquals('Failed on 1', 0, FBeginReportCount);
  2452. Report.RunReport;
  2453. AssertEquals('Failed on 2', 1, FBeginReportCount);
  2454. AssertEquals('Failed on 3', 0, FEndReportCount);
  2455. end;
  2456. procedure TTestCustomReport.TestEndReportEvent;
  2457. begin
  2458. TMyFPReportPage.Create(Report); // add at least one page
  2459. Report.OnEndReport := @HandleOnEndReport;
  2460. AssertEquals('Failed on 1', 0, FEndReportCount);
  2461. Report.RunReport;
  2462. AssertEquals('Failed on 2', 1, FEndReportCount);
  2463. AssertEquals('Failed on 3', 0, FBeginReportCount);
  2464. end;
  2465. procedure TTestCustomReport.TestPagePrepareObjects;
  2466. var
  2467. p: TMyFPReportPage;
  2468. begin
  2469. SetReportData(2);
  2470. p := TMyFPReportPage.Create(Report);
  2471. p.Name := 'Page1';
  2472. p.Data := Data;
  2473. p := TMyFPReportPage.Create(Report);
  2474. p.Name := 'Page2';
  2475. p.Data := Data;
  2476. p := TMyFPReportPage.Create(Report);
  2477. p.Name := 'Page3';
  2478. p.Data := Data;
  2479. AssertEquals('Failed on 1', 0, TMyFPReportPage(Report.Pages[0]).FPrepareObjectsCalled);
  2480. AssertEquals('Failed on 2', 0, TMyFPReportPage(Report.Pages[1]).FPrepareObjectsCalled);
  2481. AssertEquals('Failed on 3', 0, TMyFPReportPage(Report.Pages[2]).FPrepareObjectsCalled);
  2482. Report.RunReport;
  2483. // due to Re-interpret of Page.Data, page is prepared per record (r38906)
  2484. AssertEquals('Failed on 4', 2, TMyFPReportPage(Report.Pages[0]).FPrepareObjectsCalled);
  2485. AssertEquals('Failed on 5', 2, TMyFPReportPage(Report.Pages[1]).FPrepareObjectsCalled);
  2486. AssertEquals('Failed on 6', 2, TMyFPReportPage(Report.Pages[2]).FPrepareObjectsCalled);
  2487. end;
  2488. procedure TTestCustomReport.TestBandPrepareObjects;
  2489. var
  2490. p: TMyFPReportPage;
  2491. TitleBand: TMyReportTitleBand;
  2492. DataBand: TMyDataBand;
  2493. begin
  2494. SetReportData(2);
  2495. p := TMyFPReportPage.Create(Report);
  2496. p.SetupPage;
  2497. p.Name := 'Page1';
  2498. p.Data := Data;
  2499. TitleBand := TMyReportTitleBand.Create(p);
  2500. DataBand := TMyDataBand.Create(p);
  2501. DataBand.Data := FData;
  2502. AssertEquals('Failed on 1', 0, p.FPrepareObjectsCalled);
  2503. AssertEquals('Failed on 2', 0, TitleBand.FPrepareObjectsCalled);
  2504. AssertEquals('Failed on 3', 0, DataBand.FPrepareObjectsCalled);
  2505. Report.RunReport;
  2506. AssertEquals('Failed on 4', 1, p.FPrepareObjectsCalled);
  2507. AssertEquals('Failed on 5', 1, TitleBand.FPrepareObjectsCalled);
  2508. AssertEquals('Failed on 6', 2, DataBand.FPrepareObjectsCalled);
  2509. end;
  2510. procedure TTestCustomReport.TestRTObjects1;
  2511. var
  2512. p: TMyFPReportPage;
  2513. begin
  2514. SetReportData(2);
  2515. p := TMyFPReportPage.Create(Report);
  2516. p.SetupPage;
  2517. p.Name := 'Page1';
  2518. p.Data := Data;
  2519. p := TMyFPReportPage.Create(Report);
  2520. p.SetupPage;
  2521. p.Name := 'Page2';
  2522. p.Data := Data;
  2523. p := TMyFPReportPage.Create(Report);
  2524. p.SetupPage;
  2525. p.Name := 'Page3';
  2526. p.Data := Data;
  2527. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2528. Report.RunReport;
  2529. // due to Re-interpret of Page.Data, page is prepared per record (r38906)
  2530. AssertEquals('Failed on 2', 6, Report.RTObjects.Count);
  2531. end;
  2532. procedure TTestCustomReport.TestRTObjects2;
  2533. var
  2534. p: TMyFPReportPage;
  2535. TitleBand: TMyReportTitleBand;
  2536. Memo: TFPReportMemo;
  2537. rtPage: TFPReportCustomPage;
  2538. begin
  2539. SetReportData(2);
  2540. p := TMyFPReportPage.Create(Report);
  2541. p.SetupPage;
  2542. p.Name := 'Page1';
  2543. p.Data := Data;
  2544. TitleBand := TMyReportTitleBand.Create(p);
  2545. Memo := TFPReportMemo.Create(TitleBand);
  2546. Memo.Text := 'THE REPORT TITLE';
  2547. Memo.Layout.Top := 5;
  2548. Memo.Layout.Left := 10;
  2549. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2550. Report.RunReport;
  2551. // due to Re-interpret of Page.Data, page is prepared per record (r38906)
  2552. AssertEquals('Failed on 2', 2, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2553. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2554. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2555. AssertEquals('Failed on 4', 1, rtPage.ChildCount);
  2556. AssertEquals('Failed on 5', 1, rtPage.BandCount);
  2557. AssertEquals('Failed on 6', 1, rtPage.Bands[0].ChildCount);
  2558. {$IFDEF gdebug}
  2559. // writeln(Report.DebugPreparedPageAsJSON(0));
  2560. {$ENDIF}
  2561. end;
  2562. procedure TTestCustomReport.TestRTObjects3;
  2563. var
  2564. p: TMyFPReportPage;
  2565. DataBand: TMyDataBand;
  2566. Memo: TFPReportMemo;
  2567. rtPage: TFPReportCustomPage;
  2568. begin
  2569. SetReportData(2);
  2570. p := TMyFPReportPage.Create(Report);
  2571. p.SetupPage;
  2572. p.Name := 'Page1';
  2573. p.Data := Data;
  2574. DataBand := TMyDataBand.Create(p);
  2575. Memo := TFPReportMemo.Create(DataBand);
  2576. Memo.Layout.Top := 5;
  2577. Memo.Layout.Left := 10;
  2578. Memo.Text := '[element]';
  2579. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2580. Report.RunReport;
  2581. AssertEquals('Failed on 2', 1, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2582. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2583. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2584. AssertEquals('Failed on 4', 2, rtPage.ChildCount);
  2585. AssertEquals('Failed on 5', 2, rtPage.BandCount);
  2586. {$IFDEF gdebug}
  2587. // writeln(Report.DebugPreparedPageAsJSON(0));
  2588. {$ENDIF}
  2589. end;
  2590. procedure TTestCustomReport.TestRTObjects4_OneDataItem;
  2591. var
  2592. p: TMyFPReportPage;
  2593. DataBand: TMyDataBand;
  2594. Memo: TFPReportMemo;
  2595. rtPage: TFPReportCustomPage;
  2596. begin
  2597. SetReportData(1);
  2598. p := TMyFPReportPage.Create(Report);
  2599. p.SetupPage;
  2600. p.Name := 'Page1';
  2601. p.SetupPage;
  2602. p.Data := Data;
  2603. DataBand := TMyDataBand.Create(p);
  2604. DataBand.Layout.Height := 23;
  2605. Memo := TFPReportMemo.Create(DataBand);
  2606. Memo.Layout.Top := 5;
  2607. Memo.Layout.Left := 10;
  2608. Memo.Text := '[element]';
  2609. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2610. Report.RunReport;
  2611. AssertEquals('Failed on 2', 1, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2612. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2613. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2614. AssertEquals('Failed on 4', 1, rtPage.ChildCount);
  2615. AssertEquals('Failed on 5', 1, rtPage.BandCount);
  2616. AssertEquals('Failed on 6', 1, rtPage.Bands[0].ChildCount);
  2617. {$IFDEF gdebug}
  2618. // writeln(Report.DebugPreparedPageAsJSON(0));
  2619. {$ENDIF}
  2620. end;
  2621. procedure TTestCustomReport.TestRTObjects5_TwoDataItems;
  2622. var
  2623. p: TMyFPReportPage;
  2624. DataBand: TMyDataBand;
  2625. Memo: TFPReportMemo;
  2626. rtPage: TFPReportCustomPage;
  2627. begin
  2628. SetReportData(2);
  2629. p := TMyFPReportPage.Create(Report);
  2630. p.Name := 'Page1';
  2631. p.SetupPage;
  2632. p.Data := Data;
  2633. DataBand := TMyDataBand.Create(p);
  2634. DataBand.Layout.Top := 0;
  2635. DataBand.Layout.Height := 23;
  2636. Memo := TFPReportMemo.Create(DataBand);
  2637. Memo.Layout.Top := 5;
  2638. Memo.Layout.Left := 10;
  2639. Memo.Text := '[element]';
  2640. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2641. Report.RunReport;
  2642. AssertEquals('Failed on 2', 1, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2643. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2644. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2645. AssertEquals('Failed on 4', 2, rtPage.ChildCount);
  2646. AssertEquals('Failed on 5', 2, rtPage.BandCount); { each data row has its own data band }
  2647. AssertEquals('Failed on 6', 1, rtPage.Bands[0].ChildCount);
  2648. AssertEquals('Failed on 7', 1, rtPage.Bands[1].ChildCount);
  2649. {$IFDEF gdebug}
  2650. // writeln(Report.DebugPreparedPageAsJSON(0));
  2651. {$ENDIF}
  2652. end;
  2653. procedure TTestCustomReport.TestInternalFunction_Page;
  2654. var
  2655. p: TMyFPReportPage;
  2656. DataBand: TMyDataBand;
  2657. Memo: TFPReportMemo;
  2658. rtPage: TFPReportCustomPage;
  2659. begin
  2660. SetReportData(1);
  2661. p := TMyFPReportPage.Create(Report);
  2662. p.Name := 'Page1';
  2663. p.SetupPage;
  2664. p.Data := Data;
  2665. DataBand := TMyDataBand.Create(p);
  2666. DataBand.Layout.Height := 23;
  2667. Memo := TFPReportMemo.Create(DataBand);
  2668. Memo.Layout.Top := 5;
  2669. Memo.Layout.Left := 10;
  2670. Memo.Text := '[PageNo]';
  2671. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2672. Report.RunReport;
  2673. AssertEquals('Failed on 2', 1, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2674. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2675. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2676. AssertEquals('Failed on 4', 1, rtPage.ChildCount);
  2677. AssertEquals('Failed on 5', 1, rtPage.BandCount);
  2678. AssertEquals('Failed on 6', 1, rtPage.Bands[0].ChildCount);
  2679. Memo := TFPReportMemo(rtPage.Bands[0].Child[0]);
  2680. AssertEquals('Failed on 7', '1', Memo.Text);
  2681. end;
  2682. procedure TTestCustomReport.TestInternalFunction_Page_with_text;
  2683. var
  2684. p: TMyFPReportPage;
  2685. DataBand: TMyDataBand;
  2686. Memo: TFPReportMemo;
  2687. rtPage: TFPReportCustomPage;
  2688. begin
  2689. SetReportData(1);
  2690. p := TMyFPReportPage.Create(Report);
  2691. p.Name := 'Page1';
  2692. p.SetupPage;
  2693. p.Data := Data;
  2694. DataBand := TMyDataBand.Create(p);
  2695. DataBand.Layout.Height := 23;
  2696. Memo := TFPReportMemo.Create(DataBand);
  2697. Memo.Layout.Top := 5;
  2698. Memo.Layout.Left := 10;
  2699. Memo.Text := 'Page [PageNo]';
  2700. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2701. Report.RunReport;
  2702. AssertEquals('Failed on 2', 1, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2703. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2704. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2705. AssertEquals('Failed on 4', 1, rtPage.ChildCount);
  2706. AssertEquals('Failed on 5', 1, rtPage.BandCount);
  2707. AssertEquals('Failed on 6', 1, rtPage.Bands[0].ChildCount);
  2708. Memo := TFPReportMemo(rtPage.Bands[0].Child[0]);
  2709. AssertEquals('Failed on 7', 'Page 1', Memo.Text);
  2710. end;
  2711. procedure TTestCustomReport.TestInternalFunction_RecNo;
  2712. var
  2713. p: TMyFPReportPage;
  2714. DataBand: TMyDataBand;
  2715. Memo: TFPReportMemo;
  2716. rtPage: TFPReportCustomPage;
  2717. i: integer;
  2718. begin
  2719. SetReportData(5);
  2720. p := TMyFPReportPage.Create(Report);
  2721. p.Name := 'Page1';
  2722. p.SetupPage;
  2723. p.Data := Data;
  2724. DataBand := TMyDataBand.Create(p);
  2725. DataBand.Layout.Height := 23;
  2726. Memo := TFPReportMemo.Create(DataBand);
  2727. Memo.Layout.Top := 5;
  2728. Memo.Layout.Left := 10;
  2729. Memo.Text := '[recno('''')]';
  2730. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2731. Report.RunReport;
  2732. AssertEquals('Failed on 2', 1, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2733. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2734. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2735. AssertEquals('Failed on 4', 5, rtPage.ChildCount); // 5 rendered data bands because we have 5 data records
  2736. AssertEquals('Failed on 5', 5, rtPage.BandCount);
  2737. AssertEquals('Failed on 6', 1, rtPage.Bands[0].ChildCount);
  2738. for i := 0 to 4 do
  2739. begin
  2740. Memo := TFPReportMemo(rtPage.Bands[i].Child[0]);
  2741. AssertEquals('Failed on 7.'+IntToStr(i), IntToStr(i+1), Memo.Text); { recno is 1-based }
  2742. end;
  2743. end;
  2744. procedure TTestCustomReport.TestInternalFunction_Today;
  2745. var
  2746. p: TMyFPReportPage;
  2747. DataBand: TMyDataBand;
  2748. Memo: TFPReportMemo;
  2749. rtPage: TFPReportCustomPage;
  2750. begin
  2751. SetReportData(1);
  2752. p := TMyFPReportPage.Create(Report);
  2753. p.Name := 'Page1';
  2754. p.SetupPage;
  2755. p.Data := Data;
  2756. DataBand := TMyDataBand.Create(p);
  2757. DataBand.Layout.Height := 23;
  2758. Memo := TFPReportMemo.Create(DataBand);
  2759. Memo.Layout.Top := 5;
  2760. Memo.Layout.Left := 10;
  2761. Memo.Text := '[today]';
  2762. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2763. Report.RunReport;
  2764. AssertEquals('Failed on 2', 1, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2765. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2766. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2767. AssertEquals('Failed on 4', 1, rtPage.ChildCount); // 1 rendered data band because we have 1 data record
  2768. AssertEquals('Failed on 5', 1, rtPage.BandCount);
  2769. AssertEquals('Failed on 6', 1, rtPage.Bands[0].ChildCount);
  2770. Memo := TFPReportMemo(rtPage.Bands[0].Child[0]);
  2771. AssertEquals('Failed on 7', FormatDateTime('yyyy-mm-dd', Today), Memo.Text);
  2772. end;
  2773. procedure TTestCustomReport.TestInternalFunction_Today_with_text;
  2774. var
  2775. p: TMyFPReportPage;
  2776. DataBand: TMyDataBand;
  2777. Memo: TFPReportMemo;
  2778. rtPage: TFPReportCustomPage;
  2779. begin
  2780. SetReportData(1);
  2781. p := TMyFPReportPage.Create(Report);
  2782. p.Name := 'Page1';
  2783. p.SetupPage;
  2784. p.Data := Data;
  2785. DataBand := TMyDataBand.Create(p);
  2786. DataBand.Layout.Height := 23;
  2787. Memo := TFPReportMemo.Create(DataBand);
  2788. Memo.Layout.Top := 5;
  2789. Memo.Layout.Left := 10;
  2790. Memo.Text := 'Today is [today]';
  2791. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2792. Report.RunReport;
  2793. AssertEquals('Failed on 2', 1, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2794. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2795. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2796. AssertEquals('Failed on 4', 1, rtPage.ChildCount); // 1 rendered data band because we have 1 data record
  2797. AssertEquals('Failed on 5', 1, rtPage.BandCount);
  2798. AssertEquals('Failed on 6', 1, rtPage.Bands[0].ChildCount);
  2799. Memo := TFPReportMemo(rtPage.Bands[0].Child[0]);
  2800. AssertEquals('Failed on 7', 'Today is ' + FormatDateTime('yyyy-mm-dd', Today), Memo.Text);
  2801. end;
  2802. procedure TTestCustomReport.TestInternalFunction_Author;
  2803. var
  2804. p: TMyFPReportPage;
  2805. DataBand: TMyDataBand;
  2806. Memo: TFPReportMemo;
  2807. rtPage: TFPReportCustomPage;
  2808. begin
  2809. SetReportData(1);
  2810. p := TMyFPReportPage.Create(Report);
  2811. p.Name := 'Page1';
  2812. p.SetupPage;
  2813. p.Data := Data;
  2814. DataBand := TMyDataBand.Create(p);
  2815. DataBand.Layout.Height := 23;
  2816. Memo := TFPReportMemo.Create(DataBand);
  2817. Memo.Layout.Top := 5;
  2818. Memo.Layout.Left := 10;
  2819. Memo.Text := '[author]';
  2820. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2821. Report.RunReport;
  2822. AssertEquals('Failed on 2', 1, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2823. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2824. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2825. AssertEquals('Failed on 4', 1, rtPage.ChildCount); // 1 rendered data band because we have 1 data record
  2826. AssertEquals('Failed on 5', 1, rtPage.BandCount);
  2827. AssertEquals('Failed on 6', 1, rtPage.Bands[0].ChildCount);
  2828. Memo := TFPReportMemo(rtPage.Bands[0].Child[0]);
  2829. AssertEquals('Failed on 7', '', Memo.Text); // we never set Report.Author
  2830. end;
  2831. procedure TTestCustomReport.TestInternalFunction_Author_with_text;
  2832. var
  2833. p: TMyFPReportPage;
  2834. DataBand: TMyDataBand;
  2835. Memo: TFPReportMemo;
  2836. rtPage: TFPReportCustomPage;
  2837. begin
  2838. SetReportData(1);
  2839. Report.Author := 'Graeme Geldenhuys';
  2840. p := TMyFPReportPage.Create(Report);
  2841. p.Name := 'Page1';
  2842. p.SetupPage;
  2843. p.Data := Data;
  2844. DataBand := TMyDataBand.Create(p);
  2845. DataBand.Layout.Height := 23;
  2846. Memo := TFPReportMemo.Create(DataBand);
  2847. Memo.Layout.Top := 5;
  2848. Memo.Layout.Left := 10;
  2849. Memo.Text := 'The Author is [author].';
  2850. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2851. Report.RunReport;
  2852. AssertEquals('Failed on 2', 1, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2853. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2854. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2855. AssertEquals('Failed on 4', 1, rtPage.ChildCount); // 1 rendered data band because we have 1 data record
  2856. AssertEquals('Failed on 5', 1, rtPage.BandCount);
  2857. AssertEquals('Failed on 6', 1, rtPage.Bands[0].ChildCount);
  2858. Memo := TFPReportMemo(rtPage.Bands[0].Child[0]);
  2859. AssertEquals('Failed on 7', 'The Author is Graeme Geldenhuys.', Memo.Text);
  2860. end;
  2861. procedure TTestCustomReport.TestInternalFunction_Title;
  2862. var
  2863. p: TMyFPReportPage;
  2864. DataBand: TMyDataBand;
  2865. Memo: TFPReportMemo;
  2866. rtPage: TFPReportCustomPage;
  2867. begin
  2868. SetReportData(1);
  2869. p := TMyFPReportPage.Create(Report);
  2870. p.Name := 'Page1';
  2871. p.SetupPage;
  2872. p.Data := Data;
  2873. DataBand := TMyDataBand.Create(p);
  2874. DataBand.Layout.Height := 23;
  2875. Memo := TFPReportMemo.Create(DataBand);
  2876. Memo.Layout.Top := 5;
  2877. Memo.Layout.Left := 10;
  2878. Memo.Text := '[title]';
  2879. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2880. Report.RunReport;
  2881. AssertEquals('Failed on 2', 1, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2882. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2883. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2884. AssertEquals('Failed on 4', 1, rtPage.ChildCount); // 1 rendered data band because we have 1 data record
  2885. AssertEquals('Failed on 5', 1, rtPage.BandCount);
  2886. AssertEquals('Failed on 6', 1, rtPage.Bands[0].ChildCount);
  2887. Memo := TFPReportMemo(rtPage.Bands[0].Child[0]);
  2888. AssertEquals('Failed on 7', '', Memo.Text); // we never set Report.Title
  2889. end;
  2890. procedure TTestCustomReport.TestInternalFunction_Title_with_text;
  2891. var
  2892. p: TMyFPReportPage;
  2893. DataBand: TMyDataBand;
  2894. Memo: TFPReportMemo;
  2895. rtPage: TFPReportCustomPage;
  2896. begin
  2897. SetReportData(1);
  2898. Report.Title := 'My Test Report';
  2899. p := TMyFPReportPage.Create(Report);
  2900. p.Name := 'Page1';
  2901. p.SetupPage;
  2902. p.Data := Data;
  2903. DataBand := TMyDataBand.Create(p);
  2904. DataBand.Layout.Height := 23;
  2905. Memo := TFPReportMemo.Create(DataBand);
  2906. Memo.Layout.Top := 5;
  2907. Memo.Layout.Left := 10;
  2908. Memo.Text := 'Report Title is "[title]".';
  2909. AssertEquals('Failed on 1', 0, Report.RTObjects.Count);
  2910. Report.RunReport;
  2911. AssertEquals('Failed on 2', 1, Report.RTObjects.Count); // runtime objects adhere to same hierarchy as design time
  2912. AssertEquals('Failed on 3', 'TFPReportCustomPage', TObject(Report.RTObjects[0]).ClassName);
  2913. rtPage := TFPReportCustomPage(Report.RTObjects[0]);
  2914. AssertEquals('Failed on 4', 1, rtPage.ChildCount); // 1 rendered data band because we have 1 data record
  2915. AssertEquals('Failed on 5', 1, rtPage.BandCount);
  2916. AssertEquals('Failed on 6', 1, rtPage.Bands[0].ChildCount);
  2917. Memo := TFPReportMemo(rtPage.Bands[0].Child[0]);
  2918. AssertEquals('Failed on 7', 'Report Title is "My Test Report".', Memo.Text);
  2919. end;
  2920. { TTestReportMemo }
  2921. procedure TTestReportMemo.CauseFontNotFoundException;
  2922. begin
  2923. TMemoFriend(FMemo).RecalcLayout;
  2924. end;
  2925. procedure TTestReportMemo.SetUp;
  2926. begin
  2927. inherited SetUp;
  2928. FMemo := TFPReportMemo.Create(nil);
  2929. FMemo.Layout.SetPosition(0, 0, 60, 5);
  2930. end;
  2931. procedure TTestReportMemo.TearDown;
  2932. begin
  2933. FMemo.Free;
  2934. inherited TearDown;
  2935. end;
  2936. procedure TTestReportMemo.TestCreate;
  2937. var
  2938. m: TFPReportMemo;
  2939. begin
  2940. m := TFPReportMemo.Create(nil);
  2941. try
  2942. m.Text := 'abc 123';
  2943. AssertTrue('Failed on 1', m <> nil);
  2944. finally
  2945. m.Free;
  2946. end;
  2947. end;
  2948. procedure TTestReportMemo.TestPrepareTextBlocks;
  2949. begin
  2950. gTTFontCache.Clear;
  2951. gTTFontCache.SearchPath.Text := 'fonts';
  2952. gTTFontCache.BuildFontCache;
  2953. FMemo.Layout.Width := 100;
  2954. FMemo.Text := 'abc 123';
  2955. FMemo.UseParentFont := False;
  2956. FMemo.Font.Name := 'Calibri';
  2957. FMemo.StretchMode := smActualHeight;
  2958. TMemoFriend(FMemo).CreateRTLayout;
  2959. TMemoFriend(FMemo).RecalcLayout;
  2960. AssertEquals('Failed on 2', 1, FMemo.TextLines.Count);
  2961. end;
  2962. procedure TTestReportMemo.TestPrepareTextBlocks_multiline_data;
  2963. begin
  2964. gTTFontCache.Clear;
  2965. gTTFontCache.SearchPath.Text := 'fonts';
  2966. gTTFontCache.BuildFontCache;
  2967. FMemo.Layout.Width := 100;
  2968. FMemo.Text := 'abc'+LineEnding+'123';
  2969. FMemo.UseParentFont := False;
  2970. FMemo.Font.Name := 'Calibri';
  2971. FMemo.StretchMode := smActualHeight;
  2972. TMemoFriend(FMemo).CreateRTLayout;
  2973. TMemoFriend(FMemo).RecalcLayout;
  2974. AssertEquals('Failed on 2', 2, FMemo.TextLines.Count);
  2975. end;
  2976. procedure TTestReportMemo.TestPrepareTextBlocks_multiline_wraptext;
  2977. begin
  2978. gTTFontCache.Clear;
  2979. gTTFontCache.SearchPath.Text := 'fonts';
  2980. gTTFontCache.BuildFontCache;
  2981. FMemo.Layout.Width := 6;
  2982. FMemo.Text := 'abc 123';
  2983. FMemo.UseParentFont := False;
  2984. FMemo.Font.Name := 'Calibri';
  2985. FMemo.StretchMode := smActualHeight;
  2986. FMemo.WordOverflow := woOverflow;
  2987. TMemoFriend(FMemo).CreateRTLayout;
  2988. TMemoFriend(FMemo).RecalcLayout;
  2989. AssertEquals('Failed on 2', 2, FMemo.TextLines.Count);
  2990. end;
  2991. procedure TTestReportMemo.TestPrepareTextBlocks_multiline_wraptext_oneword;
  2992. begin
  2993. gTTFontCache.Clear;
  2994. gTTFontCache.SearchPath.Text := 'fonts';
  2995. gTTFontCache.BuildFontCache;
  2996. FMemo.Layout.Width := 10;
  2997. FMemo.Text := 'abc123';
  2998. FMemo.UseParentFont := False;
  2999. FMemo.Font.Name := 'Calibri';
  3000. FMemo.StretchMode := smActualHeight;
  3001. TMemoFriend(FMemo).CreateRTLayout;
  3002. TMemoFriend(FMemo).RecalcLayout;
  3003. AssertEquals('Failed on 1', 1, FMemo.TextLines.Count);
  3004. // The length of abc1 fits.
  3005. AssertEquals('Failed on 1', 'abc1', FMemo.TextLines[0]);
  3006. end;
  3007. procedure TTestReportMemo.TestPrepareTextBlocks_multiline_wraptext_oneword_overflow;
  3008. begin
  3009. gTTFontCache.Clear;
  3010. gTTFontCache.SearchPath.Text := 'fonts';
  3011. gTTFontCache.BuildFontCache;
  3012. FMemo.Layout.Width := 10;
  3013. FMemo.Text := 'abc123';
  3014. FMemo.UseParentFont := False;
  3015. FMemo.Font.Name := 'Calibri';
  3016. FMemo.StretchMode := smActualHeight;
  3017. TMemoFriend(FMemo).WordOverflow:=woOverflow;
  3018. TMemoFriend(FMemo).CreateRTLayout;
  3019. TMemoFriend(FMemo).RecalcLayout;
  3020. AssertEquals('Failed on 1', 1, FMemo.TextLines.Count);
  3021. AssertEquals('Failed on 1', 'abc123', FMemo.TextLines[0]);
  3022. end;
  3023. procedure TTestReportMemo.TestPrepareTextBlocks_multiline_wraptext_oneword_split;
  3024. begin
  3025. gTTFontCache.Clear;
  3026. gTTFontCache.SearchPath.Text := 'fonts';
  3027. gTTFontCache.BuildFontCache;
  3028. FMemo.Layout.Width := 10;
  3029. FMemo.Text := 'abc123';
  3030. FMemo.UseParentFont := False;
  3031. FMemo.Font.Name := 'Calibri';
  3032. FMemo.StretchMode := smActualHeight;
  3033. TMemoFriend(FMemo).WordOverflow:=woSplit;
  3034. TMemoFriend(FMemo).CreateRTLayout;
  3035. TMemoFriend(FMemo).RecalcLayout;
  3036. AssertEquals('Failed on 1', 2, FMemo.TextLines.Count);
  3037. AssertEquals('Failed on 2', 'abc1', FMemo.TextLines[0]);
  3038. AssertEquals('Failed on 3', '23', FMemo.TextLines[1]);
  3039. end;
  3040. procedure TTestReportMemo.TestRGBToReportColor;
  3041. var
  3042. c: TFPReportColor;
  3043. begin
  3044. c := RGBToReportColor(255, 0, 0);
  3045. AssertEquals('failed on 1', IntToHex(clRed, 8), IntToHex(c, 8));
  3046. c := RGBToReportColor(0, 128, 0);
  3047. AssertEquals('failed on 2', IntToHex(clGreen, 8), IntToHex(c, 8));
  3048. c := RGBToReportColor(0, 0, 255);
  3049. AssertEquals('failed on 3', IntToHex(clBlue, 8), IntToHex(c, 8));
  3050. end;
  3051. procedure TTestReportMemo.TestHTMLColorToReportColor_length7;
  3052. var
  3053. c: TFPReportColor;
  3054. begin
  3055. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('#FF0000', clBlack);
  3056. AssertEquals('failed on 1', IntToHex(clRed, 8), IntToHex(c, 8));
  3057. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('#008000', clBlack);
  3058. AssertEquals('failed on 2', IntToHex(clGreen, 8), IntToHex(c, 8));
  3059. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('#0000FF', clBlack);
  3060. AssertEquals('failed on 3', IntToHex(clBlue, 8), IntToHex(c, 8));
  3061. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('A0000FF', clBlack);
  3062. AssertEquals('failed on 4', IntToHex(clBlack, 8), IntToHex(c, 8));
  3063. end;
  3064. procedure TTestReportMemo.TestHTMLColorToReportColor_length6;
  3065. var
  3066. c: TFPReportColor;
  3067. begin
  3068. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('FF0000', clBlack);
  3069. AssertEquals('failed on 1', IntToHex(clRed, 8), IntToHex(c, 8));
  3070. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('008000', clBlack);
  3071. AssertEquals('failed on 2', IntToHex(clGreen, 8), IntToHex(c, 8));
  3072. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('0000FF', clBlack);
  3073. AssertEquals('failed on 3', IntToHex(clBlue, 8), IntToHex(c, 8));
  3074. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('A0000FF', clBlack);
  3075. AssertEquals('failed on 4', IntToHex(clBlack, 8), IntToHex(c, 8));
  3076. end;
  3077. procedure TTestReportMemo.TestHTMLColorToReportColor_length3;
  3078. var
  3079. c: TFPReportColor;
  3080. begin
  3081. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('F00', clBlack);
  3082. AssertEquals('failed on 1', IntToHex(clRed, 8), IntToHex(c, 8));
  3083. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('080', clBlack);
  3084. AssertEquals('failed on 2', IntToHex($008800, 8), IntToHex(c, 8));
  3085. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('00F', clBlack);
  3086. AssertEquals('failed on 3', IntToHex(clBlue, 8), IntToHex(c, 8));
  3087. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('A00F', clDkGray);
  3088. AssertEquals('failed on 4', IntToHex(clDkGray, 8), IntToHex(c, 8));
  3089. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('700', clBlack);
  3090. AssertEquals('failed on 5', IntToHex($770000, 8), IntToHex(c, 8));
  3091. c := TMemoFriend(FMemo).HtmlColorToFPReportColor('006', clBlack);
  3092. AssertEquals('failed on 6', IntToHex($000066, 8), IntToHex(c, 8));
  3093. end;
  3094. procedure TTestReportMemo.TestCreateTestBlock;
  3095. var
  3096. tb: TFPTextBlock;
  3097. begin
  3098. tb := TMemoFriend(FMemo).CreateTextBlock(false);
  3099. try
  3100. AssertTrue('failed on 1', tb is TFPTextBlock);
  3101. AssertFalse('failed on 2', tb is TFPHTTPTextBlock);
  3102. finally
  3103. tb.Free;
  3104. end;
  3105. end;
  3106. procedure TTestReportMemo.TestCreateTestBlock_IsURL;
  3107. var
  3108. tb: TFPTextBlock;
  3109. begin
  3110. tb := TMemoFriend(FMemo).CreateTextBlock(true);
  3111. try
  3112. AssertTrue('failed on 1', tb is TFPTextBlock);
  3113. AssertTrue('failed on 2', tb is TFPHTTPTextBlock);
  3114. finally
  3115. tb.Free;
  3116. end;
  3117. end;
  3118. procedure TTestReportMemo.TestSubStr;
  3119. var
  3120. m: TMemoFriend;
  3121. lStartPos: integer;
  3122. begin
  3123. m := TMemoFriend(FMemo);
  3124. AssertEquals('failed on 1', '', m.SubStr('','','', 1, lStartPos));
  3125. AssertEquals('failed on 1.1', -1, lStartPos);
  3126. AssertEquals('failed on 2', 'abc', m.SubStr('xxxabcyyy','xxx','yyy', 1, lStartPos));
  3127. AssertEquals('failed on 2.1', 4, lStartPos);
  3128. AssertEquals('failed on 3', 'abc', m.SubStr('xxx,abc;xxx',',',';', 1, lStartPos));
  3129. AssertEquals('failed on 3.1', 5, lStartPos);
  3130. AssertEquals('failed on 4', 'abc', m.SubStr('<d>abc</d>','<d>','</d>', 1, lStartPos));
  3131. AssertEquals('failed on 4.1', 4, lStartPos);
  3132. AssertEquals('failed on 5', 'abc1', m.SubStr('<d>abc1</d> <d>abc2</d>','<d>','</d>', 1, lStartPos));
  3133. AssertEquals('failed on 5.1', 4, lStartPos);
  3134. AssertEquals('failed on 6', 'abc2', m.SubStr('<d>abc1</d> <d>abc2</d>','<d>','</d>', 2, lStartPos));
  3135. AssertEquals('failed on 6.1', 16, lStartPos);
  3136. AssertEquals('failed on 7', '', m.SubStr('<d>abc1</d> <d>abc2</d>','<d>','</d>', 3, lStartPos));
  3137. AssertEquals('failed on 7.1', -1, lStartPos);
  3138. AssertEquals('failed on 8', 'abc1', m.SubStr('<d>abc1</d> <d>abc2</d>','<d>','</d>', 0, lStartPos));
  3139. AssertEquals('failed on 8.1', 4, lStartPos);
  3140. AssertEquals('failed on 9', 'abc1', m.SubStr('<d>abc1</d> <d>abc2</d>','<d>','</d>', -1, lStartPos));
  3141. AssertEquals('failed on 9.1', 4, lStartPos);
  3142. end;
  3143. procedure TTestReportMemo.TestTokenCount;
  3144. var
  3145. m: TMemoFriend;
  3146. lStartPos: integer;
  3147. begin
  3148. m := TMemoFriend(FMemo);
  3149. AssertEquals('failed on 1', '', m.SubStr('','','', 1, lStartPos));
  3150. AssertEquals('failed on 1.1', -1, lStartPos);
  3151. AssertEquals('failed on 2', 'abc', m.SubStr('xxxabcyyy','xxx','yyy', 1, lStartPos));
  3152. AssertEquals('failed on 2.1', 4, lStartPos);
  3153. AssertEquals('failed on 1', m.TokenCount('', ','), 0);
  3154. AssertEquals('failed on 2', m.TokenCount('adf adf', ','), 1);
  3155. AssertEquals('failed on 3', m.TokenCount('adf,', ','), 2);
  3156. AssertEquals('failed on 4', m.TokenCount('adf,adf', ','), 2);
  3157. AssertEquals('failed on 5', m.TokenCount('adf,adf,adf', ','), 3);
  3158. AssertEquals('failed on 6', m.TokenCount('adf,adf,adf,', ','), 4);
  3159. AssertEquals('failed on 6', m.TokenCount('0mm margin top and bottom.', ' '), 5);
  3160. AssertEquals('failed on 6', m.TokenCount('0mm margin top and bottom. ', ' '), 6);
  3161. end;
  3162. procedure TTestReportMemo.TestToken;
  3163. var
  3164. m: TMemoFriend;
  3165. lStartPos: integer;
  3166. begin
  3167. m := TMemoFriend(FMemo);
  3168. AssertEquals('failed on 1', m.Token('', ',', 1), '');
  3169. AssertEquals('failed on 2', m.Token('a,b,c', ',', 1), 'a');
  3170. AssertEquals('failed on 3', m.Token('a,b,c', ',', 2), 'b');
  3171. AssertEquals('failed on 4', m.Token('a,b,c', ',', 3), 'c');
  3172. AssertEquals('failed on 5', m.Token('a,b,c', ',', 4), '');
  3173. AssertEquals('failed on 6', m.Token('aa,bb,cc', ',', 1), 'aa');
  3174. AssertEquals('failed on 7', m.Token('aa,bb,cc', ',', 2), 'bb');
  3175. AssertEquals('failed on 8', m.Token('aa,bb,cc', ',', 3), 'cc');
  3176. AssertEquals('failed on 9', m.Token('aa,bb,cc', ',', 4), '');
  3177. AssertEquals('failed on 10', m.Token('aa,bb,cc,', ',', 4), '');
  3178. AssertEquals('failed on 11', m.Token('0mm margin top and bottom.', ' ', 5), 'bottom.');
  3179. AssertEquals('failed on 12', m.Token('0mm margin top and bottom. ', ' ', 5), 'bottom.');
  3180. AssertEquals('failed on 13', m.Token('0mm margin top and bottom. ', ' ', 6), '');
  3181. end;
  3182. { TTestBandList }
  3183. procedure TTestBandList.CreateBands;
  3184. begin
  3185. b1 := TFPReportPageHeaderBand.Create(nil);
  3186. b2 := TFPReportTitleBand.Create(nil);
  3187. b3 := TFPReportDataBand.Create(nil);
  3188. end;
  3189. procedure TTestBandList.AddAllBandsToList;
  3190. begin
  3191. FList.Add(b1);
  3192. FList.Add(b2);
  3193. FList.Add(b3);
  3194. end;
  3195. procedure TTestBandList.SetUp;
  3196. begin
  3197. inherited SetUp;
  3198. FList := TBandList.Create;
  3199. CreateBands;
  3200. end;
  3201. procedure TTestBandList.TearDown;
  3202. begin
  3203. FreeAndNil(FList);
  3204. FreeAndNil(b3);
  3205. FreeAndNil(b2);
  3206. FreeAndNil(b1);
  3207. inherited TearDown;
  3208. end;
  3209. procedure TTestBandList.TestAdd;
  3210. begin
  3211. AssertEquals('Failed on 1', 0, FList.Count);
  3212. AddAllBandsToList;
  3213. AssertEquals('Failed on 2', 3, FList.Count);
  3214. end;
  3215. procedure TTestBandList.TestItems;
  3216. begin
  3217. AssertEquals('Failed on 1', 0, FList.Count);
  3218. AddAllBandsToList;
  3219. AssertEquals('Failed on 2', 3, FList.Count);
  3220. AssertTrue('failed on 3', FList.Items[0] = b1);
  3221. AssertTrue('failed on 4', FList.Items[1] = b2);
  3222. AssertTrue('failed on 5', FList.Items[1] <> b1);
  3223. AssertTrue('failed on 6', FList.Items[2] = b3);
  3224. end;
  3225. procedure TTestBandList.TestClear;
  3226. begin
  3227. AssertEquals('Failed on 1', 0, FList.Count);
  3228. AddAllBandsToList;
  3229. AssertEquals('Failed on 2', 3, FList.Count);
  3230. FList.Clear;
  3231. AssertEquals('Failed on 3', 0, FList.Count);
  3232. AssertTrue('failed on 4', b1 <> nil); // List.Clear shouldn't free bands
  3233. end;
  3234. procedure TTestBandList.TestDelete;
  3235. begin
  3236. AssertEquals('Failed on 1', 0, FList.Count);
  3237. AddAllBandsToList;
  3238. AssertEquals('Failed on 2', 3, FList.Count);
  3239. FList.Delete(0);
  3240. AssertEquals('Failed on 3', 2, FList.Count);
  3241. AssertTrue('failed on 4', b1 <> nil); // List.Delete shouldn't free bands
  3242. AssertTrue('failed on 5', FList.Items[0] = b2);
  3243. AssertTrue('failed on 6', FList.Items[1] = b3);
  3244. end;
  3245. procedure TTestBandList.TestFind1;
  3246. var
  3247. lBand: TFPReportCustomBand;
  3248. lResult: integer;
  3249. begin
  3250. AssertEquals('Failed on 1', 0, FList.Count);
  3251. AddAllBandsToList;
  3252. AssertEquals('Failed on 2', 3, FList.Count);
  3253. AssertTrue('failed on 3', FList.Find(TFPReportPageHeaderBand) <> nil);
  3254. AssertTrue('failed on 4', FList.Find(TFPReportPageHeaderBand) = b1);
  3255. AssertTrue('failed on 5', FList.Find(TFPReportTitleBand) = b2);
  3256. AssertTrue('failed on 6', FList.Find(TFPReportDataBand) = b3);
  3257. FList.Clear;
  3258. AssertTrue('failed on 7', FList.Find(TFPReportTitleBand) = nil);
  3259. end;
  3260. procedure TTestBandList.TestFind2;
  3261. var
  3262. lBand: TFPReportCustomBand;
  3263. lResult: integer;
  3264. begin
  3265. AssertEquals('Failed on 1', 0, FList.Count);
  3266. lResult := FList.Find(TFPReportPageHeaderBand, lBand);
  3267. AssertEquals('failed on 2', -1, lResult);
  3268. AssertTrue('failed on 3', lBand = nil);
  3269. AddAllBandsToList;
  3270. AssertEquals('Failed on 4', 3, FList.Count);
  3271. lResult := FList.Find(TFPReportPageHeaderBand, lBand);
  3272. AssertEquals('failed on 5', 0, lResult);
  3273. AssertTrue('failed on 6', lBand <> nil);
  3274. AssertTrue('failed on 7', lBand = b1);
  3275. lResult := FList.Find(TFPReportTitleBand, lBand);
  3276. AssertEquals('failed on 8', 1, lResult);
  3277. AssertTrue('failed on 9', lBand = b2);
  3278. lResult := FList.Find(TFPReportDataBand, lBand);
  3279. AssertEquals('failed on 10', 2, lResult);
  3280. AssertTrue('failed on 11', lBand = b3);
  3281. FList.Clear;
  3282. lResult := FList.Find(TFPReportTitleBand, lBand);
  3283. AssertTrue('failed on 12', lBand = nil);
  3284. AssertTrue('failed on 13', lResult = -1);
  3285. end;
  3286. initialization
  3287. RegisterTests(
  3288. [TTestReportComponent,
  3289. TReportElementTest,
  3290. TTestReportChildren,
  3291. TTestReportFrame,
  3292. TTestReportLayout,
  3293. TTestFPPageSize,
  3294. TTestFPPaperManager,
  3295. TTestFPReportPageSize,
  3296. TTestReportPage,
  3297. TTestReportData,
  3298. TTestUserReportData,
  3299. TTestUserReportData2,
  3300. TTestDataBand,
  3301. TTestCustomReport,
  3302. TTestReportMemo,
  3303. TTestBandList,
  3304. TTestVariable,
  3305. TTestVariables
  3306. ]);
  3307. end.