/ test / tpresenter.nim
tpresenter.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 std/[ options, strutils ]
  8  import ../yaml/[ presenter, data, stream ]
  9  import unittest
 10  import commonTestUtils
 11  
 12  proc inputSingle(events: varargs[Event]): BufferYamlStream =
 13    result = newBufferYamlStream()
 14    result.put(startStreamEvent())
 15    result.put(startDocEvent())
 16    for event in events: result.put(event)
 17    result.put(endDocEvent())
 18    result.put(endStreamEvent())
 19  
 20  let minimalOptions = PresentationOptions(outputVersion: ovNone)
 21  
 22  proc assertOutput(
 23      input: YamlStream, expected: string,
 24      options: PresentationOptions = minimalOptions) =
 25    var output = present(input, options)
 26    assertStringEqual expected, output
 27  
 28  suite "Presenter":
 29    test "Scalar with tag":
 30      var input = inputSingle(scalarEvent("droggeljug", yTagString))
 31      assertOutput(input, "--- !!str\ndroggeljug\n")
 32    
 33    test "Scalar without tag":
 34      var input = inputSingle(scalarEvent("droggeljug"))
 35      assertOutput(input, "droggeljug\n")
 36    
 37    test "Root block scalar":
 38      var input = inputSingle(scalarEvent("I am a dwarf and I'm digging a hole\n  diggy diggy hole\n  diggy diggy hole\n"))
 39      assertOutput(input,
 40        "--- |\n" &
 41        "I am a dwarf and I'm digging a hole\n" & 
 42        "  diggy diggy hole\n" &
 43        "  diggy diggy hole\n",
 44        PresentationOptions(maxLineLength: some(40)))
 45      
 46    test "Compact flow sequence":
 47      var input = inputSingle(startSeqEvent(), scalarEvent("1"), scalarEvent("2"), endSeqEvent())
 48      assertOutput(input, "[1, 2]\n")
 49    
 50    test "Forced block sequence":
 51      var input = inputSingle(startSeqEvent(), scalarEvent("1"), scalarEvent("2"), endSeqEvent())
 52      assertOutput(input, "- 1\n- 2\n", PresentationOptions(outputVersion: ovNone, containers: cBlock))
 53    
 54    test "Forced multiline flow sequence":
 55      var input = inputSingle(startSeqEvent(), scalarEvent("1"), scalarEvent("2"), endSeqEvent())
 56      assertOutput(input, "[\n  1,\n  2\n]\n", PresentationOptions(outputVersion: ovNone, condenseFlow: false, containers: cFlow))
 57      
 58    test "Compact flow mapping":
 59      var input = inputSingle(startMapEvent(), scalarEvent("1"), scalarEvent("2"), endMapEvent())
 60      assertOutput(input, "{1: 2}\n", PresentationOptions(outputVersion: ovNone, containers: cFlow))
 61    
 62    test "Simple block mapping":
 63      var input = inputSingle(startMapEvent(), scalarEvent("1"), scalarEvent("2"), endMapEvent())
 64      assertOutput(input, "1: 2\n", PresentationOptions(outputVersion: ovNone))
 65    
 66    test "Forced multiline flow mapping":
 67      var input = inputSingle(startMapEvent(), scalarEvent("1"), scalarEvent("2"), endMapEvent())
 68      assertOutput(input, "{\n  1: 2\n}\n", PresentationOptions(outputVersion: ovNone, condenseFlow: false, containers: cFlow))
 69    
 70    test "Forced JSON mapping":
 71      var input = inputSingle(startMapEvent(), scalarEvent("1"), scalarEvent("2"), endMapEvent())
 72      assertOutput(input, "{\n  \"1\": 2\n}\n", PresentationOptions(outputVersion: ovNone, condenseFlow: false, containers: cFlow, quoting: sqJson))
 73    
 74    test "Nested flow sequence":
 75      var input = inputSingle(startMapEvent(), scalarEvent("a"), startSeqEvent(), scalarEvent("1"), scalarEvent("2"), endSeqEvent(), endMapEvent())
 76      assertOutput(input, "a: [1, 2]\n")
 77    
 78    test "Nested block sequence":
 79      var input = inputSingle(startMapEvent(), scalarEvent("a"), startSeqEvent(), scalarEvent("1"), scalarEvent("2"), endSeqEvent(), endMapEvent())
 80      assertOutput(input, "a:\n  - 1\n  - 2\n", PresentationOptions(outputVersion: ovNone, containers: cBlock))
 81    
 82    test "Compact notation: mapping in sequence":
 83      var input = inputSingle(startSeqEvent(), scalarEvent("a"), startMapEvent(), scalarEvent("1"), scalarEvent("2"),   
 84          scalarEvent("3"), scalarEvent("4"), endMapEvent(), endSeqEvent())
 85      assertOutput(input, "- a\n- 1: 2\n  3: 4\n")
 86    
 87    test "No compact notation: sequence in mapping":
 88      var input = inputSingle(startMapEvent(), scalarEvent("a"), startSeqEvent(), scalarEvent("1"), endSeqEvent(), endMapEvent())
 89      assertOutput(input, "a:\n  - 1\n", PresentationOptions(outputVersion: ovNone, containers: cBlock))
 90    
 91    test "Compact notation with 4 spaces indentation":
 92      var input = inputSingle(startSeqEvent(), scalarEvent("a"), startMapEvent(), scalarEvent("1"), scalarEvent("2"),   
 93          scalarEvent("3"), scalarEvent("4"), endMapEvent(), endSeqEvent())
 94      assertOutput(input, "-   a\n-   1: 2\n    3: 4\n", PresentationOptions(outputVersion: ovNone, indentationStep: 4))
 95    
 96    test "Compact notation with 4 spaces indentation, more complex input":
 97      var input = inputSingle(startMapEvent(), scalarEvent("root"), startSeqEvent(), scalarEvent("a"),
 98          startMapEvent(), scalarEvent("1"), scalarEvent("2"), scalarEvent("3"), scalarEvent("4"), endMapEvent(),
 99          endSeqEvent(), endMapEvent())
