diff --git a/CMakeLists.txt b/CMakeLists.txt index 05f91565..acc5b9c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,7 +85,7 @@ add_library(gtest gtest/gtest-all.cc) find_package(Threads) target_link_libraries(gtest ${CMAKE_THREAD_LIBS_INIT}) -add_executable(format-test format-test.cc) +add_executable(format-test test/format-test.cc) target_link_libraries(format-test format gtest) if (CMAKE_COMPILER_IS_GNUCXX) set_target_properties(format-test PROPERTIES COMPILE_FLAGS diff --git a/format-test.cc b/test/format-test.cc similarity index 98% rename from format-test.cc rename to test/format-test.cc index 52a7005b..f1a8ff75 100644 --- a/format-test.cc +++ b/test/format-test.cc @@ -1,7 +1,7 @@ /* Formatting library tests. - Copyright (c) 2012, Victor Zverovich + Copyright (c) 2012-2014, Victor Zverovich All rights reserved. Redistribution and use in source and binary forms, with or without @@ -25,6 +25,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "format-test.h" + #include #include #include @@ -34,7 +36,6 @@ #include #include #include -#include // Check if format.h compiles with windows.h included. #ifdef _WIN32 @@ -91,38 +92,6 @@ using fmt::Writer; using fmt::WWriter; using fmt::pad; -#define FORMAT_TEST_THROW_(statement, expected_exception, message, fail) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::ConstCharPtr gtest_msg = "") { \ - bool gtest_caught_expected = false; \ - try { \ - GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ - } \ - catch (expected_exception const& e) { \ - gtest_caught_expected = true; \ - if (std::string(message) != e.what()) \ - throw; \ - } \ - catch (...) { \ - gtest_msg.value = \ - "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 = \ - "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) - -#define EXPECT_THROW_MSG(statement, expected_exception, expected_message) \ - FORMAT_TEST_THROW_(statement, expected_exception, expected_message, \ - GTEST_NONFATAL_FAILURE_) - namespace { // Checks if writing value to BasicWriter produces the same result @@ -1865,6 +1834,8 @@ TEST(FormatIntTest, FormatDec) { #ifdef FMT_USE_DUP +// TODO: implement EXPECT_PRINT + TEST(FormatTest, PrintColored) { // Temporarily redirect stdout to a file and check if PrintColored adds // necessary ANSI escape sequences. diff --git a/test/format-test.h b/test/format-test.h new file mode 100644 index 00000000..bc99a1e1 --- /dev/null +++ b/test/format-test.h @@ -0,0 +1,64 @@ +/* + Formatting library tests. + + 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 + +#define FMT_TEST_THROW_(statement, expected_exception, expected_message, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::ConstCharPtr gtest_msg = "") { \ + bool gtest_caught_expected = false; \ + try { \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + } \ + catch (expected_exception const& e) { \ + gtest_caught_expected = true; \ + EXPECT_EQ(expected_message, std::string(e.what())); \ + } \ + catch (...) { \ + gtest_msg.value = \ + "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 = \ + "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) + +// 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 +