testdbexport.pas 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  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.QuoteChar:='"'; //...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.QuoteChar:='"'; //try explicit assignment
  496. ExportSettings.RowDelimiter:=#10; //Unix/Linux format
  497. ExportSettings.BooleanFalse:='onwaar'; //why not a Dutch output format?
  498. ExportSettings.BooleanTrue:='waar'; //why not a Dutch output format?
  499. ExportSettings.CurrencyDigits:=3;
  500. ExportSettings.CurrencySymbol:='€'; //euro sign
  501. ExportSettings.DateFormat:='d-mm-yyyy'; //Dutch setting
  502. ExportSettings.DateTimeFormat:='d-mm-yyyy hh:nn:ss'; //Dutch setting
  503. ExportSettings.DecimalSeparator:=','; //another Dutch setting
  504. ExportSettings.TimeFormat:='hh:nn:ss'; //Dutch setting
  505. ExportSettings.IntegerFormat:='0000';//Strange but nice ;)
  506. ExportFormat:=efCSV;
  507. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  508. lowercase(rightstr(TestName,5)) +
  509. TDetailedExportExtensions[ExportFormat];
  510. Exporter.FormatSettings:=ExportSettings;
  511. GenericExportTest(Exporter, ExportFormat);
  512. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  513. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  514. finally
  515. if (FKeepFilesAfterTest = False) then
  516. DeleteFile(Exporter.FileName);
  517. ExportSettings.Free;
  518. Exporter.Free;
  519. end;
  520. end;
  521. procedure TTestDBExport.TestFixedTextExport;
  522. var
  523. Exporter: TFixedLengthExporter;
  524. ExportFormat: TDetailedExportFormats;
  525. begin
  526. Exporter := TFixedLengthExporter.Create(nil);
  527. try
  528. ExportFormat:=efFixedLengthText;
  529. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  530. lowercase(rightstr(TestName,5)) +
  531. TDetailedExportExtensions[ExportFormat];
  532. GenericExportTest(Exporter, ExportFormat);
  533. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  534. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  535. finally
  536. if (FKeepFilesAfterTest = False) then
  537. DeleteFile(Exporter.FileName);
  538. Exporter.Free;
  539. end;
  540. end;
  541. procedure TTestDBExport.TestJSONExport;
  542. var
  543. Exporter: TSimpleJSONExporter;
  544. ExportFormat: TDetailedExportFormats;
  545. ExportSettings:TSimpleJSONFormatSettings;
  546. begin
  547. Exporter := TSimpleJSONExporter.Create(nil);
  548. ExportSettings:=TSimpleJSONFormatSettings.Create(true);
  549. try
  550. ExportFormat:=efJSON;
  551. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) + lowercase(rightstr(TestName,5))+
  552. inttostr(ord(ExportFormat))+
  553. TDetailedExportExtensions[ExportFormat]; Exporter.FormatSettings:=ExportSettings;
  554. GenericExportTest(Exporter, ExportFormat);
  555. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  556. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  557. finally
  558. if (FKeepFilesAfterTest = False) then
  559. DeleteFile(Exporter.FileName);
  560. ExportSettings.Free;
  561. Exporter.Free;
  562. end;
  563. end;
  564. procedure TTestDBExport.TestRTFExport;
  565. var
  566. Exporter: TRTFExporter;
  567. ExportFormat: TDetailedExportFormats;
  568. ExportSettings:TRTFExportFormatSettings;
  569. begin
  570. Exporter := TRTFExporter.Create(nil);
  571. ExportSettings:=TRTFExportFormatSettings.Create(true);
  572. try
  573. ExportFormat:=efRTF;
  574. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  575. lowercase(rightstr(TestName,5))+
  576. TDetailedExportExtensions[ExportFormat];
  577. Exporter.FormatSettings:=ExportSettings;
  578. GenericExportTest(Exporter, ExportFormat);
  579. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  580. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  581. finally
  582. if (FKeepFilesAfterTest = False) then
  583. DeleteFile(Exporter.FileName);
  584. ExportSettings.Free;
  585. Exporter.Free;
  586. end;
  587. end;
  588. procedure TTestDBExport.TestSQLExport;
  589. var
  590. Exporter: TSQLExporter;
  591. ExportFormat: TDetailedExportFormats;
  592. ExportSettings:TSQLFormatSettings;
  593. begin
  594. Exporter := TSQLExporter.Create(nil);
  595. ExportSettings:=TSQLFormatSettings.Create(true);
  596. try
  597. ExportSettings.TableName:='ATABLE'; //required for export to succeed
  598. ExportFormat:=efSQL;
  599. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  600. lowercase(rightstr(TestName,5))+
  601. TDetailedExportExtensions[ExportFormat];
  602. Exporter.FormatSettings:=ExportSettings;
  603. GenericExportTest(Exporter, ExportFormat);
  604. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  605. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  606. finally
  607. if (FKeepFilesAfterTest = False) then
  608. DeleteFile(Exporter.FileName);
  609. ExportSettings.Free;
  610. Exporter.Free;
  611. end;
  612. end;
  613. procedure TTestDBExport.TestTeXExport;
  614. var
  615. Exporter: TTexExporter;
  616. ExportFormat: TDetailedExportFormats;
  617. ExportSettings:TTeXExportFormatSettings;
  618. begin
  619. Exporter := TTexExporter.Create(nil);
  620. ExportSettings:=TTeXExportFormatSettings.Create(true);
  621. try
  622. ExportFormat:=efTeX;
  623. Exporter.FileName := FExportTempDir +
  624. inttostr(ord(ExportFormat)) + lowercase(rightstr(TestName,5))+
  625. TDetailedExportExtensions[ExportFormat];
  626. Exporter.FormatSettings:=ExportSettings;
  627. GenericExportTest(Exporter, ExportFormat);
  628. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  629. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  630. finally
  631. if (FKeepFilesAfterTest = False) then
  632. DeleteFile(Exporter.FileName);
  633. ExportSettings.Free;
  634. Exporter.Free;
  635. end;
  636. end;
  637. procedure TTestDBExport.TestXMLExport;
  638. var
  639. Exporter: TSimpleXMLExporter;
  640. ExportFormat: TDetailedExportFormats;
  641. ExportSettings:TSimpleXMLFormatSettings;
  642. begin
  643. Exporter := TSimpleXMLExporter.Create(nil);
  644. ExportSettings:=TSimpleXMLFormatSettings.Create(true);
  645. try
  646. ExportFormat:=efXML;
  647. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  648. lowercase(rightstr(TestName,5)) +
  649. TDetailedExportExtensions[ExportFormat];
  650. Exporter.FormatSettings:=ExportSettings;
  651. GenericExportTest(Exporter, ExportFormat);
  652. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  653. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  654. finally
  655. if (FKeepFilesAfterTest = False) then
  656. DeleteFile(Exporter.FileName);
  657. ExportSettings.Free;
  658. Exporter.Free;
  659. end;
  660. end;
  661. procedure TTestDBExport.TestXSDExport_DelphiClientDataset;
  662. var
  663. Exporter: TXMLXSDExporter;
  664. ExportFormat: TDetailedExportFormats;
  665. ExportSettings:TXMLXSDFormatSettings;
  666. begin
  667. Exporter := TXMLXSDExporter.Create(nil);
  668. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  669. try
  670. ExportSettings.ExportFormat:=DelphiClientDataset;
  671. ExportFormat:=efXMLXSDClientDataset;
  672. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  673. lowercase(rightstr(TestName,5)) +
  674. TDetailedExportExtensions[ExportFormat];
  675. Exporter.FormatSettings:=ExportSettings;
  676. GenericExportTest(Exporter, ExportFormat);
  677. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  678. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  679. finally
  680. if (FKeepFilesAfterTest = False) then
  681. DeleteFile(Exporter.FileName);
  682. ExportSettings.Free;
  683. Exporter.Free;
  684. end;
  685. end;
  686. procedure TTestDBExport.TestXSDExport_Excel;
  687. var
  688. Exporter: TXMLXSDExporter;
  689. ExportFormat: TDetailedExportFormats;
  690. ExportSettings:TXMLXSDFormatSettings;
  691. begin
  692. Exporter := TXMLXSDExporter.Create(nil);
  693. ExportSettings:=TXMLXSDFormatSettings.Create(true);
  694. try
  695. ExportSettings.ExportFormat:=ExcelCompatible;
  696. ExportFormat:=efXMLXSDExcel;
  697. Exporter.FileName := FExportTempDir + inttostr(ord(ExportFormat)) +
  698. lowercase(rightstr(TestName,5)) +
  699. TDetailedExportExtensions[ExportFormat];
  700. Exporter.FormatSettings:=ExportSettings;
  701. GenericExportTest(Exporter, ExportFormat);
  702. AssertTrue('Output file must be created', FileExists(Exporter.FileName));
  703. AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
  704. finally
  705. if (FKeepFilesAfterTest = False) then
  706. DeleteFile(Exporter.FileName);
  707. ExportSettings.Free;
  708. Exporter.Free;
  709. end;
  710. end;
  711. initialization
  712. RegisterTest(TTestDBExport);
  713. end.