Browse Source

+ sqldb: db test framework:
- consolidate db export tests into db test framework; remove existing xmlxsd and dbf export tests.
- add tests for other exports (rtf, tex, csv, sql..)
- Tests give an access violation but that is probably caused by dataset code. Ludo Brand's analysis:
Can reproduce the problem. Something wrong with the dataset. The length of the blob is 1G although the blob is initialised with an empty string. This obviously causes a sigsegv because there is no 1G of data to copy from. Looking further into it.

git-svn-id: trunk@23164 -

reiniero 12 years ago
parent
commit
1ce4f17261

+ 1 - 5
.gitattributes

@@ -2124,12 +2124,8 @@ packages/fcl-db/src/sqlite/testds.pas svneol=native#text/plain
 packages/fcl-db/tests/Makefile -text
 packages/fcl-db/tests/Makefile.fpc -text
 packages/fcl-db/tests/README.txt svneol=native#text/plain
-packages/fcl-db/tests/XMLXSDExportTest.lpi svneol=native#text/plain
-packages/fcl-db/tests/XMLXSDExportTest.lpr svneol=native#text/plain
 packages/fcl-db/tests/bufdatasettoolsunit.pas svneol=native#text/plain
 packages/fcl-db/tests/database.ini.txt svneol=native#text/plain
-packages/fcl-db/tests/dbfexporttest.lpi svneol=native#text/plain
-packages/fcl-db/tests/dbfexporttest.lpr svneol=native#text/plain
 packages/fcl-db/tests/dbfexporttestcase1.pas svneol=native#text/plain
 packages/fcl-db/tests/dbftoolsunit.pas svneol=native#text/plain
 packages/fcl-db/tests/dbtestframework.pas svneol=native#text/plain
@@ -2149,6 +2145,7 @@ packages/fcl-db/tests/testbasics.pas svneol=native#text/plain
 packages/fcl-db/tests/testbufdatasetstreams.pas svneol=native#text/plain
 packages/fcl-db/tests/testdatasources.pas svneol=native#text/plain
 packages/fcl-db/tests/testdbbasics.pas svneol=native#text/plain
+packages/fcl-db/tests/testdbexport.pas svneol=native#text/plain
 packages/fcl-db/tests/testdddiff.pp svneol=native#text/plain
 packages/fcl-db/tests/testfieldtypes.pas svneol=native#text/plain
 packages/fcl-db/tests/testjsondataset.pp svneol=native#text/plain
@@ -2159,7 +2156,6 @@ packages/fcl-db/tests/testsqlscanner.lpi svneol=native#text/plain
 packages/fcl-db/tests/testsqlscanner.lpr svneol=native#text/plain
 packages/fcl-db/tests/testsqlscript.pas svneol=native#text/plain
 packages/fcl-db/tests/toolsunit.pas svneol=native#text/plain
-packages/fcl-db/tests/xmlxsdexporttestcase1.pas svneol=native#text/plain
 packages/fcl-extra/Makefile svneol=native#text/plain
 packages/fcl-extra/Makefile.fpc svneol=native#text/plain
 packages/fcl-extra/Makefile.fpc.fpcmake svneol=native#text/plain

+ 0 - 102
packages/fcl-db/tests/XMLXSDExportTest.lpi

@@ -1,102 +0,0 @@
-<?xml version="1.0"?>
-<CONFIG>
-  <ProjectOptions>
-    <Version Value="9"/>
-    <PathDelim Value="\"/>
-    <General>
-      <Flags>
-        <SaveOnlyProjectUnits Value="True"/>
-      </Flags>
-      <SessionStorage Value="InProjectDir"/>
-      <MainUnit Value="0"/>
-      <ResourceType Value="res"/>
-    </General>
-    <i18n>
-      <EnableI18N LFM="False"/>
-    </i18n>
-    <VersionInfo>
-      <StringTable ProductVersion=""/>
-    </VersionInfo>
-    <BuildModes Count="2">
-      <Item1 Name="Default" Default="True"/>
-      <Item2 Name="Debug">
-        <CompilerOptions>
-          <Version Value="11"/>
-          <PathDelim Value="\"/>
-          <SearchPaths>
-            <IncludeFiles Value="$(ProjOutDir)"/>
-          </SearchPaths>
-          <Linking>
-            <Debugging>
-              <DebugInfoType Value="dsStabs"/>
-            </Debugging>
-          </Linking>
-          <Other>
-            <CompilerMessages>
-              <UseMsgFile Value="True"/>
-            </CompilerMessages>
-            <CompilerPath Value="$(CompPath)"/>
-          </Other>
-        </CompilerOptions>
-      </Item2>
-    </BuildModes>
-    <PublishOptions>
-      <Version Value="2"/>
-      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
-      <ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
-    </PublishOptions>
-    <RunParams>
-      <local>
-        <FormatVersion Value="1"/>
-        <LaunchingApplication PathPlusParams="\usr\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
-      </local>
-    </RunParams>
-    <RequiredPackages Count="1">
-      <Item1>
-        <PackageName Value="FCL"/>
-      </Item1>
-    </RequiredPackages>
-    <Units Count="2">
-      <Unit0>
-        <Filename Value="XMLXSDExportTest.lpr"/>
-        <IsPartOfProject Value="True"/>
-        <UnitName Value="XMLXSDExportTest"/>
-      </Unit0>
-      <Unit1>
-        <Filename Value="xmlxsdexporttestcase1.pas"/>
-        <IsPartOfProject Value="True"/>
-        <UnitName Value="XMLXSDExportTestCase1"/>
-      </Unit1>
-    </Units>
-  </ProjectOptions>
-  <CompilerOptions>
-    <Version Value="11"/>
-    <PathDelim Value="\"/>
-    <Target>
-      <Filename Value="XMLXSDExportTest"/>
-    </Target>
-    <SearchPaths>
-      <IncludeFiles Value="$(ProjOutDir)"/>
-      <UnitOutputDirectory Value="units\$(TargetCPU)-$(TargetOS)\"/>
-    </SearchPaths>
-    <Other>
-      <CompilerMessages>
-        <UseMsgFile Value="True"/>
-      </CompilerMessages>
-      <CompilerPath Value="$(CompPath)"/>
-    </Other>
-  </CompilerOptions>
-  <Debugging>
-    <Exceptions Count="3">
-      <Item1>
-        <Name Value="EAbort"/>
-      </Item1>
-      <Item2>
-        <Name Value="ECodetoolError"/>
-      </Item2>
-      <Item3>
-        <Name Value="EFOpenError"/>
-      </Item3>
-    </Exceptions>
-  </Debugging>
-</CONFIG>

+ 0 - 27
packages/fcl-db/tests/XMLXSDExportTest.lpr

