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