| the Compartmented Robust Posix C++ Unit Test system |
|
|---|
When crpcut needs to display the value of an object, for example in a
violation report due to a failed
ASSERT_TRUE(expr), it defaults to
using
std::ostream& operator<<(std::ostream&, const T&)
if it is defined for the type, or a hex-dump otherwise.
Should you want to display your data types in a different format, you
can specialize the function template
void crpcut::show_value<>(std::ostream&, const T&)
to display the value in any format you prefer.
Example:
#include <crpcut.hpp>
class unstreamable {
public:
unstreamable(int i) : i_(i) {}
private:
int i_;
};
class unstreamable_special {
public:
unstreamable_special(int i) : i_(i) {}
private:
int i_;
friend void crpcut::show_value<>(std::ostream&, const unstreamable_special&);
};
class streamable_special {
public:
streamable_special(int i) : i_(i) {}
private:
int i_;
friend std::ostream &operator<<(std::ostream &os,
const streamable_special &obj)
{
return os << "stream(" << obj.i_ << ")";
}
friend void crpcut::show_value<>(std::ostream &, const streamable_special&);
};
namespace crpcut { // for specializations of crpcut::show_value<>()
template <>
void show_value(std::ostream &os, const unstreamable_special &obj)
{
os << "special(" << obj.i_ << ")";
}
template <>
void show_value(std::ostream &os, const streamable_special &obj)
{
os << "streamable_special(" << obj.i_ << ")";
}
}
TEST(show_it_all)
{
int i(0);
unstreamable u(1);
unstreamable_special us(2);
streamable_special ss(3);
INFO << "i=" << i; // default stream insertion
INFO << "u=" << u; // hex dump
INFO << "us=" << us; // specialized
INFO << "ss=" << ss; // specialized
std::ostringstream os;
os << ss;
INFO << "ss from std::ostream = " << os.str(); // default stream insertion
}
int main(int argc, char *argv[])
{
return crpcut::run(argc, argv);
}
The result from running the example program is:
PASSED!: show_it_all
info---------------------------------------------------------------------------
i=0
-------------------------------------------------------------------------------
info---------------------------------------------------------------------------
u=4-byte object <0100 0000>
-------------------------------------------------------------------------------
info---------------------------------------------------------------------------
us=special(2)
-------------------------------------------------------------------------------
info---------------------------------------------------------------------------
ss=streamable_special(3)
-------------------------------------------------------------------------------
info---------------------------------------------------------------------------
ss from std::ostream = stream(3)
===============================================================================
1 test cases selected
Sum Critical Non-critical
PASSED : 1 1 0
As can be seen, the specialized
crpcut::show_value<T>()
is preferred when both it and the normal stream insertion operator are
available.