I am using following example from here
Consider I have following class
#include <iostream>
class Distance {
private:
int feet;
int inches;
public:
Distance() : feet(), inches() {}
Distance(int f, int i) : feet(f), inches(i) {}
friend std::ostream &operator<<( std::ostream &output, const Distance &D )
{
output << "F : " << D.feet << " I : " << D.inches;
return output;
}
friend std::istream &operator>>( std::istream &input, Distance &D )
{
input >> D.feet >> D.inches;
return input;
}
};
I am using Gtest to test this class.
But I could not find better way to test it.
I can use the macro provided in gtest ASSERT_NO_THROW
, but it will not validate the values.
Is there any way I can use EXPECT_EQ
instead?
Thanks
Is there any way I can use EXPECT_EQ instead?
You can use a stringstream
to print the results of operator<<
to a string, then compare the string.
https://en.cppreference.com/w/cpp/io/basic_stringstream
TEST( Distance, Output )
{
std::ostringstream out;
Distance d;
out << d;
EXPECT_EQ( "F:0 I:0", out.str() );
}
Input test would be similar, just use std::istringtream
instead.
What do you want to test about the operators?
That the stream is in a good state after writing to or reading from it.
You can check for that.
That the output operator writes a particular string for a particular distance.
You can do this by writing into a std::ostringstream
and comparing the result of calling its str()
member with your expectations.
That the input iterator reads a particular distance from a particular string.
You can do this employing a std::istringstream
initialized with the string, comparing the distance read from it with what you expect.
That the class eats its own dog food.
Use a std::stringstream
to write into, then read from it, and compare what you read with what you wrote.
Note: This will currently fail.