testdbexport.pas 33 KB

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