forked from boostorg/container_hash
Change hash_float_test to write out some false failures instead of failing.
[SVN r28393]
This commit is contained in:
11
test/Jamfile
11
test/Jamfile
@@ -19,13 +19,22 @@ rule hash-test ( name )
|
|||||||
] ;
|
] ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rule hash-test-output ( name )
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
run $(name).cpp
|
||||||
|
<lib>../../../test/build/boost_unit_test_framework
|
||||||
|
: : : <include>$(BOOST_ROOT) <test-info>always_show_run_output
|
||||||
|
] ;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
test-suite functional/hash
|
test-suite functional/hash
|
||||||
:
|
:
|
||||||
[ hash-test hash_number_test ]
|
[ hash-test hash_number_test ]
|
||||||
[ hash-test hash_pointer_test ]
|
[ hash-test hash_pointer_test ]
|
||||||
[ hash-test hash_function_pointer_test ]
|
[ hash-test hash_function_pointer_test ]
|
||||||
[ hash-test hash_float_test ]
|
[ hash-test-output hash_float_test ]
|
||||||
[ hash-test hash_string_test ]
|
[ hash-test hash_string_test ]
|
||||||
[ hash-test hash_range_test ]
|
[ hash-test hash_range_test ]
|
||||||
[ hash-test hash_custom_test ]
|
[ hash-test hash_custom_test ]
|
||||||
|
@@ -13,7 +13,7 @@ test-suite functional/hash
|
|||||||
[ run hash_number_test.cpp framework ]
|
[ run hash_number_test.cpp framework ]
|
||||||
[ run hash_pointer_test.cpp framework ]
|
[ run hash_pointer_test.cpp framework ]
|
||||||
[ run hash_function_pointer_test.cpp framework ]
|
[ run hash_function_pointer_test.cpp framework ]
|
||||||
[ run hash_float_test.cpp framework ]
|
[ run hash_float_test.cpp framework : : : <test-info>always_show_run_output ]
|
||||||
[ run hash_string_test.cpp framework ]
|
[ run hash_string_test.cpp framework ]
|
||||||
[ run hash_range_test.cpp framework ]
|
[ run hash_range_test.cpp framework ]
|
||||||
[ run hash_custom_test.cpp framework ]
|
[ run hash_custom_test.cpp framework ]
|
||||||
|
@@ -20,8 +20,12 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void float_tests(T* = 0)
|
void float_tests(T* = 0, char const* name)
|
||||||
{
|
{
|
||||||
|
std::cout<<"\n"
|
||||||
|
"Testing " BOOST_STRINGIZE(HASH_NAMESPACE) "::hash<"<<name<<">\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
HASH_NAMESPACE::hash<T> x1;
|
HASH_NAMESPACE::hash<T> x1;
|
||||||
|
|
||||||
T zero = 0;
|
T zero = 0;
|
||||||
@@ -36,7 +40,9 @@ void float_tests(T* = 0)
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
// Doing anything with infinity causes borland to crash.
|
// Doing anything with infinity causes borland to crash.
|
||||||
#if !defined(__BORLANDC__)
|
#if defined(__BORLANDC__)
|
||||||
|
std::cout<<"Not running infinity checks on Borland, as it causes it to crash.\n";
|
||||||
|
#else
|
||||||
if(std::numeric_limits<T>::has_infinity) {
|
if(std::numeric_limits<T>::has_infinity) {
|
||||||
T infinity = -log(zero);
|
T infinity = -log(zero);
|
||||||
T infinity2 = (T) 1. / zero;
|
T infinity2 = (T) 1. / zero;
|
||||||
@@ -66,19 +72,28 @@ void float_tests(T* = 0)
|
|||||||
BOOST_CHECK(infinity != minus_infinity);
|
BOOST_CHECK(infinity != minus_infinity);
|
||||||
|
|
||||||
// My hash fails this one, I guess it's not that bad.
|
// My hash fails this one, I guess it's not that bad.
|
||||||
BOOST_WARN(x1(infinity) != x1(minus_infinity));
|
if(x1(infinity) == x1(minus_infinity)) {
|
||||||
|
std::cout<<"x1(infinity) == x1(-infinity) == "<<x1(infinity)<<"\n";
|
||||||
|
}
|
||||||
|
|
||||||
// This should really be 'has_denorm == denorm_present' but some
|
// This should really be 'has_denorm == denorm_present' but some
|
||||||
// compilers don't have 'denorm_present'. See also a leter use.
|
// compilers don't have 'denorm_present'. See also a later use.
|
||||||
if(std::numeric_limits<T>::has_denorm) {
|
if(std::numeric_limits<T>::has_denorm) {
|
||||||
BOOST_CHECK(x1(std::numeric_limits<T>::denorm_min()) != x1(infinity));
|
if(x1(std::numeric_limits<T>::denorm_min()) == x1(infinity)) {
|
||||||
BOOST_CHECK(x1(std::numeric_limits<T>::denorm_min()) != x1(minus_infinity));
|
std::cout<<"x1(denorm_min) == x1(infinity) == "<<x1(infinity)<<"\n";
|
||||||
|
}
|
||||||
|
if(x1(std::numeric_limits<T>::denorm_min()) == x1(minus_infinity)) {
|
||||||
|
std::cout<<"x1(denorm_min) == x1(-infinity) == "<<x1(minus_infinity)<<"\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(std::numeric_limits<T>::has_quiet_NaN) {
|
if(std::numeric_limits<T>::has_quiet_NaN) {
|
||||||
// Another two failures, should I work around this?
|
if(x1(std::numeric_limits<T>::quiet_NaN()) == x1(infinity)) {
|
||||||
BOOST_WARN(x1(std::numeric_limits<T>::quiet_NaN()) != x1(infinity));
|
std::cout<<"x1(quiet_NaN) == x1(infinity) == "<<x1(infinity)<<"\n";
|
||||||
BOOST_WARN(x1(std::numeric_limits<T>::quiet_NaN()) != x1(minus_infinity));
|
}
|
||||||
|
if(x1(std::numeric_limits<T>::quiet_NaN()) == x1(minus_infinity)) {
|
||||||
|
std::cout<<"x1(quiet_NaN) == x1(-infinity) == "<<x1(minus_infinity)<<"\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -92,7 +107,8 @@ void float_tests(T* = 0)
|
|||||||
BOOST_CHECK(x1(half_max) == HASH_NAMESPACE::hash_value(half_max));
|
BOOST_CHECK(x1(half_max) == HASH_NAMESPACE::hash_value(half_max));
|
||||||
BOOST_CHECK(x1(quarter_max) == HASH_NAMESPACE::hash_value(quarter_max));
|
BOOST_CHECK(x1(quarter_max) == HASH_NAMESPACE::hash_value(quarter_max));
|
||||||
BOOST_CHECK(x1(three_quarter_max) == HASH_NAMESPACE::hash_value(three_quarter_max));
|
BOOST_CHECK(x1(three_quarter_max) == HASH_NAMESPACE::hash_value(three_quarter_max));
|
||||||
|
|
||||||
|
// The '!=' tests could legitimately fail, but with my hash it indicates a bug.
|
||||||
BOOST_CHECK(x1(max) == x1(max));
|
BOOST_CHECK(x1(max) == x1(max));
|
||||||
BOOST_CHECK(x1(max) != x1(quarter_max));
|
BOOST_CHECK(x1(max) != x1(quarter_max));
|
||||||
BOOST_CHECK(x1(max) != x1(half_max));
|
BOOST_CHECK(x1(max) != x1(half_max));
|
||||||
@@ -117,7 +133,9 @@ void float_tests(T* = 0)
|
|||||||
|
|
||||||
// As before.
|
// As before.
|
||||||
if(std::numeric_limits<T>::has_denorm) {
|
if(std::numeric_limits<T>::has_denorm) {
|
||||||
BOOST_WARN(x1(std::numeric_limits<T>::denorm_min()) != x1(zero));
|
if(x1(std::numeric_limits<T>::denorm_min()) == x1(zero)) {
|
||||||
|
std::cout<<"x1(denorm_min) == x1(zero) == "<<x1(zero)<<"\n";
|
||||||
|
}
|
||||||
BOOST_CHECK(x1(std::numeric_limits<T>::denorm_min()) ==
|
BOOST_CHECK(x1(std::numeric_limits<T>::denorm_min()) ==
|
||||||
HASH_NAMESPACE::hash_value(std::numeric_limits<T>::denorm_min()));
|
HASH_NAMESPACE::hash_value(std::numeric_limits<T>::denorm_min()));
|
||||||
}
|
}
|
||||||
@@ -125,7 +143,9 @@ void float_tests(T* = 0)
|
|||||||
// NaN also causes borland to crash.
|
// NaN also causes borland to crash.
|
||||||
#if !defined(__BORLANDC__)
|
#if !defined(__BORLANDC__)
|
||||||
if(std::numeric_limits<T>::has_quiet_NaN) {
|
if(std::numeric_limits<T>::has_quiet_NaN) {
|
||||||
BOOST_WARN(x1(std::numeric_limits<T>::quiet_NaN()) != x1(1.0));
|
if(x1(std::numeric_limits<T>::quiet_NaN()) == x1(1.0)) {
|
||||||
|
std::cout<<"x1(quiet_NaN) == x1(1.0) == "<<x1(1.0)<<"\n";
|
||||||
|
}
|
||||||
BOOST_CHECK(x1(std::numeric_limits<T>::quiet_NaN()) ==
|
BOOST_CHECK(x1(std::numeric_limits<T>::quiet_NaN()) ==
|
||||||
HASH_NAMESPACE::hash_value(std::numeric_limits<T>::quiet_NaN()));
|
HASH_NAMESPACE::hash_value(std::numeric_limits<T>::quiet_NaN()));
|
||||||
}
|
}
|
||||||
@@ -138,15 +158,15 @@ BOOST_AUTO_UNIT_TEST(hash_float_tests)
|
|||||||
std::cout<<"Platform: "<<BOOST_PLATFORM<<"\n";
|
std::cout<<"Platform: "<<BOOST_PLATFORM<<"\n";
|
||||||
std::cout<<"Library: "<<BOOST_STDLIB<<"\n\n";
|
std::cout<<"Library: "<<BOOST_STDLIB<<"\n\n";
|
||||||
|
|
||||||
float_tests((float*) 0);
|
float_tests((float*) 0, "float");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_UNIT_TEST(hash_double_tests)
|
BOOST_AUTO_UNIT_TEST(hash_double_tests)
|
||||||
{
|
{
|
||||||
float_tests((double*) 0);
|
float_tests((double*) 0, "double");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_UNIT_TEST(hash_long_double_tests)
|
BOOST_AUTO_UNIT_TEST(hash_long_double_tests)
|
||||||
{
|
{
|
||||||
float_tests((long double*) 0);
|
float_tests((long double*) 0, "long double");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user