testdbexport.pas 35 KB

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