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