testdbexport.pas 39 KB

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