Home | History | Annotate | Download | only in test
      1 // Copyright 2008, Google Inc.
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 //     * Redistributions of source code must retain the above copyright
      9 // notice, this list of conditions and the following disclaimer.
     10 //     * Redistributions in binary form must reproduce the above
     11 // copyright notice, this list of conditions and the following disclaimer
     12 // in the documentation and/or other materials provided with the
     13 // distribution.
     14 //     * Neither the name of Google Inc. nor the names of its
     15 // contributors may be used to endorse or promote products derived from
     16 // this software without specific prior written permission.
     17 //
     18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 //
     30 // Authors: vladl (at) google.com (Vlad Losev), wan (at) google.com (Zhanyong Wan)
     31 //
     32 // This file tests the internal cross-platform support utilities.
     33 
     34 #include <gtest/internal/gtest-port.h>
     35 
     36 #if GTEST_OS_MAC
     37 #include <pthread.h>
     38 #include <time.h>
     39 #endif  // GTEST_OS_MAC
     40 
     41 #include <gtest/gtest.h>
     42 #include <gtest/gtest-spi.h>
     43 
     44 // Indicates that this translation unit is part of Google Test's
     45 // implementation.  It must come before gtest-internal-inl.h is
     46 // included, or there will be a compiler error.  This trick is to
     47 // prevent a user from accidentally including gtest-internal-inl.h in
     48 // his code.
     49 #define GTEST_IMPLEMENTATION_ 1
     50 #include "src/gtest-internal-inl.h"
     51 #undef GTEST_IMPLEMENTATION_
     52 
     53 namespace testing {
     54 namespace internal {
     55 
     56 TEST(GtestCheckSyntaxTest, BehavesLikeASingleStatement) {
     57   if (AlwaysFalse())
     58     GTEST_CHECK_(false) << "This should never be executed; "
     59                            "It's a compilation test only.";
     60 
     61   if (AlwaysTrue())
     62     GTEST_CHECK_(true);
     63   else
     64     ;  // NOLINT
     65 
     66   if (AlwaysFalse())
     67     ;  // NOLINT
     68   else
     69     GTEST_CHECK_(true) << "";
     70 }
     71 
     72 TEST(GtestCheckSyntaxTest, WorksWithSwitch) {
     73   switch (0) {
     74     case 1:
     75       break;
     76     default:
     77       GTEST_CHECK_(true);
     78   }
     79 
     80   switch(0)
     81     case 0:
     82       GTEST_CHECK_(true) << "Check failed in switch case";
     83 }
     84 
     85 #if GTEST_OS_MAC
     86 void* ThreadFunc(void* data) {
     87   pthread_mutex_t* mutex = reinterpret_cast<pthread_mutex_t*>(data);
     88   pthread_mutex_lock(mutex);
     89   pthread_mutex_unlock(mutex);
     90   return NULL;
     91 }
     92 
     93 TEST(GetThreadCountTest, ReturnsCorrectValue) {
     94   EXPECT_EQ(1U, GetThreadCount());
     95   pthread_mutex_t mutex;
     96   pthread_attr_t  attr;
     97   pthread_t       thread_id;
     98 
     99   // TODO(vladl (at) google.com): turn mutex into internal::Mutex for automatic
    100   // destruction.
    101   pthread_mutex_init(&mutex, NULL);
    102   pthread_mutex_lock(&mutex);
    103   ASSERT_EQ(0, pthread_attr_init(&attr));
    104   ASSERT_EQ(0, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE));
    105 
    106   const int status = pthread_create(&thread_id, &attr, &ThreadFunc, &mutex);
    107   ASSERT_EQ(0, pthread_attr_destroy(&attr));
    108   ASSERT_EQ(0, status);
    109   EXPECT_EQ(2U, GetThreadCount());
    110   pthread_mutex_unlock(&mutex);
    111 
    112   void* dummy;
    113   ASSERT_EQ(0, pthread_join(thread_id, &dummy));
    114 
    115   // MacOS X may not immediately report the updated thread count after
    116   // joining a thread, causing flakiness in this test. To counter that, we
    117   // wait for up to .5 seconds for the OS to report the correct value.
    118   for (int i = 0; i < 5; ++i) {
    119     if (GetThreadCount() == 1)
    120       break;
    121 
    122     timespec time;
    123     time.tv_sec = 0;
    124     time.tv_nsec = 100L * 1000 * 1000;  // .1 seconds.
    125     nanosleep(&time, NULL);
    126   }
    127   EXPECT_EQ(1U, GetThreadCount());
    128   pthread_mutex_destroy(&mutex);
    129 }
    130 #else
    131 TEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) {
    132   EXPECT_EQ(0U, GetThreadCount());
    133 }
    134 #endif  // GTEST_OS_MAC
    135 
    136 TEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) {
    137   const bool a_false_condition = false;
    138   const char regex[] =
    139 #ifdef _MSC_VER
    140      "gtest-port_test\\.cc\\(\\d+\\):"
    141 #else
    142      "gtest-port_test\\.cc:[0-9]+"
    143 #endif  // _MSC_VER
    144      ".*a_false_condition.*Extra info.*";
    145 
    146   EXPECT_DEATH_IF_SUPPORTED(GTEST_CHECK_(a_false_condition) << "Extra info",
    147                             regex);
    148 }
    149 
    150 #if GTEST_HAS_DEATH_TEST
    151 
    152 TEST(GtestCheckDeathTest, LivesSilentlyOnSuccess) {
    153   EXPECT_EXIT({
    154       GTEST_CHECK_(true) << "Extra info";
    155       ::std::cerr << "Success\n";
    156       exit(0); },
    157       ::testing::ExitedWithCode(0), "Success");
    158 }
    159 
    160 #endif  // GTEST_HAS_DEATH_TEST
    161 
    162 #if GTEST_USES_POSIX_RE
    163 
    164 template <typename Str>
    165 class RETest : public ::testing::Test {};
    166 
    167 // Defines StringTypes as the list of all string types that class RE
    168 // supports.
    169 typedef testing::Types<
    170 #if GTEST_HAS_STD_STRING
    171     ::std::string,
    172 #endif  // GTEST_HAS_STD_STRING
    173 #if GTEST_HAS_GLOBAL_STRING
    174     ::string,
    175 #endif  // GTEST_HAS_GLOBAL_STRING
    176     const char*> StringTypes;
    177 
    178 TYPED_TEST_CASE(RETest, StringTypes);
    179 
    180 // Tests RE's implicit constructors.
    181 TYPED_TEST(RETest, ImplicitConstructorWorks) {
    182   const RE empty(TypeParam(""));
    183   EXPECT_STREQ("", empty.pattern());
    184 
    185   const RE simple(TypeParam("hello"));
    186   EXPECT_STREQ("hello", simple.pattern());
    187 
    188   const RE normal(TypeParam(".*(\\w+)"));
    189   EXPECT_STREQ(".*(\\w+)", normal.pattern());
    190 }
    191 
    192 // Tests that RE's constructors reject invalid regular expressions.
    193 TYPED_TEST(RETest, RejectsInvalidRegex) {
    194   EXPECT_NONFATAL_FAILURE({
    195     const RE invalid(TypeParam("?"));
    196   }, "\"?\" is not a valid POSIX Extended regular expression.");
    197 }
    198 
    199 // Tests RE::FullMatch().
    200 TYPED_TEST(RETest, FullMatchWorks) {
    201   const RE empty(TypeParam(""));
    202   EXPECT_TRUE(RE::FullMatch(TypeParam(""), empty));
    203   EXPECT_FALSE(RE::FullMatch(TypeParam("a"), empty));
    204 
    205   const RE re(TypeParam("a.*z"));
    206   EXPECT_TRUE(RE::FullMatch(TypeParam("az"), re));
    207   EXPECT_TRUE(RE::FullMatch(TypeParam("axyz"), re));
    208   EXPECT_FALSE(RE::FullMatch(TypeParam("baz"), re));
    209   EXPECT_FALSE(RE::FullMatch(TypeParam("azy"), re));
    210 }
    211 
    212 // Tests RE::PartialMatch().
    213 TYPED_TEST(RETest, PartialMatchWorks) {
    214   const RE empty(TypeParam(""));
    215   EXPECT_TRUE(RE::PartialMatch(TypeParam(""), empty));
    216   EXPECT_TRUE(RE::PartialMatch(TypeParam("a"), empty));
    217 
    218   const RE re(TypeParam("a.*z"));
    219   EXPECT_TRUE(RE::PartialMatch(TypeParam("az"), re));
    220   EXPECT_TRUE(RE::PartialMatch(TypeParam("axyz"), re));
    221   EXPECT_TRUE(RE::PartialMatch(TypeParam("baz"), re));
    222   EXPECT_TRUE(RE::PartialMatch(TypeParam("azy"), re));
    223   EXPECT_FALSE(RE::PartialMatch(TypeParam("zza"), re));
    224 }
    225 
    226 #elif GTEST_USES_SIMPLE_RE
    227 
    228 TEST(IsInSetTest, NulCharIsNotInAnySet) {
    229   EXPECT_FALSE(IsInSet('\0', ""));
    230   EXPECT_FALSE(IsInSet('\0', "\0"));
    231   EXPECT_FALSE(IsInSet('\0', "a"));
    232 }
    233 
    234 TEST(IsInSetTest, WorksForNonNulChars) {
    235   EXPECT_FALSE(IsInSet('a', "Ab"));
    236   EXPECT_FALSE(IsInSet('c', ""));
    237 
    238   EXPECT_TRUE(IsInSet('b', "bcd"));
    239   EXPECT_TRUE(IsInSet('b', "ab"));
    240 }
    241 
    242 TEST(IsDigitTest, IsFalseForNonDigit) {
    243   EXPECT_FALSE(IsDigit('\0'));
    244   EXPECT_FALSE(IsDigit(' '));
    245   EXPECT_FALSE(IsDigit('+'));
    246   EXPECT_FALSE(IsDigit('-'));
    247   EXPECT_FALSE(IsDigit('.'));
    248   EXPECT_FALSE(IsDigit('a'));
    249 }
    250 
    251 TEST(IsDigitTest, IsTrueForDigit) {
    252   EXPECT_TRUE(IsDigit('0'));
    253   EXPECT_TRUE(IsDigit('1'));
    254   EXPECT_TRUE(IsDigit('5'));
    255   EXPECT_TRUE(IsDigit('9'));
    256 }
    257 
    258 TEST(IsPunctTest, IsFalseForNonPunct) {
    259   EXPECT_FALSE(IsPunct('\0'));
    260   EXPECT_FALSE(IsPunct(' '));
    261   EXPECT_FALSE(IsPunct('\n'));
    262   EXPECT_FALSE(IsPunct('a'));
    263   EXPECT_FALSE(IsPunct('0'));
    264 }
    265 
    266 TEST(IsPunctTest, IsTrueForPunct) {
    267   for (const char* p = "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"; *p; p++) {
    268     EXPECT_PRED1(IsPunct, *p);
    269   }
    270 }
    271 
    272 TEST(IsRepeatTest, IsFalseForNonRepeatChar) {
    273   EXPECT_FALSE(IsRepeat('\0'));
    274   EXPECT_FALSE(IsRepeat(' '));
    275   EXPECT_FALSE(IsRepeat('a'));
    276   EXPECT_FALSE(IsRepeat('1'));
    277   EXPECT_FALSE(IsRepeat('-'));
    278 }
    279 
    280 TEST(IsRepeatTest, IsTrueForRepeatChar) {
    281   EXPECT_TRUE(IsRepeat('?'));
    282   EXPECT_TRUE(IsRepeat('*'));
    283   EXPECT_TRUE(IsRepeat('+'));
    284 }
    285 
    286 TEST(IsWhiteSpaceTest, IsFalseForNonWhiteSpace) {
    287   EXPECT_FALSE(IsWhiteSpace('\0'));
    288   EXPECT_FALSE(IsWhiteSpace('a'));
    289   EXPECT_FALSE(IsWhiteSpace('1'));
    290   EXPECT_FALSE(IsWhiteSpace('+'));
    291   EXPECT_FALSE(IsWhiteSpace('_'));
    292 }
    293 
    294 TEST(IsWhiteSpaceTest, IsTrueForWhiteSpace) {
    295   EXPECT_TRUE(IsWhiteSpace(' '));
    296   EXPECT_TRUE(IsWhiteSpace('\n'));
    297   EXPECT_TRUE(IsWhiteSpace('\r'));
    298   EXPECT_TRUE(IsWhiteSpace('\t'));
    299   EXPECT_TRUE(IsWhiteSpace('\v'));
    300   EXPECT_TRUE(IsWhiteSpace('\f'));
    301 }
    302 
    303 TEST(IsWordCharTest, IsFalseForNonWordChar) {
    304   EXPECT_FALSE(IsWordChar('\0'));
    305   EXPECT_FALSE(IsWordChar('+'));
    306   EXPECT_FALSE(IsWordChar('.'));
    307   EXPECT_FALSE(IsWordChar(' '));
    308   EXPECT_FALSE(IsWordChar('\n'));
    309 }
    310 
    311 TEST(IsWordCharTest, IsTrueForLetter) {
    312   EXPECT_TRUE(IsWordChar('a'));
    313   EXPECT_TRUE(IsWordChar('b'));
    314   EXPECT_TRUE(IsWordChar('A'));
    315   EXPECT_TRUE(IsWordChar('Z'));
    316 }
    317 
    318 TEST(IsWordCharTest, IsTrueForDigit) {
    319   EXPECT_TRUE(IsWordChar('0'));
    320   EXPECT_TRUE(IsWordChar('1'));
    321   EXPECT_TRUE(IsWordChar('7'));
    322   EXPECT_TRUE(IsWordChar('9'));
    323 }
    324 
    325 TEST(IsWordCharTest, IsTrueForUnderscore) {
    326   EXPECT_TRUE(IsWordChar('_'));
    327 }
    328 
    329 TEST(IsValidEscapeTest, IsFalseForNonPrintable) {
    330   EXPECT_FALSE(IsValidEscape('\0'));
    331   EXPECT_FALSE(IsValidEscape('\007'));
    332 }
    333 
    334 TEST(IsValidEscapeTest, IsFalseForDigit) {
    335   EXPECT_FALSE(IsValidEscape('0'));
    336   EXPECT_FALSE(IsValidEscape('9'));
    337 }
    338 
    339 TEST(IsValidEscapeTest, IsFalseForWhiteSpace) {
    340   EXPECT_FALSE(IsValidEscape(' '));
    341   EXPECT_FALSE(IsValidEscape('\n'));
    342 }
    343 
    344 TEST(IsValidEscapeTest, IsFalseForSomeLetter) {
    345   EXPECT_FALSE(IsValidEscape('a'));
    346   EXPECT_FALSE(IsValidEscape('Z'));
    347 }
    348 
    349 TEST(IsValidEscapeTest, IsTrueForPunct) {
    350   EXPECT_TRUE(IsValidEscape('.'));
    351   EXPECT_TRUE(IsValidEscape('-'));
    352   EXPECT_TRUE(IsValidEscape('^'));
    353   EXPECT_TRUE(IsValidEscape('$'));
    354   EXPECT_TRUE(IsValidEscape('('));
    355   EXPECT_TRUE(IsValidEscape(']'));
    356   EXPECT_TRUE(IsValidEscape('{'));
    357   EXPECT_TRUE(IsValidEscape('|'));
    358 }
    359 
    360 TEST(IsValidEscapeTest, IsTrueForSomeLetter) {
    361   EXPECT_TRUE(IsValidEscape('d'));
    362   EXPECT_TRUE(IsValidEscape('D'));
    363   EXPECT_TRUE(IsValidEscape('s'));
    364   EXPECT_TRUE(IsValidEscape('S'));
    365   EXPECT_TRUE(IsValidEscape('w'));
    366   EXPECT_TRUE(IsValidEscape('W'));
    367 }
    368 
    369 TEST(AtomMatchesCharTest, EscapedPunct) {
    370   EXPECT_FALSE(AtomMatchesChar(true, '\\', '\0'));
    371   EXPECT_FALSE(AtomMatchesChar(true, '\\', ' '));
    372   EXPECT_FALSE(AtomMatchesChar(true, '_', '.'));
    373   EXPECT_FALSE(AtomMatchesChar(true, '.', 'a'));
    374 
    375   EXPECT_TRUE(AtomMatchesChar(true, '\\', '\\'));
    376   EXPECT_TRUE(AtomMatchesChar(true, '_', '_'));
    377   EXPECT_TRUE(AtomMatchesChar(true, '+', '+'));
    378   EXPECT_TRUE(AtomMatchesChar(true, '.', '.'));
    379 }
    380 
    381 TEST(AtomMatchesCharTest, Escaped_d) {
    382   EXPECT_FALSE(AtomMatchesChar(true, 'd', '\0'));
    383   EXPECT_FALSE(AtomMatchesChar(true, 'd', 'a'));
    384   EXPECT_FALSE(AtomMatchesChar(true, 'd', '.'));
    385 
    386   EXPECT_TRUE(AtomMatchesChar(true, 'd', '0'));
    387   EXPECT_TRUE(AtomMatchesChar(true, 'd', '9'));
    388 }
    389 
    390 TEST(AtomMatchesCharTest, Escaped_D) {
    391   EXPECT_FALSE(AtomMatchesChar(true, 'D', '0'));
    392   EXPECT_FALSE(AtomMatchesChar(true, 'D', '9'));
    393 
    394   EXPECT_TRUE(AtomMatchesChar(true, 'D', '\0'));
    395   EXPECT_TRUE(AtomMatchesChar(true, 'D', 'a'));
    396   EXPECT_TRUE(AtomMatchesChar(true, 'D', '-'));
    397 }
    398 
    399 TEST(AtomMatchesCharTest, Escaped_s) {
    400   EXPECT_FALSE(AtomMatchesChar(true, 's', '\0'));
    401   EXPECT_FALSE(AtomMatchesChar(true, 's', 'a'));
    402   EXPECT_FALSE(AtomMatchesChar(true, 's', '.'));
    403   EXPECT_FALSE(AtomMatchesChar(true, 's', '9'));
    404 
    405   EXPECT_TRUE(AtomMatchesChar(true, 's', ' '));
    406   EXPECT_TRUE(AtomMatchesChar(true, 's', '\n'));
    407   EXPECT_TRUE(AtomMatchesChar(true, 's', '\t'));
    408 }
    409 
    410 TEST(AtomMatchesCharTest, Escaped_S) {
    411   EXPECT_FALSE(AtomMatchesChar(true, 'S', ' '));
    412   EXPECT_FALSE(AtomMatchesChar(true, 'S', '\r'));
    413 
    414   EXPECT_TRUE(AtomMatchesChar(true, 'S', '\0'));
    415   EXPECT_TRUE(AtomMatchesChar(true, 'S', 'a'));
    416   EXPECT_TRUE(AtomMatchesChar(true, 'S', '9'));
    417 }
    418 
    419 TEST(AtomMatchesCharTest, Escaped_w) {
    420   EXPECT_FALSE(AtomMatchesChar(true, 'w', '\0'));
    421   EXPECT_FALSE(AtomMatchesChar(true, 'w', '+'));
    422   EXPECT_FALSE(AtomMatchesChar(true, 'w', ' '));
    423   EXPECT_FALSE(AtomMatchesChar(true, 'w', '\n'));
    424 
    425   EXPECT_TRUE(AtomMatchesChar(true, 'w', '0'));
    426   EXPECT_TRUE(AtomMatchesChar(true, 'w', 'b'));
    427   EXPECT_TRUE(AtomMatchesChar(true, 'w', 'C'));
    428   EXPECT_TRUE(AtomMatchesChar(true, 'w', '_'));
    429 }
    430 
    431 TEST(AtomMatchesCharTest, Escaped_W) {
    432   EXPECT_FALSE(AtomMatchesChar(true, 'W', 'A'));
    433   EXPECT_FALSE(AtomMatchesChar(true, 'W', 'b'));
    434   EXPECT_FALSE(AtomMatchesChar(true, 'W', '9'));
    435   EXPECT_FALSE(AtomMatchesChar(true, 'W', '_'));
    436 
    437   EXPECT_TRUE(AtomMatchesChar(true, 'W', '\0'));
    438   EXPECT_TRUE(AtomMatchesChar(true, 'W', '*'));
    439   EXPECT_TRUE(AtomMatchesChar(true, 'W', '\n'));
    440 }
    441 
    442 TEST(AtomMatchesCharTest, EscapedWhiteSpace) {
    443   EXPECT_FALSE(AtomMatchesChar(true, 'f', '\0'));
    444   EXPECT_FALSE(AtomMatchesChar(true, 'f', '\n'));
    445   EXPECT_FALSE(AtomMatchesChar(true, 'n', '\0'));
    446   EXPECT_FALSE(AtomMatchesChar(true, 'n', '\r'));
    447   EXPECT_FALSE(AtomMatchesChar(true, 'r', '\0'));
    448   EXPECT_FALSE(AtomMatchesChar(true, 'r', 'a'));
    449   EXPECT_FALSE(AtomMatchesChar(true, 't', '\0'));
    450   EXPECT_FALSE(AtomMatchesChar(true, 't', 't'));
    451   EXPECT_FALSE(AtomMatchesChar(true, 'v', '\0'));
    452   EXPECT_FALSE(AtomMatchesChar(true, 'v', '\f'));
    453 
    454   EXPECT_TRUE(AtomMatchesChar(true, 'f', '\f'));
    455   EXPECT_TRUE(AtomMatchesChar(true, 'n', '\n'));
    456   EXPECT_TRUE(AtomMatchesChar(true, 'r', '\r'));
    457   EXPECT_TRUE(AtomMatchesChar(true, 't', '\t'));
    458   EXPECT_TRUE(AtomMatchesChar(true, 'v', '\v'));
    459 }
    460 
    461 TEST(AtomMatchesCharTest, UnescapedDot) {
    462   EXPECT_FALSE(AtomMatchesChar(false, '.', '\n'));
    463 
    464   EXPECT_TRUE(AtomMatchesChar(false, '.', '\0'));
    465   EXPECT_TRUE(AtomMatchesChar(false, '.', '.'));
    466   EXPECT_TRUE(AtomMatchesChar(false, '.', 'a'));
    467   EXPECT_TRUE(AtomMatchesChar(false, '.', ' '));
    468 }
    469 
    470 TEST(AtomMatchesCharTest, UnescapedChar) {
    471   EXPECT_FALSE(AtomMatchesChar(false, 'a', '\0'));
    472   EXPECT_FALSE(AtomMatchesChar(false, 'a', 'b'));
    473   EXPECT_FALSE(AtomMatchesChar(false, '$', 'a'));
    474 
    475   EXPECT_TRUE(AtomMatchesChar(false, '$', '$'));
    476   EXPECT_TRUE(AtomMatchesChar(false, '5', '5'));
    477   EXPECT_TRUE(AtomMatchesChar(false, 'Z', 'Z'));
    478 }
    479 
    480 TEST(ValidateRegexTest, GeneratesFailureAndReturnsFalseForInvalid) {
    481   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(NULL)),
    482                           "NULL is not a valid simple regular expression");
    483   EXPECT_NONFATAL_FAILURE(
    484       ASSERT_FALSE(ValidateRegex("a\\")),
    485       "Syntax error at index 1 in simple regular expression \"a\\\": ");
    486   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a\\")),
    487                           "'\\' cannot appear at the end");
    488   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\n\\")),
    489                           "'\\' cannot appear at the end");
    490   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\s\\hb")),
    491                           "invalid escape sequence \"\\h\"");
    492   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^^")),
    493                           "'^' can only appear at the beginning");
    494   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(".*^b")),
    495                           "'^' can only appear at the beginning");
    496   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("$$")),
    497                           "'$' can only appear at the end");
    498   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^$a")),
    499                           "'$' can only appear at the end");
    500   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a(b")),
    501                           "'(' is unsupported");
    502   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("ab)")),
    503                           "')' is unsupported");
    504   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("[ab")),
    505                           "'[' is unsupported");
    506   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a{2")),
    507                           "'{' is unsupported");
    508   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("?")),
    509                           "'?' can only follow a repeatable token");
    510   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^*")),
    511                           "'*' can only follow a repeatable token");
    512   EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("5*+")),
    513                           "'+' can only follow a repeatable token");
    514 }
    515 
    516 TEST(ValidateRegexTest, ReturnsTrueForValid) {
    517   EXPECT_TRUE(ValidateRegex(""));
    518   EXPECT_TRUE(ValidateRegex("a"));
    519   EXPECT_TRUE(ValidateRegex(".*"));
    520   EXPECT_TRUE(ValidateRegex("^a_+"));
    521   EXPECT_TRUE(ValidateRegex("^a\\t\\&?"));
    522   EXPECT_TRUE(ValidateRegex("09*$"));
    523   EXPECT_TRUE(ValidateRegex("^Z$"));
    524   EXPECT_TRUE(ValidateRegex("a\\^Z\\$\\(\\)\\|\\[\\]\\{\\}"));
    525 }
    526 
    527 TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrOne) {
    528   EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "a", "ba"));
    529   // Repeating more than once.
    530   EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "aab"));
    531 
    532   // Repeating zero times.
    533   EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ba"));
    534   // Repeating once.
    535   EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ab"));
    536   EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '#', '?', ".", "##"));
    537 }
    538 
    539 TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrMany) {
    540   EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '*', "a$", "baab"));
    541 
    542   // Repeating zero times.
    543   EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "bc"));
    544   // Repeating once.
    545   EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "abc"));
    546   // Repeating more than once.
    547   EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '*', "-", "ab_1-g"));
    548 }
    549 
    550 TEST(MatchRepetitionAndRegexAtHeadTest, WorksForOneOrMany) {
    551   EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "a$", "baab"));
    552   // Repeating zero times.
    553   EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "bc"));
    554 
    555   // Repeating once.
    556   EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "abc"));
    557   // Repeating more than once.
    558   EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '+', "-", "ab_1-g"));
    559 }
    560 
    561 TEST(MatchRegexAtHeadTest, ReturnsTrueForEmptyRegex) {
    562   EXPECT_TRUE(MatchRegexAtHead("", ""));
    563   EXPECT_TRUE(MatchRegexAtHead("", "ab"));
    564 }
    565 
    566 TEST(MatchRegexAtHeadTest, WorksWhenDollarIsInRegex) {
    567   EXPECT_FALSE(MatchRegexAtHead("$", "a"));
    568 
    569   EXPECT_TRUE(MatchRegexAtHead("$", ""));
    570   EXPECT_TRUE(MatchRegexAtHead("a$", "a"));
    571 }
    572 
    573 TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithEscapeSequence) {
    574   EXPECT_FALSE(MatchRegexAtHead("\\w", "+"));
    575   EXPECT_FALSE(MatchRegexAtHead("\\W", "ab"));
    576 
    577   EXPECT_TRUE(MatchRegexAtHead("\\sa", "\nab"));
    578   EXPECT_TRUE(MatchRegexAtHead("\\d", "1a"));
    579 }
    580 
    581 TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithRepetition) {
    582   EXPECT_FALSE(MatchRegexAtHead(".+a", "abc"));
    583   EXPECT_FALSE(MatchRegexAtHead("a?b", "aab"));
    584 
    585   EXPECT_TRUE(MatchRegexAtHead(".*a", "bc12-ab"));
    586   EXPECT_TRUE(MatchRegexAtHead("a?b", "b"));
    587   EXPECT_TRUE(MatchRegexAtHead("a?b", "ab"));
    588 }
    589 
    590 TEST(MatchRegexAtHeadTest,
    591      WorksWhenRegexStartsWithRepetionOfEscapeSequence) {
    592   EXPECT_FALSE(MatchRegexAtHead("\\.+a", "abc"));
    593   EXPECT_FALSE(MatchRegexAtHead("\\s?b", "  b"));
    594 
    595   EXPECT_TRUE(MatchRegexAtHead("\\(*a", "((((ab"));
    596   EXPECT_TRUE(MatchRegexAtHead("\\^?b", "^b"));
    597   EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "b"));
    598   EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "\\b"));
    599 }
    600 
    601 TEST(MatchRegexAtHeadTest, MatchesSequentially) {
    602   EXPECT_FALSE(MatchRegexAtHead("ab.*c", "acabc"));
    603 
    604   EXPECT_TRUE(MatchRegexAtHead("ab.*c", "ab-fsc"));
    605 }
    606 
    607 TEST(MatchRegexAnywhereTest, ReturnsFalseWhenStringIsNull) {
    608   EXPECT_FALSE(MatchRegexAnywhere("", NULL));
    609 }
    610 
    611 TEST(MatchRegexAnywhereTest, WorksWhenRegexStartsWithCaret) {
    612   EXPECT_FALSE(MatchRegexAnywhere("^a", "ba"));
    613   EXPECT_FALSE(MatchRegexAnywhere("^$", "a"));
    614 
    615   EXPECT_TRUE(MatchRegexAnywhere("^a", "ab"));
    616   EXPECT_TRUE(MatchRegexAnywhere("^", "ab"));
    617   EXPECT_TRUE(MatchRegexAnywhere("^$", ""));
    618 }
    619 
    620 TEST(MatchRegexAnywhereTest, ReturnsFalseWhenNoMatch) {
    621   EXPECT_FALSE(MatchRegexAnywhere("a", "bcde123"));
    622   EXPECT_FALSE(MatchRegexAnywhere("a.+a", "--aa88888888"));
    623 }
    624 
    625 TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingPrefix) {
    626   EXPECT_TRUE(MatchRegexAnywhere("\\w+", "ab1_ - 5"));
    627   EXPECT_TRUE(MatchRegexAnywhere(".*=", "="));
    628   EXPECT_TRUE(MatchRegexAnywhere("x.*ab?.*bc", "xaaabc"));
    629 }
    630 
    631 TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingNonPrefix) {
    632   EXPECT_TRUE(MatchRegexAnywhere("\\w+", "$$$ ab1_ - 5"));
    633   EXPECT_TRUE(MatchRegexAnywhere("\\.+=", "=  ...="));
    634 }
    635 
    636 // Tests RE's implicit constructors.
    637 TEST(RETest, ImplicitConstructorWorks) {
    638   const RE empty("");
    639   EXPECT_STREQ("", empty.pattern());
    640 
    641   const RE simple("hello");
    642   EXPECT_STREQ("hello", simple.pattern());
    643 }
    644 
    645 // Tests that RE's constructors reject invalid regular expressions.
    646 TEST(RETest, RejectsInvalidRegex) {
    647   EXPECT_NONFATAL_FAILURE({
    648     const RE normal(NULL);
    649   }, "NULL is not a valid simple regular expression");
    650 
    651   EXPECT_NONFATAL_FAILURE({
    652     const RE normal(".*(\\w+");
    653   }, "'(' is unsupported");
    654 
    655   EXPECT_NONFATAL_FAILURE({
    656     const RE invalid("^?");
    657   }, "'?' can only follow a repeatable token");
    658 }
    659 
    660 // Tests RE::FullMatch().
    661 TEST(RETest, FullMatchWorks) {
    662   const RE empty("");
    663   EXPECT_TRUE(RE::FullMatch("", empty));
    664   EXPECT_FALSE(RE::FullMatch("a", empty));
    665 
    666   const RE re1("a");
    667   EXPECT_TRUE(RE::FullMatch("a", re1));
    668 
    669   const RE re("a.*z");
    670   EXPECT_TRUE(RE::FullMatch("az", re));
    671   EXPECT_TRUE(RE::FullMatch("axyz", re));
    672   EXPECT_FALSE(RE::FullMatch("baz", re));
    673   EXPECT_FALSE(RE::FullMatch("azy", re));
    674 }
    675 
    676 // Tests RE::PartialMatch().
    677 TEST(RETest, PartialMatchWorks) {
    678   const RE empty("");
    679   EXPECT_TRUE(RE::PartialMatch("", empty));
    680   EXPECT_TRUE(RE::PartialMatch("a", empty));
    681 
    682   const RE re("a.*z");
    683   EXPECT_TRUE(RE::PartialMatch("az", re));
    684   EXPECT_TRUE(RE::PartialMatch("axyz", re));
    685   EXPECT_TRUE(RE::PartialMatch("baz", re));
    686   EXPECT_TRUE(RE::PartialMatch("azy", re));
    687   EXPECT_FALSE(RE::PartialMatch("zza", re));
    688 }
    689 
    690 #endif  // GTEST_USES_POSIX_RE
    691 
    692 TEST(CaptureStderrTest, CapturesStdErr) {
    693   CaptureStderr();
    694   fprintf(stderr, "abc");
    695   ASSERT_STREQ("abc", GetCapturedStderr().c_str());
    696 }
    697 
    698 }  // namespace internal
    699 }  // namespace testing
    700