node_test.go 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319
  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: c\n d: e\n",
  437. yaml.Node{
  438. Kind: yaml.DocumentNode,
  439. Line: 1,
  440. Column: 1,
  441. Content: []*yaml.Node{{
  442. Kind: yaml.MappingNode,
  443. Tag: "!!map",
  444. Line: 1,
  445. Column: 1,
  446. Content: []*yaml.Node{{
  447. Kind: yaml.ScalarNode,
  448. Value: "a",
  449. Tag: "!!str",
  450. Line: 1,
  451. Column: 1,
  452. }, {
  453. Kind: yaml.SequenceNode,
  454. Tag: "!!seq",
  455. Line: 2,
  456. Column: 1,
  457. Content: []*yaml.Node{{
  458. Kind: yaml.MappingNode,
  459. Tag: "!!map",
  460. Line: 2,
  461. Column: 3,
  462. Content: []*yaml.Node{{
  463. Kind: yaml.ScalarNode,
  464. Value: "b",
  465. Tag: "!!str",
  466. Line: 2,
  467. Column: 3,
  468. }, {
  469. Kind: yaml.ScalarNode,
  470. Value: "c",
  471. Tag: "!!str",
  472. Line: 2,
  473. Column: 6,
  474. }, {
  475. Kind: yaml.ScalarNode,
  476. Value: "d",
  477. Tag: "!!str",
  478. Line: 3,
  479. Column: 3,
  480. }, {
  481. Kind: yaml.ScalarNode,
  482. Value: "e",
  483. Tag: "!!str",
  484. Line: 3,
  485. Column: 6,
  486. }},
  487. }},
  488. }},
  489. }},
  490. },
  491. }, {
  492. "- a\n- b\n",
  493. yaml.Node{
  494. Kind: yaml.DocumentNode,
  495. Line: 1,
  496. Column: 1,
  497. Content: []*yaml.Node{{
  498. Kind: yaml.SequenceNode,
  499. Value: "",
  500. Tag: "!!seq",
  501. Line: 1,
  502. Column: 1,
  503. Content: []*yaml.Node{{
  504. Kind: yaml.ScalarNode,
  505. Value: "a",
  506. Tag: "!!str",
  507. Line: 1,
  508. Column: 3,
  509. }, {
  510. Kind: yaml.ScalarNode,
  511. Value: "b",
  512. Tag: "!!str",
  513. Line: 2,
  514. Column: 3,
  515. }},
  516. }},
  517. },
  518. }, {
  519. "- a\n- - b\n - c\n",
  520. yaml.Node{
  521. Kind: yaml.DocumentNode,
  522. Line: 1,
  523. Column: 1,
  524. Content: []*yaml.Node{{
  525. Kind: yaml.SequenceNode,
  526. Tag: "!!seq",
  527. Line: 1,
  528. Column: 1,
  529. Content: []*yaml.Node{{
  530. Kind: yaml.ScalarNode,
  531. Value: "a",
  532. Tag: "!!str",
  533. Line: 1,
  534. Column: 3,
  535. }, {
  536. Kind: yaml.SequenceNode,
  537. Tag: "!!seq",
  538. Line: 2,
  539. Column: 3,
  540. Content: []*yaml.Node{{
  541. Kind: yaml.ScalarNode,
  542. Value: "b",
  543. Tag: "!!str",
  544. Line: 2,
  545. Column: 5,
  546. }, {
  547. Kind: yaml.ScalarNode,
  548. Value: "c",
  549. Tag: "!!str",
  550. Line: 3,
  551. Column: 5,
  552. }},
  553. }},
  554. }},
  555. },
  556. }, {
  557. "[a, b]\n",
  558. yaml.Node{
  559. Kind: yaml.DocumentNode,
  560. Line: 1,
  561. Column: 1,
  562. Content: []*yaml.Node{{
  563. Kind: yaml.SequenceNode,
  564. Style: yaml.FlowStyle,
  565. Value: "",
  566. Tag: "!!seq",
  567. Line: 1,
  568. Column: 1,
  569. Content: []*yaml.Node{{
  570. Kind: yaml.ScalarNode,
  571. Value: "a",
  572. Tag: "!!str",
  573. Line: 1,
  574. Column: 2,
  575. }, {
  576. Kind: yaml.ScalarNode,
  577. Value: "b",
  578. Tag: "!!str",
  579. Line: 1,
  580. Column: 5,
  581. }},
  582. }},
  583. },
  584. }, {
  585. "- a\n- [b, c]\n",
  586. yaml.Node{
  587. Kind: yaml.DocumentNode,
  588. Line: 1,
  589. Column: 1,
  590. Content: []*yaml.Node{{
  591. Kind: yaml.SequenceNode,
  592. Tag: "!!seq",
  593. Line: 1,
  594. Column: 1,
  595. Content: []*yaml.Node{{
  596. Kind: yaml.ScalarNode,
  597. Value: "a",
  598. Tag: "!!str",
  599. Line: 1,
  600. Column: 3,
  601. }, {
  602. Kind: yaml.SequenceNode,
  603. Tag: "!!seq",
  604. Style: yaml.FlowStyle,
  605. Line: 2,
  606. Column: 3,
  607. Content: []*yaml.Node{{
  608. Kind: yaml.ScalarNode,
  609. Value: "b",
  610. Tag: "!!str",
  611. Line: 2,
  612. Column: 4,
  613. }, {
  614. Kind: yaml.ScalarNode,
  615. Value: "c",
  616. Tag: "!!str",
  617. Line: 2,
  618. Column: 7,
  619. }},
  620. }},
  621. }},
  622. },
  623. }, {
  624. "a: &x 1\nb: &y 2\nc: *x\nd: *y\n",
  625. yaml.Node{
  626. Kind: yaml.DocumentNode,
  627. Line: 1,
  628. Column: 1,
  629. Content: []*yaml.Node{{
  630. Kind: yaml.MappingNode,
  631. Line: 1,
  632. Column: 1,
  633. Tag: "!!map",
  634. Content: []*yaml.Node{{
  635. Kind: yaml.ScalarNode,
  636. Value: "a",
  637. Tag: "!!str",
  638. Line: 1,
  639. Column: 1,
  640. },
  641. saveNode("x", &yaml.Node{
  642. Kind: yaml.ScalarNode,
  643. Value: "1",
  644. Tag: "!!int",
  645. Anchor: "x",
  646. Line: 1,
  647. Column: 4,
  648. }),
  649. {
  650. Kind: yaml.ScalarNode,
  651. Value: "b",
  652. Tag: "!!str",
  653. Line: 2,
  654. Column: 1,
  655. },
  656. saveNode("y", &yaml.Node{
  657. Kind: yaml.ScalarNode,
  658. Value: "2",
  659. Tag: "!!int",
  660. Anchor: "y",
  661. Line: 2,
  662. Column: 4,
  663. }),
  664. {
  665. Kind: yaml.ScalarNode,
  666. Value: "c",
  667. Tag: "!!str",
  668. Line: 3,
  669. Column: 1,
  670. }, {
  671. Kind: yaml.AliasNode,
  672. Value: "x",
  673. Alias: dropNode("x"),
  674. Line: 3,
  675. Column: 4,
  676. }, {
  677. Kind: yaml.ScalarNode,
  678. Value: "d",
  679. Tag: "!!str",
  680. Line: 4,
  681. Column: 1,
  682. }, {
  683. Kind: yaml.AliasNode,
  684. Value: "y",
  685. Tag: "",
  686. Alias: dropNode("y"),
  687. Line: 4,
  688. Column: 4,
  689. }},
  690. }},
  691. },
  692. }, {
  693. "# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  694. yaml.Node{
  695. Kind: yaml.DocumentNode,
  696. Line: 3,
  697. Column: 1,
  698. Content: []*yaml.Node{{
  699. Kind: yaml.ScalarNode,
  700. Value: "true",
  701. Tag: "!!bool",
  702. Line: 3,
  703. Column: 1,
  704. HeadComment: "# One\n# Two",
  705. LineComment: "# Three",
  706. FootComment: "# Four\n# Five",
  707. }},
  708. },
  709. }, {
  710. // Write out the pound character if missing from comments.
  711. "[encode]# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  712. yaml.Node{
  713. Kind: yaml.DocumentNode,
  714. Line: 3,
  715. Column: 1,
  716. Content: []*yaml.Node{{
  717. Kind: yaml.ScalarNode,
  718. Value: "true",
  719. Tag: "!!bool",
  720. Line: 3,
  721. Column: 1,
  722. HeadComment: "One\nTwo\n",
  723. LineComment: "Three\n",
  724. FootComment: "Four\nFive\n",
  725. }},
  726. },
  727. }, {
  728. "[encode]# One\n# Two\ntrue # Three\n# Four\n# Five\n",
  729. yaml.Node{
  730. Kind: yaml.DocumentNode,
  731. Line: 3,
  732. Column: 1,
  733. Content: []*yaml.Node{{
  734. Kind: yaml.ScalarNode,
  735. Value: "true",
  736. Tag: "!!bool",
  737. Line: 3,
  738. Column: 1,
  739. HeadComment: " One\n Two",
  740. LineComment: " Three",
  741. FootComment: " Four\n Five",
  742. }},
  743. },
  744. }, {
  745. "# DH1\n\n# DH2\n\n# H1\n# H2\ntrue # I\n# F1\n# F2\n\n# DF1\n\n# DF2\n",
  746. yaml.Node{
  747. Kind: yaml.DocumentNode,
  748. Line: 7,
  749. Column: 1,
  750. HeadComment: "# DH1\n\n# DH2",
  751. FootComment: "# DF1\n\n# DF2",
  752. Content: []*yaml.Node{{
  753. Kind: yaml.ScalarNode,
  754. Value: "true",
  755. Tag: "!!bool",
  756. Line: 7,
  757. Column: 1,
  758. HeadComment: "# H1\n# H2",
  759. LineComment: "# I",
  760. FootComment: "# F1\n# F2",
  761. }},
  762. },
  763. }, {
  764. "# 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",
  765. yaml.Node{
  766. Kind: yaml.DocumentNode,
  767. Line: 7,
  768. Column: 1,
  769. HeadComment: "# DH1\n\n# DH2",
  770. FootComment: "# DF1\n\n# DF2",
  771. Content: []*yaml.Node{{
  772. Kind: yaml.MappingNode,
  773. Tag: "!!map",
  774. Line: 7,
  775. Column: 1,
  776. Content: []*yaml.Node{{
  777. Kind: yaml.ScalarNode,
  778. Line: 7,
  779. Column: 1,
  780. Tag: "!!str",
  781. Value: "ka",
  782. HeadComment: "# HA1\n# HA2",
  783. FootComment: "# FA1\n# FA2",
  784. }, {
  785. Kind: yaml.ScalarNode,
  786. Line: 7,
  787. Column: 5,
  788. Tag: "!!str",
  789. Value: "va",
  790. LineComment: "# IA",
  791. }, {
  792. Kind: yaml.ScalarNode,
  793. Line: 13,
  794. Column: 1,
  795. Tag: "!!str",
  796. Value: "kb",
  797. HeadComment: "# HB1\n# HB2",
  798. FootComment: "# FB1\n# FB2",
  799. }, {
  800. Kind: yaml.ScalarNode,
  801. Line: 13,
  802. Column: 5,
  803. Tag: "!!str",
  804. Value: "vb",
  805. LineComment: "# IB",
  806. }},
  807. }},
  808. },
  809. }, {
  810. "# 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",
  811. yaml.Node{
  812. Kind: yaml.DocumentNode,
  813. Line: 7,
  814. Column: 1,
  815. HeadComment: "# DH1\n\n# DH2",
  816. FootComment: "# DF1\n\n# DF2",
  817. Content: []*yaml.Node{{
  818. Kind: yaml.SequenceNode,
  819. Tag: "!!seq",
  820. Line: 7,
  821. Column: 1,
  822. Content: []*yaml.Node{{
  823. Kind: yaml.ScalarNode,
  824. Tag: "!!str",
  825. Line: 7,
  826. Column: 3,
  827. Value: "la",
  828. HeadComment: "# HA1\n# HA2",
  829. LineComment: "# IA",
  830. FootComment: "# FA1\n# FA2",
  831. }, {
  832. Kind: yaml.ScalarNode,
  833. Tag: "!!str",
  834. Line: 13,
  835. Column: 3,
  836. Value: "lb",
  837. HeadComment: "# HB1\n# HB2",
  838. LineComment: "# IB",
  839. FootComment: "# FB1\n# FB2",
  840. }},
  841. }},
  842. },
  843. }, {
  844. "# DH1\n\n- la # IA\n\n# HB1\n- lb\n",
  845. yaml.Node{
  846. Kind: yaml.DocumentNode,
  847. Line: 3,
  848. Column: 1,
  849. HeadComment: "# DH1",
  850. Content: []*yaml.Node{{
  851. Kind: yaml.SequenceNode,
  852. Tag: "!!seq",
  853. Line: 3,
  854. Column: 1,
  855. Content: []*yaml.Node{{
  856. Kind: yaml.ScalarNode,
  857. Tag: "!!str",
  858. Line: 3,
  859. Column: 3,
  860. Value: "la",
  861. LineComment: "# IA",
  862. }, {
  863. Kind: yaml.ScalarNode,
  864. Tag: "!!str",
  865. Line: 6,
  866. Column: 3,
  867. Value: "lb",
  868. HeadComment: "# HB1",
  869. }},
  870. }},
  871. },
  872. }, {
  873. "# 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",
  874. yaml.Node{
  875. Kind: yaml.DocumentNode,
  876. Line: 4,
  877. Column: 1,
  878. HeadComment: "# DH1",
  879. FootComment: "# DF1",
  880. Content: []*yaml.Node{{
  881. Kind: yaml.MappingNode,
  882. Tag: "!!map",
  883. Line: 4,
  884. Column: 1,
  885. Content: []*yaml.Node{{
  886. Kind: yaml.ScalarNode,
  887. Tag: "!!str",
  888. Line: 4,
  889. Column: 1,
  890. Value: "ka",
  891. HeadComment: "# HA1",
  892. }, {
  893. Kind: yaml.MappingNode,
  894. Tag: "!!map",
  895. Line: 6,
  896. Column: 3,
  897. Content: []*yaml.Node{{
  898. Kind: yaml.ScalarNode,
  899. Tag: "!!str",
  900. Line: 6,
  901. Column: 3,
  902. Value: "kb",
  903. HeadComment: "# HB1",
  904. }, {
  905. Kind: yaml.SequenceNode,
  906. Line: 9,
  907. Column: 3,
  908. Tag: "!!seq",
  909. Content: []*yaml.Node{{
  910. Kind: yaml.ScalarNode,
  911. Tag: "!!str",
  912. Line: 9,
  913. Column: 5,
  914. Value: "lc",
  915. HeadComment: "# HC1\n# HC2",
  916. LineComment: "# IC",
  917. FootComment: "# FC1\n# FC2",
  918. }, {
  919. Kind: yaml.ScalarNode,
  920. Tag: "!!str",
  921. Line: 14,
  922. Column: 5,
  923. Value: "ld",
  924. HeadComment: "# HD1",
  925. LineComment: "# ID",
  926. FootComment: "# FD1",
  927. }},
  928. }},
  929. }},
  930. }},
  931. },
  932. }, {
  933. "# H1\n[la, lb] # I\n# F1\n",
  934. yaml.Node{
  935. Kind: yaml.DocumentNode,
  936. Line: 2,
  937. Column: 1,
  938. Content: []*yaml.Node{{
  939. Kind: yaml.SequenceNode,
  940. Tag: "!!seq",
  941. Style: yaml.FlowStyle,
  942. Line: 2,
  943. Column: 1,
  944. HeadComment: "# H1",
  945. LineComment: "# I",
  946. FootComment: "# F1",
  947. Content: []*yaml.Node{{
  948. Kind: yaml.ScalarNode,
  949. Tag: "!!str",
  950. Line: 2,
  951. Column: 2,
  952. Value: "la",
  953. }, {
  954. Kind: yaml.ScalarNode,
  955. Tag: "!!str",
  956. Line: 2,
  957. Column: 6,
  958. Value: "lb",
  959. }},
  960. }},
  961. },
  962. }, {
  963. "# 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",
  964. yaml.Node{
  965. Kind: yaml.DocumentNode,
  966. Line: 4,
  967. Column: 1,
  968. HeadComment: "# DH1",
  969. FootComment: "# DF1",
  970. Content: []*yaml.Node{{
  971. Kind: yaml.SequenceNode,
  972. Tag: "!!seq",
  973. Style: yaml.FlowStyle,
  974. Line: 4,
  975. Column: 1,
  976. HeadComment: "# SH1",
  977. FootComment: "# SF1",
  978. Content: []*yaml.Node{{
  979. Kind: yaml.ScalarNode,
  980. Tag: "!!str",
  981. Line: 6,
  982. Column: 3,
  983. Value: "la",
  984. HeadComment: "# HA1",
  985. LineComment: "# IA",
  986. FootComment: "# FA1",
  987. }, {
  988. Kind: yaml.ScalarNode,
  989. Tag: "!!str",
  990. Line: 10,
  991. Column: 3,
  992. Value: "lb",
  993. HeadComment: "# HB1",
  994. LineComment: "# IB",
  995. FootComment: "# FB1",
  996. }},
  997. }},
  998. },
  999. }, {
  1000. "# 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",
  1001. yaml.Node{
  1002. Kind: yaml.DocumentNode,
  1003. Line: 4,
  1004. Column: 1,
  1005. HeadComment: "# DH1",
  1006. FootComment: "# DF1",
  1007. Content: []*yaml.Node{{
  1008. Kind: yaml.SequenceNode,
  1009. Tag: "!!seq",
  1010. Style: yaml.FlowStyle,
  1011. Line: 4,
  1012. Column: 1,
  1013. HeadComment: "# SH1",
  1014. FootComment: "# SF1",
  1015. Content: []*yaml.Node{{
  1016. Kind: yaml.ScalarNode,
  1017. Tag: "!!str",
  1018. Line: 6,
  1019. Column: 3,
  1020. Value: "la",
  1021. HeadComment: "# HA1",
  1022. FootComment: "# FA1",
  1023. }, {
  1024. Kind: yaml.ScalarNode,
  1025. Tag: "!!str",
  1026. Line: 10,
  1027. Column: 3,
  1028. Value: "lb",
  1029. HeadComment: "# HB1",
  1030. FootComment: "# FB1",
  1031. }},
  1032. }},
  1033. },
  1034. }, {
  1035. "# 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",
  1036. yaml.Node{
  1037. Kind: yaml.DocumentNode,
  1038. Line: 4,
  1039. Column: 1,
  1040. HeadComment: "# DH1",
  1041. FootComment: "# DF1",
  1042. Content: []*yaml.Node{{
  1043. Kind: yaml.MappingNode,
  1044. Tag: "!!map",
  1045. Style: yaml.FlowStyle,
  1046. Line: 4,
  1047. Column: 1,
  1048. HeadComment: "# MH1",
  1049. FootComment: "# MF1",
  1050. Content: []*yaml.Node{{
  1051. Kind: yaml.ScalarNode,
  1052. Tag: "!!str",
  1053. Line: 6,
  1054. Column: 3,
  1055. Value: "ka",
  1056. HeadComment: "# HA1",
  1057. FootComment: "# FA1",
  1058. }, {
  1059. Kind: yaml.ScalarNode,
  1060. Tag: "!!str",
  1061. Line: 6,
  1062. Column: 7,
  1063. Value: "va",
  1064. LineComment: "# IA",
  1065. }, {
  1066. Kind: yaml.ScalarNode,
  1067. Tag: "!!str",
  1068. Line: 10,
  1069. Column: 3,
  1070. Value: "kb",
  1071. HeadComment: "# HB1",
  1072. FootComment: "# FB1",
  1073. }, {
  1074. Kind: yaml.ScalarNode,
  1075. Tag: "!!str",
  1076. Line: 10,
  1077. Column: 7,
  1078. Value: "vb",
  1079. LineComment: "# IB",
  1080. }},
  1081. }},
  1082. },
  1083. }, {
  1084. "# 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",
  1085. yaml.Node{
  1086. Kind: yaml.DocumentNode,
  1087. Line: 4,
  1088. Column: 1,
  1089. HeadComment: "# DH1",
  1090. FootComment: "# DF1",
  1091. Content: []*yaml.Node{{
  1092. Kind: yaml.MappingNode,
  1093. Tag: "!!map",
  1094. Style: yaml.FlowStyle,
  1095. Line: 4,
  1096. Column: 1,
  1097. HeadComment: "# MH1",
  1098. FootComment: "# MF1",
  1099. Content: []*yaml.Node{{
  1100. Kind: yaml.ScalarNode,
  1101. Tag: "!!str",
  1102. Line: 6,
  1103. Column: 3,
  1104. Value: "ka",
  1105. HeadComment: "# HA1",
  1106. FootComment: "# FA1",
  1107. }, {
  1108. Kind: yaml.ScalarNode,
  1109. Tag: "!!str",
  1110. Line: 6,
  1111. Column: 7,
  1112. Value: "va",
  1113. }, {
  1114. Kind: yaml.ScalarNode,
  1115. Tag: "!!str",
  1116. Line: 10,
  1117. Column: 3,
  1118. Value: "kb",
  1119. HeadComment: "# HB1",
  1120. FootComment: "# FB1",
  1121. }, {
  1122. Kind: yaml.ScalarNode,
  1123. Tag: "!!str",
  1124. Line: 10,
  1125. Column: 7,
  1126. Value: "vb",
  1127. }},
  1128. }},
  1129. },
  1130. }, {
  1131. "# 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",
  1132. yaml.Node{
  1133. Kind: yaml.DocumentNode,
  1134. Line: 7,
  1135. Column: 1,
  1136. HeadComment: "# DH1\n\n# DH2",
  1137. FootComment: "# DF1\n\n# DF2",
  1138. Content: []*yaml.Node{{
  1139. Kind: yaml.SequenceNode,
  1140. Tag: "!!seq",
  1141. Line: 7,
  1142. Column: 1,
  1143. Content: []*yaml.Node{
  1144. saveNode("x", &yaml.Node{
  1145. Kind: yaml.ScalarNode,
  1146. Tag: "!!str",
  1147. Line: 7,
  1148. Column: 3,
  1149. Value: "la",
  1150. HeadComment: "# HA1\n# HA2",
  1151. LineComment: "# IA",
  1152. FootComment: "# FA1\n# FA2",
  1153. Anchor: "x",
  1154. }), {
  1155. Kind: yaml.AliasNode,
  1156. Line: 13,
  1157. Column: 3,
  1158. Value: "x",
  1159. Alias: dropNode("x"),
  1160. HeadComment: "# HB1\n# HB2",
  1161. LineComment: "# IB",
  1162. FootComment: "# FB1\n# FB2",
  1163. },
  1164. },
  1165. }},
  1166. },
  1167. },
  1168. }
  1169. func (s *S) TestNodeRoundtrip(c *C) {
  1170. defer os.Setenv("TZ", os.Getenv("TZ"))
  1171. os.Setenv("TZ", "UTC")
  1172. for i, item := range nodeTests {
  1173. c.Logf("test %d: %q", i, item.yaml)
  1174. decode := true
  1175. encode := true
  1176. testYaml := item.yaml
  1177. if s := strings.TrimPrefix(testYaml, "[decode]"); s != testYaml {
  1178. encode = false
  1179. testYaml = s
  1180. }
  1181. if s := strings.TrimPrefix(testYaml, "[encode]"); s != testYaml {
  1182. decode = false
  1183. testYaml = s
  1184. }
  1185. if decode {
  1186. var node yaml.Node
  1187. err := yaml.Unmarshal([]byte(testYaml), &node)
  1188. c.Assert(err, IsNil)
  1189. c.Assert(node, DeepEquals, item.node)
  1190. }
  1191. if encode {
  1192. buf := bytes.Buffer{}
  1193. enc := yaml.NewEncoder(&buf)
  1194. enc.SetIndent(2)
  1195. err := enc.Encode(&item.node)
  1196. c.Assert(err, IsNil)
  1197. err = enc.Close()
  1198. c.Assert(err, IsNil)
  1199. c.Assert(buf.String(), Equals, testYaml)
  1200. }
  1201. }
  1202. }
  1203. var savedNodes = make(map[string]*yaml.Node)
  1204. func saveNode(name string, node *yaml.Node) *yaml.Node {
  1205. savedNodes[name] = node
  1206. return node
  1207. }
  1208. func peekNode(name string) *yaml.Node {
  1209. return savedNodes[name]
  1210. }
  1211. func dropNode(name string) *yaml.Node {
  1212. node := savedNodes[name]
  1213. delete(savedNodes, name)
  1214. return node
  1215. }
  1216. var setStringTests = []struct {
  1217. str string
  1218. yaml string
  1219. node yaml.Node
  1220. }{
  1221. {
  1222. "something simple",
  1223. "something simple\n",
  1224. yaml.Node{
  1225. Kind: yaml.ScalarNode,
  1226. Value: "something simple",
  1227. Tag: "!!str",
  1228. },
  1229. }, {
  1230. `"quoted value"`,
  1231. "'\"quoted value\"'\n",
  1232. yaml.Node{
  1233. Kind: yaml.ScalarNode,
  1234. Value: `"quoted value"`,
  1235. Tag: "!!str",
  1236. },
  1237. }, {
  1238. "multi\nline",
  1239. "|-\n multi\n line\n",
  1240. yaml.Node{
  1241. Kind: yaml.ScalarNode,
  1242. Value: "multi\nline",
  1243. Tag: "!!str",
  1244. Style: yaml.LiteralStyle,
  1245. },
  1246. }, {
  1247. "123",
  1248. "\"123\"\n",
  1249. yaml.Node{
  1250. Kind: yaml.ScalarNode,
  1251. Value: "123",
  1252. Tag: "!!str",
  1253. },
  1254. }, {
  1255. "multi\nline\n",
  1256. "|\n multi\n line\n",
  1257. yaml.Node{
  1258. Kind: yaml.ScalarNode,
  1259. Value: "multi\nline\n",
  1260. Tag: "!!str",
  1261. Style: yaml.LiteralStyle,
  1262. },
  1263. }, {
  1264. "\x80\x81\x82",
  1265. "!!binary gIGC\n",
  1266. yaml.Node{
  1267. Kind: yaml.ScalarNode,
  1268. Value: "gIGC",
  1269. Tag: "!!binary",
  1270. },
  1271. },
  1272. }
  1273. func (s *S) TestSetString(c *C) {
  1274. defer os.Setenv("TZ", os.Getenv("TZ"))
  1275. os.Setenv("TZ", "UTC")
  1276. for i, item := range setStringTests {
  1277. c.Logf("test %d: %q", i, item.str)
  1278. var node yaml.Node
  1279. node.SetString(item.str)
  1280. c.Assert(node, DeepEquals, item.node)
  1281. buf := bytes.Buffer{}
  1282. enc := yaml.NewEncoder(&buf)
  1283. enc.SetIndent(2)
  1284. err := enc.Encode(&item.node)
  1285. c.Assert(err, IsNil)
  1286. err = enc.Close()
  1287. c.Assert(err, IsNil)
  1288. c.Assert(buf.String(), Equals, item.yaml)
  1289. var doc yaml.Node
  1290. err = yaml.Unmarshal([]byte(item.yaml), &doc)
  1291. c.Assert(err, IsNil)
  1292. var str string
  1293. err = node.Decode(&str)
  1294. c.Assert(err, IsNil)
  1295. c.Assert(str, Equals, item.str)
  1296. }
  1297. }