1aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2008, Google Inc.
2aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
3aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
4aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
5aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
6aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
7aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
9aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
10aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
11aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
12aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
13aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
14aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
15aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
16aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
17aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
30aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: wan@google.com (Zhanyong Wan)
31aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
32aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests the --gtest_repeat=number flag.
33aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
34aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <stdlib.h>
35aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <iostream>
36aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include "gtest/gtest.h"
37aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
38aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Indicates that this translation unit is part of Google Test's
39aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// implementation.  It must come before gtest-internal-inl.h is
40aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// included, or there will be a compiler error.  This trick is to
41aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// prevent a user from accidentally including gtest-internal-inl.h in
42aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// his code.
43aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_IMPLEMENTATION_ 1
44aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include "src/gtest-internal-inl.h"
45aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_IMPLEMENTATION_
46aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
47aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
48aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
49aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_string_(death_test_style);
50aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_string_(filter);
51aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_int32_(repeat);
52aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
53aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
54aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
55aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing testing::GTEST_FLAG(death_test_style);
56aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing testing::GTEST_FLAG(filter);
57aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing testing::GTEST_FLAG(repeat);
58aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
59aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace {
60aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
61aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We need this when we are testing Google Test itself and therefore
62aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// cannot use Google Test assertions.
63aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_CHECK_INT_EQ_(expected, actual) \
64aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  do {\
65aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const int expected_val = (expected);\
66aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const int actual_val = (actual);\
67aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (::testing::internal::IsTrue(expected_val != actual_val)) {\
68aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ::std::cout << "Value of: " #actual "\n"\
69aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                  << "  Actual: " << actual_val << "\n"\
70aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                  << "Expected: " #expected "\n"\
71aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                  << "Which is: " << expected_val << "\n";\
72aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ::testing::internal::posix::Abort();\
73aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }\
74aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } while (::testing::internal::AlwaysFalse())
75aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
76aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
77aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Used for verifying that global environment set-up and tear-down are
78aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// inside the gtest_repeat loop.
79aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
80aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterint g_environment_set_up_count = 0;
81aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterint g_environment_tear_down_count = 0;
82aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
83aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass MyEnvironment : public testing::Environment {
84aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
85aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  MyEnvironment() {}
86aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void SetUp() { g_environment_set_up_count++; }
87aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void TearDown() { g_environment_tear_down_count++; }
88aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
89aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
90aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A test that should fail.
91aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
92aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterint g_should_fail_count = 0;
93aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
94aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST(FooTest, ShouldFail) {
95aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  g_should_fail_count++;
96aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_EQ(0, 1) << "Expected failure.";
97aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
98aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
99aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A test that should pass.
100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterint g_should_pass_count = 0;
102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST(FooTest, ShouldPass) {
104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  g_should_pass_count++;
105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A test that contains a thread-safe death test and a fast death
108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// test.  It should pass.
109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterint g_death_test_count = 0;
111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST(BarDeathTest, ThreadSafeAndFast) {
113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  g_death_test_count++;
114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_FLAG(death_test_style) = "threadsafe";
116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), "");
117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_FLAG(death_test_style) = "fast";
119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), "");
120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST
123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterint g_param_test_count = 0;
124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst int kNumberOfParamTests = 10;
126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass MyParamTest : public testing::TestWithParam<int> {};
128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST_P(MyParamTest, ShouldPass) {
130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TODO(vladl@google.com): Make parameter value checking robust
131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //                         WRT order of tests.
132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(g_param_test_count % kNumberOfParamTests, GetParam());
133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  g_param_test_count++;
134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterINSTANTIATE_TEST_CASE_P(MyParamSequence,
136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                        MyParamTest,
137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                        testing::Range(0, kNumberOfParamTests));
138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_PARAM_TEST
139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Resets the count for each test.
141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid ResetCounts() {
142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  g_environment_set_up_count = 0;
143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  g_environment_tear_down_count = 0;
144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  g_should_fail_count = 0;
145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  g_should_pass_count = 0;
146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  g_death_test_count = 0;
147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST
148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  g_param_test_count = 0;
149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_PARAM_TEST
150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Checks that the count for each test is expected.
153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid CheckCounts(int expected) {
154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(expected, g_environment_set_up_count);
155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(expected, g_environment_tear_down_count);
156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(expected, g_should_fail_count);
157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(expected, g_should_pass_count);
158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(expected, g_death_test_count);
159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST
160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(expected * kNumberOfParamTests, g_param_test_count);
161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_PARAM_TEST
162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests the behavior of Google Test when --gtest_repeat is not specified.
165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid TestRepeatUnspecified() {
166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ResetCounts();
167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CheckCounts(1);
169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests the behavior of Google Test when --gtest_repeat has the given value.
172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid TestRepeat(int repeat) {
173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_FLAG(repeat) = repeat;
174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ResetCounts();
176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(repeat > 0 ? 1 : 0, RUN_ALL_TESTS());
177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CheckCounts(repeat);
178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests using --gtest_repeat when --gtest_filter specifies an empty
181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// set of tests.
182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid TestRepeatWithEmptyFilter(int repeat) {
183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_FLAG(repeat) = repeat;
184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_FLAG(filter) = "None";
185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ResetCounts();
187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CheckCounts(0);
189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests using --gtest_repeat when --gtest_filter specifies a set of
192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// successful tests.
193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid TestRepeatWithFilterForSuccessfulTests(int repeat) {
194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_FLAG(repeat) = repeat;
195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_FLAG(filter) = "*-*ShouldFail";
196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ResetCounts();
198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(0, g_should_fail_count);
202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(repeat, g_should_pass_count);
203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(repeat, g_death_test_count);
204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST
205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(repeat * kNumberOfParamTests, g_param_test_count);
206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_PARAM_TEST
207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests using --gtest_repeat when --gtest_filter specifies a set of
210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// failed tests.
211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid TestRepeatWithFilterForFailedTests(int repeat) {
212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_FLAG(repeat) = repeat;
213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_FLAG(filter) = "*ShouldFail";
214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ResetCounts();
216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(repeat, g_should_fail_count);
220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(0, g_should_pass_count);
221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(0, g_death_test_count);
222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST
223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_INT_EQ_(0, g_param_test_count);
224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_PARAM_TEST
225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace
228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterint main(int argc, char **argv) {
230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  testing::InitGoogleTest(&argc, argv);
231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  testing::AddGlobalTestEnvironment(new MyEnvironment);
232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestRepeatUnspecified();
234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestRepeat(0);
235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestRepeat(1);
236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestRepeat(5);
237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestRepeatWithEmptyFilter(2);
239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestRepeatWithEmptyFilter(3);
240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestRepeatWithFilterForSuccessfulTests(3);
242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestRepeatWithFilterForFailedTests(4);
244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // It would be nice to verify that the tests indeed loop forever
246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // when GTEST_FLAG(repeat) is negative, but this test will be quite
247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // complicated to write.  Since this flag is for interactive
248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // debugging only and doesn't affect the normal test result, such a
249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // test would be an overkill.
250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  printf("PASS\n");
252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return 0;
253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
254