113481Sgiacomo.travaglini@arm.com// Copyright 2008 Google Inc.
213481Sgiacomo.travaglini@arm.com// All Rights Reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3113481Sgiacomo.travaglini@arm.com
3213481Sgiacomo.travaglini@arm.com#include "gtest/gtest-typed-test.h"
3313481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h"
3413481Sgiacomo.travaglini@arm.com
3513481Sgiacomo.travaglini@arm.comnamespace testing {
3613481Sgiacomo.travaglini@arm.comnamespace internal {
3713481Sgiacomo.travaglini@arm.com
3813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_TYPED_TEST_P
3913481Sgiacomo.travaglini@arm.com
4013481Sgiacomo.travaglini@arm.com// Skips to the first non-space char in str. Returns an empty string if str
4113481Sgiacomo.travaglini@arm.com// contains only whitespace characters.
4213481Sgiacomo.travaglini@arm.comstatic const char* SkipSpaces(const char* str) {
4313481Sgiacomo.travaglini@arm.com  while (IsSpace(*str))
4413481Sgiacomo.travaglini@arm.com    str++;
4513481Sgiacomo.travaglini@arm.com  return str;
4613481Sgiacomo.travaglini@arm.com}
4713481Sgiacomo.travaglini@arm.com
4813481Sgiacomo.travaglini@arm.comstatic std::vector<std::string> SplitIntoTestNames(const char* src) {
4913481Sgiacomo.travaglini@arm.com  std::vector<std::string> name_vec;
5013481Sgiacomo.travaglini@arm.com  src = SkipSpaces(src);
5113481Sgiacomo.travaglini@arm.com  for (; src != NULL; src = SkipComma(src)) {
5213481Sgiacomo.travaglini@arm.com    name_vec.push_back(StripTrailingSpaces(GetPrefixUntilComma(src)));
5313481Sgiacomo.travaglini@arm.com  }
5413481Sgiacomo.travaglini@arm.com  return name_vec;
5513481Sgiacomo.travaglini@arm.com}
5613481Sgiacomo.travaglini@arm.com
5713481Sgiacomo.travaglini@arm.com// Verifies that registered_tests match the test names in
5813481Sgiacomo.travaglini@arm.com// registered_tests_; returns registered_tests if successful, or
5913481Sgiacomo.travaglini@arm.com// aborts the program otherwise.
6013481Sgiacomo.travaglini@arm.comconst char* TypedTestCasePState::VerifyRegisteredTestNames(
6113481Sgiacomo.travaglini@arm.com    const char* file, int line, const char* registered_tests) {
6213481Sgiacomo.travaglini@arm.com  typedef RegisteredTestsMap::const_iterator RegisteredTestIter;
6313481Sgiacomo.travaglini@arm.com  registered_ = true;
6413481Sgiacomo.travaglini@arm.com
6513481Sgiacomo.travaglini@arm.com  std::vector<std::string> name_vec = SplitIntoTestNames(registered_tests);
6613481Sgiacomo.travaglini@arm.com
6713481Sgiacomo.travaglini@arm.com  Message errors;
6813481Sgiacomo.travaglini@arm.com
6913481Sgiacomo.travaglini@arm.com  std::set<std::string> tests;
7013481Sgiacomo.travaglini@arm.com  for (std::vector<std::string>::const_iterator name_it = name_vec.begin();
7113481Sgiacomo.travaglini@arm.com       name_it != name_vec.end(); ++name_it) {
7213481Sgiacomo.travaglini@arm.com    const std::string& name = *name_it;
7313481Sgiacomo.travaglini@arm.com    if (tests.count(name) != 0) {
7413481Sgiacomo.travaglini@arm.com      errors << "Test " << name << " is listed more than once.\n";
7513481Sgiacomo.travaglini@arm.com      continue;
7613481Sgiacomo.travaglini@arm.com    }
7713481Sgiacomo.travaglini@arm.com
7813481Sgiacomo.travaglini@arm.com    bool found = false;
7913481Sgiacomo.travaglini@arm.com    for (RegisteredTestIter it = registered_tests_.begin();
8013481Sgiacomo.travaglini@arm.com         it != registered_tests_.end();
8113481Sgiacomo.travaglini@arm.com         ++it) {
8213481Sgiacomo.travaglini@arm.com      if (name == it->first) {
8313481Sgiacomo.travaglini@arm.com        found = true;
8413481Sgiacomo.travaglini@arm.com        break;
8513481Sgiacomo.travaglini@arm.com      }
8613481Sgiacomo.travaglini@arm.com    }
8713481Sgiacomo.travaglini@arm.com
8813481Sgiacomo.travaglini@arm.com    if (found) {
8913481Sgiacomo.travaglini@arm.com      tests.insert(name);
9013481Sgiacomo.travaglini@arm.com    } else {
9113481Sgiacomo.travaglini@arm.com      errors << "No test named " << name
9213481Sgiacomo.travaglini@arm.com             << " can be found in this test case.\n";
9313481Sgiacomo.travaglini@arm.com    }
9413481Sgiacomo.travaglini@arm.com  }
9513481Sgiacomo.travaglini@arm.com
9613481Sgiacomo.travaglini@arm.com  for (RegisteredTestIter it = registered_tests_.begin();
9713481Sgiacomo.travaglini@arm.com       it != registered_tests_.end();
9813481Sgiacomo.travaglini@arm.com       ++it) {
9913481Sgiacomo.travaglini@arm.com    if (tests.count(it->first) == 0) {
10013481Sgiacomo.travaglini@arm.com      errors << "You forgot to list test " << it->first << ".\n";
10113481Sgiacomo.travaglini@arm.com    }
10213481Sgiacomo.travaglini@arm.com  }
10313481Sgiacomo.travaglini@arm.com
10413481Sgiacomo.travaglini@arm.com  const std::string& errors_str = errors.GetString();
10513481Sgiacomo.travaglini@arm.com  if (errors_str != "") {
10613481Sgiacomo.travaglini@arm.com    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
10713481Sgiacomo.travaglini@arm.com            errors_str.c_str());
10813481Sgiacomo.travaglini@arm.com    fflush(stderr);
10913481Sgiacomo.travaglini@arm.com    posix::Abort();
11013481Sgiacomo.travaglini@arm.com  }
11113481Sgiacomo.travaglini@arm.com
11213481Sgiacomo.travaglini@arm.com  return registered_tests;
11313481Sgiacomo.travaglini@arm.com}
11413481Sgiacomo.travaglini@arm.com
11513481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_TYPED_TEST_P
11613481Sgiacomo.travaglini@arm.com
11713481Sgiacomo.travaglini@arm.com}  // namespace internal
11813481Sgiacomo.travaglini@arm.com}  // namespace testing
119