1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright 2008, Google Inc. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// All rights reserved. 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Redistribution and use in source and binary forms, with or without 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// modification, are permitted provided that the following conditions are 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// met: 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Redistributions of source code must retain the above copyright 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notice, this list of conditions and the following disclaimer. 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Redistributions in binary form must reproduce the above 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// copyright notice, this list of conditions and the following disclaimer 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the documentation and/or other materials provided with the 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// distribution. 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Neither the name of Google Inc. nor the names of its 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// contributors may be used to endorse or promote products derived from 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this software without specific prior written permission. 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Authors: vladl@google.com (Vlad Losev), wan@google.com (Zhanyong Wan) 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file tests the internal cross-platform support utilities. 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/internal/gtest-port.h" 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <stdio.h> 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_MAC 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# include <time.h> 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // GTEST_OS_MAC 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <utility> // For std::pair and std::make_pair. 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/gtest.h" 45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/gtest-spi.h" 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Indicates that this translation unit is part of Google Test's 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// implementation. It must come before gtest-internal-inl.h is 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// included, or there will be a compiler error. This trick is to 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// prevent a user from accidentally including gtest-internal-inl.h in 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// his code. 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GTEST_IMPLEMENTATION_ 1 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "src/gtest-internal-inl.h" 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#undef GTEST_IMPLEMENTATION_ 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing std::make_pair; 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing std::pair; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing { 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace internal { 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass Base { 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Copy constructor and assignment operator do exactly what we need, so we 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // use them. 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Base() : member_(0) {} 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick explicit Base(int n) : member_(n) {} 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual ~Base() {} 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int member() { return member_; } 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int member_; 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass Derived : public Base { 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick explicit Derived(int n) : Base(n) {} 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(ImplicitCastTest, ConvertsPointers) { 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Derived derived(0); 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE(&derived == ::testing::internal::ImplicitCast_<Base*>(&derived)); 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(ImplicitCastTest, CanUseInheritance) { 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Derived derived(1); 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Base base = ::testing::internal::ImplicitCast_<Base>(derived); 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(derived.member(), base.member()); 893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass Castable { 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Castable(bool* converted) : converted_(converted) {} 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick operator Base() { 953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *converted_ = true; 963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return Base(); 973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool* converted_; 1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(ImplicitCastTest, CanUseNonConstCastOperator) { 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool converted = false; 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Castable castable(&converted); 106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Base base = ::testing::internal::ImplicitCast_<Base>(castable); 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(converted); 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass ConstCastable { 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ConstCastable(bool* converted) : converted_(converted) {} 1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick operator Base() const { 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *converted_ = true; 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return Base(); 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool* converted_; 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(ImplicitCastTest, CanUseConstCastOperatorOnConstValues) { 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool converted = false; 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const ConstCastable const_castable(&converted); 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Base base = ::testing::internal::ImplicitCast_<Base>(const_castable); 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(converted); 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass ConstAndNonConstCastable { 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ConstAndNonConstCastable(bool* converted, bool* const_converted) 1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : converted_(converted), const_converted_(const_converted) {} 1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick operator Base() { 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *converted_ = true; 1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return Base(); 1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick operator Base() const { 1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *const_converted_ = true; 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return Base(); 1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool* converted_; 1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool* const_converted_; 1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(ImplicitCastTest, CanSelectBetweenConstAndNonConstCasrAppropriately) { 1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool converted = false; 1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool const_converted = false; 1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ConstAndNonConstCastable castable(&converted, &const_converted); 151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Base base = ::testing::internal::ImplicitCast_<Base>(castable); 1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(converted); 1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(const_converted); 1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick converted = false; 1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const_converted = false; 1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const ConstAndNonConstCastable const_castable(&converted, &const_converted); 158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base = ::testing::internal::ImplicitCast_<Base>(const_castable); 1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(converted); 1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(const_converted); 1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass To { 1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick To(bool* converted) { *converted = true; } // NOLINT 1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(ImplicitCastTest, CanUseImplicitConstructor) { 1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool converted = false; 170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen To to = ::testing::internal::ImplicitCast_<To>(&converted); 171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen (void)to; 1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(converted); 1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that the element_type typedef is available in scoped_ptr and refers 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to the parameter type. 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ScopedPtrTest, DefinesElementType) { 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticAssertTypeEq<int, ::testing::internal::scoped_ptr<int>::element_type>(); 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(vladl@google.com): Implement THE REST of scoped_ptr tests. 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(GtestCheckSyntaxTest, BehavesLikeASingleStatement) { 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (AlwaysFalse()) 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTEST_CHECK_(false) << "This should never be executed; " 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "It's a compilation test only."; 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (AlwaysTrue()) 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTEST_CHECK_(true); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ; // NOLINT 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (AlwaysFalse()) 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ; // NOLINT 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTEST_CHECK_(true) << ""; 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(GtestCheckSyntaxTest, WorksWithSwitch) { 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (0) { 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case 1: 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTEST_CHECK_(true); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch(0) 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case 0: 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTEST_CHECK_(true) << "Check failed in switch case"; 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Verifies behavior of FormatFileLocation. 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(FormatFileLocationTest, FormatsFileLocation) { 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_PRED_FORMAT2(IsSubstring, "foo.cc", FormatFileLocation("foo.cc", 42)); 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_PRED_FORMAT2(IsSubstring, "42", FormatFileLocation("foo.cc", 42)); 216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(FormatFileLocationTest, FormatsUnknownFile) { 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_PRED_FORMAT2( 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IsSubstring, "unknown file", FormatFileLocation(NULL, 42)); 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_PRED_FORMAT2(IsSubstring, "42", FormatFileLocation(NULL, 42)); 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(FormatFileLocationTest, FormatsUknownLine) { 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ("foo.cc:", FormatFileLocation("foo.cc", -1)); 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(FormatFileLocationTest, FormatsUknownFileAndLine) { 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ("unknown file:", FormatFileLocation(NULL, -1)); 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Verifies behavior of FormatCompilerIndependentFileLocation. 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(FormatCompilerIndependentFileLocationTest, FormatsFileLocation) { 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ("foo.cc:42", FormatCompilerIndependentFileLocation("foo.cc", 42)); 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFile) { 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ("unknown file:42", 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FormatCompilerIndependentFileLocation(NULL, 42)); 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(FormatCompilerIndependentFileLocationTest, FormatsUknownLine) { 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ("foo.cc", FormatCompilerIndependentFileLocation("foo.cc", -1)); 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFileAndLine) { 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ("unknown file", FormatCompilerIndependentFileLocation(NULL, -1)); 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_MAC 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid* ThreadFunc(void* data) { 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pthread_mutex_lock(mutex); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pthread_mutex_unlock(mutex); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(GetThreadCountTest, ReturnsCorrectValue) { 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, GetThreadCount()); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pthread_mutex_t mutex; 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pthread_attr_t attr; 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pthread_t thread_id; 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(vladl@google.com): turn mutex into internal::Mutex for automatic 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // destruction. 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pthread_mutex_init(&mutex, NULL); 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pthread_mutex_lock(&mutex); 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0, pthread_attr_init(&attr)); 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE)); 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int status = pthread_create(&thread_id, &attr, &ThreadFunc, &mutex); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0, pthread_attr_destroy(&attr)); 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0, status); 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(2U, GetThreadCount()); 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pthread_mutex_unlock(&mutex); 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* dummy; 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0, pthread_join(thread_id, &dummy)); 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // MacOS X may not immediately report the updated thread count after 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // joining a thread, causing flakiness in this test. To counter that, we 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // wait for up to .5 seconds for the OS to report the correct value. 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < 5; ++i) { 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (GetThreadCount() == 1) 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SleepMilliseconds(100); 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, GetThreadCount()); 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pthread_mutex_destroy(&mutex); 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) { 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0U, GetThreadCount()); 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // GTEST_OS_MAC 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) { 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const bool a_false_condition = false; 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char regex[] = 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef _MSC_VER 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "gtest-port_test\\.cc\\(\\d+\\):" 3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif GTEST_USES_POSIX_RE 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "gtest-port_test\\.cc:[0-9]+" 3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else 3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "gtest-port_test\\.cc:\\d+" 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // _MSC_VER 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ".*a_false_condition.*Extra info.*"; 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_DEATH_IF_SUPPORTED(GTEST_CHECK_(a_false_condition) << "Extra info", 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch regex); 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_HAS_DEATH_TEST 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(GtestCheckDeathTest, LivesSilentlyOnSuccess) { 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EXIT({ 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTEST_CHECK_(true) << "Extra info"; 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ::std::cerr << "Success\n"; 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch exit(0); }, 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ::testing::ExitedWithCode(0), "Success"); 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // GTEST_HAS_DEATH_TEST 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Verifies that Google Test choose regular expression engine appropriate to 327731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// the platform. The test will produce compiler errors in case of failure. 328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// For simplicity, we only cover the most important platforms here. 329731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(RegexEngineSelectionTest, SelectsCorrectRegexEngine) { 330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if GTEST_HAS_POSIX_RE 331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(GTEST_USES_POSIX_RE); 333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#else 335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(GTEST_USES_SIMPLE_RE); 337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_USES_POSIX_RE 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# if GTEST_HAS_TYPED_TEST 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Str> 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass RETest : public ::testing::Test {}; 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Defines StringTypes as the list of all string types that class RE 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// supports. 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef testing::Types< 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ::std::string, 352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# if GTEST_HAS_GLOBAL_STRING 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ::string, 354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# endif // GTEST_HAS_GLOBAL_STRING 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char*> StringTypes; 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTYPED_TEST_CASE(RETest, StringTypes); 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests RE's implicit constructors. 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTYPED_TEST(RETest, ImplicitConstructorWorks) { 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE empty(TypeParam("")); 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("", empty.pattern()); 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE simple(TypeParam("hello")); 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("hello", simple.pattern()); 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE normal(TypeParam(".*(\\w+)")); 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ(".*(\\w+)", normal.pattern()); 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that RE's constructors reject invalid regular expressions. 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTYPED_TEST(RETest, RejectsInvalidRegex) { 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE({ 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE invalid(TypeParam("?")); 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }, "\"?\" is not a valid POSIX Extended regular expression."); 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests RE::FullMatch(). 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTYPED_TEST(RETest, FullMatchWorks) { 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE empty(TypeParam("")); 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::FullMatch(TypeParam(""), empty)); 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(RE::FullMatch(TypeParam("a"), empty)); 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE re(TypeParam("a.*z")); 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::FullMatch(TypeParam("az"), re)); 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::FullMatch(TypeParam("axyz"), re)); 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(RE::FullMatch(TypeParam("baz"), re)); 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(RE::FullMatch(TypeParam("azy"), re)); 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests RE::PartialMatch(). 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTYPED_TEST(RETest, PartialMatchWorks) { 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE empty(TypeParam("")); 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::PartialMatch(TypeParam(""), empty)); 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::PartialMatch(TypeParam("a"), empty)); 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE re(TypeParam("a.*z")); 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::PartialMatch(TypeParam("az"), re)); 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::PartialMatch(TypeParam("axyz"), re)); 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::PartialMatch(TypeParam("baz"), re)); 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::PartialMatch(TypeParam("azy"), re)); 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(RE::PartialMatch(TypeParam("zza"), re)); 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# endif // GTEST_HAS_TYPED_TEST 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif GTEST_USES_SIMPLE_RE 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(IsInSetTest, NulCharIsNotInAnySet) { 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsInSet('\0', "")); 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsInSet('\0', "\0")); 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsInSet('\0', "a")); 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(IsInSetTest, WorksForNonNulChars) { 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsInSet('a', "Ab")); 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsInSet('c', "")); 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsInSet('b', "bcd")); 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsInSet('b', "ab")); 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 423731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(IsAsciiDigitTest, IsFalseForNonDigit) { 424731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiDigit('\0')); 425731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiDigit(' ')); 426731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiDigit('+')); 427731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiDigit('-')); 428731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiDigit('.')); 429731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiDigit('a')); 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 432731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(IsAsciiDigitTest, IsTrueForDigit) { 433731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiDigit('0')); 434731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiDigit('1')); 435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiDigit('5')); 436731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiDigit('9')); 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 439731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(IsAsciiPunctTest, IsFalseForNonPunct) { 440731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiPunct('\0')); 441731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiPunct(' ')); 442731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiPunct('\n')); 443731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiPunct('a')); 444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiPunct('0')); 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 447731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(IsAsciiPunctTest, IsTrueForPunct) { 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (const char* p = "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"; *p; p++) { 449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_PRED1(IsAsciiPunct, *p); 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(IsRepeatTest, IsFalseForNonRepeatChar) { 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsRepeat('\0')); 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsRepeat(' ')); 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsRepeat('a')); 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsRepeat('1')); 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsRepeat('-')); 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(IsRepeatTest, IsTrueForRepeatChar) { 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsRepeat('?')); 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsRepeat('*')); 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsRepeat('+')); 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 467731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(IsAsciiWhiteSpaceTest, IsFalseForNonWhiteSpace) { 468731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiWhiteSpace('\0')); 469731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiWhiteSpace('a')); 470731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiWhiteSpace('1')); 471731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiWhiteSpace('+')); 472731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiWhiteSpace('_')); 473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 475731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(IsAsciiWhiteSpaceTest, IsTrueForWhiteSpace) { 476731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWhiteSpace(' ')); 477731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWhiteSpace('\n')); 478731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWhiteSpace('\r')); 479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWhiteSpace('\t')); 480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWhiteSpace('\v')); 481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWhiteSpace('\f')); 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 484731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(IsAsciiWordCharTest, IsFalseForNonWordChar) { 485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiWordChar('\0')); 486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiWordChar('+')); 487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiWordChar('.')); 488731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiWordChar(' ')); 489731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(IsAsciiWordChar('\n')); 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 492731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(IsAsciiWordCharTest, IsTrueForLetter) { 493731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWordChar('a')); 494731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWordChar('b')); 495731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWordChar('A')); 496731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWordChar('Z')); 497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 499731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(IsAsciiWordCharTest, IsTrueForDigit) { 500731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWordChar('0')); 501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWordChar('1')); 502731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWordChar('7')); 503731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWordChar('9')); 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 506731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(IsAsciiWordCharTest, IsTrueForUnderscore) { 507731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsAsciiWordChar('_')); 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(IsValidEscapeTest, IsFalseForNonPrintable) { 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsValidEscape('\0')); 512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsValidEscape('\007')); 513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 515c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(IsValidEscapeTest, IsFalseForDigit) { 516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsValidEscape('0')); 517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsValidEscape('9')); 518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(IsValidEscapeTest, IsFalseForWhiteSpace) { 521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsValidEscape(' ')); 522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsValidEscape('\n')); 523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(IsValidEscapeTest, IsFalseForSomeLetter) { 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsValidEscape('a')); 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(IsValidEscape('Z')); 528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(IsValidEscapeTest, IsTrueForPunct) { 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('.')); 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('-')); 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('^')); 534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('$')); 535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('(')); 536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape(']')); 537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('{')); 538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('|')); 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(IsValidEscapeTest, IsTrueForSomeLetter) { 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('d')); 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('D')); 544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('s')); 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('S')); 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('w')); 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(IsValidEscape('W')); 548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AtomMatchesCharTest, EscapedPunct) { 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, '\\', '\0')); 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, '\\', ' ')); 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, '_', '.')); 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, '.', 'a')); 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, '\\', '\\')); 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, '_', '_')); 558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, '+', '+')); 559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, '.', '.')); 560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 562c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AtomMatchesCharTest, Escaped_d) { 563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'd', '\0')); 564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'd', 'a')); 565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'd', '.')); 566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'd', '0')); 568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'd', '9')); 569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 571c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AtomMatchesCharTest, Escaped_D) { 572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'D', '0')); 573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'D', '9')); 574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'D', '\0')); 576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'D', 'a')); 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'D', '-')); 578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 580c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AtomMatchesCharTest, Escaped_s) { 581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 's', '\0')); 582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 's', 'a')); 583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 's', '.')); 584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 's', '9')); 585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 's', ' ')); 587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 's', '\n')); 588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 's', '\t')); 589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 591c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AtomMatchesCharTest, Escaped_S) { 592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'S', ' ')); 593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'S', '\r')); 594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'S', '\0')); 596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'S', 'a')); 597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'S', '9')); 598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 600c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AtomMatchesCharTest, Escaped_w) { 601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'w', '\0')); 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'w', '+')); 603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'w', ' ')); 604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'w', '\n')); 605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'w', '0')); 607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'w', 'b')); 608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'w', 'C')); 609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'w', '_')); 610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 612c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AtomMatchesCharTest, Escaped_W) { 613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'W', 'A')); 614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'W', 'b')); 615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'W', '9')); 616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'W', '_')); 617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'W', '\0')); 619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'W', '*')); 620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'W', '\n')); 621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 623c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AtomMatchesCharTest, EscapedWhiteSpace) { 624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'f', '\0')); 625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'f', '\n')); 626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'n', '\0')); 627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'n', '\r')); 628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'r', '\0')); 629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'r', 'a')); 630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 't', '\0')); 631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 't', 't')); 632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'v', '\0')); 633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(true, 'v', '\f')); 634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'f', '\f')); 636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'n', '\n')); 637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'r', '\r')); 638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 't', '\t')); 639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(true, 'v', '\v')); 640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 642c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AtomMatchesCharTest, UnescapedDot) { 643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(false, '.', '\n')); 644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(false, '.', '\0')); 646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(false, '.', '.')); 647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(false, '.', 'a')); 648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(false, '.', ' ')); 649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 651c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AtomMatchesCharTest, UnescapedChar) { 652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(false, 'a', '\0')); 653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(false, 'a', 'b')); 654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(AtomMatchesChar(false, '$', 'a')); 655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(false, '$', '$')); 657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(false, '5', '5')); 658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AtomMatchesChar(false, 'Z', 'Z')); 659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 661c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ValidateRegexTest, GeneratesFailureAndReturnsFalseForInvalid) { 662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(NULL)), 663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "NULL is not a valid simple regular expression"); 664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE( 665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(ValidateRegex("a\\")), 666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Syntax error at index 1 in simple regular expression \"a\\\": "); 667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a\\")), 668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "'\\' cannot appear at the end"); 669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\n\\")), 670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "'\\' cannot appear at the end"); 671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\s\\hb")), 672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "invalid escape sequence \"\\h\""); 673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^^")), 674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "'^' can only appear at the beginning"); 675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(".*^b")), 676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "'^' can only appear at the beginning"); 677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("$$")), 678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "'$' can only appear at the end"); 679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^$a")), 680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "'$' can only appear at the end"); 681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a(b")), 682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "'(' is unsupported"); 683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("ab)")), 684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "')' is unsupported"); 685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("[ab")), 686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "'[' is unsupported"); 687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a{2")), 688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "'{' is unsupported"); 689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("?")), 690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "'?' can only follow a repeatable token"); 691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^*")), 692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "'*' can only follow a repeatable token"); 693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("5*+")), 694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "'+' can only follow a repeatable token"); 695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 697c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ValidateRegexTest, ReturnsTrueForValid) { 698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(ValidateRegex("")); 699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(ValidateRegex("a")); 700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(ValidateRegex(".*")); 701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(ValidateRegex("^a_+")); 702c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(ValidateRegex("^a\\t\\&?")); 703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(ValidateRegex("09*$")); 704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(ValidateRegex("^Z$")); 705c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(ValidateRegex("a\\^Z\\$\\(\\)\\|\\[\\]\\{\\}")); 706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 708c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrOne) { 709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "a", "ba")); 710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Repeating more than once. 711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "aab")); 712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Repeating zero times. 714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ba")); 715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Repeating once. 716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ab")); 717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '#', '?', ".", "##")); 718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 720c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrMany) { 721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '*', "a$", "baab")); 722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Repeating zero times. 724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "bc")); 725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Repeating once. 726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "abc")); 727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Repeating more than once. 728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '*', "-", "ab_1-g")); 729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 731c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRepetitionAndRegexAtHeadTest, WorksForOneOrMany) { 732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "a$", "baab")); 733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Repeating zero times. 734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "bc")); 735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Repeating once. 737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "abc")); 738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Repeating more than once. 739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '+', "-", "ab_1-g")); 740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 742c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRegexAtHeadTest, ReturnsTrueForEmptyRegex) { 743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("", "")); 744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("", "ab")); 745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 747c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRegexAtHeadTest, WorksWhenDollarIsInRegex) { 748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAtHead("$", "a")); 749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("$", "")); 751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("a$", "a")); 752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 754c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithEscapeSequence) { 755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAtHead("\\w", "+")); 756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAtHead("\\W", "ab")); 757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("\\sa", "\nab")); 759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("\\d", "1a")); 760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 762c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithRepetition) { 763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAtHead(".+a", "abc")); 764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAtHead("a?b", "aab")); 765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead(".*a", "bc12-ab")); 767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("a?b", "b")); 768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("a?b", "ab")); 769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 771c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRegexAtHeadTest, 772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WorksWhenRegexStartsWithRepetionOfEscapeSequence) { 773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAtHead("\\.+a", "abc")); 774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAtHead("\\s?b", " b")); 775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("\\(*a", "((((ab")); 777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("\\^?b", "^b")); 778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "b")); 779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "\\b")); 780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 782c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRegexAtHeadTest, MatchesSequentially) { 783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAtHead("ab.*c", "acabc")); 784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAtHead("ab.*c", "ab-fsc")); 786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 788c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRegexAnywhereTest, ReturnsFalseWhenStringIsNull) { 789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAnywhere("", NULL)); 790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 792c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRegexAnywhereTest, WorksWhenRegexStartsWithCaret) { 793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAnywhere("^a", "ba")); 794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAnywhere("^$", "a")); 795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAnywhere("^a", "ab")); 797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAnywhere("^", "ab")); 798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAnywhere("^$", "")); 799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 801c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRegexAnywhereTest, ReturnsFalseWhenNoMatch) { 802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAnywhere("a", "bcde123")); 803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(MatchRegexAnywhere("a.+a", "--aa88888888")); 804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 806c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingPrefix) { 807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAnywhere("\\w+", "ab1_ - 5")); 808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAnywhere(".*=", "=")); 809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAnywhere("x.*ab?.*bc", "xaaabc")); 810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 812c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingNonPrefix) { 813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAnywhere("\\w+", "$$$ ab1_ - 5")); 814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(MatchRegexAnywhere("\\.+=", "= ...=")); 815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests RE's implicit constructors. 818c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RETest, ImplicitConstructorWorks) { 819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE empty(""); 820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("", empty.pattern()); 821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 822c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE simple("hello"); 823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("hello", simple.pattern()); 824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that RE's constructors reject invalid regular expressions. 827c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RETest, RejectsInvalidRegex) { 828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE({ 829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE normal(NULL); 830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }, "NULL is not a valid simple regular expression"); 831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE({ 833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE normal(".*(\\w+"); 834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }, "'(' is unsupported"); 835c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NONFATAL_FAILURE({ 837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE invalid("^?"); 838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }, "'?' can only follow a repeatable token"); 839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests RE::FullMatch(). 842c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RETest, FullMatchWorks) { 843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE empty(""); 844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::FullMatch("", empty)); 845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(RE::FullMatch("a", empty)); 846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE re1("a"); 848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::FullMatch("a", re1)); 849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE re("a.*z"); 851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::FullMatch("az", re)); 852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::FullMatch("axyz", re)); 853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(RE::FullMatch("baz", re)); 854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(RE::FullMatch("azy", re)); 855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests RE::PartialMatch(). 858c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(RETest, PartialMatchWorks) { 859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE empty(""); 860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::PartialMatch("", empty)); 861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::PartialMatch("a", empty)); 862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const RE re("a.*z"); 864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::PartialMatch("az", re)); 865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::PartialMatch("axyz", re)); 866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::PartialMatch("baz", re)); 867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(RE::PartialMatch("azy", re)); 868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(RE::PartialMatch("zza", re)); 869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // GTEST_USES_POSIX_RE 872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !GTEST_OS_WINDOWS_MOBILE 874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 875c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CaptureTest, CapturesStdout) { 876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CaptureStdout(); 877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch fprintf(stdout, "abc"); 878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("abc", GetCapturedStdout().c_str()); 879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CaptureStdout(); 881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch fprintf(stdout, "def%cghi", '\0'); 882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(::std::string("def\0ghi", 7), ::std::string(GetCapturedStdout())); 883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 885c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CaptureTest, CapturesStderr) { 886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CaptureStderr(); 887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch fprintf(stderr, "jkl"); 888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("jkl", GetCapturedStderr().c_str()); 889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CaptureStderr(); 891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch fprintf(stderr, "jkl%cmno", '\0'); 892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(::std::string("jkl\0mno", 7), ::std::string(GetCapturedStderr())); 893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that stdout and stderr capture don't interfere with each other. 896c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CaptureTest, CapturesStdoutAndStderr) { 897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CaptureStdout(); 898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CaptureStderr(); 899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch fprintf(stdout, "pqr"); 900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch fprintf(stderr, "stu"); 901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("pqr", GetCapturedStdout().c_str()); 902c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("stu", GetCapturedStderr().c_str()); 903c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 905c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CaptureDeathTest, CannotReenterStdoutCapture) { 906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CaptureStdout(); 907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_DEATH_IF_SUPPORTED(CaptureStdout();, 908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Only one stdout capturer can exist at a time"); 909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetCapturedStdout(); 910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We cannot test stderr capturing using death tests as they use it 912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // themselves. 913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // !GTEST_OS_WINDOWS_MOBILE 916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 917c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThreadLocalTest, DefaultConstructorInitializesToDefaultValues) { 918c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadLocal<int> t1; 919c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0, t1.get()); 920c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 921c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadLocal<void*> t2; 922c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(t2.get() == NULL); 923c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 925c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThreadLocalTest, SingleParamConstructorInitializesToParam) { 926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadLocal<int> t1(123); 927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(123, t1.get()); 928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int i = 0; 930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadLocal<int*> t2(&i); 931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(&i, t2.get()); 932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NoDefaultContructor { 935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit NoDefaultContructor(const char*) {} 937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NoDefaultContructor(const NoDefaultContructor&) {} 938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 940c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThreadLocalTest, ValueDefaultContructorIsNotRequiredForParamVersion) { 941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadLocal<NoDefaultContructor> bar(NoDefaultContructor("foo")); 942c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bar.pointer(); 943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 945c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThreadLocalTest, GetAndPointerReturnSameValue) { 946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadLocal<String> thread_local; 947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(thread_local.pointer(), &(thread_local.get())); 949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 950c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Verifies the condition still holds after calling set. 951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch thread_local.set("foo"); 952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(thread_local.pointer(), &(thread_local.get())); 953c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 954c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 955c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThreadLocalTest, PointerAndConstPointerReturnSameValue) { 956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadLocal<String> thread_local; 957c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ThreadLocal<String>& const_thread_local = thread_local; 958c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 959c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(thread_local.pointer(), const_thread_local.pointer()); 960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 961c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch thread_local.set("foo"); 962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(thread_local.pointer(), const_thread_local.pointer()); 963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_IS_THREADSAFE 966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AddTwo(int* param) { *param += 2; } 968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 969c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThreadWithParamTest, ConstructorExecutesThreadFunc) { 970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int i = 40; 971c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadWithParam<int*> thread(&AddTwo, &i, NULL); 972c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch thread.Join(); 973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(42, i); 974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 976c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MutexDeathTest, AssertHeldShouldAssertWhenNotLocked) { 977c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // AssertHeld() is flaky only in the presence of multiple threads accessing 978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the lock. In this case, the test is robust. 979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_DEATH_IF_SUPPORTED({ 980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Mutex m; 981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { MutexLock lock(&m); } 982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch m.AssertHeld(); 983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }, 984c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "thread .*hold"); 985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 987c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MutexTest, AssertHeldShouldNotAssertWhenLocked) { 988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Mutex m; 989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MutexLock lock(&m); 990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch m.AssertHeld(); 991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AtomicCounterWithMutex { 994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit AtomicCounterWithMutex(Mutex* mutex) : 996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch value_(0), mutex_(mutex), random_(42) {} 997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 998c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Increment() { 999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MutexLock lock(mutex_); 1000c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int temp = value_; 1001c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 1002c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Locking a mutex puts up a memory barrier, preventing reads and 1003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // writes to value_ rearranged when observed from other threads. 1004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 1005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We cannot use Mutex and MutexLock here or rely on their memory 1006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // barrier functionality as we are testing them here. 1007c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pthread_mutex_t memory_barrier_mutex; 1008c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTEST_CHECK_POSIX_SUCCESS_( 1009c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pthread_mutex_init(&memory_barrier_mutex, NULL)); 1010c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&memory_barrier_mutex)); 1011c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1012c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SleepMilliseconds(random_.Generate(30)); 1013c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex)); 1015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1016c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch value_ = temp + 1; 1017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int value() const { return value_; } 1019c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1020c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 1021c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch volatile int value_; 1022c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Mutex* const mutex_; // Protects value_. 1023c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Random random_; 1024c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 1025c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1026c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CountingThreadFunc(pair<AtomicCounterWithMutex*, int> param) { 1027c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < param.second; ++i) 1028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch param.first->Increment(); 1029c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1030c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1031c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that the mutex only lets one thread at a time to lock it. 1032c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MutexTest, OnlyOneThreadCanLockAtATime) { 1033c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Mutex mutex; 1034c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AtomicCounterWithMutex locked_counter(&mutex); 1035c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1036c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef ThreadWithParam<pair<AtomicCounterWithMutex*, int> > ThreadType; 1037c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int kCycleCount = 20; 1038c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int kThreadCount = 7; 1039c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<ThreadType> counting_threads[kThreadCount]; 1040c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Notification threads_can_start; 1041c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Creates and runs kThreadCount threads that increment locked_counter 1042c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // kCycleCount times each. 1043c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < kThreadCount; ++i) { 1044c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch counting_threads[i].reset(new ThreadType(&CountingThreadFunc, 1045c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch make_pair(&locked_counter, 1046c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kCycleCount), 1047c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &threads_can_start)); 1048c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1049c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch threads_can_start.Notify(); 1050c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < kThreadCount; ++i) 1051c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch counting_threads[i]->Join(); 1052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1053c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If the mutex lets more than one thread to increment the counter at a 1054c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // time, they are likely to encounter a race condition and have some 1055c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // increments overwritten, resulting in the lower then expected counter 1056c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // value. 1057c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(kCycleCount * kThreadCount, locked_counter.value()); 1058c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1060c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename T> 1061c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RunFromThread(void (func)(T), T param) { 1062c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadWithParam<T> thread(func, param, NULL); 1063c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch thread.Join(); 1064c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1065c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1066c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RetrieveThreadLocalValue(pair<ThreadLocal<String>*, String*> param) { 1067c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *param.second = param.first->get(); 1068c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1069c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1070c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThreadLocalTest, ParameterizedConstructorSetsDefault) { 1071c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadLocal<String> thread_local("foo"); 1072c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("foo", thread_local.get().c_str()); 1073c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1074c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch thread_local.set("bar"); 1075c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("bar", thread_local.get().c_str()); 1076c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1077c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch String result; 1078c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RunFromThread(&RetrieveThreadLocalValue, make_pair(&thread_local, &result)); 1079c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("foo", result.c_str()); 1080c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1081c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1082c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DestructorTracker keeps track of whether its instances have been 1083c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// destroyed. 1084c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic std::vector<bool> g_destroyed; 1085c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1086c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DestructorTracker { 1087c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 1088c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DestructorTracker() : index_(GetNewIndex()) {} 1089c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DestructorTracker(const DestructorTracker& /* rhs */) 1090c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : index_(GetNewIndex()) {} 1091c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~DestructorTracker() { 1092c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We never access g_destroyed concurrently, so we don't need to 1093c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // protect the write operation under a mutex. 1094c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_destroyed[index_] = true; 1095c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1096c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1097c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 1098c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static int GetNewIndex() { 1099c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_destroyed.push_back(false); 1100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return g_destroyed.size() - 1; 1101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int index_; 1103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 1104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef ThreadLocal<DestructorTracker>* ThreadParam; 1106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CallThreadLocalGet(ThreadParam thread_local) { 1108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch thread_local->get(); 1109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that when a ThreadLocal object dies in a thread, it destroys 1112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the managed object for that thread. 1113c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThreadLocalTest, DestroysManagedObjectForOwnThreadWhenDying) { 1114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_destroyed.clear(); 1115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 1117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The next line default constructs a DestructorTracker object as 1118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the default value of objects managed by thread_local. 1119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadLocal<DestructorTracker> thread_local; 1120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1U, g_destroyed.size()); 1121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(g_destroyed[0]); 1122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This creates another DestructorTracker object for the main thread. 1124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch thread_local.get(); 1125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(2U, g_destroyed.size()); 1126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(g_destroyed[0]); 1127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(g_destroyed[1]); 1128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now thread_local has died. It should have destroyed both the 1131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // default value shared by all threads and the value for the main 1132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // thread. 1133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(2U, g_destroyed.size()); 1134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(g_destroyed[0]); 1135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(g_destroyed[1]); 1136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_destroyed.clear(); 1138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that when a thread exits, the thread-local object for that 1141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// thread is destroyed. 1142c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThreadLocalTest, DestroysManagedObjectAtThreadExit) { 1143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_destroyed.clear(); 1144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 1146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The next line default constructs a DestructorTracker object as 1147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the default value of objects managed by thread_local. 1148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadLocal<DestructorTracker> thread_local; 1149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1U, g_destroyed.size()); 1150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(g_destroyed[0]); 1151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This creates another DestructorTracker object in the new thread. 1153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadWithParam<ThreadParam> thread( 1154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &CallThreadLocalGet, &thread_local, NULL); 1155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch thread.Join(); 1156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now the new thread has exited. The per-thread object for it 1158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // should have been destroyed. 1159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(2U, g_destroyed.size()); 1160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(g_destroyed[0]); 1161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(g_destroyed[1]); 1162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now thread_local has died. The default value should have been 1165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // destroyed too. 1166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(2U, g_destroyed.size()); 1167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(g_destroyed[0]); 1168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(g_destroyed[1]); 1169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_destroyed.clear(); 1171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1173c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ThreadLocalTest, ThreadLocalMutationsAffectOnlyCurrentThread) { 1174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThreadLocal<String> thread_local; 1175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch thread_local.set("Foo"); 1176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_STREQ("Foo", thread_local.get().c_str()); 1177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch String result; 1179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RunFromThread(&RetrieveThreadLocalValue, make_pair(&thread_local, &result)); 1180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result.c_str() == NULL); 1181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // GTEST_IS_THREADSAFE 1184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace internal 1186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace testing 1187