// Copyright 2009 Google Inc. All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // 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. // // Author: vladl@google.com (Vlad Losev) // // Tests for Google Test itself. This verifies that Google Test can be // linked into an executable successfully when built as a DLL on Windows. // The test is not meant to check the success of test assertions employed in // it. It only checks that constructs in them can be successfully linked. // // If you add new features to Google Test's documented interface, you need to // add tests exercising them to this file. // // If you start having 'unresolved external symbol' linker errors in this file // after the changes you have made, re-generate src/gtest.def by running // scripts/generate_gtest_def.py. #include #include #include #include using ::std::vector; using ::std::tr1::tuple; using ::testing::AddGlobalTestEnvironment; using ::testing::AssertionFailure; using ::testing::AssertionResult; using ::testing::AssertionSuccess; using ::testing::DoubleLE; using ::testing::EmptyTestEventListener; using ::testing::Environment; using ::testing::ExitedWithCode; using ::testing::FloatLE; using ::testing::GTEST_FLAG(also_run_disabled_tests); using ::testing::GTEST_FLAG(break_on_failure); using ::testing::GTEST_FLAG(catch_exceptions); using ::testing::GTEST_FLAG(color); using ::testing::GTEST_FLAG(filter); using ::testing::GTEST_FLAG(output); using ::testing::GTEST_FLAG(print_time); using ::testing::GTEST_FLAG(random_seed); using ::testing::GTEST_FLAG(repeat); using ::testing::GTEST_FLAG(shuffle); using ::testing::GTEST_FLAG(stack_trace_depth); using ::testing::GTEST_FLAG(throw_on_failure); using ::testing::InitGoogleTest; using ::testing::Message; using ::testing::Test; using ::testing::TestCase; using ::testing::TestEventListener; using ::testing::TestEventListeners; using ::testing::TestInfo; using ::testing::TestPartResult; using ::testing::TestProperty; using ::testing::TestResult; using ::testing::UnitTest; using ::testing::internal::AlwaysTrue; using ::testing::internal::AlwaysFalse; #if GTEST_HAS_PARAM_TEST using ::testing::Bool; using ::testing::Combine; using ::testing::TestWithParam; using ::testing::Values; using ::testing::ValuesIn; #endif // GTEST_HAS_PARAM_TEST #if GTEST_HAS_TYPED_TEST using ::testing::Types; #endif // GTEST_HAS_TYPED_TEST // Tests linking of TEST constructs. TEST(TestMacroTest, LinksSuccessfully) { } // Tests linking of TEST_F constructs. class FixtureTest : public Test { }; TEST_F(FixtureTest, LinksSuccessfully) { } // Tests linking of value parameterized tests. #if GTEST_HAS_PARAM_TEST class IntParamTest : public TestWithParam {}; TEST_P(IntParamTest, LinksSuccessfully) {} const int c_array[] = {1, 2}; INSTANTIATE_TEST_CASE_P(ValuesInCArrayTest, IntParamTest, ValuesIn(c_array)); INSTANTIATE_TEST_CASE_P(ValuesInIteratorPairTest, IntParamTest, ValuesIn(c_array, c_array + 2)); vector stl_vector(c_array, c_array + 2); INSTANTIATE_TEST_CASE_P(ValuesInStlVectorTest, IntParamTest, ValuesIn(stl_vector)); class BoolParamTest : public TestWithParam {}; INSTANTIATE_TEST_CASE_P(BoolTest, BoolParamTest, Bool()); INSTANTIATE_TEST_CASE_P(ValuesTest, IntParamTest, Values(1, 2)); #if GTEST_HAS_COMBINE class CombineTest : public TestWithParam > {}; INSTANTIATE_TEST_CASE_P(CombineTest, CombineTest, Combine(Values(1), Bool())); #endif // GTEST_HAS_COMBINE #endif // GTEST_HAS_PARAM_TEST // Tests linking of typed tests. #if GTEST_HAS_TYPED_TEST template class TypedTest : public Test {}; TYPED_TEST_CASE(TypedTest, Types); TYPED_TEST(TypedTest, LinksSuccessfully) {} #endif // GTEST_HAS_TYPED_TEST // Tests linking of type-parameterized tests. #if GTEST_HAS_TYPED_TEST_P template class TypeParameterizedTest : public Test {}; TYPED_TEST_CASE_P(TypeParameterizedTest); TYPED_TEST_P(TypeParameterizedTest, LinksSuccessfully) {} REGISTER_TYPED_TEST_CASE_P(TypeParameterizedTest, LinksSuccessfully); INSTANTIATE_TYPED_TEST_CASE_P(Char, TypeParameterizedTest, Types); #endif // GTEST_HAS_TYPED_TEST_P // Tests linking of explicit success or failure. TEST(ExplicitSuccessFailureTest, ExplicitSuccessAndFailure) { if (AlwaysTrue()) SUCCEED() << "This is a success statement"; if (AlwaysFalse()) { ADD_FAILURE() << "This is a non-fatal failure assertion"; FAIL() << "This is a fatal failure assertion"; } } // Tests linking of Boolean assertions. AssertionResult IsEven(int n) { if (n % 2 == 0) return AssertionSuccess() << n << " is even"; else return AssertionFailure() << n << " is odd"; } TEST(BooleanAssertionTest, LinksSuccessfully) { EXPECT_TRUE(true) << "true is true"; EXPECT_FALSE(false) << "false is not true"; ASSERT_TRUE(true); ASSERT_FALSE(false); EXPECT_TRUE(IsEven(2)); EXPECT_FALSE(IsEven(3)); } // Tests linking of predicate assertions. bool IsOdd(int n) { return n % 2 != 0; } bool Ge(int val1, int val2) { return val1 >= val2; } TEST(PredicateAssertionTest, LinksSuccessfully) { EXPECT_PRED1(IsOdd, 1); EXPECT_PRED2(Ge, 2, 1); } AssertionResult AddToFive(const char* val1_expr, const char* val2_expr, int val1, int val2) { if (val1 + val2 == 5) return AssertionSuccess(); return AssertionFailure() << val1_expr << " and " << val2_expr << " (" << val1 << " and " << val2 << ") " << "do not add up to five, as their sum is " << val1 + val2; } TEST(PredicateFormatterAssertionTest, LinksSuccessfully) { EXPECT_PRED_FORMAT2(AddToFive, 1 + 2, 2); } // Tests linking of comparison assertions. TEST(ComparisonAssertionTest, LinksSuccessfully) { EXPECT_EQ(1, 1); EXPECT_NE(1, 2); EXPECT_LT(1, 2); EXPECT_LE(1, 1); EXPECT_GT(2, 1); EXPECT_GE(2, 1); EXPECT_EQ('\n', '\n'); EXPECT_NE('\n', '\r'); EXPECT_LT('\n', 'a'); EXPECT_LE('\n', 'b'); EXPECT_GT('a', '\t'); EXPECT_GE('b', '\t'); } TEST(StringComparisonAssertionTest, LinksSuccessfully) { EXPECT_STREQ("test", "test"); EXPECT_STRNE("test", "prod"); char test_str[5] = "test"; char prod_str[5] = "prod"; EXPECT_STREQ(test_str, test_str); EXPECT_STRNE(test_str, prod_str); EXPECT_STRCASEEQ("test", "TEST"); EXPECT_STRCASENE("test", "prod"); wchar_t test_wstr[5] = L"test"; wchar_t prod_wstr[5] = L"prod"; EXPECT_STREQ(L"test", L"test"); EXPECT_STRNE(L"test", L"prod"); EXPECT_STREQ(test_wstr, test_wstr); EXPECT_STRNE(test_wstr, prod_wstr); #if GTEST_HAS_STD_STRING EXPECT_EQ("test", ::std::string("test")); EXPECT_NE("test", ::std::string("prod")); EXPECT_EQ(::std::string("test"), "test"); EXPECT_NE(::std::string("prod"), "test"); EXPECT_EQ(test_str, ::std::string("test")); EXPECT_NE(test_str, ::std::string("prod")); EXPECT_EQ(::std::string("test"), test_str); EXPECT_NE(::std::string("prod"), test_str); EXPECT_EQ(::std::string("test"), ::std::string("test")); EXPECT_NE(::std::string("test"), ::std::string("prod")); #endif // GTEST_HAS_STD_STRING #if GTEST_HAS_STD_WSTRING EXPECT_EQ(L"test", ::std::wstring(L"test")); EXPECT_NE(L"test", ::std::wstring(L"prod")); EXPECT_EQ(::std::wstring(L"test"), L"test"); EXPECT_NE(::std::wstring(L"prod"), L"test"); EXPECT_EQ(test_wstr, ::std::wstring(L"test")); EXPECT_NE(test_wstr, ::std::wstring(L"prod")); EXPECT_EQ(::std::wstring(L"test"), test_wstr); EXPECT_NE(::std::wstring(L"prod"), test_wstr); EXPECT_EQ(::std::wstring(L"test"), ::std::wstring(L"test")); EXPECT_NE(::std::wstring(L"test"), ::std::wstring(L"prod")); #endif // GTEST_HAS_STD_WSTRING } // Tests linking of floating point assertions. TEST(FloatingPointComparisonAssertionTest, LinksSuccessfully) { EXPECT_FLOAT_EQ(0.0f, 0.0f); EXPECT_DOUBLE_EQ(0.0, 0.0); EXPECT_NEAR(0.0, 0.1, 0.2); EXPECT_PRED_FORMAT2(::testing::FloatLE, 0.0f, 0.01f); EXPECT_PRED_FORMAT2(::testing::DoubleLE, 0.0, 0.001); } // Tests linking of HRESULT assertions. TEST(HresultAssertionTest, LinksSuccessfully) { EXPECT_HRESULT_SUCCEEDED(S_OK); EXPECT_HRESULT_FAILED(E_FAIL); } #if GTEST_HAS_EXCEPTIONS // Tests linking of exception assertions. TEST(ExceptionAssertionTest, LinksSuccessfully) { EXPECT_THROW(throw 1, int); EXPECT_ANY_THROW(throw 1); EXPECT_NO_THROW(int x = 1); } #endif // GTEST_HAS_EXCEPTIONS // Tests linking of death test assertions. TEST(DeathTestAssertionDeathTest, LinksSuccessfully) { EXPECT_DEATH_IF_SUPPORTED(exit(1), ""); #if GTEST_HAS_DEATH_TEST EXPECT_EXIT(exit(1), ExitedWithCode(1), ""); #endif // GTEST_HAS_DEATH_TEST } // Tests linking of SCOPED_TRACE. void Sub() { EXPECT_EQ(1, 1); } TEST(ScopedTraceTest, LinksSuccessfully) { SCOPED_TRACE("X"); Sub(); } // Tests linking of failure absence assertions. TEST(NoFailureAssertionTest, LinksSuccessfully) { EXPECT_NO_FATAL_FAILURE(IsEven(2)); } // Tests linking of HasFatalFailure. TEST(HasFatalFailureTest, LinksSuccessfully) { EXPECT_FALSE(HasFatalFailure()); EXPECT_FALSE(HasNonfatalFailure()); EXPECT_FALSE(HasFailure()); } // Tests linking of RecordProperty. TEST(RecordPropertyTest, LinksSuccessfully) { RecordProperty("DummyPropery", "DummyValue"); } // Tests linking of environments. class MyEnvironment : public Environment {}; Environment* const environment = AddGlobalTestEnvironment(new MyEnvironment); // Tests linking of flags. TEST(FlagTest, LinksSuccessfully) { Message message; message << GTEST_FLAG(filter); message << GTEST_FLAG(also_run_disabled_tests); message << GTEST_FLAG(repeat); message << GTEST_FLAG(shuffle); message << GTEST_FLAG(random_seed); message << GTEST_FLAG(color); message << GTEST_FLAG(print_time); message << GTEST_FLAG(output); message << GTEST_FLAG(break_on_failure); message << GTEST_FLAG(throw_on_failure); message << GTEST_FLAG(catch_exceptions); message << GTEST_FLAG(stack_trace_depth); } // Tests linking of failure catching assertions. void FunctionWithFailure() { FAIL(); } TEST(FailureCatchingAssertionTest, LinksCorrectly) { EXPECT_FATAL_FAILURE(FunctionWithFailure(), ""); EXPECT_NONFATAL_FAILURE(ADD_FAILURE(), ""); EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FunctionWithFailure(), ""); EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(ADD_FAILURE(), ""); } // Tests linking of the reflection API. TEST(ReflectionApiTest, LinksCorrectly) { // UnitTest API. UnitTest* unit_test = UnitTest::GetInstance(); unit_test->original_working_dir(); EXPECT_TRUE(unit_test->current_test_case() != NULL); EXPECT_TRUE(unit_test->current_test_info() != NULL); EXPECT_NE(0, unit_test->random_seed()); EXPECT_GE(unit_test->successful_test_case_count(), 0); EXPECT_EQ(0, unit_test->failed_test_case_count()); EXPECT_GE(unit_test->total_test_case_count(), 0); EXPECT_GT(unit_test->test_case_to_run_count(), 0); EXPECT_GE(unit_test->successful_test_count(), 0); EXPECT_EQ(0, unit_test->failed_test_count()); EXPECT_EQ(0, unit_test->disabled_test_count()); EXPECT_GT(unit_test->total_test_count(), 0); EXPECT_GT(unit_test->test_to_run_count(), 0); EXPECT_GE(unit_test->elapsed_time(), 0); EXPECT_TRUE(unit_test->Passed()); EXPECT_FALSE(unit_test->Failed()); EXPECT_TRUE(unit_test->GetTestCase(0) != NULL); // TestCase API. const TestCase*const test_case = unit_test->current_test_case(); EXPECT_STRNE("", test_case->name()); const char* const test_case_comment = test_case->comment(); EXPECT_TRUE(test_case->should_run()); EXPECT_GE(test_case->successful_test_count(), 0); EXPECT_EQ(0, test_case->failed_test_count()); EXPECT_EQ(0, test_case->disabled_test_count()); EXPECT_GT(test_case->test_to_run_count(), 0); EXPECT_GT(test_case->total_test_count(), 0); EXPECT_TRUE(test_case->Passed()); EXPECT_FALSE(test_case->Failed()); EXPECT_GE(test_case->elapsed_time(), 0); EXPECT_TRUE(test_case->GetTestInfo(0) != NULL); // TestInfo API. const TestInfo* const test_info = unit_test->current_test_info(); EXPECT_STRNE("", test_info->test_case_name()); EXPECT_STRNE("", test_info->name()); EXPECT_STREQ(test_case_comment, test_info->test_case_comment()); const char* const comment = test_info->comment(); EXPECT_TRUE(comment == NULL || strlen(comment) >= 0); EXPECT_TRUE(test_info->should_run()); EXPECT_TRUE(test_info->result() != NULL); // TestResult API. const TestResult* const test_result = test_info->result(); SUCCEED() << "This generates a successful test part instance for API testing"; RecordProperty("Test Name", "Test Value"); EXPECT_EQ(1, test_result->total_part_count()); EXPECT_EQ(1, test_result->test_property_count()); EXPECT_TRUE(test_result->Passed()); EXPECT_FALSE(test_result->Failed()); EXPECT_FALSE(test_result->HasFatalFailure()); EXPECT_FALSE(test_result->HasNonfatalFailure()); EXPECT_GE(test_result->elapsed_time(), 0); const TestPartResult& test_part_result = test_result->GetTestPartResult(0); const TestProperty& test_property = test_result->GetTestProperty(0); // TestPartResult API. EXPECT_EQ(TestPartResult::kSuccess, test_part_result.type()); EXPECT_STRNE("", test_part_result.file_name()); EXPECT_GT(test_part_result.line_number(), 0); EXPECT_STRNE("", test_part_result.summary()); EXPECT_STRNE("", test_part_result.message()); EXPECT_TRUE(test_part_result.passed()); EXPECT_FALSE(test_part_result.failed()); EXPECT_FALSE(test_part_result.nonfatally_failed()); EXPECT_FALSE(test_part_result.fatally_failed()); // TestProperty API. EXPECT_STREQ("Test Name", test_property.key()); EXPECT_STREQ("Test Value", test_property.value()); } // Tests linking of the event listener API. class MyListener : public TestEventListener { virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationStart(const UnitTest& /*unit_test*/, int /*iteration*/) {} virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {} virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestCaseStart(const TestCase& /*test_case*/) {} virtual void OnTestStart(const TestInfo& /*test_info*/) {} virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {} virtual void OnTestEnd(const TestInfo& /*test_info*/) {} virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {} virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {} virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/, int /*iteration*/) {} virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {} }; class MyOtherListener : public EmptyTestEventListener {}; int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); TestEventListeners& listeners = UnitTest::GetInstance()->listeners(); TestEventListener* listener = new MyListener; listeners.Append(listener); listeners.Release(listener); listeners.Append(new MyOtherListener); listener = listeners.default_result_printer(); listener = listeners.default_xml_generator(); RUN_ALL_TESTS(); return 0; }