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