node_test.go 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270
  1. //
  2. // Copyright (c) 2011-2019 Canonical Ltd
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. package yaml_test
  16. import (
  17. "bytes"
  18. "fmt"
  19. "os"
  20. . "gopkg.in/check.v1"
  21. "gopkg.in/yaml.v3"
  22. "io"
  23. "strings"
  24. )
  25. var nodeTests = []struct {
  26. yaml string
  27. node yaml.Node
  28. }{
  29. {
  30. "null\n",
  31. yaml.Node{
  32. Kind: yaml.DocumentNode,
  33. Line: 1,
  34. Column: 1,
  35. Content: []*yaml.Node{{
  36. Kind: yaml.ScalarNode,
  37. Value: "null",
  38. Tag: "!!null",
  39. Line: 1,
  40. Column: 1,
  41. }},
  42. },
  43. }, {
  44. "foo\n",
  45. yaml.Node{
  46. Kind: yaml.DocumentNode,
  47. Line: 1,
  48. Column: 1,
  49. Content: []*yaml.Node{{
  50. Kind: yaml.ScalarNode,
  51. Value: "foo",
  52. Tag: "!!str",
  53. Line: 1,
  54. Column: 1,
  55. }},
  56. },
  57. }, {
  58. "\"foo\"\n",
  59. yaml.Node{
  60. Kind: yaml.DocumentNode,
  61. Line: 1,
  62. Column: 1,
  63. Content: []*yaml.Node{{
  64. Kind: yaml.ScalarNode,
  65. Style: yaml.DoubleQuotedStyle,
  66. Value: "foo",
  67. Tag: "!!str",
  68. Line: 1,
  69. Column: 1,
  70. }},
  71. },
  72. }, {
  73. "'foo'\n",
  74. yaml.Node{
  75. Kind: yaml.DocumentNode,
  76. Line: 1,
  77. Column: 1,
  78. Content: []*yaml.Node{{
  79. Kind: yaml.ScalarNode,
  80. Style: yaml.SingleQuotedStyle,
  81. Value: "foo",
  82. Tag: "!!str",
  83. Line: 1,
  84. Column: 1,
  85. }},
  86. },
  87. }, {
  88. "!!str 123\n",
  89. yaml.Node{
  90. Kind: yaml.DocumentNode,
  91. Line: 1,
  92. Column: 1,
  93. Content: []*yaml.Node{{
  94. Kind: yaml.ScalarNode,
  95. Style: yaml.TaggedStyle,
  96. Value: "123",
  97. Tag: "!!str",
  98. Line: 1,
  99. Column: 1,
  100. }},
  101. },
  102. }, {
  103. // Although the node isn't TaggedStyle, dropping the tag would change the value.
  104. "[encode]!!binary gIGC\n",
  105. yaml.Node{
  106. Kind: yaml.DocumentNode,
  107. Line: 1,
  108. Column: 1,
  109. Content: []*yaml.Node{{
  110. Kind: yaml.ScalarNode,
  111. Value: "gIGC",
  112. Tag: "!!binary",
  113. Line: 1,
  114. Column: 1,
  115. }},
  116. },
  117. }, {
  118. // Item doesn't have a tag, but needs to be binary encoded due to its content.
  119. "[encode]!!binary gIGC\n",
  120. yaml.Node{
  121. Kind: yaml.DocumentNode,
  122. Line: 1,
  123. Column: 1,
  124. Content: []*yaml.Node{{
  125. Kind: yaml.ScalarNode,
  126. Value: "\x80\x81\x82",
  127. Line: 1,
  128. Column: 1,
  129. }},
  130. },
  131. }, {
  132. // Same, but with strings we can just quote them.
  133. "[encode]\"123\"\n",
  134. yaml.Node{
  135. Kind: yaml.DocumentNode,
  136. Line: 1,
  137. Column: 1,
  138. Content: []*yaml.Node{{
  139. Kind: yaml.ScalarNode,
  140. Value: "123",
  141. Tag: "!!str",
  142. Line: 1,
  143. Column: 1,
  144. }},
  145. },
  146. }, {
  147. "!tag:something 123\n",
  148. yaml.Node{
  149. Kind: yaml.DocumentNode,
  150. Line: 1,
  151. Column: 1,
  152. Content: []*yaml.Node{{
  153. Kind: yaml.ScalarNode,
  154. Style: yaml.TaggedStyle,
  155. Value: "123",
  156. Tag: "!tag:something",
  157. Line: 1,
  158. Column: 1,
  159. }},
  160. },
  161. }, {
  162. "[encode]!tag:something 123\n",
  163. yaml.Node{
  164. Kind: yaml.DocumentNode,
  165. Line: 1,
  166. Column: 1,
  167. Content: []*yaml.Node{{
  168. Kind: yaml.ScalarNode,
  169. Value: "123",
  170. Tag: "!tag:something",
  171. Line: 1,
  172. Column: 1,
  173. }},
  174. },
  175. }, {
  176. "!tag:something {}\n",
  177. yaml.Node{
  178. Kind: yaml.DocumentNode,
  179. Line: 1,
  180. Column: 1,
  181. Content: []*yaml.Node{{
  182. Kind: yaml.MappingNode,
  183. Style: yaml.TaggedStyle | yaml.FlowStyle,
  184. Tag: "!tag:something",
  185. Line: 1,
  186. Column: 1,
  187. }},
  188. },
  189. }, {
  190. "[encode]!tag:something {}\n",
  191. yaml.Node{
  192. Kind: yaml.DocumentNode,
  193. Line: 1,
  194. Column: 1,
  195. Content: []*yaml.Node{{
  196. Kind: yaml.MappingNode,
  197. Style: yaml.FlowStyle,
  198. Tag: "!tag:something",
  199. Line: 1,
  200. Column: 1,
  201. }},
  202. },
  203. }, {
  204. "!tag:something []\n",
  205. yaml.Node{
  206. Kind: yaml.DocumentNode,
  207. Line: 1,
  208. Column: 1,
  209. Content: []*yaml.Node{{
  210. Kind: yaml.SequenceNode,
  211. Style: yaml.TaggedStyle | yaml.FlowStyle,
  212. Tag: "!tag:something",
  213. Line: 1,
  214. Column: 1,
  215. }},
  216. },
  217. }, {
  218. "[encode]!tag:something []\n",
  219. yaml.Node{
  220. Kind: yaml.DocumentNode,
  221. Line: 1,
  222. Column: 1,
  223. Content: []*yaml.Node{{
  224. Kind: yaml.SequenceNode,
  225. Style: yaml.FlowStyle,
  226. Tag: "!tag:something",
  227. Line: 1,
  228. Column: 1,
  229. }},
  230. },
  231. }, {
  232. "''\n",
  233. yaml.Node{
  234. Kind: yaml.DocumentNode,
  235. Line: 1,
  236. Column: 1,
  237. Content: []*yaml.Node{{
  238. Kind: yaml.ScalarNode,
  239. Style: yaml.SingleQuotedStyle,
  240. Value: "",
  241. Tag: "!!str",
  242. Line: 1,
  243. Column: 1,
  244. }},
  245. },
  246. }, {
  247. "|\n foo\n bar\n",
  248. yaml.Node{
  249. Kind: yaml.DocumentNode,
  250. Line: 1,
  251. Column: 1,
  252. Content: []*yaml.Node{{
  253. Kind: yaml.ScalarNode,
  254. Style: yaml.LiteralStyle,
  255. Value: "foo\nbar\n",
  256. Tag: "!!str",
  257. Line: 1,
  258. Column: 1,
  259. }},
  260. },
  261. }, {
  262. "true\n",
  263. yaml.Node{
  264. Kind: yaml.DocumentNode,
  265. Line: 1,
  266. Column: 1,
  267. Content: []*yaml.Node{{
  268. Kind: yaml.ScalarNode,
  269. Value: "true",
  270. Tag: "!!bool",
  271. Line: 1,
  272. Column: 1,
  273. }},
  274. },
  275. }, {
  276. "-10\n",
  277. yaml.Node{
  278. Kind: yaml.DocumentNode,
  279. Line: 1,
  280. Column: 1,
  281. Content: []*yaml.Node{{
  282. Kind: yaml.ScalarNode,
  283. Value: "-10",
  284. Tag: "!!int",
  285. Line: 1,
  286. Column: 1,
  287. }},
  288. },
  289. }, {
  290. "4294967296\n",
  291. yaml.Node{
  292. Kind: yaml.DocumentNode,
  293. Line: 1,
  294. Column: 1,
  295. Content: []*yaml.Node{{
  296. Kind: yaml.ScalarNode,
  297. Value: "4294967296",
  298. Tag: "!!int",
  299. Line: 1,
  300. Column: 1,
  301. }},
  302. },
  303. }, {
  304. "0.1000\n",
  305. yaml.Node{
  306. Kind: yaml.DocumentNode,
  307. Line: 1,
  308. Column: 1,
  309. Content: []*yaml.Node{{
  310. Kind: yaml.ScalarNode,
  311. Value: "0.1000",
  312. Tag: "!!float",
  313. Line: 1,
  314. Column: 1,
  315. }},
  316. },
  317. }, {
  318. "-.inf\n",
  319. yaml.Node{
  320. Kind: yaml.DocumentNode,
  321. Line: 1,
  322. Column: 1,
  323. Content: []*yaml.Node{{
  324. Kind: yaml.ScalarNode,
  325. Value: "-.inf",
  326. Tag: "!!float",
  327. Line: 1,
  328. Column: 1,
  329. }},
  330. },
  331. }, {
  332. ".nan\n",
  333. yaml.Node{
  334. Kind: yaml.DocumentNode,
  335. Line: 1,
  336. Column: 1,
  337. Content: []*yaml.Node{{
  338. Kind: yaml.ScalarNode,
  339. Value: ".nan",
  340. Tag: "!!float",
  341. Line: 1,
  342. Column: 1,
  343. }},
  344. },
  345. }, {
  346. "{}\n",
  347. yaml.Node{
  348. Kind: yaml.DocumentNode,
  349. Line: 1,
  350. Column: 1,
  351. Content: []*yaml.Node{{
  352. Kind: yaml.MappingNode,
  353. Style: yaml.FlowStyle,
  354. Value: "",
  355. Tag: "!!map",
  356. Line: 1,
  357. Column: 1,
  358. }},
  359. },
  360. }, {
  361. "a: b c\n",
  362. yaml.Node{
  363. Kind: yaml.DocumentNode,
  364. Line: 1,
  365. Column: 1,
  366. Content: []*yaml.Node{{
  367. Kind: yaml.MappingNode,
  368. Value: "",
  369. Tag: "!!map",
  370. Line: 1,
  371. Column: 1,
  372. Content: []*yaml.Node{{
  373. Kind: yaml.ScalarNode,
  374. Value: "a",
  375. Tag: "!!str",
  376. Line: 1,
  377. Column: 1,
  378. }, {
  379. Kind: yaml.ScalarNode,
  380. Value: "b c",
  381. Tag: "!!str",
  382. Line: 1,
  383. Column: 4,
  384. }},
  385. }},
  386. },
  387. }, {
  388. "a:\n b: c\n d: e\n",
  389. yaml.Node{
  390. Kind: yaml.DocumentNode,
  391. Line: 1,
  392. Column: 1,
  393. Content: []*yaml.Node{{
  394. Kind: yaml.MappingNode,
  395. Tag: "!!map",
  396. Line: 1,
  397. Column: 1,
  398. Content: []*yaml.Node{{
  399. Kind: yaml.ScalarNode,
  400. Value: "a",
  401. Tag: "!!str",
  402. Line: 1,
  403. Column: 1,
  404. }, {
  405. Kind: yaml.MappingNode,
  406. Tag: "!!map",
  407. Line: 2,
  408. Column: 3,
  409. Content: []*yaml.Node{{
  410. Kind: yaml.ScalarNode,
  411. Value: "b",
  412. Tag: "!!str",
  413. Line: 2,
  414. Column: 3,
  415. }, {
  416. Kind: yaml.ScalarNode,
  417. Value: "c",
  418. Tag: "!!str",
  419. Line: 2,
  420. Column: 6,
  421. }, {
  422. Kind: yaml.ScalarNode,
  423. Value: "d",
  424. Tag: "!!str",
  425. Line: 3,
  426. Column: 3,
  427. }, {
  428. Kind: yaml.ScalarNode,
  429. Value: "e",
  430. Tag: "!!str",
  431. Line: 3,
  432. Column: 6,
  433. }},
  434. }},
  435. }},
  436. },
  437. }, {
  438. "a:\n- b: c\n d: e\n",
  439. yaml.Node{
  440. Kind: yaml.DocumentNode,
  441. Line: 1,
  442. Column: 1,
  443. Content: []*yaml.Node{{
  444. Kind: yaml.MappingNode,
  445. Tag: "!!map",
  446. Line: 1,
  447. Column: 1,
  448. Content: []*yaml.Node{{
  449. Kind: yaml.ScalarNode,
  450. Value: "a",
  451. Tag: "!!str",
  452. Line: 1,
  453. Column: 1,
  454. }, {
  455. Kind: yaml.SequenceNode,
  456. Tag: "!!seq",
  457. Line: 2,
  458. Column: 1,
  459. Content: []*yaml.Node{{
  460. Kind: yaml.MappingNode,
  461. Tag: "!!map",
  462. Line: 2,
  463. Column: 3,
  464. Content: []*yaml.Node{{
  465. Kind: yaml.ScalarNode,
  466. Value: "b",
  467. Tag: "!!str",
  468. Line: 2,
  469. Column: 3,
  470. }, {
  471. Kind: yaml.ScalarNode,
  472. Value: "c",
  473. Tag: "!!str",
  474. Line: 2,
  475. Column: 6,
  476. }, {
  477. Kind: yaml.ScalarNode,
  478. Value: "d",
  479. Tag: "!!str",
  480. Line: 3,
  481. Column: 3,
  482. }, {
  483. Kind: yaml.ScalarNode,
  484. Value: "e",
  485. Tag: "!!str",
  486. Line: 3,
  487. Column: 6,
  488. }},
  489. }},
  490. }},
  491. }},
  492. },
  493. }, {
  494. "a: # AI\n- b\nc:\n- d\n",
  495. yaml.Node{
  496. Kind: yaml.DocumentNode,
  497. Line: 1,
  498. Column: 1,
  499. Content: []*yaml.Node{{
  500. Kind: yaml.MappingNode,
  501. Tag: "!!map",
  502. Line: 1,
  503. Column: 1,
  504. Content: []*yaml.Node{{
  505. Kind: yaml.ScalarNode,
  506. Tag: "!!str",
  507. Value: "a",
  508. LineComment: "# AI",
  509. Line: 1,
  510. Column: 1,
  511. }, {
  512. Kind: yaml.SequenceNode,
  513. Tag: "!!seq",
  514. Content: []*yaml.Node{{
  515. Kind: yaml.ScalarNode,
  516. Tag: "!!str",
  517. Value: "b",
  518. Line: 2,
  519. Column: 3,
  520. }},
  521. Line: 2,
  522. Column: 1,
  523. }, {
  524. Kind: yaml.ScalarNode,
  525. Tag: "!!str",
  526. Value: "c",
  527. Line: 3,
  528. Column: 1,
  529. }, {
  530. Kind: yaml.SequenceNode,
  531. Tag: "!!seq",
  532. Content: []*yaml.Node{{
  533. Kind: yaml.ScalarNode,
  534. Tag: "!!str",
  535. Value: "d",
  536. Line: 4,
  537. Column: 3,
  538. }},
  539. Line: 4,
  540. Column: 1,
  541. }},
  542. }},
  543. },
  544. }, {
  545. "- a\n- b\n",
  546. yaml.Node{
  547. Kind: yaml.DocumentNode,
  548. Line: 1,
  549. Column: 1,
  550. Content: []*yaml.Node{{
  551. Kind: yaml.SequenceNode,
  552. Value: "",
  553. Tag: "!!seq",
  554. Line: 1,
  555. Column: 1,
  556. Content: []*yaml.Node{{
  557. Kind: yaml.ScalarNode,
  558. Value: "a",
  559. Tag: "!!str",
  560. Line: 1,
  561. Column: 3,
  562. }, {
  563. Kind: yaml.ScalarNode,
  564. Value: "b",
  565. Tag: "!!str",
  566. Line: 2,
  567. Column: 3,
  568. }},
  569. }},
  570. },
  571. }, {
  572. "- a\n- - b\n - c\n",
  573. yaml.Node{
  574. Kind: yaml.DocumentNode,
  575. Line: 1,
  576. Column: 1,
  577. Content: []*yaml.Node{{
  578. Kind: yaml.SequenceNode,
  579. Tag: "!!seq",
  580. Line: 1,
  581. Column: 1,
  582. Content: []*yaml.Node{{
  583. Kind: yaml.ScalarNode,
  584. Value: "a",
  585. Tag: "!!str",
  586. Line: 1,
  587. Column: 3,
  588. }, {
  589. Kind: yaml.SequenceNode,
  590. Tag: "!!seq",
  591. Line: 2,
  592. Column: 3,
  593. Content: []*yaml.Node{{
  594. Kind: yaml.ScalarNode,
  595. Value: "b",
  596. Tag: "!!str",
  597. Line: 2,
  598. Column: 5,
  599. }, {
  600. Kind: yaml.ScalarNode,
  601. Value: "c",
  602. Tag: "!!str",
  603. Line: 3,
  604. Column: 5,
  605. }},
  606. }},
  607. }},
  608. },
  609. }, {
  610. "[a, b]\n",
  611. yaml.Node{
  612. Kind: yaml.DocumentNode,
  613. Line: 1,
  614. Column: 1,
  615. Content: []*yaml.Node{{
  616. Kind: yaml.SequenceNode,
  617. Style: yaml.FlowStyle,
  618. Value: "",
  619. Tag: "!!seq",
  620. Line: 1,
  621. Column: 1,
  622. Content: []*yaml.Node{{
  623. Kind: yaml.ScalarNode,
  624. Value: "a",
  625. Tag: "!!str",
  626. Line: 1,
  627. Column: 2,
  628. }, {
  629. Kind: yaml.ScalarNode,
  630. Value: "b",
  631. Tag: "!!str",
  632. Line: 1,
  633. Column: 5,
  634. }},
  635. }},
  636. },
  637. }, {
  638. "- a\n- [b, c]\n",
  639. yaml.Node{
  640. Kind: yaml.DocumentNode,
  641. Line: 1,
  642. Column: 1,
  643. Content: []*yaml.Node{{
  644. Kind: yaml.SequenceNode,
  645. Tag: "!!seq",
  646. Line: 1,
  647. Column: 1,
  648. Content: []*yaml.Node{{
  649. Kind: yaml.ScalarNode,
  650. Value: "a",
  651. Tag: "!!str",
  652. Line: 1,
  653. Column: 3,
  654. }, {
  655. Kind: yaml.SequenceNode,
  656. Tag: "!!seq",
  657. Style: yaml.FlowStyle,
  658. Line: 2,
  659. Column: 3,
  660. Content: []*yaml.Node{{
  661. Kind: yaml.ScalarNode,
  662. Value: "b",
  663. Tag: "!!str",
  664. Line: 2,
  665. Column: 4,
  666. }, {
  667. Kind: yaml.ScalarNode,
  668. Value: "c",
  669. Tag: "!!str",
  670. Line: 2,
  671. Column: 7,
  672. }},
  673. }},
  674. }},
  675. },
  676. }, {
  677. "a: &x 1\nb: &y 2\nc: *x\nd: *y\n",
  678. yaml.Node{
  679. Kind: yaml.DocumentNode,
  680. Line: 1,
  681. Column: 1,
  682. Content: []*yaml.Node{{
  683. Kind: yaml.MappingNode,
  684. Line: 1,
  685. Column: 1,
  686. Tag: "!!map",
  687. Content: []*yaml.Node{{
  688. Kind: yaml.ScalarNode,
  689. Value: "a",
  690. Tag: "!!str",
  691. Line: 1,
  692. Column: 1,
  693. },
  694. saveNode("x", &yaml.Node{
  695. Kind: yaml.ScalarNode,
  696. Value: "1",
  697. Tag: "!!int",
  698. Anchor: "x",
  699. Line: 1,
  700. Column: 4,
  701. }),
  702. {
  703. Kind: yaml.ScalarNode,
  704. Value: "b",
  705. Tag: "!!str",
  706. Line: 2,
  707. Column: 1,
  708. },
  709. saveNode("y", &yaml.Node{
  710. Kind: yaml.ScalarNode,
  711. Value: "2",
  712. Tag: "!!int",
  713. Anchor: "y",
  714. Line: 2,
  715. Column: 4,
  716. }),
  717. {
  718. Kind: yaml.ScalarNode,
  719. Value: "c",
  720. Tag: "!!str",
  721. Line: 3,
  722. Column: 1,
  723. }, {
  724. Kind: yaml.AliasNode,
  725. Value: "x",
  726. Alias: dropNode("x"),
  727. Line: 3,
  728. Column: 4,
  729. }, {
  730. Kind: yaml.ScalarNode,
  731. Value: "d",
  732. Tag: "!!str",
  733. Line: 4,
  734. Column: 1,
  735. }, {
  736. Kind: yaml.AliasNode,
  737. Value: "y",
  738. Tag: "",
  739. Alias: dropNode("y"),
  740. Line: 4,
  741. Column: 4,
  742. }},
  743. }},
  744. },
  745. }, {
  746. "# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  747. yaml.Node{
  748. Kind: yaml.DocumentNode,
  749. Line: 3,
  750. Column: 1,
  751. Content: []*yaml.Node{{
  752. Kind: yaml.ScalarNode,
  753. Value: "true",
  754. Tag: "!!bool",
  755. Line: 3,
  756. Column: 1,
  757. HeadComment: "# One\n# Two",
  758. LineComment: "# Three",
  759. FootComment: "# Four\n# Five",
  760. }},
  761. },
  762. }, {
  763. "[decode]\n# One\n\n# Two\n\n# Three\ntrue # Four\n# Five\n\n# Six\n\n# Seven\n",
  764. yaml.Node{
  765. Kind: yaml.DocumentNode,
  766. Line: 7,
  767. Column: 1,
  768. HeadComment: "# One\n\n# Two",
  769. FootComment: "# Six\n\n# Seven",
  770. Content: []*yaml.Node{{
  771. Kind: yaml.ScalarNode,
  772. Value: "true",
  773. Tag: "!!bool",
  774. Line: 7,
  775. Column: 1,
  776. HeadComment: "# Three",
  777. LineComment: "# Four",
  778. FootComment: "# Five",
  779. }},
  780. },
  781. }, {
  782. // Write out the pound character if missing from comments.
  783. "[encode]# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  784. yaml.Node{
  785. Kind: yaml.DocumentNode,
  786. Line: 3,
  787. Column: 1,
  788. Content: []*yaml.Node{{
  789. Kind: yaml.ScalarNode,
  790. Value: "true",
  791. Tag: "!!bool",
  792. Line: 3,
  793. Column: 1,
  794. HeadComment: "One\nTwo\n",
  795. LineComment: "Three\n",
  796. FootComment: "Four\nFive\n",
  797. }},
  798. },
  799. }, {
  800. "[encode]# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  801. yaml.Node{
  802. Kind: yaml.DocumentNode,
  803. Line: 3,
  804. Column: 1,
  805. Content: []*yaml.Node{{
  806. Kind: yaml.ScalarNode,
  807. Value: "true",
  808. Tag: "!!bool",
  809. Line: 3,
  810. Column: 1,
  811. HeadComment: " One\n Two",
  812. LineComment: " Three",
  813. FootComment: " Four\n Five",
  814. }},
  815. },
  816. }, {
  817. "# DH1\n\n# DH2\n\n# H1\n# H2\ntrue # I\n# F1\n# F2\n\n# DF1\n\n# DF2\n",
  818. yaml.Node{
  819. Kind: yaml.DocumentNode,
  820. Line: 7,
  821. Column: 1,
  822. HeadComment: "# DH1\n\n# DH2",
  823. FootComment: "# DF1\n\n# DF2",
  824. Content: []*yaml.Node{{
  825. Kind: yaml.ScalarNode,
  826. Value: "true",
  827. Tag: "!!bool",
  828. Line: 7,
  829. Column: 1,
  830. HeadComment: "# H1\n# H2",
  831. LineComment: "# I",
  832. FootComment: "# F1\n# F2",
  833. }},
  834. },
  835. }, {
  836. "# DH1\n\n# DH2\n\n# HA1\n# HA2\nka: va # IA\n# FA1\n# FA2\n\n# HB1\n# HB2\nkb: vb # IB\n# FB1\n# FB2\n\n# DF1\n\n# DF2\n",
  837. yaml.Node{
  838. Kind: yaml.DocumentNode,
  839. Line: 7,
  840. Column: 1,
  841. HeadComment: "# DH1\n\n# DH2",
  842. FootComment: "# DF1\n\n# DF2",
  843. Content: []*yaml.Node{{
  844. Kind: yaml.MappingNode,
  845. Tag: "!!map",
  846. Line: 7,
  847. Column: 1,
  848. Content: []*yaml.Node{{
  849. Kind: yaml.ScalarNode,
  850. Line: 7,
  851. Column: 1,
  852. Tag: "!!str",
  853. Value: "ka",
  854. HeadComment: "# HA1\n# HA2",
  855. FootComment: "# FA1\n# FA2",
  856. }, {
  857. Kind: yaml.ScalarNode,
  858. Line: 7,
  859. Column: 5,
  860. Tag: "!!str",
  861. Value: "va",
  862. LineComment: "# IA",
  863. }, {
  864. Kind: yaml.ScalarNode,
  865. Line: 13,
  866. Column: 1,
  867. Tag: "!!str",
  868. Value: "kb",
  869. HeadComment: "# HB1\n# HB2",
  870. FootComment: "# FB1\n# FB2",
  871. }, {
  872. Kind: yaml.ScalarNode,
  873. Line: 13,
  874. Column: 5,
  875. Tag: "!!str",
  876. Value: "vb",
  877. LineComment: "# IB",
  878. }},
  879. }},
  880. },
  881. }, {
  882. "# DH1\n\n# DH2\n\n# HA1\n# HA2\n- la # IA\n# FA1\n# FA2\n\n# HB1\n# HB2\n- lb # IB\n# FB1\n# FB2\n\n# DF1\n\n# DF2\n",
  883. yaml.Node{
  884. Kind: yaml.DocumentNode,
  885. Line: 7,
  886. Column: 1,
  887. HeadComment: "# DH1\n\n# DH2",
  888. FootComment: "# DF1\n\n# DF2",
  889. Content: []*yaml.Node{{
  890. Kind: yaml.SequenceNode,
  891. Tag: "!!seq",
  892. Line: 7,
  893. Column: 1,
  894. Content: []*yaml.Node{{
  895. Kind: yaml.ScalarNode,
  896. Tag: "!!str",
  897. Line: 7,
  898. Column: 3,
  899. Value: "la",
  900. HeadComment: "# HA1\n# HA2",
  901. LineComment: "# IA",
  902. FootComment: "# FA1\n# FA2",
  903. }, {
  904. Kind: yaml.ScalarNode,
  905. Tag: "!!str",
  906. Line: 13,
  907. Column: 3,
  908. Value: "lb",
  909. HeadComment: "# HB1\n# HB2",
  910. LineComment: "# IB",
  911. FootComment: "# FB1\n# FB2",
  912. }},
  913. }},
  914. },
  915. }, {
  916. "# DH1\n\n- la # IA\n# HB1\n- lb\n",
  917. yaml.Node{
  918. Kind: yaml.DocumentNode,
  919. Line: 3,
  920. Column: 1,
  921. HeadComment: "# DH1",
  922. Content: []*yaml.Node{{
  923. Kind: yaml.SequenceNode,
  924. Tag: "!!seq",
  925. Line: 3,
  926. Column: 1,
  927. Content: []*yaml.Node{{
  928. Kind: yaml.ScalarNode,
  929. Tag: "!!str",
  930. Line: 3,
  931. Column: 3,
  932. Value: "la",
  933. LineComment: "# IA",
  934. }, {
  935. Kind: yaml.ScalarNode,
  936. Tag: "!!str",
  937. Line: 5,
  938. Column: 3,
  939. Value: "lb",
  940. HeadComment: "# HB1",
  941. }},
  942. }},
  943. },
  944. }, {
  945. "# DH1\n\n# HA1\nka:\n # HB1\n kb:\n # HC1\n # HC2\n - lc # IC\n # FC1\n # FC2\n\n # HD1\n - ld # ID\n # FD1\n\n# DF1\n",
  946. yaml.Node{
  947. Kind: yaml.DocumentNode,
  948. Line: 4,
  949. Column: 1,
  950. HeadComment: "# DH1",
  951. FootComment: "# DF1",
  952. Content: []*yaml.Node{{
  953. Kind: yaml.MappingNode,
  954. Tag: "!!map",
  955. Line: 4,
  956. Column: 1,
  957. Content: []*yaml.Node{{
  958. Kind: yaml.ScalarNode,
  959. Tag: "!!str",
  960. Line: 4,
  961. Column: 1,
  962. Value: "ka",
  963. HeadComment: "# HA1",
  964. }, {
  965. Kind: yaml.MappingNode,
  966. Tag: "!!map",
  967. Line: 6,
  968. Column: 3,
  969. Content: []*yaml.Node{{
  970. Kind: yaml.ScalarNode,
  971. Tag: "!!str",
  972. Line: 6,
  973. Column: 3,
  974. Value: "kb",
  975. HeadComment: "# HB1",
  976. }, {
  977. Kind: yaml.SequenceNode,
  978. Line: 9,
  979. Column: 3,
  980. Tag: "!!seq",
  981. Content: []*yaml.Node{{
  982. Kind: yaml.ScalarNode,
  983. Tag: "!!str",
  984. Line: 9,
  985. Column: 5,
  986. Value: "lc",
  987. HeadComment: "# HC1\n# HC2",
  988. LineComment: "# IC",
  989. FootComment: "# FC1\n# FC2",
  990. }, {
  991. Kind: yaml.ScalarNode,
  992. Tag: "!!str",
  993. Line: 14,
  994. Column: 5,
  995. Value: "ld",
  996. HeadComment: "# HD1",
  997. LineComment: "# ID",
  998. FootComment: "# FD1",
  999. }},
  1000. }},
  1001. }},
  1002. }},
  1003. },
  1004. }, {
  1005. "# DH1\n\n# HA1\nka:\n # HB1\n kb:\n # HC1\n # HC2\n - lc # IC\n # FC1\n # FC2\n\n # HD1\n - ld # ID\n # FD1\nke: ve\n\n# DF1\n",
  1006. yaml.Node{
  1007. Kind: yaml.DocumentNode,
  1008. Line: 4,
  1009. Column: 1,
  1010. HeadComment: "# DH1",
  1011. FootComment: "# DF1",
  1012. Content: []*yaml.Node{{
  1013. Kind: yaml.MappingNode,
  1014. Tag: "!!map",
  1015. Line: 4,
  1016. Column: 1,
  1017. Content: []*yaml.Node{{
  1018. Kind: yaml.ScalarNode,
  1019. Tag: "!!str",
  1020. Line: 4,
  1021. Column: 1,
  1022. Value: "ka",
  1023. HeadComment: "# HA1",
  1024. }, {
  1025. Kind: yaml.MappingNode,
  1026. Tag: "!!map",
  1027. Line: 6,
  1028. Column: 3,
  1029. Content: []*yaml.Node{{
  1030. Kind: yaml.ScalarNode,
  1031. Tag: "!!str",
  1032. Line: 6,
  1033. Column: 3,
  1034. Value: "kb",
  1035. HeadComment: "# HB1",
  1036. }, {
  1037. Kind: yaml.SequenceNode,
  1038. Line: 9,
  1039. Column: 3,
  1040. Tag: "!!seq",
  1041. Content: []*yaml.Node{{
  1042. Kind: yaml.ScalarNode,
  1043. Tag: "!!str",
  1044. Line: 9,
  1045. Column: 5,
  1046. Value: "lc",
  1047. HeadComment: "# HC1\n# HC2",
  1048. LineComment: "# IC",
  1049. FootComment: "# FC1\n# FC2",
  1050. }, {
  1051. Kind: yaml.ScalarNode,
  1052. Tag: "!!str",
  1053. Line: 14,
  1054. Column: 5,
  1055. Value: "ld",
  1056. HeadComment: "# HD1",
  1057. LineComment: "# ID",
  1058. FootComment: "# FD1",
  1059. }},
  1060. }},
  1061. }, {
  1062. Kind: yaml.ScalarNode,
  1063. Tag: "!!str",
  1064. Line: 16,
  1065. Column: 1,
  1066. Value: "ke",
  1067. }, {
  1068. Kind: yaml.ScalarNode,
  1069. Tag: "!!str",
  1070. Line: 16,
  1071. Column: 5,
  1072. Value: "ve",
  1073. }},
  1074. }},
  1075. },
  1076. }, {
  1077. "# DH1\n\n# DH2\n\n# HA1\n# HA2\nka:\n # HB1\n # HB2\n kb:\n" +
  1078. " # HC1\n # HC2\n kc:\n # HD1\n # HD2\n kd: vd\n # FD1\n # FD2\n" +
  1079. " # FC1\n # FC2\n # FB1\n # FB2\n# FA1\n# FA2\n\n# HE1\n# HE2\nke: ve\n# FE1\n# FE2\n\n# DF1\n\n# DF2\n",
  1080. yaml.Node{
  1081. Kind: yaml.DocumentNode,
  1082. HeadComment: "# DH1\n\n# DH2",
  1083. FootComment: "# DF1\n\n# DF2",
  1084. Line: 7,
  1085. Column: 1,
  1086. Content: []*yaml.Node{{
  1087. Kind: yaml.MappingNode,
  1088. Tag: "!!map",
  1089. Line: 7,
  1090. Column: 1,
  1091. Content: []*yaml.Node{{
  1092. Kind: yaml.ScalarNode,
  1093. Tag: "!!str",
  1094. Value: "ka",
  1095. HeadComment: "# HA1\n# HA2",
  1096. FootComment: "# FA1\n# FA2",
  1097. Line: 7,
  1098. Column: 1,
  1099. }, {
  1100. Kind: yaml.MappingNode,
  1101. Tag: "!!map",
  1102. Line: 10,
  1103. Column: 3,
  1104. Content: []*yaml.Node{{
  1105. Kind: yaml.ScalarNode,
  1106. Tag: "!!str",
  1107. Value: "kb",
  1108. HeadComment: "# HB1\n# HB2",
  1109. FootComment: "# FB1\n# FB2",
  1110. Line: 10,
  1111. Column: 3,
  1112. }, {
  1113. Kind: yaml.MappingNode,
  1114. Tag: "!!map",
  1115. Line: 13,
  1116. Column: 5,
  1117. Content: []*yaml.Node{{
  1118. Kind: yaml.ScalarNode,
  1119. Tag: "!!str",
  1120. Value: "kc",
  1121. HeadComment: "# HC1\n# HC2",
  1122. FootComment: "# FC1\n# FC2",
  1123. Line: 13,
  1124. Column: 5,
  1125. }, {
  1126. Kind: yaml.MappingNode,
  1127. Tag: "!!map",
  1128. Line: 16,
  1129. Column: 7,
  1130. Content: []*yaml.Node{{
  1131. Kind: yaml.ScalarNode,
  1132. Tag: "!!str",
  1133. Value: "kd",
  1134. HeadComment: "# HD1\n# HD2",
  1135. FootComment: "# FD1\n# FD2",
  1136. Line: 16,
  1137. Column: 7,
  1138. }, {
  1139. Kind: yaml.ScalarNode,
  1140. Tag: "!!str",
  1141. Value: "vd",
  1142. Line: 16,
  1143. Column: 11,
  1144. }},
  1145. }},
  1146. }},
  1147. }, {
  1148. Kind: yaml.ScalarNode,
  1149. Tag: "!!str",
  1150. Value: "ke",
  1151. HeadComment: "# HE1\n# HE2",
  1152. FootComment: "# FE1\n# FE2",
  1153. Line: 28,
  1154. Column: 1,
  1155. }, {
  1156. Kind: yaml.ScalarNode,
  1157. Tag: "!!str",
  1158. Value: "ve",
  1159. Line: 28,
  1160. Column: 5,
  1161. }},
  1162. }},
  1163. },
  1164. }, {
  1165. // Same as above but indenting ke in so it's also part of ka's value.
  1166. "# DH1\n\n# DH2\n\n# HA1\n# HA2\nka:\n # HB1\n # HB2\n kb:\n" +
  1167. " # HC1\n # HC2\n kc:\n # HD1\n # HD2\n kd: vd\n # FD1\n # FD2\n" +
  1168. " # FC1\n # FC2\n # FB1\n # FB2\n\n # HE1\n # HE2\n ke: ve\n # FE1\n # FE2\n# FA1\n# FA2\n\n# DF1\n\n# DF2\n",
  1169. yaml.Node{
  1170. Kind: yaml.DocumentNode,
  1171. HeadComment: "# DH1\n\n# DH2",
  1172. FootComment: "# DF1\n\n# DF2",
  1173. Line: 7,
  1174. Column: 1,
  1175. Content: []*yaml.Node{{
  1176. Kind: yaml.MappingNode,
  1177. Tag: "!!map",
  1178. Line: 7,
  1179. Column: 1,
  1180. Content: []*yaml.Node{{
  1181. Kind: yaml.ScalarNode,
  1182. Tag: "!!str",
  1183. Value: "ka",
  1184. HeadComment: "# HA1\n# HA2",
  1185. FootComment: "# FA1\n# FA2",
  1186. Line: 7,
  1187. Column: 1,
  1188. }, {
  1189. Kind: yaml.MappingNode,
  1190. Tag: "!!map",
  1191. Line: 10,
  1192. Column: 3,
  1193. Content: []*yaml.Node{{
  1194. Kind: yaml.ScalarNode,
  1195. Tag: "!!str",
  1196. Value: "kb",
  1197. HeadComment: "# HB1\n# HB2",
  1198. FootComment: "# FB1\n# FB2",
  1199. Line: 10,
  1200. Column: 3,
  1201. }, {
  1202. Kind: yaml.MappingNode,
  1203. Tag: "!!map",
  1204. Line: 13,
  1205. Column: 5,
  1206. Content: []*yaml.Node{{
  1207. Kind: yaml.ScalarNode,
  1208. Tag: "!!str",
  1209. Value: "kc",
  1210. HeadComment: "# HC1\n# HC2",
  1211. FootComment: "# FC1\n# FC2",
  1212. Line: 13,
  1213. Column: 5,
  1214. }, {
  1215. Kind: yaml.MappingNode,
  1216. Tag: "!!map",
  1217. Line: 16,
  1218. Column: 7,
  1219. Content: []*yaml.Node{{
  1220. Kind: yaml.ScalarNode,
  1221. Tag: "!!str",
  1222. Value: "kd",
  1223. HeadComment: "# HD1\n# HD2",
  1224. FootComment: "# FD1\n# FD2",
  1225. Line: 16,
  1226. Column: 7,
  1227. }, {
  1228. Kind: yaml.ScalarNode,
  1229. Tag: "!!str",
  1230. Value: "vd",
  1231. Line: 16,
  1232. Column: 11,
  1233. }},
  1234. }},
  1235. }, {
  1236. Kind: yaml.ScalarNode,
  1237. Tag: "!!str",
  1238. Value: "ke",
  1239. HeadComment: "# HE1\n# HE2",
  1240. FootComment: "# FE1\n# FE2",
  1241. Line: 26,
  1242. Column: 3,
  1243. }, {
  1244. Kind: yaml.ScalarNode,
  1245. Tag: "!!str",
  1246. Value: "ve",
  1247. Line: 26,
  1248. Column: 7,
  1249. }},
  1250. }},
  1251. }},
  1252. },
  1253. }, {
  1254. // Decode only due to lack of newline at the end.
  1255. "[decode]# HA1\nka:\n # HB1\n kb: vb\n # FB1\n# FA1",
  1256. yaml.Node{
  1257. Kind: yaml.DocumentNode,
  1258. Line: 2,
  1259. Column: 1,
  1260. Content: []*yaml.Node{{
  1261. Kind: yaml.MappingNode,
  1262. Tag: "!!map",
  1263. Line: 2,
  1264. Column: 1,
  1265. Content: []*yaml.Node{{
  1266. Kind: yaml.ScalarNode,
  1267. Tag: "!!str",
  1268. Value: "ka",
  1269. HeadComment: "# HA1",
  1270. FootComment: "# FA1",
  1271. Line: 2,
  1272. Column: 1,
  1273. }, {
  1274. Kind: yaml.MappingNode,
  1275. Tag: "!!map",
  1276. Line: 4,
  1277. Column: 3,
  1278. Content: []*yaml.Node{{
  1279. Kind: yaml.ScalarNode,
  1280. Tag: "!!str",
  1281. Value: "kb",
  1282. HeadComment: "# HB1",
  1283. FootComment: "# FB1",
  1284. Line: 4,
  1285. Column: 3,
  1286. }, {
  1287. Kind: yaml.ScalarNode,
  1288. Tag: "!!str",
  1289. Value: "vb",
  1290. Line: 4,
  1291. Column: 7,
  1292. }},
  1293. }},
  1294. },
  1295. },
  1296. },
  1297. }, {
  1298. // Same as above, but with newline at the end.
  1299. "# HA1\nka:\n # HB1\n kb: vb\n # FB1\n# FA1\n",
  1300. yaml.Node{
  1301. Kind: yaml.DocumentNode,
  1302. Line: 2,
  1303. Column: 1,
  1304. Content: []*yaml.Node{{
  1305. Kind: yaml.MappingNode,
  1306. Tag: "!!map",
  1307. Line: 2,
  1308. Column: 1,
  1309. Content: []*yaml.Node{{
  1310. Kind: yaml.ScalarNode,
  1311. Tag: "!!str",
  1312. Value: "ka",
  1313. HeadComment: "# HA1",
  1314. FootComment: "# FA1",
  1315. Line: 2,
  1316. Column: 1,
  1317. }, {
  1318. Kind: yaml.MappingNode,
  1319. Tag: "!!map",
  1320. Line: 4,
  1321. Column: 3,
  1322. Content: []*yaml.Node{{
  1323. Kind: yaml.ScalarNode,
  1324. Tag: "!!str",
  1325. Value: "kb",
  1326. HeadComment: "# HB1",
  1327. FootComment: "# FB1",
  1328. Line: 4,
  1329. Column: 3,
  1330. }, {
  1331. Kind: yaml.ScalarNode,
  1332. Tag: "!!str",
  1333. Value: "vb",
  1334. Line: 4,
  1335. Column: 7,
  1336. }},
  1337. }},
  1338. },
  1339. },
  1340. },
  1341. }, {
  1342. // Same as above, but without FB1.
  1343. "# HA1\nka:\n # HB1\n kb: vb\n# FA1\n",
  1344. yaml.Node{
  1345. Kind: yaml.DocumentNode,
  1346. Line: 2,
  1347. Column: 1,
  1348. Content: []*yaml.Node{{
  1349. Kind: yaml.MappingNode,
  1350. Tag: "!!map",
  1351. Line: 2,
  1352. Column: 1,
  1353. Content: []*yaml.Node{{
  1354. Kind: yaml.ScalarNode,
  1355. Tag: "!!str",
  1356. Value: "ka",
  1357. HeadComment: "# HA1",
  1358. FootComment: "# FA1",
  1359. Line: 2,
  1360. Column: 1,
  1361. }, {
  1362. Kind: yaml.MappingNode,
  1363. Tag: "!!map",
  1364. Line: 4,
  1365. Column: 3,
  1366. Content: []*yaml.Node{{
  1367. Kind: yaml.ScalarNode,
  1368. Tag: "!!str",
  1369. Value: "kb",
  1370. HeadComment: "# HB1",
  1371. Line: 4,
  1372. Column: 3,
  1373. }, {
  1374. Kind: yaml.ScalarNode,
  1375. Tag: "!!str",
  1376. Value: "vb",
  1377. Line: 4,
  1378. Column: 7,
  1379. }},
  1380. }},
  1381. },
  1382. },
  1383. },
  1384. }, {
  1385. // Same as above, but with two newlines at the end. Decode-only for that.
  1386. "[decode]# HA1\nka:\n # HB1\n kb: vb\n # FB1\n# FA1\n\n",
  1387. yaml.Node{
  1388. Kind: yaml.DocumentNode,
  1389. Line: 2,
  1390. Column: 1,
  1391. Content: []*yaml.Node{{
  1392. Kind: yaml.MappingNode,
  1393. Tag: "!!map",
  1394. Line: 2,
  1395. Column: 1,
  1396. Content: []*yaml.Node{{
  1397. Kind: yaml.ScalarNode,
  1398. Tag: "!!str",
  1399. Value: "ka",
  1400. HeadComment: "# HA1",
  1401. FootComment: "# FA1",
  1402. Line: 2,
  1403. Column: 1,
  1404. }, {
  1405. Kind: yaml.MappingNode,
  1406. Tag: "!!map",
  1407. Line: 4,
  1408. Column: 3,
  1409. Content: []*yaml.Node{{
  1410. Kind: yaml.ScalarNode,
  1411. Tag: "!!str",
  1412. Value: "kb",
  1413. HeadComment: "# HB1",
  1414. FootComment: "# FB1",
  1415. Line: 4,
  1416. Column: 3,
  1417. }, {
  1418. Kind: yaml.ScalarNode,
  1419. Tag: "!!str",
  1420. Value: "vb",
  1421. Line: 4,
  1422. Column: 7,
  1423. }},
  1424. }},
  1425. },
  1426. },
  1427. },
  1428. }, {
  1429. "ka:\n kb: vb\n# FA1\n\nkc: vc\n",
  1430. yaml.Node{
  1431. Kind: yaml.DocumentNode,
  1432. Line: 1,
  1433. Column: 1,
  1434. Content: []*yaml.Node{{
  1435. Kind: yaml.MappingNode,
  1436. Tag: "!!map",
  1437. Line: 1,
  1438. Column: 1,
  1439. Content: []*yaml.Node{{
  1440. Kind: yaml.ScalarNode,
  1441. Tag: "!!str",
  1442. Value: "ka",
  1443. Line: 1,
  1444. Column: 1,
  1445. FootComment: "# FA1",
  1446. }, {
  1447. Kind: yaml.MappingNode,
  1448. Tag: "!!map",
  1449. Line: 2,
  1450. Column: 3,
  1451. Content: []*yaml.Node{{
  1452. Kind: yaml.ScalarNode,
  1453. Tag: "!!str",
  1454. Value: "kb",
  1455. Line: 2,
  1456. Column: 3,
  1457. }, {
  1458. Kind: yaml.ScalarNode,
  1459. Tag: "!!str",
  1460. Value: "vb",
  1461. Line: 2,
  1462. Column: 7,
  1463. }},
  1464. }, {
  1465. Kind: yaml.ScalarNode,
  1466. Tag: "!!str",
  1467. Value: "kc",
  1468. Line: 5,
  1469. Column: 1,
  1470. }, {
  1471. Kind: yaml.ScalarNode,
  1472. Tag: "!!str",
  1473. Value: "vc",
  1474. Line: 5,
  1475. Column: 5,
  1476. }},
  1477. }},
  1478. },
  1479. }, {
  1480. "ka:\n kb: vb\n# HC1\nkc: vc\n",
  1481. yaml.Node{
  1482. Kind: yaml.DocumentNode,
  1483. Line: 1,
  1484. Column: 1,
  1485. Content: []*yaml.Node{{
  1486. Kind: yaml.MappingNode,
  1487. Tag: "!!map",
  1488. Line: 1,
  1489. Column: 1,
  1490. Content: []*yaml.Node{{
  1491. Kind: yaml.ScalarNode,
  1492. Tag: "!!str",
  1493. Value: "ka",
  1494. Line: 1,
  1495. Column: 1,
  1496. }, {
  1497. Kind: yaml.MappingNode,
  1498. Tag: "!!map",
  1499. Line: 2,
  1500. Column: 3,
  1501. Content: []*yaml.Node{{
  1502. Kind: yaml.ScalarNode,
  1503. Tag: "!!str",
  1504. Value: "kb",
  1505. Line: 2,
  1506. Column: 3,
  1507. }, {
  1508. Kind: yaml.ScalarNode,
  1509. Tag: "!!str",
  1510. Value: "vb",
  1511. Line: 2,
  1512. Column: 7,
  1513. }},
  1514. }, {
  1515. Kind: yaml.ScalarNode,
  1516. Tag: "!!str",
  1517. Value: "kc",
  1518. HeadComment: "# HC1",
  1519. Line: 4,
  1520. Column: 1,
  1521. }, {
  1522. Kind: yaml.ScalarNode,
  1523. Tag: "!!str",
  1524. Value: "vc",
  1525. Line: 4,
  1526. Column: 5,
  1527. }},
  1528. }},
  1529. },
  1530. }, {
  1531. // Decode only due to empty line before HC1.
  1532. "[decode]ka:\n kb: vb\n\n# HC1\nkc: vc\n",
  1533. yaml.Node{
  1534. Kind: yaml.DocumentNode,
  1535. Line: 1,
  1536. Column: 1,
  1537. Content: []*yaml.Node{{
  1538. Kind: yaml.MappingNode,
  1539. Tag: "!!map",
  1540. Line: 1,
  1541. Column: 1,
  1542. Content: []*yaml.Node{{
  1543. Kind: yaml.ScalarNode,
  1544. Tag: "!!str",
  1545. Value: "ka",
  1546. Line: 1,
  1547. Column: 1,
  1548. }, {
  1549. Kind: yaml.MappingNode,
  1550. Tag: "!!map",
  1551. Line: 2,
  1552. Column: 3,
  1553. Content: []*yaml.Node{{
  1554. Kind: yaml.ScalarNode,
  1555. Tag: "!!str",
  1556. Value: "kb",
  1557. Line: 2,
  1558. Column: 3,
  1559. }, {
  1560. Kind: yaml.ScalarNode,
  1561. Tag: "!!str",
  1562. Value: "vb",
  1563. Line: 2,
  1564. Column: 7,
  1565. }},
  1566. }, {
  1567. Kind: yaml.ScalarNode,
  1568. Tag: "!!str",
  1569. Value: "kc",
  1570. HeadComment: "# HC1",
  1571. Line: 5,
  1572. Column: 1,
  1573. }, {
  1574. Kind: yaml.ScalarNode,
  1575. Tag: "!!str",
  1576. Value: "vc",
  1577. Line: 5,
  1578. Column: 5,
  1579. }},
  1580. }},
  1581. },
  1582. }, {
  1583. // Decode-only due to empty lines around HC1.
  1584. "[decode]ka:\n kb: vb\n\n# HC1\n\nkc: vc\n",
  1585. yaml.Node{
  1586. Kind: yaml.DocumentNode,
  1587. Line: 1,
  1588. Column: 1,
  1589. Content: []*yaml.Node{{
  1590. Kind: yaml.MappingNode,
  1591. Tag: "!!map",
  1592. Line: 1,
  1593. Column: 1,
  1594. Content: []*yaml.Node{{
  1595. Kind: yaml.ScalarNode,
  1596. Tag: "!!str",
  1597. Value: "ka",
  1598. Line: 1,
  1599. Column: 1,
  1600. }, {
  1601. Kind: yaml.MappingNode,
  1602. Tag: "!!map",
  1603. Line: 2,
  1604. Column: 3,
  1605. Content: []*yaml.Node{{
  1606. Kind: yaml.ScalarNode,
  1607. Tag: "!!str",
  1608. Value: "kb",
  1609. Line: 2,
  1610. Column: 3,
  1611. }, {
  1612. Kind: yaml.ScalarNode,
  1613. Tag: "!!str",
  1614. Value: "vb",
  1615. Line: 2,
  1616. Column: 7,
  1617. }},
  1618. }, {
  1619. Kind: yaml.ScalarNode,
  1620. Tag: "!!str",
  1621. Value: "kc",
  1622. HeadComment: "# HC1\n",
  1623. Line: 6,
  1624. Column: 1,
  1625. }, {
  1626. Kind: yaml.ScalarNode,
  1627. Tag: "!!str",
  1628. Value: "vc",
  1629. Line: 6,
  1630. Column: 5,
  1631. }},
  1632. }},
  1633. },
  1634. }, {
  1635. "ka: # IA\n kb: # IB\n",
  1636. yaml.Node{
  1637. Kind: yaml.DocumentNode,
  1638. Line: 1,
  1639. Column: 1,
  1640. Content: []*yaml.Node{{
  1641. Kind: yaml.MappingNode,
  1642. Tag: "!!map",
  1643. Line: 1,
  1644. Column: 1,
  1645. Content: []*yaml.Node{{
  1646. Kind: yaml.ScalarNode,
  1647. Tag: "!!str",
  1648. Value: "ka",
  1649. Line: 1,
  1650. Column: 1,
  1651. LineComment: "# IA",
  1652. }, {
  1653. Kind: yaml.MappingNode,
  1654. Tag: "!!map",
  1655. Line: 2,
  1656. Column: 3,
  1657. Content: []*yaml.Node{{
  1658. Kind: yaml.ScalarNode,
  1659. Tag: "!!str",
  1660. Value: "kb",
  1661. Line: 2,
  1662. Column: 3,
  1663. LineComment: "# IB",
  1664. }, {
  1665. Kind: yaml.ScalarNode,
  1666. Tag: "!!null",
  1667. Line: 2,
  1668. Column: 6,
  1669. }},
  1670. }},
  1671. }},
  1672. },
  1673. }, {
  1674. "# HA1\nka:\n # HB1\n kb: vb\n # FB1\n# HC1\n# HC2\nkc: vc\n# FC1\n# FC2\n",
  1675. yaml.Node{
  1676. Kind: yaml.DocumentNode,
  1677. Line: 2,
  1678. Column: 1,
  1679. Content: []*yaml.Node{{
  1680. Kind: yaml.MappingNode,
  1681. Tag: "!!map",
  1682. Line: 2,
  1683. Column: 1,
  1684. Content: []*yaml.Node{{
  1685. Kind: yaml.ScalarNode,
  1686. Tag: "!!str",
  1687. Value: "ka",
  1688. HeadComment: "# HA1",
  1689. Line: 2,
  1690. Column: 1,
  1691. }, {
  1692. Kind: yaml.MappingNode,
  1693. Tag: "!!map",
  1694. Line: 4,
  1695. Column: 3,
  1696. Content: []*yaml.Node{{
  1697. Kind: yaml.ScalarNode,
  1698. Tag: "!!str",
  1699. Value: "kb",
  1700. HeadComment: "# HB1",
  1701. FootComment: "# FB1",
  1702. Line: 4,
  1703. Column: 3,
  1704. }, {
  1705. Kind: yaml.ScalarNode,
  1706. Tag: "!!str",
  1707. Value: "vb",
  1708. Line: 4,
  1709. Column: 7,
  1710. }},
  1711. }, {
  1712. Kind: yaml.ScalarNode,
  1713. Tag: "!!str",
  1714. Value: "kc",
  1715. HeadComment: "# HC1\n# HC2",
  1716. FootComment: "# FC1\n# FC2",
  1717. Line: 8,
  1718. Column: 1,
  1719. }, {
  1720. Kind: yaml.ScalarNode,
  1721. Tag: "!!str",
  1722. Value: "vc",
  1723. Line: 8,
  1724. Column: 5,
  1725. }},
  1726. }},
  1727. },
  1728. }, {
  1729. // Same as above, but decode only due to empty line between ka's value and kc's headers.
  1730. "[decode]# HA1\nka:\n # HB1\n kb: vb\n # FB1\n\n# HC1\n# HC2\nkc: vc\n# FC1\n# FC2\n",
  1731. yaml.Node{
  1732. Kind: yaml.DocumentNode,
  1733. Line: 2,
  1734. Column: 1,
  1735. Content: []*yaml.Node{{
  1736. Kind: yaml.MappingNode,
  1737. Tag: "!!map",
  1738. Line: 2,
  1739. Column: 1,
  1740. Content: []*yaml.Node{{
  1741. Kind: yaml.ScalarNode,
  1742. Tag: "!!str",
  1743. Value: "ka",
  1744. HeadComment: "# HA1",
  1745. Line: 2,
  1746. Column: 1,
  1747. }, {
  1748. Kind: yaml.MappingNode,
  1749. Tag: "!!map",
  1750. Line: 4,
  1751. Column: 3,
  1752. Content: []*yaml.Node{{
  1753. Kind: yaml.ScalarNode,
  1754. Tag: "!!str",
  1755. Value: "kb",
  1756. HeadComment: "# HB1",
  1757. FootComment: "# FB1",
  1758. Line: 4,
  1759. Column: 3,
  1760. }, {
  1761. Kind: yaml.ScalarNode,
  1762. Tag: "!!str",
  1763. Value: "vb",
  1764. Line: 4,
  1765. Column: 7,
  1766. }},
  1767. }, {
  1768. Kind: yaml.ScalarNode,
  1769. Tag: "!!str",
  1770. Value: "kc",
  1771. HeadComment: "# HC1\n# HC2",
  1772. FootComment: "# FC1\n# FC2",
  1773. Line: 9,
  1774. Column: 1,
  1775. }, {
  1776. Kind: yaml.ScalarNode,
  1777. Tag: "!!str",
  1778. Value: "vc",
  1779. Line: 9,
  1780. Column: 5,
  1781. }},
  1782. }},
  1783. },
  1784. }, {
  1785. "# H1\n[la, lb] # I\n# F1\n",
  1786. yaml.Node{
  1787. Kind: yaml.DocumentNode,
  1788. Line: 2,
  1789. Column: 1,
  1790. Content: []*yaml.Node{{
  1791. Kind: yaml.SequenceNode,
  1792. Tag: "!!seq",
  1793. Style: yaml.FlowStyle,
  1794. Line: 2,
  1795. Column: 1,
  1796. HeadComment: "# H1",
  1797. LineComment: "# I",
  1798. FootComment: "# F1",
  1799. Content: []*yaml.Node{{
  1800. Kind: yaml.ScalarNode,
  1801. Tag: "!!str",
  1802. Line: 2,
  1803. Column: 2,
  1804. Value: "la",
  1805. }, {
  1806. Kind: yaml.ScalarNode,
  1807. Tag: "!!str",
  1808. Line: 2,
  1809. Column: 6,
  1810. Value: "lb",
  1811. }},
  1812. }},
  1813. },
  1814. }, {
  1815. "# DH1\n\n# SH1\n[\n # HA1\n la, # IA\n # FA1\n\n # HB1\n lb, # IB\n # FB1\n]\n# SF1\n\n# DF1\n",
  1816. yaml.Node{
  1817. Kind: yaml.DocumentNode,
  1818. Line: 4,
  1819. Column: 1,
  1820. HeadComment: "# DH1",
  1821. FootComment: "# DF1",
  1822. Content: []*yaml.Node{{
  1823. Kind: yaml.SequenceNode,
  1824. Tag: "!!seq",
  1825. Style: yaml.FlowStyle,
  1826. Line: 4,
  1827. Column: 1,
  1828. HeadComment: "# SH1",
  1829. FootComment: "# SF1",
  1830. Content: []*yaml.Node{{
  1831. Kind: yaml.ScalarNode,
  1832. Tag: "!!str",
  1833. Line: 6,
  1834. Column: 3,
  1835. Value: "la",
  1836. HeadComment: "# HA1",
  1837. LineComment: "# IA",
  1838. FootComment: "# FA1",
  1839. }, {
  1840. Kind: yaml.ScalarNode,
  1841. Tag: "!!str",
  1842. Line: 10,
  1843. Column: 3,
  1844. Value: "lb",
  1845. HeadComment: "# HB1",
  1846. LineComment: "# IB",
  1847. FootComment: "# FB1",
  1848. }},
  1849. }},
  1850. },
  1851. }, {
  1852. "# DH1\n\n# SH1\n[\n # HA1\n la,\n # FA1\n\n # HB1\n lb,\n # FB1\n]\n# SF1\n\n# DF1\n",
  1853. yaml.Node{
  1854. Kind: yaml.DocumentNode,
  1855. Line: 4,
  1856. Column: 1,
  1857. HeadComment: "# DH1",
  1858. FootComment: "# DF1",
  1859. Content: []*yaml.Node{{
  1860. Kind: yaml.SequenceNode,
  1861. Tag: "!!seq",
  1862. Style: yaml.FlowStyle,
  1863. Line: 4,
  1864. Column: 1,
  1865. HeadComment: "# SH1",
  1866. FootComment: "# SF1",
  1867. Content: []*yaml.Node{{
  1868. Kind: yaml.ScalarNode,
  1869. Tag: "!!str",
  1870. Line: 6,
  1871. Column: 3,
  1872. Value: "la",
  1873. HeadComment: "# HA1",
  1874. FootComment: "# FA1",
  1875. }, {
  1876. Kind: yaml.ScalarNode,
  1877. Tag: "!!str",
  1878. Line: 10,
  1879. Column: 3,
  1880. Value: "lb",
  1881. HeadComment: "# HB1",
  1882. FootComment: "# FB1",
  1883. }},
  1884. }},
  1885. },
  1886. }, {
  1887. "ka:\n kb: [\n # HA1\n la,\n # FA1\n\n # HB1\n lb,\n # FB1\n ]\n",
  1888. yaml.Node{
  1889. Kind: yaml.DocumentNode,
  1890. Line: 1,
  1891. Column: 1,
  1892. Content: []*yaml.Node{{
  1893. Kind: yaml.MappingNode,
  1894. Tag: "!!map",
  1895. Line: 1,
  1896. Column: 1,
  1897. Content: []*yaml.Node{{
  1898. Kind: yaml.ScalarNode,
  1899. Tag: "!!str",
  1900. Value: "ka",
  1901. Line: 1,
  1902. Column: 1,
  1903. }, {
  1904. Kind: 0x4,
  1905. Tag: "!!map",
  1906. Line: 2,
  1907. Column: 3,
  1908. Content: []*yaml.Node{{
  1909. Kind: yaml.ScalarNode,
  1910. Tag: "!!str",
  1911. Value: "kb",
  1912. Line: 2,
  1913. Column: 3,
  1914. }, {
  1915. Kind: yaml.SequenceNode,
  1916. Style: 0x20,
  1917. Tag: "!!seq",
  1918. Line: 2,
  1919. Column: 7,
  1920. Content: []*yaml.Node{{
  1921. Kind: yaml.ScalarNode,
  1922. Tag: "!!str",
  1923. Value: "la",
  1924. HeadComment: "# HA1",
  1925. FootComment: "# FA1",
  1926. Line: 4,
  1927. Column: 5,
  1928. }, {
  1929. Kind: yaml.ScalarNode,
  1930. Tag: "!!str",
  1931. Value: "lb",
  1932. HeadComment: "# HB1",
  1933. FootComment: "# FB1",
  1934. Line: 8,
  1935. Column: 5,
  1936. }},
  1937. }},
  1938. }},
  1939. }},
  1940. },
  1941. }, {
  1942. "# DH1\n\n# MH1\n{\n # HA1\n ka: va, # IA\n # FA1\n\n # HB1\n kb: vb, # IB\n # FB1\n}\n# MF1\n\n# DF1\n",
  1943. yaml.Node{
  1944. Kind: yaml.DocumentNode,
  1945. Line: 4,
  1946. Column: 1,
  1947. HeadComment: "# DH1",
  1948. FootComment: "# DF1",
  1949. Content: []*yaml.Node{{
  1950. Kind: yaml.MappingNode,
  1951. Tag: "!!map",
  1952. Style: yaml.FlowStyle,
  1953. Line: 4,
  1954. Column: 1,
  1955. HeadComment: "# MH1",
  1956. FootComment: "# MF1",
  1957. Content: []*yaml.Node{{
  1958. Kind: yaml.ScalarNode,
  1959. Tag: "!!str",
  1960. Line: 6,
  1961. Column: 3,
  1962. Value: "ka",
  1963. HeadComment: "# HA1",
  1964. FootComment: "# FA1",
  1965. }, {
  1966. Kind: yaml.ScalarNode,
  1967. Tag: "!!str",
  1968. Line: 6,
  1969. Column: 7,
  1970. Value: "va",
  1971. LineComment: "# IA",
  1972. }, {
  1973. Kind: yaml.ScalarNode,
  1974. Tag: "!!str",
  1975. Line: 10,
  1976. Column: 3,
  1977. Value: "kb",
  1978. HeadComment: "# HB1",
  1979. FootComment: "# FB1",
  1980. }, {
  1981. Kind: yaml.ScalarNode,
  1982. Tag: "!!str",
  1983. Line: 10,
  1984. Column: 7,
  1985. Value: "vb",
  1986. LineComment: "# IB",
  1987. }},
  1988. }},
  1989. },
  1990. }, {
  1991. "# DH1\n\n# MH1\n{\n # HA1\n ka: va,\n # FA1\n\n # HB1\n kb: vb,\n # FB1\n}\n# MF1\n\n# DF1\n",
  1992. yaml.Node{
  1993. Kind: yaml.DocumentNode,
  1994. Line: 4,
  1995. Column: 1,
  1996. HeadComment: "# DH1",
  1997. FootComment: "# DF1",
  1998. Content: []*yaml.Node{{
  1999. Kind: yaml.MappingNode,
  2000. Tag: "!!map",
  2001. Style: yaml.FlowStyle,
  2002. Line: 4,
  2003. Column: 1,
  2004. HeadComment: "# MH1",
  2005. FootComment: "# MF1",
  2006. Content: []*yaml.Node{{
  2007. Kind: yaml.ScalarNode,
  2008. Tag: "!!str",
  2009. Line: 6,
  2010. Column: 3,
  2011. Value: "ka",
  2012. HeadComment: "# HA1",
  2013. FootComment: "# FA1",
  2014. }, {
  2015. Kind: yaml.ScalarNode,
  2016. Tag: "!!str",
  2017. Line: 6,
  2018. Column: 7,
  2019. Value: "va",
  2020. }, {
  2021. Kind: yaml.ScalarNode,
  2022. Tag: "!!str",
  2023. Line: 10,
  2024. Column: 3,
  2025. Value: "kb",
  2026. HeadComment: "# HB1",
  2027. FootComment: "# FB1",
  2028. }, {
  2029. Kind: yaml.ScalarNode,
  2030. Tag: "!!str",
  2031. Line: 10,
  2032. Column: 7,
  2033. Value: "vb",
  2034. }},
  2035. }},
  2036. },
  2037. }, {
  2038. "# DH1\n\n# DH2\n\n# HA1\n# HA2\n- &x la # IA\n# FA1\n# FA2\n\n# HB1\n# HB2\n- *x # IB\n# FB1\n# FB2\n\n# DF1\n\n# DF2\n",
  2039. yaml.Node{
  2040. Kind: yaml.DocumentNode,
  2041. Line: 7,
  2042. Column: 1,
  2043. HeadComment: "# DH1\n\n# DH2",
  2044. FootComment: "# DF1\n\n# DF2",
  2045. Content: []*yaml.Node{{
  2046. Kind: yaml.SequenceNode,
  2047. Tag: "!!seq",
  2048. Line: 7,
  2049. Column: 1,
  2050. Content: []*yaml.Node{
  2051. saveNode("x", &yaml.Node{
  2052. Kind: yaml.ScalarNode,
  2053. Tag: "!!str",
  2054. Line: 7,
  2055. Column: 3,
  2056. Value: "la",
  2057. HeadComment: "# HA1\n# HA2",
  2058. LineComment: "# IA",
  2059. FootComment: "# FA1\n# FA2",
  2060. Anchor: "x",
  2061. }), {
  2062. Kind: yaml.AliasNode,
  2063. Line: 13,
  2064. Column: 3,
  2065. Value: "x",
  2066. Alias: dropNode("x"),
  2067. HeadComment: "# HB1\n# HB2",
  2068. LineComment: "# IB",
  2069. FootComment: "# FB1\n# FB2",
  2070. },
  2071. },
  2072. }},
  2073. },
  2074. },
  2075. }
  2076. func (s *S) TestNodeRoundtrip(c *C) {
  2077. defer os.Setenv("TZ", os.Getenv("TZ"))
  2078. os.Setenv("TZ", "UTC")
  2079. for i, item := range nodeTests {
  2080. c.Logf("test %d: %q", i, item.yaml)
  2081. if strings.Contains(item.yaml, "#") {
  2082. var buf bytes.Buffer
  2083. fprintComments(&buf, &item.node, " ")
  2084. c.Logf(" comments:\n%s", buf.Bytes())
  2085. }
  2086. decode := true
  2087. encode := true
  2088. testYaml := item.yaml
  2089. if s := strings.TrimPrefix(testYaml, "[decode]"); s != testYaml {
  2090. encode = false
  2091. testYaml = s
  2092. }
  2093. if s := strings.TrimPrefix(testYaml, "[encode]"); s != testYaml {
  2094. decode = false
  2095. testYaml = s
  2096. }
  2097. if decode {
  2098. var node yaml.Node
  2099. err := yaml.Unmarshal([]byte(testYaml), &node)
  2100. c.Assert(err, IsNil)
  2101. c.Assert(node, DeepEquals, item.node)
  2102. }
  2103. if encode {
  2104. buf := bytes.Buffer{}
  2105. enc := yaml.NewEncoder(&buf)
  2106. enc.SetIndent(2)
  2107. err := enc.Encode(&item.node)
  2108. c.Assert(err, IsNil)
  2109. err = enc.Close()
  2110. c.Assert(err, IsNil)
  2111. c.Assert(buf.String(), Equals, testYaml)
  2112. }
  2113. }
  2114. }
  2115. var savedNodes = make(map[string]*yaml.Node)
  2116. func saveNode(name string, node *yaml.Node) *yaml.Node {
  2117. savedNodes[name] = node
  2118. return node
  2119. }
  2120. func peekNode(name string) *yaml.Node {
  2121. return savedNodes[name]
  2122. }
  2123. func dropNode(name string) *yaml.Node {
  2124. node := savedNodes[name]
  2125. delete(savedNodes, name)
  2126. return node
  2127. }
  2128. var setStringTests = []struct {
  2129. str string
  2130. yaml string
  2131. node yaml.Node
  2132. }{
  2133. {
  2134. "something simple",
  2135. "something simple\n",
  2136. yaml.Node{
  2137. Kind: yaml.ScalarNode,
  2138. Value: "something simple",
  2139. Tag: "!!str",
  2140. },
  2141. }, {
  2142. `"quoted value"`,
  2143. "'\"quoted value\"'\n",
  2144. yaml.Node{
  2145. Kind: yaml.ScalarNode,
  2146. Value: `"quoted value"`,
  2147. Tag: "!!str",
  2148. },
  2149. }, {
  2150. "multi\nline",
  2151. "|-\n multi\n line\n",
  2152. yaml.Node{
  2153. Kind: yaml.ScalarNode,
  2154. Value: "multi\nline",
  2155. Tag: "!!str",
  2156. Style: yaml.LiteralStyle,
  2157. },
  2158. }, {
  2159. "123",
  2160. "\"123\"\n",
  2161. yaml.Node{
  2162. Kind: yaml.ScalarNode,
  2163. Value: "123",
  2164. Tag: "!!str",
  2165. },
  2166. }, {
  2167. "multi\nline\n",
  2168. "|\n multi\n line\n",
  2169. yaml.Node{
  2170. Kind: yaml.ScalarNode,
  2171. Value: "multi\nline\n",
  2172. Tag: "!!str",
  2173. Style: yaml.LiteralStyle,
  2174. },
  2175. }, {
  2176. "\x80\x81\x82",
  2177. "!!binary gIGC\n",
  2178. yaml.Node{
  2179. Kind: yaml.ScalarNode,
  2180. Value: "gIGC",
  2181. Tag: "!!binary",
  2182. },
  2183. },
  2184. }
  2185. func (s *S) TestSetString(c *C) {
  2186. defer os.Setenv("TZ", os.Getenv("TZ"))
  2187. os.Setenv("TZ", "UTC")
  2188. for i, item := range setStringTests {
  2189. c.Logf("test %d: %q", i, item.str)
  2190. var node yaml.Node
  2191. node.SetString(item.str)
  2192. c.Assert(node, DeepEquals, item.node)
  2193. buf := bytes.Buffer{}
  2194. enc := yaml.NewEncoder(&buf)
  2195. enc.SetIndent(2)
  2196. err := enc.Encode(&item.node)
  2197. c.Assert(err, IsNil)
  2198. err = enc.Close()
  2199. c.Assert(err, IsNil)
  2200. c.Assert(buf.String(), Equals, item.yaml)
  2201. var doc yaml.Node
  2202. err = yaml.Unmarshal([]byte(item.yaml), &doc)
  2203. c.Assert(err, IsNil)
  2204. var str string
  2205. err = node.Decode(&str)
  2206. c.Assert(err, IsNil)
  2207. c.Assert(str, Equals, item.str)
  2208. }
  2209. }
  2210. func fprintComments(out io.Writer, node *yaml.Node, indent string) {
  2211. switch node.Kind {
  2212. case yaml.ScalarNode:
  2213. fmt.Fprintf(out, "%s<%s> ", indent, node.Value)
  2214. fprintCommentSet(out, node)
  2215. fmt.Fprintf(out, "\n")
  2216. case yaml.DocumentNode:
  2217. fmt.Fprintf(out, "%s<DOC> ", indent)
  2218. fprintCommentSet(out, node)
  2219. fmt.Fprintf(out, "\n")
  2220. for i := 0; i < len(node.Content); i++ {
  2221. fprintComments(out, node.Content[i], indent+" ")
  2222. }
  2223. case yaml.MappingNode:
  2224. fmt.Fprintf(out, "%s<MAP> ", indent)
  2225. fprintCommentSet(out, node)
  2226. fmt.Fprintf(out, "\n")
  2227. for i := 0; i < len(node.Content); i += 2 {
  2228. fprintComments(out, node.Content[i], indent+" ")
  2229. fprintComments(out, node.Content[i+1], indent+" ")
  2230. }
  2231. case yaml.SequenceNode:
  2232. fmt.Fprintf(out, "%s<SEQ> ", indent)
  2233. fprintCommentSet(out, node)
  2234. fmt.Fprintf(out, "\n")
  2235. for i := 0; i < len(node.Content); i++ {
  2236. fprintComments(out, node.Content[i], indent+" ")
  2237. }
  2238. }
  2239. }
  2240. func fprintCommentSet(out io.Writer, node *yaml.Node) {
  2241. if len(node.HeadComment)+len(node.LineComment)+len(node.FootComment) > 0 {
  2242. fmt.Fprintf(out, "%q / %q / %q", node.HeadComment, node.LineComment, node.FootComment)
  2243. }
  2244. }