nim-serde/tests/cbor/testPrimitives.nim

103 lines
2.7 KiB
Nim
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# This file is a modified version of Emery Hemingways CBOR library for Nim,
# originally available at https://github.com/ehmry/cbor-nim and released under The Unlicense.
import std/[base64, os, random, times, json, unittest]
import pkg/serde/cbor
import pkg/questionable
import pkg/questionable/results
proc findVectorsFile(): string =
var parent = getCurrentDir()
while parent != "/":
result = parent / "tests" / "cbor" / "test_vector.json"
if fileExists result:
return
parent = parent.parentDir
raiseAssert "Could not find test vectors"
let js = findVectorsFile().readFile.parseJson()
suite "decode":
for v in js.items:
if v.hasKey "decoded":
let
control = $v["decoded"]
name = v["name"].getStr
test name:
let controlCbor = base64.decode v["cbor"].getStr
let js = parseCbor(controlCbor).toJson()
if js.isNil:
fail()
else:
check(control == $js)
suite "diagnostic":
for v in js.items:
if v.hasKey "diagnostic":
let
control = v["diagnostic"].getStr
name = v["name"].getStr
test name:
let controlCbor = base64.decode v["cbor"].getStr
check($parseCbor(controlCbor) == control)
suite "roundtrip":
for v in js.items:
if v["roundtrip"].getBool:
let
controlB64 = v["cbor"].getStr
controlCbor = base64.decode controlB64
name = v["name"].getStr
test name:
without testCbor =? encode(parseCbor(controlCbor)), error:
fail()
if controlCbor != testCbor:
let testB64 = base64.encode(testCbor)
check(controlB64 == testB64)
suite "hooks":
test "DateTime":
let dt = now()
without bin =? encode(dt), error:
fail()
check(parseCbor(bin).text == $dt)
test "Time":
let t = now().toTime
var bin = encode(t).tryValue
check(parseCbor(bin).getInt == t.toUnix)
test "tag":
var c = toCbor("foo").tryValue
c.tag = some(99'u64)
check c.tag == some(99'u64)
test "sorting":
var map = initCborMap()
var keys =
@[
toCbor(10).tryValue,
toCbor(100).tryValue,
toCbor(-1).tryValue,
toCbor("z").tryValue,
toCbor("aa").tryValue,
toCbor([toCbor(100).tryValue]).tryValue,
toCbor([toCbor(-1).tryValue]).tryValue,
toCbor(false).tryValue,
]
shuffle(keys)
for k in keys:
map[k] = toCbor(0).tryValue
check not map.isSorted.tryValue
check sort(map).isSuccess
check map.isSorted.tryValue
test "invalid wire type":
let node = CborNode(kind: cborText, text: "not an int")
let result = int.fromCbor(node)
check result.isFailure
check $result.error.msg ==
"deserialization to int failed: expected {cborUnsigned, cborNegative} but got cborText"