From 61d5ebc0af4ddf61111dfe118fd213534027229d Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Fri, 2 May 2014 06:33:21 -0700 Subject: [PATCH] Test EXPECT_THROW_MSG. --- CMakeLists.txt | 8 +++-- test/assert-test.cc | 82 +++++++++++++++++++++++++++++++++++++++++++++ test/format-test.cc | 13 ------- test/format-test.h | 18 +++++----- test/test-main.cc | 44 ++++++++++++++++++++++++ 5 files changed, 141 insertions(+), 24 deletions(-) create mode 100644 test/assert-test.cc create mode 100644 test/test-main.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index f9735ead..802dddfb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,13 +82,15 @@ endif () enable_testing() include_directories(.) -add_executable(format-test test/format-test.cc) -target_link_libraries(format-test format gtest) + +add_library(test-main test/test-main.cc) + +cxx_test(assert-test "gtest;test-main") +cxx_test(format-test "format;gtest;test-main") if (CMAKE_COMPILER_IS_GNUCXX) set_target_properties(format-test PROPERTIES COMPILE_FLAGS "-Wall -Wextra -pedantic -Wno-long-long -Wno-variadic-macros") endif () -add_test(format-test format-test) if (HAVE_STD_CPP11_FLAG) set_target_properties(format-test PROPERTIES COMPILE_FLAGS "-std=c++11") endif () diff --git a/test/assert-test.cc b/test/assert-test.cc new file mode 100644 index 00000000..45612538 --- /dev/null +++ b/test/assert-test.cc @@ -0,0 +1,82 @@ +/* + Tests of custom gtest assertions. + + Copyright (c) 2012-2014, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "format-test.h" + +#include +#include + +namespace { + +// Tests that assertion macros evaluate their arguments exactly once. +class SingleEvaluationTest : public ::testing::Test { + protected: + SingleEvaluationTest() { + a_ = 0; + } + + static int a_; +}; + +int SingleEvaluationTest::a_; + +void ThrowException() { + throw std::runtime_error("test"); +} + +// Tests that assertion arguments are evaluated exactly once. +TEST_F(SingleEvaluationTest, ExceptionTests) { + // successful EXPECT_THROW_MSG + EXPECT_THROW_MSG({ // NOLINT + a_++; + ThrowException(); + }, std::exception, "test"); + EXPECT_EQ(1, a_); + + // failed EXPECT_THROW_MSG, throws different type + EXPECT_NONFATAL_FAILURE(EXPECT_THROW_MSG({ // NOLINT + a_++; + ThrowException(); + }, std::logic_error, "test"), "throws a different type"); + EXPECT_EQ(2, a_); + + // failed EXPECT_THROW_MSG, throws an exception with different message + EXPECT_NONFATAL_FAILURE(EXPECT_THROW_MSG({ // NOLINT + a_++; + ThrowException(); + }, std::exception, "other"), "throws an exception with a different message"); + EXPECT_EQ(3, a_); + + // failed EXPECT_THROW_MSG, throws nothing + EXPECT_NONFATAL_FAILURE( + EXPECT_THROW_MSG(a_++, std::exception, "test"), "throws nothing"); + EXPECT_EQ(4, a_); +} + +// TODO: more tests + +} // namespace diff --git a/test/format-test.cc b/test/format-test.cc index f1a8ff75..af466051 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -40,7 +40,6 @@ // Check if format.h compiles with windows.h included. #ifdef _WIN32 # include -# include #endif #if FMT_USE_DUP @@ -1872,15 +1871,3 @@ TEST(StrTest, Convert) { std::string s = str(Date(2012, 12, 9)); EXPECT_EQ("2012-12-9", s); } - -int main(int argc, char **argv) { -#ifdef _WIN32 - // Disable message boxes on assertion failures. - _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); - _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); - _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); - _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); -#endif - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/format-test.h b/test/format-test.h index bc99a1e1..0e6f19b3 100644 --- a/test/format-test.h +++ b/test/format-test.h @@ -29,36 +29,38 @@ #define FMT_TEST_THROW_(statement, expected_exception, expected_message, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::ConstCharPtr gtest_msg = "") { \ + if (::testing::AssertionResult gtest_ar = ::testing::AssertionSuccess()) { \ bool gtest_caught_expected = false; \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (expected_exception const& e) { \ + if (expected_message != std::string(e.what())) { \ + gtest_ar << "Statement throws an exception with a different message\n" \ + << "Expected: " << expected_message << "\n" \ + << " Actual: " << e.what() << "\n"; \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ + } \ gtest_caught_expected = true; \ - EXPECT_EQ(expected_message, std::string(e.what())); \ } \ catch (...) { \ - gtest_msg.value = \ + gtest_ar << \ "Expected: " #statement " throws an exception of type " \ #expected_exception ".\n Actual: it throws a different type."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ } \ if (!gtest_caught_expected) { \ - gtest_msg.value = \ + gtest_ar << \ "Expected: " #statement " throws an exception of type " \ #expected_exception ".\n Actual: it throws nothing."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ - fail(gtest_msg.value) + fail(gtest_ar.failure_message()) // Tests that the statement throws the expected exception and the exception's // what() method returns expected message. #define EXPECT_THROW_MSG(statement, expected_exception, expected_message) \ FMT_TEST_THROW_(statement, expected_exception, \ expected_message, GTEST_NONFATAL_FAILURE_) - -// TODO: test - diff --git a/test/test-main.cc b/test/test-main.cc new file mode 100644 index 00000000..f4f2e789 --- /dev/null +++ b/test/test-main.cc @@ -0,0 +1,44 @@ +/* + Tests of additional gtest macros. + + Copyright (c) 2012-2014, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#ifdef _WIN32 +# include +#endif + +int main(int argc, char **argv) { +#ifdef _WIN32 + // Disable message boxes on assertion failures. + _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); + _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); +#endif + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}