1dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2008 Google Inc.
2dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All Rights Reserved.
3dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without
5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are
6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met:
7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions of source code must retain the above copyright
9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer.
10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions in binary form must reproduce the above
11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer
12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the
13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution.
14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Neither the name of Google Inc. nor the names of its
15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from
16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission.
17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Author: wan@google.com (Zhanyong Wan)
31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest-typed-test.h"
3346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest.h"
34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace testing {
36dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace internal {
37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_HAS_TYPED_TEST_P
39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Skips to the first non-space char in str. Returns an empty string if str
4146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// contains only whitespace characters.
4246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstatic const char* SkipSpaces(const char* str) {
4346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  while (IsSpace(*str))
4446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    str++;
4546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return str;
4646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
4746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
48dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that registered_tests match the test names in
49dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// defined_test_names_; returns registered_tests if successful, or
50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// aborts the program otherwise.
51dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterconst char* TypedTestCasePState::VerifyRegisteredTestNames(
52dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const char* file, int line, const char* registered_tests) {
53dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::set<const char*>::const_iterator DefinedTestIter;
54dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  registered_ = true;
55dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // Skip initial whitespace in registered_tests since some
5746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // preprocessors prefix stringizied literals with whitespace.
5846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  registered_tests = SkipSpaces(registered_tests);
5946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
60dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Message errors;
61dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ::std::set<String> tests;
62dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  for (const char* names = registered_tests; names != NULL;
63dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter       names = SkipComma(names)) {
64dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const String name = GetPrefixUntilComma(names);
65dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if (tests.count(name) != 0) {
66dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      errors << "Test " << name << " is listed more than once.\n";
67dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      continue;
68dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
69dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
70dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    bool found = false;
71dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    for (DefinedTestIter it = defined_test_names_.begin();
72dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         it != defined_test_names_.end();
73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         ++it) {
74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (name == *it) {
75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        found = true;
76dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        break;
77dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if (found) {
81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      tests.insert(name);
82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    } else {
83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      errors << "No test named " << name
84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter             << " can be found in this test case.\n";
85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  for (DefinedTestIter it = defined_test_names_.begin();
89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter       it != defined_test_names_.end();
90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter       ++it) {
91dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if (tests.count(*it) == 0) {
92dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      errors << "You forgot to list test " << *it << ".\n";
93dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const String& errors_str = errors.GetString();
97dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  if (errors_str != "") {
98dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            errors_str.c_str());
100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    fflush(stderr);
10146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    posix::Abort();
102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return registered_tests;
105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  // GTEST_HAS_TYPED_TEST_P
108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace internal
110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace testing
111