The Catch2 framework has the concept of SECTIONs, which seem to make unit test code more readable. To get a feeling for how much easier writing certain tests would be in Catch2 vs GoogleTest, I am trying to come up with the best way to translate the given Catch2 sample code
#include <catch2/catch_test_macros.hpp>
TEST_CASE( "vectors can be sized and resized", "[vector]" ) {
std::vector<int> v{1, 2, 3, 4, 5};
REQUIRE(v.size() == 5);
REQUIRE(v.capacity() == 5);
SECTION( "A) reserving bigger changes capacity but not size" )
{
v.reserve(10);
REQUIRE(v.size() == 5);
REQUIRE(v.capacity() >= 10);
SECTION( "A.1) reserving down unused capacity does not change capacity" )
{
v.reserve(7);
REQUIRE(v.size() == 5);
REQUIRE(v.capacity() >= 10);
}
v[0] = 42;
SECTION( "A.2) shrink_to_fit is a non binding request to reduce capacity() to size()")
{
v.shrink_to_fit();
REQUIRE(v.capacity() >= v.size());
}
}
}
to GoogleTest. I currently have
#include <gtest/gtest.h>
#include <vector>
class VectorTest : public ::testing::Test
{
protected:
void SetUp() override
{
EXPECT_EQ(v.size(), 5);
EXPECT_EQ(v.capacity(), 5);
}
std::vector<int> v{1, 2, 3, 4, 5};
};
TEST_F(VectorTest, SectionA1)
{
// reserving bigger changes capacity but not size
v.reserve(10);
EXPECT_EQ(v.size(), 5);
EXPECT_GE(v.capacity(), 10);
// reserving down unused capacity does not change capacity
v.reserve(7);
EXPECT_EQ(v.size(), 5);
EXPECT_GE(v.capacity(), 10);
v[0] = 42;
}
TEST_F(VectorTest, SectionA2)
{
// reserving bigger changes capacity but not size
v.reserve(10);
EXPECT_EQ(v.size(), 5);
EXPECT_GE(v.capacity(), 10);
v[0] = 42;
// shrink_to_fit is a non binding request to reduce capacity() to size()
v.shrink_to_fit();
EXPECT_GE(v.capacity(), v.size());
}
which seems to be a bit more verbose and less readable than the Catch2 code.
I'm wondering if there are other more elegant/readable/shorter ways to do it?
If 'no', then this would be an argument for using Catch2.
The same behavior can be achieved with test fixtures.