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