osrm-backend/test/t/message/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

130 lines
3.7 KiB
C++

#include <test.hpp>
TEST_CASE("read message field: string") {
const std::string buffer = load_data("message/data-message");
protozero::pbf_reader item{buffer};
REQUIRE(item.next());
protozero::pbf_reader subitem{item.get_message()};
REQUIRE_FALSE(item.next());
REQUIRE(subitem.next());
REQUIRE(subitem.get_string() == "foobar");
REQUIRE_FALSE(subitem.next());
}
TEST_CASE("read message field: end of buffer") {
const std::string buffer = load_data("message/data-message");
for (std::string::size_type i = 1; i < buffer.size(); ++i) {
protozero::pbf_reader item{buffer.data(), i};
REQUIRE(item.next());
REQUIRE_THROWS_AS(item.get_string(), const protozero::end_of_buffer_exception&);
}
}
TEST_CASE("read message field: optional contents of message - empty") {
const std::string buffer = load_data("message/data-opt-empty");
protozero::pbf_reader item{buffer};
REQUIRE_FALSE(item.next());
}
TEST_CASE("read message field: string opt") {
const std::string buffer = load_data("message/data-opt-element");
protozero::pbf_reader item{buffer};
REQUIRE(item.next());
REQUIRE(item.get_string() == "optional");
REQUIRE_FALSE(item.next());
}
TEST_CASE("write message field") {
std::string buffer;
protozero::pbf_writer pbf_test{buffer};
SECTION("string") {
std::string buffer_submessage;
protozero::pbf_writer pbf_submessage{buffer_submessage};
pbf_submessage.add_string(1, "foobar");
pbf_test.add_message(1, buffer_submessage);
}
SECTION("string with subwriter") {
protozero::pbf_writer pbf_submessage{pbf_test, 1};
pbf_submessage.add_string(1, "foobar");
}
SECTION("string with subwriter with reserved size") {
std::string str{"foobar"};
const auto size = 1 /* tag */ + 1 /* length field */ + str.size();
protozero::pbf_writer pbf_submessage{pbf_test, 1, size};
pbf_submessage.add_string(1, "foobar");
}
REQUIRE(buffer == load_data("message/data-message"));
}
TEST_CASE("write message field into non-empty buffer") {
std::string buffer{"some data already in here"};
protozero::pbf_writer pbf_test{buffer};
SECTION("string") {
std::string buffer_submessage;
protozero::pbf_writer pbf_submessage{buffer_submessage};
pbf_submessage.add_string(1, "foobar");
pbf_test.add_message(1, buffer_submessage);
}
SECTION("string with subwriter") {
protozero::pbf_writer pbf_submessage{pbf_test, 1};
pbf_submessage.add_string(1, "foobar");
}
REQUIRE(buffer == std::string{"some data already in here"} + load_data("message/data-message"));
}
TEST_CASE("write message field reserving memory beforehand") {
std::string buffer;
protozero::pbf_writer pbf_test{buffer};
pbf_test.reserve(100);
REQUIRE(buffer.capacity() >= 100);
SECTION("string") {
std::string buffer_submessage;
protozero::pbf_writer pbf_submessage{buffer_submessage};
pbf_submessage.add_string(1, "foobar");
pbf_test.add_message(1, buffer_submessage);
}
SECTION("string with subwriter") {
protozero::pbf_writer pbf_submessage{pbf_test, 1};
pbf_submessage.add_string(1, "foobar");
}
REQUIRE(buffer == load_data("message/data-message"));
}
TEST_CASE("write optional message field") {
std::string buffer;
protozero::pbf_writer pbf_opt{buffer};
SECTION("add nothing") {
REQUIRE(buffer == load_data("message/data-opt-empty"));
}
SECTION("add string") {
pbf_opt.add_string(1, "optional");
REQUIRE(buffer == load_data("message/data-opt-element"));
}
}