node_test.go 20 KB

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