@@ -1,27 +0,0 @@
-program XMLXSDExportTest;
-
-{$mode objfpc}{$H+}
-
-uses
-  Classes,
-  consoletestrunner,
-  XMLXSDExportTestCase1;
-
-type
-
-  { TLazTestRunner }
-
-  TMyTestRunner = class(TTestRunner)
-  protected
-    // override the protected methods of TTestRunner to customize its behavior
-  end;
-
-var
-  Application: TMyTestRunner;
-
-begin
-  Application := TMyTestRunner.Create(nil);
-  Application.Initialize;
-  Application.Run;
-  Application.Free;
-end.

+ 0 - 113
packages/fcl-db/tests/dbfexporttest.lpi

@@ -1,113 +0,0 @@
-<?xml version="1.0"?>
-<CONFIG>
-  <ProjectOptions>
-    <Version Value="9"/>
-    <PathDelim Value="\"/>
-    <General>
-      <Flags>
-        <SaveOnlyProjectUnits Value="True"/>
-      </Flags>
-      <SessionStorage Value="InProjectDir"/>
-      <MainUnit Value="0"/>
-      <Title Value="dbfexporttest"/>
-      <ResourceType Value="res"/>
-    </General>
-    <i18n>
-      <EnableI18N LFM="False"/>
-    </i18n>
-    <VersionInfo>
-      <StringTable ProductVersion=""/>
-    </VersionInfo>
-    <BuildModes Count="2">
-      <Item1 Name="Default" Default="True"/>
-      <Item2 Name="Debug">
-        <CompilerOptions>
-          <Version Value="11"/>
-          <PathDelim Value="\"/>
-          <SearchPaths>
-            <IncludeFiles Value="$(ProjOutDir)"/>
-          </SearchPaths>
-          <CodeGeneration>
-            <Checks>
-              <IOChecks Value="True"/>
-              <RangeChecks Value="True"/>
-              <OverflowChecks Value="True"/>
-              <StackChecks Value="True"/>
-            </Checks>
-          </CodeGeneration>
-          <Linking>
-            <Debugging>
-              <DebugInfoType Value="dsDwarf2Set"/>
-              <UseHeaptrc Value="True"/>
-            </Debugging>
-          </Linking>
-          <Other>
-            <CompilerMessages>
-              <UseMsgFile Value="True"/>
-            </CompilerMessages>
-            <CompilerPath Value="$(CompPath)"/>
-          </Other>
-        </CompilerOptions>
-      </Item2>
-    </BuildModes>
-    <PublishOptions>
-      <Version Value="2"/>
-      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
-      <ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
-    </PublishOptions>
-    <RunParams>
-      <local>
-        <FormatVersion Value="1"/>
-        <CommandLineParams Value="-a --format=plain"/>
-        <LaunchingApplication PathPlusParams="\usr\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
-      </local>
-    </RunParams>
-    <RequiredPackages Count="1">
-      <Item1>
-        <PackageName Value="FCL"/>
-      </Item1>
-    </RequiredPackages>
-    <Units Count="2">
-      <Unit0>
-        <Filename Value="dbfexporttest.lpr"/>
-        <IsPartOfProject Value="True"/>
-        <UnitName Value="dbfexporttest"/>
-      </Unit0>
-      <Unit1>
-        <Filename Value="dbfexporttestcase1.pas"/>
-        <IsPartOfProject Value="True"/>
-        <UnitName Value="dbfexporttestcase1"/>
-      </Unit1>
-    </Units>
-  </ProjectOptions>
-  <CompilerOptions>
-    <Version Value="11"/>
-    <PathDelim Value="\"/>
-    <Target>
-      <Filename Value="dbfexporttest"/>
-    </Target>
-    <SearchPaths>
-      <IncludeFiles Value="$(ProjOutDir)"/>
-      <UnitOutputDirectory Value="units\$(TargetCPU)-$(TargetOS)"/>
-    </SearchPaths>
-    <Other>
-      <CompilerMessages>
-        <UseMsgFile Value="True"/>
-      </CompilerMessages>
-      <CompilerPath Value="$(CompPath)"/>
-    </Other>
-  </CompilerOptions>
-  <Debugging>
-    <Exceptions Count="3">
-      <Item1>
-        <Name Value="EAbort"/>
-      </Item1>
-      <Item2>
-        <Name Value="ECodetoolError"/>
-      </Item2>
-      <Item3>
-        <Name Value="EFOpenError"/>
-      </Item3>
-    </Exceptions>
-  </Debugging>
-</CONFIG>

+ 0 - 28
packages/fcl-db/tests/dbfexporttest.lpr

@@ -1,28 +0,0 @@
-program dbfexporttest;
-
-{$mode objfpc}{$H+}
-
-uses
-  Classes,
-  consoletestrunner,
-  dbfexporttestcase1;
-
-type
-
-  { TLazTestRunner }
-
-  TMyTestRunner = class(TTestRunner)
-  protected
-    // override the protected methods of TTestRunner to customize its behavior
-  end;
-
-var
-  Application: TMyTestRunner;
-
-begin
-  Application := TMyTestRunner.Create(nil);
-  Application.Initialize;
-  Application.Run;
-  Application.Free;
-end.
-

+ 1 - 0
packages/fcl-db/tests/dbtestframework.pas

@@ -25,6 +25,7 @@ uses
   TestDBBasics,
   TestBufDatasetStreams,
   TestSpecificTBufDataset,
+  TestDBExport,
   consoletestrunner;
 
 Procedure LegacyOutput;

+ 2 - 1
packages/fcl-db/tests/dbtestframework_gui.lpr

@@ -28,7 +28,8 @@ uses
   TestDBBasics,
   TestDatasources,
   TestBufDatasetStreams,
-  TestSpecificTBufDataset;
+  TestSpecificTBufDataset,
+  TestDBExport;
 
 {$R *.res}
 

+ 618 - 0
packages/fcl-db/tests/testdbexport.pas

