diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 6b179e1..bf59485 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -252,6 +252,7 @@ run sv_construct_test.cpp ; run sv_element_access_test.cpp ; run sv_modifiers_test.cpp ; run sv_copy_test.cpp ; +run sv_substr_test.cpp ; use-project /boost/core/swap : ./swap ; build-project ./swap ; diff --git a/test/sv_substr_test.cpp b/test/sv_substr_test.cpp new file mode 100644 index 0000000..666aebf --- /dev/null +++ b/test/sv_substr_test.cpp @@ -0,0 +1,203 @@ +// Copyright 2021 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include + +int main() +{ + { + boost::core::string_view sv; + + { + boost::core::string_view sv2 = sv.substr(); + + BOOST_TEST_EQ( sv2.data(), sv.data() ); + BOOST_TEST_EQ( sv2.size(), sv.size() ); + } + + { + boost::core::string_view sv2 = sv.substr( 0 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() ); + BOOST_TEST_EQ( sv2.size(), sv.size() ); + } + + BOOST_TEST_THROWS( sv.substr( 1 ), std::out_of_range ); + BOOST_TEST_THROWS( sv.substr( boost::core::string_view::npos ), std::out_of_range ); + + { + boost::core::string_view sv2 = sv.substr( 0, 1 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() ); + BOOST_TEST_EQ( sv2.size(), sv.size() ); + } + + { + boost::core::string_view sv2 = sv.substr( 0, 0 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() ); + BOOST_TEST_EQ( sv2.size(), sv.size() ); + } + + BOOST_TEST_THROWS( sv.substr( 1, 0 ), std::out_of_range ); + BOOST_TEST_THROWS( sv.substr( boost::core::string_view::npos, 0 ), std::out_of_range ); + } + + { + boost::core::string_view sv( "12345" ); + + { + boost::core::string_view sv2 = sv.substr(); + + BOOST_TEST_EQ( sv2.data(), sv.data() ); + BOOST_TEST_EQ( sv2.size(), sv.size() ); + } + + { + boost::core::string_view sv2 = sv.substr( 0 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() ); + BOOST_TEST_EQ( sv2.size(), sv.size() ); + } + + { + boost::core::string_view sv2 = sv.substr( 2 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 2 ); + BOOST_TEST_EQ( sv2.size(), sv.size() - 2 ); + } + + { + boost::core::string_view sv2 = sv.substr( 5 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 5 ); + BOOST_TEST_EQ( sv2.size(), sv.size() - 5 ); + } + + BOOST_TEST_THROWS( sv.substr( 6 ), std::out_of_range ); + BOOST_TEST_THROWS( sv.substr( boost::core::string_view::npos ), std::out_of_range ); + + { + boost::core::string_view sv2 = sv.substr( 0, 0 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() ); + BOOST_TEST_EQ( sv2.size(), 0 ); + } + + { + boost::core::string_view sv2 = sv.substr( 2, 0 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 2 ); + BOOST_TEST_EQ( sv2.size(), 0 ); + } + + { + boost::core::string_view sv2 = sv.substr( 5, 0 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 5 ); + BOOST_TEST_EQ( sv2.size(), 0 ); + } + + BOOST_TEST_THROWS( sv.substr( 6, 0 ), std::out_of_range ); + BOOST_TEST_THROWS( sv.substr( boost::core::string_view::npos, 0 ), std::out_of_range ); + + { + boost::core::string_view sv2 = sv.substr( 0, 3 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() ); + BOOST_TEST_EQ( sv2.size(), 3 ); + } + + { + boost::core::string_view sv2 = sv.substr( 2, 3 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 2 ); + BOOST_TEST_EQ( sv2.size(), 3 ); + } + + { + boost::core::string_view sv2 = sv.substr( 4, 3 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 4 ); + BOOST_TEST_EQ( sv2.size(), 1 ); + } + + { + boost::core::string_view sv2 = sv.substr( 5, 3 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 5 ); + BOOST_TEST_EQ( sv2.size(), 0 ); + } + + BOOST_TEST_THROWS( sv.substr( 6, 3 ), std::out_of_range ); + BOOST_TEST_THROWS( sv.substr( boost::core::string_view::npos, 3 ), std::out_of_range ); + + { + boost::core::string_view sv2 = sv.substr( 0, 5 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() ); + BOOST_TEST_EQ( sv2.size(), 5 ); + } + + { + boost::core::string_view sv2 = sv.substr( 2, 5 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 2 ); + BOOST_TEST_EQ( sv2.size(), 3 ); + } + + { + boost::core::string_view sv2 = sv.substr( 4, 5 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 4 ); + BOOST_TEST_EQ( sv2.size(), 1 ); + } + + { + boost::core::string_view sv2 = sv.substr( 5, 5 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 5 ); + BOOST_TEST_EQ( sv2.size(), 0 ); + } + + BOOST_TEST_THROWS( sv.substr( 6, 5 ), std::out_of_range ); + BOOST_TEST_THROWS( sv.substr( boost::core::string_view::npos, 5 ), std::out_of_range ); + + { + boost::core::string_view sv2 = sv.substr( 0, 8 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() ); + BOOST_TEST_EQ( sv2.size(), 5 ); + } + + { + boost::core::string_view sv2 = sv.substr( 2, 8 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 2 ); + BOOST_TEST_EQ( sv2.size(), 3 ); + } + + { + boost::core::string_view sv2 = sv.substr( 4, 8 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 4 ); + BOOST_TEST_EQ( sv2.size(), 1 ); + } + + { + boost::core::string_view sv2 = sv.substr( 5, 8 ); + + BOOST_TEST_EQ( sv2.data(), sv.data() + 5 ); + BOOST_TEST_EQ( sv2.size(), 0 ); + } + + BOOST_TEST_THROWS( sv.substr( 6, 8 ), std::out_of_range ); + BOOST_TEST_THROWS( sv.substr( boost::core::string_view::npos, 8 ), std::out_of_range ); + } + + return boost::report_errors(); +}