diff --git a/include/turtle/matcher.hpp b/include/turtle/matcher.hpp index 7854d77..3bd9923 100644 --- a/include/turtle/matcher.hpp +++ b/include/turtle/matcher.hpp @@ -39,7 +39,12 @@ class matcher { public: explicit matcher(const char* expected) : expected_(expected) {} - bool operator()(const char* actual) { return std::strcmp(actual, expected_) == 0; } + bool operator()(const char* actual) + { + if(!actual || !expected_) + return actual == expected_; + return std::strcmp(actual, expected_) == 0; + } friend std::ostream& operator<<(std::ostream& s, const matcher& m) { return s << mock::format(m.expected_); } private: diff --git a/include/turtle/stream.hpp b/include/turtle/stream.hpp index 52991ed..979e6a7 100644 --- a/include/turtle/stream.hpp +++ b/include/turtle/stream.hpp @@ -106,7 +106,13 @@ namespace detail { { s << '"' << str << '"'; } - inline void serialize(stream& s, const char* const str) { s << '"' << str << '"'; } + inline void serialize(stream& s, const char* const str) + { + if(str) + s << '"' << str << '"'; + else + s << "nullptr"; + } inline void serialize(stream& s, unsigned char c) { s << static_cast(c); } } // namespace detail } // namespace mock diff --git a/test/test_constraints.cpp b/test/test_constraints.cpp index 11c43fd..92157df 100644 --- a/test/test_constraints.cpp +++ b/test/test_constraints.cpp @@ -80,6 +80,15 @@ BOOST_AUTO_TEST_CASE(equal_constraint_deref) } } +BOOST_AUTO_TEST_CASE(equal_null_c_string) +{ + const char* const null_str = nullptr; + + BOOST_CHECK(mock::equal(null_str).c_(null_str)); + BOOST_CHECK(!mock::equal(null_str).c_("non-null string")); + BOOST_CHECK(!mock::equal("non-null-string").c_(null_str)); +} + BOOST_AUTO_TEST_CASE(same_constraint) { { diff --git a/test/test_log.cpp b/test/test_log.cpp index c26d3bb..94db5c4 100644 --- a/test/test_log.cpp +++ b/test/test_log.cpp @@ -89,6 +89,13 @@ BOOST_AUTO_TEST_CASE(strings_are_serialized_with_double_quotes) BOOST_CHECK_EQUAL("\"string\"", to_string(std::string("string"))); } +BOOST_AUTO_TEST_CASE(null_c_strings_are_serialized_to_nullptr) +{ + const char* const null_str = nullptr; + BOOST_CHECK_EQUAL("nullptr", to_string(null_str)); + BOOST_CHECK_EQUAL("\"nullptr\"", to_string("nullptr")); +} + namespace { struct non_serializable {}; diff --git a/test/test_matcher.cpp b/test/test_matcher.cpp index cc98be0..547ecaa 100644 --- a/test/test_matcher.cpp +++ b/test/test_matcher.cpp @@ -75,6 +75,14 @@ BOOST_FIXTURE_TEST_CASE(const_char_pointer_and_std_string_can_be_compared, fixtu BOOST_CHECK(!match(std::string("different text"), actual)); } +BOOST_AUTO_TEST_CASE(null_const_char_pointers_can_be_compared) +{ + const char* const null_str = nullptr; + BOOST_CHECK(match(null_str, null_str)); + BOOST_CHECK(!match(null_str, "non-null string")); + BOOST_CHECK(!match("non-null string", null_str)); +} + namespace { template std::string serialize(const T& t)