diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index df51e4d..f9b51a0 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -132,6 +132,8 @@ boost_test(TYPE run SOURCES std_interop_test15.cpp) boost_test(TYPE run SOURCES win32_generic_test.cpp) +boost_test(TYPE run SOURCES ec_hash_value_test.cpp) + # result set(BOOST_TEST_COMPILE_FEATURES cxx_std_11) diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 306c5b4..e34af4b 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -160,6 +160,8 @@ run std_interop_test15.cpp ; run win32_generic_test.cpp ; +run ec_hash_value_test.cpp ; + # result import ../../config/checks/config : requires ; diff --git a/test/ec_hash_value_test.cpp b/test/ec_hash_value_test.cpp new file mode 100644 index 0000000..0a59b6f --- /dev/null +++ b/test/ec_hash_value_test.cpp @@ -0,0 +1,132 @@ +// Copyright 2022 Peter Dimov. +// Distributed under the Boost Software License, Version 1.0. +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +#if defined(BOOST_SYSTEM_HAS_SYSTEM_ERROR) +#include +#endif + +namespace sys = boost::system; + +int main() +{ + // normal against normal (equal, system) + { + sys::error_code e2( 0, sys::system_category() ); + sys::error_code e3( e2.value(), e2.category() ); + + BOOST_TEST( e2 != e3 || hash_value( e2 ) == hash_value( e3 ) ); + BOOST_TEST( e2 == e3 || hash_value( e2 ) != hash_value( e3 ) ); + } + + // normal against normal (equal, generic) + { + sys::error_code e2( EINVAL, sys::generic_category() ); + sys::error_code e3( e2.value(), e2.category() ); + + BOOST_TEST( e2 != e3 || hash_value( e2 ) == hash_value( e3 ) ); + BOOST_TEST( e2 == e3 || hash_value( e2 ) != hash_value( e3 ) ); + } + + // normal against normal (inequal, value, generic) + { + sys::error_code e2( 0, sys::generic_category() ); + sys::error_code e3( EINVAL, sys::generic_category() ); + + BOOST_TEST( e2 != e3 || hash_value( e2 ) == hash_value( e3 ) ); + BOOST_TEST( e2 == e3 || hash_value( e2 ) != hash_value( e3 ) ); + } + + // normal against normal (inequal, value, system) + { + sys::error_code e2( 1, sys::system_category() ); + sys::error_code e3( 2, sys::system_category() ); + + BOOST_TEST( e2 != e3 || hash_value( e2 ) == hash_value( e3 ) ); + BOOST_TEST( e2 == e3 || hash_value( e2 ) != hash_value( e3 ) ); + } + + // normal against normal (inequal, category) + { + sys::error_code e2( 0, sys::system_category() ); + sys::error_code e3( 0, sys::generic_category() ); + + BOOST_TEST( e2 != e3 || hash_value( e2 ) == hash_value( e3 ) ); + BOOST_TEST( e2 == e3 || hash_value( e2 ) != hash_value( e3 ) ); + } + + // empty against normal + { + sys::error_code e2; + sys::error_code e3( e2.value(), e2.category() ); + + BOOST_TEST( e2 != e3 || hash_value( e2 ) == hash_value( e3 ) ); + BOOST_TEST( e2 == e3 || hash_value( e2 ) != hash_value( e3 ) ); + } + +#if defined(BOOST_SYSTEM_HAS_SYSTEM_ERROR) + + // std:: wrapping against normal + { + std::error_code e1( EINVAL, std::generic_category() ); + + sys::error_code e2( e1 ); + sys::error_code e3( e2.value(), e2.category() ); + + BOOST_TEST( e2 != e3 || hash_value( e2 ) == hash_value( e3 ) ); + BOOST_TEST( e2 == e3 || hash_value( e2 ) != hash_value( e3 ) ); + } + + // empty against wrapping std:: empty + { + std::error_code e1; + + sys::error_code e2( e1 ); + sys::error_code e3; + + BOOST_TEST( e2 != e3 || hash_value( e2 ) == hash_value( e3 ) ); + BOOST_TEST( e2 == e3 || hash_value( e2 ) != hash_value( e3 ) ); + } + + // empty against roundtrip via std + { + sys::error_code e2; + + std::error_code e1( e2 ); + sys::error_code e3( e1 ); + + BOOST_TEST( e2 != e3 || hash_value( e2 ) == hash_value( e3 ) ); + BOOST_TEST( e2 == e3 || hash_value( e2 ) != hash_value( e3 ) ); + } + + // normal/generic against roundtrip via std + { + sys::error_code e2( EINVAL, boost::system::generic_category() ); + + std::error_code e1( e2 ); + sys::error_code e3( e1 ); + + BOOST_TEST( e2 != e3 || hash_value( e2 ) == hash_value( e3 ) ); + BOOST_TEST( e2 == e3 || hash_value( e2 ) != hash_value( e3 ) ); + } + + // normal/system against roundtrip via std + { + sys::error_code e2( 0, boost::system::system_category() ); + + std::error_code e1( e2 ); + sys::error_code e3( e1 ); + + BOOST_TEST( e2 != e3 || hash_value( e2 ) == hash_value( e3 ) ); + BOOST_TEST( e2 == e3 || hash_value( e2 ) != hash_value( e3 ) ); + } + +#endif + + return boost::report_errors(); +}