utyamlparser.pp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. {
  2. This file is part of the Free Component Library
  3. Copyright (c) 2024 by Michael Van Canneyt [email protected]
  4. YAML parser unit tests
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit utyamlparser;
  12. {$mode objfpc}{$H+}
  13. interface
  14. uses
  15. Classes, SysUtils, fpcunit, testutils, testregistry, fpyaml.types, fpyaml.parser, fpyaml.data, utyamldata;
  16. type
  17. { TTestYamlParser }
  18. TTestYamlParser= class(TTestYAMLData)
  19. private
  20. FParser: TYAMLParser;
  21. FSingle : Boolean;
  22. function AssertValue(aClass: TYAMLDataClass): TYAMLData;
  23. function GetDocument: TYAMLDocument;
  24. function GetStream: TYAMLStream;
  25. function GetValue: TYAMLData;
  26. public
  27. procedure Parse(aContent : Array of string);
  28. procedure SetUp; override;
  29. procedure TearDown; override;
  30. property Parser : TYAMLParser Read FParser;
  31. property YAML : TYAMLStream Read GetStream;
  32. property Document: TYAMLDocument Read GetDocument;
  33. property Value: TYAMLData Read GetValue;
  34. published
  35. procedure TestCreate;
  36. procedure TestEmptyDocument;
  37. procedure TestVersionEmptyDocument;
  38. procedure TestMultiDocument;
  39. procedure TestMultiDocumentNoEnd;
  40. procedure TestMultiDocumentSingle;
  41. procedure TestScalar;
  42. procedure TestAnchoredScalar;
  43. procedure TestAlias;
  44. procedure TestBlockSequence;
  45. procedure TestBlockSequenceTwo;
  46. procedure TestBlockSequenceThree;
  47. procedure TestBlockSequenceNested;
  48. procedure TestBlockSequenceNestedBetween;
  49. procedure TestFlowSequence;
  50. procedure TestFlowSequenceTwo;
  51. procedure TestFlowSequenceThree;
  52. procedure TestFlowSequenceNestedBetween;
  53. procedure TestBlockMapping;
  54. procedure TestBlockMappingTwo;
  55. procedure TestBlockMappingThree;
  56. procedure TestBlockMappingNested;
  57. procedure TestBlockMappingNestedDouble;
  58. procedure TestBlockMappingUnindentedSequence;
  59. procedure TestBlockMappingUnindentedSequenceWithIndent;
  60. procedure TestBlockMappingFlowSequence;
  61. procedure TestFlowMapping;
  62. procedure TestFlowMappingOne;
  63. procedure TestFlowMappingTwo;
  64. procedure TestFlowMappingNested;
  65. end;
  66. implementation
  67. procedure TTestYamlParser.TestCreate;
  68. begin
  69. Parse(['one']);
  70. AssertNotNull('Parser',Parser);
  71. AssertNotNull('Data',Data);
  72. AssertNotNull('YAML',YAML);
  73. AssertNotNull('Document',Document);
  74. AssertNotNUll('Value');
  75. end;
  76. procedure TTestYamlParser.TestScalar;
  77. begin
  78. Parse(['one']);
  79. AssertNotNull('Parser',Parser);
  80. AssertNotNull('Data',Data);
  81. AssertEquals('YAML Stream',TYAMLStream,Data.ClassType);
  82. AssertEquals('YAML Stream item count',1,YAML.Count);
  83. AssertNotNull('Document',Document);
  84. AssertNotNUll('Value');
  85. AssertEquals('Value ',TYAMLScalar,Value.ClassType);
  86. AssertEquals('Value ','one',Value.AsString);
  87. end;
  88. procedure TTestYamlParser.TestAnchoredScalar;
  89. begin
  90. Parse(['&anchor one']);
  91. AssertNotNull('Parser',Parser);
  92. AssertNotNull('Data',Data);
  93. AssertEquals('YAML Stream',TYAMLStream,Data.ClassType);
  94. AssertEquals('YAML Stream item count',1,YAML.Count);
  95. AssertNotNull('Document',Document);
  96. AssertScalar('Value',Value,yttString,'one');
  97. AssertNotNUll('Value',Value);
  98. AssertEquals('Value ',TYAMLScalar,Value.ClassType);
  99. AssertEquals('Value valua ','one',Value.AsString);
  100. AssertEquals('Value ','anchor',Value.Anchor);
  101. end;
  102. procedure TTestYamlParser.TestAlias;
  103. var
  104. Seq : TYAMLSequence;
  105. lItem : TYAMLScalar;
  106. begin
  107. Parse(['- &anchor one','- *anchor ']);
  108. Seq:=AssertSequence('Value',Value,2);
  109. lItem:=AssertScalar('First',Seq[0],yttString,'one');
  110. AssertEquals('first has anchor','anchor',lItem.Anchor);
  111. lItem:=AssertScalar('Second',Seq[1],yttString,'one');
  112. AssertEquals('second has no anchor','',lItem.Anchor);
  113. end;
  114. function TTestYamlParser.AssertValue(aClass : TYAMLDataClass) : TYAMLData;
  115. begin
  116. AssertNotNull('Data',Data);
  117. AssertEquals('YAML Stream',TYAMLStream,Data.ClassType);
  118. AssertEquals('YAML Stream item count',1,YAML.Count);
  119. AssertNotNull('Document',Document);
  120. AssertTrue('Document not empty',Document.Count>0);
  121. AssertEquals('Value class',aClass,Document.Items[0].ClassType);
  122. Result:=Value;
  123. end;
  124. procedure TTestYamlParser.TestBlockSequence;
  125. var
  126. Seq : TYAMLSequence;
  127. begin
  128. Parse(['- one']);
  129. Seq:=TYAMLSequence(AssertValue(TYAMLSequence));
  130. AssertTrue('Correct sequence kind',yckBlock=seq.Kind);
  131. AssertEquals('element count',1,Seq.Count);
  132. AssertScalar('First',Seq.Items[0],yttString,'one');
  133. end;
  134. procedure TTestYamlParser.TestBlockSequenceTwo;
  135. var
  136. Seq : TYAMLSequence;
  137. begin
  138. Parse(['- one','- two']);
  139. Seq:=TYAMLSequence(AssertValue(TYAMLSequence));
  140. AssertTrue('Correct sequence kind',yckBlock=seq.Kind);
  141. AssertEquals('Element count',2,Seq.Count);
  142. AssertScalar('First',Seq.Items[0],yttString,'one');
  143. AssertScalar('Second',Seq.Items[1],yttString,'two');
  144. end;
  145. procedure TTestYamlParser.TestBlockSequenceThree;
  146. var
  147. Seq : TYAMLSequence;
  148. begin
  149. Parse(['- one','- two','- three']);
  150. Seq:=TYAMLSequence(AssertValue(TYAMLSequence));
  151. AssertEquals('Element count',3,Seq.Count);
  152. AssertScalar('First',Seq.Items[0],yttString,'one');
  153. AssertScalar('Second',Seq.Items[1],yttString,'two');
  154. AssertScalar('Third',Seq.Items[2],yttString,'three');
  155. end;
  156. procedure TTestYamlParser.TestBlockSequenceNested;
  157. var
  158. Seq : TYAMLSequence;
  159. begin
  160. Parse(['- one','-',' - a',' - b']);
  161. Seq:=TYAMLSequence(AssertValue(TYAMLSequence));
  162. AssertTrue('Correct sequence kind',yckBlock=seq.Kind);
  163. AssertEquals('Element count',2,Seq.Count);
  164. AssertScalar('First',Seq.Items[0],yttString,'one');
  165. AssertEquals('Sequence',TYAMLSequence,Seq.Items[1].ClassType);
  166. Seq:=TYAMLSequence(Seq.Items[1]);
  167. AssertEquals('Element count',2,Seq.Count);
  168. AssertScalar('2 - 1',Seq.Items[0],yttString,'a');
  169. AssertScalar('2 - 2',Seq.Items[1],yttString,'b');
  170. end;
  171. procedure TTestYamlParser.TestBlockSequenceNestedBetween;
  172. var
  173. Seq : TYAMLSequence;
  174. begin
  175. Parse(['- one','-',' - a',' - b','- two']);
  176. Seq:=TYAMLSequence(AssertValue(TYAMLSequence));
  177. AssertTrue('Correct sequence kind',yckBlock=seq.Kind);
  178. AssertEquals('Element count',3,Seq.Count);
  179. AssertScalar('First',Seq.Items[0],yttString,'one');
  180. AssertScalar('Third',Seq.Items[2],yttString,'two');
  181. AssertEquals('Sequence',TYAMLSequence,Seq.Items[1].ClassType);
  182. Seq:=TYAMLSequence(Seq.Items[1]);
  183. AssertEquals('Element count',2,Seq.Count);
  184. AssertScalar('2 - 1',Seq.Items[0],yttString,'a');
  185. AssertScalar('2 - 2',Seq.Items[1],yttString,'b');
  186. end;
  187. procedure TTestYamlParser.TestFlowSequence;
  188. var
  189. Seq : TYAMLSequence;
  190. begin
  191. Parse(['[one]']);
  192. Seq:=TYAMLSequence(AssertValue(TYAMLSequence));
  193. AssertTrue('Correct sequence kind',yckFlow=seq.Kind);
  194. AssertEquals('element count',1,Seq.Count);
  195. AssertScalar('First',Seq.Items[0],yttString,'one');
  196. end;
  197. procedure TTestYamlParser.TestFlowSequenceTwo;
  198. var
  199. Seq : TYAMLSequence;
  200. begin
  201. Parse(['[one,two]']);
  202. Seq:=TYAMLSequence(AssertValue(TYAMLSequence));
  203. AssertEquals('element count',2,Seq.Count);
  204. AssertScalar('First',Seq.Items[0],yttString,'one');
  205. AssertScalar('Second',Seq.Items[1],yttString,'two');
  206. end;
  207. procedure TTestYamlParser.TestFlowSequenceThree;
  208. var
  209. Seq : TYAMLSequence;
  210. begin
  211. Parse(['[one,two,','three]']);
  212. Seq:=TYAMLSequence(AssertValue(TYAMLSequence));
  213. AssertTrue('Correct sequence kind',yckFlow=seq.Kind);
  214. AssertEquals('element count',3,Seq.Count);
  215. AssertScalar('First',Seq.Items[0],yttString,'one');
  216. AssertScalar('Second',Seq.Items[1],yttString,'two');
  217. AssertScalar('Third',Seq.Items[2],yttString,'three');
  218. end;
  219. procedure TTestYamlParser.TestFlowSequenceNestedBetween;
  220. var
  221. Seq : TYAMLSequence;
  222. begin
  223. Parse(['[one ','[a,b]',',two]']);
  224. Seq:=TYAMLSequence(AssertValue(TYAMLSequence));
  225. AssertEquals('Element count',3,Seq.Count);
  226. AssertScalar('First',Seq.Items[0],yttString,'one');
  227. AssertScalar('Third',Seq.Items[2],yttString,'two');
  228. AssertEquals('Sequence',TYAMLSequence,Seq.Items[1].ClassType);
  229. Seq:=TYAMLSequence(Seq.Items[1]);
  230. AssertEquals('Element count',2,Seq.Count);
  231. AssertScalar('2 - 1',Seq.Items[0],yttString,'a');
  232. AssertScalar('2 - 2',Seq.Items[1],yttString,'b');
  233. end;
  234. procedure TTestYamlParser.TestBlockMapping;
  235. var
  236. Map : TYAMLMapping;
  237. begin
  238. Parse(['one: two']);
  239. Map:=TYAMLMapping(AssertValue(TYAMLMapping));
  240. AssertTrue('Correct kind',Map.Kind=yckBlock);
  241. AssertEquals('Element count',1,Map.Count);
  242. AssertScalar('First key',Map.Key[0],yttString,'one');
  243. AssertScalar('First value',Map.Items[0],yttString,'two');
  244. end;
  245. procedure TTestYamlParser.TestBlockMappingTwo;
  246. var
  247. Map : TYAMLMapping;
  248. begin
  249. Parse(['one: two','three: four']);
  250. Map:=TYAMLMapping(AssertValue(TYAMLMapping));
  251. AssertTrue('Correct kind',Map.Kind=yckBlock);
  252. AssertEquals('Element count',2,Map.Count);
  253. AssertScalar('First key',Map.Key[0],yttString,'one');
  254. AssertScalar('First value',Map.Items[0],yttString,'two');
  255. AssertScalar('Second key',Map.Key[1],yttString,'three');
  256. AssertScalar('Second value',Map.Items[1],yttString,'four');
  257. end;
  258. procedure TTestYamlParser.TestBlockMappingThree;
  259. var
  260. Map : TYAMLMapping;
  261. begin
  262. Parse(['one: two','three: four','five: six']);
  263. Map:=TYAMLMapping(AssertValue(TYAMLMapping));
  264. AssertEquals('Element count',3,Map.Count);
  265. AssertScalar('First key',Map.Key[0],yttString,'one');
  266. AssertScalar('First value',Map.Items[0],yttString,'two');
  267. AssertScalar('Second key',Map.Key[1],yttString,'three');
  268. AssertScalar('Second value',Map.Items[1],yttString,'four');
  269. AssertScalar('third key',Map.Key[2],yttString,'five');
  270. AssertScalar('third value',Map.Items[2],yttString,'six');
  271. end;
  272. procedure TTestYamlParser.TestBlockMappingNested;
  273. var
  274. Map : TYAMLMapping;
  275. begin
  276. Parse(['one: two','three:',' five: six',' seven: eight']);
  277. Map:=TYAMLMapping(AssertValue(TYAMLMapping));
  278. AssertTrue('Correct kind',Map.Kind=yckBlock);
  279. AssertEquals('Element count',2,Map.Count);
  280. AssertScalar('First key',Map.Key[0],yttString,'one');
  281. AssertScalar('First value',Map.Items[0],yttString,'two');
  282. AssertScalar('Second key',Map.Key[1],yttString,'three');
  283. AssertEquals('Map',TYAMLMapping,Map.Items[1].ClassType);
  284. Map:=TYAMLMapping(Map.Items[1]);
  285. AssertEquals('Element count',2,Map.Count);
  286. AssertScalar('2 - First key',Map.Key[0],yttString,'five');
  287. AssertScalar('2 - first value',Map.Items[0],yttString,'six');
  288. AssertScalar('2 - Second key',Map.Key[1],yttString,'seven');
  289. AssertScalar('2 - second value',Map.Items[1],yttString,'eight');
  290. end;
  291. procedure TTestYamlParser.TestBlockMappingNestedDouble;
  292. var
  293. Map,Map2 : TYAMLMapping;
  294. begin
  295. Parse(['one: 1',
  296. 'two:',
  297. ' three:',
  298. ' four: 4',
  299. ' five: 5',
  300. ' six: 6']);
  301. Map:=TYAMLMapping(AssertValue(TYAMLMapping));
  302. AssertTrue('Correct kind',Map.Kind=yckBlock);
  303. AssertEquals('Element count',2,Map.Count);
  304. AssertScalar('First key',Map.Key[0],yttString,'one');
  305. AssertScalar('First value',Map.Items[0],yttInteger,'1');
  306. AssertScalar('Second key',Map.Key[1],yttString,'two');
  307. AssertEquals('Map',TYAMLMapping,Map.Items[1].ClassType);
  308. Map:=TYAMLMapping(Map.Items[1]);
  309. AssertEquals('Element count',2,Map.Count);
  310. AssertScalar('2 - First key',Map.Key[0],yttString,'three');
  311. AssertEquals('2 - first value is Map',TYAMLMapping,Map.Items[0].ClassType);
  312. Map2:=TYAMLMapping(Map.Items[0]);
  313. AssertEquals('Element count',2,Map2.Count);
  314. AssertScalar('3 - First key',Map2.Key[0],yttString,'four');
  315. AssertScalar('3 - First value',Map2.items[0],yttInteger,'4');
  316. AssertScalar('3 - second key',Map2.Key[1],yttString,'five');
  317. AssertScalar('3 - second value',Map2.items[1],yttInteger,'5');
  318. AssertScalar('2 - Second key',Map.Key[1],yttString,'six');
  319. AssertScalar('2 - second value',Map.Items[1],yttInteger,'6');
  320. end;
  321. procedure TTestYamlParser.TestBlockMappingUnindentedSequence;
  322. var
  323. seq : TYAMLSequence;
  324. map : TYAMLMapping;
  325. begin
  326. Parse(['one:',
  327. '- a',
  328. '- b',
  329. 'two: c']);
  330. Map:=TYAMLMapping(AssertValue(TYAMLMapping));
  331. AssertTrue('Correct kind',Map.Kind=yckBlock);
  332. AssertEquals('Element count',2,Map.Count);
  333. AssertScalar('1 - key',Map.Key[0],yttString,'one');
  334. AssertEquals('1 - item is Map',TYAMLSequence,Map.Items[0].ClassType);
  335. seq:=TYAMLSequence(Map.Items[0]);
  336. AssertEquals('> Element count',2,seq.Count);
  337. AssertScalar('> element - 1',seq.items[0],yttString,'a');
  338. AssertScalar('> element - 2',seq.items[1],yttString,'b');
  339. AssertScalar('2 - key',map.key[1],yttString,'two');
  340. AssertScalar('2 - item',map.items[1],yttString,'c');
  341. end;
  342. procedure TTestYamlParser.TestBlockMappingUnindentedSequenceWithIndent;
  343. var
  344. seq : TYAMLSequence;
  345. map1,map2,map3 : TYAMLMapping;
  346. begin
  347. Parse(['two:', // map1
  348. ' three:', // map 2
  349. ' four:', // map 3
  350. ' - enum', // enum ,
  351. ' five: a' // Map 2
  352. ]);
  353. Map1:=AssertMapping('1',AssertValue(TYAMLMapping));
  354. Map2:=AssertMapping('2',Map1.Items[0]);
  355. Map3:=AssertMapping('3',Map2.Items[0]);
  356. Seq:=AssertSequence('seq',Map3.Items[0]);
  357. AssertEquals('Seq count',1,Seq.Count);
  358. AssertEquals('map3 count',1,Map3.Count);
  359. AssertEquals('map2 count',2,Map2.Count);
  360. AssertScalar('map2 key 2',Map2.Key[1],yttString,'five');
  361. AssertScalar('map2 item 2',Map2[1],yttString,'a');
  362. end;
  363. procedure TTestYamlParser.TestBlockMappingFlowSequence;
  364. var
  365. seq : TYAMLSequence;
  366. map : TYAMLMapping;
  367. begin
  368. Parse(['one: []',
  369. 'two: c']);
  370. Map:=TYAMLMapping(AssertValue(TYAMLMapping));
  371. AssertTrue('Correct kind',Map.Kind=yckBlock);
  372. AssertEquals('Element count',2,Map.Count);
  373. AssertScalar('1 - key',Map.Key[0],yttString,'one');
  374. AssertEquals('1 - item is Map',TYAMLSequence,Map.Items[0].ClassType);
  375. seq:=TYAMLSequence(Map.Items[0]);
  376. AssertEquals('> Element count',0,seq.Count);
  377. // AssertScalar('> element - 1',seq.items[0],yttString,'a');
  378. // AssertScalar('> element - 2',seq.items[1],yttString,'b');
  379. // AssertScalar('2 - key',map.key[1],yttString,'two');
  380. AssertScalar('2 - key',map.key[1],yttString,'two');
  381. AssertScalar('2 - item',map.items[1],yttString,'c');
  382. end;
  383. procedure TTestYamlParser.TestFlowMapping;
  384. var
  385. Map : TYAMLMapping;
  386. begin
  387. Parse(['{ }']);
  388. Map:=TYAMLMapping(AssertValue(TYAMLMapping));
  389. AssertTrue('Correct kind',Map.Kind=yckFlow);
  390. AssertEquals('Element count',0,Map.Count);
  391. end;
  392. procedure TTestYamlParser.TestFlowMappingOne;
  393. var
  394. Map : TYAMLMapping;
  395. begin
  396. Parse(['{ one : two }']);
  397. Map:=TYAMLMapping(AssertValue(TYAMLMapping));
  398. AssertTrue('Correct kind',Map.Kind=yckFlow);
  399. AssertEquals('Element count',1,Map.Count);
  400. AssertScalar('First key',Map.Key[0],yttString,'one');
  401. AssertScalar('First value',Map.Items[0],yttString,'two');
  402. end;
  403. procedure TTestYamlParser.TestFlowMappingTwo;
  404. var
  405. Map : TYAMLMapping;
  406. begin
  407. Parse(['{ one : two, three: four }']);
  408. Map:=TYAMLMapping(AssertValue(TYAMLMapping));
  409. AssertTrue('Correct kind',Map.Kind=yckFlow);
  410. AssertEquals('Element count',2,Map.Count);
  411. AssertScalar('First key',Map.Key[0],yttString,'one');
  412. AssertScalar('First value',Map.Items[0],yttString,'two');
  413. AssertScalar('Second key',Map.Key[1],yttString,'three');
  414. AssertScalar('Second value',Map.Items[1],yttString,'four');
  415. end;
  416. procedure TTestYamlParser.TestFlowMappingNested;
  417. var
  418. Map : TYAMLMapping;
  419. begin
  420. Parse(['{ one: two ,three: { five: six , seven: eight} }']);
  421. Map:=TYAMLMapping(AssertValue(TYAMLMapping));
  422. AssertTrue('Correct kind',Map.Kind=yckFlow);
  423. AssertEquals('Element count',2,Map.Count);
  424. AssertScalar('First key',Map.Key[0],yttString,'one');
  425. AssertScalar('First value',Map.Items[0],yttString,'two');
  426. AssertScalar('Second key',Map.Key[1],yttString,'three');
  427. AssertEquals('Map',TYAMLMapping,Map.Items[1].ClassType);
  428. Map:=TYAMLMapping(Map.Items[1]);
  429. AssertEquals('Element count',2,Map.Count);
  430. AssertScalar('2 - First key',Map.Key[0],yttString,'five');
  431. AssertScalar('2 - first value',Map.Items[0],yttString,'six');
  432. AssertScalar('2 - Second key',Map.Key[1],yttString,'seven');
  433. AssertScalar('2 - second value',Map.Items[1],yttString,'eight');
  434. end;
  435. procedure TTestYamlParser.TestEmptyDocument;
  436. begin
  437. Parse(['---','...']);
  438. AssertNotNull('Data',Data);
  439. AssertEquals('YAML Stream',TYAMLStream,Data.ClassType);
  440. AssertEquals('YAML Stream item count',1,YAML.Count);
  441. AssertNotNull('Document',Document);
  442. AssertEquals('Document empty',0,Document.Count);
  443. end;
  444. procedure TTestYamlParser.TestVersionEmptyDocument;
  445. begin
  446. Parse(['%YAML 1.2','---','...']);
  447. AssertNotNull('Data',Data);
  448. AssertEquals('YAML Stream',TYAMLStream,Data.ClassType);
  449. AssertEquals('YAML Stream item count',1,YAML.Count);
  450. AssertNotNull('Document',Document);
  451. AssertEquals('Major',1,Document.Version.Major);
  452. AssertEquals('Minor',2,Document.Version.Minor);
  453. AssertEquals('Document empty',0,Document.Count);
  454. end;
  455. procedure TTestYamlParser.TestMultiDocument;
  456. var
  457. doc : TYAMLDocument;
  458. begin
  459. Parse(['%YAML 1.2','---','abc','...','---','def','...']);
  460. AssertNotNull('Data',Data);
  461. AssertEquals('YAML Stream',TYAMLStream,Data.ClassType);
  462. AssertEquals('YAML Stream item count',2,YAML.Count);
  463. AssertEquals('YAML Stream document count',2,YAML.DocumentCount);
  464. Doc:=YAML.Documents[0];
  465. AssertNotNull('Document 1',Doc);
  466. AssertEquals('Document 1 Major',1,Doc.Version.Major);
  467. AssertEquals('Document 1 Minor',2,Doc.Version.Minor);
  468. AssertEquals('Document 1 element count',1,Doc.Count);
  469. AssertScalar('Document 1 element',Doc[0],yttString,'abc');
  470. Doc:=YAML.Documents[1];
  471. AssertNotNull('Document 2',doc);
  472. AssertEquals('Document 2 element count',1,Doc.Count);
  473. AssertScalar('Document 2 element',Doc[0],yttString,'def');
  474. end;
  475. procedure TTestYamlParser.TestMultiDocumentNoEnd;
  476. var
  477. doc : TYAMLDocument;
  478. begin
  479. Parse(['abc','---','def']);
  480. AssertNotNull('Data',Data);
  481. AssertEquals('YAML Stream',TYAMLStream,Data.ClassType);
  482. AssertEquals('YAML Stream item count',2,YAML.Count);
  483. AssertEquals('YAML Stream document count',2,YAML.DocumentCount);
  484. Doc:=YAML.Documents[0];
  485. AssertNotNull('Document 1',Doc);
  486. AssertEquals('Document 1 element count',1,Doc.Count);
  487. AssertScalar('Document 1 element',Doc[0],yttString,'abc');
  488. Doc:=YAML.Documents[1];
  489. AssertNotNull('Document 2',doc);
  490. AssertEquals('Document 2 element count',1,Doc.Count);
  491. AssertScalar('Document 2 element',Doc[0],yttString,'def');
  492. end;
  493. procedure TTestYamlParser.TestMultiDocumentSingle;
  494. var
  495. doc : TYAMLDocument;
  496. begin
  497. FSingle:=True;
  498. Parse(['%YAML 1.2','---','abc','...','---','def','...']);
  499. AssertNotNull('Data',Data);
  500. AssertEquals('YAML Stream',TYAMLDocument,Data.ClassType);
  501. Doc:=TYAMLDocument(Data);
  502. AssertNotNull('Document 1',Doc);
  503. AssertEquals('Document 1 Major',1,Doc.Version.Major);
  504. AssertEquals('Document 1 Minor',2,Doc.Version.Minor);
  505. AssertEquals('Document 1 element count',1,Doc.Count);
  506. AssertScalar('Document 1 element',Doc[0],yttString,'abc');
  507. SetData(Parser.ParseSingleDocument);
  508. AssertEquals('YAML Stream',TYAMLDocument,Data.ClassType);
  509. Doc:=TYAMLDocument(Data);
  510. AssertNotNull('Document 2',doc);
  511. AssertEquals('Document 2 element count',1,Doc.Count);
  512. AssertScalar('Document 2 element',Doc[0],yttString,'def');
  513. end;
  514. function TTestYamlParser.GetDocument: TYAMLDocument;
  515. begin
  516. AssertTrue('Have documents',YAML.DocumentCount>0);
  517. Result:=YAML.Documents[0];
  518. end;
  519. function TTestYamlParser.GetStream: TYAMLStream;
  520. begin
  521. AssertTrue('Have stream',Data is TYAMLStream);
  522. Result:=Data as TYAMLStream;
  523. end;
  524. function TTestYamlParser.GetValue: TYAMLData;
  525. var
  526. Doc : TYAMLDocument;
  527. begin
  528. Doc:=GetDocument;
  529. AssertTrue('Have data',Doc.Count>0);
  530. Result:=Doc[0];
  531. end;
  532. procedure TTestYamlParser.Parse(aContent: array of string);
  533. begin
  534. FParser:=TYAMLParser.Create(aContent);
  535. if FSingle then
  536. SetData(FParser.ParseSingleDocument)
  537. else
  538. SetData(FParser.Parse);
  539. end;
  540. procedure TTestYamlParser.SetUp;
  541. begin
  542. Inherited;
  543. FParser:=Nil;
  544. end;
  545. procedure TTestYamlParser.TearDown;
  546. begin
  547. FreeAndNil(FParser);
  548. Inherited;
  549. end;
  550. initialization
  551. RegisterTest(TTestYamlParser);
  552. end.