tccsvdataset.pp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. unit tccsvdataset;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, db, SysUtils, fpcunit, testregistry, csvdataset;
  6. type
  7. { TTestCSVDataset }
  8. TTestCSVDataset= class(TTestCase)
  9. private
  10. FCSVDataset: TCSVDataset;
  11. // Load CSVDataset from CSV stream containing lines
  12. Procedure LoadFromLines(Const Lines: Array of string);
  13. // Save CSVDataset to CSV stream, transform to lines
  14. Procedure SaveToLines(Const Lines: TStrings);
  15. // Save CSVDataset to CSV stream, transform to lines, compare with given lines
  16. Procedure AssertLines(Const Lines: Array of string);
  17. protected
  18. procedure SetUp; override;
  19. procedure TearDown; override;
  20. Property CSVDataset : TCSVDataset Read FCSVDataset;
  21. published
  22. procedure TestEmpty;
  23. procedure TestDefaults;
  24. Procedure TestLoadEmptyDefault;
  25. Procedure TestLoadEmptyFirstLineAsNames;
  26. Procedure TestLoad2fieldsFirstLineAsNames;
  27. Procedure TestLoad2fields;
  28. Procedure TestLoad2Records2fields;
  29. Procedure TestLoad2Records2fieldsTabDelim;
  30. Procedure TestSaveEmptyDefault;
  31. Procedure TestSaveEmptyFirstLineAsNames;
  32. Procedure TestSaveOneRecordDefault;
  33. Procedure TestSaveOneRecordFirstLineAsNames;
  34. Procedure TestSaveTwoRecordsDefault;
  35. Procedure TestSaveTwoRecordsFirstLineAsNames;
  36. Procedure TestSaveTwoRecordsFirstLineAsNamesTabDelim;
  37. Procedure TestSaveOneRecord2FieldsDefault;
  38. Procedure TestSaveOneRecord2FieldsFirstLineAsNames;
  39. Procedure TestLoadPriorFieldDefs;
  40. Procedure TestLoadPriorFieldDefsNoFieldNames;
  41. Procedure TestLoadPriorFieldDefsNoFieldNamesWrongCount;
  42. Procedure TestLoadPriorFieldDefsFieldNamesWrongCount;
  43. Procedure TestLoadPriorFieldDefsFieldNamesWrongNames;
  44. end;
  45. implementation
  46. procedure TTestCSVDataset.TestEmpty;
  47. begin
  48. AssertNotNull('Have CSV dataset',CSVDataset);
  49. AssertFalse('Not open',CSVDataset.Active);
  50. AssertEquals('No fielddefs',0,CSVDataset.FieldDefs.Count);
  51. AssertEquals('Name','DS',CSVDataset.Name);
  52. end;
  53. procedure TTestCSVDataset.TestDefaults;
  54. begin
  55. With CSVDataset.CSVOptions do
  56. begin
  57. AssertEquals('DefaultFieldLength',255,DefaultFieldLength);
  58. AssertEquals('FirstLineAsFieldNames',False,FirstLineAsFieldNames);
  59. AssertEquals('Delimiter',',',Delimiter);
  60. AssertEquals('QuoteChar','"',QuoteChar);
  61. AssertEquals('LineEnding',sLineBreak,LineEnding);
  62. AssertEquals('IgnoreOuterWhitespace',False,IgnoreOuterWhitespace);
  63. AssertEquals('QuoteOuterWhitespace',True,QuoteOuterWhitespace);
  64. AssertEquals('EqualColCountPerRow',True,EqualColCountPerRow);
  65. end;
  66. end;
  67. procedure TTestCSVDataset.LoadFromLines(const Lines: array of string);
  68. Var
  69. L : TStringList;
  70. s : TStream;
  71. begin
  72. S:=Nil;
  73. L:=TStringList.Create;
  74. try
  75. L.AddStrings(Lines);
  76. S:=TStringStream.Create(L.Text);
  77. CSVDataset.LoadFromCSVStream(S);
  78. finally
  79. S.Free;
  80. L.Free;
  81. end;
  82. end;
  83. procedure TTestCSVDataset.SaveToLines(const Lines: TStrings);
  84. Var
  85. S : TStringStream;
  86. begin
  87. S:=TStringStream.Create('');
  88. try
  89. CSVDataset.SaveToCSVStream(S);
  90. Lines.Text:=S.DataString;
  91. {
  92. Writeln('----');
  93. Writeln(S.DataString);
  94. Writeln('----');
  95. }
  96. finally
  97. S.Free;
  98. end;
  99. end;
  100. procedure TTestCSVDataset.AssertLines(const Lines: array of string);
  101. Var
  102. L : TStrings;
  103. I : Integer;
  104. begin
  105. L:=TStringList.Create;
  106. try
  107. SaveToLines(L);
  108. AssertEquals('Number of lines',Length(Lines),L.Count);
  109. For I:=0 to L.Count-1 do
  110. AssertEquals('Correct line '+IntToStr(0),Lines[I],L[i]);
  111. finally
  112. L.Free;
  113. end;
  114. end;
  115. procedure TTestCSVDataset.TestLoadEmptyDefault;
  116. begin
  117. LoadFromLines(['a']);
  118. AssertEquals('Active',True,CSVDataset.Active);
  119. AssertEquals('field count',1,CSVDataset.FieldDefs.Count);
  120. AssertEquals('field name','Column1',CSVDataset.FieldDefs[0].Name);
  121. AssertEquals('field size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[0].Size);
  122. AssertEquals('Not Empty',False,CSVDataset.EOF and CSVDataset.BOF);
  123. AssertEquals('field contents','a',CSVDataset.Fields[0].AsString);
  124. end;
  125. procedure TTestCSVDataset.TestLoadEmptyFirstLineAsNames;
  126. begin
  127. CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
  128. CSVDataset.CSVOptions.DefaultFieldLength:=128;
  129. LoadFromLines(['a']);
  130. AssertEquals('Active',True,CSVDataset.Active);
  131. AssertEquals('field count',1,CSVDataset.FieldDefs.Count);
  132. AssertEquals('field name','a',CSVDataset.FieldDefs[0].Name);
  133. AssertEquals('field size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[0].Size);
  134. AssertEquals('Empty',True,CSVDataset.EOF and CSVDataset.BOF);
  135. end;
  136. procedure TTestCSVDataset.TestLoad2fieldsFirstLineAsNames;
  137. begin
  138. CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
  139. CSVDataset.CSVOptions.DefaultFieldLength:=128;
  140. LoadFromLines(['a,b']);
  141. AssertEquals('Active',True,CSVDataset.Active);
  142. AssertEquals('field count',2,CSVDataset.FieldDefs.Count);
  143. AssertEquals('field 0 name','a',CSVDataset.FieldDefs[0].Name);
  144. AssertEquals('field 0 size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[0].Size);
  145. AssertEquals('field 1 name','b',CSVDataset.FieldDefs[1].Name);
  146. AssertEquals('field 1 size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[1].Size);
  147. AssertEquals('Empty',True,CSVDataset.EOF and CSVDataset.BOF);
  148. end;
  149. procedure TTestCSVDataset.TestLoad2fields;
  150. begin
  151. CSVDataset.CSVOptions.DefaultFieldLength:=128;
  152. LoadFromLines(['a,b']);
  153. AssertEquals('Active',True,CSVDataset.Active);
  154. AssertEquals('field count',2,CSVDataset.FieldDefs.Count);
  155. AssertEquals('field 0 name','Column1',CSVDataset.FieldDefs[0].Name);
  156. AssertEquals('field 0 size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[0].Size);
  157. AssertEquals('field 1 name','Column2',CSVDataset.FieldDefs[1].Name);
  158. AssertEquals('field 1 size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[1].Size);
  159. AssertEquals('Empty',False,CSVDataset.EOF and CSVDataset.BOF);
  160. AssertEquals('Not Empty',False,CSVDataset.EOF and CSVDataset.BOF);
  161. AssertEquals('field 0 contents','a',CSVDataset.Fields[0].AsString);
  162. AssertEquals('field 1 contents','b',CSVDataset.Fields[1].AsString);
  163. end;
  164. procedure TTestCSVDataset.TestLoad2Records2fields;
  165. begin
  166. CSVDataset.CSVOptions.DefaultFieldLength:=128;
  167. LoadFromLines(['a,b','c,d']);
  168. AssertEquals('Active',True,CSVDataset.Active);
  169. AssertEquals('field count',2,CSVDataset.FieldDefs.Count);
  170. AssertEquals('field 0 name','Column1',CSVDataset.FieldDefs[0].Name);
  171. AssertEquals('field 0 size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[0].Size);
  172. AssertEquals('field 1 name','Column2',CSVDataset.FieldDefs[1].Name);
  173. AssertEquals('field 1 size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[1].Size);
  174. AssertEquals('Empty',False,CSVDataset.EOF and CSVDataset.BOF);
  175. AssertEquals('Not Empty',False,CSVDataset.EOF and CSVDataset.BOF);
  176. AssertEquals('field 0 contents','a',CSVDataset.Fields[0].AsString);
  177. AssertEquals('field 1 contents','b',CSVDataset.Fields[1].AsString);
  178. CSVDataset.Next;
  179. AssertEquals('not At EOF',False,CSVDataset.EOF);
  180. AssertEquals('field 0 contents','c',CSVDataset.Fields[0].AsString);
  181. AssertEquals('field 1 contents','d',CSVDataset.Fields[1].AsString);
  182. CSVDataset.Next;
  183. AssertEquals('At EOF',True,CSVDataset.EOF);
  184. end;
  185. procedure TTestCSVDataset.TestLoad2Records2fieldsTabDelim;
  186. begin
  187. CSVDataset.CSVOptions.Delimiter:=#9;
  188. CSVDataset.CSVOptions.DefaultFieldLength:=10;
  189. CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
  190. LoadFromLines(['f_a'#9'f_b','a1'#9'b1','a2'#9'b2']);
  191. AssertEquals('Active',True,CSVDataset.Active);
  192. AssertEquals('field count',2,CSVDataset.FieldDefs.Count);
  193. AssertEquals('field 0 name','f_a',CSVDataset.FieldDefs[0].Name);
  194. AssertEquals('field 0 size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[0].Size);
  195. AssertEquals('field 1 name','f_b',CSVDataset.FieldDefs[1].Name);
  196. AssertEquals('field 1 size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[1].Size);
  197. AssertEquals('field 0 contents','a1',CSVDataset.Fields[0].AsString);
  198. AssertEquals('field 1 contents','b1',CSVDataset.Fields[1].AsString);
  199. CSVDataset.Next;
  200. AssertEquals('field 0 contents','a2',CSVDataset.Fields[0].AsString);
  201. AssertEquals('field 1 contents','b2',CSVDataset.Fields[1].AsString);
  202. CSVDataset.Next;
  203. AssertEquals('At EOF',True,CSVDataset.EOF);
  204. end;
  205. procedure TTestCSVDataset.TestSaveEmptyDefault;
  206. begin
  207. CSVDataset.FieldDefs.Add('a',ftString);
  208. CSVDataset.CreateDataset;
  209. AssertLines([]);
  210. end;
  211. procedure TTestCSVDataset.TestSaveEmptyFirstLineAsNames;
  212. begin
  213. CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
  214. CSVDataset.FieldDefs.Add('a',ftString);
  215. CSVDataset.CreateDataset;
  216. AssertLines(['a']);
  217. end;
  218. procedure TTestCSVDataset.TestSaveOneRecordDefault;
  219. begin
  220. // CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
  221. CSVDataset.FieldDefs.Add('a',ftString,20);
  222. CSVDataset.CreateDataset;
  223. CSVDataset.Append;
  224. CSVDataset.Fields[0].AsString:='b';
  225. CSVDataset.Post;
  226. AssertLines(['b']);
  227. end;
  228. procedure TTestCSVDataset.TestSaveOneRecordFirstLineAsNames;
  229. begin
  230. CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
  231. CSVDataset.FieldDefs.Add('a',ftString,20);
  232. CSVDataset.CreateDataset;
  233. CSVDataset.Append;
  234. CSVDataset.Fields[0].AsString:='b';
  235. CSVDataset.Post;
  236. AssertLines(['a','b']);
  237. end;
  238. procedure TTestCSVDataset.TestSaveTwoRecordsDefault;
  239. begin
  240. CSVDataset.FieldDefs.Add('a',ftString,20);
  241. CSVDataset.CreateDataset;
  242. CSVDataset.Append;
  243. CSVDataset.Fields[0].AsString:='b';
  244. CSVDataset.Post;
  245. CSVDataset.Append;
  246. CSVDataset.Fields[0].AsString:='c';
  247. CSVDataset.Post;
  248. AssertLines(['b','c']);
  249. end;
  250. procedure TTestCSVDataset.TestSaveTwoRecordsFirstLineAsNames;
  251. begin
  252. CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
  253. CSVDataset.FieldDefs.Add('a',ftString,20);
  254. CSVDataset.CreateDataset;
  255. CSVDataset.Append;
  256. CSVDataset.Fields[0].AsString:='b';
  257. CSVDataset.Post;
  258. CSVDataset.Append;
  259. CSVDataset.Fields[0].AsString:='c';
  260. CSVDataset.Post;
  261. AssertLines(['a','b','c']);
  262. end;
  263. procedure TTestCSVDataset.TestSaveTwoRecordsFirstLineAsNamesTabDelim;
  264. begin
  265. CSVDataset.CSVOptions.Delimiter:=#9;
  266. CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
  267. CSVDataset.FieldDefs.Add('f_a',ftString,2);
  268. CSVDataset.FieldDefs.Add('f_b',ftString,2);
  269. CSVDataset.CreateDataset;
  270. CSVDataset.InsertRecord(['a2','b2']);
  271. CSVDataset.InsertRecord(['a1','b1']);
  272. AssertLines(['f_a'#9'f_b','a1'#9'b1','a2'#9'b2']);
  273. end;
  274. procedure TTestCSVDataset.TestSaveOneRecord2FieldsDefault;
  275. begin
  276. CSVDataset.FieldDefs.Add('a',ftString,20);
  277. CSVDataset.FieldDefs.Add('b',ftString,20);
  278. CSVDataset.CreateDataset;
  279. CSVDataset.Append;
  280. CSVDataset.Fields[0].AsString:='c';
  281. CSVDataset.Fields[1].AsString:='d';
  282. CSVDataset.Post;
  283. AssertLines(['c,d']);
  284. end;
  285. procedure TTestCSVDataset.TestSaveOneRecord2FieldsFirstLineAsNames;
  286. begin
  287. CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
  288. CSVDataset.FieldDefs.Add('a',ftString,20);
  289. CSVDataset.FieldDefs.Add('b',ftString,20);
  290. CSVDataset.CreateDataset;
  291. CSVDataset.Append;
  292. CSVDataset.Fields[0].AsString:='c';
  293. CSVDataset.Fields[1].AsString:='d';
  294. CSVDataset.Post;
  295. AssertLines(['a,b','c,d']);
  296. end;
  297. procedure TTestCSVDataset.TestLoadPriorFieldDefs;
  298. begin
  299. CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
  300. CSVDataset.FieldDefs.Add('a',ftString,20);
  301. CSVDataset.FieldDefs.Add('b',ftInteger,4);
  302. LoadFromLines(['a,b','1,2']);
  303. AssertEquals('field count',2,CSVDataset.FieldDefs.Count);
  304. AssertEquals('field 0 name','a',CSVDataset.FieldDefs[0].Name);
  305. AssertEquals('field 0 size',20,CSVDataset.FieldDefs[0].Size);
  306. AssertEquals('field 1 name','b',CSVDataset.FieldDefs[1].Name);
  307. AssertEquals('field 1 size',4,CSVDataset.FieldDefs[1].Size);
  308. AssertEquals('field 1 typee',Ord(ftInteger),Ord(CSVDataset.FieldDefs[1].DataType));
  309. AssertEquals('Not Empty',False,CSVDataset.EOF and CSVDataset.BOF);
  310. AssertEquals('field 0 contents','1',CSVDataset.Fields[0].AsString);
  311. AssertEquals('field 1 contents',2,CSVDataset.Fields[1].AsInteger);
  312. end;
  313. procedure TTestCSVDataset.TestLoadPriorFieldDefsNoFieldNames;
  314. begin
  315. CSVDataset.FieldDefs.Add('a',ftString,20);
  316. CSVDataset.FieldDefs.Add('b',ftInteger,4);
  317. LoadFromLines(['1,2']);
  318. AssertEquals('field count',2,CSVDataset.FieldDefs.Count);
  319. AssertEquals('field 0 name','a',CSVDataset.FieldDefs[0].Name);
  320. AssertEquals('field 0 size',20,CSVDataset.FieldDefs[0].Size);
  321. AssertEquals('field 1 name','b',CSVDataset.FieldDefs[1].Name);
  322. AssertEquals('field 1 size',4,CSVDataset.FieldDefs[1].Size);
  323. AssertEquals('field 1 typee',Ord(ftInteger),Ord(CSVDataset.FieldDefs[1].DataType));
  324. AssertEquals('Not Empty',False,CSVDataset.EOF and CSVDataset.BOF);
  325. AssertEquals('field 0 contents','1',CSVDataset.Fields[0].AsString);
  326. AssertEquals('field 1 contents',2,CSVDataset.Fields[1].AsInteger);
  327. end;
  328. procedure TTestCSVDataset.TestLoadPriorFieldDefsNoFieldNamesWrongCount;
  329. Var
  330. OK : Boolean;
  331. begin
  332. CSVDataset.FieldDefs.Add('a',ftString,20);
  333. CSVDataset.FieldDefs.Add('b',ftInteger,4);
  334. try
  335. LoadFromLines(['1']);
  336. OK:=False;
  337. except
  338. OK:=true;
  339. end;
  340. if not OK then
  341. Fail('Expected exception, but none raised');
  342. end;
  343. procedure TTestCSVDataset.TestLoadPriorFieldDefsFieldNamesWrongCount;
  344. const
  345. EM = 'DS : CSV File Field count (1) does not match dataset field count (2).';
  346. Var
  347. OK : String;
  348. begin
  349. CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
  350. CSVDataset.FieldDefs.Add('a',ftString,20);
  351. CSVDataset.FieldDefs.Add('b',ftInteger,4);
  352. try
  353. LoadFromLines(['A']);
  354. OK:='Expected exception, but none raised';
  355. except
  356. on E : Exception do
  357. if (E.Message<>EM) then
  358. OK:=ComparisonMsg(EM,E.Message);
  359. end;
  360. if (OK<>'') then
  361. Fail(OK);
  362. end;
  363. procedure TTestCSVDataset.TestLoadPriorFieldDefsFieldNamesWrongNames;
  364. const
  365. EM = 'DS : CSV File field 1: name "c" does not match dataset field name "b".';
  366. Var
  367. OK : String;
  368. begin
  369. CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
  370. CSVDataset.FieldDefs.Add('a',ftString,20);
  371. CSVDataset.FieldDefs.Add('b',ftInteger,4);
  372. try
  373. LoadFromLines(['a,c']);
  374. OK:='No exception raised';
  375. except
  376. on E : Exception do
  377. if (E.Message<>EM) then
  378. OK:=ComparisonMsg(EM,E.Message)
  379. end;
  380. if (OK<>'') then
  381. Fail(OK);
  382. end;
  383. procedure TTestCSVDataset.SetUp;
  384. begin
  385. FCSVDataset:=TCSVDataset.Create(Nil);
  386. FCSVDataset.Name:='DS';
  387. end;
  388. procedure TTestCSVDataset.TearDown;
  389. begin
  390. FreeAndNil(FCSVDataset);
  391. end;
  392. Initialization
  393. RegisterTest(TTestCSVDataset);
  394. end.