nim-protobuf-serialization/tests/test_serialization.nim
2020-04-04 07:38:14 -06:00

144 lines
No EOL
3.6 KiB
Nim

import unittest
import protobuf_serialization
type
MyEnum = enum
ME1, ME2, ME3
type
Test1 = object
a: uint
b: string
Test3 = object
g {.sfixed32.}: int
h: int
i: Test1
j: string
suite "Test Varint Encoding":
test "Can encode/decode enum field":
var proto = newProtoBuffer()
var bytesProcessed: int
proto.encodeField(ME3)
proto.encodeField(ME2)
var output = proto.output
assert output == @[8.byte, 4, 16, 2]
var offset = 0
let decodedME3 = decodeField(output, MyEnum, offset, bytesProcessed)
assert decodedME3.value == ME3
assert decodedME3.index == 1
let decodedME2 = decodeField(output, MyEnum, offset, bytesProcessed)
assert decodedME2.value == ME2
assert decodedME2.index == 2
test "Can encode/decode negative number field":
var proto = newProtoBuffer()
let num = -153452
var bytesProcessed: int
proto.encodeField(num)
var output = proto.output
assert output == @[8.byte, 215, 221, 18]
var offset = 0
let decoded = decodeField(output, int, offset, bytesProcessed)
assert decoded.value == num
assert decoded.index == 1
test "Can encode/decode unsigned number field":
var proto = newProtoBuffer()
let num = 123151.uint
var bytesProcessed: int
proto.encodeField(num)
var output = proto.output
assert output == @[8.byte, 143, 194, 7]
var offset = 0
let decoded = decodeField(output, uint, offset, bytesProcessed)
assert decoded.value == num
assert decoded.index == 1
test "Can encode/decode string field":
var proto = newProtoBuffer()
let str = "hey this is a string"
var bytesProcessed: int
proto.encodeField(str)
var output = proto.output
assert output == @[10.byte, 20, 104, 101, 121, 32, 116, 104, 105, 115, 32, 105, 115, 32, 97, 32, 115, 116, 114, 105, 110, 103]
var offset = 0
let decoded = decodeField(output, string, offset, bytesProcessed)
assert decoded.value == str
assert decoded.index == 1
test "Can encode/decode object field":
var proto = newProtoBuffer()
let obj = Test3(g: 300, h: 200, i: Test1(a: 100, b: "this is a test"), j: "testing")
proto.encodeField(obj)
var offset, bytesProcessed: int
var output = proto.output
let decoded = decodeField(output, Test3, offset, bytesProcessed)
assert decoded.value == obj
assert decoded.index == 1
test "Can encode/decode object":
var proto = newProtoBuffer()
let obj = Test3(g: 300, h: 200, i: Test1(a: 100, b: "this is a test"), j: "testing")
proto.encode(obj)
var output = proto.output
let decoded = output.decode(Test3)
assert decoded == obj
test "Can encode/decode out of order object":
var proto = newProtoBuffer()
let obj = Test3(g: 400, h: 100, i: Test1(a: 100, b: "this is a test"), j: "testing")
proto.encodeField(2, 100)
proto.encodeField(4, "testing")
proto.encodeField(1, 400)
proto.encodeField(3, Test1(a: 100, b: "this is a test"))
var output = proto.output
let decoded = output.decode(Test3)
assert decoded == obj
test "Empty object field does not get encoded":
var proto = newProtoBuffer()
let obj = Test1()
proto.encodeField(1, obj)
var output = proto.output
assert output.len == 0
let decoded = output.decode(Test1)
assert decoded == obj
test "Empty object does not get encoded":
var proto = newProtoBuffer()
let obj = Test1()
proto.encode(obj)
var output = proto.output
assert output.len == 0
let decoded = output.decode(Test1)
assert decoded == obj