Boost logo

Boost Users :

Subject: [Boost-users] Why does BOOST_TEST() treat std::string as a collection?
From: Brad Spencer (bspencer_at_[hidden])
Date: 2015-12-17 14:37:18


Why does BOOST_TEST() compare std::string values as collections instead
of scalars (by default)? It's odd that the following produce different
output, for example:

BOOST_TEST(std::string("a") == "b");
BOOST_TEST(std::string("a") == std::string("b"));

This will output:

test.cc(6): error: in "test": check std::string("a") == "b" has failed
[a != b]
test.cc(7): error: in "test": check std::string("a") == std::string("b")
has failed

Note the lack of "[a != b]" on the second case. Also note that
BOOST_CHECK_EQUAL() would emit as in the first form.

This seems to be because std::string is_forward_iterable, and thus falls
into the collection_comparison_op.hpp comparators instead of the scalar
comparators. Is this intentional or an oversight?

As a simple fix, adding a condition to the partial specialization of the
collection_comparison_op.hpp comparators that specifically excludes
std::string is enough to have std::string treated as scalars. For
example, to handle std::string but not std::wstring with C++11 support:

template<typename Lhs,typename Rhs>
struct name<Lhs,Rhs,typename boost::enable_if_c<
     unit_test::is_forward_iterable<Lhs>::value &&
     unit_test::is_forward_iterable<Rhs>::value &&
     !(std::is_same<typename std::decay<Lhs>::type, std::string>::value
      || std::is_same<typename std::decay<Rhs>::type, std::string>::value)
>::type

(The above is an example and not a complete change supporting
std::wstring and C++98.)

-- 
Brad Spencer

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net