141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Copyright 2009 Google Inc.  All rights reserved.
241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Redistribution and use in source and binary forms, with or without
441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// modification, are permitted provided that the following conditions are
541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// met:
641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     * Redistributions of source code must retain the above copyright
841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// notice, this list of conditions and the following disclaimer.
941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     * Redistributions in binary form must reproduce the above
1041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// copyright notice, this list of conditions and the following disclaimer
1141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// in the documentation and/or other materials provided with the
1241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// distribution.
1341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//     * Neither the name of Google Inc. nor the names of its
1441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// contributors may be used to endorse or promote products derived from
1541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// this software without specific prior written permission.
1641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
1741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
2941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Author: vladl@google.com (Vlad Losev)
3041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
3141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// The Google C++ Testing Framework (Google Test)
3241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot//
3341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This file contains tests verifying correctness of data provided via
3441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// UnitTest's public methods.
3541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/gtest.h"
3741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <string.h>  // For strcmp.
3941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <algorithm>
4041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
4141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::InitGoogleTest;
4241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
4341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotnamespace testing {
4441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotnamespace internal {
4541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
4641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T>
4741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotstruct LessByName {
4841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  bool operator()(const T* a, const T* b) {
4941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    return strcmp(a->name(), b->name()) < 0;
5041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
5141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
5241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass UnitTestHelper {
5441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public:
5541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Returns the array of pointers to all test cases sorted by the test case
5641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // name.  The caller is responsible for deleting the array.
5741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static TestCase const** const GetSortedTestCases() {
5841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    UnitTest& unit_test = *UnitTest::GetInstance();
5941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    TestCase const** const test_cases =
6041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        new const TestCase*[unit_test.total_test_case_count()];
6141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    for (int i = 0; i < unit_test.total_test_case_count(); ++i)
6341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      test_cases[i] = unit_test.GetTestCase(i);
6441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    std::sort(test_cases,
6641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot              test_cases + unit_test.total_test_case_count(),
6741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot              LessByName<TestCase>());
6841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    return test_cases;
6941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
7041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
7141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Returns the test case by its name.  The caller doesn't own the returned
7241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // pointer.
7341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static const TestCase* FindTestCase(const char* name) {
7441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    UnitTest& unit_test = *UnitTest::GetInstance();
7541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
7641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      const TestCase* test_case = unit_test.GetTestCase(i);
7741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      if (0 == strcmp(test_case->name(), name))
7841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        return test_case;
7941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    }
8041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    return NULL;
8141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
8241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
8341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Returns the array of pointers to all tests in a particular test case
8441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // sorted by the test name.  The caller is responsible for deleting the
8541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // array.
8641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  static TestInfo const** const GetSortedTests(const TestCase* test_case) {
8741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    TestInfo const** const tests =
8841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        new const TestInfo*[test_case->total_test_count()];
8941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    for (int i = 0; i < test_case->total_test_count(); ++i)
9141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      tests[i] = test_case->GetTestInfo(i);
9241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    std::sort(tests, tests + test_case->total_test_count(),
9441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot              LessByName<TestInfo>());
9541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    return tests;
9641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
9741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
9841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_TYPED_TEST
10041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T> class TestCaseWithCommentTest : public Test {};
10141d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTYPED_TEST_CASE(TestCaseWithCommentTest, Types<int>);
10241d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTYPED_TEST(TestCaseWithCommentTest, Dummy) {}
10341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotconst int kTypedTestCases = 1;
10541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotconst int kTypedTests = 1;
10641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#else
10741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotconst int kTypedTestCases = 0;
10841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotconst int kTypedTests = 0;
10941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_HAS_TYPED_TEST
11041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
11141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// We can only test the accessors that do not change value while tests run.
11241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Since tests can be run in any order, the values the accessors that track
11341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// test execution (such as failed_test_count) can not be predicted.
11441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ApiTest, UnitTestImmutableAccessorsWork) {
11541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  UnitTest* unit_test = UnitTest::GetInstance();
11641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
11741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());
11841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_EQ(1 + kTypedTestCases, unit_test->test_case_to_run_count());
11941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_EQ(2, unit_test->disabled_test_count());
12041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_EQ(5 + kTypedTests, unit_test->total_test_count());
12141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_EQ(3 + kTypedTests, unit_test->test_to_run_count());
12241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
12341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();
12441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
12541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("ApiTest", test_cases[0]->name());
12641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("DISABLED_Test", test_cases[1]->name());
12741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_TYPED_TEST
12841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name());
12941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_HAS_TYPED_TEST
13041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
13141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  delete[] test_cases;
13241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
13341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // The following lines initiate actions to verify certain methods in
13441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // FinalSuccessChecker::TearDown.
13541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
13641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  // Records a test property to verify TestResult::GetTestProperty().
13741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  RecordProperty("key", "value");
13841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
13941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
14041d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotAssertionResult IsNull(const char* str) {
14141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  if (str != NULL) {
14241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    return testing::AssertionFailure() << "argument is " << str;
14341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
14441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return AssertionSuccess();
14541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
14641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
14741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ApiTest, TestCaseImmutableAccessorsWork) {
14841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest");
14941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ASSERT_TRUE(test_case != NULL);
15041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
15141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("ApiTest", test_case->name());
15241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(test_case->type_param()));
15341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(test_case->should_run());
15441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_EQ(1, test_case->disabled_test_count());
15541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_EQ(3, test_case->test_to_run_count());
15641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ASSERT_EQ(4, test_case->total_test_count());
15741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
15841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);
15941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
16041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name());
16141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("ApiTest", tests[0]->test_case_name());
16241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(tests[0]->value_param()));
16341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(tests[0]->type_param()));
16441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_FALSE(tests[0]->should_run());
16541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
16641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name());
16741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("ApiTest", tests[1]->test_case_name());
16841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(tests[1]->value_param()));
16941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(tests[1]->type_param()));
17041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(tests[1]->should_run());
17141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
17241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name());
17341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("ApiTest", tests[2]->test_case_name());
17441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(tests[2]->value_param()));
17541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(tests[2]->type_param()));
17641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(tests[2]->should_run());
17741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
17841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name());
17941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("ApiTest", tests[3]->test_case_name());
18041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(tests[3]->value_param()));
18141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(tests[3]->type_param()));
18241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(tests[3]->should_run());
18341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
18441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  delete[] tests;
18541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  tests = NULL;
18641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
18741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_TYPED_TEST
18841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0");
18941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ASSERT_TRUE(test_case != NULL);
19041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
19141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("TestCaseWithCommentTest/0", test_case->name());
19241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ(GetTypeName<int>().c_str(), test_case->type_param());
19341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(test_case->should_run());
19441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_EQ(0, test_case->disabled_test_count());
19541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_EQ(1, test_case->test_to_run_count());
19641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ASSERT_EQ(1, test_case->total_test_count());
19741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
19841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  tests = UnitTestHelper::GetSortedTests(test_case);
19941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
20041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("Dummy", tests[0]->name());
20141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name());
20241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(tests[0]->value_param()));
20341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());
20441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(tests[0]->should_run());
20541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
20641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  delete[] tests;
20741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_HAS_TYPED_TEST
20841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
20941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21041d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ApiTest, TestCaseDisabledAccessorsWork) {
21141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  const TestCase* test_case = UnitTestHelper::FindTestCase("DISABLED_Test");
21241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ASSERT_TRUE(test_case != NULL);
21341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("DISABLED_Test", test_case->name());
21541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(test_case->type_param()));
21641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_FALSE(test_case->should_run());
21741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_EQ(1, test_case->disabled_test_count());
21841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_EQ(0, test_case->test_to_run_count());
21941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  ASSERT_EQ(1, test_case->total_test_count());
22041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
22141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  const TestInfo* const test_info = test_case->GetTestInfo(0);
22241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("Dummy2", test_info->name());
22341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_STREQ("DISABLED_Test", test_info->test_case_name());
22441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(test_info->value_param()));
22541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_TRUE(IsNull(test_info->type_param()));
22641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  EXPECT_FALSE(test_info->should_run());
22741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
22841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
22941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// These two tests are here to provide support for testing
23041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// test_case_to_run_count, disabled_test_count, and test_to_run_count.
23141d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ApiTest, DISABLED_Dummy1) {}
23241d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(DISABLED_Test, Dummy2) {}
23341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
23441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass FinalSuccessChecker : public Environment {
23541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot protected:
23641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  virtual void TearDown() {
23741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    UnitTest* unit_test = UnitTest::GetInstance();
23841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
23941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(1 + kTypedTestCases, unit_test->successful_test_case_count());
24041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(3 + kTypedTests, unit_test->successful_test_count());
24141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(0, unit_test->failed_test_case_count());
24241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(0, unit_test->failed_test_count());
24341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(unit_test->Passed());
24441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_FALSE(unit_test->Failed());
24541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());
24641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
24741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();
24841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
24941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("ApiTest", test_cases[0]->name());
25041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(IsNull(test_cases[0]->type_param()));
25141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(test_cases[0]->should_run());
25241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(1, test_cases[0]->disabled_test_count());
25341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ASSERT_EQ(4, test_cases[0]->total_test_count());
25441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(3, test_cases[0]->successful_test_count());
25541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(0, test_cases[0]->failed_test_count());
25641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(test_cases[0]->Passed());
25741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_FALSE(test_cases[0]->Failed());
25841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
25941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("DISABLED_Test", test_cases[1]->name());
26041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(IsNull(test_cases[1]->type_param()));
26141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_FALSE(test_cases[1]->should_run());
26241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(1, test_cases[1]->disabled_test_count());
26341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ASSERT_EQ(1, test_cases[1]->total_test_count());
26441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(0, test_cases[1]->successful_test_count());
26541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(0, test_cases[1]->failed_test_count());
26641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
26741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_TYPED_TEST
26841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name());
26941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ(GetTypeName<int>().c_str(), test_cases[2]->type_param());
27041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(test_cases[2]->should_run());
27141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(0, test_cases[2]->disabled_test_count());
27241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    ASSERT_EQ(1, test_cases[2]->total_test_count());
27341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(1, test_cases[2]->successful_test_count());
27441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(0, test_cases[2]->failed_test_count());
27541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(test_cases[2]->Passed());
27641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_FALSE(test_cases[2]->Failed());
27741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_HAS_TYPED_TEST
27841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
27941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest");
28041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);
28141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name());
28241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("ApiTest", tests[0]->test_case_name());
28341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_FALSE(tests[0]->should_run());
28441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
28541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name());
28641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("ApiTest", tests[1]->test_case_name());
28741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(IsNull(tests[1]->value_param()));
28841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(IsNull(tests[1]->type_param()));
28941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(tests[1]->should_run());
29041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(tests[1]->result()->Passed());
29141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(0, tests[1]->result()->test_property_count());
29241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
29341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name());
29441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("ApiTest", tests[2]->test_case_name());
29541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(IsNull(tests[2]->value_param()));
29641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(IsNull(tests[2]->type_param()));
29741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(tests[2]->should_run());
29841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(tests[2]->result()->Passed());
29941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(0, tests[2]->result()->test_property_count());
30041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
30141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name());
30241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("ApiTest", tests[3]->test_case_name());
30341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(IsNull(tests[3]->value_param()));
30441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(IsNull(tests[3]->type_param()));
30541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(tests[3]->should_run());
30641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(tests[3]->result()->Passed());
30741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(1, tests[3]->result()->test_property_count());
30841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    const TestProperty& property = tests[3]->result()->GetTestProperty(0);
30941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("key", property.key());
31041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("value", property.value());
31141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
31241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    delete[] tests;
31341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
31441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_TYPED_TEST
31541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0");
31641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    tests = UnitTestHelper::GetSortedTests(test_case);
31741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
31841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("Dummy", tests[0]->name());
31941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name());
32041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(IsNull(tests[0]->value_param()));
32141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());
32241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(tests[0]->should_run());
32341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_TRUE(tests[0]->result()->Passed());
32441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    EXPECT_EQ(0, tests[0]->result()->test_property_count());
32541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
32641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    delete[] tests;
32741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif  // GTEST_HAS_TYPED_TEST
32841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    delete[] test_cases;
32941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
33041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot};
33141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
33241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}  // namespace internal
33341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}  // namespace testing
33441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
33541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotint main(int argc, char **argv) {
33641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  InitGoogleTest(&argc, argv);
33741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
33841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  AddGlobalTestEnvironment(new testing::internal::FinalSuccessChecker());
33941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
34041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return RUN_ALL_TESTS();
34141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
342