/ test / tdom.nim
tdom.nim
  1  #            NimYAML - YAML implementation in Nim
  2  #        (c) Copyright 2015-2023 Felix Krause
  3  #
  4  #    See the file "copying.txt", included in this
  5  #    distribution, for details about the copyright.
  6  
  7  import "../yaml"
  8  import unittest, commonTestUtils, streams, tables
  9  
 10  suite "DOM":
 11    test "Composing simple Scalar":
 12      let
 13        input  = newStringStream("scalar")
 14        result = loadAs[YamlNode](input)
 15      assert result.kind == yScalar
 16      assert result.content == "scalar"
 17      assert result.tag == yTagQuestionMark
 18    test "Serializing simple Scalar":
 19      let input = newYamlNode("scalar")
 20      var result = represent(input)
 21      ensure(result, startStreamEvent(), startDocEvent(), scalarEvent("scalar"),
 22          endDocEvent(), endStreamEvent())
 23    test "Composing sequence":
 24      let
 25        input = newStringStream("- !!str a\n- !!bool no")
 26        result = loadAs[YamlNode](input)
 27      assert result.kind == ySequence
 28      assert result.tag == yTagQuestionMark
 29      assert result.len == 2
 30      assert result[0].kind == yScalar
 31      assert result[0].tag == yTagString
 32      assert result[0].content == "a"
 33      assert result[1].kind == yScalar
 34      assert result[1].tag == yTagBoolean
 35      assert result[1].content == "no"
 36    test "Serializing sequence":
 37      let input = newYamlNode([
 38          newYamlNode("a", yTagString),
 39          newYamlNode("no", yTagBoolean)])
 40      var result = represent(input, SerializationOptions(tagStyle: tsAll))
 41      ensure(result, startStreamEvent(), startDocEvent(), startSeqEvent(),
 42             scalarEvent("a", yTagString), scalarEvent("no", yTagBoolean),
 43             endSeqEvent(), endDocEvent(), endStreamEvent())
 44    test "Composing mapping":
 45      let
 46        input = newStringStream("--- !!map\n!foo bar: [a, b]")
 47        result = loadAs[YamlNode](input)
 48      assert result.kind == yMapping
 49      assert result.tag == yTagMapping
 50      assert result.fields.len == 1
 51      for key, value in result.fields.pairs:
 52        assert key.kind == yScalar
 53        assert $key.tag  == "!foo"
 54        assert key.content == "bar"
 55        assert value.kind == ySequence
 56        assert value.len == 2
 57    test "Serializing mapping":
 58      let input = newYamlNode([
 59          (key: newYamlNode("bar"), value: newYamlNode([newYamlNode("a"),
 60                                                        newYamlNode("b")]))])
 61      var result = represent(input)
 62      ensure(result, startStreamEvent(), startDocEvent(), startMapEvent(),
 63          scalarEvent("bar"), startSeqEvent(), scalarEvent("a"), scalarEvent("b"),
 64          endSeqEvent(), endMapEvent(), endDocEvent(), endStreamEvent())
 65    test "Composing with anchors":
 66      let
 67        input = newStringStream("- &a foo\n- &b bar\n- *a\n- *b")
 68        result = loadAs[YamlNode](input)
 69      assert result.kind == ySequence
 70      assert result.len == 4
 71      assert result[0].kind == yScalar
 72      assert result[0].content == "foo"
 73      assert result[1].kind == yScalar
 74      assert result[1].content == "bar"
 75      assert cast[pointer](result[0]) == cast[pointer](result[2])
 76      assert cast[pointer](result[1]) == cast[pointer](result[3])
 77    test "Serializing with anchors":
 78      let
 79        a = newYamlNode("a")
 80        b = newYamlNode("b")
 81        input = newYamlNode([a, b, newYamlNode("c"), a, b])
 82      var result = represent(input)
 83      ensure(result, startStreamEvent(), startDocEvent(), startSeqEvent(),
 84             scalarEvent("a", anchor="a".Anchor),
 85             scalarEvent("b", anchor="b".Anchor), scalarEvent("c"),
 86             aliasEvent("a".Anchor), aliasEvent("b".Anchor), endSeqEvent(),
 87             endDocEvent(), endStreamEvent())
 88    test "Serializing with all anchors":
 89      let
 90        a = newYamlNode("a")
 91        input = newYamlNode([a, newYamlNode("b"), a])
 92      var result = represent(input, SerializationOptions(anchorStyle: asAlways))
 93      ensure(result, startStreamEvent(), startDocEvent(),
 94             startSeqEvent(anchor="a".Anchor),
 95             scalarEvent("a", anchor = "b".Anchor),
 96             scalarEvent("b", anchor="c".Anchor), aliasEvent("b".Anchor),
 97             endSeqEvent(), endDocEvent(), endStreamEvent())
 98    test "Deserialize parts of the input into YamlNode":
 99      let
100        input = "a: b\nc: [d, e]"
101      type Root = object
102        a: string
103        c: YamlNode
104      var result = loadAs[Root](input)
105      assert result.a == "b"
106      assert result.c.kind == ySequence
107      assert result.c.len == 2
108      assert result.c[0].kind == yScalar
109      assert result.c[0].content == "d"
110      assert result.c[1].kind == yScalar
111      assert result.c[1].content == "e"
112    test "Serialize value that contains a YamlNode":
113      type Root = object
114        a: string
115        c: YamlNode
116      let value = Root(
117        a: "b",
118        c: newYamlNode([newYamlNode("d"), newYamlNode("e")]))
119      var result = represent(value, SerializationOptions(tagStyle: tsNone))
120      ensure(result, startStreamEvent(), startDocEvent(), startMapEvent(),
121        scalarEvent("a"), scalarEvent("b"), scalarEvent("c"), startSeqEvent(),
122        scalarEvent("d"), scalarEvent("e"), endSeqEvent(), endMapEvent(),
123        endDocEvent(), endStreamEvent())