@@ -0,0 +1,618 @@
+unit TestDBExport;
+
+{
+  Unit tests which are common to all datasets. Tests export to various formats.
+}
+
+{$IFDEF FPC}
+  {$mode Delphi}{$H+}
+{$ENDIF}
+
+interface
+
+uses
+  fpcunit, testregistry,
+  Classes, SysUtils, db, ToolsUnit, bufdataset,
+  fpDBExport, fpXMLXSDExport, fpdbfexport, fpcsvexport, fpfixedexport,
+  fpSimpleXMLExport, fpsimplejsonexport, fpSQLExport,
+  fptexexport, fprtfexport;
+
+
+type
+  TDetailedExportFormats = (efDBaseIII, efDBaseIV, efDBaseVII, efCSV, efFixedLengthText, efFoxpro,
+    efJSON, efRTF, efSQL, efTeX, efXML, efXMLXSDAccess, efXMLXSDADONet, efXMLXSDClientDataset, efXMLXSDExcel);
+const
+  TDetailedExportExtensions: array [TDetailedExportFormats] of string[5] =
+    ('.dbf','.dbf','.dbf','.csv','.txt','.dbf','.json','.rtf','.sql','.tex',
+    '.xml','.xml','.xml','.xml','.xml'); //File extension for the corresponding TExportFormat
+type
+  { TTestDBExport }
+  TTestDBExport = class(TTestCase)
+  private
+    FExportTempDir: string; //directory where test files are placed
+    FKeepFilesAfterTest: boolean; //remove files after testing?
+    function FieldSupported(const FieldType: TFieldType;
+      const ExportSubFormat: TDetailedExportFormats): boolean; //Checks if output dataset supports a certain field type
+    procedure GenericExportTest(Exporter: TCustomDatasetExporter; ExportFormat: TDetailedExportFormats);
+    function GetFileSize(const FileName: string): integer; //Gets a file's size
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure TestDBFExport_DBaseIV;
+    procedure TestDBFExport_DBaseVII;
+    procedure TestDBFExport_FoxPro;
+    procedure TestCSVExport;
+    procedure TestFixedTextExport;
+    procedure TestJSONExport;
+    procedure TestRTFExport;
+    procedure TestSQLExport;
+    procedure TestTeXExport;
+    procedure TestXMLExport; //tests simple xml export
+    procedure TestXSDExport_Access_NoXSD_DecimalOverride; //tests xmlxsd export
+    procedure TestXSDExport_Access_NoXSD_NoDecimalOverride; //tests xmlxsd export
+    procedure TestXSDExport_Access_XSD_DecimalOverride; //tests xmlxsd export
+    procedure TestXSDExport_Access_XSD_NoDecimalOverride; //tests xmlxsd export
+    procedure TestXSDExport_ADONET_NoXSD; //tests xmlxsd export
+    procedure TestXSDExport_ADONET_XSD; //tests xmlxsd export
+    procedure TestXSDExport_DelphiClientDataset; //tests xmlxsd export
+    procedure TestXSDExport_Excel; //tests xmlxsd export
+  end;
+
+implementation
+
+function TTestDBExport.FieldSupported(const FieldType: TFieldType;
+  const ExportSubFormat: TDetailedExportFormats): boolean;
+const
+  DBaseVIIUnsupported=[ftUnknown,ftCurrency,ftBCD,ftTime,ftBytes,ftVarBytes,ftGraphic,ftFmtMemo,ftParadoxOle,ftTypedBinary,ftCursor,ftADT,ftArray,ftReference,ftDataSet,ftOraBlob,ftOraClob,ftVariant,ftInterface,ftIDispatch,ftGuid,ftTimeStamp,ftFMTBcd];
+  FoxProUnsupported=[ftUnknown,ftTime,ftVarBytes,ftGraphic,ftFmtMemo,ftParadoxOle,ftTypedBinary,ftCursor,ftADT,ftArray,ftReference,ftDataSet,ftOraBlob,ftOraClob,ftVariant,ftInterface,ftIDispatch,ftGuid,ftTimeStamp,ftFMTBcd];
+begin
+  result:=true;
+  case ExportSubFormat of
+    efDBaseIII: if FieldType in DBaseVIIUnsupported+[ftAutoInc] then result:=false;
+    efDBaseIV: if FieldType in DBaseVIIUnsupported+[ftAutoInc] then result:=false;
+    efDBaseVII: if FieldType in DBaseVIIUnsupported then result:=false;
+    efCSV: result:=true;
+    efFixedLengthText: result:=true; //todo: verify if all fields are really supported. Quick glance would indicate so
+    efFoxpro: if FieldType in FoxProUnsupported then result:=false;
+    efJSON: result:=true;
+    efRTF: result:=true;
+    efSQL: result:=true;
+    efTeX: result:=true;
+    efXML: result:=true;
+    efXMLXSDAccess, efXMLXSDADONet, efXMLXSDClientDataset, efXMLXSDExcel: result:=true;
+    else
+    begin
+      result:=false;
+      Fail('Error in test code itself: FieldSupported unknown ExportSubFormat '+inttostr(ord(ExportSubFormat)));
+    end;
+  end;
+end;
+
+procedure TTestDBExport.GenericExportTest(Exporter: TCustomDatasetExporter; ExportFormat: TDetailedExportFormats);
+var
+  FieldMapping: TExportFields;
+  NumberExported: integer;
+  i: integer;
+begin
+  FieldMapping:=TExportFields.Create(Exporter.ExportFields.ItemClass);
+  try
+    Exporter.Dataset := DBConnector.GetFieldDataset;
+    Exporter.Dataset.Open;
+    Exporter.BuildDefaultFieldMap(FieldMapping);
+    // Remove unsupported data types in export from the mapping.
+    // Cannot use FieldMapping[i].Field.DataType as
+    // the field hasn't been set by BindFields yet... assume the
+    // order of original fields and their mapping match
+    for i:=Exporter.Dataset.Fields.Count-1 downto 0 do
+    begin
+      if not FieldSupported(
+        Exporter.Dataset.Fields[i].DataType,
+        ExportFormat) then
+        FieldMapping.Delete(i);
+    end;
+    for i:=0 to FieldMapping.Count-1 do
+    begin
+      Exporter.ExportFields.Add.Assign(FieldMapping[i]);
+    end;
+    NumberExported := Exporter.Execute;
+    Exporter.Dataset.Last;
+    Exporter.Dataset.First;
+    AssertEquals('Number of records exported', NumberExported,
+      Exporter.Dataset.RecordCount);
+    Exporter.Dataset.Close;
+  finally
+    FieldMapping.Free;
+  end;
+end;
+
+function TTestDBExport.GetFileSize(const FileName: string): integer;
+Var
+  F : file of byte;
+begin
+  result:=0;
+  assign (F,FileName);
+  try
+    reset(F);
+    result:=filesize(F);
+  finally
+    close(F);
+  end;
+end;
+
+procedure TTestDBExport.SetUp;
+begin
+  inherited SetUp;
+  InitialiseDBConnector;
+  //DBConnector.StartTest; //is this needed?
+  FExportTempDir:=IncludeTrailingPathDelimiter(ExpandFileName(''))+'exporttests'+PathDelim; //Store output in subdirectory
+  ForceDirectories(FExportTempDir);
+  FKeepFilesAfterTest:=true; //keep test files; consistent with other units right now
+end;
+
+procedure TTestDBExport.TearDown;
+begin
+  inherited TearDown;
+  //DBConnector.StopTest; //is this needed?
+  FreeDBConnector;
+end;
+
+procedure TTestDBExport.TestDBFExport_DBaseVII;
+var
+  Exporter: TFPDBFExport;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TDBFExportFormatSettings;
+begin
+  Exporter := TFPDBFExport.Create(nil);
+  ExportSettings:=TDBFExportFormatSettings.Create(true);
+  try
+    ExportFormat:=efDBaseVII;
+    ExportSettings.TableFormat:=tfDBaseVII;
+    // Use export subtype position to differentiate output filenames:
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestDBFExport_DBaseIV;
+var
+  Exporter: TFPDBFExport;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TDBFExportFormatSettings;
+begin
+  Exporter := TFPDBFExport.Create(nil);
+  ExportSettings:=TDBFExportFormatSettings.Create(true);
+  try
+    ExportFormat:=efDBaseIV;
+    ExportSettings.TableFormat:=tfDBaseIV;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestDBFExport_FoxPro;
+var
+  Exporter: TFPDBFExport;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TDBFExportFormatSettings;
+begin
+  Exporter := TFPDBFExport.Create(nil);
+  ExportSettings:=TDBFExportFormatSettings.Create(true);
+  try
+    ExportFormat:=efFoxpro;
+    ExportSettings.TableFormat:=tfFoxPro;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestXSDExport_Access_NoXSD_DecimalOverride;
+var
+  Exporter: TXMLXSDExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TXMLXSDFormatSettings;
+begin
+  Exporter := TXMLXSDExporter.Create(nil);
+  ExportSettings:=TXMLXSDFormatSettings.Create(true);
+  try
+    ExportSettings.ExportFormat:=AccessCompatible;
+    ExportFormat:=efXMLXSDAccess;
+    ExportSettings.CreateXSD:=false;
+    ExportSettings.DecimalSeparator:='.'; //override
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestXSDExport_Access_NoXSD_NoDecimalOverride;
+var
+  Exporter: TXMLXSDExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TXMLXSDFormatSettings;
+begin
+  Exporter := TXMLXSDExporter.Create(nil);
+  ExportSettings:=TXMLXSDFormatSettings.Create(true);
+  try
+    ExportSettings.ExportFormat:=AccessCompatible;
+    ExportFormat:=efXMLXSDAccess;
+    ExportSettings.CreateXSD:=false;
+    ExportSettings.DecimalSeparator:=char(''); //don't override
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestXSDExport_Access_XSD_DecimalOverride;
+var
+  Exporter: TXMLXSDExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TXMLXSDFormatSettings;
+begin
+  Exporter := TXMLXSDExporter.Create(nil);
+  ExportSettings:=TXMLXSDFormatSettings.Create(true);
+  try
+    ExportSettings.ExportFormat:=AccessCompatible;
+    ExportFormat:=efXMLXSDAccess;
+    ExportSettings.CreateXSD:=true;
+    ExportSettings.DecimalSeparator:='.'; //override
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestXSDExport_Access_XSD_NoDecimalOverride;
+var
+  Exporter: TXMLXSDExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TXMLXSDFormatSettings;
+begin
+  Exporter := TXMLXSDExporter.Create(nil);
+  ExportSettings:=TXMLXSDFormatSettings.Create(true);
+  try
+    ExportSettings.ExportFormat:=AccessCompatible;
+    ExportFormat:=efXMLXSDAccess;
+    ExportSettings.CreateXSD:=true;
+    ExportSettings.DecimalSeparator:=char(''); //don't override
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestXSDExport_ADONET_NoXSD;
+var
+  Exporter: TXMLXSDExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TXMLXSDFormatSettings;
+begin
+  ExportSettings.ExportFormat:=AccessCompatible;
+  Exporter := TXMLXSDExporter.Create(nil);
+  ExportSettings:=TXMLXSDFormatSettings.Create(true);
+  try
+    ExportSettings.ExportFormat:=ADONETCompatible;
+    ExportFormat:=efXMLXSDADONet;
+    ExportSettings.CreateXSD:=false;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestXSDExport_ADONET_XSD;
+var
+  Exporter: TXMLXSDExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TXMLXSDFormatSettings;
+begin
+  Exporter := TXMLXSDExporter.Create(nil);
+  ExportSettings:=TXMLXSDFormatSettings.Create(true);
+  try
+    ExportSettings.ExportFormat:=ADONETCompatible;
+    ExportFormat:=efXMLXSDADONet;
+    ExportSettings.CreateXSD:=true;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestCSVExport;
+var
+  Exporter: TCSVExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings: TCSVFormatSettings;
+begin
+  Exporter := TCSVExporter.Create(nil);
+  ExportSettings:=TCSVFormatSettings.Create(true);
+  //todo: set settings to match RFC4180 as much as possible as that is the only
+  // sane CSV format to test for (and perhaps Excel-compatible as far as that
+  // can be defined)
+  try
+    ExportFormat:=efCSV;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestFixedTextExport;
+var
+  Exporter: TFixedLengthExporter;
+  ExportFormat: TDetailedExportFormats;
+begin
+  Exporter := TFixedLengthExporter.Create(nil);
+  try
+    ExportFormat:=efFixedLengthText;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestJSONExport;
+var
+  Exporter: TSimpleJSONExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TSimpleJSONFormatSettings;
+begin
+  Exporter := TSimpleJSONExporter.Create(nil);
+  ExportSettings:=TSimpleJSONFormatSettings.Create(true);
+  try
+    ExportFormat:=efJSON;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestRTFExport;
+var
+  Exporter: TRTFExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TRTFExportFormatSettings;
+begin
+  Exporter := TRTFExporter.Create(nil);
+  ExportSettings:=TRTFExportFormatSettings.Create(true);
+  try
+    ExportFormat:=efRTF;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestSQLExport;
+var
+  Exporter: TSQLExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TSQLFormatSettings;
+begin
+  Exporter := TSQLExporter.Create(nil);
+  ExportSettings:=TSQLFormatSettings.Create(true);
+  try
+    ExportSettings.TableName:='ATABLE'; //required for export to succeed
+    ExportFormat:=efSQL;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestTeXExport;
+var
+  Exporter: TTexExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TTeXExportFormatSettings;
+begin
+  Exporter := TTexExporter.Create(nil);
+  ExportSettings:=TTeXExportFormatSettings.Create(true);
+  try
+    ExportFormat:=efTeX;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestXMLExport;
+var
+  Exporter: TSimpleXMLExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TSimpleXMLFormatSettings;
+begin
+  Exporter := TSimpleXMLExporter.Create(nil);
+  ExportSettings:=TSimpleXMLFormatSettings.Create(true);
+  try
+    ExportFormat:=efXML;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestXSDExport_DelphiClientDataset;
+var
+  Exporter: TXMLXSDExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TXMLXSDFormatSettings;
+begin
+  Exporter := TXMLXSDExporter.Create(nil);
+  ExportSettings:=TXMLXSDFormatSettings.Create(true);
+  try
+    ExportSettings.ExportFormat:=DelphiClientDataset;
+    ExportFormat:=efXMLXSDClientDataset;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+procedure TTestDBExport.TestXSDExport_Excel;
+var
+  Exporter: TXMLXSDExporter;
+  ExportFormat: TDetailedExportFormats;
+  ExportSettings:TXMLXSDFormatSettings;
+begin
+  Exporter := TXMLXSDExporter.Create(nil);
+  ExportSettings:=TXMLXSDFormatSettings.Create(true);
+  try
+    ExportSettings.ExportFormat:=ExcelCompatible;
+    ExportFormat:=efXMLXSDExcel;
+    Exporter.FileName := FExportTempDir + 'expt'+inttostr(ord(ExportFormat))+
+     TDetailedExportExtensions[ExportFormat];
+    Exporter.FormatSettings:=ExportSettings;
+    GenericExportTest(Exporter, ExportFormat);
+    AssertTrue('Output file must be created', FileExists(Exporter.FileName));
+    AssertFalse('Output file must not be empty', (GetFileSize(Exporter.FileName) = 0));
+  finally
+    if (FKeepFilesAfterTest = False) then
+      DeleteFile(Exporter.FileName);
+    ExportSettings.Free;
+    Exporter.Free;
+  end;
+end;
+
+
+initialization
+  RegisterTest(TTestDBExport);
+end.

