node_test.go 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159
  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. "os"
  19. . "gopkg.in/check.v1"
  20. "gopkg.in/yaml.v3"
  21. "strings"
  22. )
  23. var nodeTests = []struct {
  24. yaml string
  25. node yaml.Node
  26. }{
  27. {
  28. "null\n",
  29. yaml.Node{
  30. Kind: yaml.DocumentNode,
  31. Line: 1,
  32. Column: 1,
  33. Content: []*yaml.Node{{
  34. Kind: yaml.ScalarNode,
  35. Value: "null",
  36. Tag: "!!null",
  37. Line: 1,
  38. Column: 1,
  39. }},
  40. },
  41. }, {
  42. "foo\n",
  43. yaml.Node{
  44. Kind: yaml.DocumentNode,
  45. Line: 1,
  46. Column: 1,
  47. Content: []*yaml.Node{{
  48. Kind: yaml.ScalarNode,
  49. Value: "foo",
  50. Tag: "!!str",
  51. Line: 1,
  52. Column: 1,
  53. }},
  54. },
  55. }, {
  56. "\"foo\"\n",
  57. yaml.Node{
  58. Kind: yaml.DocumentNode,
  59. Line: 1,
  60. Column: 1,
  61. Content: []*yaml.Node{{
  62. Kind: yaml.ScalarNode,
  63. Style: yaml.DoubleQuotedStyle,
  64. Value: "foo",
  65. Tag: "!!str",
  66. Line: 1,
  67. Column: 1,
  68. }},
  69. },
  70. }, {
  71. "'foo'\n",
  72. yaml.Node{
  73. Kind: yaml.DocumentNode,
  74. Line: 1,
  75. Column: 1,
  76. Content: []*yaml.Node{{
  77. Kind: yaml.ScalarNode,
  78. Style: yaml.SingleQuotedStyle,
  79. Value: "foo",
  80. Tag: "!!str",
  81. Line: 1,
  82. Column: 1,
  83. }},
  84. },
  85. }, {
  86. "!!str 123\n",
  87. yaml.Node{
  88. Kind: yaml.DocumentNode,
  89. Line: 1,
  90. Column: 1,
  91. Content: []*yaml.Node{{
  92. Kind: yaml.ScalarNode,
  93. Style: yaml.TaggedStyle,
  94. Value: "123",
  95. Tag: "!!str",
  96. Line: 1,
  97. Column: 1,
  98. }},
  99. },
  100. }, {
  101. // Although the node isn't TaggedStyle, dropping the tag would change the value.
  102. "[encode]!!binary gIGC\n",
  103. yaml.Node{
  104. Kind: yaml.DocumentNode,
  105. Line: 1,
  106. Column: 1,
  107. Content: []*yaml.Node{{
  108. Kind: yaml.ScalarNode,
  109. Value: "gIGC",
  110. Tag: "!!binary",
  111. Line: 1,
  112. Column: 1,
  113. }},
  114. },
  115. }, {
  116. // Same, but with strings we can just quote them.
  117. "[encode]\"123\"\n",
  118. yaml.Node{
  119. Kind: yaml.DocumentNode,
  120. Line: 1,
  121. Column: 1,
  122. Content: []*yaml.Node{{
  123. Kind: yaml.ScalarNode,
  124. Value: "123",
  125. Tag: "!!str",
  126. Line: 1,
  127. Column: 1,
  128. }},
  129. },
  130. }, {
  131. "!tag:something 123\n",
  132. yaml.Node{
  133. Kind: yaml.DocumentNode,
  134. Line: 1,
  135. Column: 1,
  136. Content: []*yaml.Node{{
  137. Kind: yaml.ScalarNode,
  138. Style: yaml.TaggedStyle,
  139. Value: "123",
  140. Tag: "!tag:something",
  141. Line: 1,
  142. Column: 1,
  143. }},
  144. },
  145. }, {
  146. "[encode]!tag:something 123\n",
  147. yaml.Node{
  148. Kind: yaml.DocumentNode,
  149. Line: 1,
  150. Column: 1,
  151. Content: []*yaml.Node{{
  152. Kind: yaml.ScalarNode,
  153. Value: "123",
  154. Tag: "!tag:something",
  155. Line: 1,
  156. Column: 1,
  157. }},
  158. },
  159. }, {
  160. "!tag:something {}\n",
  161. yaml.Node{
  162. Kind: yaml.DocumentNode,
  163. Line: 1,
  164. Column: 1,
  165. Content: []*yaml.Node{{
  166. Kind: yaml.MappingNode,
  167. Style: yaml.TaggedStyle | yaml.FlowStyle,
  168. Tag: "!tag:something",
  169. Line: 1,
  170. Column: 1,
  171. }},
  172. },
  173. }, {
  174. "[encode]!tag:something {}\n",
  175. yaml.Node{
  176. Kind: yaml.DocumentNode,
  177. Line: 1,
  178. Column: 1,
  179. Content: []*yaml.Node{{
  180. Kind: yaml.MappingNode,
  181. Style: yaml.FlowStyle,
  182. Tag: "!tag:something",
  183. Line: 1,
  184. Column: 1,
  185. }},
  186. },
  187. }, {
  188. "!tag:something []\n",
  189. yaml.Node{
  190. Kind: yaml.DocumentNode,
  191. Line: 1,
  192. Column: 1,
  193. Content: []*yaml.Node{{
  194. Kind: yaml.SequenceNode,
  195. Style: yaml.TaggedStyle | yaml.FlowStyle,
  196. Tag: "!tag:something",
  197. Line: 1,
  198. Column: 1,
  199. }},
  200. },
  201. }, {
  202. "[encode]!tag:something []\n",
  203. yaml.Node{
  204. Kind: yaml.DocumentNode,
  205. Line: 1,
  206. Column: 1,
  207. Content: []*yaml.Node{{
  208. Kind: yaml.SequenceNode,
  209. Style: yaml.FlowStyle,
  210. Tag: "!tag:something",
  211. Line: 1,
  212. Column: 1,
  213. }},
  214. },
  215. }, {
  216. "''\n",
  217. yaml.Node{
  218. Kind: yaml.DocumentNode,
  219. Line: 1,
  220. Column: 1,
  221. Content: []*yaml.Node{{
  222. Kind: yaml.ScalarNode,
  223. Style: yaml.SingleQuotedStyle,
  224. Value: "",
  225. Tag: "!!str",
  226. Line: 1,
  227. Column: 1,
  228. }},
  229. },
  230. }, {
  231. "|\n foo\n bar\n",
  232. yaml.Node{
  233. Kind: yaml.DocumentNode,
  234. Line: 1,
  235. Column: 1,
  236. Content: []*yaml.Node{{
  237. Kind: yaml.ScalarNode,
  238. Style: yaml.LiteralStyle,
  239. Value: "foo\nbar\n",
  240. Tag: "!!str",
  241. Line: 1,
  242. Column: 1,
  243. }},
  244. },
  245. }, {
  246. "true\n",
  247. yaml.Node{
  248. Kind: yaml.DocumentNode,
  249. Line: 1,
  250. Column: 1,
  251. Content: []*yaml.Node{{
  252. Kind: yaml.ScalarNode,
  253. Value: "true",
  254. Tag: "!!bool",
  255. Line: 1,
  256. Column: 1,
  257. }},
  258. },
  259. }, {
  260. "-10\n",
  261. yaml.Node{
  262. Kind: yaml.DocumentNode,
  263. Line: 1,
  264. Column: 1,
  265. Content: []*yaml.Node{{
  266. Kind: yaml.ScalarNode,
  267. Value: "-10",
  268. Tag: "!!int",
  269. Line: 1,
  270. Column: 1,
  271. }},
  272. },
  273. }, {
  274. "4294967296\n",
  275. yaml.Node{
  276. Kind: yaml.DocumentNode,
  277. Line: 1,
  278. Column: 1,
  279. Content: []*yaml.Node{{
  280. Kind: yaml.ScalarNode,
  281. Value: "4294967296",
  282. Tag: "!!int",
  283. Line: 1,
  284. Column: 1,
  285. }},
  286. },
  287. }, {
  288. "0.1000\n",
  289. yaml.Node{
  290. Kind: yaml.DocumentNode,
  291. Line: 1,
  292. Column: 1,
  293. Content: []*yaml.Node{{
  294. Kind: yaml.ScalarNode,
  295. Value: "0.1000",
  296. Tag: "!!float",
  297. Line: 1,
  298. Column: 1,
  299. }},
  300. },
  301. }, {
  302. "-.inf\n",
  303. yaml.Node{
  304. Kind: yaml.DocumentNode,
  305. Line: 1,
  306. Column: 1,
  307. Content: []*yaml.Node{{
  308. Kind: yaml.ScalarNode,
  309. Value: "-.inf",
  310. Tag: "!!float",
  311. Line: 1,
  312. Column: 1,
  313. }},
  314. },
  315. }, {
  316. ".nan\n",
  317. yaml.Node{
  318. Kind: yaml.DocumentNode,
  319. Line: 1,
  320. Column: 1,
  321. Content: []*yaml.Node{{
  322. Kind: yaml.ScalarNode,
  323. Value: ".nan",
  324. Tag: "!!float",
  325. Line: 1,
  326. Column: 1,
  327. }},
  328. },
  329. }, {
  330. "{}\n",
  331. yaml.Node{
  332. Kind: yaml.DocumentNode,
  333. Line: 1,
  334. Column: 1,
  335. Content: []*yaml.Node{{
  336. Kind: yaml.MappingNode,
  337. Style: yaml.FlowStyle,
  338. Value: "",
  339. Tag: "!!map",
  340. Line: 1,
  341. Column: 1,
  342. }},
  343. },
  344. }, {
  345. "a: b c\n",
  346. yaml.Node{
  347. Kind: yaml.DocumentNode,
  348. Line: 1,
  349. Column: 1,
  350. Content: []*yaml.Node{{
  351. Kind: yaml.MappingNode,
  352. Value: "",
  353. Tag: "!!map",
  354. Line: 1,
  355. Column: 1,
  356. Content: []*yaml.Node{{
  357. Kind: yaml.ScalarNode,
  358. Value: "a",
  359. Tag: "!!str",
  360. Line: 1,
  361. Column: 1,
  362. }, {
  363. Kind: yaml.ScalarNode,
  364. Value: "b c",
  365. Tag: "!!str",
  366. Line: 1,
  367. Column: 4,
  368. }},
  369. }},
  370. },
  371. }, {
  372. "a:\n b: c\n d: e\n",
  373. yaml.Node{
  374. Kind: yaml.DocumentNode,
  375. Line: 1,
  376. Column: 1,
  377. Content: []*yaml.Node{{
  378. Kind: yaml.MappingNode,
  379. Tag: "!!map",
  380. Line: 1,
  381. Column: 1,
  382. Content: []*yaml.Node{{
  383. Kind: yaml.ScalarNode,
  384. Value: "a",
  385. Tag: "!!str",
  386. Line: 1,
  387. Column: 1,
  388. }, {
  389. Kind: yaml.MappingNode,
  390. Tag: "!!map",
  391. Line: 2,
  392. Column: 3,
  393. Content: []*yaml.Node{{
  394. Kind: yaml.ScalarNode,
  395. Value: "b",
  396. Tag: "!!str",
  397. Line: 2,
  398. Column: 3,
  399. }, {
  400. Kind: yaml.ScalarNode,
  401. Value: "c",
  402. Tag: "!!str",
  403. Line: 2,
  404. Column: 6,
  405. }, {
  406. Kind: yaml.ScalarNode,
  407. Value: "d",
  408. Tag: "!!str",
  409. Line: 3,
  410. Column: 3,
  411. }, {
  412. Kind: yaml.ScalarNode,
  413. Value: "e",
  414. Tag: "!!str",
  415. Line: 3,
  416. Column: 6,
  417. }},
  418. }},
  419. }},
  420. },
  421. }, {
  422. "- a\n- b\n",
  423. yaml.Node{
  424. Kind: yaml.DocumentNode,
  425. Line: 1,
  426. Column: 1,
  427. Content: []*yaml.Node{{
  428. Kind: yaml.SequenceNode,
  429. Value: "",
  430. Tag: "!!seq",
  431. Line: 1,
  432. Column: 1,
  433. Content: []*yaml.Node{{
  434. Kind: yaml.ScalarNode,
  435. Value: "a",
  436. Tag: "!!str",
  437. Line: 1,
  438. Column: 3,
  439. }, {
  440. Kind: yaml.ScalarNode,
  441. Value: "b",
  442. Tag: "!!str",
  443. Line: 2,
  444. Column: 3,
  445. }},
  446. }},
  447. },
  448. }, {
  449. "- a\n- - b\n - c\n",
  450. yaml.Node{
  451. Kind: yaml.DocumentNode,
  452. Line: 1,
  453. Column: 1,
  454. Content: []*yaml.Node{{
  455. Kind: yaml.SequenceNode,
  456. Tag: "!!seq",
  457. Line: 1,
  458. Column: 1,
  459. Content: []*yaml.Node{{
  460. Kind: yaml.ScalarNode,
  461. Value: "a",
  462. Tag: "!!str",
  463. Line: 1,
  464. Column: 3,
  465. }, {
  466. Kind: yaml.SequenceNode,
  467. Tag: "!!seq",
  468. Line: 2,
  469. Column: 3,
  470. Content: []*yaml.Node{{
  471. Kind: yaml.ScalarNode,
  472. Value: "b",
  473. Tag: "!!str",
  474. Line: 2,
  475. Column: 5,
  476. }, {
  477. Kind: yaml.ScalarNode,
  478. Value: "c",
  479. Tag: "!!str",
  480. Line: 3,
  481. Column: 5,
  482. }},
  483. }},
  484. }},
  485. },
  486. }, {
  487. "[a, b]\n",
  488. yaml.Node{
  489. Kind: yaml.DocumentNode,
  490. Line: 1,
  491. Column: 1,
  492. Content: []*yaml.Node{{
  493. Kind: yaml.SequenceNode,
  494. Style: yaml.FlowStyle,
  495. Value: "",
  496. Tag: "!!seq",
  497. Line: 1,
  498. Column: 1,
  499. Content: []*yaml.Node{{
  500. Kind: yaml.ScalarNode,
  501. Value: "a",
  502. Tag: "!!str",
  503. Line: 1,
  504. Column: 2,
  505. }, {
  506. Kind: yaml.ScalarNode,
  507. Value: "b",
  508. Tag: "!!str",
  509. Line: 1,
  510. Column: 5,
  511. }},
  512. }},
  513. },
  514. }, {
  515. "- a\n- [b, c]\n",
  516. yaml.Node{
  517. Kind: yaml.DocumentNode,
  518. Line: 1,
  519. Column: 1,
  520. Content: []*yaml.Node{{
  521. Kind: yaml.SequenceNode,
  522. Tag: "!!seq",
  523. Line: 1,
  524. Column: 1,
  525. Content: []*yaml.Node{{
  526. Kind: yaml.ScalarNode,
  527. Value: "a",
  528. Tag: "!!str",
  529. Line: 1,
  530. Column: 3,
  531. }, {
  532. Kind: yaml.SequenceNode,
  533. Tag: "!!seq",
  534. Style: yaml.FlowStyle,
  535. Line: 2,
  536. Column: 3,
  537. Content: []*yaml.Node{{
  538. Kind: yaml.ScalarNode,
  539. Value: "b",
  540. Tag: "!!str",
  541. Line: 2,
  542. Column: 4,
  543. }, {
  544. Kind: yaml.ScalarNode,
  545. Value: "c",
  546. Tag: "!!str",
  547. Line: 2,
  548. Column: 7,
  549. }},
  550. }},
  551. }},
  552. },
  553. }, {
  554. "a: &x 1\nb: &y 2\nc: *x\nd: *y\n",
  555. yaml.Node{
  556. Kind: yaml.DocumentNode,
  557. Line: 1,
  558. Column: 1,
  559. Content: []*yaml.Node{{
  560. Kind: yaml.MappingNode,
  561. Line: 1,
  562. Column: 1,
  563. Tag: "!!map",
  564. Content: []*yaml.Node{{
  565. Kind: yaml.ScalarNode,
  566. Value: "a",
  567. Tag: "!!str",
  568. Line: 1,
  569. Column: 1,
  570. },
  571. saveNode("x", &yaml.Node{
  572. Kind: yaml.ScalarNode,
  573. Value: "1",
  574. Tag: "!!int",
  575. Anchor: "x",
  576. Line: 1,
  577. Column: 4,
  578. }),
  579. {
  580. Kind: yaml.ScalarNode,
  581. Value: "b",
  582. Tag: "!!str",
  583. Line: 2,
  584. Column: 1,
  585. },
  586. saveNode("y", &yaml.Node{
  587. Kind: yaml.ScalarNode,
  588. Value: "2",
  589. Tag: "!!int",
  590. Anchor: "y",
  591. Line: 2,
  592. Column: 4,
  593. }),
  594. {
  595. Kind: yaml.ScalarNode,
  596. Value: "c",
  597. Tag: "!!str",
  598. Line: 3,
  599. Column: 1,
  600. }, {
  601. Kind: yaml.AliasNode,
  602. Value: "x",
  603. Alias: dropNode("x"),
  604. Line: 3,
  605. Column: 4,
  606. }, {
  607. Kind: yaml.ScalarNode,
  608. Value: "d",
  609. Tag: "!!str",
  610. Line: 4,
  611. Column: 1,
  612. }, {
  613. Kind: yaml.AliasNode,
  614. Value: "y",
  615. Tag: "",
  616. Alias: dropNode("y"),
  617. Line: 4,
  618. Column: 4,
  619. }},
  620. }},
  621. },
  622. }, {
  623. "# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  624. yaml.Node{
  625. Kind: yaml.DocumentNode,
  626. Line: 3,
  627. Column: 1,
  628. Content: []*yaml.Node{{
  629. Kind: yaml.ScalarNode,
  630. Value: "true",
  631. Tag: "!!bool",
  632. Line: 3,
  633. Column: 1,
  634. HeadComment: "# One\n# Two",
  635. LineComment: "# Three",
  636. FootComment: "# Four\n# Five",
  637. }},
  638. },
  639. }, {
  640. // Write out the pound character if missing from comments.
  641. "[encode]# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  642. yaml.Node{
  643. Kind: yaml.DocumentNode,
  644. Line: 3,
  645. Column: 1,
  646. Content: []*yaml.Node{{
  647. Kind: yaml.ScalarNode,
  648. Value: "true",
  649. Tag: "!!bool",
  650. Line: 3,
  651. Column: 1,
  652. HeadComment: "One\nTwo\n",
  653. LineComment: "Three\n",
  654. FootComment: "Four\nFive\n",
  655. }},
  656. },
  657. }, {
  658. "[encode]# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  659. yaml.Node{
  660. Kind: yaml.DocumentNode,
  661. Line: 3,
  662. Column: 1,
  663. Content: []*yaml.Node{{
  664. Kind: yaml.ScalarNode,
  665. Value: "true",
  666. Tag: "!!bool",
  667. Line: 3,
  668. Column: 1,
  669. HeadComment: " One\n Two",
  670. LineComment: " Three",
  671. FootComment: " Four\n Five",
  672. }},
  673. },
  674. }, {
  675. "# DH1\n\n# DH2\n\n# H1\n# H2\ntrue # I\n# F1\n# F2\n\n# DF1\n\n# DF2\n",
  676. yaml.Node{
  677. Kind: yaml.DocumentNode,
  678. Line: 7,
  679. Column: 1,
  680. HeadComment: "# DH1\n\n# DH2",
  681. FootComment: "# DF1\n\n# DF2",
  682. Content: []*yaml.Node{{
  683. Kind: yaml.ScalarNode,
  684. Value: "true",
  685. Tag: "!!bool",
  686. Line: 7,
  687. Column: 1,
  688. HeadComment: "# H1\n# H2",
  689. LineComment: "# I",
  690. FootComment: "# F1\n# F2",
  691. }},
  692. },
  693. }, {
  694. "# 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",
  695. yaml.Node{
  696. Kind: yaml.DocumentNode,
  697. Line: 7,
  698. Column: 1,
  699. HeadComment: "# DH1\n\n# DH2",
  700. FootComment: "# DF1\n\n# DF2",
  701. Content: []*yaml.Node{{
  702. Kind: yaml.MappingNode,
  703. Tag: "!!map",
  704. Line: 7,
  705. Column: 1,
  706. Content: []*yaml.Node{{
  707. Kind: yaml.ScalarNode,
  708. Line: 7,
  709. Column: 1,
  710. Tag: "!!str",
  711. Value: "ka",
  712. HeadComment: "# HA1\n# HA2",
  713. FootComment: "# FA1\n# FA2",
  714. }, {
  715. Kind: yaml.ScalarNode,
  716. Line: 7,
  717. Column: 5,
  718. Tag: "!!str",
  719. Value: "va",
  720. LineComment: "# IA",
  721. }, {
  722. Kind: yaml.ScalarNode,
  723. Line: 13,
  724. Column: 1,
  725. Tag: "!!str",
  726. Value: "kb",
  727. HeadComment: "# HB1\n# HB2",
  728. FootComment: "# FB1\n# FB2",
  729. }, {
  730. Kind: yaml.ScalarNode,
  731. Line: 13,
  732. Column: 5,
  733. Tag: "!!str",
  734. Value: "vb",
  735. LineComment: "# IB",
  736. }},
  737. }},
  738. },
  739. }, {
  740. "# 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",
  741. yaml.Node{
  742. Kind: yaml.DocumentNode,
  743. Line: 7,
  744. Column: 1,
  745. HeadComment: "# DH1\n\n# DH2",
  746. FootComment: "# DF1\n\n# DF2",
  747. Content: []*yaml.Node{{
  748. Kind: yaml.SequenceNode,
  749. Tag: "!!seq",
  750. Line: 7,
  751. Column: 1,
  752. Content: []*yaml.Node{{
  753. Kind: yaml.ScalarNode,
  754. Tag: "!!str",
  755. Line: 7,
  756. Column: 3,
  757. Value: "la",
  758. HeadComment: "# HA1\n# HA2",
  759. LineComment: "# IA",
  760. FootComment: "# FA1\n# FA2",
  761. }, {
  762. Kind: yaml.ScalarNode,
  763. Tag: "!!str",
  764. Line: 13,
  765. Column: 3,
  766. Value: "lb",
  767. HeadComment: "# HB1\n# HB2",
  768. LineComment: "# IB",
  769. FootComment: "# FB1\n# FB2",
  770. }},
  771. }},
  772. },
  773. }, {
  774. "# DH1\n\n- la # IA\n\n# HB1\n- lb\n",
  775. yaml.Node{
  776. Kind: yaml.DocumentNode,
  777. Line: 3,
  778. Column: 1,
  779. HeadComment: "# DH1",
  780. Content: []*yaml.Node{{
  781. Kind: yaml.SequenceNode,
  782. Tag: "!!seq",
  783. Line: 3,
  784. Column: 1,
  785. Content: []*yaml.Node{{
  786. Kind: yaml.ScalarNode,
  787. Tag: "!!str",
  788. Line: 3,
  789. Column: 3,
  790. Value: "la",
  791. LineComment: "# IA",
  792. }, {
  793. Kind: yaml.ScalarNode,
  794. Tag: "!!str",
  795. Line: 6,
  796. Column: 3,
  797. Value: "lb",
  798. HeadComment: "# HB1",
  799. }},
  800. }},
  801. },
  802. }, {
  803. "# 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",
  804. yaml.Node{
  805. Kind: yaml.DocumentNode,
  806. Line: 4,
  807. Column: 1,
  808. HeadComment: "# DH1",
  809. FootComment: "# DF1",
  810. Content: []*yaml.Node{{
  811. Kind: yaml.MappingNode,
  812. Tag: "!!map",
  813. Line: 4,
  814. Column: 1,
  815. Content: []*yaml.Node{{
  816. Kind: yaml.ScalarNode,
  817. Tag: "!!str",
  818. Line: 4,
  819. Column: 1,
  820. Value: "ka",
  821. HeadComment: "# HA1",
  822. }, {
  823. Kind: yaml.MappingNode,
  824. Tag: "!!map",
  825. Line: 6,
  826. Column: 3,
  827. Content: []*yaml.Node{{
  828. Kind: yaml.ScalarNode,
  829. Tag: "!!str",
  830. Line: 6,
  831. Column: 3,
  832. Value: "kb",
  833. HeadComment: "# HB1",
  834. }, {
  835. Kind: yaml.SequenceNode,
  836. Line: 9,
  837. Column: 3,
  838. Tag: "!!seq",
  839. Content: []*yaml.Node{{
  840. Kind: yaml.ScalarNode,
  841. Tag: "!!str",
  842. Line: 9,
  843. Column: 5,
  844. Value: "lc",
  845. HeadComment: "# HC1\n# HC2",
  846. LineComment: "# IC",
  847. FootComment: "# FC1\n# FC2",
  848. }, {
  849. Kind: yaml.ScalarNode,
  850. Tag: "!!str",
  851. Line: 14,
  852. Column: 5,
  853. Value: "ld",
  854. HeadComment: "# HD1",
  855. LineComment: "# ID",
  856. FootComment: "# FD1",
  857. }},
  858. }},
  859. }},
  860. }},
  861. },
  862. }, {
  863. "# H1\n[la, lb] # I\n# F1\n",
  864. yaml.Node{
  865. Kind: yaml.DocumentNode,
  866. Line: 2,
  867. Column: 1,
  868. Content: []*yaml.Node{{
  869. Kind: yaml.SequenceNode,
  870. Tag: "!!seq",
  871. Style: yaml.FlowStyle,
  872. Line: 2,
  873. Column: 1,
  874. HeadComment: "# H1",
  875. LineComment: "# I",
  876. FootComment: "# F1",
  877. Content: []*yaml.Node{{
  878. Kind: yaml.ScalarNode,
  879. Tag: "!!str",
  880. Line: 2,
  881. Column: 2,
  882. Value: "la",
  883. }, {
  884. Kind: yaml.ScalarNode,
  885. Tag: "!!str",
  886. Line: 2,
  887. Column: 6,
  888. Value: "lb",
  889. }},
  890. }},
  891. },
  892. }, {
  893. "# 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",
  894. yaml.Node{
  895. Kind: yaml.DocumentNode,
  896. Line: 4,
  897. Column: 1,
  898. HeadComment: "# DH1",
  899. FootComment: "# DF1",
  900. Content: []*yaml.Node{{
  901. Kind: yaml.SequenceNode,
  902. Tag: "!!seq",
  903. Style: yaml.FlowStyle,
  904. Line: 4,
  905. Column: 1,
  906. HeadComment: "# SH1",
  907. FootComment: "# SF1",
  908. Content: []*yaml.Node{{
  909. Kind: yaml.ScalarNode,
  910. Tag: "!!str",
  911. Line: 6,
  912. Column: 3,
  913. Value: "la",
  914. HeadComment: "# HA1",
  915. LineComment: "# IA",
  916. FootComment: "# FA1",
  917. }, {
  918. Kind: yaml.ScalarNode,
  919. Tag: "!!str",
  920. Line: 10,
  921. Column: 3,
  922. Value: "lb",
  923. HeadComment: "# HB1",
  924. LineComment: "# IB",
  925. FootComment: "# FB1",
  926. }},
  927. }},
  928. },
  929. }, {
  930. "# 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",
  931. yaml.Node{
  932. Kind: yaml.DocumentNode,
  933. Line: 4,
  934. Column: 1,
  935. HeadComment: "# DH1",
  936. FootComment: "# DF1",
  937. Content: []*yaml.Node{{
  938. Kind: yaml.SequenceNode,
  939. Tag: "!!seq",
  940. Style: yaml.FlowStyle,
  941. Line: 4,
  942. Column: 1,
  943. HeadComment: "# SH1",
  944. FootComment: "# SF1",
  945. Content: []*yaml.Node{{
  946. Kind: yaml.ScalarNode,
  947. Tag: "!!str",
  948. Line: 6,
  949. Column: 3,
  950. Value: "la",
  951. HeadComment: "# HA1",
  952. FootComment: "# FA1",
  953. }, {
  954. Kind: yaml.ScalarNode,
  955. Tag: "!!str",
  956. Line: 10,
  957. Column: 3,
  958. Value: "lb",
  959. HeadComment: "# HB1",
  960. FootComment: "# FB1",
  961. }},
  962. }},
  963. },
  964. }, {
  965. "# 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",
  966. yaml.Node{
  967. Kind: yaml.DocumentNode,
  968. Line: 4,
  969. Column: 1,
  970. HeadComment: "# DH1",
  971. FootComment: "# DF1",
  972. Content: []*yaml.Node{{
  973. Kind: yaml.MappingNode,
  974. Tag: "!!map",
  975. Style: yaml.FlowStyle,
  976. Line: 4,
  977. Column: 1,
  978. HeadComment: "# MH1",
  979. FootComment: "# MF1",
  980. Content: []*yaml.Node{{
  981. Kind: yaml.ScalarNode,
  982. Tag: "!!str",
  983. Line: 6,
  984. Column: 3,
  985. Value: "ka",
  986. HeadComment: "# HA1",
  987. FootComment: "# FA1",
  988. }, {
  989. Kind: yaml.ScalarNode,
  990. Tag: "!!str",
  991. Line: 6,
  992. Column: 7,
  993. Value: "va",
  994. LineComment: "# IA",
  995. }, {
  996. Kind: yaml.ScalarNode,
  997. Tag: "!!str",
  998. Line: 10,
  999. Column: 3,
  1000. Value: "kb",
  1001. HeadComment: "# HB1",
  1002. FootComment: "# FB1",
  1003. }, {
  1004. Kind: yaml.ScalarNode,
  1005. Tag: "!!str",
  1006. Line: 10,
  1007. Column: 7,
  1008. Value: "vb",
  1009. LineComment: "# IB",
  1010. }},
  1011. }},
  1012. },
  1013. }, {
  1014. "# 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",
  1015. yaml.Node{
  1016. Kind: yaml.DocumentNode,
  1017. Line: 4,
  1018. Column: 1,
  1019. HeadComment: "# DH1",
  1020. FootComment: "# DF1",
  1021. Content: []*yaml.Node{{
  1022. Kind: yaml.MappingNode,
  1023. Tag: "!!map",
  1024. Style: yaml.FlowStyle,
  1025. Line: 4,
  1026. Column: 1,
  1027. HeadComment: "# MH1",
  1028. FootComment: "# MF1",
  1029. Content: []*yaml.Node{{
  1030. Kind: yaml.ScalarNode,
  1031. Tag: "!!str",
  1032. Line: 6,
  1033. Column: 3,
  1034. Value: "ka",
  1035. HeadComment: "# HA1",
  1036. FootComment: "# FA1",
  1037. }, {
  1038. Kind: yaml.ScalarNode,
  1039. Tag: "!!str",
  1040. Line: 6,
  1041. Column: 7,
  1042. Value: "va",
  1043. }, {
  1044. Kind: yaml.ScalarNode,
  1045. Tag: "!!str",
  1046. Line: 10,
  1047. Column: 3,
  1048. Value: "kb",
  1049. HeadComment: "# HB1",
  1050. FootComment: "# FB1",
  1051. }, {
  1052. Kind: yaml.ScalarNode,
  1053. Tag: "!!str",
  1054. Line: 10,
  1055. Column: 7,
  1056. Value: "vb",
  1057. }},
  1058. }},
  1059. },
  1060. }, {
  1061. "# 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",
  1062. yaml.Node{
  1063. Kind: yaml.DocumentNode,
  1064. Line: 7,
  1065. Column: 1,
  1066. HeadComment: "# DH1\n\n# DH2",
  1067. FootComment: "# DF1\n\n# DF2",
  1068. Content: []*yaml.Node{{
  1069. Kind: yaml.SequenceNode,
  1070. Tag: "!!seq",
  1071. Line: 7,
  1072. Column: 1,
  1073. Content: []*yaml.Node{
  1074. saveNode("x", &yaml.Node{
  1075. Kind: yaml.ScalarNode,
  1076. Tag: "!!str",
  1077. Line: 7,
  1078. Column: 3,
  1079. Value: "la",
  1080. HeadComment: "# HA1\n# HA2",
  1081. LineComment: "# IA",
  1082. FootComment: "# FA1\n# FA2",
  1083. Anchor: "x",
  1084. }), {
  1085. Kind: yaml.AliasNode,
  1086. Line: 13,
  1087. Column: 3,
  1088. Value: "x",
  1089. Alias: dropNode("x"),
  1090. HeadComment: "# HB1\n# HB2",
  1091. LineComment: "# IB",
  1092. FootComment: "# FB1\n# FB2",
  1093. },
  1094. },
  1095. }},
  1096. },
  1097. },
  1098. }
  1099. func (s *S) TestNodeRoundtrip(c *C) {
  1100. defer os.Setenv("TZ", os.Getenv("TZ"))
  1101. os.Setenv("TZ", "UTC")
  1102. for i, item := range nodeTests {
  1103. c.Logf("test %d: %q", i, item.yaml)
  1104. decode := true
  1105. encode := true
  1106. testYaml := item.yaml
  1107. if s := strings.TrimPrefix(testYaml, "[decode]"); s != testYaml {
  1108. encode = false
  1109. testYaml = s
  1110. }
  1111. if s := strings.TrimPrefix(testYaml, "[encode]"); s != testYaml {
  1112. decode = false
  1113. testYaml = s
  1114. }
  1115. if decode {
  1116. var node yaml.Node
  1117. err := yaml.Unmarshal([]byte(testYaml), &node)
  1118. c.Assert(err, IsNil)
  1119. c.Assert(node, DeepEquals, item.node)
  1120. }
  1121. if encode {
  1122. buf := bytes.Buffer{}
  1123. enc := yaml.NewEncoder(&buf)
  1124. enc.SetIndent(2)
  1125. err := enc.Encode(&item.node)
  1126. c.Assert(err, IsNil)
  1127. err = enc.Close()
  1128. c.Assert(err, IsNil)
  1129. c.Assert(buf.String(), Equals, testYaml)
  1130. }
  1131. }
  1132. }
  1133. var savedNodes = make(map[string]*yaml.Node)
  1134. func saveNode(name string, node *yaml.Node) *yaml.Node {
  1135. savedNodes[name] = node
  1136. return node
  1137. }
  1138. func peekNode(name string) *yaml.Node {
  1139. return savedNodes[name]
  1140. }
  1141. func dropNode(name string) *yaml.Node {
  1142. node := savedNodes[name]
  1143. delete(savedNodes, name)
  1144. return node
  1145. }