// Copyright 2017, 2018 Peter Dimov. // Distributed under the Boost Software License, Version 1.0. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using boost::hash2::byte_type; template struct is_valid_result: boost::integral_constant::value && !boost::is_signed::value > { }; template struct is_valid_result< boost::array >: boost::integral_constant= 8> { }; template void test_result_type() { BOOST_TEST_TRAIT_TRUE((is_valid_result)); } template void test_size_type() { BOOST_TEST_TRAIT_TRUE((boost::is_integral)); BOOST_TEST_EQ( std::numeric_limits::min(), 0 ); BOOST_TEST_GE( std::numeric_limits::max(), 0xFFFFFFFFu ); } template void test_default_constructible() { H h1; typename H::result_type r1 = h1.result(); H h2; typename H::result_type r2 = h2.result(); BOOST_TEST( r1 == r2 ); } template void test_seed_constructible() { byte_type const seed[ 3 ] = { 0x01, 0x02, 0x03 }; { H h1; H h2( static_cast( 0 ), 0 ); BOOST_TEST( h1.result() == h2.result() ); } { H h1; H h2( seed, 0 ); BOOST_TEST( h1.result() == h2.result() ); } { H h1; H h2( seed, 3 ); BOOST_TEST( h1.result() != h2.result() ); } { H h1( seed, 3 ); H h2( seed, 3 ); BOOST_TEST( h1.result() == h2.result() ); } { H h1( seed, 2 ); H h2( seed, 3 ); BOOST_TEST( h1.result() != h2.result() ); } } template void test_copy_constructible() { byte_type const seed[ 3 ] = { 0x01, 0x02, 0x03 }; { H h1; H h2( h1 ); BOOST_TEST( h1.result() == h2.result() ); } { H h1( seed, 3 ); H h2( h1 ); BOOST_TEST( h1.result() == h2.result() ); } { H h1; h1.update( seed, 3 ); H h2( h1 ); BOOST_TEST( h1.result() == h2.result() ); } } template void test_update() { byte_type const data[ 3 ] = {}; { H h1; H h2; h2.update( data, 3 ); BOOST_TEST( h1.result() != h2.result() ); } { H h1; h1.update( data, 3 ); H h2; h2.update( data, 3 ); BOOST_TEST( h1.result() == h2.result() ); } { H h1; h1.update( data, 3 ); H h2; h2.update( data, 2 ); BOOST_TEST( h1.result() != h2.result() ); } { H h1; h1.update( data, 3 ); H h2( h1 ); h1.update( data, 3 ); h2.update( data, 3 ); BOOST_TEST( h1.result() == h2.result() ); } } template void test() { test_result_type(); test_size_type(); test_default_constructible(); test_seed_constructible(); test_copy_constructible(); test_update(); } int main() { test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); return boost::report_errors(); }