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())