testdbexport.pas 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  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 GetFileSize(const FileName: string): integer; //Gets a file's size
  40. protected
  41. procedure SetUp; override;
  42. procedure TearDown; override;
  43. published
  44. procedure TestDBFExport_DBaseIV;
  45. procedure TestDBFExport_DBaseVII;
  46. procedure TestDBFExport_FoxPro;
  47. procedure TestDBFExport_VisualFoxPro;
  48. procedure TestCSVExport; //tests csv export with default values
  49. procedure TestCSVExport_RFC4180WithHeader; //tests csv export with settings that match RFC4180
  50. procedure TestCSVExport_TweakSettingsSemicolon; //tests semicolon delimited, custom country values
  51. procedure TestFixedTextExport;
  52. procedure TestJSONExport;
  53. procedure TestRTFExport;
  54. procedure TestSQLExport;
  55. procedure TestTeXExport;
  56. procedure TestXMLExport; //tests simple xml export
  57. procedure TestXSDExport_Access_NoXSD_DecimalOverride; //tests xmlxsd export
  58. procedure TestXSDExport_Access_NoXSD_NoDecimalOverride; //tests xmlxsd export
  59. procedure TestXSDExport_Access_XSD_DecimalOverride; //tests xmlxsd export
  60. procedure TestXSDExport_Access_XSD_NoDecimalOverride; //tests xmlxsd export
  61. procedure TestXSDExport_ADONET_NoXSD; //tests xmlxsd export
  62. procedure TestXSDExport_ADONET_XSD; //tests xmlxsd export
  63. procedure TestXSDExport_DelphiClientDataset; //tests xmlxsd export
  64. procedure TestXSDExport_Excel; //tests xmlxsd export
  65. end;
  66. implementation
  67. function TTestDBExport.FieldSupported(const FieldType: TFieldType;
  68. const ExportSubFormat: TDetailedExportFormats): boolean;
  69. const
  70. // Alphabetically sorted for quick review:
  71. DBaseVIIUnsupported=[ftADT,ftArray,ftBCD,ftBytes,ftCurrency,ftCursor,ftDataSet,
  72. ftFixedWideChar,
  73. ftFMTBcd,ftFmtMemo,ftGraphic,ftGuid,ftIDispatch,ftInterface,ftOraBlob,
  74. ftOraClob,ftParadoxOle,ftReference,ftTime,ftTimeStamp,ftTypedBinary,
  75. ftUnknown,ftVarBytes,ftVariant,ftWidememo,ftWideString];
  76. FoxProUnsupported= [ftADT,ftArray, ftBytes, ftCursor,ftDataSet,
  77. ftFixedWideChar,
  78. ftFMTBcd,ftFmtMemo,ftGraphic,ftGuid,ftIDispatch,ftInterface,ftOraBlob,
  79. ftOraClob,ftParadoxOle,ftReference,ftTime,ftTimeStamp,ftTypedBinary,
  80. ftUnknown,ftVarBytes,ftVariant,ftWideMemo,ftWideString];
  81. begin
  82. result:=true;
  83. case ExportSubFormat of
  84. efDBaseIII: if FieldType in DBaseVIIUnsupported+[ftAutoInc] then result:=false;
  85. efDBaseIV: if FieldType in DBaseVIIUnsupported+[ftAutoInc] then result:=false;
  86. efDBaseVII: if FieldType in DBaseVIIUnsupported then result:=false;
  87. efCSV: result:=true;
  88. efFixedLengthText: result:=true; //todo: verify if all fields are really supported. Quick glance would indicate so
  89. efFoxpro: if FieldType in FoxProUnsupported then result:=false;
  90. efVisualFoxpro: if FieldType in FoxProUnsupported-[ftVarBytes] then result:=false;
  91. efJSON: result:=true;
  92. efRTF: result:=true;
  93. efSQL: result:=true;
  94. efTeX: result:=true;
  95. efXML: result:=true;
  96. efXMLXSDAccess, efXMLXSDADONet, efXMLXSDClientDataset, efXMLXSDExcel: result:=true;
  97. else
  98. begin
  99. result:=false;
  100. Fail('Error in test code itself: FieldSupported unknown ExportSubFormat '+inttostr(ord(ExportSubFormat)));
  101. end;
  102. end;
  103. end;
  104. procedure TTestDBExport.GenericExportTest(Exporter: TCustomDatasetExporter; ExportFormat: TDetailedExportFormats);
  105. var
  106. FieldMapping: TExportFields;
  107. NumberExported: integer;
  108. i: integer;
  109. begin
  110. FieldMapping:=TExportFields.Create(Exporter.ExportFields.ItemClass);
  111. try
  112. Exporter.Dataset := DBConnector.GetFieldDataset;
  113. Exporter.Dataset.Open;
  114. Exporter.BuildDefaultFieldMap(FieldMapping);
  115. // Remove unsupported data types in export from the mapping.
  116. // Cannot use FieldMapping[i].Field.DataType as
  117. // the field hasn't been set by BindFields yet... assume the
  118. // order of original fields and their mapping match
  119. for i:=Exporter.Dataset.Fields.Count-1 downto 0 do
  120. begin
  121. if not FieldSupported(
  122. Exporter.Dataset.Fields[i].DataType,
  123. ExportFormat) then
  124. FieldMapping.Delete(i);
  125. end;
  126. for i:=0 to FieldMapping.Count-1 do
  127. Exporter.ExportFields.Add.Assign(FieldMapping[i]);
  128. NumberExported := Exporter.Execute;
  129. Exporter.Dataset.Last;
  130. Exporter.Dataset.First;
  131. AssertEquals('Number of records exported matches recordcount', NumberExported,
  132. Exporter.Dataset.RecordCount);
  133. Exporter.Dataset.Close;
  134. finally
  135. FieldMapping.Free;
  136. end;
  137. end;
  138. function TTestDBExport.GetFileSize(const FileName: string): integer;
  139. Var
  140. F : file of byte;
  141. begin
  142. result:=0;
  143. assign (F,FileName);
  144. try
  145. reset(F);
  146. result:=filesize(F);
  147. finally
  148. close(F);
  149. end;
  150. end;
  151. procedure TTestDBExport.SetUp;
  152. begin
  153. inherited SetUp;
  154. InitialiseDBConnector;
  155. DBConnector.StartTest(TestName);
  156. FExportTempDir:=IncludeTrailingPathDelimiter(ExpandFileName(''))+'exporttests'+PathDelim; //Store output in subdirectory
  157. ForceDirectories(FExportTempDir);
  158. FKeepFilesAfterTest:=true; //keep test files; consistent with other units right now
  159. end;
  160. procedure TTestDBExport.TearDown;
  161. begin
  162. inherited TearDown;
  163. DBConnector.StopTest(TestName);
  164. FreeDBConnector;
  165. end;
  166. procedure TTestDBExport.TestDBFExport_DBaseVII;
  167. var
  168. Exporter: TFPDBFExport;
  169. ExportFormat: TDetailedExportFormats;
  170. ExportSettings:TDBFExportFormatSettings;
  171. begin
  172. Exporter := TFPDBFExport.Create(nil);
  173. ExportSettings:=TDBFExportFormatSettings.Create(true);
  174. try
  175. ExportFormat:=efDBaseVII;
  176. ExportSettings.TableFormat:=tfDBaseVII;
  177. ExportSettings.AutoRenameFields:=true; //rename conflicting column names
  178. // Use export subtype position to differentiate output filenames:
  179. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  180. lowercase(rightstr(TestName,5)) +
  181. TDetailedExportExtensions[ExportFormat];
  182. Exporter.FormatSettings:=ExportSettings;
  183. GenericExportTest(Exporter, ExportFormat);
  184. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  185. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  186. finally
  187. if (FKeepFilesAfterTest = False) then
  188. DeleteFile(Exporter.FileName);
  189. ExportSettings.Free;
  190. Exporter.Free;
  191. end;
  192. end;
  193. procedure TTestDBExport.TestDBFExport_DBaseIV;
  194. var
  195. Exporter: TFPDBFExport;
  196. ExportFormat: TDetailedExportFormats;
  197. ExportSettings:TDBFExportFormatSettings;
  198. begin
  199. Exporter := TFPDBFExport.Create(nil);
  200. ExportSettings:=TDBFExportFormatSettings.Create(true);
  201. try
  202. ExportFormat:=efDBaseIV;
  203. ExportSettings.TableFormat:=tfDBaseIV;
  204. ExportSettings.AutoRenameFields:=true; //rename conflicting column names
  205. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  206. lowercase(rightstr(TestName,5)) +
  207. TDetailedExportExtensions[ExportFormat];
  208. Exporter.FormatSettings:=ExportSettings;
  209. GenericExportTest(Exporter, ExportFormat);
  210. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  211. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  212. finally
  213. if (FKeepFilesAfterTest = False) then
  214. DeleteFile(Exporter.FileName);
  215. ExportSettings.Free;
  216. Exporter.Free;
  217. end;
  218. end;
  219. procedure TTestDBExport.TestDBFExport_FoxPro;
  220. var
  221. Exporter: TFPDBFExport;
  222. ExportFormat: TDetailedExportFormats;
  223. ExportSettings:TDBFExportFormatSettings;
  224. begin
  225. Exporter := TFPDBFExport.Create(nil);
  226. ExportSettings:=TDBFExportFormatSettings.Create(true);
  227. try
  228. ExportFormat:=efFoxpro;
  229. ExportSettings.TableFormat:=tfFoxPro;
  230. ExportSettings.AutoRenameFields:=true; //rename conflicting column names
  231. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  232. lowercase(rightstr(TestName,5)) +
  233. TDetailedExportExtensions[ExportFormat];
  234. Exporter.FormatSettings:=ExportSettings;
  235. GenericExportTest(Exporter, ExportFormat);
  236. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  237. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  238. finally
  239. if (FKeepFilesAfterTest = False) then
  240. DeleteFile(Exporter.FileName);
  241. ExportSettings.Free;
  242. Exporter.Free;
  243. end;
  244. end;
  245. procedure TTestDBExport.TestDBFExport_VisualFoxPro;
  246. var
  247. Exporter: TFPDBFExport;
  248. ExportFormat: TDetailedExportFormats;
  249. ExportSettings:TDBFExportFormatSettings;
  250. begin
  251. Exporter := TFPDBFExport.Create(nil);
  252. ExportSettings:=TDBFExportFormatSettings.Create(true);
  253. try
  254. ExportFormat:=efVisualFoxpro;
  255. ExportSettings.TableFormat:=tfVisualFoxPro;
  256. ExportSettings.AutoRenameFields:=true; //rename conflicting column names
  257. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  258. lowercase(rightstr(TestName,5)) +
  259. TDetailedExportExtensions[ExportFormat];
  260. Exporter.FormatSettings:=ExportSettings;
  261. GenericExportTest(Exporter, ExportFormat);
  262. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  263. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  264. finally
  265. if (FKeepFilesAfterTest = False) then
  266. DeleteFile(Exporter.FileName);
  267. ExportSettings.Free;
  268. Exporter.Free;
  269. end;
  270. end;
  271. procedure TTestDBExport.TestXSDExport_Access_NoXSD_DecimalOverride;
  272. var
  273. Exporter: TXMLXSDExporter;
  274. ExportFormat: TDetailedExportFormats;
  275. ExportSettings:TXMLXSDFormatSettings;
  276. begin
  277. Exporter := TXMLXSDExporter.Create(nil);
  278. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  279. try
  280. ExportSettings.ExportFormat:=AccessCompatible;
  281. ExportFormat:=efXMLXSDAccess;
  282. ExportSettings.CreateXSD:=false;
  283. ExportSettings.DecimalSeparator:='.'; //override
  284. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  285. lowercase(rightstr(TestName,5)) +
  286. TDetailedExportExtensions[ExportFormat];
  287. Exporter.FormatSettings:=ExportSettings;
  288. GenericExportTest(Exporter, ExportFormat);
  289. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  290. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  291. finally
  292. if (FKeepFilesAfterTest = False) then
  293. DeleteFile(Exporter.FileName);
  294. ExportSettings.Free;
  295. Exporter.Free;
  296. end;
  297. end;
  298. procedure TTestDBExport.TestXSDExport_Access_NoXSD_NoDecimalOverride;
  299. var
  300. Exporter: TXMLXSDExporter;
  301. ExportFormat: TDetailedExportFormats;
  302. ExportSettings:TXMLXSDFormatSettings;
  303. begin
  304. Exporter := TXMLXSDExporter.Create(nil);
  305. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  306. try
  307. ExportSettings.ExportFormat:=AccessCompatible;
  308. ExportFormat:=efXMLXSDAccess;
  309. ExportSettings.CreateXSD:=false;
  310. ExportSettings.DecimalSeparator:=char(''); //don't override
  311. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  312. lowercase(rightstr(TestName,5)) +
  313. TDetailedExportExtensions[ExportFormat];
  314. Exporter.FormatSettings:=ExportSettings;
  315. GenericExportTest(Exporter, ExportFormat);
  316. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  317. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  318. finally
  319. if (FKeepFilesAfterTest = False) then
  320. DeleteFile(Exporter.FileName);
  321. ExportSettings.Free;
  322. Exporter.Free;
  323. end;
  324. end;
  325. procedure TTestDBExport.TestXSDExport_Access_XSD_DecimalOverride;
  326. var
  327. Exporter: TXMLXSDExporter;
  328. ExportFormat: TDetailedExportFormats;
  329. ExportSettings:TXMLXSDFormatSettings;
  330. begin
  331. Exporter := TXMLXSDExporter.Create(nil);
  332. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  333. try
  334. ExportSettings.ExportFormat:=AccessCompatible;
  335. ExportFormat:=efXMLXSDAccess;
  336. ExportSettings.CreateXSD:=true;
  337. ExportSettings.DecimalSeparator:='.'; //override
  338. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  339. lowercase(rightstr(TestName,5)) +
  340. TDetailedExportExtensions[ExportFormat];
  341. Exporter.FormatSettings:=ExportSettings;
  342. GenericExportTest(Exporter, ExportFormat);
  343. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  344. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  345. finally
  346. if (FKeepFilesAfterTest = False) then
  347. DeleteFile(Exporter.FileName);
  348. ExportSettings.Free;
  349. Exporter.Free;
  350. end;
  351. end;
  352. procedure TTestDBExport.TestXSDExport_Access_XSD_NoDecimalOverride;
  353. var
  354. Exporter: TXMLXSDExporter;
  355. ExportFormat: TDetailedExportFormats;
  356. ExportSettings:TXMLXSDFormatSettings;
  357. begin
  358. Exporter := TXMLXSDExporter.Create(nil);
  359. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  360. try
  361. ExportSettings.ExportFormat:=AccessCompatible;
  362. ExportFormat:=efXMLXSDAccess;
  363. ExportSettings.CreateXSD:=true;
  364. ExportSettings.DecimalSeparator:=char(''); //don't override
  365. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  366. lowercase(rightstr(TestName,5)) +
  367. TDetailedExportExtensions[ExportFormat];
  368. Exporter.FormatSettings:=ExportSettings;
  369. GenericExportTest(Exporter, ExportFormat);
  370. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  371. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  372. finally
  373. if (FKeepFilesAfterTest = False) then
  374. DeleteFile(Exporter.FileName);
  375. ExportSettings.Free;
  376. Exporter.Free;
  377. end;
  378. end;
  379. procedure TTestDBExport.TestXSDExport_ADONET_NoXSD;
  380. var
  381. Exporter: TXMLXSDExporter;
  382. ExportFormat: TDetailedExportFormats;
  383. ExportSettings:TXMLXSDFormatSettings;
  384. begin
  385. Exporter := TXMLXSDExporter.Create(nil);
  386. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  387. try
  388. ExportSettings.ExportFormat:=ADONETCompatible;
  389. ExportFormat:=efXMLXSDADONet;
  390. ExportSettings.CreateXSD:=false;
  391. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  392. lowercase(rightstr(TestName,5)) +
  393. TDetailedExportExtensions[ExportFormat];
  394. Exporter.FormatSettings:=ExportSettings;
  395. GenericExportTest(Exporter, ExportFormat);
  396. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  397. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  398. finally
  399. if (FKeepFilesAfterTest = False) then
  400. DeleteFile(Exporter.FileName);
  401. ExportSettings.Free;
  402. Exporter.Free;
  403. end;
  404. end;
  405. procedure TTestDBExport.TestXSDExport_ADONET_XSD;
  406. var
  407. Exporter: TXMLXSDExporter;
  408. ExportFormat: TDetailedExportFormats;
  409. ExportSettings:TXMLXSDFormatSettings;
  410. begin
  411. Exporter := TXMLXSDExporter.Create(nil);
  412. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  413. try
  414. ExportSettings.ExportFormat:=ADONETCompatible;
  415. ExportFormat:=efXMLXSDADONet;
  416. ExportSettings.CreateXSD:=true;
  417. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  418. lowercase(rightstr(TestName,5)) +
  419. TDetailedExportExtensions[ExportFormat];
  420. Exporter.FormatSettings:=ExportSettings;
  421. GenericExportTest(Exporter, ExportFormat);
  422. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  423. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  424. finally
  425. if (FKeepFilesAfterTest = False) then
  426. DeleteFile(Exporter.FileName);
  427. ExportSettings.Free;
  428. Exporter.Free;
  429. end;
  430. end;
  431. procedure TTestDBExport.TestCSVExport;
  432. var
  433. Exporter: TCSVExporter;
  434. ExportFormat: TDetailedExportFormats;
  435. ExportSettings: TCSVFormatSettings;
  436. begin
  437. Exporter := TCSVExporter.Create(nil);
  438. ExportSettings:=TCSVFormatSettings.Create(true);
  439. try
  440. ExportFormat:=efCSV;
  441. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  442. lowercase(rightstr(TestName,5)) +
  443. TDetailedExportExtensions[ExportFormat];
  444. Exporter.FormatSettings:=ExportSettings;
  445. GenericExportTest(Exporter, ExportFormat);
  446. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  447. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  448. finally
  449. if (FKeepFilesAfterTest = False) then
  450. DeleteFile(Exporter.FileName);
  451. ExportSettings.Free;
  452. Exporter.Free;
  453. end;
  454. end;
  455. procedure TTestDBExport.TestCSVExport_RFC4180WithHeader;
  456. var
  457. Exporter: TCSVExporter;
  458. ExportFormat: TDetailedExportFormats;
  459. ExportSettings: TCSVFormatSettings;
  460. begin
  461. Exporter := TCSVExporter.Create(nil);
  462. ExportSettings:=TCSVFormatSettings.Create(true);
  463. try
  464. ExportSettings.FieldDelimiter:=','; //RFC 4180 specified commas as delimiter
  465. ExportSettings.HeaderRow:=true; //...allows an optional header line
  466. ExportSettings.StringQuoteChar:='"'; //...requires quoting with " (if quoting)
  467. // Fields containing line breaks (CRLF), double quotes,
  468. // and commas should be enclosed in double-quotes.
  469. // => this probably won't get tested with this test set.
  470. ExportFormat:=efCSV;
  471. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  472. lowercase(rightstr(TestName,5)) +
  473. TDetailedExportExtensions[ExportFormat];
  474. Exporter.FormatSettings:=ExportSettings;
  475. GenericExportTest(Exporter, ExportFormat);
  476. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  477. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  478. finally
  479. if (FKeepFilesAfterTest = False) then
  480. DeleteFile(Exporter.FileName);
  481. ExportSettings.Free;
  482. Exporter.Free;
  483. end;
  484. end;
  485. procedure TTestDBExport.TestCSVExport_TweakSettingsSemicolon;
  486. var
  487. Exporter: TCSVExporter;
  488. ExportFormat: TDetailedExportFormats;
  489. ExportSettings: TCSVFormatSettings;
  490. begin
  491. Exporter := TCSVExporter.Create(nil);
  492. ExportSettings:=TCSVFormatSettings.Create(true);
  493. try
  494. ExportSettings.FieldDelimiter:=';';
  495. ExportSettings.QuoteStrings:=[qsAlways,qsSpace,qsDelimiter]; //quote everything we can
  496. ExportSettings.StringQuoteChar:='"'; //try explicit assignment
  497. ExportSettings.RowDelimiter:=#10; //Unix/Linux format
  498. ExportSettings.BooleanFalse:='onwaar'; //why not a Dutch output format?
  499. ExportSettings.BooleanTrue:='waar'; //why not a Dutch output format?
  500. ExportSettings.CurrencyDigits:=3;
  501. ExportSettings.CurrencySymbol:='€'; //euro sign
  502. ExportSettings.DateFormat:='d-mm-yyyy'; //Dutch setting
  503. ExportSettings.DateTimeFormat:='d-mm-yyyy hh:nn:ss'; //Dutch setting
  504. ExportSettings.DecimalSeparator:=','; //another Dutch setting
  505. ExportSettings.TimeFormat:='hh:nn:ss'; //Dutch setting
  506. ExportSettings.IntegerFormat:='0000';//Strange but nice ;)
  507. ExportFormat:=efCSV;
  508. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  509. lowercase(rightstr(TestName,5)) +
  510. TDetailedExportExtensions[ExportFormat];
  511. Exporter.FormatSettings:=ExportSettings;
  512. GenericExportTest(Exporter, ExportFormat);
  513. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  514. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  515. finally
  516. if (FKeepFilesAfterTest = False) then
  517. DeleteFile(Exporter.FileName);
  518. ExportSettings.Free;
  519. Exporter.Free;
  520. end;
  521. end;
  522. procedure TTestDBExport.TestFixedTextExport;
  523. var
  524. Exporter: TFixedLengthExporter;
  525. ExportFormat: TDetailedExportFormats;
  526. begin
  527. Exporter := TFixedLengthExporter.Create(nil);
  528. try
  529. ExportFormat:=efFixedLengthText;
  530. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  531. lowercase(rightstr(TestName,5)) +
  532. TDetailedExportExtensions[ExportFormat];
  533. GenericExportTest(Exporter, ExportFormat);
  534. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  535. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  536. finally
  537. if (FKeepFilesAfterTest = False) then
  538. DeleteFile(Exporter.FileName);
  539. Exporter.Free;
  540. end;
  541. end;
  542. procedure TTestDBExport.TestJSONExport;
  543. var
  544. Exporter: TSimpleJSONExporter;
  545. ExportFormat: TDetailedExportFormats;
  546. ExportSettings:TSimpleJSONFormatSettings;
  547. begin
  548. Exporter := TSimpleJSONExporter.Create(nil);
  549. ExportSettings:=TSimpleJSONFormatSettings.Create(true);
  550. try
  551. ExportFormat:=efJSON;
  552. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) + lowercase(rightstr(TestName,5))+
  553. inttostr(ord(ExportFormat))+
  554. TDetailedExportExtensions[ExportFormat]; Exporter.FormatSettings:=ExportSettings;
  555. GenericExportTest(Exporter, ExportFormat);
  556. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  557. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  558. finally
  559. if (FKeepFilesAfterTest = False) then
  560. DeleteFile(Exporter.FileName);
  561. ExportSettings.Free;
  562. Exporter.Free;
  563. end;
  564. end;
  565. procedure TTestDBExport.TestRTFExport;
  566. var
  567. Exporter: TRTFExporter;
  568. ExportFormat: TDetailedExportFormats;
  569. ExportSettings:TRTFExportFormatSettings;
  570. begin
  571. Exporter := TRTFExporter.Create(nil);
  572. ExportSettings:=TRTFExportFormatSettings.Create(true);
  573. try
  574. ExportFormat:=efRTF;
  575. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  576. lowercase(rightstr(TestName,5))+
  577. TDetailedExportExtensions[ExportFormat];
  578. Exporter.FormatSettings:=ExportSettings;
  579. GenericExportTest(Exporter, ExportFormat);
  580. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  581. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  582. finally
  583. if (FKeepFilesAfterTest = False) then
  584. DeleteFile(Exporter.FileName);
  585. ExportSettings.Free;
  586. Exporter.Free;
  587. end;
  588. end;
  589. procedure TTestDBExport.TestSQLExport;
  590. var
  591. Exporter: TSQLExporter;
  592. ExportFormat: TDetailedExportFormats;
  593. ExportSettings:TSQLFormatSettings;
  594. begin
  595. Exporter := TSQLExporter.Create(nil);
  596. ExportSettings:=TSQLFormatSettings.Create(true);
  597. try
  598. ExportSettings.TableName:='ATABLE'; //required for export to succeed
  599. ExportFormat:=efSQL;
  600. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  601. lowercase(rightstr(TestName,5))+
  602. TDetailedExportExtensions[ExportFormat];
  603. Exporter.FormatSettings:=ExportSettings;
  604. GenericExportTest(Exporter, ExportFormat);
  605. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  606. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  607. finally
  608. if (FKeepFilesAfterTest = False) then
  609. DeleteFile(Exporter.FileName);
  610. ExportSettings.Free;
  611. Exporter.Free;
  612. end;
  613. end;
  614. procedure TTestDBExport.TestTeXExport;
  615. var
  616. Exporter: TTexExporter;
  617. ExportFormat: TDetailedExportFormats;
  618. ExportSettings:TTeXExportFormatSettings;
  619. begin
  620. Exporter := TTexExporter.Create(nil);
  621. ExportSettings:=TTeXExportFormatSettings.Create(true);
  622. try
  623. ExportFormat:=efTeX;
  624. Exporter.FileName := FExportTempDir +
  625. inttostr(ord(ExportFormat)) + lowercase(rightstr(TestName,5))+
  626. TDetailedExportExtensions[ExportFormat];
  627. Exporter.FormatSettings:=ExportSettings;
  628. GenericExportTest(Exporter, ExportFormat);
  629. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  630. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  631. finally
  632. if (FKeepFilesAfterTest = False) then
  633. DeleteFile(Exporter.FileName);
  634. ExportSettings.Free;
  635. Exporter.Free;
  636. end;
  637. end;
  638. procedure TTestDBExport.TestXMLExport;
  639. var
  640. Exporter: TSimpleXMLExporter;
  641. ExportFormat: TDetailedExportFormats;
  642. ExportSettings:TSimpleXMLFormatSettings;
  643. begin
  644. Exporter := TSimpleXMLExporter.Create(nil);
  645. ExportSettings:=TSimpleXMLFormatSettings.Create(true);
  646. try
  647. ExportFormat:=efXML;
  648. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  649. lowercase(rightstr(TestName,5)) +
  650. TDetailedExportExtensions[ExportFormat];
  651. Exporter.FormatSettings:=ExportSettings;
  652. GenericExportTest(Exporter, ExportFormat);
  653. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  654. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  655. finally
  656. if (FKeepFilesAfterTest = False) then
  657. DeleteFile(Exporter.FileName);
  658. ExportSettings.Free;
  659. Exporter.Free;
  660. end;
  661. end;
  662. procedure TTestDBExport.TestXSDExport_DelphiClientDataset;
  663. var
  664. Exporter: TXMLXSDExporter;
  665. ExportFormat: TDetailedExportFormats;
  666. ExportSettings:TXMLXSDFormatSettings;
  667. begin
  668. Exporter := TXMLXSDExporter.Create(nil);
  669. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  670. try
  671. ExportSettings.ExportFormat:=DelphiClientDataset;
  672. ExportFormat:=efXMLXSDClientDataset;
  673. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  674. lowercase(rightstr(TestName,5)) +
  675. TDetailedExportExtensions[ExportFormat];
  676. Exporter.FormatSettings:=ExportSettings;
  677. GenericExportTest(Exporter, ExportFormat);
  678. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  679. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  680. finally
  681. if (FKeepFilesAfterTest = False) then
  682. DeleteFile(Exporter.FileName);
  683. ExportSettings.Free;
  684. Exporter.Free;
  685. end;
  686. end;
  687. procedure TTestDBExport.TestXSDExport_Excel;
  688. var
  689. Exporter: TXMLXSDExporter;
  690. ExportFormat: TDetailedExportFormats;
  691. ExportSettings:TXMLXSDFormatSettings;
  692. begin
  693. Exporter := TXMLXSDExporter.Create(nil);
  694. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  695. try
  696. ExportSettings.ExportFormat:=ExcelCompatible;
  697. ExportFormat:=efXMLXSDExcel;
  698. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  699. lowercase(rightstr(TestName,5)) +
  700. TDetailedExportExtensions[ExportFormat];
  701. Exporter.FormatSettings:=ExportSettings;
  702. GenericExportTest(Exporter, ExportFormat);
  703. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  704. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  705. finally
  706. if (FKeepFilesAfterTest = False) then
  707. DeleteFile(Exporter.FileName);
  708. ExportSettings.Free;
  709. Exporter.Free;
  710. end;
  711. end;
  712. initialization
  713. RegisterTest(TTestDBExport);
  714. end.