node_test.go 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219
  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\n- b\n",
  495. yaml.Node{
  496. Kind: yaml.DocumentNode,
  497. Line: 1,
  498. Column: 1,
  499. Content: []*yaml.Node{{
  500. Kind: yaml.SequenceNode,
  501. Value: "",
  502. Tag: "!!seq",
  503. Line: 1,
  504. Column: 1,
  505. Content: []*yaml.Node{{
  506. Kind: yaml.ScalarNode,
  507. Value: "a",
  508. Tag: "!!str",
  509. Line: 1,
  510. Column: 3,
  511. }, {
  512. Kind: yaml.ScalarNode,
  513. Value: "b",
  514. Tag: "!!str",
  515. Line: 2,
  516. Column: 3,
  517. }},
  518. }},
  519. },
  520. }, {
  521. "- a\n- - b\n - c\n",
  522. yaml.Node{
  523. Kind: yaml.DocumentNode,
  524. Line: 1,
  525. Column: 1,
  526. Content: []*yaml.Node{{
  527. Kind: yaml.SequenceNode,
  528. Tag: "!!seq",
  529. Line: 1,
  530. Column: 1,
  531. Content: []*yaml.Node{{
  532. Kind: yaml.ScalarNode,
  533. Value: "a",
  534. Tag: "!!str",
  535. Line: 1,
  536. Column: 3,
  537. }, {
  538. Kind: yaml.SequenceNode,
  539. Tag: "!!seq",
  540. Line: 2,
  541. Column: 3,
  542. Content: []*yaml.Node{{
  543. Kind: yaml.ScalarNode,
  544. Value: "b",
  545. Tag: "!!str",
  546. Line: 2,
  547. Column: 5,
  548. }, {
  549. Kind: yaml.ScalarNode,
  550. Value: "c",
  551. Tag: "!!str",
  552. Line: 3,
  553. Column: 5,
  554. }},
  555. }},
  556. }},
  557. },
  558. }, {
  559. "[a, b]\n",
  560. yaml.Node{
  561. Kind: yaml.DocumentNode,
  562. Line: 1,
  563. Column: 1,
  564. Content: []*yaml.Node{{
  565. Kind: yaml.SequenceNode,
  566. Style: yaml.FlowStyle,
  567. Value: "",
  568. Tag: "!!seq",
  569. Line: 1,
  570. Column: 1,
  571. Content: []*yaml.Node{{
  572. Kind: yaml.ScalarNode,
  573. Value: "a",
  574. Tag: "!!str",
  575. Line: 1,
  576. Column: 2,
  577. }, {
  578. Kind: yaml.ScalarNode,
  579. Value: "b",
  580. Tag: "!!str",
  581. Line: 1,
  582. Column: 5,
  583. }},
  584. }},
  585. },
  586. }, {
  587. "- a\n- [b, c]\n",
  588. yaml.Node{
  589. Kind: yaml.DocumentNode,
  590. Line: 1,
  591. Column: 1,
  592. Content: []*yaml.Node{{
  593. Kind: yaml.SequenceNode,
  594. Tag: "!!seq",
  595. Line: 1,
  596. Column: 1,
  597. Content: []*yaml.Node{{
  598. Kind: yaml.ScalarNode,
  599. Value: "a",
  600. Tag: "!!str",
  601. Line: 1,
  602. Column: 3,
  603. }, {
  604. Kind: yaml.SequenceNode,
  605. Tag: "!!seq",
  606. Style: yaml.FlowStyle,
  607. Line: 2,
  608. Column: 3,
  609. Content: []*yaml.Node{{
  610. Kind: yaml.ScalarNode,
  611. Value: "b",
  612. Tag: "!!str",
  613. Line: 2,
  614. Column: 4,
  615. }, {
  616. Kind: yaml.ScalarNode,
  617. Value: "c",
  618. Tag: "!!str",
  619. Line: 2,
  620. Column: 7,
  621. }},
  622. }},
  623. }},
  624. },
  625. }, {
  626. "a: &x 1\nb: &y 2\nc: *x\nd: *y\n",
  627. yaml.Node{
  628. Kind: yaml.DocumentNode,
  629. Line: 1,
  630. Column: 1,
  631. Content: []*yaml.Node{{
  632. Kind: yaml.MappingNode,
  633. Line: 1,
  634. Column: 1,
  635. Tag: "!!map",
  636. Content: []*yaml.Node{{
  637. Kind: yaml.ScalarNode,
  638. Value: "a",
  639. Tag: "!!str",
  640. Line: 1,
  641. Column: 1,
  642. },
  643. saveNode("x", &yaml.Node{
  644. Kind: yaml.ScalarNode,
  645. Value: "1",
  646. Tag: "!!int",
  647. Anchor: "x",
  648. Line: 1,
  649. Column: 4,
  650. }),
  651. {
  652. Kind: yaml.ScalarNode,
  653. Value: "b",
  654. Tag: "!!str",
  655. Line: 2,
  656. Column: 1,
  657. },
  658. saveNode("y", &yaml.Node{
  659. Kind: yaml.ScalarNode,
  660. Value: "2",
  661. Tag: "!!int",
  662. Anchor: "y",
  663. Line: 2,
  664. Column: 4,
  665. }),
  666. {
  667. Kind: yaml.ScalarNode,
  668. Value: "c",
  669. Tag: "!!str",
  670. Line: 3,
  671. Column: 1,
  672. }, {
  673. Kind: yaml.AliasNode,
  674. Value: "x",
  675. Alias: dropNode("x"),
  676. Line: 3,
  677. Column: 4,
  678. }, {
  679. Kind: yaml.ScalarNode,
  680. Value: "d",
  681. Tag: "!!str",
  682. Line: 4,
  683. Column: 1,
  684. }, {
  685. Kind: yaml.AliasNode,
  686. Value: "y",
  687. Tag: "",
  688. Alias: dropNode("y"),
  689. Line: 4,
  690. Column: 4,
  691. }},
  692. }},
  693. },
  694. }, {
  695. "# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  696. yaml.Node{
  697. Kind: yaml.DocumentNode,
  698. Line: 3,
  699. Column: 1,
  700. Content: []*yaml.Node{{
  701. Kind: yaml.ScalarNode,
  702. Value: "true",
  703. Tag: "!!bool",
  704. Line: 3,
  705. Column: 1,
  706. HeadComment: "# One\n# Two",
  707. LineComment: "# Three",
  708. FootComment: "# Four\n# Five",
  709. }},
  710. },
  711. }, {
  712. "[decode]\n# One\n\n# Two\n\n# Three\ntrue # Four\n# Five\n\n# Six\n\n# Seven\n",
  713. yaml.Node{
  714. Kind: yaml.DocumentNode,
  715. Line: 7,
  716. Column: 1,
  717. HeadComment: "# One\n\n# Two",
  718. FootComment: "# Six\n\n# Seven",
  719. Content: []*yaml.Node{{
  720. Kind: yaml.ScalarNode,
  721. Value: "true",
  722. Tag: "!!bool",
  723. Line: 7,
  724. Column: 1,
  725. HeadComment: "# Three",
  726. LineComment: "# Four",
  727. FootComment: "# Five",
  728. }},
  729. },
  730. }, {
  731. // Write out the pound character if missing from comments.
  732. "[encode]# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  733. yaml.Node{
  734. Kind: yaml.DocumentNode,
  735. Line: 3,
  736. Column: 1,
  737. Content: []*yaml.Node{{
  738. Kind: yaml.ScalarNode,
  739. Value: "true",
  740. Tag: "!!bool",
  741. Line: 3,
  742. Column: 1,
  743. HeadComment: "One\nTwo\n",
  744. LineComment: "Three\n",
  745. FootComment: "Four\nFive\n",
  746. }},
  747. },
  748. }, {
  749. "[encode]# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  750. yaml.Node{
  751. Kind: yaml.DocumentNode,
  752. Line: 3,
  753. Column: 1,
  754. Content: []*yaml.Node{{
  755. Kind: yaml.ScalarNode,
  756. Value: "true",
  757. Tag: "!!bool",
  758. Line: 3,
  759. Column: 1,
  760. HeadComment: " One\n Two",
  761. LineComment: " Three",
  762. FootComment: " Four\n Five",
  763. }},
  764. },
  765. }, {
  766. "# DH1\n\n# DH2\n\n# H1\n# H2\ntrue # I\n# F1\n# F2\n\n# DF1\n\n# DF2\n",
  767. yaml.Node{
  768. Kind: yaml.DocumentNode,
  769. Line: 7,
  770. Column: 1,
  771. HeadComment: "# DH1\n\n# DH2",
  772. FootComment: "# DF1\n\n# DF2",
  773. Content: []*yaml.Node{{
  774. Kind: yaml.ScalarNode,
  775. Value: "true",
  776. Tag: "!!bool",
  777. Line: 7,
  778. Column: 1,
  779. HeadComment: "# H1\n# H2",
  780. LineComment: "# I",
  781. FootComment: "# F1\n# F2",
  782. }},
  783. },
  784. }, {
  785. "# 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",
  786. yaml.Node{
  787. Kind: yaml.DocumentNode,
  788. Line: 7,
  789. Column: 1,
  790. HeadComment: "# DH1\n\n# DH2",
  791. FootComment: "# DF1\n\n# DF2",
  792. Content: []*yaml.Node{{
  793. Kind: yaml.MappingNode,
  794. Tag: "!!map",
  795. Line: 7,
  796. Column: 1,
  797. Content: []*yaml.Node{{
  798. Kind: yaml.ScalarNode,
  799. Line: 7,
  800. Column: 1,
  801. Tag: "!!str",
  802. Value: "ka",
  803. HeadComment: "# HA1\n# HA2",
  804. FootComment: "# FA1\n# FA2",
  805. }, {
  806. Kind: yaml.ScalarNode,
  807. Line: 7,
  808. Column: 5,
  809. Tag: "!!str",
  810. Value: "va",
  811. LineComment: "# IA",
  812. }, {
  813. Kind: yaml.ScalarNode,
  814. Line: 13,
  815. Column: 1,
  816. Tag: "!!str",
  817. Value: "kb",
  818. HeadComment: "# HB1\n# HB2",
  819. FootComment: "# FB1\n# FB2",
  820. }, {
  821. Kind: yaml.ScalarNode,
  822. Line: 13,
  823. Column: 5,
  824. Tag: "!!str",
  825. Value: "vb",
  826. LineComment: "# IB",
  827. }},
  828. }},
  829. },
  830. }, {
  831. "# 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",
  832. yaml.Node{
  833. Kind: yaml.DocumentNode,
  834. Line: 7,
  835. Column: 1,
  836. HeadComment: "# DH1\n\n# DH2",
  837. FootComment: "# DF1\n\n# DF2",
  838. Content: []*yaml.Node{{
  839. Kind: yaml.SequenceNode,
  840. Tag: "!!seq",
  841. Line: 7,
  842. Column: 1,
  843. Content: []*yaml.Node{{
  844. Kind: yaml.ScalarNode,
  845. Tag: "!!str",
  846. Line: 7,
  847. Column: 3,
  848. Value: "la",
  849. HeadComment: "# HA1\n# HA2",
  850. LineComment: "# IA",
  851. FootComment: "# FA1\n# FA2",
  852. }, {
  853. Kind: yaml.ScalarNode,
  854. Tag: "!!str",
  855. Line: 13,
  856. Column: 3,
  857. Value: "lb",
  858. HeadComment: "# HB1\n# HB2",
  859. LineComment: "# IB",
  860. FootComment: "# FB1\n# FB2",
  861. }},
  862. }},
  863. },
  864. }, {
  865. "# DH1\n\n- la # IA\n# HB1\n- lb\n",
  866. yaml.Node{
  867. Kind: yaml.DocumentNode,
  868. Line: 3,
  869. Column: 1,
  870. HeadComment: "# DH1",
  871. Content: []*yaml.Node{{
  872. Kind: yaml.SequenceNode,
  873. Tag: "!!seq",
  874. Line: 3,
  875. Column: 1,
  876. Content: []*yaml.Node{{
  877. Kind: yaml.ScalarNode,
  878. Tag: "!!str",
  879. Line: 3,
  880. Column: 3,
  881. Value: "la",
  882. LineComment: "# IA",
  883. }, {
  884. Kind: yaml.ScalarNode,
  885. Tag: "!!str",
  886. Line: 5,
  887. Column: 3,
  888. Value: "lb",
  889. HeadComment: "# HB1",
  890. }},
  891. }},
  892. },
  893. }, {
  894. "# 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",
  895. yaml.Node{
  896. Kind: yaml.DocumentNode,
  897. Line: 4,
  898. Column: 1,
  899. HeadComment: "# DH1",
  900. FootComment: "# DF1",
  901. Content: []*yaml.Node{{
  902. Kind: yaml.MappingNode,
  903. Tag: "!!map",
  904. Line: 4,
  905. Column: 1,
  906. Content: []*yaml.Node{{
  907. Kind: yaml.ScalarNode,
  908. Tag: "!!str",
  909. Line: 4,
  910. Column: 1,
  911. Value: "ka",
  912. HeadComment: "# HA1",
  913. }, {
  914. Kind: yaml.MappingNode,
  915. Tag: "!!map",
  916. Line: 6,
  917. Column: 3,
  918. Content: []*yaml.Node{{
  919. Kind: yaml.ScalarNode,
  920. Tag: "!!str",
  921. Line: 6,
  922. Column: 3,
  923. Value: "kb",
  924. HeadComment: "# HB1",
  925. }, {
  926. Kind: yaml.SequenceNode,
  927. Line: 9,
  928. Column: 3,
  929. Tag: "!!seq",
  930. Content: []*yaml.Node{{
  931. Kind: yaml.ScalarNode,
  932. Tag: "!!str",
  933. Line: 9,
  934. Column: 5,
  935. Value: "lc",
  936. HeadComment: "# HC1\n# HC2",
  937. LineComment: "# IC",
  938. FootComment: "# FC1\n# FC2",
  939. }, {
  940. Kind: yaml.ScalarNode,
  941. Tag: "!!str",
  942. Line: 14,
  943. Column: 5,
  944. Value: "ld",
  945. HeadComment: "# HD1",
  946. LineComment: "# ID",
  947. FootComment: "# FD1",
  948. }},
  949. }},
  950. }},
  951. }},
  952. },
  953. }, {
  954. "# 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",
  955. yaml.Node{
  956. Kind: yaml.DocumentNode,
  957. Line: 4,
  958. Column: 1,
  959. HeadComment: "# DH1",
  960. FootComment: "# DF1",
  961. Content: []*yaml.Node{{
  962. Kind: yaml.MappingNode,
  963. Tag: "!!map",
  964. Line: 4,
  965. Column: 1,
  966. Content: []*yaml.Node{{
  967. Kind: yaml.ScalarNode,
  968. Tag: "!!str",
  969. Line: 4,
  970. Column: 1,
  971. Value: "ka",
  972. HeadComment: "# HA1",
  973. }, {
  974. Kind: yaml.MappingNode,
  975. Tag: "!!map",
  976. Line: 6,
  977. Column: 3,
  978. Content: []*yaml.Node{{
  979. Kind: yaml.ScalarNode,
  980. Tag: "!!str",
  981. Line: 6,
  982. Column: 3,
  983. Value: "kb",
  984. HeadComment: "# HB1",
  985. }, {
  986. Kind: yaml.SequenceNode,
  987. Line: 9,
  988. Column: 3,
  989. Tag: "!!seq",
  990. Content: []*yaml.Node{{
  991. Kind: yaml.ScalarNode,
  992. Tag: "!!str",
  993. Line: 9,
  994. Column: 5,
  995. Value: "lc",
  996. HeadComment: "# HC1\n# HC2",
  997. LineComment: "# IC",
  998. FootComment: "# FC1\n# FC2",
  999. }, {
  1000. Kind: yaml.ScalarNode,
  1001. Tag: "!!str",
  1002. Line: 14,
  1003. Column: 5,
  1004. Value: "ld",
  1005. HeadComment: "# HD1",
  1006. LineComment: "# ID",
  1007. FootComment: "# FD1",
  1008. }},
  1009. }},
  1010. }, {
  1011. Kind: yaml.ScalarNode,
  1012. Tag: "!!str",
  1013. Line: 16,
  1014. Column: 1,
  1015. Value: "ke",
  1016. }, {
  1017. Kind: yaml.ScalarNode,
  1018. Tag: "!!str",
  1019. Line: 16,
  1020. Column: 5,
  1021. Value: "ve",
  1022. }},
  1023. }},
  1024. },
  1025. }, {
  1026. "# DH1\n\n# DH2\n\n# HA1\n# HA2\nka:\n # HB1\n # HB2\n kb:\n" +
  1027. " # HC1\n # HC2\n kc:\n # HD1\n # HD2\n kd: vd\n # FD1\n # FD2\n" +
  1028. " # 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",
  1029. yaml.Node{
  1030. Kind: yaml.DocumentNode,
  1031. HeadComment: "# DH1\n\n# DH2",
  1032. FootComment: "# DF1\n\n# DF2",
  1033. Line: 7,
  1034. Column: 1,
  1035. Content: []*yaml.Node{{
  1036. Kind: yaml.MappingNode,
  1037. Tag: "!!map",
  1038. Line: 7,
  1039. Column: 1,
  1040. Content: []*yaml.Node{{
  1041. Kind: yaml.ScalarNode,
  1042. Tag: "!!str",
  1043. Value: "ka",
  1044. HeadComment: "# HA1\n# HA2",
  1045. FootComment: "# FA1\n# FA2",
  1046. Line: 7,
  1047. Column: 1,
  1048. }, {
  1049. Kind: yaml.MappingNode,
  1050. Tag: "!!map",
  1051. Line: 10,
  1052. Column: 3,
  1053. Content: []*yaml.Node{{
  1054. Kind: yaml.ScalarNode,
  1055. Tag: "!!str",
  1056. Value: "kb",
  1057. HeadComment: "# HB1\n# HB2",
  1058. FootComment: "# FB1\n# FB2",
  1059. Line: 10,
  1060. Column: 3,
  1061. }, {
  1062. Kind: yaml.MappingNode,
  1063. Tag: "!!map",
  1064. Line: 13,
  1065. Column: 5,
  1066. Content: []*yaml.Node{{
  1067. Kind: yaml.ScalarNode,
  1068. Tag: "!!str",
  1069. Value: "kc",
  1070. HeadComment: "# HC1\n# HC2",
  1071. FootComment: "# FC1\n# FC2",
  1072. Line: 13,
  1073. Column: 5,
  1074. }, {
  1075. Kind: yaml.MappingNode,
  1076. Tag: "!!map",
  1077. Line: 16,
  1078. Column: 7,
  1079. Content: []*yaml.Node{{
  1080. Kind: yaml.ScalarNode,
  1081. Tag: "!!str",
  1082. Value: "kd",
  1083. HeadComment: "# HD1\n# HD2",
  1084. FootComment: "# FD1\n# FD2",
  1085. Line: 16,
  1086. Column: 7,
  1087. }, {
  1088. Kind: yaml.ScalarNode,
  1089. Tag: "!!str",
  1090. Value: "vd",
  1091. Line: 16,
  1092. Column: 11,
  1093. }},
  1094. }},
  1095. }},
  1096. }, {
  1097. Kind: yaml.ScalarNode,
  1098. Tag: "!!str",
  1099. Value: "ke",
  1100. HeadComment: "# HE1\n# HE2",
  1101. FootComment: "# FE1\n# FE2",
  1102. Line: 28,
  1103. Column: 1,
  1104. }, {
  1105. Kind: yaml.ScalarNode,
  1106. Tag: "!!str",
  1107. Value: "ve",
  1108. Line: 28,
  1109. Column: 5,
  1110. }},
  1111. }},
  1112. },
  1113. }, {
  1114. // Same as above but indenting ke in so it's also part of ka's value.
  1115. "# DH1\n\n# DH2\n\n# HA1\n# HA2\nka:\n # HB1\n # HB2\n kb:\n" +
  1116. " # HC1\n # HC2\n kc:\n # HD1\n # HD2\n kd: vd\n # FD1\n # FD2\n" +
  1117. " # 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",
  1118. yaml.Node{
  1119. Kind: yaml.DocumentNode,
  1120. HeadComment: "# DH1\n\n# DH2",
  1121. FootComment: "# DF1\n\n# DF2",
  1122. Line: 7,
  1123. Column: 1,
  1124. Content: []*yaml.Node{{
  1125. Kind: yaml.MappingNode,
  1126. Tag: "!!map",
  1127. Line: 7,
  1128. Column: 1,
  1129. Content: []*yaml.Node{{
  1130. Kind: yaml.ScalarNode,
  1131. Tag: "!!str",
  1132. Value: "ka",
  1133. HeadComment: "# HA1\n# HA2",
  1134. FootComment: "# FA1\n# FA2",
  1135. Line: 7,
  1136. Column: 1,
  1137. }, {
  1138. Kind: yaml.MappingNode,
  1139. Tag: "!!map",
  1140. Line: 10,
  1141. Column: 3,
  1142. Content: []*yaml.Node{{
  1143. Kind: yaml.ScalarNode,
  1144. Tag: "!!str",
  1145. Value: "kb",
  1146. HeadComment: "# HB1\n# HB2",
  1147. FootComment: "# FB1\n# FB2",
  1148. Line: 10,
  1149. Column: 3,
  1150. }, {
  1151. Kind: yaml.MappingNode,
  1152. Tag: "!!map",
  1153. Line: 13,
  1154. Column: 5,
  1155. Content: []*yaml.Node{{
  1156. Kind: yaml.ScalarNode,
  1157. Tag: "!!str",
  1158. Value: "kc",
  1159. HeadComment: "# HC1\n# HC2",
  1160. FootComment: "# FC1\n# FC2",
  1161. Line: 13,
  1162. Column: 5,
  1163. }, {
  1164. Kind: yaml.MappingNode,
  1165. Tag: "!!map",
  1166. Line: 16,
  1167. Column: 7,
  1168. Content: []*yaml.Node{{
  1169. Kind: yaml.ScalarNode,
  1170. Tag: "!!str",
  1171. Value: "kd",
  1172. HeadComment: "# HD1\n# HD2",
  1173. FootComment: "# FD1\n# FD2",
  1174. Line: 16,
  1175. Column: 7,
  1176. }, {
  1177. Kind: yaml.ScalarNode,
  1178. Tag: "!!str",
  1179. Value: "vd",
  1180. Line: 16,
  1181. Column: 11,
  1182. }},
  1183. }},
  1184. }, {
  1185. Kind: yaml.ScalarNode,
  1186. Tag: "!!str",
  1187. Value: "ke",
  1188. HeadComment: "# HE1\n# HE2",
  1189. FootComment: "# FE1\n# FE2",
  1190. Line: 26,
  1191. Column: 3,
  1192. }, {
  1193. Kind: yaml.ScalarNode,
  1194. Tag: "!!str",
  1195. Value: "ve",
  1196. Line: 26,
  1197. Column: 7,
  1198. }},
  1199. }},
  1200. }},
  1201. },
  1202. }, {
  1203. // Decode only due to lack of newline at the end.
  1204. "[decode]# HA1\nka:\n # HB1\n kb: vb\n # FB1\n# FA1",
  1205. yaml.Node{
  1206. Kind: yaml.DocumentNode,
  1207. Line: 2,
  1208. Column: 1,
  1209. Content: []*yaml.Node{{
  1210. Kind: yaml.MappingNode,
  1211. Tag: "!!map",
  1212. Line: 2,
  1213. Column: 1,
  1214. Content: []*yaml.Node{{
  1215. Kind: yaml.ScalarNode,
  1216. Tag: "!!str",
  1217. Value: "ka",
  1218. HeadComment: "# HA1",
  1219. FootComment: "# FA1",
  1220. Line: 2,
  1221. Column: 1,
  1222. }, {
  1223. Kind: yaml.MappingNode,
  1224. Tag: "!!map",
  1225. Line: 4,
  1226. Column: 3,
  1227. Content: []*yaml.Node{{
  1228. Kind: yaml.ScalarNode,
  1229. Tag: "!!str",
  1230. Value: "kb",
  1231. HeadComment: "# HB1",
  1232. FootComment: "# FB1",
  1233. Line: 4,
  1234. Column: 3,
  1235. }, {
  1236. Kind: yaml.ScalarNode,
  1237. Tag: "!!str",
  1238. Value: "vb",
  1239. Line: 4,
  1240. Column: 7,
  1241. }},
  1242. }},
  1243. },
  1244. },
  1245. },
  1246. }, {
  1247. // Same as above, but with newline at the end.
  1248. "# HA1\nka:\n # HB1\n kb: vb\n # FB1\n# FA1\n",
  1249. yaml.Node{
  1250. Kind: yaml.DocumentNode,
  1251. Line: 2,
  1252. Column: 1,
  1253. Content: []*yaml.Node{{
  1254. Kind: yaml.MappingNode,
  1255. Tag: "!!map",
  1256. Line: 2,
  1257. Column: 1,
  1258. Content: []*yaml.Node{{
  1259. Kind: yaml.ScalarNode,
  1260. Tag: "!!str",
  1261. Value: "ka",
  1262. HeadComment: "# HA1",
  1263. FootComment: "# FA1",
  1264. Line: 2,
  1265. Column: 1,
  1266. }, {
  1267. Kind: yaml.MappingNode,
  1268. Tag: "!!map",
  1269. Line: 4,
  1270. Column: 3,
  1271. Content: []*yaml.Node{{
  1272. Kind: yaml.ScalarNode,
  1273. Tag: "!!str",
  1274. Value: "kb",
  1275. HeadComment: "# HB1",
  1276. FootComment: "# FB1",
  1277. Line: 4,
  1278. Column: 3,
  1279. }, {
  1280. Kind: yaml.ScalarNode,
  1281. Tag: "!!str",
  1282. Value: "vb",
  1283. Line: 4,
  1284. Column: 7,
  1285. }},
  1286. }},
  1287. },
  1288. },
  1289. },
  1290. }, {
  1291. // Same as above, but without FB1.
  1292. "# HA1\nka:\n # HB1\n kb: vb\n# FA1\n",
  1293. yaml.Node{
  1294. Kind: yaml.DocumentNode,
  1295. Line: 2,
  1296. Column: 1,
  1297. Content: []*yaml.Node{{
  1298. Kind: yaml.MappingNode,
  1299. Tag: "!!map",
  1300. Line: 2,
  1301. Column: 1,
  1302. Content: []*yaml.Node{{
  1303. Kind: yaml.ScalarNode,
  1304. Tag: "!!str",
  1305. Value: "ka",
  1306. HeadComment: "# HA1",
  1307. FootComment: "# FA1",
  1308. Line: 2,
  1309. Column: 1,
  1310. }, {
  1311. Kind: yaml.MappingNode,
  1312. Tag: "!!map",
  1313. Line: 4,
  1314. Column: 3,
  1315. Content: []*yaml.Node{{
  1316. Kind: yaml.ScalarNode,
  1317. Tag: "!!str",
  1318. Value: "kb",
  1319. HeadComment: "# HB1",
  1320. Line: 4,
  1321. Column: 3,
  1322. }, {
  1323. Kind: yaml.ScalarNode,
  1324. Tag: "!!str",
  1325. Value: "vb",
  1326. Line: 4,
  1327. Column: 7,
  1328. }},
  1329. }},
  1330. },
  1331. },
  1332. },
  1333. }, {
  1334. // Same as above, but with two newlines at the end. Decode-only for that.
  1335. "[decode]# HA1\nka:\n # HB1\n kb: vb\n # FB1\n# FA1\n\n",
  1336. yaml.Node{
  1337. Kind: yaml.DocumentNode,
  1338. Line: 2,
  1339. Column: 1,
  1340. Content: []*yaml.Node{{
  1341. Kind: yaml.MappingNode,
  1342. Tag: "!!map",
  1343. Line: 2,
  1344. Column: 1,
  1345. Content: []*yaml.Node{{
  1346. Kind: yaml.ScalarNode,
  1347. Tag: "!!str",
  1348. Value: "ka",
  1349. HeadComment: "# HA1",
  1350. FootComment: "# FA1",
  1351. Line: 2,
  1352. Column: 1,
  1353. }, {
  1354. Kind: yaml.MappingNode,
  1355. Tag: "!!map",
  1356. Line: 4,
  1357. Column: 3,
  1358. Content: []*yaml.Node{{
  1359. Kind: yaml.ScalarNode,
  1360. Tag: "!!str",
  1361. Value: "kb",
  1362. HeadComment: "# HB1",
  1363. FootComment: "# FB1",
  1364. Line: 4,
  1365. Column: 3,
  1366. }, {
  1367. Kind: yaml.ScalarNode,
  1368. Tag: "!!str",
  1369. Value: "vb",
  1370. Line: 4,
  1371. Column: 7,
  1372. }},
  1373. }},
  1374. },
  1375. },
  1376. },
  1377. }, {
  1378. "ka:\n kb: vb\n# FA1\n\nkc: vc\n",
  1379. yaml.Node{
  1380. Kind: yaml.DocumentNode,
  1381. Line: 1,
  1382. Column: 1,
  1383. Content: []*yaml.Node{{
  1384. Kind: yaml.MappingNode,
  1385. Tag: "!!map",
  1386. Line: 1,
  1387. Column: 1,
  1388. Content: []*yaml.Node{{
  1389. Kind: yaml.ScalarNode,
  1390. Tag: "!!str",
  1391. Value: "ka",
  1392. Line: 1,
  1393. Column: 1,
  1394. FootComment: "# FA1",
  1395. }, {
  1396. Kind: yaml.MappingNode,
  1397. Tag: "!!map",
  1398. Line: 2,
  1399. Column: 3,
  1400. Content: []*yaml.Node{{
  1401. Kind: yaml.ScalarNode,
  1402. Tag: "!!str",
  1403. Value: "kb",
  1404. Line: 2,
  1405. Column: 3,
  1406. }, {
  1407. Kind: yaml.ScalarNode,
  1408. Tag: "!!str",
  1409. Value: "vb",
  1410. Line: 2,
  1411. Column: 7,
  1412. }},
  1413. }, {
  1414. Kind: yaml.ScalarNode,
  1415. Tag: "!!str",
  1416. Value: "kc",
  1417. Line: 5,
  1418. Column: 1,
  1419. }, {
  1420. Kind: yaml.ScalarNode,
  1421. Tag: "!!str",
  1422. Value: "vc",
  1423. Line: 5,
  1424. Column: 5,
  1425. }},
  1426. }},
  1427. },
  1428. }, {
  1429. "ka:\n kb: vb\n# HC1\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. }, {
  1446. Kind: yaml.MappingNode,
  1447. Tag: "!!map",
  1448. Line: 2,
  1449. Column: 3,
  1450. Content: []*yaml.Node{{
  1451. Kind: yaml.ScalarNode,
  1452. Tag: "!!str",
  1453. Value: "kb",
  1454. Line: 2,
  1455. Column: 3,
  1456. }, {
  1457. Kind: yaml.ScalarNode,
  1458. Tag: "!!str",
  1459. Value: "vb",
  1460. Line: 2,
  1461. Column: 7,
  1462. }},
  1463. }, {
  1464. Kind: yaml.ScalarNode,
  1465. Tag: "!!str",
  1466. Value: "kc",
  1467. HeadComment: "# HC1",
  1468. Line: 4,
  1469. Column: 1,
  1470. }, {
  1471. Kind: yaml.ScalarNode,
  1472. Tag: "!!str",
  1473. Value: "vc",
  1474. Line: 4,
  1475. Column: 5,
  1476. }},
  1477. }},
  1478. },
  1479. }, {
  1480. // Decode only due to empty line before HC1.
  1481. "[decode]ka:\n kb: vb\n\n# HC1\nkc: vc\n",
  1482. yaml.Node{
  1483. Kind: yaml.DocumentNode,
  1484. Line: 1,
  1485. Column: 1,
  1486. Content: []*yaml.Node{{
  1487. Kind: yaml.MappingNode,
  1488. Tag: "!!map",
  1489. Line: 1,
  1490. Column: 1,
  1491. Content: []*yaml.Node{{
  1492. Kind: yaml.ScalarNode,
  1493. Tag: "!!str",
  1494. Value: "ka",
  1495. Line: 1,
  1496. Column: 1,
  1497. }, {
  1498. Kind: yaml.MappingNode,
  1499. Tag: "!!map",
  1500. Line: 2,
  1501. Column: 3,
  1502. Content: []*yaml.Node{{
  1503. Kind: yaml.ScalarNode,
  1504. Tag: "!!str",
  1505. Value: "kb",
  1506. Line: 2,
  1507. Column: 3,
  1508. }, {
  1509. Kind: yaml.ScalarNode,
  1510. Tag: "!!str",
  1511. Value: "vb",
  1512. Line: 2,
  1513. Column: 7,
  1514. }},
  1515. }, {
  1516. Kind: yaml.ScalarNode,
  1517. Tag: "!!str",
  1518. Value: "kc",
  1519. HeadComment: "# HC1",
  1520. Line: 5,
  1521. Column: 1,
  1522. }, {
  1523. Kind: yaml.ScalarNode,
  1524. Tag: "!!str",
  1525. Value: "vc",
  1526. Line: 5,
  1527. Column: 5,
  1528. }},
  1529. }},
  1530. },
  1531. }, {
  1532. // Decode-only due to empty lines around HC1.
  1533. "[decode]ka:\n kb: vb\n\n# HC1\n\nkc: vc\n",
  1534. yaml.Node{
  1535. Kind: yaml.DocumentNode,
  1536. Line: 1,
  1537. Column: 1,
  1538. Content: []*yaml.Node{{
  1539. Kind: yaml.MappingNode,
  1540. Tag: "!!map",
  1541. Line: 1,
  1542. Column: 1,
  1543. Content: []*yaml.Node{{
  1544. Kind: yaml.ScalarNode,
  1545. Tag: "!!str",
  1546. Value: "ka",
  1547. Line: 1,
  1548. Column: 1,
  1549. }, {
  1550. Kind: yaml.MappingNode,
  1551. Tag: "!!map",
  1552. Line: 2,
  1553. Column: 3,
  1554. Content: []*yaml.Node{{
  1555. Kind: yaml.ScalarNode,
  1556. Tag: "!!str",
  1557. Value: "kb",
  1558. Line: 2,
  1559. Column: 3,
  1560. }, {
  1561. Kind: yaml.ScalarNode,
  1562. Tag: "!!str",
  1563. Value: "vb",
  1564. Line: 2,
  1565. Column: 7,
  1566. }},
  1567. }, {
  1568. Kind: yaml.ScalarNode,
  1569. Tag: "!!str",
  1570. Value: "kc",
  1571. HeadComment: "# HC1\n",
  1572. Line: 6,
  1573. Column: 1,
  1574. }, {
  1575. Kind: yaml.ScalarNode,
  1576. Tag: "!!str",
  1577. Value: "vc",
  1578. Line: 6,
  1579. Column: 5,
  1580. }},
  1581. }},
  1582. },
  1583. }, {
  1584. "ka: # IA\n kb: # IB\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. LineComment: "# IA",
  1601. }, {
  1602. Kind: yaml.MappingNode,
  1603. Tag: "!!map",
  1604. Line: 2,
  1605. Column: 3,
  1606. Content: []*yaml.Node{{
  1607. Kind: yaml.ScalarNode,
  1608. Tag: "!!str",
  1609. Value: "kb",
  1610. Line: 2,
  1611. Column: 3,
  1612. LineComment: "# IB",
  1613. }, {
  1614. Kind: yaml.ScalarNode,
  1615. Tag: "!!null",
  1616. Line: 2,
  1617. Column: 6,
  1618. }},
  1619. }},
  1620. }},
  1621. },
  1622. }, {
  1623. "# HA1\nka:\n # HB1\n kb: vb\n # FB1\n# HC1\n# HC2\nkc: vc\n# FC1\n# FC2\n",
  1624. yaml.Node{
  1625. Kind: yaml.DocumentNode,
  1626. Line: 2,
  1627. Column: 1,
  1628. Content: []*yaml.Node{{
  1629. Kind: yaml.MappingNode,
  1630. Tag: "!!map",
  1631. Line: 2,
  1632. Column: 1,
  1633. Content: []*yaml.Node{{
  1634. Kind: yaml.ScalarNode,
  1635. Tag: "!!str",
  1636. Value: "ka",
  1637. HeadComment: "# HA1",
  1638. Line: 2,
  1639. Column: 1,
  1640. }, {
  1641. Kind: yaml.MappingNode,
  1642. Tag: "!!map",
  1643. Line: 4,
  1644. Column: 3,
  1645. Content: []*yaml.Node{{
  1646. Kind: yaml.ScalarNode,
  1647. Tag: "!!str",
  1648. Value: "kb",
  1649. HeadComment: "# HB1",
  1650. FootComment: "# FB1",
  1651. Line: 4,
  1652. Column: 3,
  1653. }, {
  1654. Kind: yaml.ScalarNode,
  1655. Tag: "!!str",
  1656. Value: "vb",
  1657. Line: 4,
  1658. Column: 7,
  1659. }},
  1660. }, {
  1661. Kind: yaml.ScalarNode,
  1662. Tag: "!!str",
  1663. Value: "kc",
  1664. HeadComment: "# HC1\n# HC2",
  1665. FootComment: "# FC1\n# FC2",
  1666. Line: 8,
  1667. Column: 1,
  1668. }, {
  1669. Kind: yaml.ScalarNode,
  1670. Tag: "!!str",
  1671. Value: "vc",
  1672. Line: 8,
  1673. Column: 5,
  1674. }},
  1675. }},
  1676. },
  1677. }, {
  1678. // Same as above, but decode only due to empty line between ka's value and kc's headers.
  1679. "[decode]# HA1\nka:\n # HB1\n kb: vb\n # FB1\n\n# HC1\n# HC2\nkc: vc\n# FC1\n# FC2\n",
  1680. yaml.Node{
  1681. Kind: yaml.DocumentNode,
  1682. Line: 2,
  1683. Column: 1,
  1684. Content: []*yaml.Node{{
  1685. Kind: yaml.MappingNode,
  1686. Tag: "!!map",
  1687. Line: 2,
  1688. Column: 1,
  1689. Content: []*yaml.Node{{
  1690. Kind: yaml.ScalarNode,
  1691. Tag: "!!str",
  1692. Value: "ka",
  1693. HeadComment: "# HA1",
  1694. Line: 2,
  1695. Column: 1,
  1696. }, {
  1697. Kind: yaml.MappingNode,
  1698. Tag: "!!map",
  1699. Line: 4,
  1700. Column: 3,
  1701. Content: []*yaml.Node{{
  1702. Kind: yaml.ScalarNode,
  1703. Tag: "!!str",
  1704. Value: "kb",
  1705. HeadComment: "# HB1",
  1706. FootComment: "# FB1",
  1707. Line: 4,
  1708. Column: 3,
  1709. }, {
  1710. Kind: yaml.ScalarNode,
  1711. Tag: "!!str",
  1712. Value: "vb",
  1713. Line: 4,
  1714. Column: 7,
  1715. }},
  1716. }, {
  1717. Kind: yaml.ScalarNode,
  1718. Tag: "!!str",
  1719. Value: "kc",
  1720. HeadComment: "# HC1\n# HC2",
  1721. FootComment: "# FC1\n# FC2",
  1722. Line: 9,
  1723. Column: 1,
  1724. }, {
  1725. Kind: yaml.ScalarNode,
  1726. Tag: "!!str",
  1727. Value: "vc",
  1728. Line: 9,
  1729. Column: 5,
  1730. }},
  1731. }},
  1732. },
  1733. }, {
  1734. "# H1\n[la, lb] # I\n# F1\n",
  1735. yaml.Node{
  1736. Kind: yaml.DocumentNode,
  1737. Line: 2,
  1738. Column: 1,
  1739. Content: []*yaml.Node{{
  1740. Kind: yaml.SequenceNode,
  1741. Tag: "!!seq",
  1742. Style: yaml.FlowStyle,
  1743. Line: 2,
  1744. Column: 1,
  1745. HeadComment: "# H1",
  1746. LineComment: "# I",
  1747. FootComment: "# F1",
  1748. Content: []*yaml.Node{{
  1749. Kind: yaml.ScalarNode,
  1750. Tag: "!!str",
  1751. Line: 2,
  1752. Column: 2,
  1753. Value: "la",
  1754. }, {
  1755. Kind: yaml.ScalarNode,
  1756. Tag: "!!str",
  1757. Line: 2,
  1758. Column: 6,
  1759. Value: "lb",
  1760. }},
  1761. }},
  1762. },
  1763. }, {
  1764. "# 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",
  1765. yaml.Node{
  1766. Kind: yaml.DocumentNode,
  1767. Line: 4,
  1768. Column: 1,
  1769. HeadComment: "# DH1",
  1770. FootComment: "# DF1",
  1771. Content: []*yaml.Node{{
  1772. Kind: yaml.SequenceNode,
  1773. Tag: "!!seq",
  1774. Style: yaml.FlowStyle,
  1775. Line: 4,
  1776. Column: 1,
  1777. HeadComment: "# SH1",
  1778. FootComment: "# SF1",
  1779. Content: []*yaml.Node{{
  1780. Kind: yaml.ScalarNode,
  1781. Tag: "!!str",
  1782. Line: 6,
  1783. Column: 3,
  1784. Value: "la",
  1785. HeadComment: "# HA1",
  1786. LineComment: "# IA",
  1787. FootComment: "# FA1",
  1788. }, {
  1789. Kind: yaml.ScalarNode,
  1790. Tag: "!!str",
  1791. Line: 10,
  1792. Column: 3,
  1793. Value: "lb",
  1794. HeadComment: "# HB1",
  1795. LineComment: "# IB",
  1796. FootComment: "# FB1",
  1797. }},
  1798. }},
  1799. },
  1800. }, {
  1801. "# 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",
  1802. yaml.Node{
  1803. Kind: yaml.DocumentNode,
  1804. Line: 4,
  1805. Column: 1,
  1806. HeadComment: "# DH1",
  1807. FootComment: "# DF1",
  1808. Content: []*yaml.Node{{
  1809. Kind: yaml.SequenceNode,
  1810. Tag: "!!seq",
  1811. Style: yaml.FlowStyle,
  1812. Line: 4,
  1813. Column: 1,
  1814. HeadComment: "# SH1",
  1815. FootComment: "# SF1",
  1816. Content: []*yaml.Node{{
  1817. Kind: yaml.ScalarNode,
  1818. Tag: "!!str",
  1819. Line: 6,
  1820. Column: 3,
  1821. Value: "la",
  1822. HeadComment: "# HA1",
  1823. FootComment: "# FA1",
  1824. }, {
  1825. Kind: yaml.ScalarNode,
  1826. Tag: "!!str",
  1827. Line: 10,
  1828. Column: 3,
  1829. Value: "lb",
  1830. HeadComment: "# HB1",
  1831. FootComment: "# FB1",
  1832. }},
  1833. }},
  1834. },
  1835. }, {
  1836. "ka:\n kb: [\n # HA1\n la,\n # FA1\n\n # HB1\n lb,\n # FB1\n ]\n",
  1837. yaml.Node{
  1838. Kind: yaml.DocumentNode,
  1839. Line: 1,
  1840. Column: 1,
  1841. Content: []*yaml.Node{{
  1842. Kind: yaml.MappingNode,
  1843. Tag: "!!map",
  1844. Line: 1,
  1845. Column: 1,
  1846. Content: []*yaml.Node{{
  1847. Kind: yaml.ScalarNode,
  1848. Tag: "!!str",
  1849. Value: "ka",
  1850. Line: 1,
  1851. Column: 1,
  1852. }, {
  1853. Kind: 0x4,
  1854. Tag: "!!map",
  1855. Line: 2,
  1856. Column: 3,
  1857. Content: []*yaml.Node{{
  1858. Kind: yaml.ScalarNode,
  1859. Tag: "!!str",
  1860. Value: "kb",
  1861. Line: 2,
  1862. Column: 3,
  1863. }, {
  1864. Kind: yaml.SequenceNode,
  1865. Style: 0x20,
  1866. Tag: "!!seq",
  1867. Line: 2,
  1868. Column: 7,
  1869. Content: []*yaml.Node{{
  1870. Kind: yaml.ScalarNode,
  1871. Tag: "!!str",
  1872. Value: "la",
  1873. HeadComment: "# HA1",
  1874. FootComment: "# FA1",
  1875. Line: 4,
  1876. Column: 5,
  1877. }, {
  1878. Kind: yaml.ScalarNode,
  1879. Tag: "!!str",
  1880. Value: "lb",
  1881. HeadComment: "# HB1",
  1882. FootComment: "# FB1",
  1883. Line: 8,
  1884. Column: 5,
  1885. }},
  1886. }},
  1887. }},
  1888. }},
  1889. },
  1890. }, {
  1891. "# 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",
  1892. yaml.Node{
  1893. Kind: yaml.DocumentNode,
  1894. Line: 4,
  1895. Column: 1,
  1896. HeadComment: "# DH1",
  1897. FootComment: "# DF1",
  1898. Content: []*yaml.Node{{
  1899. Kind: yaml.MappingNode,
  1900. Tag: "!!map",
  1901. Style: yaml.FlowStyle,
  1902. Line: 4,
  1903. Column: 1,
  1904. HeadComment: "# MH1",
  1905. FootComment: "# MF1",
  1906. Content: []*yaml.Node{{
  1907. Kind: yaml.ScalarNode,
  1908. Tag: "!!str",
  1909. Line: 6,
  1910. Column: 3,
  1911. Value: "ka",
  1912. HeadComment: "# HA1",
  1913. FootComment: "# FA1",
  1914. }, {
  1915. Kind: yaml.ScalarNode,
  1916. Tag: "!!str",
  1917. Line: 6,
  1918. Column: 7,
  1919. Value: "va",
  1920. LineComment: "# IA",
  1921. }, {
  1922. Kind: yaml.ScalarNode,
  1923. Tag: "!!str",
  1924. Line: 10,
  1925. Column: 3,
  1926. Value: "kb",
  1927. HeadComment: "# HB1",
  1928. FootComment: "# FB1",
  1929. }, {
  1930. Kind: yaml.ScalarNode,
  1931. Tag: "!!str",
  1932. Line: 10,
  1933. Column: 7,
  1934. Value: "vb",
  1935. LineComment: "# IB",
  1936. }},
  1937. }},
  1938. },
  1939. }, {
  1940. "# 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",
  1941. yaml.Node{
  1942. Kind: yaml.DocumentNode,
  1943. Line: 4,
  1944. Column: 1,
  1945. HeadComment: "# DH1",
  1946. FootComment: "# DF1",
  1947. Content: []*yaml.Node{{
  1948. Kind: yaml.MappingNode,
  1949. Tag: "!!map",
  1950. Style: yaml.FlowStyle,
  1951. Line: 4,
  1952. Column: 1,
  1953. HeadComment: "# MH1",
  1954. FootComment: "# MF1",
  1955. Content: []*yaml.Node{{
  1956. Kind: yaml.ScalarNode,
  1957. Tag: "!!str",
  1958. Line: 6,
  1959. Column: 3,
  1960. Value: "ka",
  1961. HeadComment: "# HA1",
  1962. FootComment: "# FA1",
  1963. }, {
  1964. Kind: yaml.ScalarNode,
  1965. Tag: "!!str",
  1966. Line: 6,
  1967. Column: 7,
  1968. Value: "va",
  1969. }, {
  1970. Kind: yaml.ScalarNode,
  1971. Tag: "!!str",
  1972. Line: 10,
  1973. Column: 3,
  1974. Value: "kb",
  1975. HeadComment: "# HB1",
  1976. FootComment: "# FB1",
  1977. }, {
  1978. Kind: yaml.ScalarNode,
  1979. Tag: "!!str",
  1980. Line: 10,
  1981. Column: 7,
  1982. Value: "vb",
  1983. }},
  1984. }},
  1985. },
  1986. }, {
  1987. "# 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",
  1988. yaml.Node{
  1989. Kind: yaml.DocumentNode,
  1990. Line: 7,
  1991. Column: 1,
  1992. HeadComment: "# DH1\n\n# DH2",
  1993. FootComment: "# DF1\n\n# DF2",
  1994. Content: []*yaml.Node{{
  1995. Kind: yaml.SequenceNode,
  1996. Tag: "!!seq",
  1997. Line: 7,
  1998. Column: 1,
  1999. Content: []*yaml.Node{
  2000. saveNode("x", &yaml.Node{
  2001. Kind: yaml.ScalarNode,
  2002. Tag: "!!str",
  2003. Line: 7,
  2004. Column: 3,
  2005. Value: "la",
  2006. HeadComment: "# HA1\n# HA2",
  2007. LineComment: "# IA",
  2008. FootComment: "# FA1\n# FA2",
  2009. Anchor: "x",
  2010. }), {
  2011. Kind: yaml.AliasNode,
  2012. Line: 13,
  2013. Column: 3,
  2014. Value: "x",
  2015. Alias: dropNode("x"),
  2016. HeadComment: "# HB1\n# HB2",
  2017. LineComment: "# IB",
  2018. FootComment: "# FB1\n# FB2",
  2019. },
  2020. },
  2021. }},
  2022. },
  2023. },
  2024. }
  2025. func (s *S) TestNodeRoundtrip(c *C) {
  2026. defer os.Setenv("TZ", os.Getenv("TZ"))
  2027. os.Setenv("TZ", "UTC")
  2028. for i, item := range nodeTests {
  2029. c.Logf("test %d: %q", i, item.yaml)
  2030. if strings.Contains(item.yaml, "#") {
  2031. var buf bytes.Buffer
  2032. fprintComments(&buf, &item.node, " ")
  2033. c.Logf(" comments:\n%s", buf.Bytes())
  2034. }
  2035. decode := true
  2036. encode := true
  2037. testYaml := item.yaml
  2038. if s := strings.TrimPrefix(testYaml, "[decode]"); s != testYaml {
  2039. encode = false
  2040. testYaml = s
  2041. }
  2042. if s := strings.TrimPrefix(testYaml, "[encode]"); s != testYaml {
  2043. decode = false
  2044. testYaml = s
  2045. }
  2046. if decode {
  2047. var node yaml.Node
  2048. err := yaml.Unmarshal([]byte(testYaml), &node)
  2049. c.Assert(err, IsNil)
  2050. c.Assert(node, DeepEquals, item.node)
  2051. }
  2052. if encode {
  2053. buf := bytes.Buffer{}
  2054. enc := yaml.NewEncoder(&buf)
  2055. enc.SetIndent(2)
  2056. err := enc.Encode(&item.node)
  2057. c.Assert(err, IsNil)
  2058. err = enc.Close()
  2059. c.Assert(err, IsNil)
  2060. c.Assert(buf.String(), Equals, testYaml)
  2061. }
  2062. }
  2063. }
  2064. var savedNodes = make(map[string]*yaml.Node)
  2065. func saveNode(name string, node *yaml.Node) *yaml.Node {
  2066. savedNodes[name] = node
  2067. return node
  2068. }
  2069. func peekNode(name string) *yaml.Node {
  2070. return savedNodes[name]
  2071. }
  2072. func dropNode(name string) *yaml.Node {
  2073. node := savedNodes[name]
  2074. delete(savedNodes, name)
  2075. return node
  2076. }
  2077. var setStringTests = []struct {
  2078. str string
  2079. yaml string
  2080. node yaml.Node
  2081. }{
  2082. {
  2083. "something simple",
  2084. "something simple\n",
  2085. yaml.Node{
  2086. Kind: yaml.ScalarNode,
  2087. Value: "something simple",
  2088. Tag: "!!str",
  2089. },
  2090. }, {
  2091. `"quoted value"`,
  2092. "'\"quoted value\"'\n",
  2093. yaml.Node{
  2094. Kind: yaml.ScalarNode,
  2095. Value: `"quoted value"`,
  2096. Tag: "!!str",
  2097. },
  2098. }, {
  2099. "multi\nline",
  2100. "|-\n multi\n line\n",
  2101. yaml.Node{
  2102. Kind: yaml.ScalarNode,
  2103. Value: "multi\nline",
  2104. Tag: "!!str",
  2105. Style: yaml.LiteralStyle,
  2106. },
  2107. }, {
  2108. "123",
  2109. "\"123\"\n",
  2110. yaml.Node{
  2111. Kind: yaml.ScalarNode,
  2112. Value: "123",
  2113. Tag: "!!str",
  2114. },
  2115. }, {
  2116. "multi\nline\n",
  2117. "|\n multi\n line\n",
  2118. yaml.Node{
  2119. Kind: yaml.ScalarNode,
  2120. Value: "multi\nline\n",
  2121. Tag: "!!str",
  2122. Style: yaml.LiteralStyle,
  2123. },
  2124. }, {
  2125. "\x80\x81\x82",
  2126. "!!binary gIGC\n",
  2127. yaml.Node{
  2128. Kind: yaml.ScalarNode,
  2129. Value: "gIGC",
  2130. Tag: "!!binary",
  2131. },
  2132. },
  2133. }
  2134. func (s *S) TestSetString(c *C) {
  2135. defer os.Setenv("TZ", os.Getenv("TZ"))
  2136. os.Setenv("TZ", "UTC")
  2137. for i, item := range setStringTests {
  2138. c.Logf("test %d: %q", i, item.str)
  2139. var node yaml.Node
  2140. node.SetString(item.str)
  2141. c.Assert(node, DeepEquals, item.node)
  2142. buf := bytes.Buffer{}
  2143. enc := yaml.NewEncoder(&buf)
  2144. enc.SetIndent(2)
  2145. err := enc.Encode(&item.node)
  2146. c.Assert(err, IsNil)
  2147. err = enc.Close()
  2148. c.Assert(err, IsNil)
  2149. c.Assert(buf.String(), Equals, item.yaml)
  2150. var doc yaml.Node
  2151. err = yaml.Unmarshal([]byte(item.yaml), &doc)
  2152. c.Assert(err, IsNil)
  2153. var str string
  2154. err = node.Decode(&str)
  2155. c.Assert(err, IsNil)
  2156. c.Assert(str, Equals, item.str)
  2157. }
  2158. }
  2159. func fprintComments(out io.Writer, node *yaml.Node, indent string) {
  2160. switch node.Kind {
  2161. case yaml.ScalarNode:
  2162. fmt.Fprintf(out, "%s<%s> ", indent, node.Value)
  2163. fprintCommentSet(out, node)
  2164. fmt.Fprintf(out, "\n")
  2165. case yaml.DocumentNode:
  2166. fmt.Fprintf(out, "%s<DOC> ", indent)
  2167. fprintCommentSet(out, node)
  2168. fmt.Fprintf(out, "\n")
  2169. for i := 0; i < len(node.Content); i++ {
  2170. fprintComments(out, node.Content[i], indent+" ")
  2171. }
  2172. case yaml.MappingNode:
  2173. fmt.Fprintf(out, "%s<MAP> ", indent)
  2174. fprintCommentSet(out, node)
  2175. fmt.Fprintf(out, "\n")
  2176. for i := 0; i < len(node.Content); i += 2 {
  2177. fprintComments(out, node.Content[i], indent+" ")
  2178. fprintComments(out, node.Content[i+1], indent+" ")
  2179. }
  2180. case yaml.SequenceNode:
  2181. fmt.Fprintf(out, "%s<SEQ> ", indent)
  2182. fprintCommentSet(out, node)
  2183. fmt.Fprintf(out, "\n")
  2184. for i := 0; i < len(node.Content); i++ {
  2185. fprintComments(out, node.Content[i], indent+" ")
  2186. }
  2187. }
  2188. }
  2189. func fprintCommentSet(out io.Writer, node *yaml.Node) {
  2190. if len(node.HeadComment)+len(node.LineComment)+len(node.FootComment) > 0 {
  2191. fmt.Fprintf(out, "%q / %q / %q", node.HeadComment, node.LineComment, node.FootComment)
  2192. }
  2193. }