diff --git a/test/Jamfile b/test/Jamfile index 37a680c..9fb3bc7 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -77,6 +77,7 @@ run hash_append_range_2.cpp ; compile append_byte_sized_cx.cpp ; run append_integer_cx.cpp ; +run append_character_cx.cpp ; # non-cryptographic diff --git a/test/append_character_cx.cpp b/test/append_character_cx.cpp new file mode 100644 index 0000000..d79822e --- /dev/null +++ b/test/append_character_cx.cpp @@ -0,0 +1,57 @@ +// Copyright 2024 Peter Dimov. +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include + +#if defined(BOOST_MSVC) && BOOST_MSVC < 1920 +# pragma warning(disable: 4307) // integral constant overflow +#endif + +using namespace boost::hash2; + +template BOOST_CXX14_CONSTEXPR std::uint32_t test() +{ + T v[ 95 ] = {}; + + fnv1a_32 h; + hash_append( h, {}, v ); + + return h.result(); +} + +#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) + +#if defined(BOOST_NO_CXX14_CONSTEXPR) + +# define TEST_EQ(x1, x2) BOOST_TEST_EQ(x1, x2) + +#else + +# define TEST_EQ(x1, x2) BOOST_TEST_EQ(x1, x2); STATIC_ASSERT(x1 == x2) + +#endif + +int main() +{ + std::uint32_t const r1 = 409807047; + std::uint32_t const r2 = 4291711997; + std::uint32_t const r4 = 3226601845; + + TEST_EQ( test(), r1 ); + + TEST_EQ( test(), r2 ); + TEST_EQ( test(), r4 ); + + TEST_EQ( test(), (sizeof(wchar_t) == sizeof(std::uint16_t)? r2: r4) ); + +#if defined(__cpp_char8_t) && __cpp_char8_t >= 201811L + TEST_EQ( test(), r1 ); +#endif + + return boost::report_errors(); +}