node_test.go 26 KB

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