| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  Tests of custom Google Test 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 "gtest-extra.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-03 13:14:15 -07:00
										 |  |  | #include <cstring>
 | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | #include <algorithm>
 | 
					
						
							|  |  |  | #include <stdexcept>
 | 
					
						
							|  |  |  | #include <gtest/gtest-spi.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-11 02:38:57 +04:00
										 |  |  | #if defined(_WIN32) && !defined(__MINGW32__)
 | 
					
						
							| 
									
										
										
										
											2014-05-05 08:19:35 -07:00
										 |  |  | # include <crtdbg.h>  // for _CrtSetReportMode
 | 
					
						
							|  |  |  | #endif  // _WIN32
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-24 09:16:03 -07:00
										 |  |  | #include "util.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-12 07:49:01 -07:00
										 |  |  | #ifdef __MINGW32__
 | 
					
						
							|  |  |  | # undef fileno
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | namespace { | 
					
						
							| 
									
										
										
										
											2014-05-03 12:01:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-24 09:16:03 -07:00
										 |  |  | #ifdef _MSC_VER
 | 
					
						
							| 
									
										
										
										
											2014-05-14 07:45:21 -07:00
										 |  |  | // Fix "secure" warning about using fopen without defining
 | 
					
						
							|  |  |  | // _CRT_SECURE_NO_WARNINGS.
 | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  | FILE *safe_fopen(const char *filename, const char *mode) { | 
					
						
							| 
									
										
										
										
											2014-05-15 08:58:10 -07:00
										 |  |  |   FILE *f = 0; | 
					
						
							| 
									
										
										
										
											2014-05-14 07:45:21 -07:00
										 |  |  |   errno = fopen_s(&f, filename, mode); | 
					
						
							|  |  |  |   return f; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  | #define fopen safe_fopen
 | 
					
						
							| 
									
										
										
										
											2014-05-06 12:13:16 -07:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2014-05-14 07:45:21 -07:00
										 |  |  | using std::fopen; | 
					
						
							| 
									
										
										
										
											2015-06-24 09:16:03 -07:00
										 |  |  | #endif  // _MSC_VER
 | 
					
						
							| 
									
										
										
										
											2014-05-05 17:07:21 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | // Tests that assertion macros evaluate their arguments exactly once.
 | 
					
						
							|  |  |  | class SingleEvaluationTest : public ::testing::Test { | 
					
						
							|  |  |  |  protected: | 
					
						
							|  |  |  |   SingleEvaluationTest() { | 
					
						
							| 
									
										
										
										
											2014-05-05 07:31:38 -07:00
										 |  |  |     p_ = s_; | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |     a_ = 0; | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  |     b_ = 0; | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-05-05 07:31:38 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   static const char* const s_; | 
					
						
							|  |  |  |   static const char* p_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |   static int a_; | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  |   static int b_; | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 07:31:38 -07:00
										 |  |  | const char* const SingleEvaluationTest::s_ = "01234"; | 
					
						
							|  |  |  | const char* SingleEvaluationTest::p_; | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | int SingleEvaluationTest::a_; | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  | int SingleEvaluationTest::b_; | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  | void do_nothing() {} | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  | void throw_exception() { | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |   throw std::runtime_error("test"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  | void throw_system_error() { | 
					
						
							| 
									
										
										
										
											2014-06-30 14:26:29 -07:00
										 |  |  |   throw fmt::SystemError(EDOM, "test"); | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 07:31:38 -07:00
										 |  |  | // Tests that when EXPECT_THROW_MSG fails, it evaluates its message argument
 | 
					
						
							|  |  |  | // exactly once.
 | 
					
						
							| 
									
										
										
										
											2014-05-05 08:19:35 -07:00
										 |  |  | TEST_F(SingleEvaluationTest, FailedEXPECT_THROW_MSG) { | 
					
						
							| 
									
										
										
										
											2014-05-05 07:31:38 -07:00
										 |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |       EXPECT_THROW_MSG(throw_exception(), std::exception, p_++), "01234"); | 
					
						
							| 
									
										
										
										
											2014-05-05 07:31:38 -07:00
										 |  |  |   EXPECT_EQ(s_ + 1, p_); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  | // Tests that when EXPECT_SYSTEM_ERROR fails, it evaluates its message argument
 | 
					
						
							|  |  |  | // exactly once.
 | 
					
						
							|  |  |  | TEST_F(SingleEvaluationTest, FailedEXPECT_SYSTEM_ERROR) { | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |       EXPECT_SYSTEM_ERROR(throw_system_error(), EDOM, p_++), "01234"); | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  |   EXPECT_EQ(s_ + 1, p_); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  | // Tests that when EXPECT_WRITE fails, it evaluates its message argument
 | 
					
						
							| 
									
										
										
										
											2014-05-05 08:20:01 -07:00
										 |  |  | // exactly once.
 | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  | TEST_F(SingleEvaluationTest, FailedEXPECT_WRITE) { | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							|  |  |  |       EXPECT_WRITE(stdout, std::printf("test"), p_++), "01234"); | 
					
						
							| 
									
										
										
										
											2014-05-05 08:20:01 -07:00
										 |  |  |   EXPECT_EQ(s_ + 1, p_); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | // Tests that assertion arguments are evaluated exactly once.
 | 
					
						
							|  |  |  | TEST_F(SingleEvaluationTest, ExceptionTests) { | 
					
						
							|  |  |  |   // successful EXPECT_THROW_MSG
 | 
					
						
							|  |  |  |   EXPECT_THROW_MSG({  // NOLINT
 | 
					
						
							|  |  |  |     a_++; | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     throw_exception(); | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  |   }, std::exception, (b_++, "test")); | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |   EXPECT_EQ(1, a_); | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  |   EXPECT_EQ(1, b_); | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // failed EXPECT_THROW_MSG, throws different type
 | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE(EXPECT_THROW_MSG({  // NOLINT
 | 
					
						
							|  |  |  |     a_++; | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     throw_exception(); | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  |   }, std::logic_error, (b_++, "test")), "throws a different type"); | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |   EXPECT_EQ(2, a_); | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  |   EXPECT_EQ(2, b_); | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // failed EXPECT_THROW_MSG, throws an exception with different message
 | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE(EXPECT_THROW_MSG({  // NOLINT
 | 
					
						
							|  |  |  |     a_++; | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     throw_exception(); | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  |   }, std::exception, (b_++, "other")), | 
					
						
							|  |  |  |       "throws an exception with a different message"); | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |   EXPECT_EQ(3, a_); | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  |   EXPECT_EQ(3, b_); | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // failed EXPECT_THROW_MSG, throws nothing
 | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  |       EXPECT_THROW_MSG(a_++, std::exception, (b_++, "test")), "throws nothing"); | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |   EXPECT_EQ(4, a_); | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  |   EXPECT_EQ(4, b_); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  | TEST_F(SingleEvaluationTest, SystemErrorTests) { | 
					
						
							|  |  |  |   // successful EXPECT_SYSTEM_ERROR
 | 
					
						
							|  |  |  |   EXPECT_SYSTEM_ERROR({  // NOLINT
 | 
					
						
							|  |  |  |     a_++; | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     throw_system_error(); | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  |   }, EDOM, (b_++, "test")); | 
					
						
							|  |  |  |   EXPECT_EQ(1, a_); | 
					
						
							|  |  |  |   EXPECT_EQ(1, b_); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // failed EXPECT_SYSTEM_ERROR, throws different type
 | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE(EXPECT_SYSTEM_ERROR({  // NOLINT
 | 
					
						
							|  |  |  |     a_++; | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     throw_exception(); | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  |   }, EDOM, (b_++, "test")), "throws a different type"); | 
					
						
							|  |  |  |   EXPECT_EQ(2, a_); | 
					
						
							|  |  |  |   EXPECT_EQ(2, b_); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // failed EXPECT_SYSTEM_ERROR, throws an exception with different message
 | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE(EXPECT_SYSTEM_ERROR({  // NOLINT
 | 
					
						
							|  |  |  |     a_++; | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     throw_system_error(); | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  |   }, EDOM, (b_++, "other")), | 
					
						
							|  |  |  |       "throws an exception with a different message"); | 
					
						
							|  |  |  |   EXPECT_EQ(3, a_); | 
					
						
							|  |  |  |   EXPECT_EQ(3, b_); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // failed EXPECT_SYSTEM_ERROR, throws nothing
 | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							|  |  |  |       EXPECT_SYSTEM_ERROR(a_++, EDOM, (b_++, "test")), "throws nothing"); | 
					
						
							|  |  |  |   EXPECT_EQ(4, a_); | 
					
						
							|  |  |  |   EXPECT_EQ(4, b_); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 08:35:59 -07:00
										 |  |  | // Tests that assertion arguments are evaluated exactly once.
 | 
					
						
							|  |  |  | TEST_F(SingleEvaluationTest, WriteTests) { | 
					
						
							|  |  |  |   // successful EXPECT_WRITE
 | 
					
						
							|  |  |  |   EXPECT_WRITE(stdout, {  // NOLINT
 | 
					
						
							|  |  |  |     a_++; | 
					
						
							|  |  |  |     std::printf("test"); | 
					
						
							|  |  |  |   }, (b_++, "test")); | 
					
						
							|  |  |  |   EXPECT_EQ(1, a_); | 
					
						
							|  |  |  |   EXPECT_EQ(1, b_); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // failed EXPECT_WRITE
 | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE(EXPECT_WRITE(stdout, {  // NOLINT
 | 
					
						
							|  |  |  |     a_++; | 
					
						
							|  |  |  |     std::printf("test"); | 
					
						
							|  |  |  |   }, (b_++, "other")), "Actual: test"); | 
					
						
							|  |  |  |   EXPECT_EQ(2, a_); | 
					
						
							|  |  |  |   EXPECT_EQ(2, b_); | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Tests that the compiler will not complain about unreachable code in the
 | 
					
						
							|  |  |  | // EXPECT_THROW_MSG macro.
 | 
					
						
							|  |  |  | TEST(ExpectThrowTest, DoesNotGenerateUnreachableCodeWarning) { | 
					
						
							|  |  |  |   int n = 0; | 
					
						
							|  |  |  |   using std::runtime_error; | 
					
						
							|  |  |  |   EXPECT_THROW_MSG(throw runtime_error(""), runtime_error, ""); | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE(EXPECT_THROW_MSG(n++, runtime_error, ""), ""); | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE(EXPECT_THROW_MSG(throw 1, runtime_error, ""), ""); | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE(EXPECT_THROW_MSG( | 
					
						
							|  |  |  |       throw runtime_error("a"), runtime_error, "b"), ""); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  | // Tests that the compiler will not complain about unreachable code in the
 | 
					
						
							|  |  |  | // EXPECT_SYSTEM_ERROR macro.
 | 
					
						
							|  |  |  | TEST(ExpectSystemErrorTest, DoesNotGenerateUnreachableCodeWarning) { | 
					
						
							|  |  |  |   int n = 0; | 
					
						
							| 
									
										
										
										
											2014-06-30 14:26:29 -07:00
										 |  |  |   EXPECT_SYSTEM_ERROR(throw fmt::SystemError(EDOM, "test"), EDOM, "test"); | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  |   EXPECT_NONFATAL_FAILURE(EXPECT_SYSTEM_ERROR(n++, EDOM, ""), ""); | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE(EXPECT_SYSTEM_ERROR(throw 1, EDOM, ""), ""); | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE(EXPECT_SYSTEM_ERROR( | 
					
						
							| 
									
										
										
										
											2014-06-30 14:26:29 -07:00
										 |  |  |       throw fmt::SystemError(EDOM, "aaa"), EDOM, "bbb"), ""); | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 12:52:16 -07:00
										 |  |  | TEST(AssertionSyntaxTest, ExceptionAssertionBehavesLikeSingleStatement) { | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |   if (::testing::internal::AlwaysFalse()) | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     EXPECT_THROW_MSG(do_nothing(), std::exception, ""); | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (::testing::internal::AlwaysTrue()) | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     EXPECT_THROW_MSG(throw_exception(), std::exception, "test"); | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     do_nothing(); | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  | TEST(AssertionSyntaxTest, SystemErrorAssertionBehavesLikeSingleStatement) { | 
					
						
							|  |  |  |   if (::testing::internal::AlwaysFalse()) | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     EXPECT_SYSTEM_ERROR(do_nothing(), EDOM, ""); | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (::testing::internal::AlwaysTrue()) | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     EXPECT_SYSTEM_ERROR(throw_system_error(), EDOM, "test"); | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     do_nothing(); | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 12:52:16 -07:00
										 |  |  | TEST(AssertionSyntaxTest, WriteAssertionBehavesLikeSingleStatement) { | 
					
						
							|  |  |  |   if (::testing::internal::AlwaysFalse()) | 
					
						
							|  |  |  |     EXPECT_WRITE(stdout, std::printf("x"), "x"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (::testing::internal::AlwaysTrue()) | 
					
						
							|  |  |  |     EXPECT_WRITE(stdout, std::printf("x"), "x"); | 
					
						
							|  |  |  |   else | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |     do_nothing(); | 
					
						
							| 
									
										
										
										
											2014-05-05 12:52:16 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | // Tests EXPECT_THROW_MSG.
 | 
					
						
							|  |  |  | TEST(ExpectTest, EXPECT_THROW_MSG) { | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |   EXPECT_THROW_MSG(throw_exception(), std::exception, "test"); | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |       EXPECT_THROW_MSG(throw_exception(), std::logic_error, "test"), | 
					
						
							|  |  |  |       "Expected: throw_exception() throws an exception of " | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |       "type std::logic_error.\n  Actual: it throws a different type."); | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |       EXPECT_THROW_MSG(do_nothing(), std::exception, "test"), | 
					
						
							| 
									
										
										
										
											2014-07-29 08:11:49 -07:00
										 |  |  |       "Expected: do_nothing() throws an exception of type std::exception.\n" | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |       "  Actual: it throws nothing."); | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |       EXPECT_THROW_MSG(throw_exception(), std::exception, "other"), | 
					
						
							|  |  |  |       "throw_exception() throws an exception with a different message.\n" | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |       "Expected: other\n" | 
					
						
							|  |  |  |       "  Actual: test"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  | // Tests EXPECT_SYSTEM_ERROR.
 | 
					
						
							|  |  |  | TEST(ExpectTest, EXPECT_SYSTEM_ERROR) { | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |   EXPECT_SYSTEM_ERROR(throw_system_error(), EDOM, "test"); | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |       EXPECT_SYSTEM_ERROR(throw_exception(), EDOM, "test"), | 
					
						
							|  |  |  |       "Expected: throw_exception() throws an exception of " | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  |       "type fmt::SystemError.\n  Actual: it throws a different type."); | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |       EXPECT_SYSTEM_ERROR(do_nothing(), EDOM, "test"), | 
					
						
							| 
									
										
										
										
											2014-07-29 08:11:49 -07:00
										 |  |  |       "Expected: do_nothing() throws an exception of type fmt::SystemError.\n" | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  |       "  Actual: it throws nothing."); | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |       EXPECT_SYSTEM_ERROR(throw_system_error(), EDOM, "other"), | 
					
						
							| 
									
										
										
										
											2014-06-29 11:51:10 -07:00
										 |  |  |       fmt::format( | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |           "throw_system_error() throws an exception with a different message.\n" | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  |           "Expected: {}\n" | 
					
						
							| 
									
										
										
										
											2014-06-28 20:03:46 -07:00
										 |  |  |           "  Actual: {}", | 
					
						
							| 
									
										
										
										
											2014-07-27 15:09:05 -07:00
										 |  |  |           format_system_error(EDOM, "other"), | 
					
						
							|  |  |  |           format_system_error(EDOM, "test"))); | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 12:52:16 -07:00
										 |  |  | // Tests EXPECT_WRITE.
 | 
					
						
							|  |  |  | TEST(ExpectTest, EXPECT_WRITE) { | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |   EXPECT_WRITE(stdout, do_nothing(), ""); | 
					
						
							| 
									
										
										
										
											2014-05-05 12:52:16 -07:00
										 |  |  |   EXPECT_WRITE(stdout, std::printf("test"), "test"); | 
					
						
							|  |  |  |   EXPECT_WRITE(stderr, std::fprintf(stderr, "test"), "test"); | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							|  |  |  |       EXPECT_WRITE(stdout, std::printf("that"), "this"), | 
					
						
							|  |  |  |       "Expected: this\n" | 
					
						
							|  |  |  |       "  Actual: that"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST(StreamingAssertionsTest, EXPECT_THROW_MSG) { | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |   EXPECT_THROW_MSG(throw_exception(), std::exception, "test") | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |       << "unexpected failure"; | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |       EXPECT_THROW_MSG(throw_exception(), std::exception, "other") | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  |       << "expected failure", "expected failure"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  | TEST(StreamingAssertionsTest, EXPECT_SYSTEM_ERROR) { | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |   EXPECT_SYSTEM_ERROR(throw_system_error(), EDOM, "test") | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  |       << "unexpected failure"; | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |       EXPECT_SYSTEM_ERROR(throw_system_error(), EDOM, "other") | 
					
						
							| 
									
										
										
										
											2014-05-14 09:01:16 -07:00
										 |  |  |       << "expected failure", "expected failure"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 17:07:21 -07:00
										 |  |  | TEST(StreamingAssertionsTest, EXPECT_WRITE) { | 
					
						
							|  |  |  |   EXPECT_WRITE(stdout, std::printf("test"), "test") | 
					
						
							|  |  |  |       << "unexpected failure"; | 
					
						
							|  |  |  |   EXPECT_NONFATAL_FAILURE( | 
					
						
							|  |  |  |       EXPECT_WRITE(stdout, std::printf("test"), "other") | 
					
						
							|  |  |  |       << "expected failure", "expected failure"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-27 15:09:05 -07:00
										 |  |  | TEST(UtilTest, FormatSystemError) { | 
					
						
							| 
									
										
										
										
											2014-09-29 08:48:16 -07:00
										 |  |  |   fmt::MemoryWriter out; | 
					
						
							| 
									
										
										
										
											2014-07-27 15:09:05 -07:00
										 |  |  |   fmt::internal::format_system_error(out, EDOM, "test message"); | 
					
						
							|  |  |  |   EXPECT_EQ(out.str(), format_system_error(EDOM, "test message")); | 
					
						
							| 
									
										
										
										
											2014-05-15 07:45:44 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | #if FMT_USE_FILE_DESCRIPTORS
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-09 09:07:27 -07:00
										 |  |  | using fmt::BufferedFile; | 
					
						
							|  |  |  | using fmt::ErrorCode; | 
					
						
							|  |  |  | using fmt::File; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | TEST(ErrorCodeTest, Ctor) { | 
					
						
							|  |  |  |   EXPECT_EQ(0, ErrorCode().get()); | 
					
						
							|  |  |  |   EXPECT_EQ(42, ErrorCode(42).get()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 06:44:50 -07:00
										 |  |  | TEST(OutputRedirectTest, ScopedRedirect) { | 
					
						
							|  |  |  |   File read_end, write_end; | 
					
						
							|  |  |  |   File::pipe(read_end, write_end); | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     BufferedFile file(write_end.fdopen("w")); | 
					
						
							|  |  |  |     std::fprintf(file.get(), "[[["); | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       OutputRedirect redir(file.get()); | 
					
						
							|  |  |  |       std::fprintf(file.get(), "censored"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     std::fprintf(file.get(), "]]]"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   EXPECT_READ(read_end, "[[[]]]"); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 09:01:18 -07:00
										 |  |  | // Test that OutputRedirect handles errors in flush correctly.
 | 
					
						
							| 
									
										
										
										
											2014-05-04 10:08:29 -07:00
										 |  |  | TEST(OutputRedirectTest, FlushErrorInCtor) { | 
					
						
							| 
									
										
										
										
											2014-05-04 09:01:18 -07:00
										 |  |  |   File read_end, write_end; | 
					
						
							|  |  |  |   File::pipe(read_end, write_end); | 
					
						
							|  |  |  |   int write_fd = write_end.descriptor(); | 
					
						
							| 
									
										
										
										
											2014-05-06 08:05:14 -07:00
										 |  |  |   File write_copy = write_end.dup(write_fd); | 
					
						
							| 
									
										
										
										
											2014-05-04 09:01:18 -07:00
										 |  |  |   BufferedFile f = write_end.fdopen("w"); | 
					
						
							|  |  |  |   // Put a character in a file buffer.
 | 
					
						
							|  |  |  |   EXPECT_EQ('x', fputc('x', f.get())); | 
					
						
							| 
									
										
										
										
											2014-05-06 07:29:50 -07:00
										 |  |  |   FMT_POSIX(close(write_fd)); | 
					
						
							| 
									
										
										
										
											2014-05-04 09:01:18 -07:00
										 |  |  |   OutputRedirect *redir = 0; | 
					
						
							| 
									
										
										
										
											2014-05-05 17:07:21 -07:00
										 |  |  |   EXPECT_SYSTEM_ERROR_NOASSERT(redir = new OutputRedirect(f.get()), | 
					
						
							| 
									
										
										
										
											2014-06-28 20:03:46 -07:00
										 |  |  |       EBADF, "cannot flush stream"); | 
					
						
							| 
									
										
										
										
											2014-05-04 09:01:18 -07:00
										 |  |  |   delete redir; | 
					
						
							| 
									
										
										
										
											2014-05-06 08:05:14 -07:00
										 |  |  |   write_copy.dup2(write_fd);  // "undo" close or dtor will fail
 | 
					
						
							| 
									
										
										
										
											2014-05-04 09:01:18 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 10:08:29 -07:00
										 |  |  | TEST(OutputRedirectTest, DupErrorInCtor) { | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |   BufferedFile f = open_buffered_file(); | 
					
						
							| 
									
										
										
										
											2014-05-06 06:45:53 -07:00
										 |  |  |   int fd = f.fileno(); | 
					
						
							| 
									
										
										
										
											2014-05-06 08:05:14 -07:00
										 |  |  |   File copy = File::dup(fd); | 
					
						
							| 
									
										
										
										
											2014-05-06 07:29:50 -07:00
										 |  |  |   FMT_POSIX(close(fd)); | 
					
						
							| 
									
										
										
										
											2014-05-04 09:01:18 -07:00
										 |  |  |   OutputRedirect *redir = 0; | 
					
						
							| 
									
										
										
										
											2014-05-05 17:07:21 -07:00
										 |  |  |   EXPECT_SYSTEM_ERROR_NOASSERT(redir = new OutputRedirect(f.get()), | 
					
						
							| 
									
										
										
										
											2014-06-29 11:51:10 -07:00
										 |  |  |       EBADF, fmt::format("cannot duplicate file descriptor {}", fd)); | 
					
						
							| 
									
										
										
										
											2014-05-06 08:05:14 -07:00
										 |  |  |   copy.dup2(fd);  // "undo" close or dtor will fail
 | 
					
						
							| 
									
										
										
										
											2014-05-04 09:01:18 -07:00
										 |  |  |   delete redir; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST(OutputRedirectTest, RestoreAndRead) { | 
					
						
							|  |  |  |   File read_end, write_end; | 
					
						
							|  |  |  |   File::pipe(read_end, write_end); | 
					
						
							|  |  |  |   BufferedFile file(write_end.fdopen("w")); | 
					
						
							|  |  |  |   std::fprintf(file.get(), "[[["); | 
					
						
							|  |  |  |   OutputRedirect redir(file.get()); | 
					
						
							|  |  |  |   std::fprintf(file.get(), "censored"); | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |   EXPECT_EQ("censored", redir.restore_and_read()); | 
					
						
							|  |  |  |   EXPECT_EQ("", redir.restore_and_read()); | 
					
						
							| 
									
										
										
										
											2014-05-04 09:01:18 -07:00
										 |  |  |   std::fprintf(file.get(), "]]]"); | 
					
						
							|  |  |  |   file = BufferedFile(); | 
					
						
							|  |  |  |   EXPECT_READ(read_end, "[[[]]]"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 10:08:29 -07:00
										 |  |  | // Test that OutputRedirect handles errors in flush correctly.
 | 
					
						
							|  |  |  | TEST(OutputRedirectTest, FlushErrorInRestoreAndRead) { | 
					
						
							|  |  |  |   File read_end, write_end; | 
					
						
							|  |  |  |   File::pipe(read_end, write_end); | 
					
						
							|  |  |  |   int write_fd = write_end.descriptor(); | 
					
						
							| 
									
										
										
										
											2014-05-06 08:05:14 -07:00
										 |  |  |   File write_copy = write_end.dup(write_fd); | 
					
						
							| 
									
										
										
										
											2014-05-04 10:08:29 -07:00
										 |  |  |   BufferedFile f = write_end.fdopen("w"); | 
					
						
							|  |  |  |   OutputRedirect redir(f.get()); | 
					
						
							|  |  |  |   // Put a character in a file buffer.
 | 
					
						
							|  |  |  |   EXPECT_EQ('x', fputc('x', f.get())); | 
					
						
							| 
									
										
										
										
											2014-05-06 07:29:50 -07:00
										 |  |  |   FMT_POSIX(close(write_fd)); | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |   EXPECT_SYSTEM_ERROR_NOASSERT(redir.restore_and_read(), | 
					
						
							| 
									
										
										
										
											2014-06-28 20:03:46 -07:00
										 |  |  |       EBADF, "cannot flush stream"); | 
					
						
							| 
									
										
										
										
											2014-05-06 08:05:14 -07:00
										 |  |  |   write_copy.dup2(write_fd);  // "undo" close or dtor will fail
 | 
					
						
							| 
									
										
										
										
											2014-05-04 10:08:29 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST(OutputRedirectTest, ErrorInDtor) { | 
					
						
							|  |  |  |   File read_end, write_end; | 
					
						
							|  |  |  |   File::pipe(read_end, write_end); | 
					
						
							|  |  |  |   int write_fd = write_end.descriptor(); | 
					
						
							| 
									
										
										
										
											2014-05-06 08:05:14 -07:00
										 |  |  |   File write_copy = write_end.dup(write_fd); | 
					
						
							| 
									
										
										
										
											2014-05-04 10:08:29 -07:00
										 |  |  |   BufferedFile f = write_end.fdopen("w"); | 
					
						
							|  |  |  |   OutputRedirect *redir = new OutputRedirect(f.get()); | 
					
						
							|  |  |  |   // Put a character in a file buffer.
 | 
					
						
							|  |  |  |   EXPECT_EQ('x', fputc('x', f.get())); | 
					
						
							| 
									
										
										
										
											2014-05-05 17:07:21 -07:00
										 |  |  |   EXPECT_WRITE(stderr, { | 
					
						
							|  |  |  |       // The close function must be called inside EXPECT_WRITE, otherwise
 | 
					
						
							|  |  |  |       // the system may recycle closed file descriptor when redirecting the
 | 
					
						
							|  |  |  |       // output in EXPECT_STDERR and the second close will break output
 | 
					
						
							|  |  |  |       // redirection.
 | 
					
						
							| 
									
										
										
										
											2014-05-06 07:29:50 -07:00
										 |  |  |       FMT_POSIX(close(write_fd)); | 
					
						
							| 
									
										
										
										
											2014-05-05 17:07:21 -07:00
										 |  |  |       SUPPRESS_ASSERT(delete redir); | 
					
						
							| 
									
										
										
										
											2014-07-27 15:09:05 -07:00
										 |  |  |   }, format_system_error(EBADF, "cannot flush stream")); | 
					
						
							| 
									
										
										
										
											2014-05-06 08:05:14 -07:00
										 |  |  |   write_copy.dup2(write_fd); // "undo" close or dtor of BufferedFile will fail
 | 
					
						
							| 
									
										
										
										
											2014-05-04 10:08:29 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 17:38:39 -07:00
										 |  |  | #endif  // FMT_USE_FILE_DESCRIPTORS
 | 
					
						
							| 
									
										
										
										
											2014-05-04 06:44:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-03 09:48:54 -07:00
										 |  |  | }  // namespace
 |