You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
4.3 KiB
Plaintext
202 lines
4.3 KiB
Plaintext
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkTestUtilities.h
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
#ifndef vtkTestConditionals_txx
|
|
#define vtkTestConditionals_txx
|
|
|
|
namespace vtk
|
|
{
|
|
|
|
/**\brief Conditionals for use in unit tests.
|
|
*
|
|
* These templated functions all return boolean values: true
|
|
* when the test passes and false when the test fails.
|
|
*
|
|
* Each prints out a message string you pass to it followed
|
|
* either by "ok" or "failed".
|
|
* If the string is empty, no message is printed.
|
|
*/
|
|
//@{
|
|
/**\brief Return true when \a a and \a b are equal; false otherwise.
|
|
*
|
|
* This tests for exact equality, so it is generally unwise to
|
|
* use this for floating point number comparison.
|
|
*/
|
|
template <typename T>
|
|
inline bool testEqual(const T& a, const T& b, const std::string& msg)
|
|
{
|
|
bool print = !msg.empty();
|
|
if (print)
|
|
{
|
|
std::cout << msg << ": ";
|
|
}
|
|
if (a == b)
|
|
{
|
|
if (print)
|
|
{
|
|
std::cout << "ok\n";
|
|
}
|
|
return true;
|
|
}
|
|
if (print)
|
|
{
|
|
std::cout << "failed\n";
|
|
}
|
|
std::cerr << " ERROR: " << a << " != " << b << "\n";
|
|
return false;
|
|
}
|
|
|
|
template <typename T>
|
|
inline bool testNotEqual(const T& a, const T& b, const std::string& msg)
|
|
{
|
|
bool print = !msg.empty();
|
|
if (print)
|
|
{
|
|
std::cout << msg << ": ";
|
|
}
|
|
if (a != b)
|
|
{
|
|
if (print)
|
|
{
|
|
std::cout << "ok\n";
|
|
}
|
|
return true;
|
|
}
|
|
if (print)
|
|
{
|
|
std::cout << "failed\n";
|
|
}
|
|
std::cerr << " ERROR: " << a << " == " << b << "\n";
|
|
return false;
|
|
}
|
|
|
|
template <typename T>
|
|
inline bool testNotNull(const T& a, const std::string& msg)
|
|
{
|
|
bool print = !msg.empty();
|
|
if (print)
|
|
{
|
|
std::cout << msg << ": ";
|
|
}
|
|
if (a != nullptr)
|
|
{
|
|
if (print)
|
|
{
|
|
std::cout << "ok\n";
|
|
}
|
|
return true;
|
|
}
|
|
if (print)
|
|
{
|
|
std::cout << "failed\n";
|
|
}
|
|
std::cerr << " ERROR: NULL pointer\n";
|
|
return false;
|
|
}
|
|
|
|
/**\brief Test two values for equality to within a tolerance.
|
|
*
|
|
* This test is useful for floating-point values.
|
|
* It also has specializations for vtkVector2d and vtkVector3d that
|
|
* make it useful for comparing points or vectors.
|
|
*
|
|
* It can be used for any type where a subtraction operator
|
|
* exists whose return value is implicitly castable to a
|
|
* double-precision number.
|
|
*
|
|
* The threshold (whose default is 1e-8) is an absolute number;
|
|
* no normalization relative to the input values \a a and \a b
|
|
* is done.
|
|
*/
|
|
template <typename T>
|
|
inline bool testNearlyEqual(const T& a, const T& b, const std::string& msg, double thresh = 1e-8)
|
|
{
|
|
bool print = !msg.empty();
|
|
if (print)
|
|
{
|
|
std::cout << msg << ": ";
|
|
}
|
|
double diff = a - b;
|
|
if (std::abs(diff) < thresh)
|
|
{
|
|
if (print)
|
|
{
|
|
std::cout << "ok\n";
|
|
}
|
|
return true;
|
|
}
|
|
if (print)
|
|
{
|
|
std::cout << "failed\n";
|
|
}
|
|
std::cerr << " ERROR: abs(" << a << " - " << b << " = " << diff << ") > " << thresh << "\n";
|
|
return false;
|
|
}
|
|
|
|
template <>
|
|
inline bool testNearlyEqual(
|
|
const vtkVector2d& a, const vtkVector2d& b, const std::string& msg, double thresh)
|
|
{
|
|
bool print = !msg.empty();
|
|
if (print)
|
|
{
|
|
std::cout << msg << ": ";
|
|
}
|
|
double diff = (a - b).Norm();
|
|
if (std::abs(diff) < thresh)
|
|
{
|
|
if (print)
|
|
{
|
|
std::cout << "ok\n";
|
|
}
|
|
return true;
|
|
}
|
|
if (print)
|
|
{
|
|
std::cout << "failed\n";
|
|
}
|
|
std::cerr << " ERROR: abs(" << a << " - " << b << " = " << diff << ") > " << thresh << "\n";
|
|
return false;
|
|
}
|
|
|
|
template <>
|
|
inline bool testNearlyEqual(
|
|
const vtkVector3d& a, const vtkVector3d& b, const std::string& msg, double thresh)
|
|
{
|
|
bool print = !msg.empty();
|
|
if (print)
|
|
{
|
|
std::cout << msg << ": ";
|
|
}
|
|
double diff = (a - b).Norm();
|
|
if (std::abs(diff) < thresh)
|
|
{
|
|
if (print)
|
|
{
|
|
std::cout << "ok\n";
|
|
}
|
|
return true;
|
|
}
|
|
if (print)
|
|
{
|
|
std::cout << "failed\n";
|
|
}
|
|
std::cerr << " ERROR: abs(" << a << " - " << b << " = " << diff << ") > " << thresh << "\n";
|
|
return false;
|
|
}
|
|
|
|
} // namespace vtk
|
|
|
|
#endif // vtkTestConditionals_txx
|