146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Copyright 2009 Google Inc.  All rights reserved.
246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Redistribution and use in source and binary forms, with or without
446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// modification, are permitted provided that the following conditions are
546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// met:
646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//     * Redistributions of source code must retain the above copyright
846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// notice, this list of conditions and the following disclaimer.
946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//     * Redistributions in binary form must reproduce the above
1046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// copyright notice, this list of conditions and the following disclaimer
1146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// in the documentation and/or other materials provided with the
1246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// distribution.
1346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//     * Neither the name of Google Inc. nor the names of its
1446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// contributors may be used to endorse or promote products derived from
1546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// this software without specific prior written permission.
1646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
1746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
2946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Author: vladl@google.com (Vlad Losev)
3046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
3146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// The Google C++ Testing Framework (Google Test)
3246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
3346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// This file contains tests verifying correctness of data provided via
3446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// UnitTest's public methods.
3546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
3646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest.h"
3746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
3846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include <string.h>  // For strcmp.
3946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include <algorithm>
4046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing ::testing::InitGoogleTest;
4246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4346108a219a4b812dd8f36fee479a0340ea5963f5Ben Channamespace testing {
4446108a219a4b812dd8f36fee479a0340ea5963f5Ben Channamespace internal {
4546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
4646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T>
4746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct LessByName {
4846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  bool operator()(const T* a, const T* b) {
4946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    return strcmp(a->name(), b->name()) < 0;
5046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  }
5146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
5246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
5346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass UnitTestHelper {
5446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan public:
5546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // Returns the array of pointers to all test cases sorted by the test case
5646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // name.  The caller is responsible for deleting the array.
5746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  static TestCase const** const GetSortedTestCases() {
5846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    UnitTest& unit_test = *UnitTest::GetInstance();
5946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    TestCase const** const test_cases =
6046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        new const TestCase*[unit_test.total_test_case_count()];
6146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
6246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    for (int i = 0; i < unit_test.total_test_case_count(); ++i)
6346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      test_cases[i] = unit_test.GetTestCase(i);
6446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
6546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    std::sort(test_cases,
6646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan              test_cases + unit_test.total_test_case_count(),
6746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan              LessByName<TestCase>());
6846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    return test_cases;
6946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  }
7046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
7146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // Returns the test case by its name.  The caller doesn't own the returned
7246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // pointer.
7346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  static const TestCase* FindTestCase(const char* name) {
7446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    UnitTest& unit_test = *UnitTest::GetInstance();
7546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
7646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      const TestCase* test_case = unit_test.GetTestCase(i);
7746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      if (0 == strcmp(test_case->name(), name))
7846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        return test_case;
7946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    }
8046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    return NULL;
8146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  }
8246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
8346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // Returns the array of pointers to all tests in a particular test case
8446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // sorted by the test name.  The caller is responsible for deleting the
8546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // array.
8646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  static TestInfo const** const GetSortedTests(const TestCase* test_case) {
8746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    TestInfo const** const tests =
8846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        new const TestInfo*[test_case->total_test_count()];
8946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
9046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    for (int i = 0; i < test_case->total_test_count(); ++i)
9146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      tests[i] = test_case->GetTestInfo(i);
9246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
9346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    std::sort(tests, tests + test_case->total_test_count(),
9446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan              LessByName<TestInfo>());
9546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    return tests;
9646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  }
9746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
9846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
9946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_TYPED_TEST
10046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T> class TestCaseWithCommentTest : public Test {};
10146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTYPED_TEST_CASE(TestCaseWithCommentTest, Types<int>);
10246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTYPED_TEST(TestCaseWithCommentTest, Dummy) {}
10346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
10446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanconst int kTypedTestCases = 1;
10546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanconst int kTypedTests = 1;
10646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#else
10746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanconst int kTypedTestCases = 0;
10846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanconst int kTypedTests = 0;
10946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_HAS_TYPED_TEST
11046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
11146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// We can only test the accessors that do not change value while tests run.
11246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Since tests can be run in any order, the values the accessors that track
11346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// test execution (such as failed_test_count) can not be predicted.
11446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ApiTest, UnitTestImmutableAccessorsWork) {
11546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  UnitTest* unit_test = UnitTest::GetInstance();
11646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
11746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());
11846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1 + kTypedTestCases, unit_test->test_case_to_run_count());
11946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(2, unit_test->disabled_test_count());
12046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(5 + kTypedTests, unit_test->total_test_count());
12146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(3 + kTypedTests, unit_test->test_to_run_count());
12246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
12346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();
12446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
12546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("ApiTest", test_cases[0]->name());
12646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("DISABLED_Test", test_cases[1]->name());
12746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_TYPED_TEST
12846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name());
12946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_HAS_TYPED_TEST
13046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
13146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  delete[] test_cases;
13246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
13346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // The following lines initiate actions to verify certain methods in
13446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // FinalSuccessChecker::TearDown.
13546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
13646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // Records a test property to verify TestResult::GetTestProperty().
13746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  RecordProperty("key", "value");
13846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
13946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
14046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAssertionResult IsNull(const char* str) {
14146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  if (str != NULL) {
14246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    return testing::AssertionFailure() << "argument is " << str;
14346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  }
14446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return AssertionSuccess();
14546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
14646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
14746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ApiTest, TestCaseImmutableAccessorsWork) {
14846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest");
14946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ASSERT_TRUE(test_case != NULL);
15046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
15146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("ApiTest", test_case->name());
15246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(test_case->type_param()));
15346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(test_case->should_run());
15446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, test_case->disabled_test_count());
15546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(3, test_case->test_to_run_count());
15646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ASSERT_EQ(4, test_case->total_test_count());
15746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
15846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);
15946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
16046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name());
16146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("ApiTest", tests[0]->test_case_name());
16246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(tests[0]->value_param()));
16346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(tests[0]->type_param()));
16446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(tests[0]->should_run());
16546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
16646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name());
16746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("ApiTest", tests[1]->test_case_name());
16846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(tests[1]->value_param()));
16946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(tests[1]->type_param()));
17046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(tests[1]->should_run());
17146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
17246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name());
17346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("ApiTest", tests[2]->test_case_name());
17446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(tests[2]->value_param()));
17546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(tests[2]->type_param()));
17646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(tests[2]->should_run());
17746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
17846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name());
17946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("ApiTest", tests[3]->test_case_name());
18046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(tests[3]->value_param()));
18146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(tests[3]->type_param()));
18246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(tests[3]->should_run());
18346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
18446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  delete[] tests;
18546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  tests = NULL;
18646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
18746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_TYPED_TEST
18846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0");
18946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ASSERT_TRUE(test_case != NULL);
19046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
19146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("TestCaseWithCommentTest/0", test_case->name());
19246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ(GetTypeName<int>().c_str(), test_case->type_param());
19346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(test_case->should_run());
19446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(0, test_case->disabled_test_count());
19546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, test_case->test_to_run_count());
19646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ASSERT_EQ(1, test_case->total_test_count());
19746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
19846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  tests = UnitTestHelper::GetSortedTests(test_case);
19946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
20046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("Dummy", tests[0]->name());
20146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name());
20246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(tests[0]->value_param()));
20346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());
20446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(tests[0]->should_run());
20546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
20646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  delete[] tests;
20746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_HAS_TYPED_TEST
20846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
20946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
21046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ApiTest, TestCaseDisabledAccessorsWork) {
21146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const TestCase* test_case = UnitTestHelper::FindTestCase("DISABLED_Test");
21246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ASSERT_TRUE(test_case != NULL);
21346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
21446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("DISABLED_Test", test_case->name());
21546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(test_case->type_param()));
21646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(test_case->should_run());
21746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, test_case->disabled_test_count());
21846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(0, test_case->test_to_run_count());
21946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ASSERT_EQ(1, test_case->total_test_count());
22046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
22146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const TestInfo* const test_info = test_case->GetTestInfo(0);
22246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("Dummy2", test_info->name());
22346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("DISABLED_Test", test_info->test_case_name());
22446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(test_info->value_param()));
22546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(IsNull(test_info->type_param()));
22646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(test_info->should_run());
22746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
22846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
22946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// These two tests are here to provide support for testing
23046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// test_case_to_run_count, disabled_test_count, and test_to_run_count.
23146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ApiTest, DISABLED_Dummy1) {}
23246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(DISABLED_Test, Dummy2) {}
23346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
23446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass FinalSuccessChecker : public Environment {
23546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan protected:
23646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  virtual void TearDown() {
23746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    UnitTest* unit_test = UnitTest::GetInstance();
23846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
23946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(1 + kTypedTestCases, unit_test->successful_test_case_count());
24046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(3 + kTypedTests, unit_test->successful_test_count());
24146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(0, unit_test->failed_test_case_count());
24246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(0, unit_test->failed_test_count());
24346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(unit_test->Passed());
24446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_FALSE(unit_test->Failed());
24546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());
24646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
24746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();
24846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
24946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("ApiTest", test_cases[0]->name());
25046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(IsNull(test_cases[0]->type_param()));
25146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(test_cases[0]->should_run());
25246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(1, test_cases[0]->disabled_test_count());
25346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    ASSERT_EQ(4, test_cases[0]->total_test_count());
25446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(3, test_cases[0]->successful_test_count());
25546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(0, test_cases[0]->failed_test_count());
25646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(test_cases[0]->Passed());
25746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_FALSE(test_cases[0]->Failed());
25846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
25946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("DISABLED_Test", test_cases[1]->name());
26046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(IsNull(test_cases[1]->type_param()));
26146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_FALSE(test_cases[1]->should_run());
26246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(1, test_cases[1]->disabled_test_count());
26346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    ASSERT_EQ(1, test_cases[1]->total_test_count());
26446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(0, test_cases[1]->successful_test_count());
26546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(0, test_cases[1]->failed_test_count());
26646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
26746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_TYPED_TEST
26846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name());
26946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ(GetTypeName<int>().c_str(), test_cases[2]->type_param());
27046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(test_cases[2]->should_run());
27146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(0, test_cases[2]->disabled_test_count());
27246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    ASSERT_EQ(1, test_cases[2]->total_test_count());
27346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(1, test_cases[2]->successful_test_count());
27446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(0, test_cases[2]->failed_test_count());
27546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(test_cases[2]->Passed());
27646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_FALSE(test_cases[2]->Failed());
27746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_HAS_TYPED_TEST
27846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
27946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest");
28046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);
28146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name());
28246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("ApiTest", tests[0]->test_case_name());
28346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_FALSE(tests[0]->should_run());
28446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
28546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name());
28646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("ApiTest", tests[1]->test_case_name());
28746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(IsNull(tests[1]->value_param()));
28846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(IsNull(tests[1]->type_param()));
28946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(tests[1]->should_run());
29046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(tests[1]->result()->Passed());
29146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(0, tests[1]->result()->test_property_count());
29246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
29346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name());
29446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("ApiTest", tests[2]->test_case_name());
29546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(IsNull(tests[2]->value_param()));
29646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(IsNull(tests[2]->type_param()));
29746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(tests[2]->should_run());
29846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(tests[2]->result()->Passed());
29946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(0, tests[2]->result()->test_property_count());
30046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
30146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name());
30246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("ApiTest", tests[3]->test_case_name());
30346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(IsNull(tests[3]->value_param()));
30446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(IsNull(tests[3]->type_param()));
30546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(tests[3]->should_run());
30646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(tests[3]->result()->Passed());
30746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(1, tests[3]->result()->test_property_count());
30846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const TestProperty& property = tests[3]->result()->GetTestProperty(0);
30946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("key", property.key());
31046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("value", property.value());
31146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
31246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    delete[] tests;
31346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
31446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_TYPED_TEST
31546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0");
31646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    tests = UnitTestHelper::GetSortedTests(test_case);
31746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
31846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("Dummy", tests[0]->name());
31946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name());
32046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(IsNull(tests[0]->value_param()));
32146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());
32246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(tests[0]->should_run());
32346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_TRUE(tests[0]->result()->Passed());
32446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_EQ(0, tests[0]->result()->test_property_count());
32546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
32646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    delete[] tests;
32746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_HAS_TYPED_TEST
32846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    delete[] test_cases;
32946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  }
33046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
33146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
33246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}  // namespace internal
33346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}  // namespace testing
33446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
33546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanint main(int argc, char **argv) {
33646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  InitGoogleTest(&argc, argv);
33746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
33846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  AddGlobalTestEnvironment(new testing::internal::FinalSuccessChecker());
33946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
34046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return RUN_ALL_TESTS();
34146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
342