testdbexport.pas 36 KB

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