17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Copyright 2008 Google Inc.
27ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// All Rights Reserved.
37ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Redistribution and use in source and binary forms, with or without
57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// modification, are permitted provided that the following conditions are
67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// met:
77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Redistributions of source code must retain the above copyright
97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// notice, this list of conditions and the following disclaimer.
107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Redistributions in binary form must reproduce the above
117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// copyright notice, this list of conditions and the following disclaimer
127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in the documentation and/or other materials provided with the
137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// distribution.
147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Neither the name of Google Inc. nor the names of its
157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// contributors may be used to endorse or promote products derived from
167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this software without specific prior written permission.
177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Author: wan@google.com (Zhanyong Wan)
317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
32b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/gtest-typed-test.h"
33b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/gtest.h"
347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace testing {
367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal {
377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
38e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_HAS_TYPED_TEST_P
397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Skips to the first non-space char in str. Returns an empty string if str
4157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// contains only whitespace characters.
4257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerstatic const char* SkipSpaces(const char* str) {
43b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  while (IsSpace(*str))
4457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    str++;
4557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  return str;
4657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer}
4757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Verifies that registered_tests match the test names in
497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// defined_test_names_; returns registered_tests if successful, or
507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// aborts the program otherwise.
517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanconst char* TypedTestCasePState::VerifyRegisteredTestNames(
527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* file, int line, const char* registered_tests) {
537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  typedef ::std::set<const char*>::const_iterator DefinedTestIter;
547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  registered_ = true;
557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
5657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Skip initial whitespace in registered_tests since some
5757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // preprocessors prefix stringizied literals with whitespace.
5857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  registered_tests = SkipSpaces(registered_tests);
5957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  Message errors;
617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ::std::set<String> tests;
627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  for (const char* names = registered_tests; names != NULL;
637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman       names = SkipComma(names)) {
647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const String name = GetPrefixUntilComma(names);
657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    if (tests.count(name) != 0) {
667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      errors << "Test " << name << " is listed more than once.\n";
677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      continue;
687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }
697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    bool found = false;
717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    for (DefinedTestIter it = defined_test_names_.begin();
727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman         it != defined_test_names_.end();
737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman         ++it) {
747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      if (name == *it) {
757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        found = true;
767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        break;
777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      }
787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }
797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    if (found) {
817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      tests.insert(name);
827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    } else {
837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      errors << "No test named " << name
847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman             << " can be found in this test case.\n";
857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }
867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  for (DefinedTestIter it = defined_test_names_.begin();
897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman       it != defined_test_names_.end();
907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman       ++it) {
917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    if (tests.count(*it) == 0) {
927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      errors << "You forgot to list test " << *it << ".\n";
937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }
947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const String& errors_str = errors.GetString();
977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (errors_str != "") {
987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman            errors_str.c_str());
100e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer    fflush(stderr);
101190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    posix::Abort();
1027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
1037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return registered_tests;
1057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
1067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_TYPED_TEST_P
1087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace internal
1107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace testing
111