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