11be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Copyright 2008, Google Inc. 21be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// All rights reserved. 31be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 41be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Redistribution and use in source and binary forms, with or without 51be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// modification, are permitted provided that the following conditions are 61be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// met: 71be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 81be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// * Redistributions of source code must retain the above copyright 91be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// notice, this list of conditions and the following disclaimer. 101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// * Redistributions in binary form must reproduce the above 111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// copyright notice, this list of conditions and the following disclaimer 121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in the documentation and/or other materials provided with the 131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// distribution. 141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// * Neither the name of Google Inc. nor the names of its 151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// contributors may be used to endorse or promote products derived from 161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this software without specific prior written permission. 171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Authors: vladl@google.com (Vlad Losev), wan@google.com (Zhanyong Wan) 311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This file tests the internal cross-platform support utilities. 331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 3441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/internal/gtest-port.h" 3541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 3641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <stdio.h> 3741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 3841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_OS_MAC 3941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# include <time.h> 4041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_OS_MAC 4141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 4241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <list> 4341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <utility> // For std::pair and std::make_pair. 4441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include <vector> 4541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 4641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/gtest.h" 4741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/gtest-spi.h" 481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Indicates that this translation unit is part of Google Test's 501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// implementation. It must come before gtest-internal-inl.h is 511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// included, or there will be a compiler error. This trick is to 521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// prevent a user from accidentally including gtest-internal-inl.h in 531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// his code. 541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_IMPLEMENTATION_ 1 551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#include "src/gtest-internal-inl.h" 561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#undef GTEST_IMPLEMENTATION_ 571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing std::make_pair; 5941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing std::pair; 6041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catanianamespace testing { 621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catanianamespace internal { 631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 64fc2de66453b0669c09eaca643b07d34443858b6fElliott HughesTEST(IsXDigitTest, WorksForNarrowAscii) { 65fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(IsXDigit('0')); 66fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(IsXDigit('9')); 67fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(IsXDigit('A')); 68fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(IsXDigit('F')); 69fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(IsXDigit('a')); 70fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(IsXDigit('f')); 71fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes 72fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_FALSE(IsXDigit('-')); 73fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_FALSE(IsXDigit('g')); 74fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_FALSE(IsXDigit('G')); 75fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes} 76fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes 77fc2de66453b0669c09eaca643b07d34443858b6fElliott HughesTEST(IsXDigitTest, ReturnsFalseForNarrowNonAscii) { 78fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_FALSE(IsXDigit(static_cast<char>(0x80))); 79fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_FALSE(IsXDigit(static_cast<char>('0' | 0x80))); 80fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes} 81fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes 82fc2de66453b0669c09eaca643b07d34443858b6fElliott HughesTEST(IsXDigitTest, WorksForWideAscii) { 83fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(IsXDigit(L'0')); 84fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(IsXDigit(L'9')); 85fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(IsXDigit(L'A')); 86fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(IsXDigit(L'F')); 87fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(IsXDigit(L'a')); 88fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(IsXDigit(L'f')); 89fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes 90fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_FALSE(IsXDigit(L'-')); 91fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_FALSE(IsXDigit(L'g')); 92fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_FALSE(IsXDigit(L'G')); 93fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes} 94fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes 95fc2de66453b0669c09eaca643b07d34443858b6fElliott HughesTEST(IsXDigitTest, ReturnsFalseForWideNonAscii) { 96fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(0x80))); 97fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(L'0' | 0x80))); 98fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(L'0' | 0x100))); 99fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes} 100fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes 10141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass Base { 10241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 10341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Copy constructor and assignment operator do exactly what we need, so we 10441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // use them. 10541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Base() : member_(0) {} 10641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot explicit Base(int n) : member_(n) {} 10741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot virtual ~Base() {} 10841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot int member() { return member_; } 10941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 11041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 11141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot int member_; 11241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 11341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 11441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass Derived : public Base { 11541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 11641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot explicit Derived(int n) : Base(n) {} 11741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 11841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 11941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ImplicitCastTest, ConvertsPointers) { 12041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Derived derived(0); 12141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(&derived == ::testing::internal::ImplicitCast_<Base*>(&derived)); 12241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 12341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 12441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ImplicitCastTest, CanUseInheritance) { 12541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Derived derived(1); 12641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Base base = ::testing::internal::ImplicitCast_<Base>(derived); 12741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ(derived.member(), base.member()); 12841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 12941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 13041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass Castable { 13141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 132fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes explicit Castable(bool* converted) : converted_(converted) {} 13341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot operator Base() { 13441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot *converted_ = true; 13541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return Base(); 13641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 13741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 13841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 13941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot bool* converted_; 14041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 14141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 14241d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ImplicitCastTest, CanUseNonConstCastOperator) { 14341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot bool converted = false; 14441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Castable castable(&converted); 14541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Base base = ::testing::internal::ImplicitCast_<Base>(castable); 14641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(converted); 14741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 14841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 14941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass ConstCastable { 15041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 151fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes explicit ConstCastable(bool* converted) : converted_(converted) {} 15241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot operator Base() const { 15341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot *converted_ = true; 15441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return Base(); 15541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 15641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 15741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 15841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot bool* converted_; 15941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 16041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 16141d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ImplicitCastTest, CanUseConstCastOperatorOnConstValues) { 16241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot bool converted = false; 16341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const ConstCastable const_castable(&converted); 16441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Base base = ::testing::internal::ImplicitCast_<Base>(const_castable); 16541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(converted); 16641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 16741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 16841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass ConstAndNonConstCastable { 16941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 17041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ConstAndNonConstCastable(bool* converted, bool* const_converted) 17141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot : converted_(converted), const_converted_(const_converted) {} 17241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot operator Base() { 17341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot *converted_ = true; 17441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return Base(); 17541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 17641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot operator Base() const { 17741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot *const_converted_ = true; 17841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return Base(); 17941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 18041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 18141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 18241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot bool* converted_; 18341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot bool* const_converted_; 18441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 18541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 18641d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ImplicitCastTest, CanSelectBetweenConstAndNonConstCasrAppropriately) { 18741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot bool converted = false; 18841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot bool const_converted = false; 18941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ConstAndNonConstCastable castable(&converted, &const_converted); 19041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Base base = ::testing::internal::ImplicitCast_<Base>(castable); 19141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(converted); 19241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(const_converted); 19341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 19441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot converted = false; 19541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const_converted = false; 19641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const ConstAndNonConstCastable const_castable(&converted, &const_converted); 19741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot base = ::testing::internal::ImplicitCast_<Base>(const_castable); 19841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(converted); 19941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(const_converted); 20041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 20141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 20241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass To { 20341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 20441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot To(bool* converted) { *converted = true; } // NOLINT 20541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 20641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 20741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ImplicitCastTest, CanUseImplicitConstructor) { 20841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot bool converted = false; 20941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot To to = ::testing::internal::ImplicitCast_<To>(&converted); 21041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot (void)to; 21141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(converted); 21241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 21341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 21441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IteratorTraitsTest, WorksForSTLContainerIterators) { 21541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot StaticAssertTypeEq<int, 21641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot IteratorTraits< ::std::vector<int>::const_iterator>::value_type>(); 21741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot StaticAssertTypeEq<bool, 21841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot IteratorTraits< ::std::list<bool>::iterator>::value_type>(); 21941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 22041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 22141d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IteratorTraitsTest, WorksForPointerToNonConst) { 22241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot StaticAssertTypeEq<char, IteratorTraits<char*>::value_type>(); 22341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot StaticAssertTypeEq<const void*, IteratorTraits<const void**>::value_type>(); 22441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 22541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 22641d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IteratorTraitsTest, WorksForPointerToConst) { 22741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot StaticAssertTypeEq<char, IteratorTraits<const char*>::value_type>(); 22841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot StaticAssertTypeEq<const void*, 22941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot IteratorTraits<const void* const*>::value_type>(); 23041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 23141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 23241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Tests that the element_type typedef is available in scoped_ptr and refers 23341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// to the parameter type. 23441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ScopedPtrTest, DefinesElementType) { 23541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot StaticAssertTypeEq<int, ::testing::internal::scoped_ptr<int>::element_type>(); 23641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 23741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 23841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// TODO(vladl@google.com): Implement THE REST of scoped_ptr tests. 23941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 2401be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(GtestCheckSyntaxTest, BehavesLikeASingleStatement) { 24141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if (AlwaysFalse()) 2421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GTEST_CHECK_(false) << "This should never be executed; " 2431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "It's a compilation test only."; 2441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 24541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if (AlwaysTrue()) 2461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GTEST_CHECK_(true); 2471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania else 2481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ; // NOLINT 2491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 25041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if (AlwaysFalse()) 2511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ; // NOLINT 2521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania else 2531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GTEST_CHECK_(true) << ""; 2541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 2551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2561be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(GtestCheckSyntaxTest, WorksWithSwitch) { 2571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania switch (0) { 2581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania case 1: 2591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania break; 2601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania default: 2611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GTEST_CHECK_(true); 2621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 2631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 264fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes switch (0) 2651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania case 0: 2661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GTEST_CHECK_(true) << "Check failed in switch case"; 2671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 2681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 26941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Verifies behavior of FormatFileLocation. 27041d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(FormatFileLocationTest, FormatsFileLocation) { 27141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_PRED_FORMAT2(IsSubstring, "foo.cc", FormatFileLocation("foo.cc", 42)); 27241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_PRED_FORMAT2(IsSubstring, "42", FormatFileLocation("foo.cc", 42)); 27341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 27441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 27541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(FormatFileLocationTest, FormatsUnknownFile) { 27641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_PRED_FORMAT2( 27741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot IsSubstring, "unknown file", FormatFileLocation(NULL, 42)); 27841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_PRED_FORMAT2(IsSubstring, "42", FormatFileLocation(NULL, 42)); 27941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 28041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 28141d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(FormatFileLocationTest, FormatsUknownLine) { 28241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ("foo.cc:", FormatFileLocation("foo.cc", -1)); 28341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 28441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 28541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(FormatFileLocationTest, FormatsUknownFileAndLine) { 28641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ("unknown file:", FormatFileLocation(NULL, -1)); 28741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 28841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 28941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Verifies behavior of FormatCompilerIndependentFileLocation. 29041d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(FormatCompilerIndependentFileLocationTest, FormatsFileLocation) { 29141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ("foo.cc:42", FormatCompilerIndependentFileLocation("foo.cc", 42)); 29241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 29341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 29441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFile) { 29541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ("unknown file:42", 29641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot FormatCompilerIndependentFileLocation(NULL, 42)); 29741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 29841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 29941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(FormatCompilerIndependentFileLocationTest, FormatsUknownLine) { 30041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ("foo.cc", FormatCompilerIndependentFileLocation("foo.cc", -1)); 30141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 30241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 30341d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFileAndLine) { 30441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ("unknown file", FormatCompilerIndependentFileLocation(NULL, -1)); 30541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 30641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 307fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes#if GTEST_OS_MAC || GTEST_OS_QNX 30841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid* ThreadFunc(void* data) { 30941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data); 31041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_mutex_lock(mutex); 31141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_mutex_unlock(mutex); 31241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return NULL; 31341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 31441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 31541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(GetThreadCountTest, ReturnsCorrectValue) { 31641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ(1U, GetThreadCount()); 31741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_mutex_t mutex; 31841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_attr_t attr; 31941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_t thread_id; 32041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 32141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // TODO(vladl@google.com): turn mutex into internal::Mutex for automatic 32241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // destruction. 32341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_mutex_init(&mutex, NULL); 32441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_mutex_lock(&mutex); 32541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_EQ(0, pthread_attr_init(&attr)); 32641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_EQ(0, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE)); 32741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 32841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const int status = pthread_create(&thread_id, &attr, &ThreadFunc, &mutex); 32941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_EQ(0, pthread_attr_destroy(&attr)); 33041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_EQ(0, status); 33141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ(2U, GetThreadCount()); 33241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_mutex_unlock(&mutex); 33341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 33441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot void* dummy; 33541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_EQ(0, pthread_join(thread_id, &dummy)); 33641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 337fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes# if GTEST_OS_MAC 338fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes 33941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // MacOS X may not immediately report the updated thread count after 34041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // joining a thread, causing flakiness in this test. To counter that, we 34141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // wait for up to .5 seconds for the OS to report the correct value. 34241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot for (int i = 0; i < 5; ++i) { 34341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if (GetThreadCount() == 1) 34441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot break; 34541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 34641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot SleepMilliseconds(100); 34741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 348fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes 349fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes# endif // GTEST_OS_MAC 350fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes 35141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ(1U, GetThreadCount()); 35241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_mutex_destroy(&mutex); 35341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 35441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#else 35541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) { 35641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ(0U, GetThreadCount()); 35741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 358fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes#endif // GTEST_OS_MAC || GTEST_OS_QNX 3591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 3601be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) { 3611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const bool a_false_condition = false; 3621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const char regex[] = 3631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifdef _MSC_VER 3641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "gtest-port_test\\.cc\\(\\d+\\):" 36541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#elif GTEST_USES_POSIX_RE 3661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "gtest-port_test\\.cc:[0-9]+" 36741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#else 36841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot "gtest-port_test\\.cc:\\d+" 3691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // _MSC_VER 3701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ".*a_false_condition.*Extra info.*"; 3711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 37241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_DEATH_IF_SUPPORTED(GTEST_CHECK_(a_false_condition) << "Extra info", 37341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot regex); 3741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 3751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 37641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_DEATH_TEST 37741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 3781be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(GtestCheckDeathTest, LivesSilentlyOnSuccess) { 3791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_EXIT({ 3801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GTEST_CHECK_(true) << "Extra info"; 3811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ::std::cerr << "Success\n"; 3821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania exit(0); }, 3831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ::testing::ExitedWithCode(0), "Success"); 3841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 3851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 3861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_HAS_DEATH_TEST 3871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 38841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Verifies that Google Test choose regular expression engine appropriate to 38941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// the platform. The test will produce compiler errors in case of failure. 39041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// For simplicity, we only cover the most important platforms here. 39141d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(RegexEngineSelectionTest, SelectsCorrectRegexEngine) { 39241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_HAS_POSIX_RE 39341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 39441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(GTEST_USES_POSIX_RE); 39541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 39641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#else 39741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 39841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(GTEST_USES_SIMPLE_RE); 39941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 40041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif 40141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 40241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 4031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#if GTEST_USES_POSIX_RE 4041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 40541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if GTEST_HAS_TYPED_TEST 40641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 4071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Str> 4081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaclass RETest : public ::testing::Test {}; 4091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Defines StringTypes as the list of all string types that class RE 4111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// supports. 4121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatypedef testing::Types< 4131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ::std::string, 41441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# if GTEST_HAS_GLOBAL_STRING 4151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ::string, 41641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // GTEST_HAS_GLOBAL_STRING 4171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const char*> StringTypes; 4181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4191be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTYPED_TEST_CASE(RETest, StringTypes); 4201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Tests RE's implicit constructors. 4221be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTYPED_TEST(RETest, ImplicitConstructorWorks) { 4231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE empty(TypeParam("")); 4241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_STREQ("", empty.pattern()); 4251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE simple(TypeParam("hello")); 4271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_STREQ("hello", simple.pattern()); 4281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE normal(TypeParam(".*(\\w+)")); 4301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_STREQ(".*(\\w+)", normal.pattern()); 4311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 4321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Tests that RE's constructors reject invalid regular expressions. 4341be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTYPED_TEST(RETest, RejectsInvalidRegex) { 4351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE({ 4361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE invalid(TypeParam("?")); 4371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania }, "\"?\" is not a valid POSIX Extended regular expression."); 4381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 4391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Tests RE::FullMatch(). 4411be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTYPED_TEST(RETest, FullMatchWorks) { 4421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE empty(TypeParam("")); 4431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::FullMatch(TypeParam(""), empty)); 4441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(RE::FullMatch(TypeParam("a"), empty)); 4451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE re(TypeParam("a.*z")); 4471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::FullMatch(TypeParam("az"), re)); 4481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::FullMatch(TypeParam("axyz"), re)); 4491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(RE::FullMatch(TypeParam("baz"), re)); 4501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(RE::FullMatch(TypeParam("azy"), re)); 4511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 4521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Tests RE::PartialMatch(). 4541be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTYPED_TEST(RETest, PartialMatchWorks) { 4551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE empty(TypeParam("")); 4561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::PartialMatch(TypeParam(""), empty)); 4571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::PartialMatch(TypeParam("a"), empty)); 4581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE re(TypeParam("a.*z")); 4601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::PartialMatch(TypeParam("az"), re)); 4611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::PartialMatch(TypeParam("axyz"), re)); 4621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::PartialMatch(TypeParam("baz"), re)); 4631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::PartialMatch(TypeParam("azy"), re)); 4641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(RE::PartialMatch(TypeParam("zza"), re)); 4651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 4661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 46741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# endif // GTEST_HAS_TYPED_TEST 46841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 4691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#elif GTEST_USES_SIMPLE_RE 4701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4711be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(IsInSetTest, NulCharIsNotInAnySet) { 4721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsInSet('\0', "")); 4731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsInSet('\0', "\0")); 4741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsInSet('\0', "a")); 4751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 4761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4771be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(IsInSetTest, WorksForNonNulChars) { 4781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsInSet('a', "Ab")); 4791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsInSet('c', "")); 4801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 4811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsInSet('b', "bcd")); 4821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsInSet('b', "ab")); 4831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 4841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 48541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IsAsciiDigitTest, IsFalseForNonDigit) { 48641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiDigit('\0')); 48741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiDigit(' ')); 48841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiDigit('+')); 48941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiDigit('-')); 49041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiDigit('.')); 49141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiDigit('a')); 4921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 4931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 49441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IsAsciiDigitTest, IsTrueForDigit) { 49541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiDigit('0')); 49641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiDigit('1')); 49741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiDigit('5')); 49841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiDigit('9')); 4991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 50141d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IsAsciiPunctTest, IsFalseForNonPunct) { 50241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiPunct('\0')); 50341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiPunct(' ')); 50441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiPunct('\n')); 50541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiPunct('a')); 50641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiPunct('0')); 5071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 50941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IsAsciiPunctTest, IsTrueForPunct) { 5101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania for (const char* p = "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"; *p; p++) { 51141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_PRED1(IsAsciiPunct, *p); 5121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania } 5131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5151be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(IsRepeatTest, IsFalseForNonRepeatChar) { 5161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsRepeat('\0')); 5171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsRepeat(' ')); 5181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsRepeat('a')); 5191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsRepeat('1')); 5201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsRepeat('-')); 5211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5231be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(IsRepeatTest, IsTrueForRepeatChar) { 5241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsRepeat('?')); 5251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsRepeat('*')); 5261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsRepeat('+')); 5271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 52941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IsAsciiWhiteSpaceTest, IsFalseForNonWhiteSpace) { 53041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiWhiteSpace('\0')); 53141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiWhiteSpace('a')); 53241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiWhiteSpace('1')); 53341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiWhiteSpace('+')); 53441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiWhiteSpace('_')); 5351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 53741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IsAsciiWhiteSpaceTest, IsTrueForWhiteSpace) { 53841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWhiteSpace(' ')); 53941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWhiteSpace('\n')); 54041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWhiteSpace('\r')); 54141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWhiteSpace('\t')); 54241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWhiteSpace('\v')); 54341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWhiteSpace('\f')); 5441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 54641d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IsAsciiWordCharTest, IsFalseForNonWordChar) { 54741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiWordChar('\0')); 54841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiWordChar('+')); 54941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiWordChar('.')); 55041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiWordChar(' ')); 55141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_FALSE(IsAsciiWordChar('\n')); 5521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 55441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IsAsciiWordCharTest, IsTrueForLetter) { 55541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWordChar('a')); 55641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWordChar('b')); 55741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWordChar('A')); 55841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWordChar('Z')); 5591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 56141d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IsAsciiWordCharTest, IsTrueForDigit) { 56241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWordChar('0')); 56341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWordChar('1')); 56441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWordChar('7')); 56541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWordChar('9')); 5661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 56841d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(IsAsciiWordCharTest, IsTrueForUnderscore) { 56941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(IsAsciiWordChar('_')); 5701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5721be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(IsValidEscapeTest, IsFalseForNonPrintable) { 5731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsValidEscape('\0')); 5741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsValidEscape('\007')); 5751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5771be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(IsValidEscapeTest, IsFalseForDigit) { 5781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsValidEscape('0')); 5791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsValidEscape('9')); 5801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5821be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(IsValidEscapeTest, IsFalseForWhiteSpace) { 5831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsValidEscape(' ')); 5841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsValidEscape('\n')); 5851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5871be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(IsValidEscapeTest, IsFalseForSomeLetter) { 5881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsValidEscape('a')); 5891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(IsValidEscape('Z')); 5901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 5911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5921be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(IsValidEscapeTest, IsTrueForPunct) { 5931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('.')); 5941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('-')); 5951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('^')); 5961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('$')); 5971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('(')); 5981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape(']')); 5991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('{')); 6001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('|')); 6011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 6021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6031be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(IsValidEscapeTest, IsTrueForSomeLetter) { 6041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('d')); 6051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('D')); 6061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('s')); 6071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('S')); 6081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('w')); 6091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(IsValidEscape('W')); 6101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 6111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6121be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(AtomMatchesCharTest, EscapedPunct) { 6131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, '\\', '\0')); 6141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, '\\', ' ')); 6151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, '_', '.')); 6161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, '.', 'a')); 6171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, '\\', '\\')); 6191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, '_', '_')); 6201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, '+', '+')); 6211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, '.', '.')); 6221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 6231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6241be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(AtomMatchesCharTest, Escaped_d) { 6251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'd', '\0')); 6261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'd', 'a')); 6271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'd', '.')); 6281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'd', '0')); 6301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'd', '9')); 6311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 6321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6331be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(AtomMatchesCharTest, Escaped_D) { 6341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'D', '0')); 6351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'D', '9')); 6361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'D', '\0')); 6381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'D', 'a')); 6391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'D', '-')); 6401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 6411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6421be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(AtomMatchesCharTest, Escaped_s) { 6431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 's', '\0')); 6441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 's', 'a')); 6451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 's', '.')); 6461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 's', '9')); 6471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 's', ' ')); 6491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 's', '\n')); 6501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 's', '\t')); 6511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 6521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6531be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(AtomMatchesCharTest, Escaped_S) { 6541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'S', ' ')); 6551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'S', '\r')); 6561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'S', '\0')); 6581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'S', 'a')); 6591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'S', '9')); 6601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 6611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6621be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(AtomMatchesCharTest, Escaped_w) { 6631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'w', '\0')); 6641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'w', '+')); 6651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'w', ' ')); 6661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'w', '\n')); 6671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'w', '0')); 6691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'w', 'b')); 6701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'w', 'C')); 6711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'w', '_')); 6721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 6731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6741be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(AtomMatchesCharTest, Escaped_W) { 6751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'W', 'A')); 6761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'W', 'b')); 6771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'W', '9')); 6781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'W', '_')); 6791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'W', '\0')); 6811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'W', '*')); 6821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'W', '\n')); 6831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 6841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6851be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(AtomMatchesCharTest, EscapedWhiteSpace) { 6861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'f', '\0')); 6871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'f', '\n')); 6881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'n', '\0')); 6891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'n', '\r')); 6901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'r', '\0')); 6911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'r', 'a')); 6921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 't', '\0')); 6931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 't', 't')); 6941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'v', '\0')); 6951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(true, 'v', '\f')); 6961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 6971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'f', '\f')); 6981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'n', '\n')); 6991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'r', '\r')); 7001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 't', '\t')); 7011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(true, 'v', '\v')); 7021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 7031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7041be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(AtomMatchesCharTest, UnescapedDot) { 7051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(false, '.', '\n')); 7061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(false, '.', '\0')); 7081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(false, '.', '.')); 7091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(false, '.', 'a')); 7101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(false, '.', ' ')); 7111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 7121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7131be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(AtomMatchesCharTest, UnescapedChar) { 7141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(false, 'a', '\0')); 7151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(false, 'a', 'b')); 7161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(AtomMatchesChar(false, '$', 'a')); 7171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(false, '$', '$')); 7191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(false, '5', '5')); 7201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(AtomMatchesChar(false, 'Z', 'Z')); 7211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 7221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7231be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(ValidateRegexTest, GeneratesFailureAndReturnsFalseForInvalid) { 7241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(NULL)), 7251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "NULL is not a valid simple regular expression"); 7261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE( 7271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania ASSERT_FALSE(ValidateRegex("a\\")), 7281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "Syntax error at index 1 in simple regular expression \"a\\\": "); 7291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a\\")), 7301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "'\\' cannot appear at the end"); 7311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\n\\")), 7321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "'\\' cannot appear at the end"); 7331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\s\\hb")), 7341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "invalid escape sequence \"\\h\""); 7351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^^")), 7361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "'^' can only appear at the beginning"); 7371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(".*^b")), 7381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "'^' can only appear at the beginning"); 7391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("$$")), 7401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "'$' can only appear at the end"); 7411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^$a")), 7421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "'$' can only appear at the end"); 7431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a(b")), 7441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "'(' is unsupported"); 7451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("ab)")), 7461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "')' is unsupported"); 7471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("[ab")), 7481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "'[' is unsupported"); 7491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a{2")), 7501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "'{' is unsupported"); 7511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("?")), 7521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "'?' can only follow a repeatable token"); 7531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^*")), 7541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "'*' can only follow a repeatable token"); 7551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("5*+")), 7561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania "'+' can only follow a repeatable token"); 7571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 7581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7591be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(ValidateRegexTest, ReturnsTrueForValid) { 7601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(ValidateRegex("")); 7611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(ValidateRegex("a")); 7621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(ValidateRegex(".*")); 7631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(ValidateRegex("^a_+")); 7641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(ValidateRegex("^a\\t\\&?")); 7651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(ValidateRegex("09*$")); 7661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(ValidateRegex("^Z$")); 7671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(ValidateRegex("a\\^Z\\$\\(\\)\\|\\[\\]\\{\\}")); 7681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 7691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7701be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrOne) { 7711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "a", "ba")); 7721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Repeating more than once. 7731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "aab")); 7741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Repeating zero times. 7761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ba")); 7771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Repeating once. 7781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ab")); 7791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '#', '?', ".", "##")); 7801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 7811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7821be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrMany) { 7831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '*', "a$", "baab")); 7841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Repeating zero times. 7861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "bc")); 7871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Repeating once. 7881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "abc")); 7891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Repeating more than once. 7901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '*', "-", "ab_1-g")); 7911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 7921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7931be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRepetitionAndRegexAtHeadTest, WorksForOneOrMany) { 7941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "a$", "baab")); 7951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Repeating zero times. 7961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "bc")); 7971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 7981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Repeating once. 7991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "abc")); 8001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania // Repeating more than once. 8011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '+', "-", "ab_1-g")); 8021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8041be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRegexAtHeadTest, ReturnsTrueForEmptyRegex) { 8051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("", "")); 8061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("", "ab")); 8071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8091be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRegexAtHeadTest, WorksWhenDollarIsInRegex) { 8101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAtHead("$", "a")); 8111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("$", "")); 8131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("a$", "a")); 8141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8161be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithEscapeSequence) { 8171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAtHead("\\w", "+")); 8181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAtHead("\\W", "ab")); 8191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("\\sa", "\nab")); 8211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("\\d", "1a")); 8221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8241be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithRepetition) { 8251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAtHead(".+a", "abc")); 8261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAtHead("a?b", "aab")); 8271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead(".*a", "bc12-ab")); 8291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("a?b", "b")); 8301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("a?b", "ab")); 8311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8331be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRegexAtHeadTest, 8341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania WorksWhenRegexStartsWithRepetionOfEscapeSequence) { 8351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAtHead("\\.+a", "abc")); 8361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAtHead("\\s?b", " b")); 8371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("\\(*a", "((((ab")); 8391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("\\^?b", "^b")); 8401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "b")); 8411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "\\b")); 8421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8441be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRegexAtHeadTest, MatchesSequentially) { 8451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAtHead("ab.*c", "acabc")); 8461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAtHead("ab.*c", "ab-fsc")); 8481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8501be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRegexAnywhereTest, ReturnsFalseWhenStringIsNull) { 8511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAnywhere("", NULL)); 8521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8541be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRegexAnywhereTest, WorksWhenRegexStartsWithCaret) { 8551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAnywhere("^a", "ba")); 8561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAnywhere("^$", "a")); 8571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAnywhere("^a", "ab")); 8591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAnywhere("^", "ab")); 8601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAnywhere("^$", "")); 8611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8631be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRegexAnywhereTest, ReturnsFalseWhenNoMatch) { 8641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAnywhere("a", "bcde123")); 8651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(MatchRegexAnywhere("a.+a", "--aa88888888")); 8661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8681be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingPrefix) { 8691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAnywhere("\\w+", "ab1_ - 5")); 8701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAnywhere(".*=", "=")); 8711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAnywhere("x.*ab?.*bc", "xaaabc")); 8721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8741be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingNonPrefix) { 8751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAnywhere("\\w+", "$$$ ab1_ - 5")); 8761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(MatchRegexAnywhere("\\.+=", "= ...=")); 8771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Tests RE's implicit constructors. 8801be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(RETest, ImplicitConstructorWorks) { 8811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE empty(""); 8821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_STREQ("", empty.pattern()); 8831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE simple("hello"); 8851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_STREQ("hello", simple.pattern()); 8861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 8871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Tests that RE's constructors reject invalid regular expressions. 8891be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(RETest, RejectsInvalidRegex) { 8901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE({ 8911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE normal(NULL); 8921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania }, "NULL is not a valid simple regular expression"); 8931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE({ 8951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE normal(".*(\\w+"); 8961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania }, "'(' is unsupported"); 8971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_NONFATAL_FAILURE({ 8991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE invalid("^?"); 9001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania }, "'?' can only follow a repeatable token"); 9011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 9021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 9031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Tests RE::FullMatch(). 9041be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(RETest, FullMatchWorks) { 9051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE empty(""); 9061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::FullMatch("", empty)); 9071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(RE::FullMatch("a", empty)); 9081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 9091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE re1("a"); 9101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::FullMatch("a", re1)); 9111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 9121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE re("a.*z"); 9131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::FullMatch("az", re)); 9141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::FullMatch("axyz", re)); 9151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(RE::FullMatch("baz", re)); 9161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(RE::FullMatch("azy", re)); 9171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 9181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 9191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Tests RE::PartialMatch(). 9201be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(RETest, PartialMatchWorks) { 9211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE empty(""); 9221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::PartialMatch("", empty)); 9231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::PartialMatch("a", empty)); 9241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 9251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania const RE re("a.*z"); 9261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::PartialMatch("az", re)); 9271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::PartialMatch("axyz", re)); 9281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::PartialMatch("baz", re)); 9291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_TRUE(RE::PartialMatch("azy", re)); 9301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania EXPECT_FALSE(RE::PartialMatch("zza", re)); 9311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 9321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 9331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif // GTEST_USES_POSIX_RE 9341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 93541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if !GTEST_OS_WINDOWS_MOBILE 93641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 93741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(CaptureTest, CapturesStdout) { 93841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot CaptureStdout(); 93941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot fprintf(stdout, "abc"); 94041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_STREQ("abc", GetCapturedStdout().c_str()); 94141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 94241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot CaptureStdout(); 94341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot fprintf(stdout, "def%cghi", '\0'); 94441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ(::std::string("def\0ghi", 7), ::std::string(GetCapturedStdout())); 94541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 94641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 94741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(CaptureTest, CapturesStderr) { 94841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot CaptureStderr(); 94941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot fprintf(stderr, "jkl"); 95041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_STREQ("jkl", GetCapturedStderr().c_str()); 9511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 9521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania CaptureStderr(); 95341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot fprintf(stderr, "jkl%cmno", '\0'); 95441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ(::std::string("jkl\0mno", 7), ::std::string(GetCapturedStderr())); 95541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 95641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 95741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Tests that stdout and stderr capture don't interfere with each other. 95841d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(CaptureTest, CapturesStdoutAndStderr) { 95941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot CaptureStdout(); 96041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot CaptureStderr(); 96141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot fprintf(stdout, "pqr"); 96241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot fprintf(stderr, "stu"); 96341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_STREQ("pqr", GetCapturedStdout().c_str()); 96441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_STREQ("stu", GetCapturedStderr().c_str()); 96541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 96641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 96741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(CaptureDeathTest, CannotReenterStdoutCapture) { 96841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot CaptureStdout(); 969fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_DEATH_IF_SUPPORTED(CaptureStdout(), 97041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot "Only one stdout capturer can exist at a time"); 97141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GetCapturedStdout(); 97241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 97341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // We cannot test stderr capturing using death tests as they use it 97441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // themselves. 97541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 97641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 97741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // !GTEST_OS_WINDOWS_MOBILE 97841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 97941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ThreadLocalTest, DefaultConstructorInitializesToDefaultValues) { 98041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadLocal<int> t1; 98141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ(0, t1.get()); 98241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 98341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadLocal<void*> t2; 98441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(t2.get() == NULL); 98541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 98641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 98741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ThreadLocalTest, SingleParamConstructorInitializesToParam) { 98841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadLocal<int> t1(123); 98941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ(123, t1.get()); 99041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 99141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot int i = 0; 99241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadLocal<int*> t2(&i); 99341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ(&i, t2.get()); 99441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 99541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 99641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass NoDefaultContructor { 99741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 99841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot explicit NoDefaultContructor(const char*) {} 99941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot NoDefaultContructor(const NoDefaultContructor&) {} 100041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 100141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 100241d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ThreadLocalTest, ValueDefaultContructorIsNotRequiredForParamVersion) { 100341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadLocal<NoDefaultContructor> bar(NoDefaultContructor("foo")); 100441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot bar.pointer(); 100541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 100641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 100741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ThreadLocalTest, GetAndPointerReturnSameValue) { 1008fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes ThreadLocal<std::string> thread_local_string; 100941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 1010fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get())); 101141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 101241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Verifies the condition still holds after calling set. 1013fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes thread_local_string.set("foo"); 1014fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get())); 101541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 101641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 101741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ThreadLocalTest, PointerAndConstPointerReturnSameValue) { 1018fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes ThreadLocal<std::string> thread_local_string; 1019fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes const ThreadLocal<std::string>& const_thread_local_string = 1020fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes thread_local_string; 102141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 1022fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer()); 102341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 1024fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes thread_local_string.set("foo"); 1025fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer()); 102641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 102741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 102841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#if GTEST_IS_THREADSAFE 102941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 103041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid AddTwo(int* param) { *param += 2; } 103141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 103241d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ThreadWithParamTest, ConstructorExecutesThreadFunc) { 103341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot int i = 40; 103441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadWithParam<int*> thread(&AddTwo, &i, NULL); 103541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot thread.Join(); 103641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ(42, i); 103741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 103841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 103941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(MutexDeathTest, AssertHeldShouldAssertWhenNotLocked) { 104041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // AssertHeld() is flaky only in the presence of multiple threads accessing 104141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // the lock. In this case, the test is robust. 104241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_DEATH_IF_SUPPORTED({ 104341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Mutex m; 104441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot { MutexLock lock(&m); } 104541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot m.AssertHeld(); 104641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot }, 104741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot "thread .*hold"); 104841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 104941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 105041d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(MutexTest, AssertHeldShouldNotAssertWhenLocked) { 105141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Mutex m; 105241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot MutexLock lock(&m); 105341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot m.AssertHeld(); 105441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 105541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 105641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass AtomicCounterWithMutex { 105741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 105841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot explicit AtomicCounterWithMutex(Mutex* mutex) : 105941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot value_(0), mutex_(mutex), random_(42) {} 106041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 106141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot void Increment() { 106241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot MutexLock lock(mutex_); 106341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot int temp = value_; 106441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot { 106541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Locking a mutex puts up a memory barrier, preventing reads and 106641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // writes to value_ rearranged when observed from other threads. 106741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // 106841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // We cannot use Mutex and MutexLock here or rely on their memory 106941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // barrier functionality as we are testing them here. 107041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_mutex_t memory_barrier_mutex; 107141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_POSIX_SUCCESS_( 107241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pthread_mutex_init(&memory_barrier_mutex, NULL)); 107341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&memory_barrier_mutex)); 107441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 107541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot SleepMilliseconds(random_.Generate(30)); 107641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 107741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex)); 1078fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&memory_barrier_mutex)); 107941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 108041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot value_ = temp + 1; 108141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 108241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot int value() const { return value_; } 108341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 108441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 108541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot volatile int value_; 108641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Mutex* const mutex_; // Protects value_. 108741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Random random_; 108841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 108941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 109041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid CountingThreadFunc(pair<AtomicCounterWithMutex*, int> param) { 109141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot for (int i = 0; i < param.second; ++i) 109241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot param.first->Increment(); 109341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 109441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 109541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Tests that the mutex only lets one thread at a time to lock it. 109641d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(MutexTest, OnlyOneThreadCanLockAtATime) { 109741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Mutex mutex; 109841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot AtomicCounterWithMutex locked_counter(&mutex); 109941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 110041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot typedef ThreadWithParam<pair<AtomicCounterWithMutex*, int> > ThreadType; 110141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const int kCycleCount = 20; 110241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const int kThreadCount = 7; 110341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot scoped_ptr<ThreadType> counting_threads[kThreadCount]; 110441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Notification threads_can_start; 110541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Creates and runs kThreadCount threads that increment locked_counter 110641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // kCycleCount times each. 110741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot for (int i = 0; i < kThreadCount; ++i) { 110841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot counting_threads[i].reset(new ThreadType(&CountingThreadFunc, 110941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot make_pair(&locked_counter, 111041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot kCycleCount), 111141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot &threads_can_start)); 111241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 111341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot threads_can_start.Notify(); 111441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot for (int i = 0; i < kThreadCount; ++i) 111541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot counting_threads[i]->Join(); 111641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 111741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // If the mutex lets more than one thread to increment the counter at a 111841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // time, they are likely to encounter a race condition and have some 111941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // increments overwritten, resulting in the lower then expected counter 112041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // value. 112141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_EQ(kCycleCount * kThreadCount, locked_counter.value()); 112241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 112341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 112441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T> 112541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotvoid RunFromThread(void (func)(T), T param) { 112641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadWithParam<T> thread(func, param, NULL); 112741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot thread.Join(); 112841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 112941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 1130fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughesvoid RetrieveThreadLocalValue( 1131fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes pair<ThreadLocal<std::string>*, std::string*> param) { 113241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot *param.second = param.first->get(); 113341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 113441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 113541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ThreadLocalTest, ParameterizedConstructorSetsDefault) { 1136fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes ThreadLocal<std::string> thread_local_string("foo"); 1137fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_STREQ("foo", thread_local_string.get().c_str()); 113841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 1139fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes thread_local_string.set("bar"); 1140fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_STREQ("bar", thread_local_string.get().c_str()); 114141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 1142fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes std::string result; 1143fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes RunFromThread(&RetrieveThreadLocalValue, 1144fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes make_pair(&thread_local_string, &result)); 114541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_STREQ("foo", result.c_str()); 114641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 114741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 114841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// DestructorTracker keeps track of whether its instances have been 114941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// destroyed. 115041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotstatic std::vector<bool> g_destroyed; 115141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 115241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass DestructorTracker { 115341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot public: 115441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot DestructorTracker() : index_(GetNewIndex()) {} 115541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot DestructorTracker(const DestructorTracker& /* rhs */) 115641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot : index_(GetNewIndex()) {} 115741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ~DestructorTracker() { 115841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // We never access g_destroyed concurrently, so we don't need to 115941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // protect the write operation under a mutex. 116041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot g_destroyed[index_] = true; 116141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 116241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 116341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot private: 116441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot static int GetNewIndex() { 116541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot g_destroyed.push_back(false); 116641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return g_destroyed.size() - 1; 116741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 116841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot const int index_; 116941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}; 117041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 117141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef ThreadLocal<DestructorTracker>* ThreadParam; 117241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 1173fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughesvoid CallThreadLocalGet(ThreadParam thread_local_param) { 1174fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes thread_local_param->get(); 117541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 117641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 117741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Tests that when a ThreadLocal object dies in a thread, it destroys 117841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// the managed object for that thread. 117941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ThreadLocalTest, DestroysManagedObjectForOwnThreadWhenDying) { 118041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot g_destroyed.clear(); 118141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 118241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot { 118341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // The next line default constructs a DestructorTracker object as 1184fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes // the default value of objects managed by thread_local_tracker. 1185fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes ThreadLocal<DestructorTracker> thread_local_tracker; 118641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_EQ(1U, g_destroyed.size()); 118741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_FALSE(g_destroyed[0]); 118841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 118941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // This creates another DestructorTracker object for the main thread. 1190fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes thread_local_tracker.get(); 119141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_EQ(2U, g_destroyed.size()); 119241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_FALSE(g_destroyed[0]); 119341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_FALSE(g_destroyed[1]); 119441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 119541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 1196fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes // Now thread_local_tracker has died. It should have destroyed both the 119741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // default value shared by all threads and the value for the main 119841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // thread. 119941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_EQ(2U, g_destroyed.size()); 120041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(g_destroyed[0]); 120141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(g_destroyed[1]); 120241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 120341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot g_destroyed.clear(); 120441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 120541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 120641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Tests that when a thread exits, the thread-local object for that 120741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// thread is destroyed. 120841d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ThreadLocalTest, DestroysManagedObjectAtThreadExit) { 120941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot g_destroyed.clear(); 121041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 121141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot { 121241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // The next line default constructs a DestructorTracker object as 1213fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes // the default value of objects managed by thread_local_tracker. 1214fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes ThreadLocal<DestructorTracker> thread_local_tracker; 121541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_EQ(1U, g_destroyed.size()); 121641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_FALSE(g_destroyed[0]); 121741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 121841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // This creates another DestructorTracker object in the new thread. 121941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ThreadWithParam<ThreadParam> thread( 1220fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes &CallThreadLocalGet, &thread_local_tracker, NULL); 122141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot thread.Join(); 122241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 122341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // Now the new thread has exited. The per-thread object for it 122441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // should have been destroyed. 122541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_EQ(2U, g_destroyed.size()); 122641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_FALSE(g_destroyed[0]); 122741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_TRUE(g_destroyed[1]); 122841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot } 122941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 1230fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes // Now thread_local_tracker has died. The default value should have been 123141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot // destroyed too. 123241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot ASSERT_EQ(2U, g_destroyed.size()); 123341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(g_destroyed[0]); 123441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot EXPECT_TRUE(g_destroyed[1]); 123541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 123641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot g_destroyed.clear(); 123741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot} 123841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 123941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(ThreadLocalTest, ThreadLocalMutationsAffectOnlyCurrentThread) { 1240fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes ThreadLocal<std::string> thread_local_string; 1241fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes thread_local_string.set("Foo"); 1242fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_STREQ("Foo", thread_local_string.get().c_str()); 1243fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes 1244fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes std::string result; 1245fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes RunFromThread(&RetrieveThreadLocalValue, 1246fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes make_pair(&thread_local_string, &result)); 1247fc2de66453b0669c09eaca643b07d34443858b6fElliott Hughes EXPECT_TRUE(result.empty()); 12481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} 12491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 125041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#endif // GTEST_IS_THREADSAFE 12511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 12521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} // namespace internal 12531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania} // namespace testing 1254