/ tests / test_objects.nim
test_objects.nim
 1  import unittest2
 2  
 3  import
 4    ../protobuf_serialization,
 5    ../protobuf_serialization/codec
 6  
 7  type
 8  #  TestEnum = enum
 9  #    A1 = 0
10  #    B1 = 1000
11  #    C1 = 1000000
12  
13    Basic {.proto3.} = object
14      a {.fieldNumber: 1, pint.}: uint64
15      b {.fieldNumber: 2.}: string
16      # TODO char is not a basic protobuf type c {.fieldNumber: 3.}: char
17  
18    Wrapped {.proto3.} = object
19      d {.fieldNumber: 1, sint.}: int32
20      e {.fieldNumber: 2, sint.}: int64
21      f {.fieldNumber: 3.}: Basic
22      g {.fieldNumber: 4.}: string
23      h {.fieldNumber: 5.}: bool
24      #i {.fieldNumber: 6.}: TestEnum
25  
26  discard Protobuf.supports(Basic)
27  discard Protobuf.supports(Wrapped)
28  
29  suite "Test Object Encoding/Decoding":
30    test "Can encode/decode objects":
31  
32      let
33        obj = Basic(a: 100, b: "Test string.") # TODO, c: 'C')
34        encoded = Protobuf.encode(obj)
35      check Protobuf.decode(encoded, Basic) == obj
36  
37    test "Can encode/decode a wrapper object":
38      let obj = Wrapped(
39        d: 300,
40        e: 200,
41        f: Basic(a: 100, b: "Test string."), # TODO, c: 'C'),
42        g: "Other test string.",
43        h: true
44      )
45      check Protobuf.decode(Protobuf.encode(obj), type(Wrapped)) == obj
46  
47    test "Can encode/decode partial object":
48      let
49        obj = Wrapped(
50          d: 300,
51          e: 200,
52          f: Basic(a: 100, b: "Test string."), # c: 'C'),
53          g: "Other test string.",
54          h: true
55        )
56        writer = memoryOutput()
57  
58      writer.writeField(1, sint32(obj.d))
59      writer.writeField(3, obj.f, pbytes)
60      writer.writeField(4, pstring(obj.g))
61  
62      let result = Protobuf.decode(writer.getOutput(), type(Wrapped))
63      check result.d == obj.d
64      check result.f == obj.f
65      check result.g == obj.g
66      check result.e == 0
67      check result.h == false
68  
69    test "Can encode/decode out of order object":
70      let
71        obj = Wrapped(
72          d: 300,
73          e: 200,
74          f: Basic(a: 100, b: "Test string."), # c: 'C'),
75          g: "Other test string.",
76          h: true
77        )
78        writer = memoryOutput()
79  
80      writer.writeField(3, obj.f, pbytes)
81      #writer.writeField(6, penum(obj.i))
82      writer.writeField(1, sint64(obj.d))
83      writer.writeField(2, sint64(obj.e))
84      writer.writeField(5, pbool(obj.h))
85      writer.writeField(4, pstring(obj.g))
86  
87      check Protobuf.decode(writer.getOutput(), type(Wrapped)) == obj
88  
89    test "Can read repeated fields":
90      let
91        writer = memoryOutput()
92        basic: Basic = Basic(b: "Initial string.")
93        repeated = "Repeated string."
94  
95      writer.writeField(2, pstring(basic.b))
96      writer.writeField(2, pstring(repeated))
97  
98      check Protobuf.decode(writer.getOutput(), type(Basic)) == Basic(b: repeated)