node_test.go 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966
  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. // Write out the pound character if missing from comments.
  713. "[encode]# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  714. yaml.Node{
  715. Kind: yaml.DocumentNode,
  716. Line: 3,
  717. Column: 1,
  718. Content: []*yaml.Node{{
  719. Kind: yaml.ScalarNode,
  720. Value: "true",
  721. Tag: "!!bool",
  722. Line: 3,
  723. Column: 1,
  724. HeadComment: "One\nTwo\n",
  725. LineComment: "Three\n",
  726. FootComment: "Four\nFive\n",
  727. }},
  728. },
  729. }, {
  730. "[encode]# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  731. yaml.Node{
  732. Kind: yaml.DocumentNode,
  733. Line: 3,
  734. Column: 1,
  735. Content: []*yaml.Node{{
  736. Kind: yaml.ScalarNode,
  737. Value: "true",
  738. Tag: "!!bool",
  739. Line: 3,
  740. Column: 1,
  741. HeadComment: " One\n Two",
  742. LineComment: " Three",
  743. FootComment: " Four\n Five",
  744. }},
  745. },
  746. }, {
  747. "# DH1\n\n# DH2\n\n# H1\n# H2\ntrue # I\n# F1\n# F2\n\n# DF1\n\n# DF2\n",
  748. yaml.Node{
  749. Kind: yaml.DocumentNode,
  750. Line: 7,
  751. Column: 1,
  752. HeadComment: "# DH1\n\n# DH2",
  753. FootComment: "# DF1\n\n# DF2",
  754. Content: []*yaml.Node{{
  755. Kind: yaml.ScalarNode,
  756. Value: "true",
  757. Tag: "!!bool",
  758. Line: 7,
  759. Column: 1,
  760. HeadComment: "# H1\n# H2",
  761. LineComment: "# I",
  762. FootComment: "# F1\n# F2",
  763. }},
  764. },
  765. }, {
  766. "# 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",
  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.MappingNode,
  775. Tag: "!!map",
  776. Line: 7,
  777. Column: 1,
  778. Content: []*yaml.Node{{
  779. Kind: yaml.ScalarNode,
  780. Line: 7,
  781. Column: 1,
  782. Tag: "!!str",
  783. Value: "ka",
  784. HeadComment: "# HA1\n# HA2",
  785. FootComment: "# FA1\n# FA2",
  786. }, {
  787. Kind: yaml.ScalarNode,
  788. Line: 7,
  789. Column: 5,
  790. Tag: "!!str",
  791. Value: "va",
  792. LineComment: "# IA",
  793. }, {
  794. Kind: yaml.ScalarNode,
  795. Line: 13,
  796. Column: 1,
  797. Tag: "!!str",
  798. Value: "kb",
  799. HeadComment: "# HB1\n# HB2",
  800. FootComment: "# FB1\n# FB2",
  801. }, {
  802. Kind: yaml.ScalarNode,
  803. Line: 13,
  804. Column: 5,
  805. Tag: "!!str",
  806. Value: "vb",
  807. LineComment: "# IB",
  808. }},
  809. }},
  810. },
  811. }, {
  812. "# 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",
  813. yaml.Node{
  814. Kind: yaml.DocumentNode,
  815. Line: 7,
  816. Column: 1,
  817. HeadComment: "# DH1\n\n# DH2",
  818. FootComment: "# DF1\n\n# DF2",
  819. Content: []*yaml.Node{{
  820. Kind: yaml.SequenceNode,
  821. Tag: "!!seq",
  822. Line: 7,
  823. Column: 1,
  824. Content: []*yaml.Node{{
  825. Kind: yaml.ScalarNode,
  826. Tag: "!!str",
  827. Line: 7,
  828. Column: 3,
  829. Value: "la",
  830. HeadComment: "# HA1\n# HA2",
  831. LineComment: "# IA",
  832. FootComment: "# FA1\n# FA2",
  833. }, {
  834. Kind: yaml.ScalarNode,
  835. Tag: "!!str",
  836. Line: 13,
  837. Column: 3,
  838. Value: "lb",
  839. HeadComment: "# HB1\n# HB2",
  840. LineComment: "# IB",
  841. FootComment: "# FB1\n# FB2",
  842. }},
  843. }},
  844. },
  845. }, {
  846. "# DH1\n\n- la # IA\n\n# HB1\n- lb\n",
  847. yaml.Node{
  848. Kind: yaml.DocumentNode,
  849. Line: 3,
  850. Column: 1,
  851. HeadComment: "# DH1",
  852. Content: []*yaml.Node{{
  853. Kind: yaml.SequenceNode,
  854. Tag: "!!seq",
  855. Line: 3,
  856. Column: 1,
  857. Content: []*yaml.Node{{
  858. Kind: yaml.ScalarNode,
  859. Tag: "!!str",
  860. Line: 3,
  861. Column: 3,
  862. Value: "la",
  863. LineComment: "# IA",
  864. }, {
  865. Kind: yaml.ScalarNode,
  866. Tag: "!!str",
  867. Line: 6,
  868. Column: 3,
  869. Value: "lb",
  870. HeadComment: "# HB1",
  871. }},
  872. }},
  873. },
  874. }, {
  875. "# 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",
  876. yaml.Node{
  877. Kind: yaml.DocumentNode,
  878. Line: 4,
  879. Column: 1,
  880. HeadComment: "# DH1",
  881. FootComment: "# DF1",
  882. Content: []*yaml.Node{{
  883. Kind: yaml.MappingNode,
  884. Tag: "!!map",
  885. Line: 4,
  886. Column: 1,
  887. Content: []*yaml.Node{{
  888. Kind: yaml.ScalarNode,
  889. Tag: "!!str",
  890. Line: 4,
  891. Column: 1,
  892. Value: "ka",
  893. HeadComment: "# HA1",
  894. }, {
  895. Kind: yaml.MappingNode,
  896. Tag: "!!map",
  897. Line: 6,
  898. Column: 3,
  899. Content: []*yaml.Node{{
  900. Kind: yaml.ScalarNode,
  901. Tag: "!!str",
  902. Line: 6,
  903. Column: 3,
  904. Value: "kb",
  905. HeadComment: "# HB1",
  906. }, {
  907. Kind: yaml.SequenceNode,
  908. Line: 9,
  909. Column: 3,
  910. Tag: "!!seq",
  911. Content: []*yaml.Node{{
  912. Kind: yaml.ScalarNode,
  913. Tag: "!!str",
  914. Line: 9,
  915. Column: 5,
  916. Value: "lc",
  917. HeadComment: "# HC1\n# HC2",
  918. LineComment: "# IC",
  919. FootComment: "# FC1\n# FC2",
  920. }, {
  921. Kind: yaml.ScalarNode,
  922. Tag: "!!str",
  923. Line: 14,
  924. Column: 5,
  925. Value: "ld",
  926. HeadComment: "# HD1",
  927. LineComment: "# ID",
  928. FootComment: "# FD1",
  929. }},
  930. }},
  931. }},
  932. }},
  933. },
  934. }, {
  935. "# 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",
  936. yaml.Node{
  937. Kind: yaml.DocumentNode,
  938. Line: 4,
  939. Column: 1,
  940. HeadComment: "# DH1",
  941. FootComment: "# DF1",
  942. Content: []*yaml.Node{{
  943. Kind: yaml.MappingNode,
  944. Tag: "!!map",
  945. Line: 4,
  946. Column: 1,
  947. Content: []*yaml.Node{{
  948. Kind: yaml.ScalarNode,
  949. Tag: "!!str",
  950. Line: 4,
  951. Column: 1,
  952. Value: "ka",
  953. HeadComment: "# HA1",
  954. }, {
  955. Kind: yaml.MappingNode,
  956. Tag: "!!map",
  957. Line: 6,
  958. Column: 3,
  959. Content: []*yaml.Node{{
  960. Kind: yaml.ScalarNode,
  961. Tag: "!!str",
  962. Line: 6,
  963. Column: 3,
  964. Value: "kb",
  965. HeadComment: "# HB1",
  966. }, {
  967. Kind: yaml.SequenceNode,
  968. Line: 9,
  969. Column: 3,
  970. Tag: "!!seq",
  971. Content: []*yaml.Node{{
  972. Kind: yaml.ScalarNode,
  973. Tag: "!!str",
  974. Line: 9,
  975. Column: 5,
  976. Value: "lc",
  977. HeadComment: "# HC1\n# HC2",
  978. LineComment: "# IC",
  979. FootComment: "# FC1\n# FC2",
  980. }, {
  981. Kind: yaml.ScalarNode,
  982. Tag: "!!str",
  983. Line: 14,
  984. Column: 5,
  985. Value: "ld",
  986. HeadComment: "# HD1",
  987. LineComment: "# ID",
  988. FootComment: "# FD1",
  989. }},
  990. }},
  991. }, {
  992. Kind: yaml.ScalarNode,
  993. Tag: "!!str",
  994. Line: 16,
  995. Column: 1,
  996. Value: "ke",
  997. }, {
  998. Kind: yaml.ScalarNode,
  999. Tag: "!!str",
  1000. Line: 16,
  1001. Column: 5,
  1002. Value: "ve",
  1003. }},
  1004. }},
  1005. },
  1006. }, {
  1007. "# DH1\n\n# DH2\n\n# HA1\n# HA2\nka:\n # HB1\n # HB2\n kb:\n" +
  1008. " # HC1\n # HC2\n kc:\n # HD1\n # HD2\n kd: vd\n # FD1\n # FD2\n" +
  1009. " # 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",
  1010. yaml.Node{
  1011. Kind: yaml.DocumentNode,
  1012. HeadComment: "# DH1\n\n# DH2",
  1013. FootComment: "# DF1\n\n# DF2",
  1014. Line: 7,
  1015. Column: 1,
  1016. Content: []*yaml.Node{{
  1017. Kind: yaml.MappingNode,
  1018. Tag: "!!map",
  1019. Line: 7,
  1020. Column: 1,
  1021. Content: []*yaml.Node{{
  1022. Kind: yaml.ScalarNode,
  1023. Tag: "!!str",
  1024. Value: "ka",
  1025. HeadComment: "# HA1\n# HA2",
  1026. FootComment: "# FA1\n# FA2",
  1027. Line: 7,
  1028. Column: 1,
  1029. }, {
  1030. Kind: yaml.MappingNode,
  1031. Tag: "!!map",
  1032. Line: 10,
  1033. Column: 3,
  1034. Content: []*yaml.Node{{
  1035. Kind: yaml.ScalarNode,
  1036. Tag: "!!str",
  1037. Value: "kb",
  1038. HeadComment: "# HB1\n# HB2",
  1039. FootComment: "# FB1\n# FB2",
  1040. Line: 10,
  1041. Column: 3,
  1042. }, {
  1043. Kind: yaml.MappingNode,
  1044. Tag: "!!map",
  1045. Line: 13,
  1046. Column: 5,
  1047. Content: []*yaml.Node{{
  1048. Kind: yaml.ScalarNode,
  1049. Tag: "!!str",
  1050. Value: "kc",
  1051. HeadComment: "# HC1\n# HC2",
  1052. FootComment: "# FC1\n# FC2",
  1053. Line: 13,
  1054. Column: 5,
  1055. }, {
  1056. Kind: yaml.MappingNode,
  1057. Tag: "!!map",
  1058. Line: 16,
  1059. Column: 7,
  1060. Content: []*yaml.Node{{
  1061. Kind: yaml.ScalarNode,
  1062. Tag: "!!str",
  1063. Value: "kd",
  1064. HeadComment: "# HD1\n# HD2",
  1065. FootComment: "# FD1\n# FD2",
  1066. Line: 16,
  1067. Column: 7,
  1068. }, {
  1069. Kind: yaml.ScalarNode,
  1070. Tag: "!!str",
  1071. Value: "vd",
  1072. Line: 16,
  1073. Column: 11,
  1074. }},
  1075. }},
  1076. }},
  1077. }, {
  1078. Kind: yaml.ScalarNode,
  1079. Tag: "!!str",
  1080. Value: "ke",
  1081. HeadComment: "# HE1\n# HE2",
  1082. FootComment: "# FE1\n# FE2",
  1083. Line: 28,
  1084. Column: 1,
  1085. }, {
  1086. Kind: yaml.ScalarNode,
  1087. Tag: "!!str",
  1088. Value: "ve",
  1089. Line: 28,
  1090. Column: 5,
  1091. }},
  1092. }},
  1093. },
  1094. }, {
  1095. // Same as above but indenting ke in so it's also part of ka's value.
  1096. "# DH1\n\n# DH2\n\n# HA1\n# HA2\nka:\n # HB1\n # HB2\n kb:\n" +
  1097. " # HC1\n # HC2\n kc:\n # HD1\n # HD2\n kd: vd\n # FD1\n # FD2\n" +
  1098. " # 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",
  1099. yaml.Node{
  1100. Kind: yaml.DocumentNode,
  1101. HeadComment: "# DH1\n\n# DH2",
  1102. FootComment: "# DF1\n\n# DF2",
  1103. Line: 7,
  1104. Column: 1,
  1105. Content: []*yaml.Node{{
  1106. Kind: yaml.MappingNode,
  1107. Tag: "!!map",
  1108. Line: 7,
  1109. Column: 1,
  1110. Content: []*yaml.Node{{
  1111. Kind: yaml.ScalarNode,
  1112. Tag: "!!str",
  1113. Value: "ka",
  1114. HeadComment: "# HA1\n# HA2",
  1115. FootComment: "# FA1\n# FA2",
  1116. Line: 7,
  1117. Column: 1,
  1118. }, {
  1119. Kind: yaml.MappingNode,
  1120. Tag: "!!map",
  1121. Line: 10,
  1122. Column: 3,
  1123. Content: []*yaml.Node{{
  1124. Kind: yaml.ScalarNode,
  1125. Tag: "!!str",
  1126. Value: "kb",
  1127. HeadComment: "# HB1\n# HB2",
  1128. FootComment: "# FB1\n# FB2",
  1129. Line: 10,
  1130. Column: 3,
  1131. }, {
  1132. Kind: yaml.MappingNode,
  1133. Tag: "!!map",
  1134. Line: 13,
  1135. Column: 5,
  1136. Content: []*yaml.Node{{
  1137. Kind: yaml.ScalarNode,
  1138. Tag: "!!str",
  1139. Value: "kc",
  1140. HeadComment: "# HC1\n# HC2",
  1141. FootComment: "# FC1\n# FC2",
  1142. Line: 13,
  1143. Column: 5,
  1144. }, {
  1145. Kind: yaml.MappingNode,
  1146. Tag: "!!map",
  1147. Line: 16,
  1148. Column: 7,
  1149. Content: []*yaml.Node{{
  1150. Kind: yaml.ScalarNode,
  1151. Tag: "!!str",
  1152. Value: "kd",
  1153. HeadComment: "# HD1\n# HD2",
  1154. FootComment: "# FD1\n# FD2",
  1155. Line: 16,
  1156. Column: 7,
  1157. }, {
  1158. Kind: yaml.ScalarNode,
  1159. Tag: "!!str",
  1160. Value: "vd",
  1161. Line: 16,
  1162. Column: 11,
  1163. }},
  1164. }},
  1165. }, {
  1166. Kind: yaml.ScalarNode,
  1167. Tag: "!!str",
  1168. Value: "ke",
  1169. HeadComment: "# HE1\n# HE2",
  1170. FootComment: "# FE1\n# FE2",
  1171. Line: 26,
  1172. Column: 3,
  1173. }, {
  1174. Kind: yaml.ScalarNode,
  1175. Tag: "!!str",
  1176. Value: "ve",
  1177. Line: 26,
  1178. Column: 7,
  1179. }},
  1180. }},
  1181. }},
  1182. },
  1183. }, {
  1184. // Decode only due to lack of newline at the end.
  1185. "[decode]# HA1\nka:\n # HB1\n kb: vb\n # FB1\n# FA1",
  1186. yaml.Node{
  1187. Kind: yaml.DocumentNode,
  1188. Line: 2,
  1189. Column: 1,
  1190. Content: []*yaml.Node{{
  1191. Kind: yaml.MappingNode,
  1192. Tag: "!!map",
  1193. Line: 2,
  1194. Column: 1,
  1195. Content: []*yaml.Node{{
  1196. Kind: yaml.ScalarNode,
  1197. Tag: "!!str",
  1198. Value: "ka",
  1199. HeadComment: "# HA1",
  1200. FootComment: "# FA1",
  1201. Line: 2,
  1202. Column: 1,
  1203. }, {
  1204. Kind: yaml.MappingNode,
  1205. Tag: "!!map",
  1206. Line: 4,
  1207. Column: 3,
  1208. Content: []*yaml.Node{{
  1209. Kind: yaml.ScalarNode,
  1210. Tag: "!!str",
  1211. Value: "kb",
  1212. HeadComment: "# HB1",
  1213. FootComment: "# FB1",
  1214. Line: 4,
  1215. Column: 3,
  1216. }, {
  1217. Kind: yaml.ScalarNode,
  1218. Tag: "!!str",
  1219. Value: "vb",
  1220. Line: 4,
  1221. Column: 7,
  1222. }},
  1223. }},
  1224. },
  1225. },
  1226. },
  1227. }, {
  1228. // Same as above, but with newline at the end.
  1229. "# HA1\nka:\n # HB1\n kb: vb\n # FB1\n# FA1\n",
  1230. yaml.Node{
  1231. Kind: yaml.DocumentNode,
  1232. Line: 2,
  1233. Column: 1,
  1234. Content: []*yaml.Node{{
  1235. Kind: yaml.MappingNode,
  1236. Tag: "!!map",
  1237. Line: 2,
  1238. Column: 1,
  1239. Content: []*yaml.Node{{
  1240. Kind: yaml.ScalarNode,
  1241. Tag: "!!str",
  1242. Value: "ka",
  1243. HeadComment: "# HA1",
  1244. FootComment: "# FA1",
  1245. Line: 2,
  1246. Column: 1,
  1247. }, {
  1248. Kind: yaml.MappingNode,
  1249. Tag: "!!map",
  1250. Line: 4,
  1251. Column: 3,
  1252. Content: []*yaml.Node{{
  1253. Kind: yaml.ScalarNode,
  1254. Tag: "!!str",
  1255. Value: "kb",
  1256. HeadComment: "# HB1",
  1257. FootComment: "# FB1",
  1258. Line: 4,
  1259. Column: 3,
  1260. }, {
  1261. Kind: yaml.ScalarNode,
  1262. Tag: "!!str",
  1263. Value: "vb",
  1264. Line: 4,
  1265. Column: 7,
  1266. }},
  1267. }},
  1268. },
  1269. },
  1270. },
  1271. }, {
  1272. // Same as above, but with two newlines at the end. Decode-only for that.
  1273. "[decode]# HA1\nka:\n # HB1\n kb: vb\n # FB1\n# FA1\n\n",
  1274. yaml.Node{
  1275. Kind: yaml.DocumentNode,
  1276. Line: 2,
  1277. Column: 1,
  1278. Content: []*yaml.Node{{
  1279. Kind: yaml.MappingNode,
  1280. Tag: "!!map",
  1281. Line: 2,
  1282. Column: 1,
  1283. Content: []*yaml.Node{{
  1284. Kind: yaml.ScalarNode,
  1285. Tag: "!!str",
  1286. Value: "ka",
  1287. HeadComment: "# HA1",
  1288. FootComment: "# FA1",
  1289. Line: 2,
  1290. Column: 1,
  1291. }, {
  1292. Kind: yaml.MappingNode,
  1293. Tag: "!!map",
  1294. Line: 4,
  1295. Column: 3,
  1296. Content: []*yaml.Node{{
  1297. Kind: yaml.ScalarNode,
  1298. Tag: "!!str",
  1299. Value: "kb",
  1300. HeadComment: "# HB1",
  1301. FootComment: "# FB1",
  1302. Line: 4,
  1303. Column: 3,
  1304. }, {
  1305. Kind: yaml.ScalarNode,
  1306. Tag: "!!str",
  1307. Value: "vb",
  1308. Line: 4,
  1309. Column: 7,
  1310. }},
  1311. }},
  1312. },
  1313. },
  1314. },
  1315. }, {
  1316. "# HA1\nka:\n # HB1\n kb: vb\n # FB1\nkc: vc\n# FC1\n",
  1317. yaml.Node{
  1318. Kind: yaml.DocumentNode,
  1319. Line: 2,
  1320. Column: 1,
  1321. Content: []*yaml.Node{{
  1322. Kind: yaml.MappingNode,
  1323. Tag: "!!map",
  1324. Line: 2,
  1325. Column: 1,
  1326. Content: []*yaml.Node{{
  1327. Kind: yaml.ScalarNode,
  1328. Tag: "!!str",
  1329. Value: "ka",
  1330. HeadComment: "# HA1",
  1331. Line: 2,
  1332. Column: 1,
  1333. }, {
  1334. Kind: yaml.MappingNode,
  1335. Tag: "!!map",
  1336. Line: 4,
  1337. Column: 3,
  1338. Content: []*yaml.Node{{
  1339. Kind: yaml.ScalarNode,
  1340. Tag: "!!str",
  1341. Value: "kb",
  1342. HeadComment: "# HB1",
  1343. FootComment: "# FB1",
  1344. Line: 4,
  1345. Column: 3,
  1346. }, {
  1347. Kind: yaml.ScalarNode,
  1348. Tag: "!!str",
  1349. Value: "vb",
  1350. Line: 4,
  1351. Column: 7,
  1352. }},
  1353. }, {
  1354. Kind: yaml.ScalarNode,
  1355. Tag: "!!str",
  1356. Value: "kc",
  1357. FootComment: "# FC1",
  1358. Line: 6,
  1359. Column: 1,
  1360. }, {
  1361. Kind: yaml.ScalarNode,
  1362. Tag: "!!str",
  1363. Value: "vc",
  1364. Line: 6,
  1365. Column: 5,
  1366. }},
  1367. }},
  1368. },
  1369. }, {
  1370. // Decode only as encoding adds an empty line between ka's value and kc's headers.
  1371. "[decode]# HA1\nka:\n # HB1\n kb: vb\n # FB1\n# HC1\n# HC2\nkc: vc\n# FC1\n# FC2\n",
  1372. yaml.Node{
  1373. Kind: yaml.DocumentNode,
  1374. Line: 2,
  1375. Column: 1,
  1376. Content: []*yaml.Node{{
  1377. Kind: yaml.MappingNode,
  1378. Tag: "!!map",
  1379. Line: 2,
  1380. Column: 1,
  1381. Content: []*yaml.Node{{
  1382. Kind: yaml.ScalarNode,
  1383. Tag: "!!str",
  1384. Value: "ka",
  1385. HeadComment: "# HA1",
  1386. Line: 2,
  1387. Column: 1,
  1388. }, {
  1389. Kind: yaml.MappingNode,
  1390. Tag: "!!map",
  1391. Line: 4,
  1392. Column: 3,
  1393. Content: []*yaml.Node{{
  1394. Kind: yaml.ScalarNode,
  1395. Tag: "!!str",
  1396. Value: "kb",
  1397. HeadComment: "# HB1",
  1398. FootComment: "# FB1",
  1399. Line: 4,
  1400. Column: 3,
  1401. }, {
  1402. Kind: yaml.ScalarNode,
  1403. Tag: "!!str",
  1404. Value: "vb",
  1405. Line: 4,
  1406. Column: 7,
  1407. }},
  1408. }, {
  1409. Kind: yaml.ScalarNode,
  1410. Tag: "!!str",
  1411. Value: "kc",
  1412. HeadComment: "# HC1\n# HC2",
  1413. FootComment: "# FC1\n# FC2",
  1414. Line: 8,
  1415. Column: 1,
  1416. }, {
  1417. Kind: yaml.ScalarNode,
  1418. Tag: "!!str",
  1419. Value: "vc",
  1420. Line: 8,
  1421. Column: 5,
  1422. }},
  1423. }},
  1424. },
  1425. }, {
  1426. // Same as above, but with the empty line between ka's value and kc's headers.
  1427. "# HA1\nka:\n # HB1\n kb: vb\n # FB1\n\n# HC1\n# HC2\nkc: vc\n# FC1\n# FC2\n",
  1428. yaml.Node{
  1429. Kind: yaml.DocumentNode,
  1430. Line: 2,
  1431. Column: 1,
  1432. Content: []*yaml.Node{{
  1433. Kind: yaml.MappingNode,
  1434. Tag: "!!map",
  1435. Line: 2,
  1436. Column: 1,
  1437. Content: []*yaml.Node{{
  1438. Kind: yaml.ScalarNode,
  1439. Tag: "!!str",
  1440. Value: "ka",
  1441. HeadComment: "# HA1",
  1442. Line: 2,
  1443. Column: 1,
  1444. }, {
  1445. Kind: yaml.MappingNode,
  1446. Tag: "!!map",
  1447. Line: 4,
  1448. Column: 3,
  1449. Content: []*yaml.Node{{
  1450. Kind: yaml.ScalarNode,
  1451. Tag: "!!str",
  1452. Value: "kb",
  1453. HeadComment: "# HB1",
  1454. FootComment: "# FB1",
  1455. Line: 4,
  1456. Column: 3,
  1457. }, {
  1458. Kind: yaml.ScalarNode,
  1459. Tag: "!!str",
  1460. Value: "vb",
  1461. Line: 4,
  1462. Column: 7,
  1463. }},
  1464. }, {
  1465. Kind: yaml.ScalarNode,
  1466. Tag: "!!str",
  1467. Value: "kc",
  1468. HeadComment: "# HC1\n# HC2",
  1469. FootComment: "# FC1\n# FC2",
  1470. Line: 9,
  1471. Column: 1,
  1472. }, {
  1473. Kind: yaml.ScalarNode,
  1474. Tag: "!!str",
  1475. Value: "vc",
  1476. Line: 9,
  1477. Column: 5,
  1478. }},
  1479. }},
  1480. },
  1481. }, {
  1482. "# H1\n[la, lb] # I\n# F1\n",
  1483. yaml.Node{
  1484. Kind: yaml.DocumentNode,
  1485. Line: 2,
  1486. Column: 1,
  1487. Content: []*yaml.Node{{
  1488. Kind: yaml.SequenceNode,
  1489. Tag: "!!seq",
  1490. Style: yaml.FlowStyle,
  1491. Line: 2,
  1492. Column: 1,
  1493. HeadComment: "# H1",
  1494. LineComment: "# I",
  1495. FootComment: "# F1",
  1496. Content: []*yaml.Node{{
  1497. Kind: yaml.ScalarNode,
  1498. Tag: "!!str",
  1499. Line: 2,
  1500. Column: 2,
  1501. Value: "la",
  1502. }, {
  1503. Kind: yaml.ScalarNode,
  1504. Tag: "!!str",
  1505. Line: 2,
  1506. Column: 6,
  1507. Value: "lb",
  1508. }},
  1509. }},
  1510. },
  1511. }, {
  1512. "# 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",
  1513. yaml.Node{
  1514. Kind: yaml.DocumentNode,
  1515. Line: 4,
  1516. Column: 1,
  1517. HeadComment: "# DH1",
  1518. FootComment: "# DF1",
  1519. Content: []*yaml.Node{{
  1520. Kind: yaml.SequenceNode,
  1521. Tag: "!!seq",
  1522. Style: yaml.FlowStyle,
  1523. Line: 4,
  1524. Column: 1,
  1525. HeadComment: "# SH1",
  1526. FootComment: "# SF1",
  1527. Content: []*yaml.Node{{
  1528. Kind: yaml.ScalarNode,
  1529. Tag: "!!str",
  1530. Line: 6,
  1531. Column: 3,
  1532. Value: "la",
  1533. HeadComment: "# HA1",
  1534. LineComment: "# IA",
  1535. FootComment: "# FA1",
  1536. }, {
  1537. Kind: yaml.ScalarNode,
  1538. Tag: "!!str",
  1539. Line: 10,
  1540. Column: 3,
  1541. Value: "lb",
  1542. HeadComment: "# HB1",
  1543. LineComment: "# IB",
  1544. FootComment: "# FB1",
  1545. }},
  1546. }},
  1547. },
  1548. }, {
  1549. "# 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",
  1550. yaml.Node{
  1551. Kind: yaml.DocumentNode,
  1552. Line: 4,
  1553. Column: 1,
  1554. HeadComment: "# DH1",
  1555. FootComment: "# DF1",
  1556. Content: []*yaml.Node{{
  1557. Kind: yaml.SequenceNode,
  1558. Tag: "!!seq",
  1559. Style: yaml.FlowStyle,
  1560. Line: 4,
  1561. Column: 1,
  1562. HeadComment: "# SH1",
  1563. FootComment: "# SF1",
  1564. Content: []*yaml.Node{{
  1565. Kind: yaml.ScalarNode,
  1566. Tag: "!!str",
  1567. Line: 6,
  1568. Column: 3,
  1569. Value: "la",
  1570. HeadComment: "# HA1",
  1571. FootComment: "# FA1",
  1572. }, {
  1573. Kind: yaml.ScalarNode,
  1574. Tag: "!!str",
  1575. Line: 10,
  1576. Column: 3,
  1577. Value: "lb",
  1578. HeadComment: "# HB1",
  1579. FootComment: "# FB1",
  1580. }},
  1581. }},
  1582. },
  1583. }, {
  1584. "ka:\n kb: [\n # HA1\n la,\n # FA1\n\n # HB1\n lb,\n # FB1\n ]\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: 0x4,
  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.SequenceNode,
  1613. Style: 0x20,
  1614. Tag: "!!seq",
  1615. Line: 2,
  1616. Column: 7,
  1617. Content: []*yaml.Node{{
  1618. Kind: yaml.ScalarNode,
  1619. Tag: "!!str",
  1620. Value: "la",
  1621. HeadComment: "# HA1",
  1622. FootComment: "# FA1",
  1623. Line: 4,
  1624. Column: 5,
  1625. }, {
  1626. Kind: yaml.ScalarNode,
  1627. Tag: "!!str",
  1628. Value: "lb",
  1629. HeadComment: "# HB1",
  1630. FootComment: "# FB1",
  1631. Line: 8,
  1632. Column: 5,
  1633. }},
  1634. }},
  1635. }},
  1636. }},
  1637. },
  1638. }, {
  1639. "# 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",
  1640. yaml.Node{
  1641. Kind: yaml.DocumentNode,
  1642. Line: 4,
  1643. Column: 1,
  1644. HeadComment: "# DH1",
  1645. FootComment: "# DF1",
  1646. Content: []*yaml.Node{{
  1647. Kind: yaml.MappingNode,
  1648. Tag: "!!map",
  1649. Style: yaml.FlowStyle,
  1650. Line: 4,
  1651. Column: 1,
  1652. HeadComment: "# MH1",
  1653. FootComment: "# MF1",
  1654. Content: []*yaml.Node{{
  1655. Kind: yaml.ScalarNode,
  1656. Tag: "!!str",
  1657. Line: 6,
  1658. Column: 3,
  1659. Value: "ka",
  1660. HeadComment: "# HA1",
  1661. FootComment: "# FA1",
  1662. }, {
  1663. Kind: yaml.ScalarNode,
  1664. Tag: "!!str",
  1665. Line: 6,
  1666. Column: 7,
  1667. Value: "va",
  1668. LineComment: "# IA",
  1669. }, {
  1670. Kind: yaml.ScalarNode,
  1671. Tag: "!!str",
  1672. Line: 10,
  1673. Column: 3,
  1674. Value: "kb",
  1675. HeadComment: "# HB1",
  1676. FootComment: "# FB1",
  1677. }, {
  1678. Kind: yaml.ScalarNode,
  1679. Tag: "!!str",
  1680. Line: 10,
  1681. Column: 7,
  1682. Value: "vb",
  1683. LineComment: "# IB",
  1684. }},
  1685. }},
  1686. },
  1687. }, {
  1688. "# 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",
  1689. yaml.Node{
  1690. Kind: yaml.DocumentNode,
  1691. Line: 4,
  1692. Column: 1,
  1693. HeadComment: "# DH1",
  1694. FootComment: "# DF1",
  1695. Content: []*yaml.Node{{
  1696. Kind: yaml.MappingNode,
  1697. Tag: "!!map",
  1698. Style: yaml.FlowStyle,
  1699. Line: 4,
  1700. Column: 1,
  1701. HeadComment: "# MH1",
  1702. FootComment: "# MF1",
  1703. Content: []*yaml.Node{{
  1704. Kind: yaml.ScalarNode,
  1705. Tag: "!!str",
  1706. Line: 6,
  1707. Column: 3,
  1708. Value: "ka",
  1709. HeadComment: "# HA1",
  1710. FootComment: "# FA1",
  1711. }, {
  1712. Kind: yaml.ScalarNode,
  1713. Tag: "!!str",
  1714. Line: 6,
  1715. Column: 7,
  1716. Value: "va",
  1717. }, {
  1718. Kind: yaml.ScalarNode,
  1719. Tag: "!!str",
  1720. Line: 10,
  1721. Column: 3,
  1722. Value: "kb",
  1723. HeadComment: "# HB1",
  1724. FootComment: "# FB1",
  1725. }, {
  1726. Kind: yaml.ScalarNode,
  1727. Tag: "!!str",
  1728. Line: 10,
  1729. Column: 7,
  1730. Value: "vb",
  1731. }},
  1732. }},
  1733. },
  1734. }, {
  1735. "# 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",
  1736. yaml.Node{
  1737. Kind: yaml.DocumentNode,
  1738. Line: 7,
  1739. Column: 1,
  1740. HeadComment: "# DH1\n\n# DH2",
  1741. FootComment: "# DF1\n\n# DF2",
  1742. Content: []*yaml.Node{{
  1743. Kind: yaml.SequenceNode,
  1744. Tag: "!!seq",
  1745. Line: 7,
  1746. Column: 1,
  1747. Content: []*yaml.Node{
  1748. saveNode("x", &yaml.Node{
  1749. Kind: yaml.ScalarNode,
  1750. Tag: "!!str",
  1751. Line: 7,
  1752. Column: 3,
  1753. Value: "la",
  1754. HeadComment: "# HA1\n# HA2",
  1755. LineComment: "# IA",
  1756. FootComment: "# FA1\n# FA2",
  1757. Anchor: "x",
  1758. }), {
  1759. Kind: yaml.AliasNode,
  1760. Line: 13,
  1761. Column: 3,
  1762. Value: "x",
  1763. Alias: dropNode("x"),
  1764. HeadComment: "# HB1\n# HB2",
  1765. LineComment: "# IB",
  1766. FootComment: "# FB1\n# FB2",
  1767. },
  1768. },
  1769. }},
  1770. },
  1771. },
  1772. }
  1773. func (s *S) TestNodeRoundtrip(c *C) {
  1774. defer os.Setenv("TZ", os.Getenv("TZ"))
  1775. os.Setenv("TZ", "UTC")
  1776. for i, item := range nodeTests {
  1777. c.Logf("test %d: %q", i, item.yaml)
  1778. if strings.Contains(item.yaml, "#") {
  1779. var buf bytes.Buffer
  1780. fprintComments(&buf, &item.node, " ")
  1781. c.Logf(" comments:\n%s", buf.Bytes())
  1782. }
  1783. decode := true
  1784. encode := true
  1785. testYaml := item.yaml
  1786. if s := strings.TrimPrefix(testYaml, "[decode]"); s != testYaml {
  1787. encode = false
  1788. testYaml = s
  1789. }
  1790. if s := strings.TrimPrefix(testYaml, "[encode]"); s != testYaml {
  1791. decode = false
  1792. testYaml = s
  1793. }
  1794. if decode {
  1795. var node yaml.Node
  1796. err := yaml.Unmarshal([]byte(testYaml), &node)
  1797. c.Assert(err, IsNil)
  1798. c.Assert(node, DeepEquals, item.node)
  1799. }
  1800. if encode {
  1801. buf := bytes.Buffer{}
  1802. enc := yaml.NewEncoder(&buf)
  1803. enc.SetIndent(2)
  1804. err := enc.Encode(&item.node)
  1805. c.Assert(err, IsNil)
  1806. err = enc.Close()
  1807. c.Assert(err, IsNil)
  1808. c.Assert(buf.String(), Equals, testYaml)
  1809. }
  1810. }
  1811. }
  1812. var savedNodes = make(map[string]*yaml.Node)
  1813. func saveNode(name string, node *yaml.Node) *yaml.Node {
  1814. savedNodes[name] = node
  1815. return node
  1816. }
  1817. func peekNode(name string) *yaml.Node {
  1818. return savedNodes[name]
  1819. }
  1820. func dropNode(name string) *yaml.Node {
  1821. node := savedNodes[name]
  1822. delete(savedNodes, name)
  1823. return node
  1824. }
  1825. var setStringTests = []struct {
  1826. str string
  1827. yaml string
  1828. node yaml.Node
  1829. }{
  1830. {
  1831. "something simple",
  1832. "something simple\n",
  1833. yaml.Node{
  1834. Kind: yaml.ScalarNode,
  1835. Value: "something simple",
  1836. Tag: "!!str",
  1837. },
  1838. }, {
  1839. `"quoted value"`,
  1840. "'\"quoted value\"'\n",
  1841. yaml.Node{
  1842. Kind: yaml.ScalarNode,
  1843. Value: `"quoted value"`,
  1844. Tag: "!!str",
  1845. },
  1846. }, {
  1847. "multi\nline",
  1848. "|-\n multi\n line\n",
  1849. yaml.Node{
  1850. Kind: yaml.ScalarNode,
  1851. Value: "multi\nline",
  1852. Tag: "!!str",
  1853. Style: yaml.LiteralStyle,
  1854. },
  1855. }, {
  1856. "123",
  1857. "\"123\"\n",
  1858. yaml.Node{
  1859. Kind: yaml.ScalarNode,
  1860. Value: "123",
  1861. Tag: "!!str",
  1862. },
  1863. }, {
  1864. "multi\nline\n",
  1865. "|\n multi\n line\n",
  1866. yaml.Node{
  1867. Kind: yaml.ScalarNode,
  1868. Value: "multi\nline\n",
  1869. Tag: "!!str",
  1870. Style: yaml.LiteralStyle,
  1871. },
  1872. }, {
  1873. "\x80\x81\x82",
  1874. "!!binary gIGC\n",
  1875. yaml.Node{
  1876. Kind: yaml.ScalarNode,
  1877. Value: "gIGC",
  1878. Tag: "!!binary",
  1879. },
  1880. },
  1881. }
  1882. func (s *S) TestSetString(c *C) {
  1883. defer os.Setenv("TZ", os.Getenv("TZ"))
  1884. os.Setenv("TZ", "UTC")
  1885. for i, item := range setStringTests {
  1886. c.Logf("test %d: %q", i, item.str)
  1887. var node yaml.Node
  1888. node.SetString(item.str)
  1889. c.Assert(node, DeepEquals, item.node)
  1890. buf := bytes.Buffer{}
  1891. enc := yaml.NewEncoder(&buf)
  1892. enc.SetIndent(2)
  1893. err := enc.Encode(&item.node)
  1894. c.Assert(err, IsNil)
  1895. err = enc.Close()
  1896. c.Assert(err, IsNil)
  1897. c.Assert(buf.String(), Equals, item.yaml)
  1898. var doc yaml.Node
  1899. err = yaml.Unmarshal([]byte(item.yaml), &doc)
  1900. c.Assert(err, IsNil)
  1901. var str string
  1902. err = node.Decode(&str)
  1903. c.Assert(err, IsNil)
  1904. c.Assert(str, Equals, item.str)
  1905. }
  1906. }
  1907. func fprintComments(out io.Writer, node *yaml.Node, indent string) {
  1908. switch node.Kind {
  1909. case yaml.ScalarNode:
  1910. fmt.Fprintf(out, "%s<%s> ", indent, node.Value)
  1911. fprintCommentSet(out, node)
  1912. fmt.Fprintf(out, "\n")
  1913. case yaml.DocumentNode:
  1914. fmt.Fprintf(out, "%s<DOC> ", indent)
  1915. fprintCommentSet(out, node)
  1916. fmt.Fprintf(out, "\n")
  1917. for i := 0; i < len(node.Content); i++ {
  1918. fprintComments(out, node.Content[i], indent+" ")
  1919. }
  1920. case yaml.MappingNode:
  1921. fmt.Fprintf(out, "%s<MAP> ", indent)
  1922. fprintCommentSet(out, node)
  1923. fmt.Fprintf(out, "\n")
  1924. for i := 0; i < len(node.Content); i += 2 {
  1925. fprintComments(out, node.Content[i], indent+" ")
  1926. fprintComments(out, node.Content[i+1], indent+" ")
  1927. }
  1928. case yaml.SequenceNode:
  1929. fmt.Fprintf(out, "%s<SEQ> ", indent)
  1930. fprintCommentSet(out, node)
  1931. fmt.Fprintf(out, "\n")
  1932. for i := 0; i < len(node.Content); i++ {
  1933. fprintComments(out, node.Content[i], indent+" ")
  1934. }
  1935. }
  1936. }
  1937. func fprintCommentSet(out io.Writer, node *yaml.Node) {
  1938. if len(node.HeadComment)+len(node.LineComment)+len(node.FootComment) > 0 {
  1939. fmt.Fprintf(out, "%q / %q / %q", node.HeadComment, node.LineComment, node.FootComment)
  1940. }
  1941. }