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