113481Sgiacomo.travaglini@arm.com// Copyright 2007, Google Inc. 213481Sgiacomo.travaglini@arm.com// All rights reserved. 313481Sgiacomo.travaglini@arm.com// 413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without 513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are 613481Sgiacomo.travaglini@arm.com// met: 713481Sgiacomo.travaglini@arm.com// 813481Sgiacomo.travaglini@arm.com// * Redistributions of source code must retain the above copyright 913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer. 1013481Sgiacomo.travaglini@arm.com// * Redistributions in binary form must reproduce the above 1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer 1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the 1313481Sgiacomo.travaglini@arm.com// distribution. 1413481Sgiacomo.travaglini@arm.com// * Neither the name of Google Inc. nor the names of its 1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from 1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission. 1713481Sgiacomo.travaglini@arm.com// 1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2913481Sgiacomo.travaglini@arm.com// 3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan) 3113481Sgiacomo.travaglini@arm.com 3213481Sgiacomo.travaglini@arm.com// Google Mock - a framework for writing C++ mock classes. 3313481Sgiacomo.travaglini@arm.com// 3413481Sgiacomo.travaglini@arm.com// This file tests the internal utilities. 3513481Sgiacomo.travaglini@arm.com 3613481Sgiacomo.travaglini@arm.com#include "gmock/internal/gmock-internal-utils.h" 3713481Sgiacomo.travaglini@arm.com#include <stdlib.h> 3813481Sgiacomo.travaglini@arm.com#include <map> 3913481Sgiacomo.travaglini@arm.com#include <memory> 4013481Sgiacomo.travaglini@arm.com#include <string> 4113481Sgiacomo.travaglini@arm.com#include <sstream> 4213481Sgiacomo.travaglini@arm.com#include <vector> 4313481Sgiacomo.travaglini@arm.com#include "gmock/gmock.h" 4413481Sgiacomo.travaglini@arm.com#include "gmock/internal/gmock-port.h" 4513481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h" 4613481Sgiacomo.travaglini@arm.com#include "gtest/gtest-spi.h" 4713481Sgiacomo.travaglini@arm.com 4813481Sgiacomo.travaglini@arm.com// Indicates that this translation unit is part of Google Test's 4913481Sgiacomo.travaglini@arm.com// implementation. It must come before gtest-internal-inl.h is 5013481Sgiacomo.travaglini@arm.com// included, or there will be a compiler error. This trick is to 5113481Sgiacomo.travaglini@arm.com// prevent a user from accidentally including gtest-internal-inl.h in 5213481Sgiacomo.travaglini@arm.com// his code. 5313481Sgiacomo.travaglini@arm.com#define GTEST_IMPLEMENTATION_ 1 5413481Sgiacomo.travaglini@arm.com#include "src/gtest-internal-inl.h" 5513481Sgiacomo.travaglini@arm.com#undef GTEST_IMPLEMENTATION_ 5613481Sgiacomo.travaglini@arm.com 5713481Sgiacomo.travaglini@arm.com#if GTEST_OS_CYGWIN 5813481Sgiacomo.travaglini@arm.com# include <sys/types.h> // For ssize_t. NOLINT 5913481Sgiacomo.travaglini@arm.com#endif 6013481Sgiacomo.travaglini@arm.com 6113481Sgiacomo.travaglini@arm.comclass ProtocolMessage; 6213481Sgiacomo.travaglini@arm.com 6313481Sgiacomo.travaglini@arm.comnamespace proto2 { 6413481Sgiacomo.travaglini@arm.comclass Message; 6513481Sgiacomo.travaglini@arm.com} // namespace proto2 6613481Sgiacomo.travaglini@arm.com 6713481Sgiacomo.travaglini@arm.comnamespace testing { 6813481Sgiacomo.travaglini@arm.comnamespace internal { 6913481Sgiacomo.travaglini@arm.com 7013481Sgiacomo.travaglini@arm.comnamespace { 7113481Sgiacomo.travaglini@arm.com 7213481Sgiacomo.travaglini@arm.comTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsNoWord) { 7313481Sgiacomo.travaglini@arm.com EXPECT_EQ("", ConvertIdentifierNameToWords("")); 7413481Sgiacomo.travaglini@arm.com EXPECT_EQ("", ConvertIdentifierNameToWords("_")); 7513481Sgiacomo.travaglini@arm.com EXPECT_EQ("", ConvertIdentifierNameToWords("__")); 7613481Sgiacomo.travaglini@arm.com} 7713481Sgiacomo.travaglini@arm.com 7813481Sgiacomo.travaglini@arm.comTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsDigits) { 7913481Sgiacomo.travaglini@arm.com EXPECT_EQ("1", ConvertIdentifierNameToWords("_1")); 8013481Sgiacomo.travaglini@arm.com EXPECT_EQ("2", ConvertIdentifierNameToWords("2_")); 8113481Sgiacomo.travaglini@arm.com EXPECT_EQ("34", ConvertIdentifierNameToWords("_34_")); 8213481Sgiacomo.travaglini@arm.com EXPECT_EQ("34 56", ConvertIdentifierNameToWords("_34_56")); 8313481Sgiacomo.travaglini@arm.com} 8413481Sgiacomo.travaglini@arm.com 8513481Sgiacomo.travaglini@arm.comTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsCamelCaseWords) { 8613481Sgiacomo.travaglini@arm.com EXPECT_EQ("a big word", ConvertIdentifierNameToWords("ABigWord")); 8713481Sgiacomo.travaglini@arm.com EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("FooBar")); 8813481Sgiacomo.travaglini@arm.com EXPECT_EQ("foo", ConvertIdentifierNameToWords("Foo_")); 8913481Sgiacomo.travaglini@arm.com EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_Foo_Bar_")); 9013481Sgiacomo.travaglini@arm.com EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_Foo__And_Bar")); 9113481Sgiacomo.travaglini@arm.com} 9213481Sgiacomo.travaglini@arm.com 9313481Sgiacomo.travaglini@arm.comTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContains_SeparatedWords) { 9413481Sgiacomo.travaglini@arm.com EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("foo_bar")); 9513481Sgiacomo.travaglini@arm.com EXPECT_EQ("foo", ConvertIdentifierNameToWords("_foo_")); 9613481Sgiacomo.travaglini@arm.com EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_foo_bar_")); 9713481Sgiacomo.travaglini@arm.com EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_foo__and_bar")); 9813481Sgiacomo.travaglini@arm.com} 9913481Sgiacomo.travaglini@arm.com 10013481Sgiacomo.travaglini@arm.comTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameIsMixture) { 10113481Sgiacomo.travaglini@arm.com EXPECT_EQ("foo bar 123", ConvertIdentifierNameToWords("Foo_bar123")); 10213481Sgiacomo.travaglini@arm.com EXPECT_EQ("chapter 11 section 1", 10313481Sgiacomo.travaglini@arm.com ConvertIdentifierNameToWords("_Chapter11Section_1_")); 10413481Sgiacomo.travaglini@arm.com} 10513481Sgiacomo.travaglini@arm.com 10613481Sgiacomo.travaglini@arm.comTEST(PointeeOfTest, WorksForSmartPointers) { 10713481Sgiacomo.travaglini@arm.com CompileAssertTypesEqual<const char, 10813481Sgiacomo.travaglini@arm.com PointeeOf<internal::linked_ptr<const char> >::type>(); 10913481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_UNIQUE_PTR_ 11013481Sgiacomo.travaglini@arm.com CompileAssertTypesEqual<int, PointeeOf<std::unique_ptr<int> >::type>(); 11113481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_UNIQUE_PTR_ 11213481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_SHARED_PTR_ 11313481Sgiacomo.travaglini@arm.com CompileAssertTypesEqual<std::string, 11413481Sgiacomo.travaglini@arm.com PointeeOf<std::shared_ptr<std::string> >::type>(); 11513481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_SHARED_PTR_ 11613481Sgiacomo.travaglini@arm.com} 11713481Sgiacomo.travaglini@arm.com 11813481Sgiacomo.travaglini@arm.comTEST(PointeeOfTest, WorksForRawPointers) { 11913481Sgiacomo.travaglini@arm.com CompileAssertTypesEqual<int, PointeeOf<int*>::type>(); 12013481Sgiacomo.travaglini@arm.com CompileAssertTypesEqual<const char, PointeeOf<const char*>::type>(); 12113481Sgiacomo.travaglini@arm.com CompileAssertTypesEqual<void, PointeeOf<void*>::type>(); 12213481Sgiacomo.travaglini@arm.com} 12313481Sgiacomo.travaglini@arm.com 12413481Sgiacomo.travaglini@arm.comTEST(GetRawPointerTest, WorksForSmartPointers) { 12513481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_UNIQUE_PTR_ 12613481Sgiacomo.travaglini@arm.com const char* const raw_p1 = new const char('a'); // NOLINT 12713481Sgiacomo.travaglini@arm.com const std::unique_ptr<const char> p1(raw_p1); 12813481Sgiacomo.travaglini@arm.com EXPECT_EQ(raw_p1, GetRawPointer(p1)); 12913481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_UNIQUE_PTR_ 13013481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_SHARED_PTR_ 13113481Sgiacomo.travaglini@arm.com double* const raw_p2 = new double(2.5); // NOLINT 13213481Sgiacomo.travaglini@arm.com const std::shared_ptr<double> p2(raw_p2); 13313481Sgiacomo.travaglini@arm.com EXPECT_EQ(raw_p2, GetRawPointer(p2)); 13413481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_SHARED_PTR_ 13513481Sgiacomo.travaglini@arm.com 13613481Sgiacomo.travaglini@arm.com const char* const raw_p4 = new const char('a'); // NOLINT 13713481Sgiacomo.travaglini@arm.com const internal::linked_ptr<const char> p4(raw_p4); 13813481Sgiacomo.travaglini@arm.com EXPECT_EQ(raw_p4, GetRawPointer(p4)); 13913481Sgiacomo.travaglini@arm.com} 14013481Sgiacomo.travaglini@arm.com 14113481Sgiacomo.travaglini@arm.comTEST(GetRawPointerTest, WorksForRawPointers) { 14213481Sgiacomo.travaglini@arm.com int* p = NULL; 14313481Sgiacomo.travaglini@arm.com // Don't use EXPECT_EQ as no NULL-testing magic on Symbian. 14413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(NULL == GetRawPointer(p)); 14513481Sgiacomo.travaglini@arm.com int n = 1; 14613481Sgiacomo.travaglini@arm.com EXPECT_EQ(&n, GetRawPointer(&n)); 14713481Sgiacomo.travaglini@arm.com} 14813481Sgiacomo.travaglini@arm.com 14913481Sgiacomo.travaglini@arm.com// Tests KindOf<T>. 15013481Sgiacomo.travaglini@arm.com 15113481Sgiacomo.travaglini@arm.comclass Base {}; 15213481Sgiacomo.travaglini@arm.comclass Derived : public Base {}; 15313481Sgiacomo.travaglini@arm.com 15413481Sgiacomo.travaglini@arm.comTEST(KindOfTest, Bool) { 15513481Sgiacomo.travaglini@arm.com EXPECT_EQ(kBool, GMOCK_KIND_OF_(bool)); // NOLINT 15613481Sgiacomo.travaglini@arm.com} 15713481Sgiacomo.travaglini@arm.com 15813481Sgiacomo.travaglini@arm.comTEST(KindOfTest, Integer) { 15913481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(char)); // NOLINT 16013481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(signed char)); // NOLINT 16113481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned char)); // NOLINT 16213481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(short)); // NOLINT 16313481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned short)); // NOLINT 16413481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(int)); // NOLINT 16513481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned int)); // NOLINT 16613481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long)); // NOLINT 16713481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long)); // NOLINT 16813481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(wchar_t)); // NOLINT 16913481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(Int64)); // NOLINT 17013481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(UInt64)); // NOLINT 17113481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(size_t)); // NOLINT 17213481Sgiacomo.travaglini@arm.com#if GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN 17313481Sgiacomo.travaglini@arm.com // ssize_t is not defined on Windows and possibly some other OSes. 17413481Sgiacomo.travaglini@arm.com EXPECT_EQ(kInteger, GMOCK_KIND_OF_(ssize_t)); // NOLINT 17513481Sgiacomo.travaglini@arm.com#endif 17613481Sgiacomo.travaglini@arm.com} 17713481Sgiacomo.travaglini@arm.com 17813481Sgiacomo.travaglini@arm.comTEST(KindOfTest, FloatingPoint) { 17913481Sgiacomo.travaglini@arm.com EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(float)); // NOLINT 18013481Sgiacomo.travaglini@arm.com EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(double)); // NOLINT 18113481Sgiacomo.travaglini@arm.com EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(long double)); // NOLINT 18213481Sgiacomo.travaglini@arm.com} 18313481Sgiacomo.travaglini@arm.com 18413481Sgiacomo.travaglini@arm.comTEST(KindOfTest, Other) { 18513481Sgiacomo.travaglini@arm.com EXPECT_EQ(kOther, GMOCK_KIND_OF_(void*)); // NOLINT 18613481Sgiacomo.travaglini@arm.com EXPECT_EQ(kOther, GMOCK_KIND_OF_(char**)); // NOLINT 18713481Sgiacomo.travaglini@arm.com EXPECT_EQ(kOther, GMOCK_KIND_OF_(Base)); // NOLINT 18813481Sgiacomo.travaglini@arm.com} 18913481Sgiacomo.travaglini@arm.com 19013481Sgiacomo.travaglini@arm.com// Tests LosslessArithmeticConvertible<T, U>. 19113481Sgiacomo.travaglini@arm.com 19213481Sgiacomo.travaglini@arm.comTEST(LosslessArithmeticConvertibleTest, BoolToBool) { 19313481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<bool, bool>::value)); 19413481Sgiacomo.travaglini@arm.com} 19513481Sgiacomo.travaglini@arm.com 19613481Sgiacomo.travaglini@arm.comTEST(LosslessArithmeticConvertibleTest, BoolToInteger) { 19713481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<bool, char>::value)); 19813481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<bool, int>::value)); 19913481Sgiacomo.travaglini@arm.com EXPECT_TRUE( 20013481Sgiacomo.travaglini@arm.com (LosslessArithmeticConvertible<bool, unsigned long>::value)); // NOLINT 20113481Sgiacomo.travaglini@arm.com} 20213481Sgiacomo.travaglini@arm.com 20313481Sgiacomo.travaglini@arm.comTEST(LosslessArithmeticConvertibleTest, BoolToFloatingPoint) { 20413481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<bool, float>::value)); 20513481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<bool, double>::value)); 20613481Sgiacomo.travaglini@arm.com} 20713481Sgiacomo.travaglini@arm.com 20813481Sgiacomo.travaglini@arm.comTEST(LosslessArithmeticConvertibleTest, IntegerToBool) { 20913481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<unsigned char, bool>::value)); 21013481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<int, bool>::value)); 21113481Sgiacomo.travaglini@arm.com} 21213481Sgiacomo.travaglini@arm.com 21313481Sgiacomo.travaglini@arm.comTEST(LosslessArithmeticConvertibleTest, IntegerToInteger) { 21413481Sgiacomo.travaglini@arm.com // Unsigned => larger signed is fine. 21513481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<unsigned char, int>::value)); 21613481Sgiacomo.travaglini@arm.com 21713481Sgiacomo.travaglini@arm.com // Unsigned => larger unsigned is fine. 21813481Sgiacomo.travaglini@arm.com EXPECT_TRUE( 21913481Sgiacomo.travaglini@arm.com (LosslessArithmeticConvertible<unsigned short, UInt64>::value)); // NOLINT 22013481Sgiacomo.travaglini@arm.com 22113481Sgiacomo.travaglini@arm.com // Signed => unsigned is not fine. 22213481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<short, UInt64>::value)); // NOLINT 22313481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible< 22413481Sgiacomo.travaglini@arm.com signed char, unsigned int>::value)); // NOLINT 22513481Sgiacomo.travaglini@arm.com 22613481Sgiacomo.travaglini@arm.com // Same size and same signedness: fine too. 22713481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible< 22813481Sgiacomo.travaglini@arm.com unsigned char, unsigned char>::value)); 22913481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<int, int>::value)); 23013481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<wchar_t, wchar_t>::value)); 23113481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible< 23213481Sgiacomo.travaglini@arm.com unsigned long, unsigned long>::value)); // NOLINT 23313481Sgiacomo.travaglini@arm.com 23413481Sgiacomo.travaglini@arm.com // Same size, different signedness: not fine. 23513481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible< 23613481Sgiacomo.travaglini@arm.com unsigned char, signed char>::value)); 23713481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<int, unsigned int>::value)); 23813481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<UInt64, Int64>::value)); 23913481Sgiacomo.travaglini@arm.com 24013481Sgiacomo.travaglini@arm.com // Larger size => smaller size is not fine. 24113481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<long, char>::value)); // NOLINT 24213481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<int, signed char>::value)); 24313481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<Int64, unsigned int>::value)); 24413481Sgiacomo.travaglini@arm.com} 24513481Sgiacomo.travaglini@arm.com 24613481Sgiacomo.travaglini@arm.comTEST(LosslessArithmeticConvertibleTest, IntegerToFloatingPoint) { 24713481Sgiacomo.travaglini@arm.com // Integers cannot be losslessly converted to floating-points, as 24813481Sgiacomo.travaglini@arm.com // the format of the latter is implementation-defined. 24913481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<char, float>::value)); 25013481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<int, double>::value)); 25113481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible< 25213481Sgiacomo.travaglini@arm.com short, long double>::value)); // NOLINT 25313481Sgiacomo.travaglini@arm.com} 25413481Sgiacomo.travaglini@arm.com 25513481Sgiacomo.travaglini@arm.comTEST(LosslessArithmeticConvertibleTest, FloatingPointToBool) { 25613481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<float, bool>::value)); 25713481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<double, bool>::value)); 25813481Sgiacomo.travaglini@arm.com} 25913481Sgiacomo.travaglini@arm.com 26013481Sgiacomo.travaglini@arm.comTEST(LosslessArithmeticConvertibleTest, FloatingPointToInteger) { 26113481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<float, long>::value)); // NOLINT 26213481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<double, Int64>::value)); 26313481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<long double, int>::value)); 26413481Sgiacomo.travaglini@arm.com} 26513481Sgiacomo.travaglini@arm.com 26613481Sgiacomo.travaglini@arm.comTEST(LosslessArithmeticConvertibleTest, FloatingPointToFloatingPoint) { 26713481Sgiacomo.travaglini@arm.com // Smaller size => larger size is fine. 26813481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<float, double>::value)); 26913481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<float, long double>::value)); 27013481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<double, long double>::value)); 27113481Sgiacomo.travaglini@arm.com 27213481Sgiacomo.travaglini@arm.com // Same size: fine. 27313481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<float, float>::value)); 27413481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<double, double>::value)); 27513481Sgiacomo.travaglini@arm.com 27613481Sgiacomo.travaglini@arm.com // Larger size => smaller size is not fine. 27713481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value)); 27813481Sgiacomo.travaglini@arm.com GTEST_INTENTIONAL_CONST_COND_PUSH_() 27913481Sgiacomo.travaglini@arm.com if (sizeof(double) == sizeof(long double)) { // NOLINT 28013481Sgiacomo.travaglini@arm.com GTEST_INTENTIONAL_CONST_COND_POP_() 28113481Sgiacomo.travaglini@arm.com // In some implementations (e.g. MSVC), double and long double 28213481Sgiacomo.travaglini@arm.com // have the same size. 28313481Sgiacomo.travaglini@arm.com EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value)); 28413481Sgiacomo.travaglini@arm.com } else { 28513481Sgiacomo.travaglini@arm.com EXPECT_FALSE((LosslessArithmeticConvertible<long double, double>::value)); 28613481Sgiacomo.travaglini@arm.com } 28713481Sgiacomo.travaglini@arm.com} 28813481Sgiacomo.travaglini@arm.com 28913481Sgiacomo.travaglini@arm.com// Tests the TupleMatches() template function. 29013481Sgiacomo.travaglini@arm.com 29113481Sgiacomo.travaglini@arm.comTEST(TupleMatchesTest, WorksForSize0) { 29213481Sgiacomo.travaglini@arm.com tuple<> matchers; 29313481Sgiacomo.travaglini@arm.com tuple<> values; 29413481Sgiacomo.travaglini@arm.com 29513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(TupleMatches(matchers, values)); 29613481Sgiacomo.travaglini@arm.com} 29713481Sgiacomo.travaglini@arm.com 29813481Sgiacomo.travaglini@arm.comTEST(TupleMatchesTest, WorksForSize1) { 29913481Sgiacomo.travaglini@arm.com tuple<Matcher<int> > matchers(Eq(1)); 30013481Sgiacomo.travaglini@arm.com tuple<int> values1(1), 30113481Sgiacomo.travaglini@arm.com values2(2); 30213481Sgiacomo.travaglini@arm.com 30313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(TupleMatches(matchers, values1)); 30413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(TupleMatches(matchers, values2)); 30513481Sgiacomo.travaglini@arm.com} 30613481Sgiacomo.travaglini@arm.com 30713481Sgiacomo.travaglini@arm.comTEST(TupleMatchesTest, WorksForSize2) { 30813481Sgiacomo.travaglini@arm.com tuple<Matcher<int>, Matcher<char> > matchers(Eq(1), Eq('a')); 30913481Sgiacomo.travaglini@arm.com tuple<int, char> values1(1, 'a'), 31013481Sgiacomo.travaglini@arm.com values2(1, 'b'), 31113481Sgiacomo.travaglini@arm.com values3(2, 'a'), 31213481Sgiacomo.travaglini@arm.com values4(2, 'b'); 31313481Sgiacomo.travaglini@arm.com 31413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(TupleMatches(matchers, values1)); 31513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(TupleMatches(matchers, values2)); 31613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(TupleMatches(matchers, values3)); 31713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(TupleMatches(matchers, values4)); 31813481Sgiacomo.travaglini@arm.com} 31913481Sgiacomo.travaglini@arm.com 32013481Sgiacomo.travaglini@arm.comTEST(TupleMatchesTest, WorksForSize5) { 32113481Sgiacomo.travaglini@arm.com tuple<Matcher<int>, Matcher<char>, Matcher<bool>, Matcher<long>, // NOLINT 32213481Sgiacomo.travaglini@arm.com Matcher<string> > 32313481Sgiacomo.travaglini@arm.com matchers(Eq(1), Eq('a'), Eq(true), Eq(2L), Eq("hi")); 32413481Sgiacomo.travaglini@arm.com tuple<int, char, bool, long, string> // NOLINT 32513481Sgiacomo.travaglini@arm.com values1(1, 'a', true, 2L, "hi"), 32613481Sgiacomo.travaglini@arm.com values2(1, 'a', true, 2L, "hello"), 32713481Sgiacomo.travaglini@arm.com values3(2, 'a', true, 2L, "hi"); 32813481Sgiacomo.travaglini@arm.com 32913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(TupleMatches(matchers, values1)); 33013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(TupleMatches(matchers, values2)); 33113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(TupleMatches(matchers, values3)); 33213481Sgiacomo.travaglini@arm.com} 33313481Sgiacomo.travaglini@arm.com 33413481Sgiacomo.travaglini@arm.com// Tests that Assert(true, ...) succeeds. 33513481Sgiacomo.travaglini@arm.comTEST(AssertTest, SucceedsOnTrue) { 33613481Sgiacomo.travaglini@arm.com Assert(true, __FILE__, __LINE__, "This should succeed."); 33713481Sgiacomo.travaglini@arm.com Assert(true, __FILE__, __LINE__); // This should succeed too. 33813481Sgiacomo.travaglini@arm.com} 33913481Sgiacomo.travaglini@arm.com 34013481Sgiacomo.travaglini@arm.com// Tests that Assert(false, ...) generates a fatal failure. 34113481Sgiacomo.travaglini@arm.comTEST(AssertTest, FailsFatallyOnFalse) { 34213481Sgiacomo.travaglini@arm.com EXPECT_DEATH_IF_SUPPORTED({ 34313481Sgiacomo.travaglini@arm.com Assert(false, __FILE__, __LINE__, "This should fail."); 34413481Sgiacomo.travaglini@arm.com }, ""); 34513481Sgiacomo.travaglini@arm.com 34613481Sgiacomo.travaglini@arm.com EXPECT_DEATH_IF_SUPPORTED({ 34713481Sgiacomo.travaglini@arm.com Assert(false, __FILE__, __LINE__); 34813481Sgiacomo.travaglini@arm.com }, ""); 34913481Sgiacomo.travaglini@arm.com} 35013481Sgiacomo.travaglini@arm.com 35113481Sgiacomo.travaglini@arm.com// Tests that Expect(true, ...) succeeds. 35213481Sgiacomo.travaglini@arm.comTEST(ExpectTest, SucceedsOnTrue) { 35313481Sgiacomo.travaglini@arm.com Expect(true, __FILE__, __LINE__, "This should succeed."); 35413481Sgiacomo.travaglini@arm.com Expect(true, __FILE__, __LINE__); // This should succeed too. 35513481Sgiacomo.travaglini@arm.com} 35613481Sgiacomo.travaglini@arm.com 35713481Sgiacomo.travaglini@arm.com// Tests that Expect(false, ...) generates a non-fatal failure. 35813481Sgiacomo.travaglini@arm.comTEST(ExpectTest, FailsNonfatallyOnFalse) { 35913481Sgiacomo.travaglini@arm.com EXPECT_NONFATAL_FAILURE({ // NOLINT 36013481Sgiacomo.travaglini@arm.com Expect(false, __FILE__, __LINE__, "This should fail."); 36113481Sgiacomo.travaglini@arm.com }, "This should fail"); 36213481Sgiacomo.travaglini@arm.com 36313481Sgiacomo.travaglini@arm.com EXPECT_NONFATAL_FAILURE({ // NOLINT 36413481Sgiacomo.travaglini@arm.com Expect(false, __FILE__, __LINE__); 36513481Sgiacomo.travaglini@arm.com }, "Expectation failed"); 36613481Sgiacomo.travaglini@arm.com} 36713481Sgiacomo.travaglini@arm.com 36813481Sgiacomo.travaglini@arm.com// Tests LogIsVisible(). 36913481Sgiacomo.travaglini@arm.com 37013481Sgiacomo.travaglini@arm.comclass LogIsVisibleTest : public ::testing::Test { 37113481Sgiacomo.travaglini@arm.com protected: 37213481Sgiacomo.travaglini@arm.com virtual void SetUp() { 37313481Sgiacomo.travaglini@arm.com original_verbose_ = GMOCK_FLAG(verbose); 37413481Sgiacomo.travaglini@arm.com } 37513481Sgiacomo.travaglini@arm.com 37613481Sgiacomo.travaglini@arm.com virtual void TearDown() { GMOCK_FLAG(verbose) = original_verbose_; } 37713481Sgiacomo.travaglini@arm.com 37813481Sgiacomo.travaglini@arm.com string original_verbose_; 37913481Sgiacomo.travaglini@arm.com}; 38013481Sgiacomo.travaglini@arm.com 38113481Sgiacomo.travaglini@arm.comTEST_F(LogIsVisibleTest, AlwaysReturnsTrueIfVerbosityIsInfo) { 38213481Sgiacomo.travaglini@arm.com GMOCK_FLAG(verbose) = kInfoVerbosity; 38313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(LogIsVisible(kInfo)); 38413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(LogIsVisible(kWarning)); 38513481Sgiacomo.travaglini@arm.com} 38613481Sgiacomo.travaglini@arm.com 38713481Sgiacomo.travaglini@arm.comTEST_F(LogIsVisibleTest, AlwaysReturnsFalseIfVerbosityIsError) { 38813481Sgiacomo.travaglini@arm.com GMOCK_FLAG(verbose) = kErrorVerbosity; 38913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(LogIsVisible(kInfo)); 39013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(LogIsVisible(kWarning)); 39113481Sgiacomo.travaglini@arm.com} 39213481Sgiacomo.travaglini@arm.com 39313481Sgiacomo.travaglini@arm.comTEST_F(LogIsVisibleTest, WorksWhenVerbosityIsWarning) { 39413481Sgiacomo.travaglini@arm.com GMOCK_FLAG(verbose) = kWarningVerbosity; 39513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(LogIsVisible(kInfo)); 39613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(LogIsVisible(kWarning)); 39713481Sgiacomo.travaglini@arm.com} 39813481Sgiacomo.travaglini@arm.com 39913481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STREAM_REDIRECTION 40013481Sgiacomo.travaglini@arm.com 40113481Sgiacomo.travaglini@arm.com// Tests the Log() function. 40213481Sgiacomo.travaglini@arm.com 40313481Sgiacomo.travaglini@arm.com// Verifies that Log() behaves correctly for the given verbosity level 40413481Sgiacomo.travaglini@arm.com// and log severity. 40513481Sgiacomo.travaglini@arm.comvoid TestLogWithSeverity(const string& verbosity, LogSeverity severity, 40613481Sgiacomo.travaglini@arm.com bool should_print) { 40713481Sgiacomo.travaglini@arm.com const string old_flag = GMOCK_FLAG(verbose); 40813481Sgiacomo.travaglini@arm.com GMOCK_FLAG(verbose) = verbosity; 40913481Sgiacomo.travaglini@arm.com CaptureStdout(); 41013481Sgiacomo.travaglini@arm.com Log(severity, "Test log.\n", 0); 41113481Sgiacomo.travaglini@arm.com if (should_print) { 41213481Sgiacomo.travaglini@arm.com EXPECT_THAT(GetCapturedStdout().c_str(), 41313481Sgiacomo.travaglini@arm.com ContainsRegex( 41413481Sgiacomo.travaglini@arm.com severity == kWarning ? 41513481Sgiacomo.travaglini@arm.com "^\nGMOCK WARNING:\nTest log\\.\nStack trace:\n" : 41613481Sgiacomo.travaglini@arm.com "^\nTest log\\.\nStack trace:\n")); 41713481Sgiacomo.travaglini@arm.com } else { 41813481Sgiacomo.travaglini@arm.com EXPECT_STREQ("", GetCapturedStdout().c_str()); 41913481Sgiacomo.travaglini@arm.com } 42013481Sgiacomo.travaglini@arm.com GMOCK_FLAG(verbose) = old_flag; 42113481Sgiacomo.travaglini@arm.com} 42213481Sgiacomo.travaglini@arm.com 42313481Sgiacomo.travaglini@arm.com// Tests that when the stack_frames_to_skip parameter is negative, 42413481Sgiacomo.travaglini@arm.com// Log() doesn't include the stack trace in the output. 42513481Sgiacomo.travaglini@arm.comTEST(LogTest, NoStackTraceWhenStackFramesToSkipIsNegative) { 42613481Sgiacomo.travaglini@arm.com const string saved_flag = GMOCK_FLAG(verbose); 42713481Sgiacomo.travaglini@arm.com GMOCK_FLAG(verbose) = kInfoVerbosity; 42813481Sgiacomo.travaglini@arm.com CaptureStdout(); 42913481Sgiacomo.travaglini@arm.com Log(kInfo, "Test log.\n", -1); 43013481Sgiacomo.travaglini@arm.com EXPECT_STREQ("\nTest log.\n", GetCapturedStdout().c_str()); 43113481Sgiacomo.travaglini@arm.com GMOCK_FLAG(verbose) = saved_flag; 43213481Sgiacomo.travaglini@arm.com} 43313481Sgiacomo.travaglini@arm.com 43413481Sgiacomo.travaglini@arm.comstruct MockStackTraceGetter : testing::internal::OsStackTraceGetterInterface { 43513481Sgiacomo.travaglini@arm.com virtual string CurrentStackTrace(int max_depth, int skip_count) { 43613481Sgiacomo.travaglini@arm.com return (testing::Message() << max_depth << "::" << skip_count << "\n") 43713481Sgiacomo.travaglini@arm.com .GetString(); 43813481Sgiacomo.travaglini@arm.com } 43913481Sgiacomo.travaglini@arm.com virtual void UponLeavingGTest() {} 44013481Sgiacomo.travaglini@arm.com}; 44113481Sgiacomo.travaglini@arm.com 44213481Sgiacomo.travaglini@arm.com// Tests that in opt mode, a positive stack_frames_to_skip argument is 44313481Sgiacomo.travaglini@arm.com// treated as 0. 44413481Sgiacomo.travaglini@arm.comTEST(LogTest, NoSkippingStackFrameInOptMode) { 44513481Sgiacomo.travaglini@arm.com MockStackTraceGetter* mock_os_stack_trace_getter = new MockStackTraceGetter; 44613481Sgiacomo.travaglini@arm.com GetUnitTestImpl()->set_os_stack_trace_getter(mock_os_stack_trace_getter); 44713481Sgiacomo.travaglini@arm.com 44813481Sgiacomo.travaglini@arm.com CaptureStdout(); 44913481Sgiacomo.travaglini@arm.com Log(kWarning, "Test log.\n", 100); 45013481Sgiacomo.travaglini@arm.com const string log = GetCapturedStdout(); 45113481Sgiacomo.travaglini@arm.com 45213481Sgiacomo.travaglini@arm.com string expected_trace = 45313481Sgiacomo.travaglini@arm.com (testing::Message() << GTEST_FLAG(stack_trace_depth) << "::").GetString(); 45413481Sgiacomo.travaglini@arm.com string expected_message = 45513481Sgiacomo.travaglini@arm.com "\nGMOCK WARNING:\n" 45613481Sgiacomo.travaglini@arm.com "Test log.\n" 45713481Sgiacomo.travaglini@arm.com "Stack trace:\n" + 45813481Sgiacomo.travaglini@arm.com expected_trace; 45913481Sgiacomo.travaglini@arm.com EXPECT_THAT(log, HasSubstr(expected_message)); 46013481Sgiacomo.travaglini@arm.com int skip_count = atoi(log.substr(expected_message.size()).c_str()); 46113481Sgiacomo.travaglini@arm.com 46213481Sgiacomo.travaglini@arm.com# if defined(NDEBUG) 46313481Sgiacomo.travaglini@arm.com // In opt mode, no stack frame should be skipped. 46413481Sgiacomo.travaglini@arm.com const int expected_skip_count = 0; 46513481Sgiacomo.travaglini@arm.com# else 46613481Sgiacomo.travaglini@arm.com // In dbg mode, the stack frames should be skipped. 46713481Sgiacomo.travaglini@arm.com const int expected_skip_count = 100; 46813481Sgiacomo.travaglini@arm.com# endif 46913481Sgiacomo.travaglini@arm.com 47013481Sgiacomo.travaglini@arm.com // Note that each inner implementation layer will +1 the number to remove 47113481Sgiacomo.travaglini@arm.com // itself from the trace. This means that the value is a little higher than 47213481Sgiacomo.travaglini@arm.com // expected, but close enough. 47313481Sgiacomo.travaglini@arm.com EXPECT_THAT(skip_count, 47413481Sgiacomo.travaglini@arm.com AllOf(Ge(expected_skip_count), Le(expected_skip_count + 10))); 47513481Sgiacomo.travaglini@arm.com 47613481Sgiacomo.travaglini@arm.com // Restores the default OS stack trace getter. 47713481Sgiacomo.travaglini@arm.com GetUnitTestImpl()->set_os_stack_trace_getter(NULL); 47813481Sgiacomo.travaglini@arm.com} 47913481Sgiacomo.travaglini@arm.com 48013481Sgiacomo.travaglini@arm.com// Tests that all logs are printed when the value of the 48113481Sgiacomo.travaglini@arm.com// --gmock_verbose flag is "info". 48213481Sgiacomo.travaglini@arm.comTEST(LogTest, AllLogsArePrintedWhenVerbosityIsInfo) { 48313481Sgiacomo.travaglini@arm.com TestLogWithSeverity(kInfoVerbosity, kInfo, true); 48413481Sgiacomo.travaglini@arm.com TestLogWithSeverity(kInfoVerbosity, kWarning, true); 48513481Sgiacomo.travaglini@arm.com} 48613481Sgiacomo.travaglini@arm.com 48713481Sgiacomo.travaglini@arm.com// Tests that only warnings are printed when the value of the 48813481Sgiacomo.travaglini@arm.com// --gmock_verbose flag is "warning". 48913481Sgiacomo.travaglini@arm.comTEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsWarning) { 49013481Sgiacomo.travaglini@arm.com TestLogWithSeverity(kWarningVerbosity, kInfo, false); 49113481Sgiacomo.travaglini@arm.com TestLogWithSeverity(kWarningVerbosity, kWarning, true); 49213481Sgiacomo.travaglini@arm.com} 49313481Sgiacomo.travaglini@arm.com 49413481Sgiacomo.travaglini@arm.com// Tests that no logs are printed when the value of the 49513481Sgiacomo.travaglini@arm.com// --gmock_verbose flag is "error". 49613481Sgiacomo.travaglini@arm.comTEST(LogTest, NoLogsArePrintedWhenVerbosityIsError) { 49713481Sgiacomo.travaglini@arm.com TestLogWithSeverity(kErrorVerbosity, kInfo, false); 49813481Sgiacomo.travaglini@arm.com TestLogWithSeverity(kErrorVerbosity, kWarning, false); 49913481Sgiacomo.travaglini@arm.com} 50013481Sgiacomo.travaglini@arm.com 50113481Sgiacomo.travaglini@arm.com// Tests that only warnings are printed when the value of the 50213481Sgiacomo.travaglini@arm.com// --gmock_verbose flag is invalid. 50313481Sgiacomo.travaglini@arm.comTEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsInvalid) { 50413481Sgiacomo.travaglini@arm.com TestLogWithSeverity("invalid", kInfo, false); 50513481Sgiacomo.travaglini@arm.com TestLogWithSeverity("invalid", kWarning, true); 50613481Sgiacomo.travaglini@arm.com} 50713481Sgiacomo.travaglini@arm.com 50813481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STREAM_REDIRECTION 50913481Sgiacomo.travaglini@arm.com 51013481Sgiacomo.travaglini@arm.comTEST(TypeTraitsTest, true_type) { 51113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(true_type::value); 51213481Sgiacomo.travaglini@arm.com} 51313481Sgiacomo.travaglini@arm.com 51413481Sgiacomo.travaglini@arm.comTEST(TypeTraitsTest, false_type) { 51513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(false_type::value); 51613481Sgiacomo.travaglini@arm.com} 51713481Sgiacomo.travaglini@arm.com 51813481Sgiacomo.travaglini@arm.comTEST(TypeTraitsTest, is_reference) { 51913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(is_reference<int>::value); 52013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(is_reference<char*>::value); 52113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(is_reference<const int&>::value); 52213481Sgiacomo.travaglini@arm.com} 52313481Sgiacomo.travaglini@arm.com 52413481Sgiacomo.travaglini@arm.comTEST(TypeTraitsTest, is_pointer) { 52513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(is_pointer<int>::value); 52613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(is_pointer<char&>::value); 52713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(is_pointer<const int*>::value); 52813481Sgiacomo.travaglini@arm.com} 52913481Sgiacomo.travaglini@arm.com 53013481Sgiacomo.travaglini@arm.comTEST(TypeTraitsTest, type_equals) { 53113481Sgiacomo.travaglini@arm.com EXPECT_FALSE((type_equals<int, const int>::value)); 53213481Sgiacomo.travaglini@arm.com EXPECT_FALSE((type_equals<int, int&>::value)); 53313481Sgiacomo.travaglini@arm.com EXPECT_FALSE((type_equals<int, double>::value)); 53413481Sgiacomo.travaglini@arm.com EXPECT_TRUE((type_equals<char, char>::value)); 53513481Sgiacomo.travaglini@arm.com} 53613481Sgiacomo.travaglini@arm.com 53713481Sgiacomo.travaglini@arm.comTEST(TypeTraitsTest, remove_reference) { 53813481Sgiacomo.travaglini@arm.com EXPECT_TRUE((type_equals<char, remove_reference<char&>::type>::value)); 53913481Sgiacomo.travaglini@arm.com EXPECT_TRUE((type_equals<const int, 54013481Sgiacomo.travaglini@arm.com remove_reference<const int&>::type>::value)); 54113481Sgiacomo.travaglini@arm.com EXPECT_TRUE((type_equals<int, remove_reference<int>::type>::value)); 54213481Sgiacomo.travaglini@arm.com EXPECT_TRUE((type_equals<double*, remove_reference<double*>::type>::value)); 54313481Sgiacomo.travaglini@arm.com} 54413481Sgiacomo.travaglini@arm.com 54513481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STREAM_REDIRECTION 54613481Sgiacomo.travaglini@arm.com 54713481Sgiacomo.travaglini@arm.com// Verifies that Log() behaves correctly for the given verbosity level 54813481Sgiacomo.travaglini@arm.com// and log severity. 54913481Sgiacomo.travaglini@arm.comstd::string GrabOutput(void(*logger)(), const char* verbosity) { 55013481Sgiacomo.travaglini@arm.com const string saved_flag = GMOCK_FLAG(verbose); 55113481Sgiacomo.travaglini@arm.com GMOCK_FLAG(verbose) = verbosity; 55213481Sgiacomo.travaglini@arm.com CaptureStdout(); 55313481Sgiacomo.travaglini@arm.com logger(); 55413481Sgiacomo.travaglini@arm.com GMOCK_FLAG(verbose) = saved_flag; 55513481Sgiacomo.travaglini@arm.com return GetCapturedStdout(); 55613481Sgiacomo.travaglini@arm.com} 55713481Sgiacomo.travaglini@arm.com 55813481Sgiacomo.travaglini@arm.comclass DummyMock { 55913481Sgiacomo.travaglini@arm.com public: 56013481Sgiacomo.travaglini@arm.com MOCK_METHOD0(TestMethod, void()); 56113481Sgiacomo.travaglini@arm.com MOCK_METHOD1(TestMethodArg, void(int dummy)); 56213481Sgiacomo.travaglini@arm.com}; 56313481Sgiacomo.travaglini@arm.com 56413481Sgiacomo.travaglini@arm.comvoid ExpectCallLogger() { 56513481Sgiacomo.travaglini@arm.com DummyMock mock; 56613481Sgiacomo.travaglini@arm.com EXPECT_CALL(mock, TestMethod()); 56713481Sgiacomo.travaglini@arm.com mock.TestMethod(); 56813481Sgiacomo.travaglini@arm.com}; 56913481Sgiacomo.travaglini@arm.com 57013481Sgiacomo.travaglini@arm.com// Verifies that EXPECT_CALL logs if the --gmock_verbose flag is set to "info". 57113481Sgiacomo.travaglini@arm.comTEST(ExpectCallTest, LogsWhenVerbosityIsInfo) { 57213481Sgiacomo.travaglini@arm.com EXPECT_THAT(std::string(GrabOutput(ExpectCallLogger, kInfoVerbosity)), 57313481Sgiacomo.travaglini@arm.com HasSubstr("EXPECT_CALL(mock, TestMethod())")); 57413481Sgiacomo.travaglini@arm.com} 57513481Sgiacomo.travaglini@arm.com 57613481Sgiacomo.travaglini@arm.com// Verifies that EXPECT_CALL doesn't log 57713481Sgiacomo.travaglini@arm.com// if the --gmock_verbose flag is set to "warning". 57813481Sgiacomo.travaglini@arm.comTEST(ExpectCallTest, DoesNotLogWhenVerbosityIsWarning) { 57913481Sgiacomo.travaglini@arm.com EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kWarningVerbosity).c_str()); 58013481Sgiacomo.travaglini@arm.com} 58113481Sgiacomo.travaglini@arm.com 58213481Sgiacomo.travaglini@arm.com// Verifies that EXPECT_CALL doesn't log 58313481Sgiacomo.travaglini@arm.com// if the --gmock_verbose flag is set to "error". 58413481Sgiacomo.travaglini@arm.comTEST(ExpectCallTest, DoesNotLogWhenVerbosityIsError) { 58513481Sgiacomo.travaglini@arm.com EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kErrorVerbosity).c_str()); 58613481Sgiacomo.travaglini@arm.com} 58713481Sgiacomo.travaglini@arm.com 58813481Sgiacomo.travaglini@arm.comvoid OnCallLogger() { 58913481Sgiacomo.travaglini@arm.com DummyMock mock; 59013481Sgiacomo.travaglini@arm.com ON_CALL(mock, TestMethod()); 59113481Sgiacomo.travaglini@arm.com}; 59213481Sgiacomo.travaglini@arm.com 59313481Sgiacomo.travaglini@arm.com// Verifies that ON_CALL logs if the --gmock_verbose flag is set to "info". 59413481Sgiacomo.travaglini@arm.comTEST(OnCallTest, LogsWhenVerbosityIsInfo) { 59513481Sgiacomo.travaglini@arm.com EXPECT_THAT(std::string(GrabOutput(OnCallLogger, kInfoVerbosity)), 59613481Sgiacomo.travaglini@arm.com HasSubstr("ON_CALL(mock, TestMethod())")); 59713481Sgiacomo.travaglini@arm.com} 59813481Sgiacomo.travaglini@arm.com 59913481Sgiacomo.travaglini@arm.com// Verifies that ON_CALL doesn't log 60013481Sgiacomo.travaglini@arm.com// if the --gmock_verbose flag is set to "warning". 60113481Sgiacomo.travaglini@arm.comTEST(OnCallTest, DoesNotLogWhenVerbosityIsWarning) { 60213481Sgiacomo.travaglini@arm.com EXPECT_STREQ("", GrabOutput(OnCallLogger, kWarningVerbosity).c_str()); 60313481Sgiacomo.travaglini@arm.com} 60413481Sgiacomo.travaglini@arm.com 60513481Sgiacomo.travaglini@arm.com// Verifies that ON_CALL doesn't log if 60613481Sgiacomo.travaglini@arm.com// the --gmock_verbose flag is set to "error". 60713481Sgiacomo.travaglini@arm.comTEST(OnCallTest, DoesNotLogWhenVerbosityIsError) { 60813481Sgiacomo.travaglini@arm.com EXPECT_STREQ("", GrabOutput(OnCallLogger, kErrorVerbosity).c_str()); 60913481Sgiacomo.travaglini@arm.com} 61013481Sgiacomo.travaglini@arm.com 61113481Sgiacomo.travaglini@arm.comvoid OnCallAnyArgumentLogger() { 61213481Sgiacomo.travaglini@arm.com DummyMock mock; 61313481Sgiacomo.travaglini@arm.com ON_CALL(mock, TestMethodArg(_)); 61413481Sgiacomo.travaglini@arm.com} 61513481Sgiacomo.travaglini@arm.com 61613481Sgiacomo.travaglini@arm.com// Verifies that ON_CALL prints provided _ argument. 61713481Sgiacomo.travaglini@arm.comTEST(OnCallTest, LogsAnythingArgument) { 61813481Sgiacomo.travaglini@arm.com EXPECT_THAT(std::string(GrabOutput(OnCallAnyArgumentLogger, kInfoVerbosity)), 61913481Sgiacomo.travaglini@arm.com HasSubstr("ON_CALL(mock, TestMethodArg(_)")); 62013481Sgiacomo.travaglini@arm.com} 62113481Sgiacomo.travaglini@arm.com 62213481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STREAM_REDIRECTION 62313481Sgiacomo.travaglini@arm.com 62413481Sgiacomo.travaglini@arm.com// Tests StlContainerView. 62513481Sgiacomo.travaglini@arm.com 62613481Sgiacomo.travaglini@arm.comTEST(StlContainerViewTest, WorksForStlContainer) { 62713481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<std::vector<int>, 62813481Sgiacomo.travaglini@arm.com StlContainerView<std::vector<int> >::type>(); 62913481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<const std::vector<double>&, 63013481Sgiacomo.travaglini@arm.com StlContainerView<std::vector<double> >::const_reference>(); 63113481Sgiacomo.travaglini@arm.com 63213481Sgiacomo.travaglini@arm.com typedef std::vector<char> Chars; 63313481Sgiacomo.travaglini@arm.com Chars v1; 63413481Sgiacomo.travaglini@arm.com const Chars& v2(StlContainerView<Chars>::ConstReference(v1)); 63513481Sgiacomo.travaglini@arm.com EXPECT_EQ(&v1, &v2); 63613481Sgiacomo.travaglini@arm.com 63713481Sgiacomo.travaglini@arm.com v1.push_back('a'); 63813481Sgiacomo.travaglini@arm.com Chars v3 = StlContainerView<Chars>::Copy(v1); 63913481Sgiacomo.travaglini@arm.com EXPECT_THAT(v3, Eq(v3)); 64013481Sgiacomo.travaglini@arm.com} 64113481Sgiacomo.travaglini@arm.com 64213481Sgiacomo.travaglini@arm.comTEST(StlContainerViewTest, WorksForStaticNativeArray) { 64313481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<NativeArray<int>, 64413481Sgiacomo.travaglini@arm.com StlContainerView<int[3]>::type>(); 64513481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<NativeArray<double>, 64613481Sgiacomo.travaglini@arm.com StlContainerView<const double[4]>::type>(); 64713481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<NativeArray<char[3]>, 64813481Sgiacomo.travaglini@arm.com StlContainerView<const char[2][3]>::type>(); 64913481Sgiacomo.travaglini@arm.com 65013481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<const NativeArray<int>, 65113481Sgiacomo.travaglini@arm.com StlContainerView<int[2]>::const_reference>(); 65213481Sgiacomo.travaglini@arm.com 65313481Sgiacomo.travaglini@arm.com int a1[3] = { 0, 1, 2 }; 65413481Sgiacomo.travaglini@arm.com NativeArray<int> a2 = StlContainerView<int[3]>::ConstReference(a1); 65513481Sgiacomo.travaglini@arm.com EXPECT_EQ(3U, a2.size()); 65613481Sgiacomo.travaglini@arm.com EXPECT_EQ(a1, a2.begin()); 65713481Sgiacomo.travaglini@arm.com 65813481Sgiacomo.travaglini@arm.com const NativeArray<int> a3 = StlContainerView<int[3]>::Copy(a1); 65913481Sgiacomo.travaglini@arm.com ASSERT_EQ(3U, a3.size()); 66013481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, a3.begin()[0]); 66113481Sgiacomo.travaglini@arm.com EXPECT_EQ(1, a3.begin()[1]); 66213481Sgiacomo.travaglini@arm.com EXPECT_EQ(2, a3.begin()[2]); 66313481Sgiacomo.travaglini@arm.com 66413481Sgiacomo.travaglini@arm.com // Makes sure a1 and a3 aren't aliases. 66513481Sgiacomo.travaglini@arm.com a1[0] = 3; 66613481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, a3.begin()[0]); 66713481Sgiacomo.travaglini@arm.com} 66813481Sgiacomo.travaglini@arm.com 66913481Sgiacomo.travaglini@arm.comTEST(StlContainerViewTest, WorksForDynamicNativeArray) { 67013481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<NativeArray<int>, 67113481Sgiacomo.travaglini@arm.com StlContainerView<tuple<const int*, size_t> >::type>(); 67213481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<NativeArray<double>, 67313481Sgiacomo.travaglini@arm.com StlContainerView<tuple<linked_ptr<double>, int> >::type>(); 67413481Sgiacomo.travaglini@arm.com 67513481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<const NativeArray<int>, 67613481Sgiacomo.travaglini@arm.com StlContainerView<tuple<const int*, int> >::const_reference>(); 67713481Sgiacomo.travaglini@arm.com 67813481Sgiacomo.travaglini@arm.com int a1[3] = { 0, 1, 2 }; 67913481Sgiacomo.travaglini@arm.com const int* const p1 = a1; 68013481Sgiacomo.travaglini@arm.com NativeArray<int> a2 = StlContainerView<tuple<const int*, int> >:: 68113481Sgiacomo.travaglini@arm.com ConstReference(make_tuple(p1, 3)); 68213481Sgiacomo.travaglini@arm.com EXPECT_EQ(3U, a2.size()); 68313481Sgiacomo.travaglini@arm.com EXPECT_EQ(a1, a2.begin()); 68413481Sgiacomo.travaglini@arm.com 68513481Sgiacomo.travaglini@arm.com const NativeArray<int> a3 = StlContainerView<tuple<int*, size_t> >:: 68613481Sgiacomo.travaglini@arm.com Copy(make_tuple(static_cast<int*>(a1), 3)); 68713481Sgiacomo.travaglini@arm.com ASSERT_EQ(3U, a3.size()); 68813481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, a3.begin()[0]); 68913481Sgiacomo.travaglini@arm.com EXPECT_EQ(1, a3.begin()[1]); 69013481Sgiacomo.travaglini@arm.com EXPECT_EQ(2, a3.begin()[2]); 69113481Sgiacomo.travaglini@arm.com 69213481Sgiacomo.travaglini@arm.com // Makes sure a1 and a3 aren't aliases. 69313481Sgiacomo.travaglini@arm.com a1[0] = 3; 69413481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, a3.begin()[0]); 69513481Sgiacomo.travaglini@arm.com} 69613481Sgiacomo.travaglini@arm.com 69713481Sgiacomo.travaglini@arm.com} // namespace 69813481Sgiacomo.travaglini@arm.com} // namespace internal 69913481Sgiacomo.travaglini@arm.com} // namespace testing 700