nim-serde/tests/cbor/testPrimitives.nim

103 lines
2.7 KiB
Nim
Raw Normal View History

2025-05-22 16:39:37 +05:30
# 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:
2025-05-22 15:39:43 +05:30
fail()
if controlCbor != testCbor:
let testB64 = base64.encode(testCbor)
check(controlB64 == testB64)
suite "hooks":
test "DateTime":
let dt = now()
2025-05-22 15:39:43 +05:30
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":
2025-05-22 15:39:43 +05:30
var c = toCbor("foo").tryValue
c.tag = some(99'u64)
check c.tag == some(99'u64)
test "sorting":
var map = initCborMap()
var keys =
@[
2025-05-22 15:39:43 +05:30
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)
2025-05-22 15:39:43 +05:30
for k in keys:
map[k] = toCbor(0).tryValue
2025-05-22 15:39:43 +05:30
check not map.isSorted.tryValue
check sort(map).isSuccess
check map.isSorted.tryValue
2025-05-21 03:41:35 +05:30
test "invalid wire type":
let node = CborNode(kind: cborText, text: "not an int")
let result = int.fromCbor(node)
2025-05-21 03:41:35 +05:30
check result.isFailure
check $result.error.msg ==
"deserialization to int failed: expected {cborUnsigned, cborNegative} but got cborText"