1dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2007, Google Inc. 2dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All rights reserved. 3dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without 5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are 6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met: 7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// * Redistributions of source code must retain the above copyright 9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer. 10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// * Redistributions in binary form must reproduce the above 11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer 12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the 13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution. 14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// * Neither the name of Google Inc. nor the names of its 15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from 16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission. 17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Author: wan@google.com (Zhanyong Wan) 31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Google Mock - a framework for writing C++ mock classes. 33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This file tests the internal utilities. 35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/internal/gmock-internal-utils.h" 37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <stdlib.h> 38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <map> 39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <string> 40dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <sstream> 41dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <vector> 4246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/gmock.h" 4346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/internal/gmock-port.h" 4446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest.h" 4546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest-spi.h" 46dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 47dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_OS_CYGWIN 4846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# include <sys/types.h> // For ssize_t. NOLINT 49dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif 50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 5146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass ProtocolMessage; 5246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 5346108a219a4b812dd8f36fee479a0340ea5963f5Ben Channamespace proto2 { 5446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass Message; 5546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} // namespace proto2 5646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 57dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace testing { 58dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace internal { 59dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 60dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace { 61dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 62dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing ::std::tr1::make_tuple; 63dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing ::std::tr1::tuple; 64dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 65dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsNoWord) { 66dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("", ConvertIdentifierNameToWords("")); 67dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("", ConvertIdentifierNameToWords("_")); 68dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("", ConvertIdentifierNameToWords("__")); 69dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 70dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 71dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsDigits) { 72dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("1", ConvertIdentifierNameToWords("_1")); 73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("2", ConvertIdentifierNameToWords("2_")); 74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("34", ConvertIdentifierNameToWords("_34_")); 75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("34 56", ConvertIdentifierNameToWords("_34_56")); 76dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 77dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsCamelCaseWords) { 79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("a big word", ConvertIdentifierNameToWords("ABigWord")); 80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("FooBar")); 81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("foo", ConvertIdentifierNameToWords("Foo_")); 82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_Foo_Bar_")); 83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_Foo__And_Bar")); 84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContains_SeparatedWords) { 87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("foo_bar")); 88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("foo", ConvertIdentifierNameToWords("_foo_")); 89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_foo_bar_")); 90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_foo__and_bar")); 91dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 92dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 93dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameIsMixture) { 94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("foo bar 123", ConvertIdentifierNameToWords("Foo_bar123")); 95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("chapter 11 section 1", 96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ConvertIdentifierNameToWords("_Chapter11Section_1_")); 97dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 98dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PointeeOfTest, WorksForSmartPointers) { 100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter CompileAssertTypesEqual<const char, 101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter PointeeOf<internal::linked_ptr<const char> >::type>(); 102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PointeeOfTest, WorksForRawPointers) { 105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter CompileAssertTypesEqual<int, PointeeOf<int*>::type>(); 106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter CompileAssertTypesEqual<const char, PointeeOf<const char*>::type>(); 107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter CompileAssertTypesEqual<void, PointeeOf<void*>::type>(); 108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GetRawPointerTest, WorksForSmartPointers) { 111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* const raw_p4 = new const char('a'); // NOLINT 112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const internal::linked_ptr<const char> p4(raw_p4); 113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(raw_p4, GetRawPointer(p4)); 114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GetRawPointerTest, WorksForRawPointers) { 117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int* p = NULL; 11846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Don't use EXPECT_EQ as no NULL-testing magic on Symbian. 11946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(NULL == GetRawPointer(p)); 120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n = 1; 121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(&n, GetRawPointer(&n)); 122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 12446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests KindOf<T>. 12546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass Base {}; 127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass Derived : public Base {}; 128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(KindOfTest, Bool) { 130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kBool, GMOCK_KIND_OF_(bool)); // NOLINT 131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(KindOfTest, Integer) { 134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(char)); // NOLINT 135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(signed char)); // NOLINT 136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned char)); // NOLINT 137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(short)); // NOLINT 138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned short)); // NOLINT 139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(int)); // NOLINT 140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned int)); // NOLINT 141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long)); // NOLINT 142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long)); // NOLINT 143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(wchar_t)); // NOLINT 144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(Int64)); // NOLINT 145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(UInt64)); // NOLINT 146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(size_t)); // NOLINT 147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN 148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // ssize_t is not defined on Windows and possibly some other OSes. 149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kInteger, GMOCK_KIND_OF_(ssize_t)); // NOLINT 150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif 151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(KindOfTest, FloatingPoint) { 154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(float)); // NOLINT 155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(double)); // NOLINT 156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(long double)); // NOLINT 157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(KindOfTest, Other) { 160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kOther, GMOCK_KIND_OF_(void*)); // NOLINT 161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kOther, GMOCK_KIND_OF_(char**)); // NOLINT 162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(kOther, GMOCK_KIND_OF_(Base)); // NOLINT 163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests LosslessArithmeticConvertible<T, U>. 166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, BoolToBool) { 168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<bool, bool>::value)); 169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, BoolToInteger) { 172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<bool, char>::value)); 173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<bool, int>::value)); 174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE( 175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter (LosslessArithmeticConvertible<bool, unsigned long>::value)); // NOLINT 176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, BoolToFloatingPoint) { 179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<bool, float>::value)); 180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<bool, double>::value)); 181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, IntegerToBool) { 184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<unsigned char, bool>::value)); 185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<int, bool>::value)); 186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, IntegerToInteger) { 189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Unsigned => larger signed is fine. 190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<unsigned char, int>::value)); 191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Unsigned => larger unsigned is fine. 193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE( 194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter (LosslessArithmeticConvertible<unsigned short, UInt64>::value)); // NOLINT 195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Signed => unsigned is not fine. 197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<short, UInt64>::value)); // NOLINT 198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible< 199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter signed char, unsigned int>::value)); // NOLINT 200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Same size and same signedness: fine too. 202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible< 203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter unsigned char, unsigned char>::value)); 204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<int, int>::value)); 205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<wchar_t, wchar_t>::value)); 206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible< 207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter unsigned long, unsigned long>::value)); // NOLINT 208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Same size, different signedness: not fine. 210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible< 211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter unsigned char, signed char>::value)); 212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<int, unsigned int>::value)); 213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<UInt64, Int64>::value)); 214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Larger size => smaller size is not fine. 216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<long, char>::value)); // NOLINT 217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<int, signed char>::value)); 218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<Int64, unsigned int>::value)); 219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, IntegerToFloatingPoint) { 222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Integers cannot be losslessly converted to floating-points, as 223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // the format of the latter is implementation-defined. 224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<char, float>::value)); 225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<int, double>::value)); 226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible< 227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter short, long double>::value)); // NOLINT 228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, FloatingPointToBool) { 231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<float, bool>::value)); 232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<double, bool>::value)); 233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, FloatingPointToInteger) { 236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<float, long>::value)); // NOLINT 237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<double, Int64>::value)); 238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<long double, int>::value)); 239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, FloatingPointToFloatingPoint) { 242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Smaller size => larger size is fine. 243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<float, double>::value)); 244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<float, long double>::value)); 245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<double, long double>::value)); 246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Same size: fine. 248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<float, float>::value)); 249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<double, double>::value)); 250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Larger size => smaller size is not fine. 252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value)); 253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter if (sizeof(double) == sizeof(long double)) { // NOLINT 254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // In some implementations (e.g. MSVC), double and long double 255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // have the same size. 256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value)); 257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } else { 258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((LosslessArithmeticConvertible<long double, double>::value)); 259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests the TupleMatches() template function. 263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TupleMatchesTest, WorksForSize0) { 265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter tuple<> matchers; 266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter tuple<> values; 267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(TupleMatches(matchers, values)); 269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TupleMatchesTest, WorksForSize1) { 272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter tuple<Matcher<int> > matchers(Eq(1)); 273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter tuple<int> values1(1), 274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter values2(2); 275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(TupleMatches(matchers, values1)); 277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(TupleMatches(matchers, values2)); 278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TupleMatchesTest, WorksForSize2) { 281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter tuple<Matcher<int>, Matcher<char> > matchers(Eq(1), Eq('a')); 282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter tuple<int, char> values1(1, 'a'), 283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter values2(1, 'b'), 284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter values3(2, 'a'), 285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter values4(2, 'b'); 286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(TupleMatches(matchers, values1)); 288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(TupleMatches(matchers, values2)); 289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(TupleMatches(matchers, values3)); 290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(TupleMatches(matchers, values4)); 291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TupleMatchesTest, WorksForSize5) { 294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter tuple<Matcher<int>, Matcher<char>, Matcher<bool>, Matcher<long>, // NOLINT 295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<string> > 296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter matchers(Eq(1), Eq('a'), Eq(true), Eq(2L), Eq("hi")); 297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter tuple<int, char, bool, long, string> // NOLINT 298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter values1(1, 'a', true, 2L, "hi"), 299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter values2(1, 'a', true, 2L, "hello"), 300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter values3(2, 'a', true, 2L, "hi"); 301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(TupleMatches(matchers, values1)); 303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(TupleMatches(matchers, values2)); 304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(TupleMatches(matchers, values3)); 305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Assert(true, ...) succeeds. 308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AssertTest, SucceedsOnTrue) { 309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Assert(true, __FILE__, __LINE__, "This should succeed."); 310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Assert(true, __FILE__, __LINE__); // This should succeed too. 311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Assert(false, ...) generates a fatal failure. 314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AssertTest, FailsFatallyOnFalse) { 31546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_DEATH_IF_SUPPORTED({ 316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Assert(false, __FILE__, __LINE__, "This should fail."); 317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter }, ""); 318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 31946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_DEATH_IF_SUPPORTED({ 320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Assert(false, __FILE__, __LINE__); 321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter }, ""); 322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Expect(true, ...) succeeds. 325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectTest, SucceedsOnTrue) { 326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Expect(true, __FILE__, __LINE__, "This should succeed."); 327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Expect(true, __FILE__, __LINE__); // This should succeed too. 328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Expect(false, ...) generates a non-fatal failure. 331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectTest, FailsNonfatallyOnFalse) { 332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_NONFATAL_FAILURE({ // NOLINT 333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Expect(false, __FILE__, __LINE__, "This should fail."); 334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter }, "This should fail"); 335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_NONFATAL_FAILURE({ // NOLINT 337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Expect(false, __FILE__, __LINE__); 338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter }, "Expectation failed"); 339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests LogIsVisible(). 342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass LogIsVisibleTest : public ::testing::Test { 344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter protected: 345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter virtual void SetUp() { 346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The code needs to work when both ::string and ::std::string are 347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // defined and the flag is implemented as a 348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // testing::internal::String. In this case, without the call to 349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // c_str(), the compiler will complain that it cannot figure out 350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // whether the String flag should be converted to a ::string or an 351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // ::std::string before being assigned to original_verbose_. 352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter original_verbose_ = GMOCK_FLAG(verbose).c_str(); 353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter virtual void TearDown() { GMOCK_FLAG(verbose) = original_verbose_; } 356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter string original_verbose_; 358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(LogIsVisibleTest, AlwaysReturnsTrueIfVerbosityIsInfo) { 361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GMOCK_FLAG(verbose) = kInfoVerbosity; 36246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(LogIsVisible(kInfo)); 36346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(LogIsVisible(kWarning)); 364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(LogIsVisibleTest, AlwaysReturnsFalseIfVerbosityIsError) { 367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GMOCK_FLAG(verbose) = kErrorVerbosity; 36846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(LogIsVisible(kInfo)); 36946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(LogIsVisible(kWarning)); 370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(LogIsVisibleTest, WorksWhenVerbosityIsWarning) { 373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GMOCK_FLAG(verbose) = kWarningVerbosity; 37446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(LogIsVisible(kInfo)); 37546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(LogIsVisible(kWarning)); 376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 37846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_STREAM_REDIRECTION 379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests the Log() function. 381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that Log() behaves correctly for the given verbosity level 383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and log severity. 384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtervoid TestLogWithSeverity(const string& verbosity, LogSeverity severity, 385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter bool should_print) { 386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const string old_flag = GMOCK_FLAG(verbose); 387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GMOCK_FLAG(verbose) = verbosity; 38846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan CaptureStdout(); 389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Log(severity, "Test log.\n", 0); 390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter if (should_print) { 39146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(GetCapturedStdout().c_str(), 39246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ContainsRegex( 39346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan severity == kWarning ? 39446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "^\nGMOCK WARNING:\nTest log\\.\nStack trace:\n" : 39546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "^\nTest log\\.\nStack trace:\n")); 396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } else { 39746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_STREQ("", GetCapturedStdout().c_str()); 398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GMOCK_FLAG(verbose) = old_flag; 400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that when the stack_frames_to_skip parameter is negative, 403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Log() doesn't include the stack trace in the output. 404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LogTest, NoStackTraceWhenStackFramesToSkipIsNegative) { 40546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const string saved_flag = GMOCK_FLAG(verbose); 406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GMOCK_FLAG(verbose) = kInfoVerbosity; 40746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan CaptureStdout(); 40846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Log(kInfo, "Test log.\n", -1); 40946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_STREQ("\nTest log.\n", GetCapturedStdout().c_str()); 41046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GMOCK_FLAG(verbose) = saved_flag; 411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that in opt mode, a positive stack_frames_to_skip argument is 414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// treated as 0. 415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LogTest, NoSkippingStackFrameInOptMode) { 41646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan CaptureStdout(); 41746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Log(kWarning, "Test log.\n", 100); 41846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const String log = GetCapturedStdout(); 41946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 42046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# if defined(NDEBUG) && GTEST_GOOGLE3_MODE_ 42146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // In opt mode, no stack frame should be skipped. 423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(log, ContainsRegex("\nGMOCK WARNING:\n" 424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "Test log\\.\n" 425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "Stack trace:\n" 426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ".+")); 42746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# else 42846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // In dbg mode, the stack frames should be skipped. 43046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_STREQ("\nGMOCK WARNING:\n" 43146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "Test log.\n" 43246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "Stack trace:\n", log.c_str()); 43346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# endif 434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that all logs are printed when the value of the 437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// --gmock_verbose flag is "info". 438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LogTest, AllLogsArePrintedWhenVerbosityIsInfo) { 43946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan TestLogWithSeverity(kInfoVerbosity, kInfo, true); 44046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan TestLogWithSeverity(kInfoVerbosity, kWarning, true); 441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that only warnings are printed when the value of the 444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// --gmock_verbose flag is "warning". 445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsWarning) { 44646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan TestLogWithSeverity(kWarningVerbosity, kInfo, false); 44746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan TestLogWithSeverity(kWarningVerbosity, kWarning, true); 448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that no logs are printed when the value of the 451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// --gmock_verbose flag is "error". 452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LogTest, NoLogsArePrintedWhenVerbosityIsError) { 45346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan TestLogWithSeverity(kErrorVerbosity, kInfo, false); 45446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan TestLogWithSeverity(kErrorVerbosity, kWarning, false); 455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that only warnings are printed when the value of the 458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// --gmock_verbose flag is invalid. 459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsInvalid) { 46046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan TestLogWithSeverity("invalid", kInfo, false); 46146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan TestLogWithSeverity("invalid", kWarning, true); 462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 46446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif // GTEST_HAS_STREAM_REDIRECTION 465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypeTraitsTest, true_type) { 467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(true_type::value); 468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypeTraitsTest, false_type) { 471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(false_type::value); 472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypeTraitsTest, is_reference) { 475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(is_reference<int>::value); 476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(is_reference<char*>::value); 477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(is_reference<const int&>::value); 478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypeTraitsTest, is_pointer) { 481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(is_pointer<int>::value); 482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(is_pointer<char&>::value); 483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(is_pointer<const int*>::value); 484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypeTraitsTest, type_equals) { 487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((type_equals<int, const int>::value)); 488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((type_equals<int, int&>::value)); 489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE((type_equals<int, double>::value)); 490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((type_equals<char, char>::value)); 491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypeTraitsTest, remove_reference) { 494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((type_equals<char, remove_reference<char&>::type>::value)); 495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((type_equals<const int, 496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter remove_reference<const int&>::type>::value)); 497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((type_equals<int, remove_reference<int>::type>::value)); 498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE((type_equals<double*, remove_reference<double*>::type>::value)); 499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 50146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_STREAM_REDIRECTION 502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that Log() behaves correctly for the given verbosity level 504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and log severity. 50546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanString GrabOutput(void(*logger)(), const char* verbosity) { 506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const string saved_flag = GMOCK_FLAG(verbose); 507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GMOCK_FLAG(verbose) = verbosity; 50846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan CaptureStdout(); 509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter logger(); 510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GMOCK_FLAG(verbose) = saved_flag; 51146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return GetCapturedStdout(); 512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass DummyMock { 515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter MOCK_METHOD0(TestMethod, void()); 517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter MOCK_METHOD1(TestMethodArg, void(int dummy)); 518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtervoid ExpectCallLogger() { 521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter DummyMock mock; 522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_CALL(mock, TestMethod()); 523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter mock.TestMethod(); 524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that EXPECT_CALL logs if the --gmock_verbose flag is set to "info". 527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest, LogsWhenVerbosityIsInfo) { 528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(GrabOutput(ExpectCallLogger, kInfoVerbosity), 529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter HasSubstr("EXPECT_CALL(mock, TestMethod())")); 530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that EXPECT_CALL doesn't log 533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// if the --gmock_verbose flag is set to "warning". 534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest, DoesNotLogWhenVerbosityIsWarning) { 53546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kWarningVerbosity).c_str()); 536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that EXPECT_CALL doesn't log 539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// if the --gmock_verbose flag is set to "error". 540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest, DoesNotLogWhenVerbosityIsError) { 54146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kErrorVerbosity).c_str()); 542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtervoid OnCallLogger() { 545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter DummyMock mock; 546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ON_CALL(mock, TestMethod()); 547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that ON_CALL logs if the --gmock_verbose flag is set to "info". 550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallTest, LogsWhenVerbosityIsInfo) { 551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(GrabOutput(OnCallLogger, kInfoVerbosity), 552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter HasSubstr("ON_CALL(mock, TestMethod())")); 553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that ON_CALL doesn't log 556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// if the --gmock_verbose flag is set to "warning". 557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallTest, DoesNotLogWhenVerbosityIsWarning) { 55846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_STREQ("", GrabOutput(OnCallLogger, kWarningVerbosity).c_str()); 559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that ON_CALL doesn't log if 562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the --gmock_verbose flag is set to "error". 563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallTest, DoesNotLogWhenVerbosityIsError) { 56446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_STREQ("", GrabOutput(OnCallLogger, kErrorVerbosity).c_str()); 565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtervoid OnCallAnyArgumentLogger() { 568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter DummyMock mock; 569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ON_CALL(mock, TestMethodArg(_)); 570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that ON_CALL prints provided _ argument. 573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallTest, LogsAnythingArgument) { 574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(GrabOutput(OnCallAnyArgumentLogger, kInfoVerbosity), 575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter HasSubstr("ON_CALL(mock, TestMethodArg(_)")); 576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 57846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif // GTEST_HAS_STREAM_REDIRECTION 579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests StlContainerView. 581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StlContainerViewTest, WorksForStlContainer) { 583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StaticAssertTypeEq<std::vector<int>, 584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StlContainerView<std::vector<int> >::type>(); 585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StaticAssertTypeEq<const std::vector<double>&, 586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StlContainerView<std::vector<double> >::const_reference>(); 587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter typedef std::vector<char> Chars; 589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Chars v1; 590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Chars& v2(StlContainerView<Chars>::ConstReference(v1)); 591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(&v1, &v2); 592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter v1.push_back('a'); 594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Chars v3 = StlContainerView<Chars>::Copy(v1); 595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(v3, Eq(v3)); 596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StlContainerViewTest, WorksForStaticNativeArray) { 599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StaticAssertTypeEq<NativeArray<int>, 600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StlContainerView<int[3]>::type>(); 601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StaticAssertTypeEq<NativeArray<double>, 602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StlContainerView<const double[4]>::type>(); 603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StaticAssertTypeEq<NativeArray<char[3]>, 604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StlContainerView<const char[2][3]>::type>(); 605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StaticAssertTypeEq<const NativeArray<int>, 607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StlContainerView<int[2]>::const_reference>(); 608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int a1[3] = { 0, 1, 2 }; 610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter NativeArray<int> a2 = StlContainerView<int[3]>::ConstReference(a1); 61146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ(3U, a2.size()); 612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(a1, a2.begin()); 613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const NativeArray<int> a3 = StlContainerView<int[3]>::Copy(a1); 61546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ASSERT_EQ(3U, a3.size()); 616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(0, a3.begin()[0]); 617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(1, a3.begin()[1]); 618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(2, a3.begin()[2]); 619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Makes sure a1 and a3 aren't aliases. 621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a1[0] = 3; 622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(0, a3.begin()[0]); 623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StlContainerViewTest, WorksForDynamicNativeArray) { 626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StaticAssertTypeEq<NativeArray<int>, 627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StlContainerView<tuple<const int*, size_t> >::type>(); 628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StaticAssertTypeEq<NativeArray<double>, 629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StlContainerView<tuple<linked_ptr<double>, int> >::type>(); 630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StaticAssertTypeEq<const NativeArray<int>, 632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter StlContainerView<tuple<const int*, int> >::const_reference>(); 633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int a1[3] = { 0, 1, 2 }; 635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const int* const p1 = a1; 636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter NativeArray<int> a2 = StlContainerView<tuple<const int*, int> >:: 637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ConstReference(make_tuple(p1, 3)); 63846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ(3U, a2.size()); 639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(a1, a2.begin()); 640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const NativeArray<int> a3 = StlContainerView<tuple<int*, size_t> >:: 642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Copy(make_tuple(static_cast<int*>(a1), 3)); 64346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ASSERT_EQ(3U, a3.size()); 644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(0, a3.begin()[0]); 645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(1, a3.begin()[1]); 646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(2, a3.begin()[2]); 647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Makes sure a1 and a3 aren't aliases. 649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a1[0] = 3; 650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(0, a3.begin()[0]); 651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} // namespace 654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} // namespace internal 655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} // namespace testing 656