100      assertOutput(input, "root:\n    -   a\n    -   1: 2\n        3: 4\n", PresentationOptions(outputVersion: ovNone, indentationStep: 4))
101    
102    test "Scalar output with explicit style set":
103      var input = inputSingle(
104        startSeqEvent(), scalarEvent("plain", style = ssPlain),
105        scalarEvent("@noplain", style = ssPlain),
106        scalarEvent("literal\n", style = ssLiteral),
107        scalarEvent("nofolded ", style = ssFolded),
108        scalarEvent("folded scalar", style = ssFolded),
109        scalarEvent("single'", style = ssSingleQuoted),
110        endSeqEvent()
111      )
112      assertOutput(input, "- plain\n" &
113        "- \"@noplain\"\n" &
114        "- |\n" &
115        "  literal\n" &
116        "- \"nofolded \"\n" &
117        "- >-\n" &
118        "  folded scalar\n" &
119        "- 'single'''\n")
120        
121    test "Collection output with explicit style set":
122      var input = inputSingle(
123        startMapEvent(), scalarEvent("a", style = ssDoubleQuoted),
124        startSeqEvent(style = csFlow), scalarEvent("b"), scalarEvent("c"), scalarEvent("d"), endSeqEvent(),
125        scalarEvent("? e"), startSeqEvent(style = csBlock), scalarEvent("f"), endSeqEvent(),
126        scalarEvent("g"), startMapEvent(), scalarEvent("h"), scalarEvent("i"), endMapEvent(),
127        scalarEvent("j"), startMapEvent(), scalarEvent("k", style = ssLiteral), scalarEvent("l"), endMapEvent(),
128        endMapEvent()
129      )
130      assertOutput(input, "\"a\": [b, c, d]\n" &
131        "\"? e\":\n" &
132        "  - f\n" &
133        "g: {h: i}\n" &
134        "j:\n" &
135        "  ? |-\n" &
136        "    k\n" &
137        "  : l\n")
138    
139    test "Block mapping with multiline keys":
140      var input = inputSingle(
141        startMapEvent(), scalarEvent(repeat("a", 18)), scalarEvent("b"),
142        scalarEvent(repeat("\"", 8)), scalarEvent("c"),
143        scalarEvent(repeat("d", 17)), scalarEvent("e"), endMapEvent())
144      assertOutput(input, "? \"aaaaaaaaaaaaaaa\\\n" &
145        "  aaa\"\n" &
146        ": b\n" &
147        "? \"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\n" &
148        "  \\\"\"\n" &
149        ": c\n" &
150        "ddddddddddddddddd:\n" &
151        "  e\n", PresentationOptions(maxLineLength: some(19)))