2016-02-27 12:09:50 +00:00
|
|
|
# NimYAML - YAML implementation in Nim
|
|
|
|
# (c) Copyright 2015 Felix Krause
|
|
|
|
#
|
|
|
|
# See the file "copying.txt", included in this
|
|
|
|
# distribution, for details about the copyright.
|
|
|
|
|
2020-11-04 15:40:37 +00:00
|
|
|
import ../yaml, ../yaml/data
|
2016-02-22 20:56:30 +00:00
|
|
|
|
2016-03-25 16:28:58 +00:00
|
|
|
proc escapeNewlines(s: string): string =
|
|
|
|
result = ""
|
|
|
|
for c in s:
|
|
|
|
case c
|
|
|
|
of '\l': result.add("\\n")
|
|
|
|
of '\t': result.add("\\t")
|
|
|
|
of '\\': result.add("\\\\")
|
|
|
|
else: result.add(c)
|
|
|
|
|
2020-11-04 15:40:37 +00:00
|
|
|
proc printDifference(expected, actual: Properties): bool =
|
|
|
|
result = false
|
|
|
|
if expected.tag != actual.tag:
|
|
|
|
echo "[scalar.tag] expected", $expected.tag, ", got", $actual.tag
|
|
|
|
result = true
|
|
|
|
if expected.anchor != actual.anchor:
|
|
|
|
echo "[scalar.anchor] expected", $expected.anchor, ", got", $actual.anchor
|
|
|
|
result = true
|
|
|
|
|
|
|
|
proc printDifference*(expected, actual: Event) =
|
2016-04-02 15:48:22 +00:00
|
|
|
if expected.kind != actual.kind:
|
|
|
|
echo "expected " & $expected.kind & ", got " & $actual.kind
|
|
|
|
else:
|
|
|
|
case expected.kind
|
|
|
|
of yamlScalar:
|
2020-11-04 15:40:37 +00:00
|
|
|
if not printDifference(expected.scalarProperties, actual.scalarProperties):
|
|
|
|
if expected.scalarContent != actual.scalarContent:
|
|
|
|
let msg = "[scalarEvent] content mismatch!\nexpected: " &
|
|
|
|
escapeNewlines(expected.scalarContent) &
|
|
|
|
"\ngot : " & escapeNewlines(actual.scalarContent)
|
|
|
|
if expected.scalarContent.len != actual.scalarContent.len:
|
|
|
|
echo msg, "\n(length does not match)"
|
|
|
|
else:
|
|
|
|
for i in 0..expected.scalarContent.high:
|
|
|
|
if expected.scalarContent[i] != actual.scalarContent[i]:
|
|
|
|
echo msg, "\n(first different char at pos ", i, ": expected ",
|
|
|
|
cast[int](expected.scalarContent[i]), ", got ",
|
|
|
|
cast[int](actual.scalarContent[i]), ")"
|
|
|
|
break
|
|
|
|
else: echo "[scalar] Unknown difference"
|
2016-04-02 15:48:22 +00:00
|
|
|
of yamlStartMap:
|
2020-11-04 15:40:37 +00:00
|
|
|
if not printDifference(expected.mapProperties, actual.mapProperties):
|
|
|
|
echo "[map] Unknown difference"
|
2016-04-02 15:48:22 +00:00
|
|
|
of yamlStartSeq:
|
2020-11-04 15:40:37 +00:00
|
|
|
if not printDifference(expected.seqProperties, actual.seqProperties):
|
|
|
|
echo "[seq] Unknown difference"
|
2016-04-02 15:48:22 +00:00
|
|
|
of yamlAlias:
|
|
|
|
if expected.aliasTarget != actual.aliasTarget:
|
|
|
|
echo "[alias] expected ", expected.aliasTarget, ", got ",
|
|
|
|
actual.aliasTarget
|
|
|
|
else: echo "[alias] Unknown difference"
|
|
|
|
else: echo "Unknown difference in event kind " & $expected.kind
|
2016-02-22 20:56:30 +00:00
|
|
|
|
|
|
|
template ensure*(input: var YamlStream,
|
2020-11-04 15:40:37 +00:00
|
|
|
expected: varargs[Event]) {.dirty.} =
|
2016-04-02 15:48:22 +00:00
|
|
|
var i = 0
|
|
|
|
for token in input:
|
|
|
|
if i >= expected.len:
|
|
|
|
echo "received more tokens than expected (next token = ", token.kind, ")"
|
|
|
|
fail()
|
|
|
|
break
|
|
|
|
if token != expected[i]:
|
|
|
|
echo "at token #" & $i & ":"
|
|
|
|
printDifference(expected[i], token)
|
|
|
|
fail()
|
|
|
|
break
|
|
|
|
i.inc()
|