mirror of
https://github.com/logos-storage/nim-serde.git
synced 2026-01-02 21:53:07 +00:00
211 lines
4.8 KiB
Nim
211 lines
4.8 KiB
Nim
import std/unittest
|
|
import pkg/serde
|
|
import pkg/questionable
|
|
import pkg/questionable/results
|
|
import pkg/stew/byteutils
|
|
import pkg/stint
|
|
|
|
suite "json - deserialize objects":
|
|
test "can deserialize json objects":
|
|
type MyObj = object
|
|
mystring: string
|
|
myint: int
|
|
myoption: ?bool
|
|
|
|
let expected = MyObj(mystring: "abc", myint: 123, myoption: some true)
|
|
|
|
let json =
|
|
!JsonNode.parse(
|
|
"""{
|
|
"mystring": "abc",
|
|
"myint": 123,
|
|
"myoption": true
|
|
}"""
|
|
)
|
|
|
|
check !MyObj.fromJson(json) == expected
|
|
|
|
test "ignores serialize pragma when deserializing":
|
|
type MyObj = object
|
|
mystring {.serialize.}: string
|
|
mybool: bool
|
|
|
|
let expected = MyObj(mystring: "abc", mybool: true)
|
|
|
|
let json =
|
|
!JsonNode.parse(
|
|
"""{
|
|
"mystring": "abc",
|
|
"mybool": true
|
|
}"""
|
|
)
|
|
|
|
check !MyObj.fromJson(json) == expected
|
|
|
|
test "deserializes objects with extra fields":
|
|
type MyObj = object
|
|
mystring: string
|
|
mybool: bool
|
|
|
|
let expected = MyObj(mystring: "abc", mybool: true)
|
|
|
|
let json =
|
|
!JsonNode.parse(
|
|
"""{
|
|
"mystring": "abc",
|
|
"mybool": true,
|
|
"extra": "extra"
|
|
}"""
|
|
)
|
|
check !MyObj.fromJson(json) == expected
|
|
|
|
test "deserializes objects with less fields":
|
|
type MyObj = object
|
|
mystring: string
|
|
mybool: bool
|
|
|
|
let expected = MyObj(mystring: "abc", mybool: false)
|
|
|
|
let json =
|
|
!JsonNode.parse(
|
|
"""{
|
|
"mystring": "abc"
|
|
}"""
|
|
)
|
|
check !MyObj.fromJson(json) == expected
|
|
|
|
test "deserializes ref objects":
|
|
type MyRef = ref object
|
|
mystring: string
|
|
myint: int
|
|
|
|
let expected = MyRef(mystring: "abc", myint: 1)
|
|
|
|
let json =
|
|
!JsonNode.parse(
|
|
"""{
|
|
"mystring": "abc",
|
|
"myint": 1
|
|
}"""
|
|
)
|
|
|
|
let deserialized = !MyRef.fromJson(json)
|
|
check deserialized.mystring == expected.mystring
|
|
check deserialized.myint == expected.myint
|
|
|
|
test "deserializes openArray[byte]":
|
|
type MyRef = ref object
|
|
mystring: string
|
|
myint: int
|
|
|
|
let expected = MyRef(mystring: "abc", myint: 1)
|
|
let byteArray =
|
|
"""{
|
|
"mystring": "abc",
|
|
"myint": 1
|
|
}""".toBytes
|
|
|
|
let deserialized = !MyRef.fromJson(byteArray)
|
|
check deserialized.mystring == expected.mystring
|
|
check deserialized.myint == expected.myint
|
|
|
|
suite "json - deserialize objects from string":
|
|
test "deserializes objects from string":
|
|
type MyObj = object
|
|
mystring: string
|
|
myint: int
|
|
|
|
let expected = MyObj(mystring: "abc", myint: 1)
|
|
let myObjJson =
|
|
"""{
|
|
"mystring": "abc",
|
|
"myint": 1
|
|
}"""
|
|
|
|
check !MyObj.fromJson(myObjJson) == expected
|
|
|
|
test "deserializes ref objects from string":
|
|
type MyRef = ref object
|
|
mystring: string
|
|
myint: int
|
|
|
|
let expected = MyRef(mystring: "abc", myint: 1)
|
|
let myRefJson =
|
|
"""{
|
|
"mystring": "abc",
|
|
"myint": 1
|
|
}"""
|
|
|
|
let deserialized = !MyRef.fromJson(myRefJson)
|
|
check deserialized.mystring == expected.mystring
|
|
check deserialized.myint == expected.myint
|
|
|
|
test "deserializes seq of objects from string":
|
|
type MyObj = object
|
|
mystring: string
|
|
myint: int
|
|
|
|
let expected = @[MyObj(mystring: "abc", myint: 1)]
|
|
let myObjsJson =
|
|
"""[{
|
|
"mystring": "abc",
|
|
"myint": 1
|
|
}]"""
|
|
|
|
check !seq[MyObj].fromJson(myObjsJson) == expected
|
|
|
|
test "deserializes Option of object from string":
|
|
type MyObj = object
|
|
mystring: string
|
|
myint: int
|
|
|
|
let expected = some MyObj(mystring: "abc", myint: 1)
|
|
let myObjJson =
|
|
"""{
|
|
"mystring": "abc",
|
|
"myint": 1
|
|
}"""
|
|
|
|
check !(Option[MyObj].fromJson(myObjJson)) == expected
|
|
|
|
test "deserializes object with UInt256 from string":
|
|
type MyObj = object
|
|
mystring: string
|
|
myu256: UInt256
|
|
|
|
let expected = MyObj(mystring: "abc", myu256: 1.u256)
|
|
let myObjJson =
|
|
"""{
|
|
"mystring": "abc",
|
|
"myu256": 1
|
|
}"""
|
|
|
|
check !MyObj.fromJson(myObjJson) == expected
|
|
|
|
test "deserializes object with stringified UInt256 from string":
|
|
type MyObj = object
|
|
mystring: string
|
|
myu256: UInt256
|
|
|
|
let expected = MyObj(mystring: "abc", myu256: 1.u256)
|
|
let myObjJson =
|
|
"""{
|
|
"mystring": "abc",
|
|
"myu256": "1"
|
|
}"""
|
|
|
|
check !MyObj.fromJson(myObjJson) == expected
|
|
|
|
test "deserializes object with ?UInt256 from string":
|
|
type MyObj = object
|
|
mystring: string
|
|
myu256: ?UInt256
|
|
|
|
let expected = MyObj(mystring: "abc", myu256: UInt256.none)
|
|
let myObjJson =
|
|
"""{
|
|
"mystring": "abc",
|
|
}"""
|
|
|
|
check !MyObj.fromJson(myObjJson) == expected
|