tccsvdataset.pp 13 KB

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