testdbexport.pas 32 KB

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