1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <errno.h>
2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <fcntl.h>
3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <unistd.h>
4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <memory>
6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <string>
7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <thread>
8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <utility>
9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <gtest/gtest.h>
11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/rpc/argument_encoder.h>
12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/rpc/array_wrapper.h>
13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/rpc/default_initialization_allocator.h>
14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/rpc/payload.h>
15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/rpc/serializable.h>
16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/rpc/serialization.h>
17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/rpc/string_wrapper.h>
18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/utility.h>
19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing namespace android::pdx;
21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing namespace android::pdx::rpc;
22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Tests the serialization/deserialization of all supported types, verifying all
24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// reasonable boundary conditions for types with multiple encodings.
25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//
26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// NOTE: Sometimes this file uses the construct "var = decltype(var)({...})"
27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// instead of the equivalent "var = {...}" to construct vectors. This is to
28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// prevent clang-format from producing annoyingly vertical code from long
29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// initializers.
30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// TODO(eieio): Automatically generate some of these tests?
32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace {
34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Test data for serialization/deserialization of floats.
36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst float kZeroFloat = 0.0f;
37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst float kOneFloat = 1.0f;
38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst auto kZeroFloatBytes = reinterpret_cast<const std::uint8_t*>(&kZeroFloat);
39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst auto kOneFloatBytes = reinterpret_cast<const std::uint8_t*>(&kOneFloat);
40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst double kZeroDouble = 0.0;
41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst double kOneDouble = 1.0;
42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst auto kZeroDoubleBytes =
43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    reinterpret_cast<const std::uint8_t*>(&kZeroDouble);
44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoconst auto kOneDoubleBytes = reinterpret_cast<const std::uint8_t*>(&kOneDouble);
45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostruct TestType {
47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  enum class Foo { kFoo, kBar, kBaz };
48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int a;
50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  float b;
51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::string c;
52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Foo d;
53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  TestType() {}
55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  TestType(int a, float b, const std::string& c, Foo d)
56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      : a(a), b(b), c(c), d(d) {}
57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Make gtest expressions simpler by defining equality operator. This is not
59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // needed for serialization.
60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool operator==(const TestType& other) const {
61e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return a == other.a && b == other.b && c == other.c && d == other.d;
62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private:
65e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  PDX_SERIALIZABLE_MEMBERS(TestType, a, b, c, d);
66e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
67e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
68e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <typename FileHandleType>
69e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostruct TestTemplateType {
70e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  FileHandleType fd;
71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  TestTemplateType() {}
73e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  TestTemplateType(FileHandleType fd) : fd(std::move(fd)) {}
74e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
75e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool operator==(const TestTemplateType& other) const {
76e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return fd.Get() == other.fd.Get();
77e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
78e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
79e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private:
80e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  PDX_SERIALIZABLE_MEMBERS(TestTemplateType<FileHandleType>, fd);
81e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
82e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
83e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Utilities to generate test maps and payloads.
84e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <typename MapType>
85e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoMapType MakeMap(std::size_t size) {
86e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  MapType result;
87e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (std::size_t i = 0; i < size; i++) {
88e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    result.emplace(i, i);
89e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return result;
91e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
92e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
93e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <typename MapType>
94e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid InsertKeyValue(MessageWriter* writer, std::size_t size) {
95e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  MapType map;
96e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (std::size_t i = 0; i < size; i++) {
97e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    map.emplace(i, i);
98e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
99e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (const auto& element : map) {
100e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    Serialize(element.first, writer);
101e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    Serialize(element.second, writer);
102e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
103e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
105e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // anonymous namespace
106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializableTypes, Constructor) {
108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  TestType tt(1, 2.0, "three", TestType::Foo::kBar);
109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(1, tt.a);
110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(2.0, tt.b);
111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ("three", tt.c);
112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(TestType::Foo::kBar, tt.d);
113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, bool) {
116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
118e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool value;
119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // True.
121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = true;
122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
123e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_TRUE};
124e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // False.
128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = false;
129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FALSE};
131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, uint8_t) {
136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint8_t value;
139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0;
142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 7) - 1;
149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT8.
155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 7);
156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT8, (1 << 7)};
158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT8.
162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0xff;
163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT8, 0xff};
165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, uint16_t) {
170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint16_t value;
173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0;
176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
181e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 7) - 1;
183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
184e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
185e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
186e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT8.
189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 7);
190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT8, (1 << 7)};
192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
193e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
194e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
195e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT8.
196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0xff;
197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
198e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT8, 0xff};
199e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT16.
203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 8);
204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT16, 0, 1};
206e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
207e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
208e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
209e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT16.
210e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0xffff;
211e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
212e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT16, 0xff, 0xff};
213e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
214e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
215e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
216e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
217e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, uint32_t) {
218e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
219e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
220e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint32_t value;
221e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
222e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
223e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0;
224e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
225e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
226e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
227e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
228e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
229e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
230e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 7) - 1;
231e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
232e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
233e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
234e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
235e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
236e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT8.
237e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 7);
238e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
239e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT8, (1 << 7)};
240e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
241e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
242e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
243e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT8.
244e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0xff;
245e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
246e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT8, 0xff};
247e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
248e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
249e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
250e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT16.
251e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 8);
252e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
253e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT16, 0, 1};
254e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
255e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
256e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
257e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT16.
258e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0xffff;
259e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
260e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT16, 0xff, 0xff};
261e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
262e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
263e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
264e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT32.
265e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 16);
266e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
267e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT32, 0, 0, 1, 0};
268e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
269e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
270e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
271e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT32.
272e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0xffffffff;
273e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
274e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT32, 0xff, 0xff, 0xff, 0xff};
275e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
276e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
277e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
278e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
279e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, uint64_t) {
280e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
281e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
282e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint64_t value;
283e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
284e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
285e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0;
286e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
287e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
288e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
289e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
290e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
291e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
292e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 7) - 1;
293e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
294e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
295e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
296e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
297e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
298e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT8.
299e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 7);
300e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
301e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT8, (1 << 7)};
302e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
303e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
304e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
305e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT8.
306e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0xff;
307e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
308e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT8, 0xff};
309e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
310e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
311e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
312e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT16.
313e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 8);
314e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
315e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT16, 0, 1};
316e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
317e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
318e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
319e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT16.
320e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0xffff;
321e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
322e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT16, 0xff, 0xff};
323e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
324e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
325e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
326e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT32.
327e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1 << 16);
328e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
329e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT32, 0, 0, 1, 0};
330e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
331e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
332e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
333e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT32.
334e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0xffffffff;
335e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
336e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT32, 0xff, 0xff, 0xff, 0xff};
337e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
338e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
339e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
340e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT64.
341e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = (1ULL << 32);
342e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
343e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_UINT64, 0, 0, 0, 0, 1, 0, 0, 0};
344e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
345e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
346e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
347e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT64.
348e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0xffffffffffffffffULL;
349e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
350e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {
351e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      ENCODING_TYPE_UINT64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
352e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
353e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
354e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
355e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
356e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, int8_t) {
357e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
358e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
359e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int8_t value;
360e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
361e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min NEGATIVE FIXINT.
362e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -32;
363e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
364e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
365e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
366e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
367e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
368e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max NEGATIVE FIXINT.
369e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -1;
370e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
371e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
372e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
373e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
374e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
375e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
376e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0;
377e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
378e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
379e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
380e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
381e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
382e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
383e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 127;
384e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
385e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
386e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
387e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
388e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
389e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT8.
390e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -128;
391e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
392e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT8, 0x80};
393e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
394e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
395e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
396e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT8.
397e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -33;
398e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
399e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT8, 0xdf};
400e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
401e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
402e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
403e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
404e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, int16_t) {
405e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
406e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
407e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int16_t value;
408e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
409e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min NEGATIVE FIXINT.
410e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -32;
411e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
412e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
413e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
414e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
415e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
416e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max NEGATIVE FIXINT.
417e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -1;
418e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
419e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
420e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
421e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
422e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
423e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
424e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0;
425e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
426e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
427e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
428e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
429e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
430e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
431e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 127;
432e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
433e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
434e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
435e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
436e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
437e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT8.
438e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -128;
439e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
440e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT8, 0x80};
441e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
442e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
443e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
444e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT8.
445e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -33;
446e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
447e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT8, 0xdf};
448e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
449e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
450e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
451e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT16.
452e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -32768;
453e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
454e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT16, 0x00, 0x80};
455e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
456e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
457e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
458e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT16.
459e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 32767;
460e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
461e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT16, 0xff, 0x7f};
462e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
463e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
464e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
465e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
466e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, int32_t) {
467e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
468e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
469e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int32_t value;
470e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
471e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min NEGATIVE FIXINT.
472e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -32;
473e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
474e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
475e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
476e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
477e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
478e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max NEGATIVE FIXINT.
479e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -1;
480e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
481e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
482e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
483e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
484e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
485e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
486e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0;
487e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
488e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
489e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
490e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
491e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
492e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
493e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 127;
494e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
495e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
496e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
497e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
498e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
499e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT8.
500e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -128;
501e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
502e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT8, 0x80};
503e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
504e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
505e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
506e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT8.
507e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -33;
508e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
509e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT8, 0xdf};
510e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
511e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
512e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
513e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT16.
514e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -32768;
515e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
516e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT16, 0x00, 0x80};
517e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
518e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
519e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
520e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT16.
521e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 32767;
522e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
523e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT16, 0xff, 0x7f};
524e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
525e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
526e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
527e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT32.
528e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -2147483648;
529e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
530e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT32, 0x00, 0x00, 0x00, 0x80};
531e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
532e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
533e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
534e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT32.
535e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 2147483647;
536e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
537e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT32, 0xff, 0xff, 0xff, 0x7f};
538e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
539e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
540e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
541e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
542e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, int64_t) {
543e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
544e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
545e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int64_t value;
546e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
547e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min NEGATIVE FIXINT.
548e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -32;
549e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
550e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
551e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
552e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
553e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
554e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max NEGATIVE FIXINT.
555e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -1;
556e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
557e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
558e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
559e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
560e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
561e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
562e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0;
563e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
564e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
565e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
566e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
567e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
568e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
569e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 127;
570e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
571e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
572e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
573e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
574e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
575e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT8.
576e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -128;
577e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
578e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT8, 0x80};
579e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
580e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
581e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
582e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT8.
583e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -33;
584e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
585e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT8, 0xdf};
586e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
587e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
588e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
589e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT16.
590e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -32768;
591e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
592e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT16, 0x00, 0x80};
593e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
594e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
595e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
596e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT16.
597e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 32767;
598e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
599e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT16, 0xff, 0x7f};
600e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
601e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
602e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
603e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT32.
604e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -2147483648;
605e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
606e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT32, 0x00, 0x00, 0x00, 0x80};
607e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
608e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
609e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
610e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT32.
611e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 2147483647;
612e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
613e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_INT32, 0xff, 0xff, 0xff, 0x7f};
614e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
615e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
616e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
617e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT64.
618e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = -9223372036854775808ULL;
619e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
620e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {
621e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      ENCODING_TYPE_INT64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};
622e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
623e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
624e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
625e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT64.
626e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 9223372036854775807ULL;
627e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
628e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {
629e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      ENCODING_TYPE_INT64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
630e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
631e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
632e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
633e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
634e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, float) {
635e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
636e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
637e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  float value;
638e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
639e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0.0f;
640e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
641e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FLOAT32, kZeroFloatBytes[0], kZeroFloatBytes[1],
642e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              kZeroFloatBytes[2], kZeroFloatBytes[3]};
643e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
644e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
645e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
646e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 1.0f;
647e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
648e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FLOAT32, kOneFloatBytes[0], kOneFloatBytes[1],
649e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              kOneFloatBytes[2], kOneFloatBytes[3]};
650e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
651e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
652e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
653e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
654e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, double) {
655e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
656e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
657e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  double value;
658e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
659e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 0.0f;
660e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
661e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FLOAT64, kZeroDoubleBytes[0], kZeroDoubleBytes[1],
662e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              kZeroDoubleBytes[2],   kZeroDoubleBytes[3], kZeroDoubleBytes[4],
663e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              kZeroDoubleBytes[5],   kZeroDoubleBytes[6], kZeroDoubleBytes[7]};
664e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
665e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
666e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
667e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = 1.0f;
668e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
669e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FLOAT64, kOneDoubleBytes[0], kOneDoubleBytes[1],
670e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              kOneDoubleBytes[2],    kOneDoubleBytes[3], kOneDoubleBytes[4],
671e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              kOneDoubleBytes[5],    kOneDoubleBytes[6], kOneDoubleBytes[7]};
672e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
673e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
674e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
675e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
676e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, Enum) {
677e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
678e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
679e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
680e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  enum Foo { kFoo, kBar, kBaz };
681e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Foo value = kBar;
682e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
683e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1};
684e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
685e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
686e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
687e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
688e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, EnumClass) {
689e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
690e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
691e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
692e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  enum class Foo { kFoo, kBar, kBaz };
693e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Foo value = Foo::kBaz;
694e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
695e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2};
696e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
697e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
698e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
699e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
700e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, LocalHandle) {
701e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
702e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
703e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  LocalHandle fd1;
704e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  LocalHandle fd2;
705e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
706e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  fd1 = LocalHandle(100);
707e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(fd1, &result);
708e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXEXT2, ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0, 0};
709e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
710e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(1u, result.FdCount());
711e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(100, result.FdArray()[0]);
712e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
713e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
714e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  fd2 = LocalHandle(200);
715e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(std::forward_as_tuple(fd1, fd2), &result);
716e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)(
717e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {ENCODING_TYPE_FIXARRAY_MIN + 2, ENCODING_TYPE_FIXEXT2,
718e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0, 0, ENCODING_TYPE_FIXEXT2,
719e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 1, 0});
720e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
721e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(2u, result.FdCount());
722e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(100, result.FdArray()[0]);
723e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(200, result.FdArray()[1]);
724e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
725e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
726e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  fd1.Release();  // Don't try to close fd 100.
727e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  fd2.Release();  // Don't try to close fd 200.
728e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
729e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  fd1 = LocalHandle(-2);
730e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(fd1, &result);
731e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXEXT2, ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0xfe,
732e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              0xff};
733e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
734e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0u, result.FdCount());
735e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
736e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
737e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
738e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, string) {
739e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
740e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
741e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::string value;
742e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
743e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXSTR.
744e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = "";
745e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
746e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXSTR_MIN};
747e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
748e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
749e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
750e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXSTR.
751e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = std::string((1 << 5) - 1, 'x');
752e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
753e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXSTR_MAX};
754e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 5) - 1, 'x');
755e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
756e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
757e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
758e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min STR8.
759e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = std::string((1 << 5), 'x');
760e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
761e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_STR8, (1 << 5)};
762e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 5), 'x');
763e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
764e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
765e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
766e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max STR8.
767e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = std::string((1 << 8) - 1, 'x');
768e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
769e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_STR8, (1 << 8) - 1};
770e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 8) - 1, 'x');
771e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
772e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
773e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
774e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min STR16.
775e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = std::string((1 << 8), 'x');
776e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
777e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_STR16, 0x00, 0x01};
778e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 8), 'x');
779e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
780e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
781e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
782e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max STR16.
783e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = std::string((1 << 16) - 1, 'x');
784e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
785e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_STR16, 0xff, 0xff};
786e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 16) - 1, 'x');
787e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
788e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
789e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
790e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min STR32.
791e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = std::string((1 << 16), 'x');
792e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
793e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_STR32, 0x00, 0x00, 0x01, 0x00};
794e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 16), 'x');
795e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
796e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
797e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
798e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
799e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, StringWrapper) {
800e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
801e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
802e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::string value;
803e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
804e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXSTR.
805e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = "";
806e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(WrapString(value), &result);
807e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXSTR_MIN};
808e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
809e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
810e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
811e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXSTR.
812e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = std::string((1 << 5) - 1, 'x');
813e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(WrapString(value), &result);
814e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXSTR_MAX};
815e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 5) - 1, 'x');
816e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
817e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
818e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
819e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min STR8.
820e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = std::string((1 << 5), 'x');
821e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(WrapString(value), &result);
822e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_STR8, (1 << 5)};
823e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 5), 'x');
824e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
825e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
826e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
827e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max STR8.
828e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = std::string((1 << 8) - 1, 'x');
829e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(WrapString(value), &result);
830e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_STR8, (1 << 8) - 1};
831e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 8) - 1, 'x');
832e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
833e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
834e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
835e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min STR16.
836e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = std::string((1 << 8), 'x');
837e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(WrapString(value), &result);
838e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_STR16, 0x00, 0x01};
839e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 8), 'x');
840e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
841e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
842e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
843e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max STR16.
844e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = std::string((1 << 16) - 1, 'x');
845e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(WrapString(value), &result);
846e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_STR16, 0xff, 0xff};
847e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 16) - 1, 'x');
848e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
849e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
850e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
851e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min STR32.
852e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = std::string((1 << 16), 'x');
853e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(WrapString(value), &result);
854e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_STR32, 0x00, 0x00, 0x01, 0x00};
855e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 16), 'x');
856e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
857e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
858e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
859e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
860e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, vector) {
861e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
862e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
863e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<uint8_t> value;
864e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
865e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXARRAY.
866e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = {};
867e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
868e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXARRAY_MIN};
869e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
870e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
871e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
872e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXARRAY.
873e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = decltype(value)((1 << 4) - 1, 'x');
874e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
875e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXARRAY_MAX};
876e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 4) - 1, 'x');
877e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
878e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
879e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
880e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY16.
881e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = decltype(value)((1 << 4), 'x');
882e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
883e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_ARRAY16, 0x10, 0x00};
884e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 4), 'x');
885e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
886e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
887e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
888e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max ARRAY16.
889e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = decltype(value)((1 << 16) - 1, 'x');
890e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
891e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
892e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 16) - 1, 'x');
893e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
894e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
895e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
896e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY32.
897e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = decltype(value)((1 << 16), 'x');
898e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
899e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
900e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 16), 'x');
901e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
902e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
903e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
904e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
905e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, map) {
906e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
907e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
908e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::map<std::uint32_t, std::uint32_t> value;
909e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
910e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXMAP.
911e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = {};
912e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
913e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXMAP_MIN};
914e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
915e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
916e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
917e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXMAP.
918e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = MakeMap<decltype(value)>((1 << 4) - 1);
919e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
920e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXMAP_MAX};
921e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(value)>(&expected, (1 << 4) - 1);
922e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
923e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
924e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
925e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min MAP16.
926e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = MakeMap<decltype(value)>((1 << 4));
927e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
928e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_MAP16, 0x10, 0x00};
929e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(value)>(&expected, (1 << 4));
930e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
931e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
932e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
933e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max MAP16.
934e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = MakeMap<decltype(value)>((1 << 16) - 1);
935e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
936e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_MAP16, 0xff, 0xff};
937e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(value)>(&expected, (1 << 16) - 1);
938e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
939e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
940e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
941e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min MAP32.
942e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = MakeMap<decltype(value)>((1 << 16));
943e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
944e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x01, 0x00};
945e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(value)>(&expected, (1 << 16));
946e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
947e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
948e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
949e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
950e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, unordered_map) {
951e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
952e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
953e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::unordered_map<std::uint32_t, std::uint32_t> value;
954e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
955e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXMAP.
956e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = {};
957e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
958e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXMAP_MIN};
959e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
960e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
961e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
962e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXMAP.
963e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = MakeMap<decltype(value)>((1 << 4) - 1);
964e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
965e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXMAP_MAX};
966e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(value)>(&expected, (1 << 4) - 1);
967e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
968e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
969e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
970e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min MAP16.
971e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = MakeMap<decltype(value)>((1 << 4));
972e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
973e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_MAP16, 0x10, 0x00};
974e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(value)>(&expected, (1 << 4));
975e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
976e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
977e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
978e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max MAP16.
979e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = MakeMap<decltype(value)>((1 << 16) - 1);
980e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
981e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_MAP16, 0xff, 0xff};
982e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(value)>(&expected, (1 << 16) - 1);
983e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
984e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
985e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
986e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min MAP32.
987e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = MakeMap<decltype(value)>((1 << 16));
988e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(value, &result);
989e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x01, 0x00};
990e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(value)>(&expected, (1 << 16));
991e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
992e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
993e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
994e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
995e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, array) {
996e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
997e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
998e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
999e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXARRAY.
1000e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::array<std::uint8_t, 0> a0;
1001e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(a0, &result);
1002e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXARRAY_MIN};
1003e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1004e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1005e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1006e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXARRAY.
1007e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::array<std::uint8_t, (1 << 4) - 1> a1;
1008e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (auto& element : a1)
1009e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    element = 'x';
1010e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(a1, &result);
1011e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXARRAY_MAX};
1012e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 4) - 1, 'x');
1013e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1014e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1015e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1016e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY16.
1017e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::array<std::uint8_t, (1 << 4)> a2;
1018e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (auto& element : a2)
1019e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    element = 'x';
1020e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(a2, &result);
1021e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_ARRAY16, 0x10, 0x00};
1022e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 4), 'x');
1023e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1024e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1025e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1026e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max ARRAY16.
1027e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::array<std::uint8_t, (1 << 16) - 1> a3;
1028e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (auto& element : a3)
1029e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    element = 'x';
1030e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(a3, &result);
1031e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
1032e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 16) - 1, 'x');
1033e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1034e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1035e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1036e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY32.
1037e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::array<std::uint8_t, (1 << 16)> a4;
1038e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (auto& element : a4)
1039e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    element = 'x';
1040e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(a4, &result);
1041e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
1042e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 16), 'x');
1043e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1044e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1045e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1046e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1047e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, ArrayWrapper) {
1048e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
1049e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
1050e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<std::uint8_t, DefaultInitializationAllocator<std::uint8_t>> value;
1051e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ArrayWrapper<std::uint8_t> wrapper;
1052e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1053e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXARRAY.
1054e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = {};
1055e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(wrapper, &result);
1056e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXARRAY_MIN};
1057e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1058e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1059e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1060e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXARRAY.
1061e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = decltype(value)((1 << 4) - 1, 'x');
1062e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  wrapper = decltype(wrapper)(value.data(), value.capacity(), value.size());
1063e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(wrapper, &result);
1064e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXARRAY_MAX};
1065e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 4) - 1, 'x');
1066e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1067e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1068e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1069e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY16.
1070e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = decltype(value)((1 << 4), 'x');
1071e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  wrapper = decltype(wrapper)(value.data(), value.capacity(), value.size());
1072e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(wrapper, &result);
1073e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_ARRAY16, 0x10, 0x00};
1074e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 4), 'x');
1075e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1076e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1077e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1078e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max ARRAY16.
1079e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = decltype(value)((1 << 16) - 1, 'x');
1080e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  wrapper = decltype(wrapper)(value.data(), value.capacity(), value.size());
1081e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(wrapper, &result);
1082e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
1083e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 16) - 1, 'x');
1084e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1085e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1086e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1087e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY32.
1088e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  value = decltype(value)((1 << 16), 'x');
1089e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  wrapper = decltype(wrapper)(value.data(), value.capacity(), value.size());
1090e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(wrapper, &result);
1091e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
1092e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 16), 'x');
1093e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1094e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1095e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1096e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1097e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, pair) {
1098e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
1099e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
1100e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1101e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto p1 = std::make_pair(1, 2);
1102e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(p1, &result);
1103e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXARRAY_MIN + 2, 1, 2};
1104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1105e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto p2 = std::make_pair('x', std::string("12345"));
1108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(p2, &result);
1109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)({ENCODING_TYPE_FIXARRAY_MIN + 2, 'x',
1110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                 ENCODING_TYPE_FIXSTR_MIN + 5, '1', '2', '3',
1111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                 '4', '5'});
1112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, tuple) {
1117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
1118e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
1119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXARRAY.
1121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto t1 = std::make_tuple();
1122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(t1, &result);
1123e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXARRAY_MIN};
1124e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXARRAY.
1128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto t2 = GetNTuple<15>('x');
1129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(t2, &result);
1130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXARRAY_MAX};
1131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 4) - 1, 'x');
1132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY16.
1136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto t3 = GetNTuple<(1 << 4)>('x');
1137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(t3, &result);
1138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_ARRAY16, 0x10, 0x00};
1139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 4), 'x');
1140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Template instantiation depth is an issue for these tests. They are commented
1144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// out to document the expected behavior, even though tuples of this order are
1145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// not expected in practice.
1146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#if 0
1147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max ARRAY16.
1148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto t4 = GetNTuple<(1 << 16)-1>('x');
1149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(t4, &result);
1150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
1151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 16)-1, 'x');
1152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY32.
1156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto t5 = GetNTuple<(1 << 16)>('x');
1157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(t5, &result);
1158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
1159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected.Append((1 << 16), 'x');
1160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif
1163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// TODO(eieio): More exhaustive testing of type nesting.
1166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, NestedTuple) {
1167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
1168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
1169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto t1 = std::make_tuple('x', std::make_tuple<int, int>(1, 2));
1171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(t1, &result);
1172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)({ENCODING_TYPE_FIXARRAY_MIN + 2, 'x',
1173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                 ENCODING_TYPE_FIXARRAY_MIN + 2, 1, 2});
1174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto t2 = std::make_tuple('x', std::make_tuple<int, int>(1, 2),
1178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                            std::string("0123456789"));
1179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(t2, &result);
1180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)({ENCODING_TYPE_FIXARRAY_MIN + 3, 'x',
1181e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                 ENCODING_TYPE_FIXARRAY_MIN + 2, 1, 2,
1182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                 ENCODING_TYPE_FIXSTR | 10, '0', '1', '2', '3',
1183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                 '4', '5', '6', '7', '8', '9'});
1184e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1185e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1186e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto t3 = std::make_tuple(0.0f, std::uint64_t(10ULL),
1188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                            std::vector<char>{'a', 'b', 'c'});
1189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(t3, &result);
1190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)(
1191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {ENCODING_TYPE_FIXARRAY_MIN + 3, ENCODING_TYPE_FLOAT32,
1192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       kZeroFloatBytes[0], kZeroFloatBytes[1], kZeroFloatBytes[2],
1193e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       kZeroFloatBytes[3], ENCODING_TYPE_POSITIVE_FIXINT_MIN + 10,
1194e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       ENCODING_TYPE_FIXARRAY_MIN + 3, 'a', 'b', 'c'});
1195e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1198e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1199e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, NestedMap) {
1200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
1201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
1202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::map<int, std::pair<std::string, int>> m1 = {{0, {"a", 2}},
1204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                                   {1, {"b", 10}}};
1205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(m1, &result);
1206e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)(
1207e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {ENCODING_TYPE_FIXMAP_MIN + 2, 0, ENCODING_TYPE_FIXARRAY_MIN + 2,
1208e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       ENCODING_TYPE_FIXSTR_MIN + 1, 'a', 2, 1, ENCODING_TYPE_FIXARRAY_MIN + 2,
1209e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       ENCODING_TYPE_FIXSTR_MIN + 1, 'b', 10});
1210e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1211e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1212e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1213e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1214e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, Serializable) {
1215e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
1216e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
1217e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1218e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  TestType t1{10, 0.0, "12345", TestType::Foo::kBaz};
1219e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(t1, &result);
1220e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)(
1221e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {ENCODING_TYPE_FIXARRAY_MIN + 4, 10, ENCODING_TYPE_FLOAT32,
1222e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       kZeroFloatBytes[0], kZeroFloatBytes[1], kZeroFloatBytes[2],
1223e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       kZeroFloatBytes[3], ENCODING_TYPE_FIXSTR_MIN + 5, '1', '2', '3', '4',
1224e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       '5', ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2});
1225e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1226e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1227e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1228e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  TestTemplateType<LocalHandle> tt{LocalHandle(-1)};
1229e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(tt, &result);
1230e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected =
1231e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      decltype(expected)({ENCODING_TYPE_FIXARRAY_MIN + 1, ENCODING_TYPE_FIXEXT2,
1232e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                          ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0xff, 0xff});
1233e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1234e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1235e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1236e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(SerializationTest, Variant) {
1237e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload result;
1238e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
1239e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1240e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Variant<int, bool, float> v;
1241e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1242e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Empty variant.
1243e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(v, &result);
1244e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_NEGATIVE_FIXINT_MAX,
1245e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              ENCODING_TYPE_NIL};
1246e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1247e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1248e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1249e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  v = 10;
1250e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(v, &result);
1251e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXMAP_MIN + 1,
1252e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              ENCODING_TYPE_POSITIVE_FIXINT_MIN + 0,
1253e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              ENCODING_TYPE_POSITIVE_FIXINT_MIN + 10};
1254e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1255e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1256e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1257e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  v = true;
1258e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(v, &result);
1259e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXMAP_MIN + 1,
1260e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1, ENCODING_TYPE_TRUE};
1261e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1262e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1263e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1264e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  v = false;
1265e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(v, &result);
1266e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXMAP_MIN + 1,
1267e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1, ENCODING_TYPE_FALSE};
1268e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1269e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1270e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1271e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  v = 1.0f;
1272e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Serialize(v, &result);
1273e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {ENCODING_TYPE_FIXMAP_MIN + 1,
1274e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2,
1275e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              ENCODING_TYPE_FLOAT32,
1276e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              kOneFloatBytes[0],
1277e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              kOneFloatBytes[1],
1278e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              kOneFloatBytes[2],
1279e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              kOneFloatBytes[3]};
1280e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
1281e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.Clear();
1282e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1283e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // TODO(eieio): Add more serialization tests for Variant.
1284e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1285e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1286e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, bool) {
1287e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1288e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool result = false;
1289e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1290e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1291e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // True.
1292e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_TRUE};
1293e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1294e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1295e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(1, result);  // Gtest generates warning from bool literals.
1296e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1297e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // False.
1298e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FALSE};
1299e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1300e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1301e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0, result);  // Gtest generates warning from bool literals.
1302e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1303e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1304e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, uint8_t) {
1305e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1306e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::uint8_t result = 0;
1307e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1308e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1309e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
1310e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1311e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1312e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1313e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1314e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1315e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
1316e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1317e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1318e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1319e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(127U, result);
1320e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1321e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT8.
1322e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT8, 0x00};
1323e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1324e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1325e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1326e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1327e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT8.
1328e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT8, 0xff};
1329e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1330e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1331e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0xffU, result);
1332e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1333e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // UINT16 out of range.
1334e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT16};
1335e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1336e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1337e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
1338e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_UINT16, error.encoding_type());
1339e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1340e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // UINT32 out of range.
1341e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT32};
1342e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1343e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1344e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
1345e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_UINT32, error.encoding_type());
1346e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1347e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // UINT64 out of range.
1348e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT64};
1349e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1350e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1351e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
1352e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_UINT64, error.encoding_type());
1353e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1354e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1355e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, uint16_t) {
1356e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1357e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::uint16_t result = 0;
1358e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1359e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1360e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
1361e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1362e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1363e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1364e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1365e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1366e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
1367e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1368e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1369e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1370e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(127U, result);
1371e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1372e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT8.
1373e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT8, 0x00};
1374e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1375e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1376e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1377e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1378e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT8.
1379e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT8, 0xff};
1380e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1381e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1382e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0xffU, result);
1383e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1384e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT16.
1385e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT16, 0x00, 0x00};
1386e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1387e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1388e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1389e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1390e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT16.
1391e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT16, 0xff, 0xff};
1392e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1393e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1394e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0xffffU, result);
1395e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1396e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // UINT32 out of range.
1397e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT32};
1398e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1399e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1400e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
1401e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_UINT32, error.encoding_type());
1402e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1403e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // UINT64 out of range.
1404e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT64};
1405e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1406e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1407e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
1408e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_UINT64, error.encoding_type());
1409e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1410e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1411e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, uint32_t) {
1412e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1413e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::uint32_t result = 0;
1414e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1415e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1416e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
1417e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1418e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1419e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1420e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1421e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1422e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
1423e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1424e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1425e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1426e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(127U, result);
1427e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1428e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT8.
1429e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT8, 0x00};
1430e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1431e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1432e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1433e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1434e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT8.
1435e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT8, 0xff};
1436e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1437e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1438e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0xffU, result);
1439e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1440e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT16.
1441e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT16, 0x00, 0x00};
1442e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1443e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1444e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1445e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1446e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT16.
1447e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT16, 0xff, 0xff};
1448e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1449e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1450e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0xffffU, result);
1451e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1452e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT32.
1453e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT32, 0x00, 0x00, 0x00, 0x00};
1454e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1455e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1456e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1457e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1458e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT32.
1459e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT32, 0xff, 0xff, 0xff, 0xff};
1460e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1461e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1462e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0xffffffffU, result);
1463e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1464e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // UINT64 out of range.
1465e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT64};
1466e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1467e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1468e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
1469e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_UINT64, error.encoding_type());
1470e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1471e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1472e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, uint64_t) {
1473e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1474e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::uint64_t result = 0;
1475e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1476e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1477e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
1478e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1479e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1480e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1481e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1482e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1483e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
1484e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1485e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1486e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1487e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(127U, result);
1488e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1489e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT8.
1490e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT8, 0x00};
1491e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1492e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1493e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1494e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1495e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT8.
1496e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT8, 0xff};
1497e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1498e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1499e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0xffU, result);
1500e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1501e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT16.
1502e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT16, 0x00, 0x00};
1503e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1504e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1505e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1506e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1507e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT16.
1508e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT16, 0xff, 0xff};
1509e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1510e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1511e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0xffffU, result);
1512e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1513e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT32.
1514e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT32, 0x00, 0x00, 0x00, 0x00};
1515e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1516e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1517e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1518e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1519e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT32.
1520e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_UINT32, 0xff, 0xff, 0xff, 0xff};
1521e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1522e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1523e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0xffffffffU, result);
1524e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1525e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min UINT64.
1526e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {
1527e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      ENCODING_TYPE_UINT64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
1528e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1529e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1530e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0U, result);
1531e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1532e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max UINT64.
1533e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {
1534e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      ENCODING_TYPE_UINT64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1535e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1536e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1537e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0xffffffffffffffffUL, result);
1538e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1539e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1540e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, int8_t) {
1541e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1542e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::int8_t result = 0;
1543e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1544e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1545e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min NEGATIVE FIXINT.
1546e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
1547e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1548e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1549e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-32, result);
1550e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1551e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max NEGATIVE FIXINT.
1552e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
1553e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1554e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1555e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-1, result);
1556e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1557e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
1558e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1559e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1560e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1561e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0, result);
1562e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1563e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
1564e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1565e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1566e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1567e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(127, result);
1568e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1569e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT8.
1570e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT8, 0x80};
1571e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1572e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1573e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-128, result);
1574e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1575e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT8.
1576e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT8, 0x7f};
1577e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1578e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1579e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(127, result);
1580e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1581e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // INT16 out of range.
1582e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT16};
1583e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1584e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1585e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
1586e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_INT16, error.encoding_type());
1587e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1588e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // INT32 out of range.
1589e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT32};
1590e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1591e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1592e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
1593e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_INT32, error.encoding_type());
1594e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1595e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // INT64 out of range.
1596e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT64};
1597e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1598e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1599e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
1600e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_INT64, error.encoding_type());
1601e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1602e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1603e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, int16_t) {
1604e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1605e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::int16_t result = 0;
1606e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1607e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1608e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min NEGATIVE FIXINT.
1609e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
1610e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1611e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1612e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-32, result);
1613e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1614e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max NEGATIVE FIXINT.
1615e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
1616e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1617e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1618e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-1, result);
1619e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1620e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
1621e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1622e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1623e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1624e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0, result);
1625e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1626e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
1627e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1628e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1629e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1630e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(127, result);
1631e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1632e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT8.
1633e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT8, 0x80};
1634e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1635e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1636e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-128, result);
1637e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1638e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT8.
1639e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT8, 0x7f};
1640e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1641e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1642e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(127, result);
1643e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1644e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT16.
1645e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT16, 0x00, 0x80};
1646e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1647e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1648e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-32768, result);
1649e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1650e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT16.
1651e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT16, 0xff, 0x7f};
1652e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1653e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1654e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(32767, result);
1655e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1656e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // INT32 out of range.
1657e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT32};
1658e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1659e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1660e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
1661e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_INT32, error.encoding_type());
1662e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1663e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // INT64 out of range.
1664e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT64};
1665e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1666e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1667e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
1668e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_INT64, error.encoding_type());
1669e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1670e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1671e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, int32_t) {
1672e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1673e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::int32_t result = 0;
1674e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1675e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1676e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min NEGATIVE FIXINT.
1677e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
1678e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1679e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1680e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-32, result);
1681e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1682e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max NEGATIVE FIXINT.
1683e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
1684e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1685e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1686e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-1, result);
1687e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1688e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
1689e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1690e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1691e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1692e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0, result);
1693e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1694e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
1695e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1696e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1697e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1698e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(127, result);
1699e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1700e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT8.
1701e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT8, 0x80};
1702e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1703e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1704e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-128, result);
1705e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1706e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT8.
1707e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT8, 0x7f};
1708e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1709e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1710e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(127, result);
1711e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1712e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT16.
1713e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT16, 0x00, 0x80};
1714e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1715e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1716e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-32768, result);
1717e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1718e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT16.
1719e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT16, 0xff, 0x7f};
1720e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1721e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1722e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(32767, result);
1723e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1724e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT32.
1725e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT32, 0x00, 0x00, 0x00, 0x80};
1726e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1727e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1728e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-2147483648, result);
1729e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1730e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT32.
1731e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT32, 0xff, 0xff, 0xff, 0x7f};
1732e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1733e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1734e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(2147483647, result);
1735e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1736e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // INT64 out of range.
1737e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT64};
1738e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1739e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1740e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
1741e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_INT64, error.encoding_type());
1742e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1743e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1744e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, int64_t) {
1745e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1746e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::int64_t result = 0;
1747e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1748e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1749e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min NEGATIVE FIXINT.
1750e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
1751e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1752e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1753e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-32, result);
1754e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1755e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max NEGATIVE FIXINT.
1756e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
1757e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1758e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1759e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-1, result);
1760e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1761e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXINT.
1762e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1763e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1764e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1765e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0, result);
1766e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1767e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXINT.
1768e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1769e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1770e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1771e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(127, result);
1772e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1773e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT8.
1774e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT8, 0x80};
1775e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1776e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1777e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-128, result);
1778e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1779e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT8.
1780e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT8, 0x7f};
1781e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1782e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1783e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(127, result);
1784e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1785e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT16.
1786e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT16, 0x00, 0x80};
1787e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1788e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1789e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-32768, result);
1790e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1791e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT16.
1792e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT16, 0xff, 0x7f};
1793e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1794e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1795e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(32767, result);
1796e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1797e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT32.
1798e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT32, 0x00, 0x00, 0x00, 0x80};
1799e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1800e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1801e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-2147483648, result);
1802e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1803e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT32.
1804e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_INT32, 0xff, 0xff, 0xff, 0x7f};
1805e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1806e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1807e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(2147483647, result);
1808e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1809e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min INT64.
1810e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {
1811e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      ENCODING_TYPE_INT64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};
1812e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1813e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1814e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Believe it or not, this is actually the correct way to specify the most
1815e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // negative signed long long.
1816e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-9223372036854775807LL - 1, result);
1817e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1818e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max INT64.
1819e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {
1820e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      ENCODING_TYPE_INT64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
1821e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1822e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1823e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(9223372036854775807LL, result);
1824e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1825e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1826e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, float) {
1827e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1828e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  float result;
1829e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1830e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1831e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // FLOAT32.
1832e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FLOAT32, kZeroFloatBytes[0], kZeroFloatBytes[1],
1833e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            kZeroFloatBytes[2], kZeroFloatBytes[3]};
1834e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1835e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1836e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(kZeroFloat, result);
1837e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1838e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // FLOAT32.
1839e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FLOAT32, kOneFloatBytes[0], kOneFloatBytes[1],
1840e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            kOneFloatBytes[2], kOneFloatBytes[3]};
1841e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1842e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1843e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(kOneFloat, result);
1844e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1845e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1846e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, double) {
1847e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1848e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  double result;
1849e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1850e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1851e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // FLOAT32.
1852e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FLOAT32, kZeroFloatBytes[0], kZeroFloatBytes[1],
1853e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            kZeroFloatBytes[2], kZeroFloatBytes[3]};
1854e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1855e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1856e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(kZeroDouble, result);
1857e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1858e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // FLOAT64.
1859e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FLOAT64, kZeroDoubleBytes[0], kZeroDoubleBytes[1],
1860e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            kZeroDoubleBytes[2],   kZeroDoubleBytes[3], kZeroDoubleBytes[4],
1861e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            kZeroDoubleBytes[5],   kZeroDoubleBytes[6], kZeroDoubleBytes[7]};
1862e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1863e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1864e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(kZeroDouble, result);
1865e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1866e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // FLOAT32.
1867e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FLOAT32, kOneFloatBytes[0], kOneFloatBytes[1],
1868e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            kOneFloatBytes[2], kOneFloatBytes[3]};
1869e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1870e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1871e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(kOneDouble, result);
1872e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1873e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // FLOAT64.
1874e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FLOAT64, kOneDoubleBytes[0], kOneDoubleBytes[1],
1875e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            kOneDoubleBytes[2],    kOneDoubleBytes[3], kOneDoubleBytes[4],
1876e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            kOneDoubleBytes[5],    kOneDoubleBytes[6], kOneDoubleBytes[7]};
1877e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1878e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1879e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(kOneDouble, result);
1880e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1881e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1882e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, Enum) {
1883e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1884e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  enum Foo { kFoo, kBar, kBaz } result;
1885e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1886e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1887e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1};
1888e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1889e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1890e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(kBar, result);
1891e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1892e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1893e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, EnumClass) {
1894e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1895e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  enum Foo { kFoo, kBar, kBaz } result;
1896e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1897e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1898e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2};
1899e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1900e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1901e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(Foo::kBaz, result);
1902e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1903e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1904e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, LocalHandle) {
1905e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1906e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  LocalHandle result1;
1907e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  LocalHandle result2;
1908e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1909e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1910e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXEXT2, ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0, 0};
1911e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result1, &buffer);
1912e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1913e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0, result1.Get());
1914e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result1.Release();  // Don't close fd 0.
1915e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1916e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::tuple<LocalHandle&, LocalHandle&> t1(result1, result2);
1917e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = decltype(buffer)(
1918e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {ENCODING_TYPE_FIXARRAY_MIN + 2, ENCODING_TYPE_FIXEXT2,
1919e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0, 0, ENCODING_TYPE_FIXEXT2,
1920e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 1, 0});
1921e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&t1, &buffer);
1922e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1923e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(0, result1.Get());
1924e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(1, result2.Get());
1925e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result1.Release();  // Don't close fd 0.
1926e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result2.Release();  // Don't close fd 1.
1927e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1928e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXEXT2, ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0xfe,
1929e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            0xff};
1930e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result1, &buffer);
1931e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1932e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(-2, result1.Get());
1933e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1934e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1935e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, string) {
1936e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1937e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::string result = "";
1938e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
1939e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1940e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXSTR.
1941e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXSTR_MIN};
1942e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1943e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1944e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ("", result);
1945e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1946e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXSTR.
1947e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXSTR_MAX};
1948e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append((1 << 5) - 1, 'x');
1949e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1950e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1951e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(std::string((1 << 5) - 1, 'x'), result);
1952e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1953e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min STR8.
1954e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR8, 0x00};
1955e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1956e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1957e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ("", result);
1958e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1959e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max STR8.
1960e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR8, 0xff};
1961e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append(0xff, 'x');
1962e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1963e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1964e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(std::string(0xff, 'x'), result);
1965e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1966e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min STR16.
1967e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR16, 0x00, 0x00};
1968e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1969e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1970e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ("", result);
1971e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1972e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max STR16.
1973e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR16, 0xff, 0xff};
1974e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append(0xffff, 'x');
1975e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1976e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1977e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(std::string(0xffff, 'x'), result);
1978e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1979e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min STR32.
1980e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR32, 0x00, 0x00, 0x00, 0x00};
1981e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1982e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1983e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ("", result);
1984e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1985e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Test STR32 with max STR16 + 1 bytes. It's not practical to test max
1986e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // STR32.
1987e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR32, 0x00, 0x00, 0x01, 0x00};
1988e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append(0x10000, 'x');
1989e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
1990e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
1991e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(std::string(0x10000, 'x'), result);
1992e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
1993e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1994e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, vector) {
1995e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
1996e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<std::uint8_t, DefaultInitializationAllocator<std::uint8_t>>
1997e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      result;
1998e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload expected;
1999e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
2000e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2001e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXARRAY.
2002e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MIN};
2003e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2004e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {};
2005e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2006e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2007e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2008e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXARRAY.
2009e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MAX};
2010e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append((1 << 4) - 1, 1);
2011e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2012e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)((1 << 4) - 1, 1);
2013e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2014e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2015e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2016e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY16.
2017e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY16, 0x00, 0x00};
2018e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2019e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {};
2020e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2021e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2022e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2023e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max ARRAY16.
2024e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
2025e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append(0xffff, 1);
2026e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2027e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)(0xffff, 1);
2028e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2029e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2030e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2031e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY32.
2032e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x00, 0x00};
2033e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2034e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {};
2035e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2036e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2037e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2038e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // ARRAY32 with max ARRAY16 + 1. It's not practical to test max ARRAY32.
2039e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
2040e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append(0x10000, 1);
2041e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2042e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)(0x10000, 1);
2043e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2044e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2045e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
2046e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2047e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, map) {
2048e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
2049e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::map<std::uint32_t, std::uint32_t> result;
2050e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::map<std::uint32_t, std::uint32_t> expected;
2051e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
2052e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2053e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXMAP.
2054e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXMAP_MIN};
2055e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2056e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {};
2057e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2058e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2059e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2060e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Size mismatch.
2061e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXMAP_MIN + 1};
2062e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2063e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::INSUFFICIENT_BUFFER, error);
2064e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2065e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXMAP.
2066e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXMAP_MAX};
2067e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(result)>(&buffer, (1 << 4) - 1);
2068e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2069e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = MakeMap<decltype(expected)>((1 << 4) - 1);
2070e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error) << std::string(error);
2071e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2072e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2073e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min MAP16.
2074e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_MAP16, 0x00, 0x00};
2075e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2076e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {};
2077e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2078e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2079e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2080e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max MAP16.
2081e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_MAP16, 0xff, 0xff};
2082e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(result)>(&buffer, (1 << 16) - 1);
2083e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2084e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = MakeMap<decltype(expected)>((1 << 16) - 1);
2085e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2086e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2087e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2088e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min MAP32.
2089e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x00, 0x00};
2090e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2091e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {};
2092e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2093e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2094e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2095e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // MAP32 with max MAP16 + 1. It's not practical to test max MAP32.
2096e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x01, 0x00};
2097e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(result)>(&buffer, (1 << 16));
2098e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2099e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = MakeMap<decltype(expected)>((1 << 16));
2100e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2101e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2102e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
2103e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, unordered_map) {
2105e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
2106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::unordered_map<std::uint32_t, std::uint32_t> result;
2107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::unordered_map<std::uint32_t, std::uint32_t> expected;
2108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
2109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXMAP.
2111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXMAP_MIN};
2112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {};
2114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Size mismatch.
2118e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXMAP_MIN + 1};
2119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::INSUFFICIENT_BUFFER, error);
2121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXMAP.
2123e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXMAP_MAX};
2124e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(result)>(&buffer, (1 << 4) - 1);
2125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = MakeMap<decltype(expected)>((1 << 4) - 1);
2127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min MAP16.
2131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_MAP16, 0x00, 0x00};
2132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {};
2134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max MAP16.
2138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_MAP16, 0xff, 0xff};
2139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(result)>(&buffer, (1 << 16) - 1);
2140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = MakeMap<decltype(expected)>((1 << 16) - 1);
2142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min MAP32.
2146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x00, 0x00};
2147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {};
2149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // MAP32 with max MAP16 + 1. It's not practical to test max MAP32.
2153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x01, 0x00};
2154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InsertKeyValue<decltype(result)>(&buffer, (1 << 16));
2155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&result, &buffer);
2156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = MakeMap<decltype(expected)>((1 << 16));
2157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
2160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, array) {
2162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
2163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
2164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXARRAY.
2166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MIN};
2167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::array<std::uint8_t, 0> a0;
2168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&a0, &buffer);
2169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Size mismatch.
2172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MIN + 1};
2173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&a0, &buffer);
2174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::INSUFFICIENT_DESTINATION_SIZE, error);
2175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXARRAY.
2177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MAX};
2178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append((1 << 4) - 1, 'x');
2179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::array<std::uint8_t, (1 << 4) - 1> a1, expected1;
2180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (auto& element : expected1)
2181e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    element = 'x';
2182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&a1, &buffer);
2183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2184e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected1, a1);
2185e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2186e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY16.
2187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY16, 0x00, 0x00};
2188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&a0, &buffer);
2189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max ARRAY16.
2192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
2193e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append((1 << 16) - 1, 'x');
2194e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::array<std::uint8_t, (1 << 16) - 1> a3, expected3;
2195e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (auto& element : expected3)
2196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    element = 'x';
2197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&a3, &buffer);
2198e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2199e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected3, a3);
2200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY32.
2202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x00, 0x00};
2203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&a0, &buffer);
2204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2206e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // ARRAY32 with max ARRAY16 + 1. It's not practical to test max ARRAY32.
2207e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
2208e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append((1 << 16), 'x');
2209e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::array<std::uint8_t, (1 << 16)> a4, expected4;
2210e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (auto& element : expected4)
2211e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    element = 'x';
2212e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&a4, &buffer);
2213e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2214e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected4, a4);
2215e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
2216e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2217e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, ArrayWrapper) {
2218e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
2219e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<std::uint8_t, DefaultInitializationAllocator<std::uint8_t>>
2220e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      result;
2221e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<std::uint8_t, DefaultInitializationAllocator<std::uint8_t>>
2222e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      expected;
2223e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
2224e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2225e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.reserve(0x10000);
2226e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ArrayWrapper<std::uint8_t> wrapper(result.data(), result.capacity());
2227e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2228e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXARRAY.
2229e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MIN};
2230e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&wrapper, &buffer);
2231e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {};
2232e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.resize(wrapper.size());
2233e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2234e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2235e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2236e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXARRAY.
2237e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MAX};
2238e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append((1 << 4) - 1, 1);
2239e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&wrapper, &buffer);
2240e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)((1 << 4) - 1, 1);
2241e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.resize(wrapper.size());
2242e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2243e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2244e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2245e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY16.
2246e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY16, 0x00, 0x00};
2247e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&wrapper, &buffer);
2248e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {};
2249e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.resize(wrapper.size());
2250e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2251e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2252e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2253e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max ARRAY16.
2254e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
2255e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append(0xffff, 1);
2256e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&wrapper, &buffer);
2257e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)(0xffff, 1);
2258e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.resize(wrapper.size());
2259e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2260e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2261e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2262e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY32.
2263e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x00, 0x00};
2264e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&wrapper, &buffer);
2265e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = {};
2266e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.resize(wrapper.size());
2267e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2268e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2269e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2270e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // ARRAY32 with max ARRAY16 + 1. It's not practical to test max ARRAY32.
2271e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
2272e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append(0x10000, 1);
2273e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&wrapper, &buffer);
2274e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  expected = decltype(expected)(0x10000, 1);
2275e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  result.resize(wrapper.size());
2276e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2277e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(expected, result);
2278e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
2279e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2280e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, pair) {
2281e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
2282e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
2283e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2284e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::pair<int, int> p1;
2285e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MIN + 2, 1, 2};
2286e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&p1, &buffer);
2287e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2288e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(std::make_pair(1, 2), p1);
2289e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
2290e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2291e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, tuple) {
2292e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
2293e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
2294e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2295e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min FIXARRAY.
2296e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::tuple<> t1;
2297e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MIN};
2298e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&t1, &buffer);
2299e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2300e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(std::make_tuple(), t1);  // Superfluous.
2301e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2302e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Max FIXARRAY.
2303e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto t2 = GetNTuple<15, int>(0);
2304e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MAX};
2305e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append((1 << 4) - 1, 1);
2306e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&t2, &buffer);
2307e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2308e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ((GetNTuple<15, int>(1)), t2);
2309e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2310e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY16.
2311e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Using t1 above.
2312e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY16, 0x00, 0x00};
2313e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&t1, &buffer);
2314e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2315e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(std::make_tuple(), t1);
2316e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2317e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // ARRAY16 at Max FIXARRAY + 1
2318e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto t3 = GetNTuple<(1 << 4), int>(0);
2319e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY16, 0x10, 0x00};
2320e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append((1 << 4), 1);
2321e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&t3, &buffer);
2322e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2323e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ((GetNTuple<(1 << 4), int>(1)), t3);
2324e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2325e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Min ARRAY32.
2326e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Using t1 from above.
2327e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x00, 0x00};
2328e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&t1, &buffer);
2329e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2330e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(std::make_tuple(), t1);
2331e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2332e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // ARRAY32 at Max FIXARRAY + 1
2333e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto t4 = GetNTuple<(1 << 4), int>(0);
2334e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_ARRAY32, 0x10, 0x00, 0x00, 0x00};
2335e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer.Append((1 << 4), 1);
2336e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&t4, &buffer);
2337e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2338e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ((GetNTuple<(1 << 4), int>(1)), t4);
2339e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2340e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Template instantiation depth is an issue for tuples with large numbers of
2341e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // elements. As these are not expected in practice, the limits of ARRAY16
2342e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // and ARRAY32 are not tested.
2343e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
2344e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2345e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, Serializable) {
2346e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
2347e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
2348e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2349e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = decltype(buffer)(
2350e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {ENCODING_TYPE_FIXARRAY_MIN + 4, 10, ENCODING_TYPE_FLOAT32,
2351e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       kZeroFloatBytes[0], kZeroFloatBytes[1], kZeroFloatBytes[2],
2352e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       kZeroFloatBytes[3], ENCODING_TYPE_FIXSTR_MIN + 5, '1', '2', '3', '4',
2353e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko       '5', ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1});
2354e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  TestType t1;
2355e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&t1, &buffer);
2356e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2357e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(TestType(10, 0.f, "12345", TestType::Foo::kBar), t1);
2358e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2359e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer =
2360e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      decltype(buffer)({ENCODING_TYPE_FIXARRAY_MIN + 1, ENCODING_TYPE_FIXEXT2,
2361e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                        ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0xff, 0xff});
2362e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  TestTemplateType<LocalHandle> tt;
2363e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&tt, &buffer);
2364e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2365e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(TestTemplateType<LocalHandle>(LocalHandle(-1)), tt);
2366e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
2367e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2368e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, Variant) {
2369e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
2370e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
2371e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2372e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Variant<int, bool, float> v;
2373e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2374e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_NEGATIVE_FIXINT_MAX,
2375e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            ENCODING_TYPE_NIL};
2376e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&v, &buffer);
2377e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2378e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_TRUE(v.empty());
2379e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2380e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_POSITIVE_FIXINT_MIN + 0,
2381e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            ENCODING_TYPE_POSITIVE_FIXINT_MIN + 10};
2382e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&v, &buffer);
2383e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2384e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ASSERT_TRUE(v.is<int>());
2385e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(10, std::get<int>(v));
2386e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2387e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1,
2388e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            ENCODING_TYPE_TRUE};
2389e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&v, &buffer);
2390e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2391e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ASSERT_TRUE(v.is<bool>());
2392e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(true, std::get<bool>(v));
2393e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2394e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1,
2395e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            ENCODING_TYPE_FALSE};
2396e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&v, &buffer);
2397e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2398e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ASSERT_TRUE(v.is<bool>());
2399e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(false, std::get<bool>(v));
2400e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2401e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXMAP_MIN + 1,
2402e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2,
2403e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            ENCODING_TYPE_FLOAT32,
2404e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            kOneFloatBytes[0],
2405e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            kOneFloatBytes[1],
2406e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            kOneFloatBytes[2],
2407e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            kOneFloatBytes[3]};
2408e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&v, &buffer);
2409e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::NO_ERROR, error);
2410e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ASSERT_TRUE(v.is<float>());
2411e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_FLOAT_EQ(1.0, std::get<float>(v));
2412e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2413e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // TODO(eieio): Add more deserialization tests for Variant.
2414e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
2415e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2416e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoTEST(DeserializationTest, ErrorType) {
2417e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Payload buffer;
2418e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ErrorType error;
2419e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2420e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::uint8_t u8;
2421e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR8};
2422e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&u8, &buffer);
2423e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2424e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
2425e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2426e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2427e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::uint16_t u16;
2428e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR8};
2429e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&u16, &buffer);
2430e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2431e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
2432e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2433e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2434e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::uint32_t u32;
2435e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR8};
2436e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&u32, &buffer);
2437e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2438e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
2439e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2440e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2441e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::uint64_t u64;
2442e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR8};
2443e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&u64, &buffer);
2444e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2445e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
2446e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2447e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2448e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::int8_t i8;
2449e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR8};
2450e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&i8, &buffer);
2451e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2452e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
2453e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2454e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2455e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::int16_t i16;
2456e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR8};
2457e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&i16, &buffer);
2458e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2459e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
2460e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2461e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2462e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::int32_t i32;
2463e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR8};
2464e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&i32, &buffer);
2465e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2466e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
2467e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2468e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2469e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::int64_t i64;
2470e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_STR8};
2471e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&i64, &buffer);
2472e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2473e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
2474e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2475e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2476e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::string s;
2477e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT};
2478e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&s, &buffer);
2479e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2480e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_STRING, error.encoding_class());
2481e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_POSITIVE_FIXINT, error.encoding_type());
2482e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2483e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<std::uint8_t> v;
2484e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_POSITIVE_FIXINT};
2485e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&v, &buffer);
2486e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2487e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_ARRAY, error.encoding_class());
2488e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_POSITIVE_FIXINT, error.encoding_type());
2489e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2490e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MIN + 1, ENCODING_TYPE_STR8};
2491e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&v, &buffer);
2492e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2493e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
2494e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2495e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2496e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MIN + 2, 0, 1};
2497e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::tuple<int> t;
2498e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&t, &buffer);
2499e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_TYPE_SIZE, error);
2500e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2501e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  buffer = {ENCODING_TYPE_FIXARRAY_MIN + 3, 0, 1, 2};
2502e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::pair<int, int> p;
2503e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  error = Deserialize(&p, &buffer);
2504e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  EXPECT_EQ(ErrorCode::UNEXPECTED_TYPE_SIZE, error);
2505e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
2506