+ 0 - 696
packages/fcl-db/tests/xmlxsdexporttestcase1.pas

@@ -1,696 +0,0 @@
-unit XMLXSDExportTestCase1;
-
-{$mode objfpc}{$H+}
-
-interface
-
-uses
-  Classes, SysUtils, Fpcunit, Testutils, Testregistry, DB, fpXMLXSDExport,
-  BufDataset, dateutils;
-
-type
-
-  { Ttestxmlxsdexport1 }
-
-  Ttestxmlxsdexport1 = class(Ttestcase)
-  const
-    KeepFilesAfterTest = true;
-    //Change if you want to keep export files for further testing
-  private
-    procedure FillTestData;
-  protected
-    FTestDataset: TBufDataset;
-    FExportTempDir: string; //where we store exported files in these tests
-    procedure FillRecord(const RowNumber: integer; const Teststring: string;
-      const TestGUID: string; const TestInteger: integer;
-      const TestExtended: extended; const TestDatetime: Tdatetime;
-      const TestBoolean: boolean);
-    procedure Setup; override;
-    procedure Teardown; override;
-  published
-    procedure TestXSDExport_Access_NoXSD_DecimalOverride;
-    procedure TestXSDExport_Access_NoXSD_NoDecimalOverride;
-    procedure TestXSDExport_Access_XSD_DecimalOverride;
-    procedure TestXSDExport_Access_XSD_NoDecimalOverride;
-    procedure TestXSDExport_ADONET_NoXSD;
-    procedure TestXSDExport_ADONET_XSD;
-    procedure TestXSDExport_DelphiClientDataset;
-    procedure TestXSDExport_Excel;
-  end;
-
-implementation
-
-procedure Ttestxmlxsdexport1.TestXSDExport_Access_NoXSD_NoDecimalOverride;
-
-var
-  Export: TXMLXSDExporter;
-  Settings: TXMLXSDFormatSettings;
-  NumberExported: integer;
-
-begin
-  Export := TXMLXSDExporter.Create(nil);
-  Settings := TXMLXSDFormatSettings.Create(True);
-  try
-    //Don't override decimal separator
-    Settings.CreateXSD := False;
-    Settings.DecimalSeparator := char(''); //Don't override decimalseparator
-    Settings.ExportFormat := AccessCompatible;
-    Export.Dataset := FTestDataset;
-    Export.FormatSettings := Settings;
-    Export.FileName := FExportTempDir + 'Access_NoXSD_NoDecimalOverride.xml';
-    NumberExported := Export.Execute;
-    FTestDataset.Close;
-    AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
-  finally
-    Settings.Free;
-    if (KeepFilesAfterTest = False) then
-    begin
-      DeleteFile(Export.FileName);
-    end;
-    Export.Free;
-  end;
-end;
-
-procedure Ttestxmlxsdexport1.TestXSDExport_Access_NoXSD_DecimalOverride;
-var
-  Export: TXMLXSDExporter;
-  Settings: TXMLXSDFormatSettings;
-  NumberExported: integer;
-
-begin
-  Export := TXMLXSDExporter.Create(nil);
-  Settings := TXMLXSDFormatSettings.Create(True);
-  try
-    Settings.DecimalSeparator := ',';
-    //Try to override decimal separator specified by fpXMLXSDExport
-    Settings.CreateXSD := False;
-    Settings.ExportFormat := AccessCompatible;
-    Export.Dataset := FTestDataset;
-    Export.FormatSettings := Settings;
-    Export.FileName := FExportTempDir + 'Access_NoXSD_DecimalOverride.xml';
-    NumberExported := Export.Execute;
-    FTestDataset.Close;
-    AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
-  finally
-    Settings.Free;
-    if (KeepFilesAfterTest = False) then
-    begin
-      DeleteFile(Export.FileName);
-    end;
-    Export.Free;
-  end;
-end;
-
-procedure Ttestxmlxsdexport1.TestXSDExport_Access_XSD_NoDecimalOverride;
-var
-  Export: TXMLXSDExporter;
-  Settings: TXMLXSDFormatSettings;
-  NumberExported: integer;
-
-begin
-  Export := TXMLXSDExporter.Create(nil);
-  Settings := TXMLXSDFormatSettings.Create(True);
-  try
-    //Settings.DecimalSeparator := ','; //Don't override decimal separator
-    Settings.CreateXSD := True;
-    Settings.ExportFormat := AccessCompatible;
-    Export.Dataset := FTestDataset;
-    Export.FormatSettings := Settings;
-    Export.FileName := FExportTempDir + 'Access_XSD_NoDecimalOverride.xml';
-    NumberExported := Export.Execute;
-    FTestDataset.Close;
-    AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
-  finally
-    Settings.Free;
-    if (KeepFilesAfterTest = False) then
-    begin
-      DeleteFile(Export.FileName);
-    end;
-    Export.Free;
-  end;
-end;
-
-procedure Ttestxmlxsdexport1.TestXSDExport_Access_XSD_DecimalOverride;
-var
-  Export: TXMLXSDExporter;
-  Settings: TXMLXSDFormatSettings;
-  NumberExported: integer;
-
-begin
-  Export := TXMLXSDExporter.Create(nil);
-  Settings := TXMLXSDFormatSettings.Create(True);
-  try
-    Settings.DecimalSeparator := ','; //Try to override decimal separator
-    Settings.CreateXSD := True;
-    Settings.ExportFormat := AccessCompatible;
-    Export.Dataset := FTestDataset;
-    Export.FormatSettings := Settings;
-    Export.FileName := FExportTempDir + 'Access_XSD_DecimalOverride.xml';
-    NumberExported := Export.Execute;
-    FTestDataset.Close;
-    AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
-  finally
-    Settings.Free;
-    if (KeepFilesAfterTest = False) then
-    begin
-      DeleteFile(Export.FileName);
-    end;
-    Export.Free;
-  end;
-end;
-
-procedure Ttestxmlxsdexport1.TestXSDExport_ADONET_NoXSD;
-var
-  Export: TXMLXSDExporter;
-  Settings: TXMLXSDFormatSettings;
-  NumberExported: integer;
-
-begin
-  Export := TXMLXSDExporter.Create(nil);
-  Settings := TXMLXSDFormatSettings.Create(True);
-  try
-    Settings.CreateXSD := False;
-    Settings.ExportFormat := ADONETCompatible;
-    Export.Dataset := FTestDataset;
-    Export.FormatSettings := Settings;
-    Export.FileName := FExportTempDir + 'ADONET_NoXSD.xml';
-    NumberExported := Export.Execute;
-    FTestDataset.Close;
-    AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
-  finally
-    Settings.Free;
-    if (KeepFilesAfterTest = False) then
-    begin
-      DeleteFile(Export.FileName);
-    end;
-    Export.Free;
-  end;
-end;
-
-procedure Ttestxmlxsdexport1.TestXSDExport_ADONET_XSD;
-var
-  Export: TXMLXSDExporter;
-  Settings: TXMLXSDFormatSettings;
-  NumberExported: integer;
-
-begin
-  Export := TXMLXSDExporter.Create(nil);
-  Settings := TXMLXSDFormatSettings.Create(True);
-  try
-    Settings.CreateXSD := True;
-    Settings.ExportFormat := ADONETCompatible;
-    Export.Dataset := FTestDataset;
-    Export.FormatSettings := Settings;
-    Export.FileName := FExportTempDir + 'ADONET_XSD.xml';
-    NumberExported := Export.Execute;
-    FTestDataset.Close;
-    AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
-  finally
-    Settings.Free;
-    if (KeepFilesAfterTest = False) then
-    begin
-      DeleteFile(Export.FileName);
-    end;
-    Export.Free;
-  end;
-end;
-
-procedure Ttestxmlxsdexport1.TestXSDExport_DelphiClientDataset;
-var
-  Export: TXMLXSDExporter;
-  Settings: TXMLXSDFormatSettings;
-  NumberExported: integer;
-
-begin
-  Export := TXMLXSDExporter.Create(nil);
-  Settings := TXMLXSDFormatSettings.Create(True);
-  try
-    Settings.ExportFormat := DelphiClientDataset;
-    Export.Dataset := FTestDataset;
-    Export.FormatSettings := Settings;
-    Export.FileName := FExportTempDir + 'DelphiClientDataset.xml';
-    NumberExported := Export.Execute;
-    FTestDataset.Close;
-    AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
-    //we should have exported 2 records.
-  finally
-    Settings.Free;
-    if (KeepFilesAfterTest = False) then
-    begin
-      DeleteFile(Export.FileName);
-    end;
-    Export.Free;
-  end;
-end;
-
-procedure Ttestxmlxsdexport1.TestXSDExport_Excel;
-var
-  Export: TXMLXSDExporter;
-  Settings: TXMLXSDFormatSettings;
-  NumberExported: integer;
-
-begin
-  Export := TXMLXSDExporter.Create(nil);
-  Settings := TXMLXSDFormatSettings.Create(True);
-  try
-    Settings.ExportFormat := ExcelCompatible;
-    Export.Dataset := FTestDataset;
-    Export.FormatSettings := Settings;
-    Export.FileName := FExportTempDir + 'Excel.xml';
-    NumberExported := Export.Execute;
-    FTestDataset.Close;
-    AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
-    //we should have exported 2 records.
-  finally
-    Settings.Free;
-    if (KeepFilesAfterTest = False) then
-    begin
-      DeleteFile(Export.FileName);
-    end;
-    Export.Free;
-  end;
-end;
-
-
-procedure Ttestxmlxsdexport1.FillTestData;
-var
-  RowNumber: integer; //Keep track of how many rows we inserted
-  TestBoolean: boolean;
-  TestDateTime: TDateTime;
-  TestExtended: extended;
-  //yes, a lot of precision; we can convert to single/double if required
-  TestInteger: integer;
-  TestGuid: string;
-  TestString: string;
-begin
-  FTestDataset.Close;
-  RowNumber := 0;
-  //for memds:
-  //FTestDataset.Clear(False); //memds: clear out any data
-  //FTestDataset.Fields.Clear; //bufds: clear out any data, but also FIELDDEFS: don't use
-  FTestDataset.Open;
-
-  // Fill some test data
-  // First row: positive numerical values, late dates/times, strings with special chars (tab, linefeed, ; > <)
-  FTestDataset.Append;
-  TestBoolean := True;
-  TestDateTime := EncodeDate(9999, 12, 31) + EncodeTime(23, 59, 59, 999);
-  TestExtended := 42.424242424242424242424242424242;
-  TestInteger := Round(TestExtended);
-  TestGuid := '{21EC2020-3AEA-1069-A2DD-08002B30309D}';
-  TestString := 'Douglas Adams less than: < greater than > tab:' +
-    #9 + 'crlf:' + #13 + #10 +
-    '國缺界广欠廣界界东缺. Haddock drinks rosé (ros, e accent aigu), водка (wodka cyrillic) and ούζο (ouzo Greek) but prefers Loch Lomond whiskey.';
-  RowNumber := RowNumber + 1;
-  FillRecord(RowNumber, Teststring, TestGUID, Testinteger, Testextended,
-    Testdatetime, Testboolean);
-  FTestDataset.Post;
-
-  // Second row: negative numerical values, early dates/times, strings with maximum field width and Greek, east asian (multibyte) characters
-  FTestDataset.Append;
-  TestBoolean := False;
-  TestDateTime := EncodeDate(1, 1, 1) + EncodeTime(0, 0, 0, 1);
-  TestExtended := -42.424242424242424242424242424242;
-  TestInteger := Round(TestExtended);
-  TestGuid := '{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}';
-  TestString := 'ARMA virumque cano, Troiae qui primus ab oris' +
-    #13 + #10 + 'Italiam, fato profugus, Laviniaque venit' + #13 +
-    #10 + 'litora, multum ille et terris iactatus et alto' + #13 +
-    #10 + 'vi superum saevae memorem Iunonis ob iram;' + #13 + #10 +
-    'multa quoque et bello passus, dum conderet urbem,' + #13 + #10 +
-    'inferretque deos Latio, genus unde Latinum,' + #13 + #10 +
-    'Albanique patres, atque altae moenia Romae.' + #13 + #10 + #13 +
-    #10 + 'Musa, mihi causas memora, quo numine laeso,' + #13 + #10 +
-    'quidve dolens, regina deum tot volvere casus' + #13 + #10 +
-    'insignem pietate virum, tot adire labores' + #13 + #10 +
-    'impulerit.  Tantaene animis caelestibus irae?' + #13 + #10 +
-    #13 + #10 + 'Urbs antiqua fuit, Tyrii tenuere coloni,' + #13 +
-    #10 + 'Karthago, Italiam contra Tiberinaque longe' + #13 + #10 +
-    'ostia, dives opum studiisque asperrima belli;' + #13 + #10 +
-    'quam Iuno fertur terris magis omnibus unam' + #13 + #10 +
-    'posthabita coluisse Samo; hic illius arma,' + #13 + #10 +
-    'hic currus fuit; hoc regnum dea gentibus esse,' + #13 + #10 +
-    'si qua fata sinant, iam tum tenditque fovetque.' + #13 + #10 +
-    'Progeniem sed enim Troiano a sanguine duci' + #13 + #10 +
-    'audierat, Tyrias olim quae verteret arces;' + #13 + #10 +
-    'hinc populum late regem belloque superbum' + #13 + #10 +
-    'venturum excidio Libyae:  sic volvere Parcas.' + #13 + #10 +
-    'Id metuens, veterisque memor Saturnia belli,' + #13 + #10 +
-    'prima quod ad Troiam pro caris gesserat Argis---' + #13 + #10 +
-    'necdum etiam causae irarum saevique dolores' + #13 + #10 +
-    'exciderant animo:  manet alta mente repostum' + #13 + #10 +
-    'iudicium Paridis spretaeque iniuria formae,' + #13 + #10 +
-    'et genus invisum, et rapti Ganymedis honores.' + #13 + #10 +
-    'His accensa super, iactatos aequore toto' + #13 + #10 +
-    'Troas, reliquias Danaum atque immitis Achilli,' + #13 + #10 +
-    'arcebat longe Latio, multosque per annos' + #13 + #10 +
-    'errabant, acti fatis, maria omnia circum.' + #13 + #10 +
-    'Tantae molis erat Romanam condere gentem!';
-  RowNumber := RowNumber + 1;
-  FillRecord(RowNumber, Teststring, TestGUID, Testinteger, Testextended,
-    Testdatetime, Testboolean);
-  FTestDataset.Post;
-
-  // Third row: empty/zero numerical values, dates/times, strings
-  FTestDataset.Append;
-  TestBoolean := False;
-  TestDateTime := EncodeDate(1, 1, 1) + EncodeTime(0, 0, 0, 0);
-  TestExtended := 0;
-  TestInteger := Round(TestExtended);
-  TestGuid := '{3F2504E0-4F89-11D3-9A0C-0305E82C3301}';
-  TestString := '';
-  RowNumber := RowNumber + 1;
-  FillRecord(RowNumber, Teststring, TestGUID, Testinteger, Testextended,
-    Testdatetime, Testboolean);
-  FTestDataset.Post;
-
-  // Fourth row: plausible data
-  FTestDataset.Append;
-  TestBoolean := True;
-  TestDateTime := EncodeDate(2005, 9, 10) + EncodeTime(13, 52, 18, 0);
-  TestExtended := 42;
-  TestInteger := Round(TestExtended);
-  TestString := 'The answer to life, the universe, and everything';
-  RowNumber := RowNumber + 1;
-  FillRecord(RowNumber, Teststring, TestGUID, Testinteger, Testextended,
-    Testdatetime, Testboolean);
-  FTestDataset.Post;
-
-  // Make sure recordcount is correct:
-  FTestDataset.Last;
-  FTestDataset.First;
-  AssertEquals('Number of records in test dataset', RowNumber, FTestDataset.RecordCount);
-end;
-
-procedure Ttestxmlxsdexport1.Setup;
-const
-  NumberOfDecimals = 2;
-  NumberOfBytes = 10;
-var
-  FieldDef: TFieldDef;
-begin
-  FExportTempDir := GetTempDir(False);
-  FTestDataset := TBufDataset.Create(nil);
-
-  {We should cover all data types defined in FPC:
-
-  FPC maps "external" types such as ftOracleBlob to
-  internal types, but that can be overridden, which is done
-  by e.g. IBX and mseide.
-  So it makes sense to keep as many datatypes in the exporter code as possible: it documents the mappings and allows other people to use these types without the exporter breaking.
-  }
-  {Sorted by datatype; commented out what doesn't work at the moment in bufdataset
-  See http://docwiki.embarcadero.com/VCL/en/DB.TField.Size for overview of field sizes in the competition product ;)
-  Apparently ftGuid also needs size...
-  }
-
-  {
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftADT';
-  FieldDef.DataType := ftADT;
-  FieldDef.Size := 4096;//large but hopefully not too large for memory.
-  }
-
-  {
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftArray';
-  FieldDef.DataType := ftArray;
-  FieldDef.Size := 10;//the number of elements in the array
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftAutoInc';
-  FieldDef.DataType := ftAutoInc;
-  }
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftBCD';
-  FieldDef.DataType := ftBCD;
-  FieldDef.Size := NumberOfDecimals;
-  //Size is the number of digits after the decimal place
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftBlob_4096';
-  FieldDef.DataType := ftBlob;
-  FieldDef.Size := 4096;//large but hopefully not too large for memory.
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftBoolean';
-  FieldDef.DataType := ftBoolean;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftBytes';
-  FieldDef.DataType := ftBytes;
-  FieldDef.Size := NumberOfBytes;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftCurrency';
-  FieldDef.DataType := ftCurrency;
-
-  {
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftCursor';
-  FieldDef.DataType := ftCursor;
-  }
-
-  {
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftDataSet';
-  FieldDef.DataType := ftDataSet;
-  }
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftDate';
-  FieldDef.DataType := ftDate;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftDateTime';
-  FieldDef.DataType := ftDateTime;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftDBaseOle';
-  FieldDef.DataType := ftDBaseOle;
-  FieldDef.Size := 4096;//large but hopefully not too large for memory.
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftFixedChar_2';
-  FieldDef.DataType := ftFixedChar;
-  FieldDef.Size := NumberOfDecimals;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftFixedWideChar_2';
-  FieldDef.DataType := ftFixedWideChar;
-  FieldDef.Size := NumberOfBytes;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftFloat';
-  FieldDef.DataType := ftFloat;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftFMTBcd';
-  FieldDef.DataType := ftFMTBcd;
-  FieldDef.Size := NumberOfDecimals; //the number of digits after the decimal place.
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftFmtMemo';
-  FieldDef.DataType := ftFmtMemo;
-  FieldDef.Size := 4096;//large but hopefully not too large for memory.
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftGraphic';
-  FieldDef.DataType := ftGraphic;
-  FieldDef.Size := 4096;//large but hopefully not too large for memory.
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftGuid';
-  FieldDef.DataType := ftGuid;
-  FieldDef.Size := 38;
-  //Apparently right answer is not 42; had to look up 38 in source code.
-
-  {
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftIDispatch';
-  FieldDef.DataType := ftIDispatch;
-  }
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftInteger';
-  FieldDef.DataType := ftInteger;
-
-  {
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftInterface';
-  FieldDef.DataType := ftInterface;
-  }
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftLargeint';
-  FieldDef.DataType := ftLargeint;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftMemo';
-  FieldDef.DataType := ftMemo;
-  FieldDef.Size := 4096;//large but hopefully not too large for memory.
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftOraBlob';
-  FieldDef.DataType := ftOraBlob;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftOraClob';
-  FieldDef.DataType := ftOraClob;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftParadoxOle';
-  FieldDef.DataType := ftParadoxOle;
-  FieldDef.Size := 4096;//large but hopefully not too large for memory.
-
-  {
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftReference';
-  FieldDef.DataType := ftReference;
-  }
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftSmallInt';
-  FieldDef.DataType := ftInteger;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftString_1';
-  FieldDef.DataType := ftString;
-  FieldDef.Size := 1;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftString_256'; //1 character more than many db string types support
-  FieldDef.DataType := ftString;
-  FieldDef.Size := 256;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftTime';
-  FieldDef.DataType := ftTime;
-
-  {
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftTimeStamp';
-  FieldDef.DataType := ftTimeStamp;
-  }
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftTypedBinary';
-  FieldDef.DataType := ftTypedBinary;
-  FieldDef.Size := 4096;//large but hopefully not too large for memory.
-
-  { ftVariant and ftVarBytes don't work; see bug 19930
-  However, there's more wront in bufdataset; if I don't
-  include these field definitions, I get access violations later on.}
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftVariant';
-  FieldDef.DataType := ftVariant;
-  FieldDef.Size := NumberOfBytes;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftVarBytes';
-  FieldDef.DataType := ftVarBytes;
-  FieldDef.Size := NumberOfBytes;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftWideMemo';
-  FieldDef.DataType := ftWideMemo;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftWideString256';
-  FieldDef.DataType := ftWideString;
-  FieldDef.Size := 256;
-
-  FieldDef := FTestDataset.FieldDefs.AddFieldDef;
-  FieldDef.Name := 'ftWord';
-  FieldDef.DataType := ftWord;
-
-  //Createtable is needed if you use a memds
-  //FTestDataset.CreateTable;
-  //CreateDataset is needed if you use a bufdataset
-  FTestDataset.CreateDataSet;
-
-  // Fill dataset with test data
-  FillTestData;
-end;
-
-procedure Ttestxmlxsdexport1.FillRecord(const RowNumber: integer;
-  const TestString: string; const TestGUID: string; const TestInteger: integer;
-  const TestExtended: extended; const TestDatetime: Tdatetime;
-  const TestBoolean: boolean);
-var
-  FieldCounter: integer;
-begin
-  writeln('*** Starting to fill row ' + IntToStr(RowNumber));
-  {As our bufdataset doesn't support these datatypes, don't use them:
-ftAutoInc -> exists but doesn't seem to return any data.
-ftCursor
-ftDataSet
-ftInterface
-ftReference
-ftTimeStamp}
-
-  FTestDataset.FieldByName('ftBCD').AsFloat := Testextended;
-  FTestDataset.FieldByName('ftBlob_4096').AsString := Teststring;
-  FTestDataset.FieldByName('ftBoolean').AsBoolean := Testboolean;
-  FTestDataset.FieldByName('ftBytes').AsString := Teststring;
-  FTestDataset.FieldByName('ftCurrency').Ascurrency := Testextended;
-  FTestDataset.FieldByName('ftDate').AsDateTime := Testdatetime;
-  FTestDataset.FieldByName('ftDateTime').AsDateTime := Testdatetime;
-  FTestDataset.FieldByName('ftDBaseOle').AsString := Teststring;
-  FTestDataset.FieldByName('ftFixedChar_2').AsString := Teststring;
-  FTestDataset.FieldByName('ftFixedWideChar_2').AsString := Teststring;
-  FTestDataset.FieldByName('ftFloat').AsFloat := Testextended;
-  FTestDataset.FieldByName('ftFMTBcd').AsFloat := Testextended;
-  FTestDataset.FieldByName('ftFmtMemo').AsString := Teststring;
-  FTestDataset.FieldByName('ftGraphic').AsString := Teststring;
-  FTestDataset.FieldByName('ftGuid').AsString := TestGUID;
-  FTestDataset.FieldByName('ftInteger').AsInteger := Testinteger;
-  FTestDataset.FieldByName('ftLargeint').AsInteger := Testinteger;
-  FTestDataset.FieldByName('ftMemo').AsString := Teststring;
-  FTestDataset.FieldByName('ftOraBlob').AsString := Teststring;
-  FTestDataset.FieldByName('ftOraClob').AsString := Teststring;
-  FTestDataset.FieldByName('ftParadoxOle').AsString := Teststring;
-  FTestDataset.FieldByName('ftSmallInt').AsInteger := Testinteger;
-  FTestDataset.FieldByName('ftString_1').AsString := Teststring;
-  FTestDataset.FieldByName('ftString_256').AsString := Teststring;
-  FTestDataset.FieldByName('ftTime').AsDateTime := Testdatetime;
-  FTestDataset.FieldByName('ftTypedBinary').AsString := Teststring;
-  { ftVarBytes and ftVariant don't work; see bug 19930}
-  {
-  FTestDataSet.FieldByName('ftVarBytes').AsString := TestString;
-  FTestDataSet.FieldByName('ftVariant').AsString := TestString;
-  }
-  FTestDataset.FieldByName('ftWideMemo').AsString := Teststring;
-  FTestDataset.FieldByName('ftWideString256').AsString := Teststring;
-  FTestDataset.FieldByName('ftWord').AsInteger := Abs(Testinteger);
-  //If I keep the output code below on Win32, I don't get an access violation.
-  //If I remove it, I do. Probably bug 19930 again?
-  for Fieldcounter := 0 to FTestDataset.Fields.Count - 1 do
-  begin
-    try
-      writeln('Field: ' + FTestDataset.Fields[FieldCounter].FieldName +
-        ' has value ' + FTestDataset.Fields[FieldCounter].AsString);
-      {writeln('Field: ' + FTestDataset.Fields[FieldCounter].FieldName +
-        ' has displaytext ' + FTestDataset.Fields[FieldCounter].DisplayText);}
-    except
-      on E: Exception do
-      begin
-        writeln('Field: ' + FTestDataset.Fields[FieldCounter].FieldName +
-          ': error retrieving value: ');
-        writeln(E.ClassName, '; detailed error message: ', E.message);
-      end;
-    end;
-  end;
-  writeln('*** Finished filling row ' + IntToStr(RowNumber));
-end;
-
-procedure Ttestxmlxsdexport1.Teardown;
-begin
-  FTestDataset.Free;
-end;
-
-initialization
-  Registertest(Ttestxmlxsdexport1);
-end.
-