From 6cdcaeeb15d3f2d682e712465830a8d45381b565 Mon Sep 17 00:00:00 2001 From: Ruben Perez Date: Fri, 7 Oct 2022 23:18:28 +0200 Subject: [PATCH] resultset tests --- test/CMakeLists.txt | 2 +- test/common/create_resultset.hpp | 5 +- test/unit/resultset.cpp | 121 +++++++++++++++++-------------- 3 files changed, 70 insertions(+), 58 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 55a23cf8..b3af0524 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -59,7 +59,7 @@ add_executable( unit/error.cpp unit/execute_params.cpp unit/statement.cpp - # unit/resultset.cpp + unit/resultset.cpp # unit/connection.cpp unit/entry_point.cpp ) diff --git a/test/common/create_resultset.hpp b/test/common/create_resultset.hpp index cb007ee0..b4e21ed4 100644 --- a/test/common/create_resultset.hpp +++ b/test/common/create_resultset.hpp @@ -17,13 +17,14 @@ namespace boost { namespace mysql { namespace test { -inline resultset_base create_resultset( +template +inline ResultsetType create_resultset( detail::resultset_encoding enc, const std::vector& types, std::uint8_t seqnum = 0 ) { - resultset_base res; + ResultsetType res; res.reset(&res, enc); // channel should just be != nullptr boost::mysql::detail::column_definition_packet coldef; for (auto type : types) diff --git a/test/unit/resultset.cpp b/test/unit/resultset.cpp index ceb9b9ee..83830b9b 100644 --- a/test/unit/resultset.cpp +++ b/test/unit/resultset.cpp @@ -5,96 +5,107 @@ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // -#include -#include -#include -#include -#include +#include #include +#include "boost/mysql/detail/protocol/common_messages.hpp" +#include "boost/mysql/detail/protocol/constants.hpp" +#include "boost/mysql/detail/protocol/resultset_encoding.hpp" +#include "boost/mysql/field_type.hpp" +#include "create_resultset.hpp" +#include "test_channel.hpp" #include "test_stream.hpp" -using resultset_t = boost::mysql::resultset_base; -using chan_t = boost::mysql::detail::channel; +using namespace boost::mysql::test; +using resultset_t = boost::mysql::resultset; +using boost::mysql::field_type; +using boost::mysql::detail::ok_packet; +using boost::mysql::detail::resultset_encoding; +using boost::mysql::detail::protocol_field_type; +using boost::mysql::detail::column_definition_packet; + +namespace +{ BOOST_AUTO_TEST_SUITE(test_resultset) -// default ctor +test_channel chan = create_channel(); + BOOST_AUTO_TEST_CASE(default_ctor) { resultset_t r; BOOST_TEST(!r.valid()); } -// move ctor +BOOST_AUTO_TEST_CASE(member_fns) +{ + // Construction + resultset_t r; + test_channel chan = create_channel(); + BOOST_TEST(!r.valid()); + + // Reset + r.reset(&chan, resultset_encoding::binary); + BOOST_TEST(r.valid()); + BOOST_TEST(!r.complete()); + BOOST_TEST(r.meta().size() == 0); + + // Add meta + column_definition_packet pack {}; + pack.type = protocol_field_type::var_string; + r.add_meta(pack); + pack.type = protocol_field_type::bit; + r.add_meta(pack); + + BOOST_TEST(!r.complete()); + BOOST_TEST(r.meta().size() == 2); + BOOST_TEST(r.meta()[0].type() == field_type::varchar); + BOOST_TEST(r.meta()[1].type() == field_type::bit); + + // Complete the resultset + r.complete(ok_packet{}); + BOOST_TEST(r.complete()); + + // Reset + r.reset(&chan, resultset_encoding::binary); + BOOST_TEST(r.valid()); + BOOST_TEST(!r.complete()); + BOOST_TEST(r.meta().size() == 0); +} + BOOST_AUTO_TEST_CASE(move_ctor_from_invalid) { resultset_t r1; resultset_t r2 (std::move(r1)); - BOOST_TEST(!r1.valid()); BOOST_TEST(!r2.valid()); } BOOST_AUTO_TEST_CASE(move_ctor_from_valid) { - chan_t chan; - resultset_t r1 (chan, {}, {}); + auto r1 = create_resultset(resultset_encoding::binary, { protocol_field_type::varchar }); resultset_t r2 (std::move(r1)); - BOOST_TEST(!r1.valid()); BOOST_TEST(r2.valid()); + BOOST_TEST(!r2.complete()); + BOOST_TEST(r2.meta().size() == 1); } -// move assignment -BOOST_AUTO_TEST_CASE(move_assign_invalid_to_invalid) +BOOST_AUTO_TEST_CASE(move_assign_from_invalid) { resultset_t r1; - resultset_t r2; + auto r2 = create_resultset(resultset_encoding::text, { protocol_field_type::bit }); r2 = std::move(r1); - BOOST_TEST(!r1.valid()); BOOST_TEST(!r2.valid()); } -BOOST_AUTO_TEST_CASE(move_assign_invalid_to_valid) +BOOST_AUTO_TEST_CASE(move_assign_from_valid) { - chan_t chan; - resultset_t r1; - resultset_t r2 (chan, {}, {}); + auto r1 = create_resultset(resultset_encoding::binary, { protocol_field_type::varchar }); + auto r2 = create_resultset(resultset_encoding::text, { protocol_field_type::bit }); r2 = std::move(r1); - BOOST_TEST(!r1.valid()); - BOOST_TEST(!r2.valid()); -} - -BOOST_AUTO_TEST_CASE(move_assign_valid_to_invalid) -{ - chan_t chan; - resultset_t r1 (chan, {}, {}); - resultset_t r2; - r2 = std::move(r1); - BOOST_TEST(!r1.valid()); BOOST_TEST(r2.valid()); + BOOST_TEST(!r2.complete()); + BOOST_TEST(r2.meta().size() == 1); } -BOOST_AUTO_TEST_CASE(move_assign_valid_to_valid) -{ - chan_t chan; - resultset_t r1 (chan, {}, {}); - resultset_t r2 (chan, {}, {}); - r2 = std::move(r1); - BOOST_TEST(!r1.valid()); - BOOST_TEST(r2.valid()); -} +BOOST_AUTO_TEST_SUITE_END() -// rebind executor -BOOST_AUTO_TEST_CASE(rebind_executor) -{ - using other_executor = boost::asio::strand; - using rebound_type = boost::mysql::tcp_resultset::rebind_executor::other; - using expected_type = boost::mysql::resultset_base< - boost::asio::basic_stream_socket< - boost::asio::ip::tcp, - other_executor - > - >; - BOOST_TEST((std::is_same::value)); } - -BOOST_AUTO_TEST_SUITE_END() // test_resultset