node_test.go 23 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109
  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. HeadComment: "# One\n# Two",
  621. LineComment: "# Three",
  622. FootComment: "# 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. HeadComment: "# DH1\n\n# DH2",
  632. FootComment: "# 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. HeadComment: "# H1\n# H2",
  640. LineComment: "# I",
  641. FootComment: "# 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. HeadComment: "# DH1\n\n# DH2",
  651. FootComment: "# 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. HeadComment: "# HA1\n# HA2",
  664. FootComment: "# FA1\n# FA2",
  665. }, {
  666. Kind: yaml.ScalarNode,
  667. Line: 7,
  668. Column: 5,
  669. Tag: "!!str",
  670. Value: "va",
  671. LineComment: "# IA",
  672. }, {
  673. Kind: yaml.ScalarNode,
  674. Line: 13,
  675. Column: 1,
  676. Tag: "!!str",
  677. Value: "kb",
  678. HeadComment: "# HB1\n# HB2",
  679. FootComment: "# FB1\n# FB2",
  680. }, {
  681. Kind: yaml.ScalarNode,
  682. Line: 13,
  683. Column: 5,
  684. Tag: "!!str",
  685. Value: "vb",
  686. LineComment: "# 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. HeadComment: "# DH1\n\n# DH2",
  697. FootComment: "# 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. HeadComment: "# HA1\n# HA2",
  710. LineComment: "# IA",
  711. FootComment: "# FA1\n# FA2",
  712. }, {
  713. Kind: yaml.ScalarNode,
  714. Tag: "!!str",
  715. Line: 13,
  716. Column: 3,
  717. Value: "lb",
  718. HeadComment: "# HB1\n# HB2",
  719. LineComment: "# IB",
  720. FootComment: "# 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. HeadComment: "# 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. LineComment: "# IA",
  743. }, {
  744. Kind: yaml.ScalarNode,
  745. Tag: "!!str",
  746. Line: 6,
  747. Column: 3,
  748. Value: "lb",
  749. HeadComment: "# 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. HeadComment: "# DH1",
  760. FootComment: "# 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. HeadComment: "# 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. HeadComment: "# 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. HeadComment: "# HC1\n# HC2",
  797. LineComment: "# IC",
  798. FootComment: "# FC1\n# FC2",
  799. }, {
  800. Kind: yaml.ScalarNode,
  801. Tag: "!!str",
  802. Line: 14,
  803. Column: 5,
  804. Value: "ld",
  805. HeadComment: "# HD1",
  806. LineComment: "# ID",
  807. FootComment: "# 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. HeadComment: "# H1",
  826. LineComment: "# I",
  827. FootComment: "# 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. HeadComment: "# DH1",
  850. FootComment: "# DF1",
  851. Children: []*yaml.Node{{
  852. Kind: yaml.SequenceNode,
  853. Tag: "!!seq",
  854. Style: yaml.FlowStyle,
  855. Line: 4,
  856. Column: 1,
  857. HeadComment: "# SH1",
  858. FootComment: "# SF1",
  859. Children: []*yaml.Node{{
  860. Kind: yaml.ScalarNode,
  861. Tag: "!!str",
  862. Line: 6,
  863. Column: 3,
  864. Value: "la",
  865. HeadComment: "# HA1",
  866. LineComment: "# IA",
  867. FootComment: "# FA1",
  868. }, {
  869. Kind: yaml.ScalarNode,
  870. Tag: "!!str",
  871. Line: 10,
  872. Column: 3,
  873. Value: "lb",
  874. HeadComment: "# HB1",
  875. LineComment: "# IB",
  876. FootComment: "# 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. HeadComment: "# DH1",
  887. FootComment: "# DF1",
  888. Children: []*yaml.Node{{
  889. Kind: yaml.SequenceNode,
  890. Tag: "!!seq",
  891. Style: yaml.FlowStyle,
  892. Line: 4,
  893. Column: 1,
  894. HeadComment: "# SH1",
  895. FootComment: "# SF1",
  896. Children: []*yaml.Node{{
  897. Kind: yaml.ScalarNode,
  898. Tag: "!!str",
  899. Line: 6,
  900. Column: 3,
  901. Value: "la",
  902. HeadComment: "# HA1",
  903. FootComment: "# FA1",
  904. }, {
  905. Kind: yaml.ScalarNode,
  906. Tag: "!!str",
  907. Line: 10,
  908. Column: 3,
  909. Value: "lb",
  910. HeadComment: "# HB1",
  911. FootComment: "# 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. HeadComment: "# DH1",
  922. FootComment: "# DF1",
  923. Children: []*yaml.Node{{
  924. Kind: yaml.MappingNode,
  925. Tag: "!!map",
  926. Style: yaml.FlowStyle,
  927. Line: 4,
  928. Column: 1,
  929. HeadComment: "# MH1",
  930. FootComment: "# MF1",
  931. Children: []*yaml.Node{{
  932. Kind: yaml.ScalarNode,
  933. Tag: "!!str",
  934. Line: 6,
  935. Column: 3,
  936. Value: "ka",
  937. HeadComment: "# HA1",
  938. FootComment: "# FA1",
  939. }, {
  940. Kind: yaml.ScalarNode,
  941. Tag: "!!str",
  942. Line: 6,
  943. Column: 7,
  944. Value: "va",
  945. LineComment: "# IA",
  946. }, {
  947. Kind: yaml.ScalarNode,
  948. Tag: "!!str",
  949. Line: 10,
  950. Column: 3,
  951. Value: "kb",
  952. HeadComment: "# HB1",
  953. FootComment: "# FB1",
  954. }, {
  955. Kind: yaml.ScalarNode,
  956. Tag: "!!str",
  957. Line: 10,
  958. Column: 7,
  959. Value: "vb",
  960. LineComment: "# 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. HeadComment: "# DH1",
  971. FootComment: "# DF1",
  972. Children: []*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. Children: []*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. }, {
  995. Kind: yaml.ScalarNode,
  996. Tag: "!!str",
  997. Line: 10,
  998. Column: 3,
  999. Value: "kb",
  1000. HeadComment: "# HB1",
  1001. FootComment: "# FB1",
  1002. }, {
  1003. Kind: yaml.ScalarNode,
  1004. Tag: "!!str",
  1005. Line: 10,
  1006. Column: 7,
  1007. Value: "vb",
  1008. }},
  1009. }},
  1010. },
  1011. }, {
  1012. "# 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",
  1013. yaml.Node{
  1014. Kind: yaml.DocumentNode,
  1015. Line: 7,
  1016. Column: 1,
  1017. HeadComment: "# DH1\n\n# DH2",
  1018. FootComment: "# DF1\n\n# DF2",
  1019. Children: []*yaml.Node{{
  1020. Kind: yaml.SequenceNode,
  1021. Tag: "!!seq",
  1022. Line: 7,
  1023. Column: 1,
  1024. Children: []*yaml.Node{
  1025. saveNode("x", &yaml.Node{
  1026. Kind: yaml.ScalarNode,
  1027. Tag: "!!str",
  1028. Line: 7,
  1029. Column: 3,
  1030. Value: "la",
  1031. HeadComment: "# HA1\n# HA2",
  1032. LineComment: "# IA",
  1033. FootComment: "# FA1\n# FA2",
  1034. Anchor: "x",
  1035. }), {
  1036. Kind: yaml.AliasNode,
  1037. Line: 13,
  1038. Column: 3,
  1039. Value: "x",
  1040. Alias: dropNode("x"),
  1041. HeadComment: "# HB1\n# HB2",
  1042. LineComment: "# IB",
  1043. FootComment: "# FB1\n# FB2",
  1044. },
  1045. },
  1046. }},
  1047. },
  1048. },
  1049. }
  1050. func (s *S) TestNodeRoundtrip(c *C) {
  1051. defer os.Setenv("TZ", os.Getenv("TZ"))
  1052. os.Setenv("TZ", "UTC")
  1053. for i, item := range nodeTests {
  1054. c.Logf("test %d: %q", i, item.yaml)
  1055. decode := true
  1056. encode := true
  1057. testYaml := item.yaml
  1058. if s := strings.TrimPrefix(testYaml, "[decode]"); s != testYaml {
  1059. encode = false
  1060. testYaml = s
  1061. }
  1062. if s := strings.TrimPrefix(testYaml, "[encode]"); s != testYaml {
  1063. decode = false
  1064. testYaml = s
  1065. }
  1066. if decode {
  1067. var node yaml.Node
  1068. err := yaml.Unmarshal([]byte(testYaml), &node)
  1069. c.Assert(err, IsNil)
  1070. c.Assert(node, DeepEquals, item.node)
  1071. }
  1072. if encode {
  1073. buf := bytes.Buffer{}
  1074. enc := yaml.NewEncoder(&buf)
  1075. enc.SetIndent(2)
  1076. err := enc.Encode(&item.node)
  1077. c.Assert(err, IsNil)
  1078. err = enc.Close()
  1079. c.Assert(err, IsNil)
  1080. c.Assert(buf.String(), Equals, testYaml)
  1081. }
  1082. }
  1083. }
  1084. var savedNodes = make(map[string]*yaml.Node)
  1085. func saveNode(name string, node *yaml.Node) *yaml.Node {
  1086. savedNodes[name] = node
  1087. return node
  1088. }
  1089. func peekNode(name string) *yaml.Node {
  1090. return savedNodes[name]
  1091. }
  1092. func dropNode(name string) *yaml.Node {
  1093. node := savedNodes[name]
  1094. delete(savedNodes, name)
  1095. return node
  1096. }