tcbasereport.pp 101 KB

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