testdbexport.pas 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184
  1. unit TestDBExport;
  2. {
  3. Unit tests which are common to all datasets. Tests export to various formats.
  4. }
  5. {$IFDEF FPC}
  6. {$mode Delphi}{$H+}
  7. {$ENDIF}
  8. {$codepage utf8}
  9. interface
  10. uses
  11. fpcunit, testregistry,
  12. Classes, SysUtils, db, ToolsUnit, bufdataset,
  13. fpDBExport,
  14. fpXMLXSDExport,
  15. fpdbfexport,
  16. fpcsvexport,
  17. fpfixedexport,
  18. fpSimpleXMLExport,
  19. fpsimplejsonexport,
  20. fpSQLExport,
  21. fptexexport,
  22. fprtfexport;
  23. type
  24. TDetailedExportFormats = (efDBaseIII, efDBaseIV, efDBaseVII, efCSV, efFixedLengthText, efFoxpro,
  25. efJSON, efRTF, efSQL, efTeX, efXML, efXMLXSDAccess, efXMLXSDADONet, efXMLXSDClientDataset,
  26. efXMLXSDExcel, efVisualFoxpro);
  27. const
  28. TDetailedExportExtensions: array [TDetailedExportFormats] of string =
  29. ('.dbf','.dbf','.dbf','.csv','.txt','.dbf','.json','.rtf','.sql','.tex',
  30. '.xml','.xml','.xml','.xml','.xml','.dbf'); //File extension for the corresponding TDetailedExportFormats
  31. type
  32. { TTestDBExport }
  33. TTestDBExport = class(TTestCase)
  34. private
  35. FExportTempDir: string; //directory where test files are placed
  36. FKeepFilesAfterTest: boolean; //remove files after testing?
  37. function FieldSupported(const FieldType: TFieldType;
  38. const ExportSubFormat: TDetailedExportFormats): boolean; //Checks if output dataset supports a certain field type
  39. procedure GenericExportTest(Exporter: TCustomDatasetExporter; ExportFormat: TDetailedExportFormats);
  40. function GetABCDS: TBufDataset;
  41. function GetBooleanDS: TBufDataset;
  42. function GetFileSize(const FileName: string): integer; //Gets a file's size
  43. function GetWideStringDS: TBufDataset;
  44. protected
  45. procedure SetUp; override;
  46. procedure TearDown; override;
  47. published
  48. procedure TestDBFExport_DBaseIV;
  49. procedure TestDBFExport_DBaseVII;
  50. procedure TestDBFExport_FoxPro;
  51. procedure TestDBFExport_VisualFoxPro;
  52. procedure TestCSVExport; //tests csv export with default values
  53. procedure TestCSVExport_RFC4180WithHeader; //tests csv export with settings that match RFC4180
  54. procedure TestCSVExport_TweakSettingsSemicolon; //tests semicolon delimited, custom country values
  55. procedure TestCSVExportDisabledFields;
  56. procedure TestFixedTextExport;
  57. procedure TestFixedTextExportUTF8;
  58. procedure TestFixedTextExportUTF16;
  59. procedure TestFixedTextExportBoolean;
  60. procedure TestFixedTextExportHeader;
  61. procedure TestFixedTextExportHeaderDisabledFields;
  62. procedure TestFixedTextExportSpaces;
  63. procedure TestJSONExport;
  64. procedure TestRTFExport;
  65. procedure TestSQLExport;
  66. procedure TestTeXExport;
  67. procedure TestXMLExport; //tests simple xml export
  68. procedure TestXMLExportSpecialChars;
  69. procedure TestXSDExport_Access_NoXSD_DecimalOverride; //tests xmlxsd export
  70. procedure TestXSDExport_Access_NoXSD_NoDecimalOverride; //tests xmlxsd export
  71. procedure TestXSDExport_Access_XSD_DecimalOverride; //tests xmlxsd export
  72. procedure TestXSDExport_Access_XSD_NoDecimalOverride; //tests xmlxsd export
  73. procedure TestXSDExport_ADONET_NoXSD; //tests xmlxsd export
  74. procedure TestXSDExport_ADONET_XSD; //tests xmlxsd export
  75. procedure TestXSDExport_DelphiClientDataset; //tests xmlxsd export
  76. procedure TestXSDExport_Excel; //tests xmlxsd export
  77. end;
  78. implementation
  79. uses bufdatasettoolsunit, xmlread,dom;
  80. function TTestDBExport.FieldSupported(const FieldType: TFieldType;
  81. const ExportSubFormat: TDetailedExportFormats): boolean;
  82. const
  83. // Alphabetically sorted for quick review:
  84. DBaseVIIUnsupported=[ftADT,ftArray,ftBCD,ftBytes,ftCurrency,ftCursor,ftDataSet,
  85. ftFixedWideChar,
  86. ftFMTBcd,ftFmtMemo,ftGraphic,ftGuid,ftIDispatch,ftInterface,ftLongWord,
  87. ftOraBlob,ftOraClob,ftParadoxOle,ftReference,ftTime,ftTimeStamp,ftTypedBinary,
  88. ftUnknown,ftVarBytes,ftVariant,ftWidememo,ftWideString];
  89. FoxProUnsupported= [ftADT,ftArray, ftBytes, ftCursor,ftDataSet,
  90. ftFixedWideChar,
  91. ftFMTBcd,ftFmtMemo,ftGraphic,ftGuid,ftIDispatch,ftInterface,ftLongWord,
  92. ftOraBlob,ftOraClob,ftParadoxOle,ftReference,ftTime,ftTimeStamp,ftTypedBinary,
  93. ftUnknown,ftVarBytes,ftVariant,ftWideMemo,ftWideString];
  94. begin
  95. result:=true;
  96. case ExportSubFormat of
  97. efDBaseIII: if FieldType in DBaseVIIUnsupported+[ftAutoInc] then result:=false;
  98. efDBaseIV: if FieldType in DBaseVIIUnsupported+[ftAutoInc] then result:=false;
  99. efDBaseVII: if FieldType in DBaseVIIUnsupported then result:=false;
  100. efCSV: result:=true;
  101. efFixedLengthText: result:=true; //todo: verify if all fields are really supported. Quick glance would indicate so
  102. efFoxpro: if FieldType in FoxProUnsupported then result:=false;
  103. efVisualFoxpro: if FieldType in FoxProUnsupported-[ftVarBytes] then result:=false;
  104. efJSON: result:=true;
  105. efRTF: result:=true;
  106. efSQL: result:=true;
  107. efTeX: result:=true;
  108. efXML: result:=true;
  109. efXMLXSDAccess, efXMLXSDADONet, efXMLXSDClientDataset, efXMLXSDExcel: result:=true;
  110. else
  111. result:=false;
  112. Fail('Error in test code itself: FieldSupported unknown ExportSubFormat '+inttostr(ord(ExportSubFormat)));
  113. end;
  114. end;
  115. procedure TTestDBExport.GenericExportTest(Exporter: TCustomDatasetExporter; ExportFormat: TDetailedExportFormats);
  116. var
  117. FieldMapping: TExportFields;
  118. NumberExported: integer;
  119. i: integer;
  120. begin
  121. FieldMapping:=TExportFields.Create(Exporter.ExportFields.ItemClass);
  122. try
  123. Exporter.Dataset := DBConnector.GetFieldDataset;
  124. Exporter.Dataset.Open;
  125. Exporter.BuildDefaultFieldMap(FieldMapping);
  126. // Remove unsupported data types in export from the mapping.
  127. // Cannot use FieldMapping[i].Field.DataType as
  128. // the field hasn't been set by BindFields yet... assume the
  129. // order of original fields and their mapping match
  130. for i:=Exporter.Dataset.Fields.Count-1 downto 0 do
  131. begin
  132. if not FieldSupported(
  133. Exporter.Dataset.Fields[i].DataType,
  134. ExportFormat) then
  135. FieldMapping.Delete(i);
  136. end;
  137. for i:=0 to FieldMapping.Count-1 do
  138. Exporter.ExportFields.Add.Assign(FieldMapping[i]);
  139. NumberExported := Exporter.Execute;
  140. Exporter.Dataset.Last;
  141. Exporter.Dataset.First;
  142. AssertEquals('Number of records exported matches recordcount', NumberExported,
  143. Exporter.Dataset.RecordCount);
  144. Exporter.Dataset.Close;
  145. finally
  146. FieldMapping.Free;
  147. end;
  148. end;
  149. function TTestDBExport.GetFileSize(const FileName: string): integer;
  150. Var
  151. F : file of byte;
  152. begin
  153. result:=0;
  154. assign (F,FileName);
  155. try
  156. reset(F);
  157. result:=filesize(F);
  158. finally
  159. close(F);
  160. end;
  161. end;
  162. procedure TTestDBExport.SetUp;
  163. begin
  164. inherited SetUp;
  165. InitialiseDBConnector;
  166. DBConnector.StartTest(TestName);
  167. FExportTempDir:=IncludeTrailingPathDelimiter(ExpandFileName(''))+'exporttests'+PathDelim; //Store output in subdirectory
  168. ForceDirectories(FExportTempDir);
  169. FKeepFilesAfterTest:=true; //keep test files; consistent with other units right now
  170. end;
  171. procedure TTestDBExport.TearDown;
  172. begin
  173. inherited TearDown;
  174. DBConnector.StopTest(TestName);
  175. FreeDBConnector;
  176. end;
  177. procedure TTestDBExport.TestDBFExport_DBaseVII;
  178. var
  179. Exporter: TFPDBFExport;
  180. ExportFormat: TDetailedExportFormats;
  181. ExportSettings:TDBFExportFormatSettings;
  182. begin
  183. Exporter := TFPDBFExport.Create(nil);
  184. ExportSettings:=TDBFExportFormatSettings.Create(true);
  185. try
  186. ExportFormat:=efDBaseVII;
  187. ExportSettings.TableFormat:=tfDBaseVII;
  188. ExportSettings.AutoRenameFields:=true; //rename conflicting column names
  189. // Use export subtype position to differentiate output filenames:
  190. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  191. lowercase(rightstr(TestName,5)) +
  192. TDetailedExportExtensions[ExportFormat];
  193. Exporter.FormatSettings:=ExportSettings;
  194. GenericExportTest(Exporter, ExportFormat);
  195. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  196. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  197. finally
  198. if (FKeepFilesAfterTest = False) then
  199. DeleteFile(Exporter.FileName);
  200. ExportSettings.Free;
  201. Exporter.Free;
  202. end;
  203. end;
  204. procedure TTestDBExport.TestDBFExport_DBaseIV;
  205. var
  206. Exporter: TFPDBFExport;
  207. ExportFormat: TDetailedExportFormats;
  208. ExportSettings:TDBFExportFormatSettings;
  209. begin
  210. Exporter := TFPDBFExport.Create(nil);
  211. ExportSettings:=TDBFExportFormatSettings.Create(true);
  212. try
  213. ExportFormat:=efDBaseIV;
  214. ExportSettings.TableFormat:=tfDBaseIV;
  215. ExportSettings.AutoRenameFields:=true; //rename conflicting column names
  216. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  217. lowercase(rightstr(TestName,5)) +
  218. TDetailedExportExtensions[ExportFormat];
  219. Exporter.FormatSettings:=ExportSettings;
  220. GenericExportTest(Exporter, ExportFormat);
  221. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  222. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  223. finally
  224. if (FKeepFilesAfterTest = False) then
  225. DeleteFile(Exporter.FileName);
  226. ExportSettings.Free;
  227. Exporter.Free;
  228. end;
  229. end;
  230. procedure TTestDBExport.TestDBFExport_FoxPro;
  231. var
  232. Exporter: TFPDBFExport;
  233. ExportFormat: TDetailedExportFormats;
  234. ExportSettings:TDBFExportFormatSettings;
  235. begin
  236. Exporter := TFPDBFExport.Create(nil);
  237. ExportSettings:=TDBFExportFormatSettings.Create(true);
  238. try
  239. ExportFormat:=efFoxpro;
  240. ExportSettings.TableFormat:=tfFoxPro;
  241. ExportSettings.AutoRenameFields:=true; //rename conflicting column names
  242. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  243. lowercase(rightstr(TestName,5)) +
  244. TDetailedExportExtensions[ExportFormat];
  245. Exporter.FormatSettings:=ExportSettings;
  246. GenericExportTest(Exporter, ExportFormat);
  247. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  248. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  249. finally
  250. if (FKeepFilesAfterTest = False) then
  251. DeleteFile(Exporter.FileName);
  252. ExportSettings.Free;
  253. Exporter.Free;
  254. end;
  255. end;
  256. procedure TTestDBExport.TestDBFExport_VisualFoxPro;
  257. var
  258. Exporter: TFPDBFExport;
  259. ExportFormat: TDetailedExportFormats;
  260. ExportSettings:TDBFExportFormatSettings;
  261. begin
  262. Exporter := TFPDBFExport.Create(nil);
  263. ExportSettings:=TDBFExportFormatSettings.Create(true);
  264. try
  265. ExportFormat:=efVisualFoxpro;
  266. ExportSettings.TableFormat:=tfVisualFoxPro;
  267. ExportSettings.AutoRenameFields:=true; //rename conflicting column names
  268. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  269. lowercase(rightstr(TestName,5)) +
  270. TDetailedExportExtensions[ExportFormat];
  271. Exporter.FormatSettings:=ExportSettings;
  272. GenericExportTest(Exporter, ExportFormat);
  273. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  274. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  275. finally
  276. if (FKeepFilesAfterTest = False) then
  277. DeleteFile(Exporter.FileName);
  278. ExportSettings.Free;
  279. Exporter.Free;
  280. end;
  281. end;
  282. procedure TTestDBExport.TestXSDExport_Access_NoXSD_DecimalOverride;
  283. var
  284. Exporter: TXMLXSDExporter;
  285. ExportFormat: TDetailedExportFormats;
  286. ExportSettings:TXMLXSDFormatSettings;
  287. begin
  288. Exporter := TXMLXSDExporter.Create(nil);
  289. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  290. try
  291. ExportSettings.ExportFormat:=AccessCompatible;
  292. ExportFormat:=efXMLXSDAccess;
  293. ExportSettings.CreateXSD:=false;
  294. ExportSettings.DecimalSeparator:='.'; //override
  295. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  296. lowercase(rightstr(TestName,5)) +
  297. TDetailedExportExtensions[ExportFormat];
  298. Exporter.FormatSettings:=ExportSettings;
  299. GenericExportTest(Exporter, ExportFormat);
  300. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  301. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  302. finally
  303. if (FKeepFilesAfterTest = False) then
  304. DeleteFile(Exporter.FileName);
  305. ExportSettings.Free;
  306. Exporter.Free;
  307. end;
  308. end;
  309. procedure TTestDBExport.TestXSDExport_Access_NoXSD_NoDecimalOverride;
  310. var
  311. Exporter: TXMLXSDExporter;
  312. ExportFormat: TDetailedExportFormats;
  313. ExportSettings:TXMLXSDFormatSettings;
  314. begin
  315. Exporter := TXMLXSDExporter.Create(nil);
  316. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  317. try
  318. ExportSettings.ExportFormat:=AccessCompatible;
  319. ExportFormat:=efXMLXSDAccess;
  320. ExportSettings.CreateXSD:=false;
  321. ExportSettings.DecimalSeparator:=#0; //don't override
  322. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  323. lowercase(rightstr(TestName,5)) +
  324. TDetailedExportExtensions[ExportFormat];
  325. Exporter.FormatSettings:=ExportSettings;
  326. GenericExportTest(Exporter, ExportFormat);
  327. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  328. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  329. finally
  330. if (FKeepFilesAfterTest = False) then
  331. DeleteFile(Exporter.FileName);
  332. ExportSettings.Free;
  333. Exporter.Free;
  334. end;
  335. end;
  336. procedure TTestDBExport.TestXSDExport_Access_XSD_DecimalOverride;
  337. var
  338. Exporter: TXMLXSDExporter;
  339. ExportFormat: TDetailedExportFormats;
  340. ExportSettings:TXMLXSDFormatSettings;
  341. begin
  342. Exporter := TXMLXSDExporter.Create(nil);
  343. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  344. try
  345. ExportSettings.ExportFormat:=AccessCompatible;
  346. ExportFormat:=efXMLXSDAccess;
  347. ExportSettings.CreateXSD:=true;
  348. ExportSettings.DecimalSeparator:='.'; //override
  349. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  350. lowercase(rightstr(TestName,5)) +
  351. TDetailedExportExtensions[ExportFormat];
  352. Exporter.FormatSettings:=ExportSettings;
  353. GenericExportTest(Exporter, ExportFormat);
  354. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  355. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  356. finally
  357. if (FKeepFilesAfterTest = False) then
  358. DeleteFile(Exporter.FileName);
  359. ExportSettings.Free;
  360. Exporter.Free;
  361. end;
  362. end;
  363. procedure TTestDBExport.TestXSDExport_Access_XSD_NoDecimalOverride;
  364. var
  365. Exporter: TXMLXSDExporter;
  366. ExportFormat: TDetailedExportFormats;
  367. ExportSettings:TXMLXSDFormatSettings;
  368. begin
  369. Exporter := TXMLXSDExporter.Create(nil);
  370. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  371. try
  372. ExportSettings.ExportFormat:=AccessCompatible;
  373. ExportFormat:=efXMLXSDAccess;
  374. ExportSettings.CreateXSD:=true;
  375. ExportSettings.DecimalSeparator:=AnsiChar(#0); //don't override
  376. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  377. lowercase(rightstr(TestName,5)) +
  378. TDetailedExportExtensions[ExportFormat];
  379. Exporter.FormatSettings:=ExportSettings;
  380. GenericExportTest(Exporter, ExportFormat);
  381. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  382. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  383. finally
  384. if (FKeepFilesAfterTest = False) then
  385. DeleteFile(Exporter.FileName);
  386. ExportSettings.Free;
  387. Exporter.Free;
  388. end;
  389. end;
  390. procedure TTestDBExport.TestXSDExport_ADONET_NoXSD;
  391. var
  392. Exporter: TXMLXSDExporter;
  393. ExportFormat: TDetailedExportFormats;
  394. ExportSettings:TXMLXSDFormatSettings;
  395. begin
  396. Exporter := TXMLXSDExporter.Create(nil);
  397. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  398. try
  399. ExportSettings.ExportFormat:=ADONETCompatible;
  400. ExportFormat:=efXMLXSDADONet;
  401. ExportSettings.CreateXSD:=false;
  402. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  403. lowercase(rightstr(TestName,5)) +
  404. TDetailedExportExtensions[ExportFormat];
  405. Exporter.FormatSettings:=ExportSettings;
  406. GenericExportTest(Exporter, ExportFormat);
  407. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  408. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  409. finally
  410. if (FKeepFilesAfterTest = False) then
  411. DeleteFile(Exporter.FileName);
  412. ExportSettings.Free;
  413. Exporter.Free;
  414. end;
  415. end;
  416. procedure TTestDBExport.TestXSDExport_ADONET_XSD;
  417. var
  418. Exporter: TXMLXSDExporter;
  419. ExportFormat: TDetailedExportFormats;
  420. ExportSettings:TXMLXSDFormatSettings;
  421. begin
  422. Exporter := TXMLXSDExporter.Create(nil);
  423. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  424. try
  425. ExportSettings.ExportFormat:=ADONETCompatible;
  426. ExportFormat:=efXMLXSDADONet;
  427. ExportSettings.CreateXSD:=true;
  428. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  429. lowercase(rightstr(TestName,5)) +
  430. TDetailedExportExtensions[ExportFormat];
  431. Exporter.FormatSettings:=ExportSettings;
  432. GenericExportTest(Exporter, ExportFormat);
  433. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  434. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  435. finally
  436. if (FKeepFilesAfterTest = False) then
  437. DeleteFile(Exporter.FileName);
  438. ExportSettings.Free;
  439. Exporter.Free;
  440. end;
  441. end;
  442. procedure TTestDBExport.TestCSVExport;
  443. var
  444. Exporter: TCSVExporter;
  445. ExportFormat: TDetailedExportFormats;
  446. ExportSettings: TCSVFormatSettings;
  447. begin
  448. Exporter := TCSVExporter.Create(nil);
  449. ExportSettings:=TCSVFormatSettings.Create(true);
  450. try
  451. ExportFormat:=efCSV;
  452. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  453. lowercase(rightstr(TestName,5)) +
  454. TDetailedExportExtensions[ExportFormat];
  455. Exporter.FormatSettings:=ExportSettings;
  456. GenericExportTest(Exporter, ExportFormat);
  457. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  458. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  459. finally
  460. if (FKeepFilesAfterTest = False) then
  461. DeleteFile(Exporter.FileName);
  462. ExportSettings.Free;
  463. Exporter.Free;
  464. end;
  465. end;
  466. procedure TTestDBExport.TestCSVExport_RFC4180WithHeader;
  467. var
  468. Exporter: TCSVExporter;
  469. ExportFormat: TDetailedExportFormats;
  470. ExportSettings: TCSVFormatSettings;
  471. begin
  472. Exporter := TCSVExporter.Create(nil);
  473. ExportSettings:=TCSVFormatSettings.Create(true);
  474. try
  475. ExportSettings.FieldDelimiter:=','; //RFC 4180 specified commas as delimiter
  476. ExportSettings.HeaderRow:=true; //...allows an optional header line
  477. ExportSettings.QuoteChar:='"'; //...requires quoting with " (if quoting)
  478. // Fields containing line breaks (CRLF), double quotes,
  479. // and commas should be enclosed in double-quotes.
  480. // => this probably won't get tested with this test set.
  481. ExportFormat:=efCSV;
  482. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  483. lowercase(rightstr(TestName,5)) +
  484. TDetailedExportExtensions[ExportFormat];
  485. Exporter.FormatSettings:=ExportSettings;
  486. GenericExportTest(Exporter, ExportFormat);
  487. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  488. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  489. finally
  490. if (FKeepFilesAfterTest = False) then
  491. DeleteFile(Exporter.FileName);
  492. ExportSettings.Free;
  493. Exporter.Free;
  494. end;
  495. end;
  496. procedure TTestDBExport.TestCSVExport_TweakSettingsSemicolon;
  497. var
  498. Exporter: TCSVExporter;
  499. ExportFormat: TDetailedExportFormats;
  500. ExportSettings: TCSVFormatSettings;
  501. begin
  502. Exporter := TCSVExporter.Create(nil);
  503. ExportSettings:=TCSVFormatSettings.Create(true);
  504. try
  505. ExportSettings.FieldDelimiter:=';';
  506. ExportSettings.QuoteChar:='"'; //try explicit assignment
  507. ExportSettings.RowDelimiter:=#10; //Unix/Linux format
  508. ExportSettings.BooleanFalse:='onwaar'; //why not a Dutch output format?
  509. ExportSettings.BooleanTrue:='waar'; //why not a Dutch output format?
  510. ExportSettings.CurrencyDigits:=3;
  511. ExportSettings.CurrencySymbol:='€'; //euro sign
  512. ExportSettings.DateFormat:='d-mm-yyyy'; //Dutch setting
  513. ExportSettings.DateTimeFormat:='d-mm-yyyy hh:nn:ss'; //Dutch setting
  514. ExportSettings.DecimalSeparator:=','; //another Dutch setting
  515. ExportSettings.TimeFormat:='hh:nn:ss'; //Dutch setting
  516. ExportSettings.IntegerFormat:='0000';//Strange but nice ;)
  517. ExportFormat:=efCSV;
  518. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  519. lowercase(rightstr(TestName,5)) +
  520. TDetailedExportExtensions[ExportFormat];
  521. Exporter.FormatSettings:=ExportSettings;
  522. GenericExportTest(Exporter, ExportFormat);
  523. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  524. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  525. finally
  526. if (FKeepFilesAfterTest = False) then
  527. DeleteFile(Exporter.FileName);
  528. ExportSettings.Free;
  529. Exporter.Free;
  530. end;
  531. end;
  532. procedure TTestDBExport.TestCSVExportDisabledFields;
  533. var
  534. DS : TBufDataset;
  535. Exporter: TCSVExporter;
  536. F : text;
  537. S : UTF8String;
  538. haveFile : Boolean;
  539. begin
  540. haveFile:=False;
  541. Exporter:=Nil;
  542. DS:=GetABCDS;
  543. try
  544. Exporter := TCSVExporter.Create(nil);
  545. Exporter.FormatSettings.HeaderRow:=True;
  546. Exporter.Dataset:=DS;
  547. Exporter.FileName := FExportTempDir + lowercase(TestName) + '.csv';
  548. Exporter.BuildDefaultFieldMap(Exporter.ExportFields);
  549. Exporter.ExportFields[1].Enabled:=False;
  550. AssertEquals('Output count',2,Exporter.Execute);
  551. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  552. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  553. AssignFile(F,Exporter.FileName);
  554. Reset(F);
  555. haveFile:=True;
  556. Readln(F,S);
  557. AssertEquals('Correct header line','A,C',S); // 1 extra
  558. Readln(F,S);
  559. AssertEquals('Correct first line','xx,zz',S); // 1 extra
  560. Readln(F,S);
  561. AssertEquals('Correct first line','x,z',S); // 1 extra
  562. finally
  563. if HaveFile then
  564. closeFile(F);
  565. if (FKeepFilesAfterTest = False) then
  566. DeleteFile(Exporter.FileName);
  567. Exporter.Free;
  568. end;
  569. end;
  570. procedure TTestDBExport.TestFixedTextExport;
  571. var
  572. Exporter: TFixedLengthExporter;
  573. ExportFormat: TDetailedExportFormats;
  574. begin
  575. Exporter := TFixedLengthExporter.Create(nil);
  576. try
  577. ExportFormat:=efFixedLengthText;
  578. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  579. lowercase(rightstr(TestName,5)) +
  580. TDetailedExportExtensions[ExportFormat];
  581. GenericExportTest(Exporter, ExportFormat);
  582. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  583. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  584. finally
  585. if (FKeepFilesAfterTest = False) then
  586. DeleteFile(Exporter.FileName);
  587. Exporter.Free;
  588. end;
  589. end;
  590. Const
  591. // UTF8 code page assumed !
  592. WidestringLine1 = '这是一个测验';
  593. WidestringLine2 = 'Это тест.';
  594. WidestringLine3 = 'ça roule.';
  595. WidestringResLine1 = '这是一';
  596. WidestringResLine2 = 'Это';
  597. WidestringResLine3 = 'ça ';
  598. Function TTestDBExport.GetWideStringDS : TBufDataset;
  599. Var
  600. DS : TBufDataset;
  601. begin
  602. DS:=TPersistentBufDataset.Create(Nil);
  603. try
  604. DS.FieldDefs.Add('F',ftWideString,10);
  605. DS.CreateDataset;
  606. DS.Append;
  607. DS.Fields[0].AsWideString:=UTF8Decode(WideStringLine1);
  608. DS.Post;
  609. DS.Append;
  610. DS.Fields[0].AsWideString:=UTF8Decode(WideStringLine2);
  611. DS.Post;
  612. DS.Append;
  613. DS.Fields[0].AsWideString:=UTF8Decode(WideStringLine3);
  614. DS.Post;
  615. DS.First;
  616. except
  617. DS.Free;
  618. Raise;
  619. end;
  620. Result:=DS;
  621. end;
  622. procedure TTestDBExport.TestFixedTextExportUTF8;
  623. var
  624. DS : TBufDataset;
  625. Exporter: TFixedLengthExporter;
  626. F : text;
  627. S : UTF8String;
  628. haveFile : Boolean;
  629. begin
  630. haveFile:=False;
  631. Exporter:=Nil;
  632. DS:=GetWideStringDS;
  633. try
  634. Exporter := TFixedLengthExporter.Create(nil);
  635. Exporter.Dataset:=DS;
  636. Exporter.FormatSettings.CharMode:=cmUTF8;
  637. Exporter.FileName := FExportTempDir + lowercase(TestName) + '.txt';
  638. Exporter.BuildDefaultFieldMap(Exporter.ExportFields);
  639. TFixedLengthExportFieldItem(Exporter.ExportFields[0]).Width:=3;
  640. AssertEquals('Output count',3,Exporter.Execute);
  641. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  642. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  643. AssignFile(F,Exporter.FileName);
  644. Reset(F);
  645. haveFile:=True;
  646. Readln(F,S);
  647. AssertEquals('Correct first line',UTF8Decode(WideStringResLine1),UTF8Decode(S));
  648. Readln(F,S);
  649. AssertEquals('Correct second line',UTF8Decode(WideStringResLine2),UTF8Decode(S));
  650. Readln(F,S);
  651. AssertEquals('Correct second line',UTF8Decode(WideStringResLine3),UTF8Decode(S));
  652. finally
  653. if HaveFile then
  654. closeFile(F);
  655. if (FKeepFilesAfterTest = False) then
  656. DeleteFile(Exporter.FileName);
  657. Exporter.Free;
  658. end;
  659. end;
  660. procedure TTestDBExport.TestFixedTextExportUTF16;
  661. var
  662. DS : TBufDataset;
  663. Exporter: TFixedLengthExporter;
  664. F : text;
  665. S : UnicodeString;
  666. haveFile : Boolean;
  667. begin
  668. haveFile:=False;
  669. Exporter:=Nil;
  670. DS:=GetWideStringDS;
  671. try
  672. Exporter := TFixedLengthExporter.Create(nil);
  673. Exporter.Dataset:=DS;
  674. Exporter.FormatSettings.CharMode:=cmUTF16;
  675. Exporter.FileName := FExportTempDir + lowercase(TestName) + '.txt';
  676. Exporter.BuildDefaultFieldMap(Exporter.ExportFields);
  677. TFixedLengthExportFieldItem(Exporter.ExportFields[0]).Width:=3;
  678. AssertEquals('Output count',3,Exporter.Execute);
  679. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  680. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  681. AssignFile(F,Exporter.FileName);
  682. Reset(F);
  683. haveFile:=True;
  684. Readln(F,S);
  685. AssertEquals('Correct first line',UTF8Decode(WideStringResLine1),S);
  686. Readln(F,S);
  687. AssertEquals('Correct second line',UTF8Decode(WideStringResLine2),S);
  688. Readln(F,S);
  689. AssertEquals('Correct second line',UTF8Decode(WideStringResLine3),S);
  690. finally
  691. if HaveFile then
  692. closeFile(F);
  693. if (FKeepFilesAfterTest = False) then
  694. DeleteFile(Exporter.FileName);
  695. Exporter.Free;
  696. end;
  697. end;
  698. Function TTestDBExport.GetBooleanDS : TBufDataset;
  699. Var
  700. DS : TBufDataset;
  701. begin
  702. DS:=TPersistentBufDataSet.Create(Nil);
  703. try
  704. DS.FieldDefs.Add('F',ftBoolean,0);
  705. DS.CreateDataset;
  706. DS.Append;
  707. DS.Fields[0].AsBoolean:=true;
  708. DS.Post;
  709. DS.Append;
  710. DS.Fields[0].AsBoolean:=False;
  711. DS.Post;
  712. DS.First;
  713. except
  714. DS.Free;
  715. Raise;
  716. end;
  717. Result:=DS;
  718. end;
  719. Function TTestDBExport.GetABCDS : TBufDataset;
  720. Var
  721. DS : TBufDataset;
  722. begin
  723. DS:=TPersistentBufDataset.Create(Nil);
  724. try
  725. DS.FieldDefs.Add('A',ftString,2);
  726. DS.FieldDefs.Add('B',ftString,2);
  727. DS.FieldDefs.Add('C',ftString,2);
  728. DS.CreateDataset;
  729. DS.Append;
  730. DS.Fields[0].AsString:='xx';
  731. DS.Fields[1].AsString:='y';
  732. DS.Fields[2].AsString:='zz';
  733. DS.Post;
  734. DS.Append;
  735. DS.Fields[0].AsString:='x';
  736. DS.Fields[1].AsString:='yy';
  737. DS.Fields[2].AsString:='z';
  738. DS.Post;
  739. DS.First;
  740. except
  741. DS.Free;
  742. Raise;
  743. end;
  744. Result:=DS;
  745. end;
  746. procedure TTestDBExport.TestFixedTextExportBoolean;
  747. var
  748. DS : TBufDataset;
  749. Exporter: TFixedLengthExporter;
  750. F : text;
  751. S : UTF8String;
  752. haveFile : Boolean;
  753. begin
  754. haveFile:=False;
  755. Exporter:=Nil;
  756. DS:=GetBooleanDS;
  757. try
  758. Exporter := TFixedLengthExporter.Create(nil);
  759. Exporter.FormatSettings.BooleanFalse:='false';
  760. Exporter.FormatSettings.BooleanTrue:='True';
  761. Exporter.Dataset:=DS;
  762. Exporter.FileName := FExportTempDir + lowercase(TestName) + '.txt';
  763. Exporter.BuildDefaultFieldMap(Exporter.ExportFields);
  764. AssertEquals('Correct width',5, TFixedLengthExportFieldItem(Exporter.ExportFields[0]).Width);
  765. AssertEquals('Output count',2,Exporter.Execute);
  766. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  767. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  768. AssignFile(F,Exporter.FileName);
  769. Reset(F);
  770. haveFile:=True;
  771. Readln(F,S);
  772. AssertEquals('Correct first line','True ',S); // 1 extra
  773. Readln(F,S);
  774. AssertEquals('Correct second line','false',S);
  775. finally
  776. if HaveFile then
  777. closeFile(F);
  778. if (FKeepFilesAfterTest = False) then
  779. DeleteFile(Exporter.FileName);
  780. Exporter.Free;
  781. end;
  782. end;
  783. procedure TTestDBExport.TestFixedTextExportHeader;
  784. var
  785. DS : TBufDataset;
  786. Exporter: TFixedLengthExporter;
  787. F : text;
  788. S : UTF8String;
  789. haveFile : Boolean;
  790. begin
  791. haveFile:=False;
  792. Exporter:=Nil;
  793. DS:=GetABCDS;
  794. try
  795. Exporter := TFixedLengthExporter.Create(nil);
  796. Exporter.FormatSettings.BooleanFalse:='false';
  797. Exporter.FormatSettings.BooleanTrue:='True';
  798. Exporter.FormatSettings.HeaderRow:=True;
  799. Exporter.Dataset:=DS;
  800. Exporter.FileName := FExportTempDir + lowercase(TestName) + '.txt';
  801. Exporter.BuildDefaultFieldMap(Exporter.ExportFields);
  802. AssertEquals('Correct width',2, TFixedLengthExportFieldItem(Exporter.ExportFields[0]).Width);
  803. AssertEquals('Output count',2,Exporter.Execute);
  804. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  805. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  806. AssignFile(F,Exporter.FileName);
  807. Reset(F);
  808. haveFile:=True;
  809. Readln(F,S);
  810. AssertEquals('Correct header line','A B C ',S); // 1 extra
  811. Readln(F,S);
  812. AssertEquals('Correct first line','xxy zz',S); // 1 extra
  813. Readln(F,S);
  814. AssertEquals('Correct second line','x yyz ',S);
  815. finally
  816. if HaveFile then
  817. closeFile(F);
  818. if (FKeepFilesAfterTest = False) then
  819. DeleteFile(Exporter.FileName);
  820. Exporter.Free;
  821. end;
  822. end;
  823. procedure TTestDBExport.TestFixedTextExportHeaderDisabledFields;
  824. var
  825. DS : TBufDataset;
  826. Exporter: TFixedLengthExporter;
  827. F : text;
  828. S : UTF8String;
  829. haveFile : Boolean;
  830. begin
  831. haveFile:=False;
  832. Exporter:=Nil;
  833. DS:=GetABCDS;
  834. try
  835. Exporter := TFixedLengthExporter.Create(nil);
  836. Exporter.FormatSettings.HeaderRow:=True;
  837. Exporter.Dataset:=DS;
  838. Exporter.FileName := FExportTempDir + lowercase(TestName) + '.txt';
  839. Exporter.BuildDefaultFieldMap(Exporter.ExportFields);
  840. Exporter.ExportFields[1].Enabled:=False;
  841. AssertEquals('Output count',2,Exporter.Execute);
  842. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  843. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  844. AssignFile(F,Exporter.FileName);
  845. Reset(F);
  846. haveFile:=True;
  847. Readln(F,S);
  848. AssertEquals('Correct header line','A C ',S); // 1 extra
  849. Readln(F,S);
  850. AssertEquals('Correct first line','xxzz',S); // 1 extra
  851. Readln(F,S);
  852. AssertEquals('Correct first line','x z ',S); // 1 extra
  853. finally
  854. if HaveFile then
  855. closeFile(F);
  856. if (FKeepFilesAfterTest = False) then
  857. DeleteFile(Exporter.FileName);
  858. Exporter.Free;
  859. end;
  860. end;
  861. procedure TTestDBExport.TestFixedTextExportSpaces;
  862. var
  863. DS : TBufDataset;
  864. Exporter: TFixedLengthExporter;
  865. F : text;
  866. S : UTF8String;
  867. haveFile : Boolean;
  868. begin
  869. haveFile:=False;
  870. Exporter:=Nil;
  871. DS:=GetABCDS;
  872. try
  873. Exporter := TFixedLengthExporter.Create(nil);
  874. Exporter.FormatSettings.BooleanFalse:='false';
  875. Exporter.FormatSettings.BooleanTrue:='True';
  876. Exporter.FormatSettings.HeaderRow:=True;
  877. Exporter.FormatSettings.ColumnSeparatorSpaceCount:=2;
  878. Exporter.Dataset:=DS;
  879. Exporter.FileName := FExportTempDir + lowercase(TestName) + '.txt';
  880. Exporter.BuildDefaultFieldMap(Exporter.ExportFields);
  881. AssertEquals('Output count',2,Exporter.Execute);
  882. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  883. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  884. AssignFile(F,Exporter.FileName);
  885. Reset(F);
  886. haveFile:=True;
  887. Readln(F,S);
  888. AssertEquals('Correct header line','A B C ',S); // 1 extra
  889. Readln(F,S);
  890. AssertEquals('Correct first line','xx y zz',S); // 1 extra
  891. Readln(F,S);
  892. AssertEquals('Correct first line','x yy z ',S); // 1 extra
  893. finally
  894. if HaveFile then
  895. closeFile(F);
  896. if (FKeepFilesAfterTest = False) then
  897. DeleteFile(Exporter.FileName);
  898. Exporter.Free;
  899. end;
  900. end;
  901. procedure TTestDBExport.TestJSONExport;
  902. var
  903. Exporter: TSimpleJSONExporter;
  904. ExportFormat: TDetailedExportFormats;
  905. ExportSettings:TSimpleJSONFormatSettings;
  906. begin
  907. Exporter := TSimpleJSONExporter.Create(nil);
  908. ExportSettings:=TSimpleJSONFormatSettings.Create(true);
  909. try
  910. ExportFormat:=efJSON;
  911. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) + lowercase(rightstr(TestName,5))+
  912. inttostr(ord(ExportFormat))+
  913. TDetailedExportExtensions[ExportFormat]; Exporter.FormatSettings:=ExportSettings;
  914. GenericExportTest(Exporter, ExportFormat);
  915. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  916. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  917. finally
  918. if (FKeepFilesAfterTest = False) then
  919. DeleteFile(Exporter.FileName);
  920. ExportSettings.Free;
  921. Exporter.Free;
  922. end;
  923. end;
  924. procedure TTestDBExport.TestRTFExport;
  925. var
  926. Exporter: TRTFExporter;
  927. ExportFormat: TDetailedExportFormats;
  928. ExportSettings:TRTFExportFormatSettings;
  929. begin
  930. Exporter := TRTFExporter.Create(nil);
  931. ExportSettings:=TRTFExportFormatSettings.Create(true);
  932. try
  933. ExportFormat:=efRTF;
  934. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  935. lowercase(rightstr(TestName,5))+
  936. TDetailedExportExtensions[ExportFormat];
  937. Exporter.FormatSettings:=ExportSettings;
  938. GenericExportTest(Exporter, ExportFormat);
  939. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  940. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  941. finally
  942. if (FKeepFilesAfterTest = False) then
  943. DeleteFile(Exporter.FileName);
  944. ExportSettings.Free;
  945. Exporter.Free;
  946. end;
  947. end;
  948. procedure TTestDBExport.TestSQLExport;
  949. var
  950. Exporter: TSQLExporter;
  951. ExportFormat: TDetailedExportFormats;
  952. ExportSettings:TSQLFormatSettings;
  953. begin
  954. Exporter := TSQLExporter.Create(nil);
  955. ExportSettings:=TSQLFormatSettings.Create(true);
  956. try
  957. ExportSettings.TableName:='ATABLE'; //required for export to succeed
  958. ExportFormat:=efSQL;
  959. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  960. lowercase(rightstr(TestName,5))+
  961. TDetailedExportExtensions[ExportFormat];
  962. Exporter.FormatSettings:=ExportSettings;
  963. GenericExportTest(Exporter, ExportFormat);
  964. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  965. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  966. finally
  967. if (FKeepFilesAfterTest = False) then
  968. DeleteFile(Exporter.FileName);
  969. ExportSettings.Free;
  970. Exporter.Free;
  971. end;
  972. end;
  973. procedure TTestDBExport.TestTeXExport;
  974. var
  975. Exporter: TTexExporter;
  976. ExportFormat: TDetailedExportFormats;
  977. ExportSettings:TTeXExportFormatSettings;
  978. begin
  979. Exporter := TTexExporter.Create(nil);
  980. ExportSettings:=TTeXExportFormatSettings.Create(true);
  981. try
  982. ExportFormat:=efTeX;
  983. Exporter.FileName := FExportTempDir +
  984. inttostr(ord(ExportFormat)) + lowercase(rightstr(TestName,5))+
  985. TDetailedExportExtensions[ExportFormat];
  986. Exporter.FormatSettings:=ExportSettings;
  987. GenericExportTest(Exporter, ExportFormat);
  988. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  989. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  990. finally
  991. if (FKeepFilesAfterTest = False) then
  992. DeleteFile(Exporter.FileName);
  993. ExportSettings.Free;
  994. Exporter.Free;
  995. end;
  996. end;
  997. procedure TTestDBExport.TestXMLExport;
  998. var
  999. Exporter: TSimpleXMLExporter;
  1000. ExportFormat: TDetailedExportFormats;
  1001. ExportSettings:TSimpleXMLFormatSettings;
  1002. begin
  1003. Exporter := TSimpleXMLExporter.Create(nil);
  1004. ExportSettings:=TSimpleXMLFormatSettings.Create(true);
  1005. try
  1006. ExportFormat:=efXML;
  1007. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  1008. lowercase(rightstr(TestName,5)) +
  1009. TDetailedExportExtensions[ExportFormat];
  1010. Exporter.FormatSettings:=ExportSettings;
  1011. GenericExportTest(Exporter, ExportFormat);
  1012. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  1013. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  1014. finally
  1015. if (FKeepFilesAfterTest = False) then
  1016. DeleteFile(Exporter.FileName);
  1017. ExportSettings.Free;
  1018. Exporter.Free;
  1019. end;
  1020. end;
  1021. procedure TTestDBExport.TestXMLExportSpecialChars;
  1022. var
  1023. Exporter: TSimpleXMLExporter;
  1024. FieldMapping: TExportFields;
  1025. NumberExported: integer;
  1026. i: integer;
  1027. XML : TXMLDocument;
  1028. begin
  1029. XML:=Nil;
  1030. Exporter := TSimpleXMLExporter.Create(nil);
  1031. FieldMapping:=TExportFields.Create(Exporter.ExportFields.ItemClass);
  1032. try
  1033. Exporter.Dataset := DBConnector.GetFieldDataset;
  1034. Exporter.Dataset.Open;
  1035. Exporter.Dataset.Edit;
  1036. Exporter.Dataset.FieldByName('FString').AsString:='*&*<*>*';
  1037. Exporter.Dataset.Post;
  1038. Exporter.BuildDefaultFieldMap(FieldMapping);
  1039. Exporter.FileName := FExportTempDir + lowercase(rightstr(TestName,5)) + TDetailedExportExtensions[efXML];
  1040. for i:=Exporter.Dataset.Fields.Count-1 downto 0 do
  1041. begin
  1042. if not FieldSupported(
  1043. Exporter.Dataset.Fields[i].DataType,
  1044. efXML) then
  1045. FieldMapping.Delete(i);
  1046. end;
  1047. for i:=0 to FieldMapping.Count-1 do
  1048. Exporter.ExportFields.Add.Assign(FieldMapping[i]);
  1049. NumberExported := Exporter.Execute;
  1050. Exporter.Dataset.Last;
  1051. Exporter.Dataset.First;
  1052. AssertEquals('Number of records exported matches recordcount', NumberExported,
  1053. Exporter.Dataset.RecordCount);
  1054. Exporter.Dataset.Close;
  1055. ReadXMLFile(XML,Exporter.FileName);
  1056. AssertEquals('Correct written','*&*<*>*',XML.DocumentElement.FirstChild.FirstChild.NextSibling.FirstChild.NodeValue);
  1057. finally
  1058. XML.Free;
  1059. FieldMapping.Free;
  1060. Exporter.Free;
  1061. end;
  1062. end;
  1063. procedure TTestDBExport.TestXSDExport_DelphiClientDataset;
  1064. var
  1065. Exporter: TXMLXSDExporter;
  1066. ExportFormat: TDetailedExportFormats;
  1067. ExportSettings:TXMLXSDFormatSettings;
  1068. begin
  1069. Exporter := TXMLXSDExporter.Create(nil);
  1070. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  1071. try
  1072. ExportSettings.ExportFormat:=DelphiClientDataset;
  1073. ExportFormat:=efXMLXSDClientDataset;
  1074. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  1075. lowercase(rightstr(TestName,5)) +
  1076. TDetailedExportExtensions[ExportFormat];
  1077. Exporter.FormatSettings:=ExportSettings;
  1078. GenericExportTest(Exporter, ExportFormat);
  1079. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  1080. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  1081. finally
  1082. if (FKeepFilesAfterTest = False) then
  1083. DeleteFile(Exporter.FileName);
  1084. ExportSettings.Free;
  1085. Exporter.Free;
  1086. end;
  1087. end;
  1088. procedure TTestDBExport.TestXSDExport_Excel;
  1089. var
  1090. Exporter: TXMLXSDExporter;
  1091. ExportFormat: TDetailedExportFormats;
  1092. ExportSettings:TXMLXSDFormatSettings;
  1093. begin
  1094. Exporter := TXMLXSDExporter.Create(nil);
  1095. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  1096. try
  1097. ExportSettings.ExportFormat:=ExcelCompatible;
  1098. ExportFormat:=efXMLXSDExcel;
  1099. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  1100. lowercase(rightstr(TestName,5)) +
  1101. TDetailedExportExtensions[ExportFormat];
  1102. Exporter.FormatSettings:=ExportSettings;
  1103. GenericExportTest(Exporter, ExportFormat);
  1104. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  1105. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  1106. finally
  1107. if (FKeepFilesAfterTest = False) then
  1108. DeleteFile(Exporter.FileName);
  1109. ExportSettings.Free;
  1110. Exporter.Free;
  1111. end;
  1112. end;
  1113. initialization
  1114. RegisterTest(TTestDBExport);
  1115. end.