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@google.com (Vlad Losev), wan@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 53namespace testing { 54namespace internal { 55 56TEST(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 72TEST(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 86void* 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 93TEST(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@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 131TEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) { 132 EXPECT_EQ(0U, GetThreadCount()); 133} 134#endif // GTEST_OS_MAC 135 136TEST(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 152TEST(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 164template <typename Str> 165class RETest : public ::testing::Test {}; 166 167// Defines StringTypes as the list of all string types that class RE 168// supports. 169typedef 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 178TYPED_TEST_CASE(RETest, StringTypes); 179 180// Tests RE's implicit constructors. 181TYPED_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. 193TYPED_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(). 200TYPED_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(). 213TYPED_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 228TEST(IsInSetTest, NulCharIsNotInAnySet) { 229 EXPECT_FALSE(IsInSet('\0', "")); 230 EXPECT_FALSE(IsInSet('\0', "\0")); 231 EXPECT_FALSE(IsInSet('\0', "a")); 232} 233 234TEST(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 242TEST(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 251TEST(IsDigitTest, IsTrueForDigit) { 252 EXPECT_TRUE(IsDigit('0')); 253 EXPECT_TRUE(IsDigit('1')); 254 EXPECT_TRUE(IsDigit('5')); 255 EXPECT_TRUE(IsDigit('9')); 256} 257 258TEST(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 266TEST(IsPunctTest, IsTrueForPunct) { 267 for (const char* p = "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"; *p; p++) { 268 EXPECT_PRED1(IsPunct, *p); 269 } 270} 271 272TEST(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 280TEST(IsRepeatTest, IsTrueForRepeatChar) { 281 EXPECT_TRUE(IsRepeat('?')); 282 EXPECT_TRUE(IsRepeat('*')); 283 EXPECT_TRUE(IsRepeat('+')); 284} 285 286TEST(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 294TEST(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 303TEST(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 311TEST(IsWordCharTest, IsTrueForLetter) { 312 EXPECT_TRUE(IsWordChar('a')); 313 EXPECT_TRUE(IsWordChar('b')); 314 EXPECT_TRUE(IsWordChar('A')); 315 EXPECT_TRUE(IsWordChar('Z')); 316} 317 318TEST(IsWordCharTest, IsTrueForDigit) { 319 EXPECT_TRUE(IsWordChar('0')); 320 EXPECT_TRUE(IsWordChar('1')); 321 EXPECT_TRUE(IsWordChar('7')); 322 EXPECT_TRUE(IsWordChar('9')); 323} 324 325TEST(IsWordCharTest, IsTrueForUnderscore) { 326 EXPECT_TRUE(IsWordChar('_')); 327} 328 329TEST(IsValidEscapeTest, IsFalseForNonPrintable) { 330 EXPECT_FALSE(IsValidEscape('\0')); 331 EXPECT_FALSE(IsValidEscape('\007')); 332} 333 334TEST(IsValidEscapeTest, IsFalseForDigit) { 335 EXPECT_FALSE(IsValidEscape('0')); 336 EXPECT_FALSE(IsValidEscape('9')); 337} 338 339TEST(IsValidEscapeTest, IsFalseForWhiteSpace) { 340 EXPECT_FALSE(IsValidEscape(' ')); 341 EXPECT_FALSE(IsValidEscape('\n')); 342} 343 344TEST(IsValidEscapeTest, IsFalseForSomeLetter) { 345 EXPECT_FALSE(IsValidEscape('a')); 346 EXPECT_FALSE(IsValidEscape('Z')); 347} 348 349TEST(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 360TEST(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 369TEST(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 381TEST(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 390TEST(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 399TEST(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 410TEST(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 419TEST(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 431TEST(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 442TEST(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 461TEST(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 470TEST(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 480TEST(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 516TEST(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 527TEST(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 539TEST(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 550TEST(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 561TEST(MatchRegexAtHeadTest, ReturnsTrueForEmptyRegex) { 562 EXPECT_TRUE(MatchRegexAtHead("", "")); 563 EXPECT_TRUE(MatchRegexAtHead("", "ab")); 564} 565 566TEST(MatchRegexAtHeadTest, WorksWhenDollarIsInRegex) { 567 EXPECT_FALSE(MatchRegexAtHead("$", "a")); 568 569 EXPECT_TRUE(MatchRegexAtHead("$", "")); 570 EXPECT_TRUE(MatchRegexAtHead("a$", "a")); 571} 572 573TEST(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 581TEST(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 590TEST(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 601TEST(MatchRegexAtHeadTest, MatchesSequentially) { 602 EXPECT_FALSE(MatchRegexAtHead("ab.*c", "acabc")); 603 604 EXPECT_TRUE(MatchRegexAtHead("ab.*c", "ab-fsc")); 605} 606 607TEST(MatchRegexAnywhereTest, ReturnsFalseWhenStringIsNull) { 608 EXPECT_FALSE(MatchRegexAnywhere("", NULL)); 609} 610 611TEST(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 620TEST(MatchRegexAnywhereTest, ReturnsFalseWhenNoMatch) { 621 EXPECT_FALSE(MatchRegexAnywhere("a", "bcde123")); 622 EXPECT_FALSE(MatchRegexAnywhere("a.+a", "--aa88888888")); 623} 624 625TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingPrefix) { 626 EXPECT_TRUE(MatchRegexAnywhere("\\w+", "ab1_ - 5")); 627 EXPECT_TRUE(MatchRegexAnywhere(".*=", "=")); 628 EXPECT_TRUE(MatchRegexAnywhere("x.*ab?.*bc", "xaaabc")); 629} 630 631TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingNonPrefix) { 632 EXPECT_TRUE(MatchRegexAnywhere("\\w+", "$$$ ab1_ - 5")); 633 EXPECT_TRUE(MatchRegexAnywhere("\\.+=", "= ...=")); 634} 635 636// Tests RE's implicit constructors. 637TEST(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. 646TEST(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(). 661TEST(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(). 677TEST(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 692TEST(CaptureStderrTest, CapturesStdErr) { 693 CaptureStderr(); 694 fprintf(stderr, "abc"); 695 ASSERT_STREQ("abc", GetCapturedStderr().c_str()); 696} 697 698} // namespace internal 699} // namespace testing 700