osrm-backend/test/t/complex/reader_test_cases.cpp
Michael Krasnyk 68019a1fb2 Squashed 'third_party/protozero/' content from commit d5d8debf1
git-subtree-dir: third_party/protozero
git-subtree-split: d5d8debf1b17c6bb652395957b76cde7787e5377
2018-04-19 22:03:49 +03:00

687 lines
20 KiB
C++

#include <test.hpp>
namespace TestComplex {
enum class Test : protozero::pbf_tag_type {
required_fixed32_f = 1,
optional_int64_i = 2,
optional_int64_j = 3,
required_Sub_submessage = 5,
optional_string_s = 8,
repeated_uint32_u = 4,
packed_sint32_d = 7
};
enum class Sub : protozero::pbf_tag_type {
required_string_s = 1
};
} // namespace TestComplex
TEST_CASE("read complex data using pbf_reader: minimal") {
const std::string buffer = load_data("complex/data-minimal");
protozero::pbf_reader item{buffer};
while (item.next()) {
switch (item.tag()) {
case 1: {
REQUIRE(item.get_fixed32() == 12345678L);
break;
}
case 5: {
protozero::pbf_reader subitem = item.get_message();
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
}
TEST_CASE("read complex data using pbf_reader: some") {
const std::string buffer = load_data("complex/data-some");
protozero::pbf_reader item2{buffer};
protozero::pbf_reader item;
using std::swap;
swap(item, item2);
uint32_t sum_of_u = 0;
while (item.next()) {
switch (item.tag()) {
case 1: {
REQUIRE(item.get_fixed32() == 12345678L);
break;
}
case 2: {
REQUIRE(true);
item.skip();
break;
}
case 4: {
sum_of_u += item.get_uint32();
break;
}
case 5: {
protozero::pbf_reader subitem = item.get_message();
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
REQUIRE(sum_of_u == 66);
}
TEST_CASE("read complex data using pbf_reader: all") {
const std::string buffer = load_data("complex/data-all");
protozero::pbf_reader item{buffer};
int number_of_u = 0;
while (item.next()) {
switch (item.tag()) {
case 1: {
REQUIRE(item.get_fixed32() == 12345678L);
break;
}
case 2: {
REQUIRE(true);
item.skip();
break;
}
case 3: {
REQUIRE(item.get_int64() == 555555555LL);
break;
}
case 4: {
item.skip();
++number_of_u;
break;
}
case 5: {
protozero::pbf_reader subitem = item.get_message();
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
case 7: {
const auto pi = item.get_packed_sint32();
int32_t sum = 0;
for (auto val : pi) {
sum += val;
}
REQUIRE(sum == 5);
break;
}
case 8: {
REQUIRE(item.get_string() == "optionalstring");
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
REQUIRE(number_of_u == 5);
}
TEST_CASE("read complex data using pbf_reader: skip everything") {
const std::string buffer = load_data("complex/data-all");
protozero::pbf_reader item{buffer};
while (item.next()) {
switch (item.tag()) {
case 1:
case 2:
case 3:
case 4:
case 5:
case 7:
case 8:
item.skip();
break;
default: {
REQUIRE(false); // should not be here
break;
}
}
}
}
TEST_CASE("read complex data using pbf_message: minimal") {
const std::string buffer = load_data("complex/data-minimal");
protozero::pbf_message<TestComplex::Test> item{buffer};
while (item.next()) {
switch (item.tag()) {
case TestComplex::Test::required_fixed32_f: {
REQUIRE(item.get_fixed32() == 12345678L);
break;
}
case TestComplex::Test::required_Sub_submessage: {
protozero::pbf_message<TestComplex::Sub> subitem{item.get_message()};
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
}
TEST_CASE("read complex data using pbf_message: some") {
const std::string buffer = load_data("complex/data-some");
protozero::pbf_message<TestComplex::Test> item2{buffer};
protozero::pbf_message<TestComplex::Test> item;
using std::swap;
swap(item, item2);
uint32_t sum_of_u = 0;
while (item.next()) {
switch (item.tag()) {
case TestComplex::Test::required_fixed32_f: {
REQUIRE(item.get_fixed32() == 12345678L);
break;
}
case TestComplex::Test::optional_int64_i: {
REQUIRE(true);
item.skip();
break;
}
case TestComplex::Test::repeated_uint32_u: {
sum_of_u += item.get_uint32();
break;
}
case TestComplex::Test::required_Sub_submessage: {
protozero::pbf_message<TestComplex::Sub> subitem = item.get_message();
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
REQUIRE(sum_of_u == 66);
}
TEST_CASE("read complex data using pbf_message: all") {
const std::string buffer = load_data("complex/data-all");
protozero::pbf_message<TestComplex::Test> item{buffer};
int number_of_u = 0;
while (item.next()) {
switch (item.tag()) {
case TestComplex::Test::required_fixed32_f: {
REQUIRE(item.get_fixed32() == 12345678L);
break;
}
case TestComplex::Test::optional_int64_i: {
REQUIRE(true);
item.skip();
break;
}
case TestComplex::Test::optional_int64_j: {
REQUIRE(item.get_int64() == 555555555LL);
break;
}
case TestComplex::Test::repeated_uint32_u: {
item.skip();
++number_of_u;
break;
}
case TestComplex::Test::required_Sub_submessage: {
protozero::pbf_message<TestComplex::Sub> subitem = item.get_message();
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
case TestComplex::Test::packed_sint32_d: {
const auto pi = item.get_packed_sint32();
int32_t sum = 0;
for (auto val : pi) {
sum += val;
}
REQUIRE(sum == 5);
break;
}
case TestComplex::Test::optional_string_s: {
REQUIRE(item.get_string() == "optionalstring");
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
REQUIRE(number_of_u == 5);
}
TEST_CASE("read complex data using pbf_message: skip everything") {
const std::string buffer = load_data("complex/data-all");
protozero::pbf_message<TestComplex::Test> item{buffer};
while (item.next()) {
switch (item.tag()) {
case TestComplex::Test::required_fixed32_f:
case TestComplex::Test::optional_int64_i:
case TestComplex::Test::optional_int64_j:
case TestComplex::Test::repeated_uint32_u:
case TestComplex::Test::required_Sub_submessage:
case TestComplex::Test::packed_sint32_d:
case TestComplex::Test::optional_string_s:
item.skip();
break;
default: {
REQUIRE(false); // should not be here
break;
}
}
}
}
TEST_CASE("write complex data using pbf_writer: minimal") {
std::string buffer;
protozero::pbf_writer pw{buffer};
pw.add_fixed32(1, 12345678);
std::string submessage;
protozero::pbf_writer pws{submessage};
pws.add_string(1, "foobar");
pw.add_message(5, submessage);
protozero::pbf_reader item{buffer};
while (item.next()) {
switch (item.tag()) {
case 1: {
REQUIRE(item.get_fixed32() == 12345678L);
break;
}
case 5: {
protozero::pbf_reader subitem = item.get_message();
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
}
TEST_CASE("write complex data using pbf_writer: some") {
std::string buffer;
protozero::pbf_writer pw2{buffer};
pw2.add_fixed32(1, 12345678);
protozero::pbf_writer pw;
using std::swap;
swap(pw, pw2);
REQUIRE(pw.valid());
REQUIRE_FALSE(pw2.valid());
std::string submessage;
protozero::pbf_writer pws{submessage};
pws.add_string(1, "foobar");
pw.add_uint32(4, 22);
pw.add_uint32(4, 44);
pw.add_int64(2, -9876543);
pw.add_message(5, submessage);
protozero::pbf_reader item{buffer};
uint32_t sum_of_u = 0;
while (item.next()) {
switch (item.tag()) {
case 1: {
REQUIRE(item.get_fixed32() == 12345678L);
break;
}
case 2: {
REQUIRE(true);
item.skip();
break;
}
case 4: {
sum_of_u += item.get_uint32();
break;
}
case 5: {
const auto view = item.get_view();
protozero::pbf_reader subitem{view};
REQUIRE(subitem.next());
REQUIRE(std::string(subitem.get_view()) == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
REQUIRE(sum_of_u == 66);
}
TEST_CASE("write complex data using pbf_writer: all") {
std::string buffer;
protozero::pbf_writer pw{buffer};
pw.add_fixed32(1, 12345678);
std::string submessage;
protozero::pbf_writer pws{submessage};
pws.add_string(1, "foobar");
pw.add_message(5, submessage);
pw.add_uint32(4, 22);
pw.add_uint32(4, 44);
pw.add_int64(2, -9876543);
pw.add_uint32(4, 44);
pw.add_uint32(4, 66);
pw.add_uint32(4, 66);
const int32_t d[] = { -17, 22 };
pw.add_packed_sint32(7, std::begin(d), std::end(d));
pw.add_int64(3, 555555555);
protozero::pbf_reader item{buffer};
int number_of_u = 0;
while (item.next()) {
switch (item.tag()) {
case 1: {
REQUIRE(item.get_fixed32() == 12345678L);
break;
}
case 2: {
REQUIRE(true);
item.skip();
break;
}
case 3: {
REQUIRE(item.get_int64() == 555555555LL);
break;
}
case 4: {
item.skip();
++number_of_u;
break;
}
case 5: {
protozero::pbf_reader subitem = item.get_message();
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
case 7: {
const auto pi = item.get_packed_sint32();
int32_t sum = 0;
for (auto val : pi) {
sum += val;
}
REQUIRE(sum == 5);
break;
}
case 8: {
REQUIRE(item.get_string() == "optionalstring");
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
REQUIRE(number_of_u == 5);
}
TEST_CASE("write complex data using pbf_builder: minimal") {
std::string buffer;
protozero::pbf_builder<TestComplex::Test> pw{buffer};
pw.add_fixed32(TestComplex::Test::required_fixed32_f, 12345678);
std::string submessage;
protozero::pbf_builder<TestComplex::Sub> pws{submessage};
pws.add_string(TestComplex::Sub::required_string_s, "foobar");
pw.add_message(TestComplex::Test::required_Sub_submessage, submessage);
protozero::pbf_reader item{buffer};
while (item.next()) {
switch (item.tag()) {
case 1: {
REQUIRE(item.get_fixed32() == 12345678L);
break;
}
case 5: {
protozero::pbf_reader subitem = item.get_message();
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
}
TEST_CASE("write complex data using pbf_builder: some") {
std::string buffer;
protozero::pbf_builder<TestComplex::Test> pw2{buffer};
pw2.add_fixed32(TestComplex::Test::required_fixed32_f, 12345678);
std::string dummy_buffer;
protozero::pbf_builder<TestComplex::Test> pw{dummy_buffer};
using std::swap;
swap(pw, pw2);
std::string submessage;
protozero::pbf_builder<TestComplex::Sub> pws{submessage};
pws.add_string(TestComplex::Sub::required_string_s, "foobar");
pw.add_uint32(TestComplex::Test::repeated_uint32_u, 22);
pw.add_uint32(TestComplex::Test::repeated_uint32_u, 44);
pw.add_int64(TestComplex::Test::optional_int64_i, -9876543);
pw.add_message(TestComplex::Test::required_Sub_submessage, submessage);
protozero::pbf_reader item{buffer};
uint32_t sum_of_u = 0;
while (item.next()) {
switch (item.tag()) {
case 1: {
REQUIRE(item.get_fixed32() == 12345678L);
break;
}
case 2: {
REQUIRE(true);
item.skip();
break;
}
case 4: {
sum_of_u += item.get_uint32();
break;
}
case 5: {
protozero::pbf_reader subitem = item.get_message();
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
REQUIRE(sum_of_u == 66);
}
TEST_CASE("write complex data using pbf_builder: all") {
std::string buffer;
protozero::pbf_builder<TestComplex::Test> pw{buffer};
pw.add_fixed32(TestComplex::Test::required_fixed32_f, 12345678);
std::string submessage;
protozero::pbf_builder<TestComplex::Sub> pws{submessage};
pws.add_string(TestComplex::Sub::required_string_s, "foobar");
pw.add_message(TestComplex::Test::required_Sub_submessage, submessage);
pw.add_uint32(TestComplex::Test::repeated_uint32_u, 22);
pw.add_uint32(TestComplex::Test::repeated_uint32_u, 44);
pw.add_int64(TestComplex::Test::optional_int64_i, -9876543);
pw.add_uint32(TestComplex::Test::repeated_uint32_u, 44);
pw.add_uint32(TestComplex::Test::repeated_uint32_u, 66);
pw.add_uint32(TestComplex::Test::repeated_uint32_u, 66);
const int32_t d[] = { -17, 22 };
pw.add_packed_sint32(TestComplex::Test::packed_sint32_d, std::begin(d), std::end(d));
pw.add_int64(TestComplex::Test::optional_int64_j, 555555555);
protozero::pbf_reader item{buffer};
int number_of_u = 0;
while (item.next()) {
switch (item.tag()) {
case 1: {
REQUIRE(item.get_fixed32() == 12345678L);
break;
}
case 2: {
REQUIRE(true);
item.skip();
break;
}
case 3: {
REQUIRE(item.get_int64() == 555555555LL);
break;
}
case 4: {
item.skip();
++number_of_u;
break;
}
case 5: {
protozero::pbf_reader subitem = item.get_message();
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
case 7: {
const auto pi = item.get_packed_sint32();
int32_t sum = 0;
for (auto val : pi) {
sum += val;
}
REQUIRE(sum == 5);
break;
}
case 8: {
REQUIRE(item.get_string() == "optionalstring");
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
REQUIRE(number_of_u == 5);
}
static void check_message(const std::string& buffer) {
protozero::pbf_reader item{buffer};
while (item.next()) {
switch (item.tag()) {
case 1: {
REQUIRE(item.get_fixed32() == 42L);
break;
}
case 5: {
protozero::pbf_reader subitem = item.get_message();
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
break;
}
default: {
REQUIRE(false); // should not be here
break;
}
}
}
}
TEST_CASE("write complex with subwriter using pbf_writer") {
std::string buffer_test;
protozero::pbf_writer pbf_test{buffer_test};
pbf_test.add_fixed32(1, 42L);
SECTION("message in message") {
protozero::pbf_writer pbf_submessage{pbf_test, 5};
pbf_submessage.add_string(1, "foobar");
}
check_message(buffer_test);
}
TEST_CASE("write complex with subwriter using pbf_builder") {
std::string buffer_test;
protozero::pbf_builder<TestComplex::Test> pbf_test{buffer_test};
pbf_test.add_fixed32(TestComplex::Test::required_fixed32_f, 42L);
SECTION("message in message") {
protozero::pbf_builder<TestComplex::Sub> pbf_submessage{pbf_test, TestComplex::Test::required_Sub_submessage};
pbf_submessage.add_string(TestComplex::Sub::required_string_s, "foobar");
}
check_message(buffer_test);
}