xmlxsdexporttestcase1.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  1. unit XMLXSDExportTestCase1;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, Fpcunit, Testutils, Testregistry, DB, fpXMLXSDExport,
  6. BufDataset, dateutils;
  7. type
  8. { Ttestxmlxsdexport1 }
  9. Ttestxmlxsdexport1 = class(Ttestcase)
  10. const
  11. KeepFilesAfterTest = true;
  12. //Change if you want to keep export files for further testing
  13. private
  14. procedure FillTestData;
  15. protected
  16. FTestDataset: TBufDataset;
  17. FExportTempDir: string; //where we store exported files in these tests
  18. procedure FillRecord(const RowNumber: integer; const Teststring: string;
  19. const TestGUID: string; const TestInteger: integer;
  20. const TestExtended: extended; const TestDatetime: Tdatetime;
  21. const TestBoolean: boolean);
  22. procedure Setup; override;
  23. procedure Teardown; override;
  24. published
  25. procedure TestXSDExport_Access_NoXSD_DecimalOverride;
  26. procedure TestXSDExport_Access_NoXSD_NoDecimalOverride;
  27. procedure TestXSDExport_Access_XSD_DecimalOverride;
  28. procedure TestXSDExport_Access_XSD_NoDecimalOverride;
  29. procedure TestXSDExport_ADONET_NoXSD;
  30. procedure TestXSDExport_ADONET_XSD;
  31. procedure TestXSDExport_DelphiClientDataset;
  32. procedure TestXSDExport_Excel;
  33. end;
  34. implementation
  35. procedure Ttestxmlxsdexport1.TestXSDExport_Access_NoXSD_NoDecimalOverride;
  36. var
  37. Export: TXMLXSDExporter;
  38. Settings: TXMLXSDFormatSettings;
  39. NumberExported: integer;
  40. begin
  41. Export := TXMLXSDExporter.Create(nil);
  42. Settings := TXMLXSDFormatSettings.Create(True);
  43. try
  44. //Don't override decimal separator
  45. Settings.CreateXSD := False;
  46. Settings.DecimalSeparator := char(''); //Don't override decimalseparator
  47. Settings.ExportFormat := AccessCompatible;
  48. Export.Dataset := FTestDataset;
  49. Export.FormatSettings := Settings;
  50. Export.FileName := FExportTempDir + 'Access_NoXSD_NoDecimalOverride.xml';
  51. NumberExported := Export.Execute;
  52. FTestDataset.Close;
  53. AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
  54. finally
  55. Settings.Free;
  56. if (KeepFilesAfterTest = False) then
  57. begin
  58. DeleteFile(Export.FileName);
  59. end;
  60. Export.Free;
  61. end;
  62. end;
  63. procedure Ttestxmlxsdexport1.TestXSDExport_Access_NoXSD_DecimalOverride;
  64. var
  65. Export: TXMLXSDExporter;
  66. Settings: TXMLXSDFormatSettings;
  67. NumberExported: integer;
  68. begin
  69. Export := TXMLXSDExporter.Create(nil);
  70. Settings := TXMLXSDFormatSettings.Create(True);
  71. try
  72. Settings.DecimalSeparator := ',';
  73. //Try to override decimal separator specified by fpXMLXSDExport
  74. Settings.CreateXSD := False;
  75. Settings.ExportFormat := AccessCompatible;
  76. Export.Dataset := FTestDataset;
  77. Export.FormatSettings := Settings;
  78. Export.FileName := FExportTempDir + 'Access_NoXSD_DecimalOverride.xml';
  79. NumberExported := Export.Execute;
  80. FTestDataset.Close;
  81. AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
  82. finally
  83. Settings.Free;
  84. if (KeepFilesAfterTest = False) then
  85. begin
  86. DeleteFile(Export.FileName);
  87. end;
  88. Export.Free;
  89. end;
  90. end;
  91. procedure Ttestxmlxsdexport1.TestXSDExport_Access_XSD_NoDecimalOverride;
  92. var
  93. Export: TXMLXSDExporter;
  94. Settings: TXMLXSDFormatSettings;
  95. NumberExported: integer;
  96. begin
  97. Export := TXMLXSDExporter.Create(nil);
  98. Settings := TXMLXSDFormatSettings.Create(True);
  99. try
  100. //Settings.DecimalSeparator := ','; //Don't override decimal separator
  101. Settings.CreateXSD := True;
  102. Settings.ExportFormat := AccessCompatible;
  103. Export.Dataset := FTestDataset;
  104. Export.FormatSettings := Settings;
  105. Export.FileName := FExportTempDir + 'Access_XSD_NoDecimalOverride.xml';
  106. NumberExported := Export.Execute;
  107. FTestDataset.Close;
  108. AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
  109. finally
  110. Settings.Free;
  111. if (KeepFilesAfterTest = False) then
  112. begin
  113. DeleteFile(Export.FileName);
  114. end;
  115. Export.Free;
  116. end;
  117. end;
  118. procedure Ttestxmlxsdexport1.TestXSDExport_Access_XSD_DecimalOverride;
  119. var
  120. Export: TXMLXSDExporter;
  121. Settings: TXMLXSDFormatSettings;
  122. NumberExported: integer;
  123. begin
  124. Export := TXMLXSDExporter.Create(nil);
  125. Settings := TXMLXSDFormatSettings.Create(True);
  126. try
  127. Settings.DecimalSeparator := ','; //Try to override decimal separator
  128. Settings.CreateXSD := True;
  129. Settings.ExportFormat := AccessCompatible;
  130. Export.Dataset := FTestDataset;
  131. Export.FormatSettings := Settings;
  132. Export.FileName := FExportTempDir + 'Access_XSD_DecimalOverride.xml';
  133. NumberExported := Export.Execute;
  134. FTestDataset.Close;
  135. AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
  136. finally
  137. Settings.Free;
  138. if (KeepFilesAfterTest = False) then
  139. begin
  140. DeleteFile(Export.FileName);
  141. end;
  142. Export.Free;
  143. end;
  144. end;
  145. procedure Ttestxmlxsdexport1.TestXSDExport_ADONET_NoXSD;
  146. var
  147. Export: TXMLXSDExporter;
  148. Settings: TXMLXSDFormatSettings;
  149. NumberExported: integer;
  150. begin
  151. Export := TXMLXSDExporter.Create(nil);
  152. Settings := TXMLXSDFormatSettings.Create(True);
  153. try
  154. Settings.CreateXSD := False;
  155. Settings.ExportFormat := ADONETCompatible;
  156. Export.Dataset := FTestDataset;
  157. Export.FormatSettings := Settings;
  158. Export.FileName := FExportTempDir + 'ADONET_NoXSD.xml';
  159. NumberExported := Export.Execute;
  160. FTestDataset.Close;
  161. AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
  162. finally
  163. Settings.Free;
  164. if (KeepFilesAfterTest = False) then
  165. begin
  166. DeleteFile(Export.FileName);
  167. end;
  168. Export.Free;
  169. end;
  170. end;
  171. procedure Ttestxmlxsdexport1.TestXSDExport_ADONET_XSD;
  172. var
  173. Export: TXMLXSDExporter;
  174. Settings: TXMLXSDFormatSettings;
  175. NumberExported: integer;
  176. begin
  177. Export := TXMLXSDExporter.Create(nil);
  178. Settings := TXMLXSDFormatSettings.Create(True);
  179. try
  180. Settings.CreateXSD := True;
  181. Settings.ExportFormat := ADONETCompatible;
  182. Export.Dataset := FTestDataset;
  183. Export.FormatSettings := Settings;
  184. Export.FileName := FExportTempDir + 'ADONET_XSD.xml';
  185. NumberExported := Export.Execute;
  186. FTestDataset.Close;
  187. AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
  188. finally
  189. Settings.Free;
  190. if (KeepFilesAfterTest = False) then
  191. begin
  192. DeleteFile(Export.FileName);
  193. end;
  194. Export.Free;
  195. end;
  196. end;
  197. procedure Ttestxmlxsdexport1.TestXSDExport_DelphiClientDataset;
  198. var
  199. Export: TXMLXSDExporter;
  200. Settings: TXMLXSDFormatSettings;
  201. NumberExported: integer;
  202. begin
  203. Export := TXMLXSDExporter.Create(nil);
  204. Settings := TXMLXSDFormatSettings.Create(True);
  205. try
  206. Settings.ExportFormat := DelphiClientDataset;
  207. Export.Dataset := FTestDataset;
  208. Export.FormatSettings := Settings;
  209. Export.FileName := FExportTempDir + 'DelphiClientDataset.xml';
  210. NumberExported := Export.Execute;
  211. FTestDataset.Close;
  212. AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
  213. //we should have exported 2 records.
  214. finally
  215. Settings.Free;
  216. if (KeepFilesAfterTest = False) then
  217. begin
  218. DeleteFile(Export.FileName);
  219. end;
  220. Export.Free;
  221. end;
  222. end;
  223. procedure Ttestxmlxsdexport1.TestXSDExport_Excel;
  224. var
  225. Export: TXMLXSDExporter;
  226. Settings: TXMLXSDFormatSettings;
  227. NumberExported: integer;
  228. begin
  229. Export := TXMLXSDExporter.Create(nil);
  230. Settings := TXMLXSDFormatSettings.Create(True);
  231. try
  232. Settings.ExportFormat := ExcelCompatible;
  233. Export.Dataset := FTestDataset;
  234. Export.FormatSettings := Settings;
  235. Export.FileName := FExportTempDir + 'Excel.xml';
  236. NumberExported := Export.Execute;
  237. FTestDataset.Close;
  238. AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
  239. //we should have exported 2 records.
  240. finally
  241. Settings.Free;
  242. if (KeepFilesAfterTest = False) then
  243. begin
  244. DeleteFile(Export.FileName);
  245. end;
  246. Export.Free;
  247. end;
  248. end;
  249. procedure Ttestxmlxsdexport1.FillTestData;
  250. var
  251. RowNumber: integer; //Keep track of how many rows we inserted
  252. TestBoolean: boolean;
  253. TestDateTime: TDateTime;
  254. TestExtended: extended;
  255. //yes, a lot of precision; we can convert to single/double if required
  256. TestInteger: integer;
  257. TestGuid: string;
  258. TestString: string;
  259. begin
  260. FTestDataset.Close;
  261. RowNumber := 0;
  262. //for memds:
  263. //FTestDataset.Clear(False); //memds: clear out any data
  264. //FTestDataset.Fields.Clear; //bufds: clear out any data, but also FIELDDEFS: don't use
  265. FTestDataset.Open;
  266. // Fill some test data
  267. // First row: positive numerical values, late dates/times, strings with special chars (tab, linefeed, ; > <)
  268. FTestDataset.Append;
  269. TestBoolean := True;
  270. TestDateTime := EncodeDate(9999, 12, 31) + EncodeTime(23, 59, 59, 999);
  271. TestExtended := 42.424242424242424242424242424242;
  272. TestInteger := Round(TestExtended);
  273. TestGuid := '{21EC2020-3AEA-1069-A2DD-08002B30309D}';
  274. TestString := 'Douglas Adams less than: < greater than > tab:' +
  275. #9 + 'crlf:' + #13 + #10 +
  276. '國缺界广欠廣界界东缺. Haddock drinks rosé (ros, e accent aigu), водка (wodka cyrillic) and ούζο (ouzo Greek) but prefers Loch Lomond whiskey.';
  277. RowNumber := RowNumber + 1;
  278. FillRecord(RowNumber, Teststring, TestGUID, Testinteger, Testextended,
  279. Testdatetime, Testboolean);
  280. FTestDataset.Post;
  281. // Second row: negative numerical values, early dates/times, strings with maximum field width and Greek, east asian (multibyte) characters
  282. FTestDataset.Append;
  283. TestBoolean := False;
  284. TestDateTime := EncodeDate(1, 1, 1) + EncodeTime(0, 0, 0, 1);
  285. TestExtended := -42.424242424242424242424242424242;
  286. TestInteger := Round(TestExtended);
  287. TestGuid := '{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}';
  288. TestString := 'ARMA virumque cano, Troiae qui primus ab oris' +
  289. #13 + #10 + 'Italiam, fato profugus, Laviniaque venit' + #13 +
  290. #10 + 'litora, multum ille et terris iactatus et alto' + #13 +
  291. #10 + 'vi superum saevae memorem Iunonis ob iram;' + #13 + #10 +
  292. 'multa quoque et bello passus, dum conderet urbem,' + #13 + #10 +
  293. 'inferretque deos Latio, genus unde Latinum,' + #13 + #10 +
  294. 'Albanique patres, atque altae moenia Romae.' + #13 + #10 + #13 +
  295. #10 + 'Musa, mihi causas memora, quo numine laeso,' + #13 + #10 +
  296. 'quidve dolens, regina deum tot volvere casus' + #13 + #10 +
  297. 'insignem pietate virum, tot adire labores' + #13 + #10 +
  298. 'impulerit. Tantaene animis caelestibus irae?' + #13 + #10 +
  299. #13 + #10 + 'Urbs antiqua fuit, Tyrii tenuere coloni,' + #13 +
  300. #10 + 'Karthago, Italiam contra Tiberinaque longe' + #13 + #10 +
  301. 'ostia, dives opum studiisque asperrima belli;' + #13 + #10 +
  302. 'quam Iuno fertur terris magis omnibus unam' + #13 + #10 +
  303. 'posthabita coluisse Samo; hic illius arma,' + #13 + #10 +
  304. 'hic currus fuit; hoc regnum dea gentibus esse,' + #13 + #10 +
  305. 'si qua fata sinant, iam tum tenditque fovetque.' + #13 + #10 +
  306. 'Progeniem sed enim Troiano a sanguine duci' + #13 + #10 +
  307. 'audierat, Tyrias olim quae verteret arces;' + #13 + #10 +
  308. 'hinc populum late regem belloque superbum' + #13 + #10 +
  309. 'venturum excidio Libyae: sic volvere Parcas.' + #13 + #10 +
  310. 'Id metuens, veterisque memor Saturnia belli,' + #13 + #10 +
  311. 'prima quod ad Troiam pro caris gesserat Argis---' + #13 + #10 +
  312. 'necdum etiam causae irarum saevique dolores' + #13 + #10 +
  313. 'exciderant animo: manet alta mente repostum' + #13 + #10 +
  314. 'iudicium Paridis spretaeque iniuria formae,' + #13 + #10 +
  315. 'et genus invisum, et rapti Ganymedis honores.' + #13 + #10 +
  316. 'His accensa super, iactatos aequore toto' + #13 + #10 +
  317. 'Troas, reliquias Danaum atque immitis Achilli,' + #13 + #10 +
  318. 'arcebat longe Latio, multosque per annos' + #13 + #10 +
  319. 'errabant, acti fatis, maria omnia circum.' + #13 + #10 +
  320. 'Tantae molis erat Romanam condere gentem!';
  321. RowNumber := RowNumber + 1;
  322. FillRecord(RowNumber, Teststring, TestGUID, Testinteger, Testextended,
  323. Testdatetime, Testboolean);
  324. FTestDataset.Post;
  325. // Third row: empty/zero numerical values, dates/times, strings
  326. FTestDataset.Append;
  327. TestBoolean := False;
  328. TestDateTime := EncodeDate(1, 1, 1) + EncodeTime(0, 0, 0, 0);
  329. TestExtended := 0;
  330. TestInteger := Round(TestExtended);
  331. TestGuid := '{3F2504E0-4F89-11D3-9A0C-0305E82C3301}';
  332. TestString := '';
  333. RowNumber := RowNumber + 1;
  334. FillRecord(RowNumber, Teststring, TestGUID, Testinteger, Testextended,
  335. Testdatetime, Testboolean);
  336. FTestDataset.Post;
  337. // Fourth row: plausible data
  338. FTestDataset.Append;
  339. TestBoolean := True;
  340. TestDateTime := EncodeDate(2005, 9, 10) + EncodeTime(13, 52, 18, 0);
  341. TestExtended := 42;
  342. TestInteger := Round(TestExtended);
  343. TestString := 'The answer to life, the universe, and everything';
  344. RowNumber := RowNumber + 1;
  345. FillRecord(RowNumber, Teststring, TestGUID, Testinteger, Testextended,
  346. Testdatetime, Testboolean);
  347. FTestDataset.Post;
  348. // Make sure recordcount is correct:
  349. FTestDataset.Last;
  350. FTestDataset.First;
  351. AssertEquals('Number of records in test dataset', RowNumber, FTestDataset.RecordCount);
  352. end;
  353. procedure Ttestxmlxsdexport1.Setup;
  354. const
  355. NumberOfDecimals = 2;
  356. NumberOfBytes = 10;
  357. var
  358. FieldDef: TFieldDef;
  359. begin
  360. FExportTempDir := GetTempDir(False);
  361. FTestDataset := TBufDataset.Create(nil);
  362. {We should cover all data types defined in FPC:
  363. FPC maps "external" types such as ftOracleBlob to
  364. internal types, but that can be overridden, which is done
  365. by e.g. IBX and mseide.
  366. 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.
  367. }
  368. {Sorted by datatype; commented out what doesn't work at the moment in bufdataset
  369. See http://docwiki.embarcadero.com/VCL/en/DB.TField.Size for overview of field sizes in the competition product ;)
  370. Apparently ftGuid also needs size...
  371. }
  372. {
  373. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  374. FieldDef.Name := 'ftADT';
  375. FieldDef.DataType := ftADT;
  376. FieldDef.Size := 4096;//large but hopefully not too large for memory.
  377. }
  378. {
  379. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  380. FieldDef.Name := 'ftArray';
  381. FieldDef.DataType := ftArray;
  382. FieldDef.Size := 10;//the number of elements in the array
  383. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  384. FieldDef.Name := 'ftAutoInc';
  385. FieldDef.DataType := ftAutoInc;
  386. }
  387. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  388. FieldDef.Name := 'ftBCD';
  389. FieldDef.DataType := ftBCD;
  390. FieldDef.Size := NumberOfDecimals;
  391. //Size is the number of digits after the decimal place
  392. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  393. FieldDef.Name := 'ftBlob_4096';
  394. FieldDef.DataType := ftBlob;
  395. FieldDef.Size := 4096;//large but hopefully not too large for memory.
  396. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  397. FieldDef.Name := 'ftBoolean';
  398. FieldDef.DataType := ftBoolean;
  399. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  400. FieldDef.Name := 'ftBytes';
  401. FieldDef.DataType := ftBytes;
  402. FieldDef.Size := NumberOfBytes;
  403. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  404. FieldDef.Name := 'ftCurrency';
  405. FieldDef.DataType := ftCurrency;
  406. {
  407. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  408. FieldDef.Name := 'ftCursor';
  409. FieldDef.DataType := ftCursor;
  410. }
  411. {
  412. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  413. FieldDef.Name := 'ftDataSet';
  414. FieldDef.DataType := ftDataSet;
  415. }
  416. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  417. FieldDef.Name := 'ftDate';
  418. FieldDef.DataType := ftDate;
  419. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  420. FieldDef.Name := 'ftDateTime';
  421. FieldDef.DataType := ftDateTime;
  422. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  423. FieldDef.Name := 'ftDBaseOle';
  424. FieldDef.DataType := ftDBaseOle;
  425. FieldDef.Size := 4096;//large but hopefully not too large for memory.
  426. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  427. FieldDef.Name := 'ftFixedChar_2';
  428. FieldDef.DataType := ftFixedChar;
  429. FieldDef.Size := NumberOfDecimals;
  430. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  431. FieldDef.Name := 'ftFixedWideChar_2';
  432. FieldDef.DataType := ftFixedWideChar;
  433. FieldDef.Size := NumberOfBytes;
  434. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  435. FieldDef.Name := 'ftFloat';
  436. FieldDef.DataType := ftFloat;
  437. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  438. FieldDef.Name := 'ftFMTBcd';
  439. FieldDef.DataType := ftFMTBcd;
  440. FieldDef.Size := NumberOfDecimals; //the number of digits after the decimal place.
  441. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  442. FieldDef.Name := 'ftFmtMemo';
  443. FieldDef.DataType := ftFmtMemo;
  444. FieldDef.Size := 4096;//large but hopefully not too large for memory.
  445. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  446. FieldDef.Name := 'ftGraphic';
  447. FieldDef.DataType := ftGraphic;
  448. FieldDef.Size := 4096;//large but hopefully not too large for memory.
  449. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  450. FieldDef.Name := 'ftGuid';
  451. FieldDef.DataType := ftGuid;
  452. FieldDef.Size := 38;
  453. //Apparently right answer is not 42; had to look up 38 in source code.
  454. {
  455. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  456. FieldDef.Name := 'ftIDispatch';
  457. FieldDef.DataType := ftIDispatch;
  458. }
  459. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  460. FieldDef.Name := 'ftInteger';
  461. FieldDef.DataType := ftInteger;
  462. {
  463. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  464. FieldDef.Name := 'ftInterface';
  465. FieldDef.DataType := ftInterface;
  466. }
  467. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  468. FieldDef.Name := 'ftLargeint';
  469. FieldDef.DataType := ftLargeint;
  470. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  471. FieldDef.Name := 'ftMemo';
  472. FieldDef.DataType := ftMemo;
  473. FieldDef.Size := 4096;//large but hopefully not too large for memory.
  474. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  475. FieldDef.Name := 'ftOraBlob';
  476. FieldDef.DataType := ftOraBlob;
  477. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  478. FieldDef.Name := 'ftOraClob';
  479. FieldDef.DataType := ftOraClob;
  480. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  481. FieldDef.Name := 'ftParadoxOle';
  482. FieldDef.DataType := ftParadoxOle;
  483. FieldDef.Size := 4096;//large but hopefully not too large for memory.
  484. {
  485. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  486. FieldDef.Name := 'ftReference';
  487. FieldDef.DataType := ftReference;
  488. }
  489. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  490. FieldDef.Name := 'ftSmallInt';
  491. FieldDef.DataType := ftInteger;
  492. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  493. FieldDef.Name := 'ftString_1';
  494. FieldDef.DataType := ftString;
  495. FieldDef.Size := 1;
  496. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  497. FieldDef.Name := 'ftString_256'; //1 character more than many db string types support
  498. FieldDef.DataType := ftString;
  499. FieldDef.Size := 256;
  500. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  501. FieldDef.Name := 'ftTime';
  502. FieldDef.DataType := ftTime;
  503. {
  504. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  505. FieldDef.Name := 'ftTimeStamp';
  506. FieldDef.DataType := ftTimeStamp;
  507. }
  508. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  509. FieldDef.Name := 'ftTypedBinary';
  510. FieldDef.DataType := ftTypedBinary;
  511. FieldDef.Size := 4096;//large but hopefully not too large for memory.
  512. { ftVariant and ftVarBytes don't work; see bug 19930
  513. However, there's more wront in bufdataset; if I don't
  514. include these field definitions, I get access violations later on.}
  515. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  516. FieldDef.Name := 'ftVariant';
  517. FieldDef.DataType := ftVariant;
  518. FieldDef.Size := NumberOfBytes;
  519. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  520. FieldDef.Name := 'ftVarBytes';
  521. FieldDef.DataType := ftVarBytes;
  522. FieldDef.Size := NumberOfBytes;
  523. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  524. FieldDef.Name := 'ftWideMemo';
  525. FieldDef.DataType := ftWideMemo;
  526. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  527. FieldDef.Name := 'ftWideString256';
  528. FieldDef.DataType := ftWideString;
  529. FieldDef.Size := 256;
  530. FieldDef := FTestDataset.FieldDefs.AddFieldDef;
  531. FieldDef.Name := 'ftWord';
  532. FieldDef.DataType := ftWord;
  533. //Createtable is needed if you use a memds
  534. //FTestDataset.CreateTable;
  535. //CreateDataset is needed if you use a bufdataset
  536. FTestDataset.CreateDataSet;
  537. // Fill dataset with test data
  538. FillTestData;
  539. end;
  540. procedure Ttestxmlxsdexport1.FillRecord(const RowNumber: integer;
  541. const TestString: string; const TestGUID: string; const TestInteger: integer;
  542. const TestExtended: extended; const TestDatetime: Tdatetime;
  543. const TestBoolean: boolean);
  544. var
  545. FieldCounter: integer;
  546. begin
  547. writeln('*** Starting to fill row ' + IntToStr(RowNumber));
  548. {As our bufdataset doesn't support these datatypes, don't use them:
  549. ftAutoInc -> exists but doesn't seem to return any data.
  550. ftCursor
  551. ftDataSet
  552. ftInterface
  553. ftReference
  554. ftTimeStamp}
  555. FTestDataset.FieldByName('ftBCD').AsFloat := Testextended;
  556. FTestDataset.FieldByName('ftBlob_4096').AsString := Teststring;
  557. FTestDataset.FieldByName('ftBoolean').AsBoolean := Testboolean;
  558. FTestDataset.FieldByName('ftBytes').AsString := Teststring;
  559. FTestDataset.FieldByName('ftCurrency').Ascurrency := Testextended;
  560. FTestDataset.FieldByName('ftDate').AsDateTime := Testdatetime;
  561. FTestDataset.FieldByName('ftDateTime').AsDateTime := Testdatetime;
  562. FTestDataset.FieldByName('ftDBaseOle').AsString := Teststring;
  563. FTestDataset.FieldByName('ftFixedChar_2').AsString := Teststring;
  564. FTestDataset.FieldByName('ftFixedWideChar_2').AsString := Teststring;
  565. FTestDataset.FieldByName('ftFloat').AsFloat := Testextended;
  566. FTestDataset.FieldByName('ftFMTBcd').AsFloat := Testextended;
  567. FTestDataset.FieldByName('ftFmtMemo').AsString := Teststring;
  568. FTestDataset.FieldByName('ftGraphic').AsString := Teststring;
  569. FTestDataset.FieldByName('ftGuid').AsString := TestGUID;
  570. FTestDataset.FieldByName('ftInteger').AsInteger := Testinteger;
  571. FTestDataset.FieldByName('ftLargeint').AsInteger := Testinteger;
  572. FTestDataset.FieldByName('ftMemo').AsString := Teststring;
  573. FTestDataset.FieldByName('ftOraBlob').AsString := Teststring;
  574. FTestDataset.FieldByName('ftOraClob').AsString := Teststring;
  575. FTestDataset.FieldByName('ftParadoxOle').AsString := Teststring;
  576. FTestDataset.FieldByName('ftSmallInt').AsInteger := Testinteger;
  577. FTestDataset.FieldByName('ftString_1').AsString := Teststring;
  578. FTestDataset.FieldByName('ftString_256').AsString := Teststring;
  579. FTestDataset.FieldByName('ftTime').AsDateTime := Testdatetime;
  580. FTestDataset.FieldByName('ftTypedBinary').AsString := Teststring;
  581. { ftVarBytes and ftVariant don't work; see bug 19930}
  582. {
  583. FTestDataSet.FieldByName('ftVarBytes').AsString := TestString;
  584. FTestDataSet.FieldByName('ftVariant').AsString := TestString;
  585. }
  586. FTestDataset.FieldByName('ftWideMemo').AsString := Teststring;
  587. FTestDataset.FieldByName('ftWideString256').AsString := Teststring;
  588. FTestDataset.FieldByName('ftWord').AsInteger := Abs(Testinteger);
  589. //If I keep the output code below on Win32, I don't get an access violation.
  590. //If I remove it, I do. Probably bug 19930 again?
  591. for Fieldcounter := 0 to FTestDataset.Fields.Count - 1 do
  592. begin
  593. try
  594. writeln('Field: ' + FTestDataset.Fields[FieldCounter].FieldName +
  595. ' has value ' + FTestDataset.Fields[FieldCounter].AsString);
  596. {writeln('Field: ' + FTestDataset.Fields[FieldCounter].FieldName +
  597. ' has displaytext ' + FTestDataset.Fields[FieldCounter].DisplayText);}
  598. except
  599. on E: Exception do
  600. begin
  601. writeln('Field: ' + FTestDataset.Fields[FieldCounter].FieldName +
  602. ': error retrieving value: ');
  603. writeln(E.ClassName, '; detailed error message: ', E.message);
  604. end;
  605. end;
  606. end;
  607. writeln('*** Finished filling row ' + IntToStr(RowNumber));
  608. end;
  609. procedure Ttestxmlxsdexport1.Teardown;
  610. begin
  611. FTestDataset.Free;
  612. end;
  613. initialization
  614. Registertest(Ttestxmlxsdexport1);
  615. end.