Updating to gmock r405
This commit is contained in:
parent
156a1882e1
commit
86a22c5328
@ -9,11 +9,6 @@
|
|||||||
# make it prominent in the GUI.
|
# make it prominent in the GUI.
|
||||||
option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)
|
option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)
|
||||||
|
|
||||||
# Forces BUILD_SHARED_LIBS to OFF as Google Mock currently does not support
|
|
||||||
# working in a DLL.
|
|
||||||
# TODO(vladl@google.com): Implement building gMock as a DLL.
|
|
||||||
set(BUILD_SHARED_LIBS OFF)
|
|
||||||
|
|
||||||
option(gmock_build_tests "Build all of Google Mock's own tests." OFF)
|
option(gmock_build_tests "Build all of Google Mock's own tests." OFF)
|
||||||
|
|
||||||
# A directory to find Google Test sources.
|
# A directory to find Google Test sources.
|
||||||
@ -76,11 +71,16 @@ include_directories("${gmock_SOURCE_DIR}/include"
|
|||||||
# Google Mock libraries. We build them using more strict warnings than what
|
# Google Mock libraries. We build them using more strict warnings than what
|
||||||
# are used for other targets, to ensure that Google Mock can be compiled by
|
# are used for other targets, to ensure that Google Mock can be compiled by
|
||||||
# a user aggressive about warnings.
|
# a user aggressive about warnings.
|
||||||
cxx_library(gmock "${cxx_strict}" src/gmock-all.cc)
|
cxx_library(gmock
|
||||||
target_link_libraries(gmock gtest)
|
"${cxx_strict}"
|
||||||
|
"${gtest_dir}/src/gtest-all.cc"
|
||||||
|
src/gmock-all.cc)
|
||||||
|
|
||||||
cxx_library(gmock_main "${cxx_strict}" src/gmock_main.cc)
|
cxx_library(gmock_main
|
||||||
target_link_libraries(gmock_main gmock)
|
"${cxx_strict}"
|
||||||
|
"${gtest_dir}/src/gtest-all.cc"
|
||||||
|
src/gmock-all.cc
|
||||||
|
src/gmock_main.cc)
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
#
|
#
|
||||||
@ -114,9 +114,12 @@ if (gmock_build_tests)
|
|||||||
cxx_test(gmock-port_test gmock_main)
|
cxx_test(gmock-port_test gmock_main)
|
||||||
cxx_test(gmock-spec-builders_test gmock_main)
|
cxx_test(gmock-spec-builders_test gmock_main)
|
||||||
cxx_test(gmock_link_test gmock_main test/gmock_link2_test.cc)
|
cxx_test(gmock_link_test gmock_main test/gmock_link2_test.cc)
|
||||||
# cxx_test(gmock_stress_test gmock)
|
|
||||||
cxx_test(gmock_test gmock_main)
|
cxx_test(gmock_test gmock_main)
|
||||||
|
|
||||||
|
if (CMAKE_USE_PTHREADS_INIT)
|
||||||
|
cxx_test(gmock_stress_test gmock)
|
||||||
|
endif()
|
||||||
|
|
||||||
# gmock_all_test is commented to save time building and running tests.
|
# gmock_all_test is commented to save time building and running tests.
|
||||||
# Uncomment if necessary.
|
# Uncomment if necessary.
|
||||||
# cxx_test(gmock_all_test gmock_main)
|
# cxx_test(gmock_all_test gmock_main)
|
||||||
@ -126,8 +129,10 @@ if (gmock_build_tests)
|
|||||||
|
|
||||||
cxx_library(gmock_main_no_exception "${cxx_no_exception}"
|
cxx_library(gmock_main_no_exception "${cxx_no_exception}"
|
||||||
"${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc)
|
"${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc)
|
||||||
|
|
||||||
cxx_library(gmock_main_no_rtti "${cxx_no_rtti}"
|
cxx_library(gmock_main_no_rtti "${cxx_no_rtti}"
|
||||||
"${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc)
|
"${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc)
|
||||||
|
|
||||||
cxx_library(gmock_main_use_own_tuple "${cxx_use_own_tuple}"
|
cxx_library(gmock_main_use_own_tuple "${cxx_use_own_tuple}"
|
||||||
"${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc)
|
"${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc)
|
||||||
|
|
||||||
@ -140,6 +145,20 @@ if (gmock_build_tests)
|
|||||||
cxx_test_with_flags(gmock_use_own_tuple_test "${cxx_use_own_tuple}"
|
cxx_test_with_flags(gmock_use_own_tuple_test "${cxx_use_own_tuple}"
|
||||||
gmock_main_use_own_tuple test/gmock-spec-builders_test.cc)
|
gmock_main_use_own_tuple test/gmock-spec-builders_test.cc)
|
||||||
|
|
||||||
|
cxx_shared_library(shared_gmock_main "${cxx_default}"
|
||||||
|
"${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc)
|
||||||
|
|
||||||
|
# Tests that a binary can be built with Google Mock as a shared library. On
|
||||||
|
# some system configurations, it may not possible to run the binary without
|
||||||
|
# knowing more details about the system configurations. We do not try to run
|
||||||
|
# this binary. To get a more robust shared library coverage, configure with
|
||||||
|
# -DBUILD_SHARED_LIBS=ON.
|
||||||
|
cxx_executable_with_flags(shared_gmock_test_ "${cxx_default}"
|
||||||
|
shared_gmock_main test/gmock-spec-builders_test.cc)
|
||||||
|
set_target_properties(shared_gmock_test_
|
||||||
|
PROPERTIES
|
||||||
|
COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
# Python tests.
|
# Python tests.
|
||||||
|
|
||||||
|
@ -73,16 +73,18 @@ test_gmock_link_test_SOURCES = \
|
|||||||
test/gmock_link_test.h
|
test/gmock_link_test.h
|
||||||
test_gmock_link_test_LDADD = $(GTEST_LIBS) lib/libgmock_main.la lib/libgmock.la
|
test_gmock_link_test_LDADD = $(GTEST_LIBS) lib/libgmock_main.la lib/libgmock.la
|
||||||
|
|
||||||
# Tests that fused gmock files compile and work.
|
if HAVE_PYTHON
|
||||||
TESTS += test/gmock_fused_test
|
# Tests that fused gmock files compile and work.
|
||||||
check_PROGRAMS += test/gmock_fused_test
|
TESTS += test/gmock_fused_test
|
||||||
test_gmock_fused_test_SOURCES = \
|
check_PROGRAMS += test/gmock_fused_test
|
||||||
|
test_gmock_fused_test_SOURCES = \
|
||||||
fused-src/gmock-gtest-all.cc \
|
fused-src/gmock-gtest-all.cc \
|
||||||
fused-src/gmock/gmock.h \
|
fused-src/gmock/gmock.h \
|
||||||
fused-src/gmock_main.cc \
|
fused-src/gmock_main.cc \
|
||||||
fused-src/gtest/gtest.h \
|
fused-src/gtest/gtest.h \
|
||||||
test/gmock_test.cc
|
test/gmock_test.cc
|
||||||
test_gmock_fused_test_CPPFLAGS = -I"$(srcdir)/fused-src"
|
test_gmock_fused_test_CPPFLAGS = -I"$(srcdir)/fused-src"
|
||||||
|
endif
|
||||||
|
|
||||||
# Google Mock source files that we don't compile directly.
|
# Google Mock source files that we don't compile directly.
|
||||||
GMOCK_SOURCE_INGLUDES = \
|
GMOCK_SOURCE_INGLUDES = \
|
||||||
@ -138,7 +140,7 @@ EXTRA_DIST += scripts/fuse_gmock_files.py
|
|||||||
|
|
||||||
# The Google Mock Generator tool from the cppclean project.
|
# The Google Mock Generator tool from the cppclean project.
|
||||||
EXTRA_DIST += \
|
EXTRA_DIST += \
|
||||||
scripts/generator/COPYING \
|
scripts/generator/LICENSE \
|
||||||
scripts/generator/README \
|
scripts/generator/README \
|
||||||
scripts/generator/README.cppclean \
|
scripts/generator/README.cppclean \
|
||||||
scripts/generator/cpp/__init__.py \
|
scripts/generator/cpp/__init__.py \
|
||||||
@ -169,6 +171,7 @@ EXTRA_DIST += \
|
|||||||
msvc/2010/gmock_main.vcxproj \
|
msvc/2010/gmock_main.vcxproj \
|
||||||
msvc/2010/gmock_test.vcxproj
|
msvc/2010/gmock_test.vcxproj
|
||||||
|
|
||||||
|
if HAVE_PYTHON
|
||||||
# gmock_test.cc does not really depend on files generated by the
|
# gmock_test.cc does not really depend on files generated by the
|
||||||
# fused-gmock-internal rule. However, gmock_test.o does, and it is
|
# fused-gmock-internal rule. However, gmock_test.o does, and it is
|
||||||
# important to include test/gmock_test.cc as part of this rule in order to
|
# important to include test/gmock_test.cc as part of this rule in order to
|
||||||
@ -191,6 +194,7 @@ fused-gmock-internal: $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS) \
|
|||||||
|
|
||||||
maintainer-clean-local:
|
maintainer-clean-local:
|
||||||
rm -rf "$(srcdir)/fused-src"
|
rm -rf "$(srcdir)/fused-src"
|
||||||
|
endif
|
||||||
|
|
||||||
# Death tests may produce core dumps in the build directory. In case
|
# Death tests may produce core dumps in the build directory. In case
|
||||||
# this happens, clean them to keep distcleancheck happy.
|
# this happens, clean them to keep distcleancheck happy.
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -265,7 +265,14 @@ If you want to use Boost's TR1 tuple library with Google Mock, please
|
|||||||
refer to the Boost website (http://www.boost.org/) for how to obtain
|
refer to the Boost website (http://www.boost.org/) for how to obtain
|
||||||
it and set it up.
|
it and set it up.
|
||||||
|
|
||||||
### Tweaking Google Test ###
|
### As a Shared Library (DLL) ###
|
||||||
|
|
||||||
|
Google Mock is compact, so most users can build and link it as a static
|
||||||
|
library for the simplicity. Google Mock can be used as a DLL, but the
|
||||||
|
same DLL must contain Google Test as well. See Google Test's README
|
||||||
|
file for instructions on how to set up necessary compiler settings.
|
||||||
|
|
||||||
|
### Tweaking Google Mock ###
|
||||||
|
|
||||||
Most of Google Test's control macros apply to Google Mock as well.
|
Most of Google Test's control macros apply to Google Mock as well.
|
||||||
Please see file ${GTEST_DIR}/README for how to tweak them.
|
Please see file ${GTEST_DIR}/README for how to tweak them.
|
||||||
|
9139
cpp/tests/gmock/aclocal.m4
vendored
9139
cpp/tests/gmock/aclocal.m4
vendored
File diff suppressed because it is too large
Load Diff
1533
cpp/tests/gmock/build-aux/config.guess
vendored
1533
cpp/tests/gmock/build-aux/config.guess
vendored
File diff suppressed because it is too large
Load Diff
@ -1,69 +0,0 @@
|
|||||||
/* build-aux/config.h.in. Generated from configure.ac by autoheader. */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
|
||||||
#undef HAVE_DLFCN_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#undef HAVE_INTTYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
#undef HAVE_MEMORY_H
|
|
||||||
|
|
||||||
/* Define if you have POSIX threads libraries and header files. */
|
|
||||||
#undef HAVE_PTHREAD
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#undef HAVE_STDINT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
||||||
#undef HAVE_STDLIB_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
|
||||||
#undef HAVE_STRINGS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
#undef HAVE_STRING_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
||||||
#undef HAVE_SYS_STAT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
||||||
#undef HAVE_SYS_TYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
|
||||||
#undef HAVE_UNISTD_H
|
|
||||||
|
|
||||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
|
||||||
*/
|
|
||||||
#undef LT_OBJDIR
|
|
||||||
|
|
||||||
/* Name of package */
|
|
||||||
#undef PACKAGE
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#undef PACKAGE_BUGREPORT
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#undef PACKAGE_NAME
|
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#undef PACKAGE_STRING
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
|
||||||
#undef PACKAGE_TARNAME
|
|
||||||
|
|
||||||
/* Define to the home page for this package. */
|
|
||||||
#undef PACKAGE_URL
|
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
|
||||||
#undef PACKAGE_VERSION
|
|
||||||
|
|
||||||
/* Define to necessary symbol if this constant uses a non-standard name on
|
|
||||||
your system. */
|
|
||||||
#undef PTHREAD_CREATE_JOINABLE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
|
||||||
#undef STDC_HEADERS
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#undef VERSION
|
|
1693
cpp/tests/gmock/build-aux/config.sub
vendored
1693
cpp/tests/gmock/build-aux/config.sub
vendored
File diff suppressed because it is too large
Load Diff
@ -1,630 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# depcomp - compile a program generating dependencies as side-effects
|
|
||||||
|
|
||||||
scriptversion=2009-04-28.21; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
|
|
||||||
# Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
|
||||||
as side-effects.
|
|
||||||
|
|
||||||
Environment variables:
|
|
||||||
depmode Dependency tracking mode.
|
|
||||||
source Source file read by `PROGRAMS ARGS'.
|
|
||||||
object Object file output by `PROGRAMS ARGS'.
|
|
||||||
DEPDIR directory where to store dependencies.
|
|
||||||
depfile Dependency file to output.
|
|
||||||
tmpdepfile Temporary file to use when outputing dependencies.
|
|
||||||
libtool Whether libtool is used (yes/no).
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "depcomp $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
|
||||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
|
||||||
depfile=${depfile-`echo "$object" |
|
|
||||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
|
||||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
|
||||||
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
|
|
||||||
# Some modes work just like other modes, but use different flags. We
|
|
||||||
# parameterize here, but still list the modes in the big case below,
|
|
||||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
|
||||||
# here, because this file can only contain one case statement.
|
|
||||||
if test "$depmode" = hp; then
|
|
||||||
# HP compiler uses -M and no extra arg.
|
|
||||||
gccflag=-M
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = dashXmstdout; then
|
|
||||||
# This is just like dashmstdout with a different argument.
|
|
||||||
dashmflag=-xM
|
|
||||||
depmode=dashmstdout
|
|
||||||
fi
|
|
||||||
|
|
||||||
cygpath_u="cygpath -u -f -"
|
|
||||||
if test "$depmode" = msvcmsys; then
|
|
||||||
# This is just like msvisualcpp but w/o cygpath translation.
|
|
||||||
# Just convert the backslash-escaped backslashes to single forward
|
|
||||||
# slashes to satisfy depend.m4
|
|
||||||
cygpath_u="sed s,\\\\\\\\,/,g"
|
|
||||||
depmode=msvisualcpp
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$depmode" in
|
|
||||||
gcc3)
|
|
||||||
## gcc 3 implements dependency tracking that does exactly what
|
|
||||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
|
||||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
|
||||||
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
|
||||||
## the command line argument order; so add the flags where they
|
|
||||||
## appear in depend2.am. Note that the slowdown incurred here
|
|
||||||
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
|
||||||
*) set fnord "$@" "$arg" ;;
|
|
||||||
esac
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
done
|
|
||||||
"$@"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
mv "$tmpdepfile" "$depfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
gcc)
|
|
||||||
## There are various ways to get dependency output from gcc. Here's
|
|
||||||
## why we pick this rather obscure method:
|
|
||||||
## - Don't want to use -MD because we'd like the dependencies to end
|
|
||||||
## up in a subdir. Having to rename by hand is ugly.
|
|
||||||
## (We might end up doing this anyway to support other compilers.)
|
|
||||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
|
||||||
## -MM, not -M (despite what the docs say).
|
|
||||||
## - Using -M directly means running the compiler twice (even worse
|
|
||||||
## than renaming).
|
|
||||||
if test -z "$gccflag"; then
|
|
||||||
gccflag=-MD,
|
|
||||||
fi
|
|
||||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
|
||||||
## The second -e expression handles DOS-style file names with drive letters.
|
|
||||||
sed -e 's/^[^:]*: / /' \
|
|
||||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
|
||||||
## This next piece of magic avoids the `deleted header file' problem.
|
|
||||||
## The problem is that when a header file which appears in a .P file
|
|
||||||
## is deleted, the dependency causes make to die (because there is
|
|
||||||
## typically no way to rebuild the header). We avoid this by adding
|
|
||||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
|
||||||
## this for us directly.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" |
|
|
||||||
## Some versions of gcc put a space before the `:'. On the theory
|
|
||||||
## that the space means something, we add a space to the output as
|
|
||||||
## well.
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
sgi)
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
|
||||||
else
|
|
||||||
"$@" -MDupdate "$tmpdepfile"
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
|
|
||||||
# Clip off the initial element (the dependent). Don't try to be
|
|
||||||
# clever and replace this with sed code, as IRIX sed won't handle
|
|
||||||
# lines with more than a fixed number of characters (4096 in
|
|
||||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
|
||||||
# the IRIX cc adds comments like `#:fec' to the end of the
|
|
||||||
# dependency line.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
|
|
||||||
tr '
|
|
||||||
' ' ' >> "$depfile"
|
|
||||||
echo >> "$depfile"
|
|
||||||
|
|
||||||
# The second pass generates a dummy entry for each header file.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
|
||||||
>> "$depfile"
|
|
||||||
else
|
|
||||||
# The sourcefile does not contain any dependencies, so just
|
|
||||||
# store a dummy comment line, to avoid errors with the Makefile
|
|
||||||
# "include basename.Plo" scheme.
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
aix)
|
|
||||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
|
||||||
# in a .u file. In older versions, this file always lives in the
|
|
||||||
# current directory. Also, the AIX compiler puts `$object:' at the
|
|
||||||
# start of each line; $object doesn't have directory information.
|
|
||||||
# Version 6 uses the directory in both cases.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$base.u
|
|
||||||
tmpdepfile3=$dir.libs/$base.u
|
|
||||||
"$@" -Wc,-M
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$dir$base.u
|
|
||||||
tmpdepfile3=$dir$base.u
|
|
||||||
"$@" -M
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
# Each line is of the form `foo.o: dependent.h'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
|
||||||
# That's a tab and a space in the [].
|
|
||||||
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
# The sourcefile does not contain any dependencies, so just
|
|
||||||
# store a dummy comment line, to avoid errors with the Makefile
|
|
||||||
# "include basename.Plo" scheme.
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
icc)
|
|
||||||
# Intel's C compiler understands `-MD -MF file'. However on
|
|
||||||
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
|
||||||
# ICC 7.0 will fill foo.d with something like
|
|
||||||
# foo.o: sub/foo.c
|
|
||||||
# foo.o: sub/foo.h
|
|
||||||
# which is wrong. We want:
|
|
||||||
# sub/foo.o: sub/foo.c
|
|
||||||
# sub/foo.o: sub/foo.h
|
|
||||||
# sub/foo.c:
|
|
||||||
# sub/foo.h:
|
|
||||||
# ICC 7.1 will output
|
|
||||||
# foo.o: sub/foo.c sub/foo.h
|
|
||||||
# and will wrap long lines using \ :
|
|
||||||
# foo.o: sub/foo.c ... \
|
|
||||||
# sub/foo.h ... \
|
|
||||||
# ...
|
|
||||||
|
|
||||||
"$@" -MD -MF "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
# Each line is of the form `foo.o: dependent.h',
|
|
||||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
|
|
||||||
sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp2)
|
|
||||||
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
|
||||||
# compilers, which have integrated preprocessors. The correct option
|
|
||||||
# to use with these is +Maked; it writes dependencies to a file named
|
|
||||||
# 'foo.d', which lands next to the object file, wherever that
|
|
||||||
# happens to be.
|
|
||||||
# Much of this is similar to the tru64 case; see comments there.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir.libs/$base.d
|
|
||||||
"$@" -Wc,+Maked
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
"$@" +Maked
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
|
|
||||||
# Add `dependent.h:' lines.
|
|
||||||
sed -ne '2,${
|
|
||||||
s/^ *//
|
|
||||||
s/ \\*$//
|
|
||||||
s/$/:/
|
|
||||||
p
|
|
||||||
}' "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
|
||||||
;;
|
|
||||||
|
|
||||||
tru64)
|
|
||||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
|
||||||
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
|
|
||||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
|
||||||
# dependencies in `foo.d' instead, so we check for that too.
|
|
||||||
# Subdirectories are respected.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
# With Tru64 cc, shared objects can also be used to make a
|
|
||||||
# static library. This mechanism is used in libtool 1.4 series to
|
|
||||||
# handle both shared and static libraries in a single compilation.
|
|
||||||
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
|
|
||||||
#
|
|
||||||
# With libtool 1.5 this exception was removed, and libtool now
|
|
||||||
# generates 2 separate objects for the 2 libraries. These two
|
|
||||||
# compilations output dependencies in $dir.libs/$base.o.d and
|
|
||||||
# in $dir$base.o.d. We have to check for both files, because
|
|
||||||
# one of the two compilations can be disabled. We should prefer
|
|
||||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
|
||||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
|
||||||
# the former would cause a distcleancheck panic.
|
|
||||||
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
|
|
||||||
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
|
||||||
"$@" -Wc,-MD
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.o.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
tmpdepfile3=$dir$base.d
|
|
||||||
tmpdepfile4=$dir$base.d
|
|
||||||
"$@" -MD
|
|
||||||
fi
|
|
||||||
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
|
||||||
# That's a tab and a space in the [].
|
|
||||||
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
#nosideeffect)
|
|
||||||
# This comment above is used by automake to tell side-effect
|
|
||||||
# dependency tracking mechanisms from slower ones.
|
|
||||||
|
|
||||||
dashmstdout)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout, regardless of -o.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove `-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
test -z "$dashmflag" && dashmflag=-M
|
|
||||||
# Require at least two characters before searching for `:'
|
|
||||||
# in the target name. This is to cope with DOS-style filenames:
|
|
||||||
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
|
|
||||||
"$@" $dashmflag |
|
|
||||||
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" | \
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
dashXmstdout)
|
|
||||||
# This case only exists to satisfy depend.m4. It is never actually
|
|
||||||
# run, as this mode is specially recognized in the preamble.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
makedepend)
|
|
||||||
"$@" || exit $?
|
|
||||||
# Remove any Libtool call
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
# X makedepend
|
|
||||||
shift
|
|
||||||
cleared=no eat=no
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $cleared in
|
|
||||||
no)
|
|
||||||
set ""; shift
|
|
||||||
cleared=yes ;;
|
|
||||||
esac
|
|
||||||
if test $eat = yes; then
|
|
||||||
eat=no
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
case "$arg" in
|
|
||||||
-D*|-I*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
# Strip any option that makedepend may not understand. Remove
|
|
||||||
# the object too, otherwise makedepend will parse it as a source file.
|
|
||||||
-arch)
|
|
||||||
eat=yes ;;
|
|
||||||
-*|$object)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
|
||||||
touch "$tmpdepfile"
|
|
||||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
sed '1,2d' "$tmpdepfile" | tr ' ' '
|
|
||||||
' | \
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
|
||||||
;;
|
|
||||||
|
|
||||||
cpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove `-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
"$@" -E |
|
|
||||||
sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
|
||||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
|
|
||||||
sed '$ s: \\$::' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
cat < "$tmpdepfile" >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvisualcpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case "$arg" in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
|
||||||
set fnord "$@"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
"$@" -E 2>/dev/null |
|
|
||||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
|
|
||||||
echo " " >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvcmsys)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
none)
|
|
||||||
exec "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Unknown depmode $depmode" 1>&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
@ -1,520 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
|
|
||||||
scriptversion=2009-04-28.21; # UTC
|
|
||||||
|
|
||||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
|
||||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
|
||||||
# following copyright and license.
|
|
||||||
#
|
|
||||||
# Copyright (C) 1994 X Consortium
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to
|
|
||||||
# deal in the Software without restriction, including without limitation the
|
|
||||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
# sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
|
||||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
#
|
|
||||||
# Except as contained in this notice, the name of the X Consortium shall not
|
|
||||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
|
||||||
# ings in this Software without prior written authorization from the X Consor-
|
|
||||||
# tium.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# FSF changes to this file are in the public domain.
|
|
||||||
#
|
|
||||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
|
||||||
# `make' implicit rules from creating a file called install from it
|
|
||||||
# when there is no Makefile.
|
|
||||||
#
|
|
||||||
# This script is compatible with the BSD install script, but was written
|
|
||||||
# from scratch.
|
|
||||||
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
IFS=" "" $nl"
|
|
||||||
|
|
||||||
# set DOITPROG to echo to test this script
|
|
||||||
|
|
||||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
|
||||||
doit=${DOITPROG-}
|
|
||||||
if test -z "$doit"; then
|
|
||||||
doit_exec=exec
|
|
||||||
else
|
|
||||||
doit_exec=$doit
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Put in absolute file names if you don't have them in your path;
|
|
||||||
# or use environment vars.
|
|
||||||
|
|
||||||
chgrpprog=${CHGRPPROG-chgrp}
|
|
||||||
chmodprog=${CHMODPROG-chmod}
|
|
||||||
chownprog=${CHOWNPROG-chown}
|
|
||||||
cmpprog=${CMPPROG-cmp}
|
|
||||||
cpprog=${CPPROG-cp}
|
|
||||||
mkdirprog=${MKDIRPROG-mkdir}
|
|
||||||
mvprog=${MVPROG-mv}
|
|
||||||
rmprog=${RMPROG-rm}
|
|
||||||
stripprog=${STRIPPROG-strip}
|
|
||||||
|
|
||||||
posix_glob='?'
|
|
||||||
initialize_posix_glob='
|
|
||||||
test "$posix_glob" != "?" || {
|
|
||||||
if (set -f) 2>/dev/null; then
|
|
||||||
posix_glob=
|
|
||||||
else
|
|
||||||
posix_glob=:
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
'
|
|
||||||
|
|
||||||
posix_mkdir=
|
|
||||||
|
|
||||||
# Desired mode of installed file.
|
|
||||||
mode=0755
|
|
||||||
|
|
||||||
chgrpcmd=
|
|
||||||
chmodcmd=$chmodprog
|
|
||||||
chowncmd=
|
|
||||||
mvcmd=$mvprog
|
|
||||||
rmcmd="$rmprog -f"
|
|
||||||
stripcmd=
|
|
||||||
|
|
||||||
src=
|
|
||||||
dst=
|
|
||||||
dir_arg=
|
|
||||||
dst_arg=
|
|
||||||
|
|
||||||
copy_on_change=false
|
|
||||||
no_target_directory=
|
|
||||||
|
|
||||||
usage="\
|
|
||||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
|
||||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
|
||||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
|
||||||
or: $0 [OPTION]... -d DIRECTORIES...
|
|
||||||
|
|
||||||
In the 1st form, copy SRCFILE to DSTFILE.
|
|
||||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
|
||||||
In the 4th, create DIRECTORIES.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
--help display this help and exit.
|
|
||||||
--version display version info and exit.
|
|
||||||
|
|
||||||
-c (ignored)
|
|
||||||
-C install only if different (preserve the last data modification time)
|
|
||||||
-d create directories instead of installing files.
|
|
||||||
-g GROUP $chgrpprog installed files to GROUP.
|
|
||||||
-m MODE $chmodprog installed files to MODE.
|
|
||||||
-o USER $chownprog installed files to USER.
|
|
||||||
-s $stripprog installed files.
|
|
||||||
-t DIRECTORY install into DIRECTORY.
|
|
||||||
-T report an error if DSTFILE is a directory.
|
|
||||||
|
|
||||||
Environment variables override the default commands:
|
|
||||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
|
||||||
RMPROG STRIPPROG
|
|
||||||
"
|
|
||||||
|
|
||||||
while test $# -ne 0; do
|
|
||||||
case $1 in
|
|
||||||
-c) ;;
|
|
||||||
|
|
||||||
-C) copy_on_change=true;;
|
|
||||||
|
|
||||||
-d) dir_arg=true;;
|
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
--help) echo "$usage"; exit $?;;
|
|
||||||
|
|
||||||
-m) mode=$2
|
|
||||||
case $mode in
|
|
||||||
*' '* | *' '* | *'
|
|
||||||
'* | *'*'* | *'?'* | *'['*)
|
|
||||||
echo "$0: invalid mode: $mode" >&2
|
|
||||||
exit 1;;
|
|
||||||
esac
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-s) stripcmd=$stripprog;;
|
|
||||||
|
|
||||||
-t) dst_arg=$2
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-T) no_target_directory=true;;
|
|
||||||
|
|
||||||
--version) echo "$0 $scriptversion"; exit $?;;
|
|
||||||
|
|
||||||
--) shift
|
|
||||||
break;;
|
|
||||||
|
|
||||||
-*) echo "$0: invalid option: $1" >&2
|
|
||||||
exit 1;;
|
|
||||||
|
|
||||||
*) break;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
|
||||||
# When -d is used, all remaining arguments are directories to create.
|
|
||||||
# When -t is used, the destination is already specified.
|
|
||||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$dst_arg"; then
|
|
||||||
# $@ is not empty: it contains at least $arg.
|
|
||||||
set fnord "$@" "$dst_arg"
|
|
||||||
shift # fnord
|
|
||||||
fi
|
|
||||||
shift # arg
|
|
||||||
dst_arg=$arg
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
echo "$0: no input file specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# It's OK to call `install-sh -d' without argument.
|
|
||||||
# This can happen when creating conditional directories.
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
trap '(exit $?); exit' 1 2 13 15
|
|
||||||
|
|
||||||
# Set umask so as not to create temps with too-generous modes.
|
|
||||||
# However, 'strip' requires both read and write access to temps.
|
|
||||||
case $mode in
|
|
||||||
# Optimize common cases.
|
|
||||||
*644) cp_umask=133;;
|
|
||||||
*755) cp_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw='% 200'
|
|
||||||
fi
|
|
||||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
|
||||||
*)
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw=,u+rw
|
|
||||||
fi
|
|
||||||
cp_umask=$mode$u_plus_rw;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
for src
|
|
||||||
do
|
|
||||||
# Protect names starting with `-'.
|
|
||||||
case $src in
|
|
||||||
-*) src=./$src;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
dst=$src
|
|
||||||
dstdir=$dst
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
else
|
|
||||||
|
|
||||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
|
||||||
# might cause directories to be created, which would be especially bad
|
|
||||||
# if $src (and thus $dsttmp) contains '*'.
|
|
||||||
if test ! -f "$src" && test ! -d "$src"; then
|
|
||||||
echo "$0: $src does not exist." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dst_arg"; then
|
|
||||||
echo "$0: no destination specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
dst=$dst_arg
|
|
||||||
# Protect names starting with `-'.
|
|
||||||
case $dst in
|
|
||||||
-*) dst=./$dst;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# If destination is a directory, append the input filename; won't work
|
|
||||||
# if double slashes aren't ignored.
|
|
||||||
if test -d "$dst"; then
|
|
||||||
if test -n "$no_target_directory"; then
|
|
||||||
echo "$0: $dst_arg: Is a directory" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
dstdir=$dst
|
|
||||||
dst=$dstdir/`basename "$src"`
|
|
||||||
dstdir_status=0
|
|
||||||
else
|
|
||||||
# Prefer dirname, but fall back on a substitute if dirname fails.
|
|
||||||
dstdir=`
|
|
||||||
(dirname "$dst") 2>/dev/null ||
|
|
||||||
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
|
||||||
X"$dst" : 'X\(//\)[^/]' \| \
|
|
||||||
X"$dst" : 'X\(//\)$' \| \
|
|
||||||
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
echo X"$dst" |
|
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)[^/].*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\).*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
s/.*/./; q'
|
|
||||||
`
|
|
||||||
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
obsolete_mkdir_used=false
|
|
||||||
|
|
||||||
if test $dstdir_status != 0; then
|
|
||||||
case $posix_mkdir in
|
|
||||||
'')
|
|
||||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
|
||||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
|
||||||
umask=`umask`
|
|
||||||
case $stripcmd.$umask in
|
|
||||||
# Optimize common cases.
|
|
||||||
*[2367][2367]) mkdir_umask=$umask;;
|
|
||||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
mkdir_umask=`expr $umask + 22 \
|
|
||||||
- $umask % 100 % 40 + $umask % 20 \
|
|
||||||
- $umask % 10 % 4 + $umask % 2
|
|
||||||
`;;
|
|
||||||
*) mkdir_umask=$umask,go-w;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# With -d, create the new directory with the user-specified mode.
|
|
||||||
# Otherwise, rely on $mkdir_umask.
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
mkdir_mode=-m$mode
|
|
||||||
else
|
|
||||||
mkdir_mode=
|
|
||||||
fi
|
|
||||||
|
|
||||||
posix_mkdir=false
|
|
||||||
case $umask in
|
|
||||||
*[123567][0-7][0-7])
|
|
||||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
|
||||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
|
||||||
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
|
||||||
|
|
||||||
if (umask $mkdir_umask &&
|
|
||||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
if test -z "$dir_arg" || {
|
|
||||||
# Check for POSIX incompatibilities with -m.
|
|
||||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
|
||||||
# other-writeable bit of parent directory when it shouldn't.
|
|
||||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
|
||||||
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
|
||||||
case $ls_ld_tmpdir in
|
|
||||||
d????-?r-*) different_mode=700;;
|
|
||||||
d????-?--*) different_mode=755;;
|
|
||||||
*) false;;
|
|
||||||
esac &&
|
|
||||||
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
|
||||||
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
|
||||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
then posix_mkdir=:
|
|
||||||
fi
|
|
||||||
rmdir "$tmpdir/d" "$tmpdir"
|
|
||||||
else
|
|
||||||
# Remove any dirs left behind by ancient mkdir implementations.
|
|
||||||
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
|
||||||
fi
|
|
||||||
trap '' 0;;
|
|
||||||
esac;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if
|
|
||||||
$posix_mkdir && (
|
|
||||||
umask $mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
|
||||||
)
|
|
||||||
then :
|
|
||||||
else
|
|
||||||
|
|
||||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
|
||||||
# or it failed possibly due to a race condition. Create the
|
|
||||||
# directory the slow way, step by step, checking for races as we go.
|
|
||||||
|
|
||||||
case $dstdir in
|
|
||||||
/*) prefix='/';;
|
|
||||||
-*) prefix='./';;
|
|
||||||
*) prefix='';;
|
|
||||||
esac
|
|
||||||
|
|
||||||
eval "$initialize_posix_glob"
|
|
||||||
|
|
||||||
oIFS=$IFS
|
|
||||||
IFS=/
|
|
||||||
$posix_glob set -f
|
|
||||||
set fnord $dstdir
|
|
||||||
shift
|
|
||||||
$posix_glob set +f
|
|
||||||
IFS=$oIFS
|
|
||||||
|
|
||||||
prefixes=
|
|
||||||
|
|
||||||
for d
|
|
||||||
do
|
|
||||||
test -z "$d" && continue
|
|
||||||
|
|
||||||
prefix=$prefix$d
|
|
||||||
if test -d "$prefix"; then
|
|
||||||
prefixes=
|
|
||||||
else
|
|
||||||
if $posix_mkdir; then
|
|
||||||
(umask=$mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
test -d "$prefix" || exit 1
|
|
||||||
else
|
|
||||||
case $prefix in
|
|
||||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
|
||||||
*) qprefix=$prefix;;
|
|
||||||
esac
|
|
||||||
prefixes="$prefixes '$qprefix'"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
prefix=$prefix/
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -n "$prefixes"; then
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
(umask $mkdir_umask &&
|
|
||||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
|
||||||
test -d "$dstdir" || exit 1
|
|
||||||
obsolete_mkdir_used=true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
|
||||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
|
||||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
|
||||||
else
|
|
||||||
|
|
||||||
# Make a couple of temp file names in the proper directory.
|
|
||||||
dsttmp=$dstdir/_inst.$$_
|
|
||||||
rmtmp=$dstdir/_rm.$$_
|
|
||||||
|
|
||||||
# Trap to clean up those temp files at exit.
|
|
||||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
|
||||||
|
|
||||||
# Copy the file name to the temp name.
|
|
||||||
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
|
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits.
|
|
||||||
#
|
|
||||||
# If any of these fail, we abort the whole thing. If we want to
|
|
||||||
# ignore errors from any of these, just make sure not to ignore
|
|
||||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
|
||||||
#
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
|
||||||
|
|
||||||
# If -C, don't bother to copy if it wouldn't change the file.
|
|
||||||
if $copy_on_change &&
|
|
||||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
|
||||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
|
||||||
|
|
||||||
eval "$initialize_posix_glob" &&
|
|
||||||
$posix_glob set -f &&
|
|
||||||
set X $old && old=:$2:$4:$5:$6 &&
|
|
||||||
set X $new && new=:$2:$4:$5:$6 &&
|
|
||||||
$posix_glob set +f &&
|
|
||||||
|
|
||||||
test "$old" = "$new" &&
|
|
||||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
rm -f "$dsttmp"
|
|
||||||
else
|
|
||||||
# Rename the file to the real destination.
|
|
||||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
|
||||||
|
|
||||||
# The rename failed, perhaps because mv can't rename something else
|
|
||||||
# to itself, or perhaps because mv is so ancient that it does not
|
|
||||||
# support -f.
|
|
||||||
{
|
|
||||||
# Now remove or move aside any old file at destination location.
|
|
||||||
# We try this two ways since rm can't unlink itself on some
|
|
||||||
# systems and the destination file might be busy for other
|
|
||||||
# reasons. In this case, the final cleanup might fail but the new
|
|
||||||
# file should still install successfully.
|
|
||||||
{
|
|
||||||
test ! -f "$dst" ||
|
|
||||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
|
||||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
|
||||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
|
||||||
} ||
|
|
||||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
|
||||||
(exit 1); exit 1
|
|
||||||
}
|
|
||||||
} &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
$doit $mvcmd "$dsttmp" "$dst"
|
|
||||||
}
|
|
||||||
fi || exit 1
|
|
||||||
|
|
||||||
trap '' 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
File diff suppressed because it is too large
Load Diff
@ -1,376 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# Common stub for a few missing GNU programs while installing.
|
|
||||||
|
|
||||||
scriptversion=2009-04-28.21; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
|
|
||||||
# 2008, 2009 Free Software Foundation, Inc.
|
|
||||||
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
echo 1>&2 "Try \`$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
run=:
|
|
||||||
sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
|
|
||||||
sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
|
|
||||||
|
|
||||||
# In the cases where this matters, `missing' is being run in the
|
|
||||||
# srcdir already.
|
|
||||||
if test -f configure.ac; then
|
|
||||||
configure_ac=configure.ac
|
|
||||||
else
|
|
||||||
configure_ac=configure.in
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg="missing on your system"
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
--run)
|
|
||||||
# Try to run requested program, and just exit if it succeeds.
|
|
||||||
run=
|
|
||||||
shift
|
|
||||||
"$@" && exit 0
|
|
||||||
# Exit code 63 means version mismatch. This often happens
|
|
||||||
# when the user try to use an ancient version of a tool on
|
|
||||||
# a file that requires a minimum version. In this case we
|
|
||||||
# we should proceed has if the program had been absent, or
|
|
||||||
# if --run hadn't been passed.
|
|
||||||
if test $? = 63; then
|
|
||||||
run=:
|
|
||||||
msg="probably too old"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
-h|--h|--he|--hel|--help)
|
|
||||||
echo "\
|
|
||||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
|
||||||
|
|
||||||
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
|
||||||
error status if there is no known handling for PROGRAM.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-h, --help display this help and exit
|
|
||||||
-v, --version output version information and exit
|
|
||||||
--run try to run the given command, and emulate it if it fails
|
|
||||||
|
|
||||||
Supported PROGRAM values:
|
|
||||||
aclocal touch file \`aclocal.m4'
|
|
||||||
autoconf touch file \`configure'
|
|
||||||
autoheader touch file \`config.h.in'
|
|
||||||
autom4te touch the output file, or create a stub one
|
|
||||||
automake touch all \`Makefile.in' files
|
|
||||||
bison create \`y.tab.[ch]', if possible, from existing .[ch]
|
|
||||||
flex create \`lex.yy.c', if possible, from existing .c
|
|
||||||
help2man touch the output file
|
|
||||||
lex create \`lex.yy.c', if possible, from existing .c
|
|
||||||
makeinfo touch the output file
|
|
||||||
tar try tar, gnutar, gtar, then tar without non-portable flags
|
|
||||||
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
|
|
||||||
|
|
||||||
Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
|
|
||||||
\`g' are ignored when checking the name.
|
|
||||||
|
|
||||||
Send bug reports to <bug-automake@gnu.org>."
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
|
||||||
echo "missing $scriptversion (GNU Automake)"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
-*)
|
|
||||||
echo 1>&2 "$0: Unknown \`$1' option"
|
|
||||||
echo 1>&2 "Try \`$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
esac
|
|
||||||
|
|
||||||
# normalize program name to check for.
|
|
||||||
program=`echo "$1" | sed '
|
|
||||||
s/^gnu-//; t
|
|
||||||
s/^gnu//; t
|
|
||||||
s/^g//; t'`
|
|
||||||
|
|
||||||
# Now exit if we have it, but it failed. Also exit now if we
|
|
||||||
# don't have it and --version was passed (most likely to detect
|
|
||||||
# the program). This is about non-GNU programs, so use $1 not
|
|
||||||
# $program.
|
|
||||||
case $1 in
|
|
||||||
lex*|yacc*)
|
|
||||||
# Not GNU programs, they don't have --version.
|
|
||||||
;;
|
|
||||||
|
|
||||||
tar*)
|
|
||||||
if test -n "$run"; then
|
|
||||||
echo 1>&2 "ERROR: \`tar' requires --run"
|
|
||||||
exit 1
|
|
||||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
|
||||||
# We have it, but it failed.
|
|
||||||
exit 1
|
|
||||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
|
||||||
# Could not run --version or --help. This is probably someone
|
|
||||||
# running `$TOOL --version' or `$TOOL --help' to check whether
|
|
||||||
# $TOOL exists and not knowing $TOOL uses missing.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# If it does not exist, or fails to run (possibly an outdated version),
|
|
||||||
# try to emulate it.
|
|
||||||
case $program in
|
|
||||||
aclocal*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
|
|
||||||
to install the \`Automake' and \`Perl' packages. Grab them from
|
|
||||||
any GNU archive site."
|
|
||||||
touch aclocal.m4
|
|
||||||
;;
|
|
||||||
|
|
||||||
autoconf*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`${configure_ac}'. You might want to install the
|
|
||||||
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
|
||||||
archive site."
|
|
||||||
touch configure
|
|
||||||
;;
|
|
||||||
|
|
||||||
autoheader*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`acconfig.h' or \`${configure_ac}'. You might want
|
|
||||||
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
|
||||||
from any GNU archive site."
|
|
||||||
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
|
|
||||||
test -z "$files" && files="config.h"
|
|
||||||
touch_files=
|
|
||||||
for f in $files; do
|
|
||||||
case $f in
|
|
||||||
*:*) touch_files="$touch_files "`echo "$f" |
|
|
||||||
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
|
|
||||||
*) touch_files="$touch_files $f.in";;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
touch $touch_files
|
|
||||||
;;
|
|
||||||
|
|
||||||
automake*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
|
|
||||||
You might want to install the \`Automake' and \`Perl' packages.
|
|
||||||
Grab them from any GNU archive site."
|
|
||||||
find . -type f -name Makefile.am -print |
|
|
||||||
sed 's/\.am$/.in/' |
|
|
||||||
while read f; do touch "$f"; done
|
|
||||||
;;
|
|
||||||
|
|
||||||
autom4te*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is needed, but is $msg.
|
|
||||||
You might have modified some files without having the
|
|
||||||
proper tools for further handling them.
|
|
||||||
You can get \`$1' as part of \`Autoconf' from any GNU
|
|
||||||
archive site."
|
|
||||||
|
|
||||||
file=`echo "$*" | sed -n "$sed_output"`
|
|
||||||
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
|
||||||
if test -f "$file"; then
|
|
||||||
touch $file
|
|
||||||
else
|
|
||||||
test -z "$file" || exec >$file
|
|
||||||
echo "#! /bin/sh"
|
|
||||||
echo "# Created by GNU Automake missing as a replacement of"
|
|
||||||
echo "# $ $@"
|
|
||||||
echo "exit 0"
|
|
||||||
chmod +x $file
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
bison*|yacc*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' $msg. You should only need it if
|
|
||||||
you modified a \`.y' file. You may need the \`Bison' package
|
|
||||||
in order for those modifications to take effect. You can get
|
|
||||||
\`Bison' from any GNU archive site."
|
|
||||||
rm -f y.tab.c y.tab.h
|
|
||||||
if test $# -ne 1; then
|
|
||||||
eval LASTARG="\${$#}"
|
|
||||||
case $LASTARG in
|
|
||||||
*.y)
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
|
|
||||||
if test -f "$SRCFILE"; then
|
|
||||||
cp "$SRCFILE" y.tab.c
|
|
||||||
fi
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
|
|
||||||
if test -f "$SRCFILE"; then
|
|
||||||
cp "$SRCFILE" y.tab.h
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if test ! -f y.tab.h; then
|
|
||||||
echo >y.tab.h
|
|
||||||
fi
|
|
||||||
if test ! -f y.tab.c; then
|
|
||||||
echo 'main() { return 0; }' >y.tab.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
lex*|flex*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a \`.l' file. You may need the \`Flex' package
|
|
||||||
in order for those modifications to take effect. You can get
|
|
||||||
\`Flex' from any GNU archive site."
|
|
||||||
rm -f lex.yy.c
|
|
||||||
if test $# -ne 1; then
|
|
||||||
eval LASTARG="\${$#}"
|
|
||||||
case $LASTARG in
|
|
||||||
*.l)
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
|
|
||||||
if test -f "$SRCFILE"; then
|
|
||||||
cp "$SRCFILE" lex.yy.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if test ! -f lex.yy.c; then
|
|
||||||
echo 'main() { return 0; }' >lex.yy.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
help2man*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a dependency of a manual page. You may need the
|
|
||||||
\`Help2man' package in order for those modifications to take
|
|
||||||
effect. You can get \`Help2man' from any GNU archive site."
|
|
||||||
|
|
||||||
file=`echo "$*" | sed -n "$sed_output"`
|
|
||||||
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
|
||||||
if test -f "$file"; then
|
|
||||||
touch $file
|
|
||||||
else
|
|
||||||
test -z "$file" || exec >$file
|
|
||||||
echo ".ab help2man is required to generate this page"
|
|
||||||
exit $?
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
makeinfo*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a \`.texi' or \`.texinfo' file, or any other file
|
|
||||||
indirectly affecting the aspect of the manual. The spurious
|
|
||||||
call might also be the consequence of using a buggy \`make' (AIX,
|
|
||||||
DU, IRIX). You might want to install the \`Texinfo' package or
|
|
||||||
the \`GNU make' package. Grab either from any GNU archive site."
|
|
||||||
# The file to touch is that specified with -o ...
|
|
||||||
file=`echo "$*" | sed -n "$sed_output"`
|
|
||||||
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
|
||||||
if test -z "$file"; then
|
|
||||||
# ... or it is the one specified with @setfilename ...
|
|
||||||
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
|
||||||
file=`sed -n '
|
|
||||||
/^@setfilename/{
|
|
||||||
s/.* \([^ ]*\) *$/\1/
|
|
||||||
p
|
|
||||||
q
|
|
||||||
}' $infile`
|
|
||||||
# ... or it is derived from the source name (dir/f.texi becomes f.info)
|
|
||||||
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
|
|
||||||
fi
|
|
||||||
# If the file does not exist, the user really needs makeinfo;
|
|
||||||
# let's fail without touching anything.
|
|
||||||
test -f $file || exit 1
|
|
||||||
touch $file
|
|
||||||
;;
|
|
||||||
|
|
||||||
tar*)
|
|
||||||
shift
|
|
||||||
|
|
||||||
# We have already tried tar in the generic part.
|
|
||||||
# Look for gnutar/gtar before invocation to avoid ugly error
|
|
||||||
# messages.
|
|
||||||
if (gnutar --version > /dev/null 2>&1); then
|
|
||||||
gnutar "$@" && exit 0
|
|
||||||
fi
|
|
||||||
if (gtar --version > /dev/null 2>&1); then
|
|
||||||
gtar "$@" && exit 0
|
|
||||||
fi
|
|
||||||
firstarg="$1"
|
|
||||||
if shift; then
|
|
||||||
case $firstarg in
|
|
||||||
*o*)
|
|
||||||
firstarg=`echo "$firstarg" | sed s/o//`
|
|
||||||
tar "$firstarg" "$@" && exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
case $firstarg in
|
|
||||||
*h*)
|
|
||||||
firstarg=`echo "$firstarg" | sed s/h//`
|
|
||||||
tar "$firstarg" "$@" && exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: I can't seem to be able to run \`tar' with the given arguments.
|
|
||||||
You may want to install GNU tar or Free paxutils, or check the
|
|
||||||
command line arguments."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is needed, and is $msg.
|
|
||||||
You might have modified some files without having the
|
|
||||||
proper tools for further handling them. Check the \`README' file,
|
|
||||||
it often tells you about the needed prerequisites for installing
|
|
||||||
this package. You may also peek at any GNU archive site, in case
|
|
||||||
some other package would contain this missing \`$1' program."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
17795
cpp/tests/gmock/configure
vendored
17795
cpp/tests/gmock/configure
vendored
File diff suppressed because it is too large
Load Diff
@ -7,7 +7,7 @@ AC_INIT([Google C++ Mocking Framework],
|
|||||||
|
|
||||||
# Provide various options to initialize the Autoconf and configure processes.
|
# Provide various options to initialize the Autoconf and configure processes.
|
||||||
AC_PREREQ([2.59])
|
AC_PREREQ([2.59])
|
||||||
AC_CONFIG_SRCDIR([./COPYING])
|
AC_CONFIG_SRCDIR([./LICENSE])
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
AC_CONFIG_HEADERS([build-aux/config.h])
|
AC_CONFIG_HEADERS([build-aux/config.h])
|
||||||
AC_CONFIG_FILES([Makefile])
|
AC_CONFIG_FILES([Makefile])
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,54 +0,0 @@
|
|||||||
// Copyright 2008, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
// Author: wan@google.com (Zhanyong Wan)
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include "gmock/gmock.h"
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
// MS C++ compiler/linker has a bug on Windows (not on Windows CE), which
|
|
||||||
// causes a link error when _tmain is defined in a static library and UNICODE
|
|
||||||
// is enabled. For this reason instead of _tmain, main function is used on
|
|
||||||
// Windows. See the following link to track the current status of this bug:
|
|
||||||
// http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=394464 // NOLINT
|
|
||||||
#if GTEST_OS_WINDOWS_MOBILE
|
|
||||||
# include <tchar.h> // NOLINT
|
|
||||||
|
|
||||||
int _tmain(int argc, TCHAR** argv) {
|
|
||||||
#else
|
|
||||||
int main(int argc, char** argv) {
|
|
||||||
#endif // GTEST_OS_WINDOWS_MOBILE
|
|
||||||
std::cout << "Running main() from gmock_main.cc\n";
|
|
||||||
// Since Google Mock depends on Google Test, InitGoogleMock() is
|
|
||||||
// also responsible for initializing Google Test. Therefore there's
|
|
||||||
// no need for calling testing::InitGoogleTest() separately.
|
|
||||||
testing::InitGoogleMock(&argc, argv);
|
|
||||||
return RUN_ALL_TESTS();
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -140,10 +140,13 @@ if (gtest_build_tests)
|
|||||||
############################################################
|
############################################################
|
||||||
# C++ tests built with non-standard compiler flags.
|
# C++ tests built with non-standard compiler flags.
|
||||||
|
|
||||||
|
# MSVC 7.1 does not support STL with exceptions disabled.
|
||||||
|
if (NOT MSVC OR MSVC_VERSION GREATER 1310)
|
||||||
cxx_library(gtest_no_exception "${cxx_no_exception}"
|
cxx_library(gtest_no_exception "${cxx_no_exception}"
|
||||||
src/gtest-all.cc)
|
src/gtest-all.cc)
|
||||||
cxx_library(gtest_main_no_exception "${cxx_no_exception}"
|
cxx_library(gtest_main_no_exception "${cxx_no_exception}"
|
||||||
src/gtest-all.cc src/gtest_main.cc)
|
src/gtest-all.cc src/gtest_main.cc)
|
||||||
|
endif()
|
||||||
cxx_library(gtest_main_no_rtti "${cxx_no_rtti}"
|
cxx_library(gtest_main_no_rtti "${cxx_no_rtti}"
|
||||||
src/gtest-all.cc src/gtest_main.cc)
|
src/gtest-all.cc src/gtest_main.cc)
|
||||||
|
|
||||||
@ -189,11 +192,15 @@ if (gtest_build_tests)
|
|||||||
cxx_executable(gtest_break_on_failure_unittest_ test gtest)
|
cxx_executable(gtest_break_on_failure_unittest_ test gtest)
|
||||||
py_test(gtest_break_on_failure_unittest)
|
py_test(gtest_break_on_failure_unittest)
|
||||||
|
|
||||||
|
# MSVC 7.1 does not support STL with exceptions disabled.
|
||||||
|
if (NOT MSVC OR MSVC_VERSION GREATER 1310)
|
||||||
cxx_executable_with_flags(
|
cxx_executable_with_flags(
|
||||||
gtest_catch_exceptions_no_ex_test_
|
gtest_catch_exceptions_no_ex_test_
|
||||||
"${cxx_no_exception}"
|
"${cxx_no_exception}"
|
||||||
gtest_main_no_exception
|
gtest_main_no_exception
|
||||||
test/gtest_catch_exceptions_test_.cc)
|
test/gtest_catch_exceptions_test_.cc)
|
||||||
|
endif()
|
||||||
|
|
||||||
cxx_executable_with_flags(
|
cxx_executable_with_flags(
|
||||||
gtest_catch_exceptions_ex_test_
|
gtest_catch_exceptions_ex_test_
|
||||||
"${cxx_exception}"
|
"${cxx_exception}"
|
||||||
@ -222,11 +229,14 @@ if (gtest_build_tests)
|
|||||||
cxx_executable(gtest_shuffle_test_ test gtest)
|
cxx_executable(gtest_shuffle_test_ test gtest)
|
||||||
py_test(gtest_shuffle_test)
|
py_test(gtest_shuffle_test)
|
||||||
|
|
||||||
|
# MSVC 7.1 does not support STL with exceptions disabled.
|
||||||
|
if (NOT MSVC OR MSVC_VERSION GREATER 1310)
|
||||||
cxx_executable(gtest_throw_on_failure_test_ test gtest_no_exception)
|
cxx_executable(gtest_throw_on_failure_test_ test gtest_no_exception)
|
||||||
set_target_properties(gtest_throw_on_failure_test_
|
set_target_properties(gtest_throw_on_failure_test_
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
COMPILE_FLAGS "${cxx_no_exception}")
|
COMPILE_FLAGS "${cxx_no_exception}")
|
||||||
py_test(gtest_throw_on_failure_test)
|
py_test(gtest_throw_on_failure_test)
|
||||||
|
endif()
|
||||||
|
|
||||||
cxx_executable(gtest_uninitialized_test_ test gtest)
|
cxx_executable(gtest_uninitialized_test_ test gtest)
|
||||||
py_test(gtest_uninitialized_test)
|
py_test(gtest_uninitialized_test)
|
||||||
|
@ -261,6 +261,7 @@ FUSED_GTEST_SRC = \
|
|||||||
fused-src/gtest/gtest.h \
|
fused-src/gtest/gtest.h \
|
||||||
fused-src/gtest/gtest_main.cc
|
fused-src/gtest/gtest_main.cc
|
||||||
|
|
||||||
|
if HAVE_PYTHON
|
||||||
TESTS += test/fused_gtest_test
|
TESTS += test/fused_gtest_test
|
||||||
check_PROGRAMS += test/fused_gtest_test
|
check_PROGRAMS += test/fused_gtest_test
|
||||||
test_fused_gtest_test_SOURCES = $(FUSED_GTEST_SRC) \
|
test_fused_gtest_test_SOURCES = $(FUSED_GTEST_SRC) \
|
||||||
@ -284,6 +285,7 @@ fused-gtest: $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS) \
|
|||||||
|
|
||||||
maintainer-clean-local:
|
maintainer-clean-local:
|
||||||
rm -rf "$(srcdir)/fused-src"
|
rm -rf "$(srcdir)/fused-src"
|
||||||
|
endif
|
||||||
|
|
||||||
# Death tests may produce core dumps in the build directory. In case
|
# Death tests may produce core dumps in the build directory. In case
|
||||||
# this happens, clean them to keep distcleancheck happy.
|
# this happens, clean them to keep distcleancheck happy.
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -217,6 +217,16 @@ default build location. See the "xcodebuild" man page for more
|
|||||||
information about building different configurations and building in
|
information about building different configurations and building in
|
||||||
different locations.
|
different locations.
|
||||||
|
|
||||||
|
If you wish to use the Google Test Xcode project with Xcode 4.x and
|
||||||
|
above, you need to either:
|
||||||
|
* update the SDK configuration options in xcode/Config/General.xconfig.
|
||||||
|
Comment options SDKROOT, MACOS_DEPLOYMENT_TARGET, and GCC_VERSION. If
|
||||||
|
you choose this route you lose the ability to target earlier versions
|
||||||
|
of MacOS X.
|
||||||
|
* Install an SDK for an earlier version. This doesn't appear to be
|
||||||
|
supported by Apple, but has been reported to work
|
||||||
|
(http://stackoverflow.com/questions/5378518).
|
||||||
|
|
||||||
Tweaking Google Test
|
Tweaking Google Test
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
1178
cpp/tests/gmock/gtest/aclocal.m4
vendored
1178
cpp/tests/gmock/gtest/aclocal.m4
vendored
File diff suppressed because it is too large
Load Diff
1533
cpp/tests/gmock/gtest/build-aux/config.guess
vendored
1533
cpp/tests/gmock/gtest/build-aux/config.guess
vendored
File diff suppressed because it is too large
Load Diff
@ -1,69 +0,0 @@
|
|||||||
/* build-aux/config.h.in. Generated from configure.ac by autoheader. */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
|
||||||
#undef HAVE_DLFCN_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#undef HAVE_INTTYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
#undef HAVE_MEMORY_H
|
|
||||||
|
|
||||||
/* Define if you have POSIX threads libraries and header files. */
|
|
||||||
#undef HAVE_PTHREAD
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#undef HAVE_STDINT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
||||||
#undef HAVE_STDLIB_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
|
||||||
#undef HAVE_STRINGS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
#undef HAVE_STRING_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
||||||
#undef HAVE_SYS_STAT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
||||||
#undef HAVE_SYS_TYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
|
||||||
#undef HAVE_UNISTD_H
|
|
||||||
|
|
||||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
|
||||||
*/
|
|
||||||
#undef LT_OBJDIR
|
|
||||||
|
|
||||||
/* Name of package */
|
|
||||||
#undef PACKAGE
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#undef PACKAGE_BUGREPORT
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#undef PACKAGE_NAME
|
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#undef PACKAGE_STRING
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
|
||||||
#undef PACKAGE_TARNAME
|
|
||||||
|
|
||||||
/* Define to the home page for this package. */
|
|
||||||
#undef PACKAGE_URL
|
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
|
||||||
#undef PACKAGE_VERSION
|
|
||||||
|
|
||||||
/* Define to necessary symbol if this constant uses a non-standard name on
|
|
||||||
your system. */
|
|
||||||
#undef PTHREAD_CREATE_JOINABLE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
|
||||||
#undef STDC_HEADERS
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#undef VERSION
|
|
1693
cpp/tests/gmock/gtest/build-aux/config.sub
vendored
1693
cpp/tests/gmock/gtest/build-aux/config.sub
vendored
File diff suppressed because it is too large
Load Diff
@ -1,630 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# depcomp - compile a program generating dependencies as side-effects
|
|
||||||
|
|
||||||
scriptversion=2009-04-28.21; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
|
|
||||||
# Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
|
||||||
as side-effects.
|
|
||||||
|
|
||||||
Environment variables:
|
|
||||||
depmode Dependency tracking mode.
|
|
||||||
source Source file read by `PROGRAMS ARGS'.
|
|
||||||
object Object file output by `PROGRAMS ARGS'.
|
|
||||||
DEPDIR directory where to store dependencies.
|
|
||||||
depfile Dependency file to output.
|
|
||||||
tmpdepfile Temporary file to use when outputing dependencies.
|
|
||||||
libtool Whether libtool is used (yes/no).
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "depcomp $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
|
||||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
|
||||||
depfile=${depfile-`echo "$object" |
|
|
||||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
|
||||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
|
||||||
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
|
|
||||||
# Some modes work just like other modes, but use different flags. We
|
|
||||||
# parameterize here, but still list the modes in the big case below,
|
|
||||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
|
||||||
# here, because this file can only contain one case statement.
|
|
||||||
if test "$depmode" = hp; then
|
|
||||||
# HP compiler uses -M and no extra arg.
|
|
||||||
gccflag=-M
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = dashXmstdout; then
|
|
||||||
# This is just like dashmstdout with a different argument.
|
|
||||||
dashmflag=-xM
|
|
||||||
depmode=dashmstdout
|
|
||||||
fi
|
|
||||||
|
|
||||||
cygpath_u="cygpath -u -f -"
|
|
||||||
if test "$depmode" = msvcmsys; then
|
|
||||||
# This is just like msvisualcpp but w/o cygpath translation.
|
|
||||||
# Just convert the backslash-escaped backslashes to single forward
|
|
||||||
# slashes to satisfy depend.m4
|
|
||||||
cygpath_u="sed s,\\\\\\\\,/,g"
|
|
||||||
depmode=msvisualcpp
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$depmode" in
|
|
||||||
gcc3)
|
|
||||||
## gcc 3 implements dependency tracking that does exactly what
|
|
||||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
|
||||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
|
||||||
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
|
||||||
## the command line argument order; so add the flags where they
|
|
||||||
## appear in depend2.am. Note that the slowdown incurred here
|
|
||||||
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
|
||||||
*) set fnord "$@" "$arg" ;;
|
|
||||||
esac
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
done
|
|
||||||
"$@"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
mv "$tmpdepfile" "$depfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
gcc)
|
|
||||||
## There are various ways to get dependency output from gcc. Here's
|
|
||||||
## why we pick this rather obscure method:
|
|
||||||
## - Don't want to use -MD because we'd like the dependencies to end
|
|
||||||
## up in a subdir. Having to rename by hand is ugly.
|
|
||||||
## (We might end up doing this anyway to support other compilers.)
|
|
||||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
|
||||||
## -MM, not -M (despite what the docs say).
|
|
||||||
## - Using -M directly means running the compiler twice (even worse
|
|
||||||
## than renaming).
|
|
||||||
if test -z "$gccflag"; then
|
|
||||||
gccflag=-MD,
|
|
||||||
fi
|
|
||||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
|
||||||
## The second -e expression handles DOS-style file names with drive letters.
|
|
||||||
sed -e 's/^[^:]*: / /' \
|
|
||||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
|
||||||
## This next piece of magic avoids the `deleted header file' problem.
|
|
||||||
## The problem is that when a header file which appears in a .P file
|
|
||||||
## is deleted, the dependency causes make to die (because there is
|
|
||||||
## typically no way to rebuild the header). We avoid this by adding
|
|
||||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
|
||||||
## this for us directly.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" |
|
|
||||||
## Some versions of gcc put a space before the `:'. On the theory
|
|
||||||
## that the space means something, we add a space to the output as
|
|
||||||
## well.
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
sgi)
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
|
||||||
else
|
|
||||||
"$@" -MDupdate "$tmpdepfile"
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
|
|
||||||
# Clip off the initial element (the dependent). Don't try to be
|
|
||||||
# clever and replace this with sed code, as IRIX sed won't handle
|
|
||||||
# lines with more than a fixed number of characters (4096 in
|
|
||||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
|
||||||
# the IRIX cc adds comments like `#:fec' to the end of the
|
|
||||||
# dependency line.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
|
|
||||||
tr '
|
|
||||||
' ' ' >> "$depfile"
|
|
||||||
echo >> "$depfile"
|
|
||||||
|
|
||||||
# The second pass generates a dummy entry for each header file.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
|
||||||
>> "$depfile"
|
|
||||||
else
|
|
||||||
# The sourcefile does not contain any dependencies, so just
|
|
||||||
# store a dummy comment line, to avoid errors with the Makefile
|
|
||||||
# "include basename.Plo" scheme.
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
aix)
|
|
||||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
|
||||||
# in a .u file. In older versions, this file always lives in the
|
|
||||||
# current directory. Also, the AIX compiler puts `$object:' at the
|
|
||||||
# start of each line; $object doesn't have directory information.
|
|
||||||
# Version 6 uses the directory in both cases.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$base.u
|
|
||||||
tmpdepfile3=$dir.libs/$base.u
|
|
||||||
"$@" -Wc,-M
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$dir$base.u
|
|
||||||
tmpdepfile3=$dir$base.u
|
|
||||||
"$@" -M
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
# Each line is of the form `foo.o: dependent.h'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
|
||||||
# That's a tab and a space in the [].
|
|
||||||
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
# The sourcefile does not contain any dependencies, so just
|
|
||||||
# store a dummy comment line, to avoid errors with the Makefile
|
|
||||||
# "include basename.Plo" scheme.
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
icc)
|
|
||||||
# Intel's C compiler understands `-MD -MF file'. However on
|
|
||||||
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
|
||||||
# ICC 7.0 will fill foo.d with something like
|
|
||||||
# foo.o: sub/foo.c
|
|
||||||
# foo.o: sub/foo.h
|
|
||||||
# which is wrong. We want:
|
|
||||||
# sub/foo.o: sub/foo.c
|
|
||||||
# sub/foo.o: sub/foo.h
|
|
||||||
# sub/foo.c:
|
|
||||||
# sub/foo.h:
|
|
||||||
# ICC 7.1 will output
|
|
||||||
# foo.o: sub/foo.c sub/foo.h
|
|
||||||
# and will wrap long lines using \ :
|
|
||||||
# foo.o: sub/foo.c ... \
|
|
||||||
# sub/foo.h ... \
|
|
||||||
# ...
|
|
||||||
|
|
||||||
"$@" -MD -MF "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
# Each line is of the form `foo.o: dependent.h',
|
|
||||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
|
|
||||||
sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp2)
|
|
||||||
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
|
||||||
# compilers, which have integrated preprocessors. The correct option
|
|
||||||
# to use with these is +Maked; it writes dependencies to a file named
|
|
||||||
# 'foo.d', which lands next to the object file, wherever that
|
|
||||||
# happens to be.
|
|
||||||
# Much of this is similar to the tru64 case; see comments there.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir.libs/$base.d
|
|
||||||
"$@" -Wc,+Maked
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
"$@" +Maked
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
|
|
||||||
# Add `dependent.h:' lines.
|
|
||||||
sed -ne '2,${
|
|
||||||
s/^ *//
|
|
||||||
s/ \\*$//
|
|
||||||
s/$/:/
|
|
||||||
p
|
|
||||||
}' "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
|
||||||
;;
|
|
||||||
|
|
||||||
tru64)
|
|
||||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
|
||||||
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
|
|
||||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
|
||||||
# dependencies in `foo.d' instead, so we check for that too.
|
|
||||||
# Subdirectories are respected.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
# With Tru64 cc, shared objects can also be used to make a
|
|
||||||
# static library. This mechanism is used in libtool 1.4 series to
|
|
||||||
# handle both shared and static libraries in a single compilation.
|
|
||||||
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
|
|
||||||
#
|
|
||||||
# With libtool 1.5 this exception was removed, and libtool now
|
|
||||||
# generates 2 separate objects for the 2 libraries. These two
|
|
||||||
# compilations output dependencies in $dir.libs/$base.o.d and
|
|
||||||
# in $dir$base.o.d. We have to check for both files, because
|
|
||||||
# one of the two compilations can be disabled. We should prefer
|
|
||||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
|
||||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
|
||||||
# the former would cause a distcleancheck panic.
|
|
||||||
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
|
|
||||||
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
|
||||||
"$@" -Wc,-MD
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.o.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
tmpdepfile3=$dir$base.d
|
|
||||||
tmpdepfile4=$dir$base.d
|
|
||||||
"$@" -MD
|
|
||||||
fi
|
|
||||||
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
|
||||||
# That's a tab and a space in the [].
|
|
||||||
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
#nosideeffect)
|
|
||||||
# This comment above is used by automake to tell side-effect
|
|
||||||
# dependency tracking mechanisms from slower ones.
|
|
||||||
|
|
||||||
dashmstdout)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout, regardless of -o.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove `-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
test -z "$dashmflag" && dashmflag=-M
|
|
||||||
# Require at least two characters before searching for `:'
|
|
||||||
# in the target name. This is to cope with DOS-style filenames:
|
|
||||||
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
|
|
||||||
"$@" $dashmflag |
|
|
||||||
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" | \
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
dashXmstdout)
|
|
||||||
# This case only exists to satisfy depend.m4. It is never actually
|
|
||||||
# run, as this mode is specially recognized in the preamble.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
makedepend)
|
|
||||||
"$@" || exit $?
|
|
||||||
# Remove any Libtool call
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
# X makedepend
|
|
||||||
shift
|
|
||||||
cleared=no eat=no
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $cleared in
|
|
||||||
no)
|
|
||||||
set ""; shift
|
|
||||||
cleared=yes ;;
|
|
||||||
esac
|
|
||||||
if test $eat = yes; then
|
|
||||||
eat=no
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
case "$arg" in
|
|
||||||
-D*|-I*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
# Strip any option that makedepend may not understand. Remove
|
|
||||||
# the object too, otherwise makedepend will parse it as a source file.
|
|
||||||
-arch)
|
|
||||||
eat=yes ;;
|
|
||||||
-*|$object)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
|
||||||
touch "$tmpdepfile"
|
|
||||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
sed '1,2d' "$tmpdepfile" | tr ' ' '
|
|
||||||
' | \
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
|
||||||
;;
|
|
||||||
|
|
||||||
cpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove `-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
"$@" -E |
|
|
||||||
sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
|
||||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
|
|
||||||
sed '$ s: \\$::' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
cat < "$tmpdepfile" >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvisualcpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case "$arg" in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
|
||||||
set fnord "$@"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
"$@" -E 2>/dev/null |
|
|
||||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
|
|
||||||
echo " " >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvcmsys)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
none)
|
|
||||||
exec "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Unknown depmode $depmode" 1>&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
@ -1,520 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
|
|
||||||
scriptversion=2009-04-28.21; # UTC
|
|
||||||
|
|
||||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
|
||||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
|
||||||
# following copyright and license.
|
|
||||||
#
|
|
||||||
# Copyright (C) 1994 X Consortium
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to
|
|
||||||
# deal in the Software without restriction, including without limitation the
|
|
||||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
# sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
|
||||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
#
|
|
||||||
# Except as contained in this notice, the name of the X Consortium shall not
|
|
||||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
|
||||||
# ings in this Software without prior written authorization from the X Consor-
|
|
||||||
# tium.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# FSF changes to this file are in the public domain.
|
|
||||||
#
|
|
||||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
|
||||||
# `make' implicit rules from creating a file called install from it
|
|
||||||
# when there is no Makefile.
|
|
||||||
#
|
|
||||||
# This script is compatible with the BSD install script, but was written
|
|
||||||
# from scratch.
|
|
||||||
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
IFS=" "" $nl"
|
|
||||||
|
|
||||||
# set DOITPROG to echo to test this script
|
|
||||||
|
|
||||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
|
||||||
doit=${DOITPROG-}
|
|
||||||
if test -z "$doit"; then
|
|
||||||
doit_exec=exec
|
|
||||||
else
|
|
||||||
doit_exec=$doit
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Put in absolute file names if you don't have them in your path;
|
|
||||||
# or use environment vars.
|
|
||||||
|
|
||||||
chgrpprog=${CHGRPPROG-chgrp}
|
|
||||||
chmodprog=${CHMODPROG-chmod}
|
|
||||||
chownprog=${CHOWNPROG-chown}
|
|
||||||
cmpprog=${CMPPROG-cmp}
|
|
||||||
cpprog=${CPPROG-cp}
|
|
||||||
mkdirprog=${MKDIRPROG-mkdir}
|
|
||||||
mvprog=${MVPROG-mv}
|
|
||||||
rmprog=${RMPROG-rm}
|
|
||||||
stripprog=${STRIPPROG-strip}
|
|
||||||
|
|
||||||
posix_glob='?'
|
|
||||||
initialize_posix_glob='
|
|
||||||
test "$posix_glob" != "?" || {
|
|
||||||
if (set -f) 2>/dev/null; then
|
|
||||||
posix_glob=
|
|
||||||
else
|
|
||||||
posix_glob=:
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
'
|
|
||||||
|
|
||||||
posix_mkdir=
|
|
||||||
|
|
||||||
# Desired mode of installed file.
|
|
||||||
mode=0755
|
|
||||||
|
|
||||||
chgrpcmd=
|
|
||||||
chmodcmd=$chmodprog
|
|
||||||
chowncmd=
|
|
||||||
mvcmd=$mvprog
|
|
||||||
rmcmd="$rmprog -f"
|
|
||||||
stripcmd=
|
|
||||||
|
|
||||||
src=
|
|
||||||
dst=
|
|
||||||
dir_arg=
|
|
||||||
dst_arg=
|
|
||||||
|
|
||||||
copy_on_change=false
|
|
||||||
no_target_directory=
|
|
||||||
|
|
||||||
usage="\
|
|
||||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
|
||||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
|
||||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
|
||||||
or: $0 [OPTION]... -d DIRECTORIES...
|
|
||||||
|
|
||||||
In the 1st form, copy SRCFILE to DSTFILE.
|
|
||||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
|
||||||
In the 4th, create DIRECTORIES.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
--help display this help and exit.
|
|
||||||
--version display version info and exit.
|
|
||||||
|
|
||||||
-c (ignored)
|
|
||||||
-C install only if different (preserve the last data modification time)
|
|
||||||
-d create directories instead of installing files.
|
|
||||||
-g GROUP $chgrpprog installed files to GROUP.
|
|
||||||
-m MODE $chmodprog installed files to MODE.
|
|
||||||
-o USER $chownprog installed files to USER.
|
|
||||||
-s $stripprog installed files.
|
|
||||||
-t DIRECTORY install into DIRECTORY.
|
|
||||||
-T report an error if DSTFILE is a directory.
|
|
||||||
|
|
||||||
Environment variables override the default commands:
|
|
||||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
|
||||||
RMPROG STRIPPROG
|
|
||||||
"
|
|
||||||
|
|
||||||
while test $# -ne 0; do
|
|
||||||
case $1 in
|
|
||||||
-c) ;;
|
|
||||||
|
|
||||||
-C) copy_on_change=true;;
|
|
||||||
|
|
||||||
-d) dir_arg=true;;
|
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
--help) echo "$usage"; exit $?;;
|
|
||||||
|
|
||||||
-m) mode=$2
|
|
||||||
case $mode in
|
|
||||||
*' '* | *' '* | *'
|
|
||||||
'* | *'*'* | *'?'* | *'['*)
|
|
||||||
echo "$0: invalid mode: $mode" >&2
|
|
||||||
exit 1;;
|
|
||||||
esac
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-s) stripcmd=$stripprog;;
|
|
||||||
|
|
||||||
-t) dst_arg=$2
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-T) no_target_directory=true;;
|
|
||||||
|
|
||||||
--version) echo "$0 $scriptversion"; exit $?;;
|
|
||||||
|
|
||||||
--) shift
|
|
||||||
break;;
|
|
||||||
|
|
||||||
-*) echo "$0: invalid option: $1" >&2
|
|
||||||
exit 1;;
|
|
||||||
|
|
||||||
*) break;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
|
||||||
# When -d is used, all remaining arguments are directories to create.
|
|
||||||
# When -t is used, the destination is already specified.
|
|
||||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$dst_arg"; then
|
|
||||||
# $@ is not empty: it contains at least $arg.
|
|
||||||
set fnord "$@" "$dst_arg"
|
|
||||||
shift # fnord
|
|
||||||
fi
|
|
||||||
shift # arg
|
|
||||||
dst_arg=$arg
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
echo "$0: no input file specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# It's OK to call `install-sh -d' without argument.
|
|
||||||
# This can happen when creating conditional directories.
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
trap '(exit $?); exit' 1 2 13 15
|
|
||||||
|
|
||||||
# Set umask so as not to create temps with too-generous modes.
|
|
||||||
# However, 'strip' requires both read and write access to temps.
|
|
||||||
case $mode in
|
|
||||||
# Optimize common cases.
|
|
||||||
*644) cp_umask=133;;
|
|
||||||
*755) cp_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw='% 200'
|
|
||||||
fi
|
|
||||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
|
||||||
*)
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw=,u+rw
|
|
||||||
fi
|
|
||||||
cp_umask=$mode$u_plus_rw;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
for src
|
|
||||||
do
|
|
||||||
# Protect names starting with `-'.
|
|
||||||
case $src in
|
|
||||||
-*) src=./$src;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
dst=$src
|
|
||||||
dstdir=$dst
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
else
|
|
||||||
|
|
||||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
|
||||||
# might cause directories to be created, which would be especially bad
|
|
||||||
# if $src (and thus $dsttmp) contains '*'.
|
|
||||||
if test ! -f "$src" && test ! -d "$src"; then
|
|
||||||
echo "$0: $src does not exist." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dst_arg"; then
|
|
||||||
echo "$0: no destination specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
dst=$dst_arg
|
|
||||||
# Protect names starting with `-'.
|
|
||||||
case $dst in
|
|
||||||
-*) dst=./$dst;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# If destination is a directory, append the input filename; won't work
|
|
||||||
# if double slashes aren't ignored.
|
|
||||||
if test -d "$dst"; then
|
|
||||||
if test -n "$no_target_directory"; then
|
|
||||||
echo "$0: $dst_arg: Is a directory" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
dstdir=$dst
|
|
||||||
dst=$dstdir/`basename "$src"`
|
|
||||||
dstdir_status=0
|
|
||||||
else
|
|
||||||
# Prefer dirname, but fall back on a substitute if dirname fails.
|
|
||||||
dstdir=`
|
|
||||||
(dirname "$dst") 2>/dev/null ||
|
|
||||||
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
|
||||||
X"$dst" : 'X\(//\)[^/]' \| \
|
|
||||||
X"$dst" : 'X\(//\)$' \| \
|
|
||||||
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
echo X"$dst" |
|
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)[^/].*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\).*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
s/.*/./; q'
|
|
||||||
`
|
|
||||||
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
obsolete_mkdir_used=false
|
|
||||||
|
|
||||||
if test $dstdir_status != 0; then
|
|
||||||
case $posix_mkdir in
|
|
||||||
'')
|
|
||||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
|
||||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
|
||||||
umask=`umask`
|
|
||||||
case $stripcmd.$umask in
|
|
||||||
# Optimize common cases.
|
|
||||||
*[2367][2367]) mkdir_umask=$umask;;
|
|
||||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
mkdir_umask=`expr $umask + 22 \
|
|
||||||
- $umask % 100 % 40 + $umask % 20 \
|
|
||||||
- $umask % 10 % 4 + $umask % 2
|
|
||||||
`;;
|
|
||||||
*) mkdir_umask=$umask,go-w;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# With -d, create the new directory with the user-specified mode.
|
|
||||||
# Otherwise, rely on $mkdir_umask.
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
mkdir_mode=-m$mode
|
|
||||||
else
|
|
||||||
mkdir_mode=
|
|
||||||
fi
|
|
||||||
|
|
||||||
posix_mkdir=false
|
|
||||||
case $umask in
|
|
||||||
*[123567][0-7][0-7])
|
|
||||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
|
||||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
|
||||||
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
|
||||||
|
|
||||||
if (umask $mkdir_umask &&
|
|
||||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
if test -z "$dir_arg" || {
|
|
||||||
# Check for POSIX incompatibilities with -m.
|
|
||||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
|
||||||
# other-writeable bit of parent directory when it shouldn't.
|
|
||||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
|
||||||
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
|
||||||
case $ls_ld_tmpdir in
|
|
||||||
d????-?r-*) different_mode=700;;
|
|
||||||
d????-?--*) different_mode=755;;
|
|
||||||
*) false;;
|
|
||||||
esac &&
|
|
||||||
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
|
||||||
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
|
||||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
then posix_mkdir=:
|
|
||||||
fi
|
|
||||||
rmdir "$tmpdir/d" "$tmpdir"
|
|
||||||
else
|
|
||||||
# Remove any dirs left behind by ancient mkdir implementations.
|
|
||||||
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
|
||||||
fi
|
|
||||||
trap '' 0;;
|
|
||||||
esac;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if
|
|
||||||
$posix_mkdir && (
|
|
||||||
umask $mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
|
||||||
)
|
|
||||||
then :
|
|
||||||
else
|
|
||||||
|
|
||||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
|
||||||
# or it failed possibly due to a race condition. Create the
|
|
||||||
# directory the slow way, step by step, checking for races as we go.
|
|
||||||
|
|
||||||
case $dstdir in
|
|
||||||
/*) prefix='/';;
|
|
||||||
-*) prefix='./';;
|
|
||||||
*) prefix='';;
|
|
||||||
esac
|
|
||||||
|
|
||||||
eval "$initialize_posix_glob"
|
|
||||||
|
|
||||||
oIFS=$IFS
|
|
||||||
IFS=/
|
|
||||||
$posix_glob set -f
|
|
||||||
set fnord $dstdir
|
|
||||||
shift
|
|
||||||
$posix_glob set +f
|
|
||||||
IFS=$oIFS
|
|
||||||
|
|
||||||
prefixes=
|
|
||||||
|
|
||||||
for d
|
|
||||||
do
|
|
||||||
test -z "$d" && continue
|
|
||||||
|
|
||||||
prefix=$prefix$d
|
|
||||||
if test -d "$prefix"; then
|
|
||||||
prefixes=
|
|
||||||
else
|
|
||||||
if $posix_mkdir; then
|
|
||||||
(umask=$mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
test -d "$prefix" || exit 1
|
|
||||||
else
|
|
||||||
case $prefix in
|
|
||||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
|
||||||
*) qprefix=$prefix;;
|
|
||||||
esac
|
|
||||||
prefixes="$prefixes '$qprefix'"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
prefix=$prefix/
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -n "$prefixes"; then
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
(umask $mkdir_umask &&
|
|
||||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
|
||||||
test -d "$dstdir" || exit 1
|
|
||||||
obsolete_mkdir_used=true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
|
||||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
|
||||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
|
||||||
else
|
|
||||||
|
|
||||||
# Make a couple of temp file names in the proper directory.
|
|
||||||
dsttmp=$dstdir/_inst.$$_
|
|
||||||
rmtmp=$dstdir/_rm.$$_
|
|
||||||
|
|
||||||
# Trap to clean up those temp files at exit.
|
|
||||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
|
||||||
|
|
||||||
# Copy the file name to the temp name.
|
|
||||||
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
|
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits.
|
|
||||||
#
|
|
||||||
# If any of these fail, we abort the whole thing. If we want to
|
|
||||||
# ignore errors from any of these, just make sure not to ignore
|
|
||||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
|
||||||
#
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
|
||||||
|
|
||||||
# If -C, don't bother to copy if it wouldn't change the file.
|
|
||||||
if $copy_on_change &&
|
|
||||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
|
||||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
|
||||||
|
|
||||||
eval "$initialize_posix_glob" &&
|
|
||||||
$posix_glob set -f &&
|
|
||||||
set X $old && old=:$2:$4:$5:$6 &&
|
|
||||||
set X $new && new=:$2:$4:$5:$6 &&
|
|
||||||
$posix_glob set +f &&
|
|
||||||
|
|
||||||
test "$old" = "$new" &&
|
|
||||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
rm -f "$dsttmp"
|
|
||||||
else
|
|
||||||
# Rename the file to the real destination.
|
|
||||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
|
||||||
|
|
||||||
# The rename failed, perhaps because mv can't rename something else
|
|
||||||
# to itself, or perhaps because mv is so ancient that it does not
|
|
||||||
# support -f.
|
|
||||||
{
|
|
||||||
# Now remove or move aside any old file at destination location.
|
|
||||||
# We try this two ways since rm can't unlink itself on some
|
|
||||||
# systems and the destination file might be busy for other
|
|
||||||
# reasons. In this case, the final cleanup might fail but the new
|
|
||||||
# file should still install successfully.
|
|
||||||
{
|
|
||||||
test ! -f "$dst" ||
|
|
||||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
|
||||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
|
||||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
|
||||||
} ||
|
|
||||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
|
||||||
(exit 1); exit 1
|
|
||||||
}
|
|
||||||
} &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
$doit $mvcmd "$dsttmp" "$dst"
|
|
||||||
}
|
|
||||||
fi || exit 1
|
|
||||||
|
|
||||||
trap '' 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
File diff suppressed because it is too large
Load Diff
@ -1,376 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# Common stub for a few missing GNU programs while installing.
|
|
||||||
|
|
||||||
scriptversion=2009-04-28.21; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
|
|
||||||
# 2008, 2009 Free Software Foundation, Inc.
|
|
||||||
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
echo 1>&2 "Try \`$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
run=:
|
|
||||||
sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
|
|
||||||
sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
|
|
||||||
|
|
||||||
# In the cases where this matters, `missing' is being run in the
|
|
||||||
# srcdir already.
|
|
||||||
if test -f configure.ac; then
|
|
||||||
configure_ac=configure.ac
|
|
||||||
else
|
|
||||||
configure_ac=configure.in
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg="missing on your system"
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
--run)
|
|
||||||
# Try to run requested program, and just exit if it succeeds.
|
|
||||||
run=
|
|
||||||
shift
|
|
||||||
"$@" && exit 0
|
|
||||||
# Exit code 63 means version mismatch. This often happens
|
|
||||||
# when the user try to use an ancient version of a tool on
|
|
||||||
# a file that requires a minimum version. In this case we
|
|
||||||
# we should proceed has if the program had been absent, or
|
|
||||||
# if --run hadn't been passed.
|
|
||||||
if test $? = 63; then
|
|
||||||
run=:
|
|
||||||
msg="probably too old"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
-h|--h|--he|--hel|--help)
|
|
||||||
echo "\
|
|
||||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
|
||||||
|
|
||||||
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
|
||||||
error status if there is no known handling for PROGRAM.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-h, --help display this help and exit
|
|
||||||
-v, --version output version information and exit
|
|
||||||
--run try to run the given command, and emulate it if it fails
|
|
||||||
|
|
||||||
Supported PROGRAM values:
|
|
||||||
aclocal touch file \`aclocal.m4'
|
|
||||||
autoconf touch file \`configure'
|
|
||||||
autoheader touch file \`config.h.in'
|
|
||||||
autom4te touch the output file, or create a stub one
|
|
||||||
automake touch all \`Makefile.in' files
|
|
||||||
bison create \`y.tab.[ch]', if possible, from existing .[ch]
|
|
||||||
flex create \`lex.yy.c', if possible, from existing .c
|
|
||||||
help2man touch the output file
|
|
||||||
lex create \`lex.yy.c', if possible, from existing .c
|
|
||||||
makeinfo touch the output file
|
|
||||||
tar try tar, gnutar, gtar, then tar without non-portable flags
|
|
||||||
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
|
|
||||||
|
|
||||||
Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
|
|
||||||
\`g' are ignored when checking the name.
|
|
||||||
|
|
||||||
Send bug reports to <bug-automake@gnu.org>."
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
|
||||||
echo "missing $scriptversion (GNU Automake)"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
-*)
|
|
||||||
echo 1>&2 "$0: Unknown \`$1' option"
|
|
||||||
echo 1>&2 "Try \`$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
esac
|
|
||||||
|
|
||||||
# normalize program name to check for.
|
|
||||||
program=`echo "$1" | sed '
|
|
||||||
s/^gnu-//; t
|
|
||||||
s/^gnu//; t
|
|
||||||
s/^g//; t'`
|
|
||||||
|
|
||||||
# Now exit if we have it, but it failed. Also exit now if we
|
|
||||||
# don't have it and --version was passed (most likely to detect
|
|
||||||
# the program). This is about non-GNU programs, so use $1 not
|
|
||||||
# $program.
|
|
||||||
case $1 in
|
|
||||||
lex*|yacc*)
|
|
||||||
# Not GNU programs, they don't have --version.
|
|
||||||
;;
|
|
||||||
|
|
||||||
tar*)
|
|
||||||
if test -n "$run"; then
|
|
||||||
echo 1>&2 "ERROR: \`tar' requires --run"
|
|
||||||
exit 1
|
|
||||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
|
||||||
# We have it, but it failed.
|
|
||||||
exit 1
|
|
||||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
|
||||||
# Could not run --version or --help. This is probably someone
|
|
||||||
# running `$TOOL --version' or `$TOOL --help' to check whether
|
|
||||||
# $TOOL exists and not knowing $TOOL uses missing.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# If it does not exist, or fails to run (possibly an outdated version),
|
|
||||||
# try to emulate it.
|
|
||||||
case $program in
|
|
||||||
aclocal*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
|
|
||||||
to install the \`Automake' and \`Perl' packages. Grab them from
|
|
||||||
any GNU archive site."
|
|
||||||
touch aclocal.m4
|
|
||||||
;;
|
|
||||||
|
|
||||||
autoconf*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`${configure_ac}'. You might want to install the
|
|
||||||
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
|
||||||
archive site."
|
|
||||||
touch configure
|
|
||||||
;;
|
|
||||||
|
|
||||||
autoheader*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`acconfig.h' or \`${configure_ac}'. You might want
|
|
||||||
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
|
||||||
from any GNU archive site."
|
|
||||||
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
|
|
||||||
test -z "$files" && files="config.h"
|
|
||||||
touch_files=
|
|
||||||
for f in $files; do
|
|
||||||
case $f in
|
|
||||||
*:*) touch_files="$touch_files "`echo "$f" |
|
|
||||||
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
|
|
||||||
*) touch_files="$touch_files $f.in";;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
touch $touch_files
|
|
||||||
;;
|
|
||||||
|
|
||||||
automake*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
|
|
||||||
You might want to install the \`Automake' and \`Perl' packages.
|
|
||||||
Grab them from any GNU archive site."
|
|
||||||
find . -type f -name Makefile.am -print |
|
|
||||||
sed 's/\.am$/.in/' |
|
|
||||||
while read f; do touch "$f"; done
|
|
||||||
;;
|
|
||||||
|
|
||||||
autom4te*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is needed, but is $msg.
|
|
||||||
You might have modified some files without having the
|
|
||||||
proper tools for further handling them.
|
|
||||||
You can get \`$1' as part of \`Autoconf' from any GNU
|
|
||||||
archive site."
|
|
||||||
|
|
||||||
file=`echo "$*" | sed -n "$sed_output"`
|
|
||||||
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
|
||||||
if test -f "$file"; then
|
|
||||||
touch $file
|
|
||||||
else
|
|
||||||
test -z "$file" || exec >$file
|
|
||||||
echo "#! /bin/sh"
|
|
||||||
echo "# Created by GNU Automake missing as a replacement of"
|
|
||||||
echo "# $ $@"
|
|
||||||
echo "exit 0"
|
|
||||||
chmod +x $file
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
bison*|yacc*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' $msg. You should only need it if
|
|
||||||
you modified a \`.y' file. You may need the \`Bison' package
|
|
||||||
in order for those modifications to take effect. You can get
|
|
||||||
\`Bison' from any GNU archive site."
|
|
||||||
rm -f y.tab.c y.tab.h
|
|
||||||
if test $# -ne 1; then
|
|
||||||
eval LASTARG="\${$#}"
|
|
||||||
case $LASTARG in
|
|
||||||
*.y)
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
|
|
||||||
if test -f "$SRCFILE"; then
|
|
||||||
cp "$SRCFILE" y.tab.c
|
|
||||||
fi
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
|
|
||||||
if test -f "$SRCFILE"; then
|
|
||||||
cp "$SRCFILE" y.tab.h
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if test ! -f y.tab.h; then
|
|
||||||
echo >y.tab.h
|
|
||||||
fi
|
|
||||||
if test ! -f y.tab.c; then
|
|
||||||
echo 'main() { return 0; }' >y.tab.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
lex*|flex*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a \`.l' file. You may need the \`Flex' package
|
|
||||||
in order for those modifications to take effect. You can get
|
|
||||||
\`Flex' from any GNU archive site."
|
|
||||||
rm -f lex.yy.c
|
|
||||||
if test $# -ne 1; then
|
|
||||||
eval LASTARG="\${$#}"
|
|
||||||
case $LASTARG in
|
|
||||||
*.l)
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
|
|
||||||
if test -f "$SRCFILE"; then
|
|
||||||
cp "$SRCFILE" lex.yy.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if test ! -f lex.yy.c; then
|
|
||||||
echo 'main() { return 0; }' >lex.yy.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
help2man*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a dependency of a manual page. You may need the
|
|
||||||
\`Help2man' package in order for those modifications to take
|
|
||||||
effect. You can get \`Help2man' from any GNU archive site."
|
|
||||||
|
|
||||||
file=`echo "$*" | sed -n "$sed_output"`
|
|
||||||
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
|
||||||
if test -f "$file"; then
|
|
||||||
touch $file
|
|
||||||
else
|
|
||||||
test -z "$file" || exec >$file
|
|
||||||
echo ".ab help2man is required to generate this page"
|
|
||||||
exit $?
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
makeinfo*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a \`.texi' or \`.texinfo' file, or any other file
|
|
||||||
indirectly affecting the aspect of the manual. The spurious
|
|
||||||
call might also be the consequence of using a buggy \`make' (AIX,
|
|
||||||
DU, IRIX). You might want to install the \`Texinfo' package or
|
|
||||||
the \`GNU make' package. Grab either from any GNU archive site."
|
|
||||||
# The file to touch is that specified with -o ...
|
|
||||||
file=`echo "$*" | sed -n "$sed_output"`
|
|
||||||
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
|
||||||
if test -z "$file"; then
|
|
||||||
# ... or it is the one specified with @setfilename ...
|
|
||||||
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
|
||||||
file=`sed -n '
|
|
||||||
/^@setfilename/{
|
|
||||||
s/.* \([^ ]*\) *$/\1/
|
|
||||||
p
|
|
||||||
q
|
|
||||||
}' $infile`
|
|
||||||
# ... or it is derived from the source name (dir/f.texi becomes f.info)
|
|
||||||
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
|
|
||||||
fi
|
|
||||||
# If the file does not exist, the user really needs makeinfo;
|
|
||||||
# let's fail without touching anything.
|
|
||||||
test -f $file || exit 1
|
|
||||||
touch $file
|
|
||||||
;;
|
|
||||||
|
|
||||||
tar*)
|
|
||||||
shift
|
|
||||||
|
|
||||||
# We have already tried tar in the generic part.
|
|
||||||
# Look for gnutar/gtar before invocation to avoid ugly error
|
|
||||||
# messages.
|
|
||||||
if (gnutar --version > /dev/null 2>&1); then
|
|
||||||
gnutar "$@" && exit 0
|
|
||||||
fi
|
|
||||||
if (gtar --version > /dev/null 2>&1); then
|
|
||||||
gtar "$@" && exit 0
|
|
||||||
fi
|
|
||||||
firstarg="$1"
|
|
||||||
if shift; then
|
|
||||||
case $firstarg in
|
|
||||||
*o*)
|
|
||||||
firstarg=`echo "$firstarg" | sed s/o//`
|
|
||||||
tar "$firstarg" "$@" && exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
case $firstarg in
|
|
||||||
*h*)
|
|
||||||
firstarg=`echo "$firstarg" | sed s/h//`
|
|
||||||
tar "$firstarg" "$@" && exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: I can't seem to be able to run \`tar' with the given arguments.
|
|
||||||
You may want to install GNU tar or Free paxutils, or check the
|
|
||||||
command line arguments."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is needed, and is $msg.
|
|
||||||
You might have modified some files without having the
|
|
||||||
proper tools for further handling them. Check the \`README' file,
|
|
||||||
it often tells you about the needed prerequisites for installing
|
|
||||||
this package. You may also peek at any GNU archive site, in case
|
|
||||||
some other package would contain this missing \`$1' program."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
@ -56,6 +56,16 @@ macro(config_compiler_and_linker)
|
|||||||
# Newlines inside flags variables break CMake's NMake generator.
|
# Newlines inside flags variables break CMake's NMake generator.
|
||||||
# TODO(vladl@google.com): Add -RTCs and -RTCu to debug builds.
|
# TODO(vladl@google.com): Add -RTCs and -RTCu to debug builds.
|
||||||
set(cxx_base_flags "-GS -W4 -WX -wd4127 -wd4251 -wd4275 -nologo -J -Zi")
|
set(cxx_base_flags "-GS -W4 -WX -wd4127 -wd4251 -wd4275 -nologo -J -Zi")
|
||||||
|
if (MSVC_VERSION LESS 1400)
|
||||||
|
# Suppress spurious warnings MSVC 7.1 sometimes issues.
|
||||||
|
# Forcing value to bool.
|
||||||
|
set(cxx_base_flags "${cxx_base_flags} -wd4800")
|
||||||
|
# Copy constructor and assignment operator could not be generated.
|
||||||
|
set(cxx_base_flags "${cxx_base_flags} -wd4511 -wd4512")
|
||||||
|
# Compatibility warnings not applicable to Google Test.
|
||||||
|
# Resolved overload was found by argument-dependent lookup.
|
||||||
|
set(cxx_base_flags "${cxx_base_flags} -wd4675")
|
||||||
|
endif()
|
||||||
set(cxx_base_flags "${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32")
|
set(cxx_base_flags "${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32")
|
||||||
set(cxx_base_flags "${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN")
|
set(cxx_base_flags "${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN")
|
||||||
set(cxx_exception_flags "-EHsc -D_HAS_EXCEPTIONS=1")
|
set(cxx_exception_flags "-EHsc -D_HAS_EXCEPTIONS=1")
|
||||||
|
17482
cpp/tests/gmock/gtest/configure
vendored
17482
cpp/tests/gmock/gtest/configure
vendored
File diff suppressed because it is too large
Load Diff
@ -11,7 +11,7 @@ AC_INIT([Google C++ Testing Framework],
|
|||||||
|
|
||||||
# Provide various options to initialize the Autoconf and configure processes.
|
# Provide various options to initialize the Autoconf and configure processes.
|
||||||
AC_PREREQ([2.59])
|
AC_PREREQ([2.59])
|
||||||
AC_CONFIG_SRCDIR([./COPYING])
|
AC_CONFIG_SRCDIR([./LICENSE])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
AC_CONFIG_HEADERS([build-aux/config.h])
|
AC_CONFIG_HEADERS([build-aux/config.h])
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,39 +0,0 @@
|
|||||||
// Copyright 2006, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
GTEST_API_ int main(int argc, char **argv) {
|
|
||||||
std::cout << "Running main() from gtest_main.cc\n";
|
|
||||||
|
|
||||||
testing::InitGoogleTest(&argc, argv);
|
|
||||||
return RUN_ALL_TESTS();
|
|
||||||
}
|
|
@ -694,7 +694,10 @@ inline void UniversalTersePrint(char* str, ::std::ostream* os) {
|
|||||||
// NUL-terminated string.
|
// NUL-terminated string.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void UniversalPrint(const T& value, ::std::ostream* os) {
|
void UniversalPrint(const T& value, ::std::ostream* os) {
|
||||||
UniversalPrinter<T>::Print(value, os);
|
// A workarond for the bug in VC++ 7.1 that prevents us from instantiating
|
||||||
|
// UniversalPrinter with T directly.
|
||||||
|
typedef T T1;
|
||||||
|
UniversalPrinter<T1>::Print(value, os);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GTEST_HAS_TR1_TUPLE
|
#if GTEST_HAS_TR1_TUPLE
|
||||||
|
@ -1107,11 +1107,13 @@ class GTEST_API_ UnitTest {
|
|||||||
|
|
||||||
// Returns the TestCase object for the test that's currently running,
|
// Returns the TestCase object for the test that's currently running,
|
||||||
// or NULL if no test is running.
|
// or NULL if no test is running.
|
||||||
const TestCase* current_test_case() const;
|
const TestCase* current_test_case() const
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_);
|
||||||
|
|
||||||
// Returns the TestInfo object for the test that's currently running,
|
// Returns the TestInfo object for the test that's currently running,
|
||||||
// or NULL if no test is running.
|
// or NULL if no test is running.
|
||||||
const TestInfo* current_test_info() const;
|
const TestInfo* current_test_info() const
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_);
|
||||||
|
|
||||||
// Returns the random seed used at the start of the current test run.
|
// Returns the random seed used at the start of the current test run.
|
||||||
int random_seed() const;
|
int random_seed() const;
|
||||||
@ -1121,7 +1123,8 @@ class GTEST_API_ UnitTest {
|
|||||||
// value-parameterized tests and instantiate and register them.
|
// value-parameterized tests and instantiate and register them.
|
||||||
//
|
//
|
||||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||||
internal::ParameterizedTestCaseRegistry& parameterized_test_registry();
|
internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_);
|
||||||
#endif // GTEST_HAS_PARAM_TEST
|
#endif // GTEST_HAS_PARAM_TEST
|
||||||
|
|
||||||
// Gets the number of successful test cases.
|
// Gets the number of successful test cases.
|
||||||
@ -1152,6 +1155,10 @@ class GTEST_API_ UnitTest {
|
|||||||
// Gets the number of tests that should run.
|
// Gets the number of tests that should run.
|
||||||
int test_to_run_count() const;
|
int test_to_run_count() const;
|
||||||
|
|
||||||
|
// Gets the time of the test program start, in ms from the start of the
|
||||||
|
// UNIX epoch.
|
||||||
|
TimeInMillis start_timestamp() const;
|
||||||
|
|
||||||
// Gets the elapsed time, in milliseconds.
|
// Gets the elapsed time, in milliseconds.
|
||||||
TimeInMillis elapsed_time() const;
|
TimeInMillis elapsed_time() const;
|
||||||
|
|
||||||
@ -1190,7 +1197,8 @@ class GTEST_API_ UnitTest {
|
|||||||
const char* file_name,
|
const char* file_name,
|
||||||
int line_number,
|
int line_number,
|
||||||
const internal::String& message,
|
const internal::String& message,
|
||||||
const internal::String& os_stack_trace);
|
const internal::String& os_stack_trace)
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_);
|
||||||
|
|
||||||
// Adds a TestProperty to the current TestResult object. If the result already
|
// Adds a TestProperty to the current TestResult object. If the result already
|
||||||
// contains a property with the same key, the value will be updated.
|
// contains a property with the same key, the value will be updated.
|
||||||
@ -1223,10 +1231,12 @@ class GTEST_API_ UnitTest {
|
|||||||
|
|
||||||
// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
|
// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
|
||||||
// Google Test trace stack.
|
// Google Test trace stack.
|
||||||
void PushGTestTrace(const internal::TraceInfo& trace);
|
void PushGTestTrace(const internal::TraceInfo& trace)
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_);
|
||||||
|
|
||||||
// Pops a trace from the per-thread Google Test trace stack.
|
// Pops a trace from the per-thread Google Test trace stack.
|
||||||
void PopGTestTrace();
|
void PopGTestTrace()
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_);
|
||||||
|
|
||||||
// Protects mutable state in *impl_. This is mutable as some const
|
// Protects mutable state in *impl_. This is mutable as some const
|
||||||
// methods need to lock it too.
|
// methods need to lock it too.
|
||||||
|
@ -122,7 +122,7 @@ class TestInfoImpl; // Opaque implementation of TestInfo
|
|||||||
class UnitTestImpl; // Opaque implementation of UnitTest
|
class UnitTestImpl; // Opaque implementation of UnitTest
|
||||||
|
|
||||||
// How many times InitGoogleTest() has been called.
|
// How many times InitGoogleTest() has been called.
|
||||||
extern int g_init_gtest_count;
|
GTEST_API_ extern int g_init_gtest_count;
|
||||||
|
|
||||||
// The text used in failure messages to indicate the start of the
|
// The text used in failure messages to indicate the start of the
|
||||||
// stack trace.
|
// stack trace.
|
||||||
@ -797,13 +797,19 @@ struct RemoveConst<const T> { typedef T type; }; // NOLINT
|
|||||||
// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
|
// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
|
||||||
// definition to fail to remove the const in 'const int[3]' and 'const
|
// definition to fail to remove the const in 'const int[3]' and 'const
|
||||||
// char[3][4]'. The following specialization works around the bug.
|
// char[3][4]'. The following specialization works around the bug.
|
||||||
// However, it causes trouble with GCC and thus needs to be
|
|
||||||
// conditionally compiled.
|
|
||||||
#if defined(_MSC_VER) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
|
|
||||||
template <typename T, size_t N>
|
template <typename T, size_t N>
|
||||||
struct RemoveConst<const T[N]> {
|
struct RemoveConst<const T[N]> {
|
||||||
typedef typename RemoveConst<T>::type type[N];
|
typedef typename RemoveConst<T>::type type[N];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1400
|
||||||
|
// This is the only specialization that allows VC++ 7.1 to remove const in
|
||||||
|
// 'const int[3] and 'const int[3][4]'. However, it causes trouble with GCC
|
||||||
|
// and thus needs to be conditionally compiled.
|
||||||
|
template <typename T, size_t N>
|
||||||
|
struct RemoveConst<T[N]> {
|
||||||
|
typedef typename RemoveConst<T>::type type[N];
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// A handy wrapper around RemoveConst that works when the argument
|
// A handy wrapper around RemoveConst that works when the argument
|
||||||
|
@ -105,8 +105,8 @@ class linked_ptr_internal {
|
|||||||
// framework.
|
// framework.
|
||||||
|
|
||||||
// Join an existing circle.
|
// Join an existing circle.
|
||||||
// L < g_linked_ptr_mutex
|
void join(linked_ptr_internal const* ptr)
|
||||||
void join(linked_ptr_internal const* ptr) {
|
GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
|
||||||
MutexLock lock(&g_linked_ptr_mutex);
|
MutexLock lock(&g_linked_ptr_mutex);
|
||||||
|
|
||||||
linked_ptr_internal const* p = ptr;
|
linked_ptr_internal const* p = ptr;
|
||||||
@ -117,8 +117,8 @@ class linked_ptr_internal {
|
|||||||
|
|
||||||
// Leave whatever circle we're part of. Returns true if we were the
|
// Leave whatever circle we're part of. Returns true if we were the
|
||||||
// last member of the circle. Once this is done, you can join() another.
|
// last member of the circle. Once this is done, you can join() another.
|
||||||
// L < g_linked_ptr_mutex
|
bool depart()
|
||||||
bool depart() {
|
GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
|
||||||
MutexLock lock(&g_linked_ptr_mutex);
|
MutexLock lock(&g_linked_ptr_mutex);
|
||||||
|
|
||||||
if (next_ == this) return true;
|
if (next_ == this) return true;
|
||||||
|
@ -95,7 +95,7 @@ class ValueArray2 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_};
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,7 +114,8 @@ class ValueArray3 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_};
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
|
static_cast<T>(v3_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +136,8 @@ class ValueArray4 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_};
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
|
static_cast<T>(v3_), static_cast<T>(v4_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,7 +159,8 @@ class ValueArray5 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_};
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,7 +184,9 @@ class ValueArray6 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,7 +211,9 @@ class ValueArray7 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,7 +240,9 @@ class ValueArray8 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,7 +270,10 @@ class ValueArray9 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,7 +302,10 @@ class ValueArray10 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -321,7 +336,10 @@ class ValueArray11 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,8 +371,11 @@ class ValueArray12 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_};
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -388,8 +409,11 @@ class ValueArray13 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_};
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -424,8 +448,11 @@ class ValueArray14 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_};
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -461,8 +488,12 @@ class ValueArray15 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_};
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -501,8 +532,12 @@ class ValueArray16 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_};
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -542,8 +577,12 @@ class ValueArray17 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_};
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -584,8 +623,13 @@ class ValueArray18 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_};
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -627,8 +671,13 @@ class ValueArray19 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -672,8 +721,13 @@ class ValueArray20 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -719,8 +773,14 @@ class ValueArray21 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -767,8 +827,14 @@ class ValueArray22 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -817,9 +883,14 @@ class ValueArray23 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v23_};
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -869,9 +940,15 @@ class ValueArray24 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_};
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -922,9 +999,15 @@ class ValueArray25 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_};
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -977,9 +1060,15 @@ class ValueArray26 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_};
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1034,9 +1123,16 @@ class ValueArray27 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_};
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1092,9 +1188,16 @@ class ValueArray28 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_};
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1151,9 +1254,16 @@ class ValueArray29 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_};
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1212,9 +1322,17 @@ class ValueArray30 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_};
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1275,9 +1393,17 @@ class ValueArray31 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1339,9 +1465,17 @@ class ValueArray32 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1405,9 +1539,18 @@ class ValueArray33 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1472,9 +1615,18 @@ class ValueArray34 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1540,10 +1692,18 @@ class ValueArray35 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v35_};
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1611,10 +1771,19 @@ class ValueArray36 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_};
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1684,10 +1853,19 @@ class ValueArray37 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_};
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1758,10 +1936,19 @@ class ValueArray38 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_};
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1833,10 +2020,20 @@ class ValueArray39 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_, v39_};
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
|
||||||
|
static_cast<T>(v39_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1910,10 +2107,20 @@ class ValueArray40 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_, v39_, v40_};
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
|
||||||
|
static_cast<T>(v39_), static_cast<T>(v40_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1989,10 +2196,20 @@ class ValueArray41 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_, v39_, v40_, v41_};
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
|
||||||
|
static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2069,10 +2286,21 @@ class ValueArray42 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_, v39_, v40_, v41_, v42_};
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
|
||||||
|
static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
|
||||||
|
static_cast<T>(v42_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2150,10 +2378,21 @@ class ValueArray43 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
|
||||||
|
static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
|
||||||
|
static_cast<T>(v42_), static_cast<T>(v43_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2233,10 +2472,21 @@ class ValueArray44 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
|
||||||
|
static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
|
||||||
|
static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2317,10 +2567,22 @@ class ValueArray45 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
|
||||||
|
static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
|
||||||
|
static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
|
||||||
|
static_cast<T>(v45_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2403,10 +2665,22 @@ class ValueArray46 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
|
||||||
|
static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
|
||||||
|
static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
|
||||||
|
static_cast<T>(v45_), static_cast<T>(v46_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2491,11 +2765,22 @@ class ValueArray47 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
v47_};
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
|
||||||
|
static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
|
||||||
|
static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
|
||||||
|
static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2581,11 +2866,23 @@ class ValueArray48 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
v48_};
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
|
||||||
|
static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
|
||||||
|
static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
|
||||||
|
static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
|
||||||
|
static_cast<T>(v48_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2672,11 +2969,23 @@ class ValueArray49 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
v48_, v49_};
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
|
||||||
|
static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
|
||||||
|
static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
|
||||||
|
static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
|
||||||
|
static_cast<T>(v48_), static_cast<T>(v49_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2764,11 +3073,23 @@ class ValueArray50 {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
|
const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
|
||||||
v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
|
static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
|
||||||
v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
|
static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
|
||||||
v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
|
static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
|
||||||
v48_, v49_, v50_};
|
static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
|
||||||
|
static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
|
||||||
|
static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
|
||||||
|
static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
|
||||||
|
static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
|
||||||
|
static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
|
||||||
|
static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
|
||||||
|
static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
|
||||||
|
static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
|
||||||
|
static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
|
||||||
|
static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
|
||||||
|
static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
|
||||||
|
static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ class ValueArray$i {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator ParamGenerator<T>() const {
|
operator ParamGenerator<T>() const {
|
||||||
const T array[] = {$for j, [[v$(j)_]]};
|
const T array[] = {$for j, [[static_cast<T>(v$(j)_)]]};
|
||||||
return ValuesIn(array);
|
return ValuesIn(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,6 +91,8 @@
|
|||||||
// GTEST_OS_LINUX_ANDROID - Google Android
|
// GTEST_OS_LINUX_ANDROID - Google Android
|
||||||
// GTEST_OS_MAC - Mac OS X
|
// GTEST_OS_MAC - Mac OS X
|
||||||
// GTEST_OS_NACL - Google Native Client (NaCl)
|
// GTEST_OS_NACL - Google Native Client (NaCl)
|
||||||
|
// GTEST_OS_OPENBSD - OpenBSD
|
||||||
|
// GTEST_OS_QNX - QNX
|
||||||
// GTEST_OS_SOLARIS - Sun Solaris
|
// GTEST_OS_SOLARIS - Sun Solaris
|
||||||
// GTEST_OS_SYMBIAN - Symbian
|
// GTEST_OS_SYMBIAN - Symbian
|
||||||
// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile)
|
// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile)
|
||||||
@ -175,7 +177,7 @@
|
|||||||
// GTEST_FLAG() - references a flag.
|
// GTEST_FLAG() - references a flag.
|
||||||
// GTEST_DECLARE_*() - declares a flag.
|
// GTEST_DECLARE_*() - declares a flag.
|
||||||
// GTEST_DEFINE_*() - defines a flag.
|
// GTEST_DEFINE_*() - defines a flag.
|
||||||
// GetArgvs() - returns the command line as a vector of strings.
|
// GetInjectableArgvs() - returns the command line as a vector of strings.
|
||||||
//
|
//
|
||||||
// Environment variable utilities:
|
// Environment variable utilities:
|
||||||
// GetEnv() - gets the value of an environment variable.
|
// GetEnv() - gets the value of an environment variable.
|
||||||
@ -242,6 +244,10 @@
|
|||||||
# define GTEST_OS_HPUX 1
|
# define GTEST_OS_HPUX 1
|
||||||
#elif defined __native_client__
|
#elif defined __native_client__
|
||||||
# define GTEST_OS_NACL 1
|
# define GTEST_OS_NACL 1
|
||||||
|
#elif defined __OpenBSD__
|
||||||
|
# define GTEST_OS_OPENBSD 1
|
||||||
|
#elif defined __QNX__
|
||||||
|
# define GTEST_OS_QNX 1
|
||||||
#endif // __CYGWIN__
|
#endif // __CYGWIN__
|
||||||
|
|
||||||
// Brings in definitions for functions used in the testing::internal::posix
|
// Brings in definitions for functions used in the testing::internal::posix
|
||||||
@ -417,7 +423,8 @@
|
|||||||
//
|
//
|
||||||
// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
|
// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
|
||||||
// to your compiler flags.
|
// to your compiler flags.
|
||||||
# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX)
|
# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
|
||||||
|
|| GTEST_OS_QNX)
|
||||||
#endif // GTEST_HAS_PTHREAD
|
#endif // GTEST_HAS_PTHREAD
|
||||||
|
|
||||||
#if GTEST_HAS_PTHREAD
|
#if GTEST_HAS_PTHREAD
|
||||||
@ -449,8 +456,9 @@
|
|||||||
// defining __GNUC__ and friends, but cannot compile GCC's tuple
|
// defining __GNUC__ and friends, but cannot compile GCC's tuple
|
||||||
// implementation. MSVC 2008 (9.0) provides TR1 tuple in a 323 MB
|
// implementation. MSVC 2008 (9.0) provides TR1 tuple in a 323 MB
|
||||||
// Feature Pack download, which we cannot assume the user has.
|
// Feature Pack download, which we cannot assume the user has.
|
||||||
# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000)) \
|
// QNX's QCC compiler is a modified GCC but it doesn't support TR1 tuple.
|
||||||
|| _MSC_VER >= 1600
|
# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
|
||||||
|
&& !GTEST_OS_QNX) || _MSC_VER >= 1600
|
||||||
# define GTEST_USE_OWN_TR1_TUPLE 0
|
# define GTEST_USE_OWN_TR1_TUPLE 0
|
||||||
# else
|
# else
|
||||||
# define GTEST_USE_OWN_TR1_TUPLE 1
|
# define GTEST_USE_OWN_TR1_TUPLE 1
|
||||||
@ -540,7 +548,8 @@
|
|||||||
// pops up a dialog window that cannot be suppressed programmatically.
|
// pops up a dialog window that cannot be suppressed programmatically.
|
||||||
#if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
|
#if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
|
||||||
(GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
|
(GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
|
||||||
GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX)
|
GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
|
||||||
|
GTEST_OS_OPENBSD || GTEST_OS_QNX)
|
||||||
# define GTEST_HAS_DEATH_TEST 1
|
# define GTEST_HAS_DEATH_TEST 1
|
||||||
# include <vector> // NOLINT
|
# include <vector> // NOLINT
|
||||||
#endif
|
#endif
|
||||||
@ -669,6 +678,13 @@
|
|||||||
# define GTEST_NO_INLINE_
|
# define GTEST_NO_INLINE_
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
|
||||||
|
#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
|
||||||
|
# define GTEST_HAS_CXXABI_H_ 1
|
||||||
|
#else
|
||||||
|
# define GTEST_HAS_CXXABI_H_ 0
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace testing {
|
namespace testing {
|
||||||
|
|
||||||
class Message;
|
class Message;
|
||||||
@ -1053,11 +1069,12 @@ GTEST_API_ String GetCapturedStderr();
|
|||||||
|
|
||||||
#if GTEST_HAS_DEATH_TEST
|
#if GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
// A copy of all command line arguments. Set by InitGoogleTest().
|
const ::std::vector<testing::internal::string>& GetInjectableArgvs();
|
||||||
extern ::std::vector<String> g_argvs;
|
void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
|
||||||
|
new_argvs);
|
||||||
|
|
||||||
// GTEST_HAS_DEATH_TEST implies we have ::std::string.
|
// A copy of all command line arguments. Set by InitGoogleTest().
|
||||||
const ::std::vector<String>& GetArgvs();
|
extern ::std::vector<testing::internal::string> g_argvs;
|
||||||
|
|
||||||
#endif // GTEST_HAS_DEATH_TEST
|
#endif // GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
@ -1399,6 +1416,8 @@ class ThreadLocal {
|
|||||||
class Mutex {
|
class Mutex {
|
||||||
public:
|
public:
|
||||||
Mutex() {}
|
Mutex() {}
|
||||||
|
void Lock() {}
|
||||||
|
void Unlock() {}
|
||||||
void AssertHeld() const {}
|
void AssertHeld() const {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1666,6 +1685,23 @@ inline void Abort() { abort(); }
|
|||||||
|
|
||||||
} // namespace posix
|
} // namespace posix
|
||||||
|
|
||||||
|
// MSVC "deprecates" snprintf and issues warnings wherever it is used. In
|
||||||
|
// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
|
||||||
|
// MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate
|
||||||
|
// function in order to achieve that. We use macro definition here because
|
||||||
|
// snprintf is a variadic function.
|
||||||
|
#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
|
||||||
|
// MSVC 2005 and above support variadic macros.
|
||||||
|
# define GTEST_SNPRINTF_(buffer, size, format, ...) \
|
||||||
|
_snprintf_s(buffer, size, size, format, __VA_ARGS__)
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
|
||||||
|
// complain about _snprintf.
|
||||||
|
# define GTEST_SNPRINTF_ _snprintf
|
||||||
|
#else
|
||||||
|
# define GTEST_SNPRINTF_ snprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
// The maximum number a BiggestInt can represent. This definition
|
// The maximum number a BiggestInt can represent. This definition
|
||||||
// works no matter BiggestInt is represented in one's complement or
|
// works no matter BiggestInt is represented in one's complement or
|
||||||
// two's complement.
|
// two's complement.
|
||||||
@ -1755,6 +1791,10 @@ typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds.
|
|||||||
#define GTEST_DEFINE_string_(name, default_val, doc) \
|
#define GTEST_DEFINE_string_(name, default_val, doc) \
|
||||||
GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val)
|
GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val)
|
||||||
|
|
||||||
|
// Thread annotations
|
||||||
|
#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
|
||||||
|
#define GTEST_LOCK_EXCLUDED_(locks)
|
||||||
|
|
||||||
// Parses 'str' for a 32-bit signed integer. If successful, writes the result
|
// Parses 'str' for a 32-bit signed integer. If successful, writes the result
|
||||||
// to *value and returns true; otherwise leaves *value unchanged and returns
|
// to *value and returns true; otherwise leaves *value unchanged and returns
|
||||||
// false.
|
// false.
|
||||||
|
@ -49,11 +49,11 @@
|
|||||||
|
|
||||||
// #ifdef __GNUC__ is too general here. It is possible to use gcc without using
|
// #ifdef __GNUC__ is too general here. It is possible to use gcc without using
|
||||||
// libstdc++ (which is where cxxabi.h comes from).
|
// libstdc++ (which is where cxxabi.h comes from).
|
||||||
# ifdef __GLIBCXX__
|
# if GTEST_HAS_CXXABI_H_
|
||||||
# include <cxxabi.h>
|
# include <cxxabi.h>
|
||||||
# elif defined(__HP_aCC)
|
# elif defined(__HP_aCC)
|
||||||
# include <acxx_demangle.h>
|
# include <acxx_demangle.h>
|
||||||
# endif // __GLIBCXX__
|
# endif // GTEST_HASH_CXXABI_H_
|
||||||
|
|
||||||
namespace testing {
|
namespace testing {
|
||||||
namespace internal {
|
namespace internal {
|
||||||
@ -66,20 +66,20 @@ String GetTypeName() {
|
|||||||
# if GTEST_HAS_RTTI
|
# if GTEST_HAS_RTTI
|
||||||
|
|
||||||
const char* const name = typeid(T).name();
|
const char* const name = typeid(T).name();
|
||||||
# if defined(__GLIBCXX__) || defined(__HP_aCC)
|
# if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
|
||||||
int status = 0;
|
int status = 0;
|
||||||
// gcc's implementation of typeid(T).name() mangles the type name,
|
// gcc's implementation of typeid(T).name() mangles the type name,
|
||||||
// so we have to demangle it.
|
// so we have to demangle it.
|
||||||
# ifdef __GLIBCXX__
|
# if GTEST_HAS_CXXABI_H_
|
||||||
using abi::__cxa_demangle;
|
using abi::__cxa_demangle;
|
||||||
# endif // __GLIBCXX__
|
# endif // GTEST_HAS_CXXABI_H_
|
||||||
char* const readable_name = __cxa_demangle(name, 0, 0, &status);
|
char* const readable_name = __cxa_demangle(name, 0, 0, &status);
|
||||||
const String name_str(status == 0 ? readable_name : name);
|
const String name_str(status == 0 ? readable_name : name);
|
||||||
free(readable_name);
|
free(readable_name);
|
||||||
return name_str;
|
return name_str;
|
||||||
# else
|
# else
|
||||||
return name;
|
return name;
|
||||||
# endif // __GLIBCXX__ || __HP_aCC
|
# endif // GTEST_HAS_CXXABI_H_ || __HP_aCC
|
||||||
|
|
||||||
# else
|
# else
|
||||||
|
|
||||||
|
@ -47,11 +47,11 @@ $var n = 50 $$ Maximum length of type lists we want to support.
|
|||||||
|
|
||||||
// #ifdef __GNUC__ is too general here. It is possible to use gcc without using
|
// #ifdef __GNUC__ is too general here. It is possible to use gcc without using
|
||||||
// libstdc++ (which is where cxxabi.h comes from).
|
// libstdc++ (which is where cxxabi.h comes from).
|
||||||
# ifdef __GLIBCXX__
|
# if GTEST_HAS_CXXABI_H_
|
||||||
# include <cxxabi.h>
|
# include <cxxabi.h>
|
||||||
# elif defined(__HP_aCC)
|
# elif defined(__HP_aCC)
|
||||||
# include <acxx_demangle.h>
|
# include <acxx_demangle.h>
|
||||||
# endif // __GLIBCXX__
|
# endif // GTEST_HASH_CXXABI_H_
|
||||||
|
|
||||||
namespace testing {
|
namespace testing {
|
||||||
namespace internal {
|
namespace internal {
|
||||||
@ -64,20 +64,20 @@ String GetTypeName() {
|
|||||||
# if GTEST_HAS_RTTI
|
# if GTEST_HAS_RTTI
|
||||||
|
|
||||||
const char* const name = typeid(T).name();
|
const char* const name = typeid(T).name();
|
||||||
# if defined(__GLIBCXX__) || defined(__HP_aCC)
|
# if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
|
||||||
int status = 0;
|
int status = 0;
|
||||||
// gcc's implementation of typeid(T).name() mangles the type name,
|
// gcc's implementation of typeid(T).name() mangles the type name,
|
||||||
// so we have to demangle it.
|
// so we have to demangle it.
|
||||||
# ifdef __GLIBCXX__
|
# if GTEST_HAS_CXXABI_H_
|
||||||
using abi::__cxa_demangle;
|
using abi::__cxa_demangle;
|
||||||
# endif // __GLIBCXX__
|
# endif // GTEST_HAS_CXXABI_H_
|
||||||
char* const readable_name = __cxa_demangle(name, 0, 0, &status);
|
char* const readable_name = __cxa_demangle(name, 0, 0, &status);
|
||||||
const String name_str(status == 0 ? readable_name : name);
|
const String name_str(status == 0 ? readable_name : name);
|
||||||
free(readable_name);
|
free(readable_name);
|
||||||
return name_str;
|
return name_str;
|
||||||
# else
|
# else
|
||||||
return name;
|
return name;
|
||||||
# endif // __GLIBCXX__ || __HP_aCC
|
# endif // GTEST_HAS_CXXABI_H_ || __HP_aCC
|
||||||
|
|
||||||
# else
|
# else
|
||||||
|
|
||||||
|
7377
cpp/tests/gmock/gtest/m4/libtool.m4
vendored
7377
cpp/tests/gmock/gtest/m4/libtool.m4
vendored
File diff suppressed because it is too large
Load Diff
368
cpp/tests/gmock/gtest/m4/ltoptions.m4
vendored
368
cpp/tests/gmock/gtest/m4/ltoptions.m4
vendored
@ -1,368 +0,0 @@
|
|||||||
# Helper functions for option handling. -*- Autoconf -*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
|
||||||
# Written by Gary V. Vaughan, 2004
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation gives
|
|
||||||
# unlimited permission to copy and/or distribute it, with or without
|
|
||||||
# modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# serial 6 ltoptions.m4
|
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
||||||
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
|
|
||||||
# ------------------------------------------
|
|
||||||
m4_define([_LT_MANGLE_OPTION],
|
|
||||||
[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
|
|
||||||
# ---------------------------------------
|
|
||||||
# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
|
|
||||||
# matching handler defined, dispatch to it. Other OPTION-NAMEs are
|
|
||||||
# saved as a flag.
|
|
||||||
m4_define([_LT_SET_OPTION],
|
|
||||||
[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
|
|
||||||
m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
|
|
||||||
_LT_MANGLE_DEFUN([$1], [$2]),
|
|
||||||
[m4_warning([Unknown $1 option `$2'])])[]dnl
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
|
|
||||||
# ------------------------------------------------------------
|
|
||||||
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
|
|
||||||
m4_define([_LT_IF_OPTION],
|
|
||||||
[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
|
|
||||||
# -------------------------------------------------------
|
|
||||||
# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
|
|
||||||
# are set.
|
|
||||||
m4_define([_LT_UNLESS_OPTIONS],
|
|
||||||
[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
|
||||||
[m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
|
|
||||||
[m4_define([$0_found])])])[]dnl
|
|
||||||
m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
|
|
||||||
])[]dnl
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
|
|
||||||
# ----------------------------------------
|
|
||||||
# OPTION-LIST is a space-separated list of Libtool options associated
|
|
||||||
# with MACRO-NAME. If any OPTION has a matching handler declared with
|
|
||||||
# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
|
|
||||||
# the unknown option and exit.
|
|
||||||
m4_defun([_LT_SET_OPTIONS],
|
|
||||||
[# Set options
|
|
||||||
m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
|
||||||
[_LT_SET_OPTION([$1], _LT_Option)])
|
|
||||||
|
|
||||||
m4_if([$1],[LT_INIT],[
|
|
||||||
dnl
|
|
||||||
dnl Simply set some default values (i.e off) if boolean options were not
|
|
||||||
dnl specified:
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
|
|
||||||
])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
|
|
||||||
])
|
|
||||||
dnl
|
|
||||||
dnl If no reference was made to various pairs of opposing options, then
|
|
||||||
dnl we run the default mode handler for the pair. For example, if neither
|
|
||||||
dnl `shared' nor `disable-shared' was passed, we enable building of shared
|
|
||||||
dnl archives by default:
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
|
|
||||||
[_LT_ENABLE_FAST_INSTALL])
|
|
||||||
])
|
|
||||||
])# _LT_SET_OPTIONS
|
|
||||||
|
|
||||||
|
|
||||||
## --------------------------------- ##
|
|
||||||
## Macros to handle LT_INIT options. ##
|
|
||||||
## --------------------------------- ##
|
|
||||||
|
|
||||||
# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
|
|
||||||
# -----------------------------------------
|
|
||||||
m4_define([_LT_MANGLE_DEFUN],
|
|
||||||
[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
|
|
||||||
|
|
||||||
|
|
||||||
# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
|
|
||||||
# -----------------------------------------------
|
|
||||||
m4_define([LT_OPTION_DEFINE],
|
|
||||||
[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
|
|
||||||
])# LT_OPTION_DEFINE
|
|
||||||
|
|
||||||
|
|
||||||
# dlopen
|
|
||||||
# ------
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AC_LIBTOOL_DLOPEN],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [dlopen])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
|
||||||
put the `dlopen' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
|
|
||||||
|
|
||||||
|
|
||||||
# win32-dll
|
|
||||||
# ---------
|
|
||||||
# Declare package support for building win32 dll's.
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [win32-dll],
|
|
||||||
[enable_win32_dll=yes
|
|
||||||
|
|
||||||
case $host in
|
|
||||||
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)
|
|
||||||
AC_CHECK_TOOL(AS, as, false)
|
|
||||||
AC_CHECK_TOOL(DLLTOOL, dlltool, false)
|
|
||||||
AC_CHECK_TOOL(OBJDUMP, objdump, false)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
test -z "$AS" && AS=as
|
|
||||||
_LT_DECL([], [AS], [0], [Assembler program])dnl
|
|
||||||
|
|
||||||
test -z "$DLLTOOL" && DLLTOOL=dlltool
|
|
||||||
_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
|
|
||||||
|
|
||||||
test -z "$OBJDUMP" && OBJDUMP=objdump
|
|
||||||
_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
|
|
||||||
])# win32-dll
|
|
||||||
|
|
||||||
AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
|
|
||||||
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
|
||||||
_LT_SET_OPTION([LT_INIT], [win32-dll])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
|
||||||
put the `win32-dll' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_ENABLE_SHARED([DEFAULT])
|
|
||||||
# ----------------------------
|
|
||||||
# implement the --enable-shared flag, and supports the `shared' and
|
|
||||||
# `disable-shared' LT_INIT options.
|
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
|
||||||
m4_define([_LT_ENABLE_SHARED],
|
|
||||||
[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
|
||||||
AC_ARG_ENABLE([shared],
|
|
||||||
[AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
|
|
||||||
[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
|
|
||||||
[p=${PACKAGE-default}
|
|
||||||
case $enableval in
|
|
||||||
yes) enable_shared=yes ;;
|
|
||||||
no) enable_shared=no ;;
|
|
||||||
*)
|
|
||||||
enable_shared=no
|
|
||||||
# Look at the argument we got. We use all the common list separators.
|
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
|
||||||
for pkg in $enableval; do
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
if test "X$pkg" = "X$p"; then
|
|
||||||
enable_shared=yes
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
|
|
||||||
|
|
||||||
_LT_DECL([build_libtool_libs], [enable_shared], [0],
|
|
||||||
[Whether or not to build shared libraries])
|
|
||||||
])# _LT_ENABLE_SHARED
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
|
|
||||||
|
|
||||||
# Old names:
|
|
||||||
AC_DEFUN([AC_ENABLE_SHARED],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([AC_DISABLE_SHARED],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-shared])
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
|
|
||||||
AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AM_ENABLE_SHARED], [])
|
|
||||||
dnl AC_DEFUN([AM_DISABLE_SHARED], [])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_ENABLE_STATIC([DEFAULT])
|
|
||||||
# ----------------------------
|
|
||||||
# implement the --enable-static flag, and support the `static' and
|
|
||||||
# `disable-static' LT_INIT options.
|
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
|
||||||
m4_define([_LT_ENABLE_STATIC],
|
|
||||||
[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
|
||||||
AC_ARG_ENABLE([static],
|
|
||||||
[AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
|
|
||||||
[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
|
|
||||||
[p=${PACKAGE-default}
|
|
||||||
case $enableval in
|
|
||||||
yes) enable_static=yes ;;
|
|
||||||
no) enable_static=no ;;
|
|
||||||
*)
|
|
||||||
enable_static=no
|
|
||||||
# Look at the argument we got. We use all the common list separators.
|
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
|
||||||
for pkg in $enableval; do
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
if test "X$pkg" = "X$p"; then
|
|
||||||
enable_static=yes
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_static=]_LT_ENABLE_STATIC_DEFAULT)
|
|
||||||
|
|
||||||
_LT_DECL([build_old_libs], [enable_static], [0],
|
|
||||||
[Whether or not to build static libraries])
|
|
||||||
])# _LT_ENABLE_STATIC
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
|
|
||||||
|
|
||||||
# Old names:
|
|
||||||
AC_DEFUN([AC_ENABLE_STATIC],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([AC_DISABLE_STATIC],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-static])
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
|
|
||||||
AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AM_ENABLE_STATIC], [])
|
|
||||||
dnl AC_DEFUN([AM_DISABLE_STATIC], [])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_ENABLE_FAST_INSTALL([DEFAULT])
|
|
||||||
# ----------------------------------
|
|
||||||
# implement the --enable-fast-install flag, and support the `fast-install'
|
|
||||||
# and `disable-fast-install' LT_INIT options.
|
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
|
||||||
m4_define([_LT_ENABLE_FAST_INSTALL],
|
|
||||||
[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
|
||||||
AC_ARG_ENABLE([fast-install],
|
|
||||||
[AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
|
|
||||||
[optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
|
|
||||||
[p=${PACKAGE-default}
|
|
||||||
case $enableval in
|
|
||||||
yes) enable_fast_install=yes ;;
|
|
||||||
no) enable_fast_install=no ;;
|
|
||||||
*)
|
|
||||||
enable_fast_install=no
|
|
||||||
# Look at the argument we got. We use all the common list separators.
|
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
|
||||||
for pkg in $enableval; do
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
if test "X$pkg" = "X$p"; then
|
|
||||||
enable_fast_install=yes
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
|
|
||||||
|
|
||||||
_LT_DECL([fast_install], [enable_fast_install], [0],
|
|
||||||
[Whether or not to optimize for fast installation])dnl
|
|
||||||
])# _LT_ENABLE_FAST_INSTALL
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
|
|
||||||
|
|
||||||
# Old names:
|
|
||||||
AU_DEFUN([AC_ENABLE_FAST_INSTALL],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
|
||||||
the `fast-install' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AC_DISABLE_FAST_INSTALL],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
|
||||||
the `disable-fast-install' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
|
|
||||||
dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_WITH_PIC([MODE])
|
|
||||||
# --------------------
|
|
||||||
# implement the --with-pic flag, and support the `pic-only' and `no-pic'
|
|
||||||
# LT_INIT options.
|
|
||||||
# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
|
|
||||||
m4_define([_LT_WITH_PIC],
|
|
||||||
[AC_ARG_WITH([pic],
|
|
||||||
[AS_HELP_STRING([--with-pic],
|
|
||||||
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
|
|
||||||
[pic_mode="$withval"],
|
|
||||||
[pic_mode=default])
|
|
||||||
|
|
||||||
test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
|
|
||||||
|
|
||||||
_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
|
|
||||||
])# _LT_WITH_PIC
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
|
|
||||||
|
|
||||||
# Old name:
|
|
||||||
AU_DEFUN([AC_LIBTOOL_PICMODE],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [pic-only])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
|
||||||
put the `pic-only' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
|
|
||||||
|
|
||||||
## ----------------- ##
|
|
||||||
## LTDL_INIT Options ##
|
|
||||||
## ----------------- ##
|
|
||||||
|
|
||||||
m4_define([_LTDL_MODE], [])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
|
|
||||||
[m4_define([_LTDL_MODE], [nonrecursive])])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [recursive],
|
|
||||||
[m4_define([_LTDL_MODE], [recursive])])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [subproject],
|
|
||||||
[m4_define([_LTDL_MODE], [subproject])])
|
|
||||||
|
|
||||||
m4_define([_LTDL_TYPE], [])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [installable],
|
|
||||||
[m4_define([_LTDL_TYPE], [installable])])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [convenience],
|
|
||||||
[m4_define([_LTDL_TYPE], [convenience])])
|
|
123
cpp/tests/gmock/gtest/m4/ltsugar.m4
vendored
123
cpp/tests/gmock/gtest/m4/ltsugar.m4
vendored
@ -1,123 +0,0 @@
|
|||||||
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
|
||||||
# Written by Gary V. Vaughan, 2004
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation gives
|
|
||||||
# unlimited permission to copy and/or distribute it, with or without
|
|
||||||
# modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# serial 6 ltsugar.m4
|
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
||||||
AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_join(SEP, ARG1, [ARG2...])
|
|
||||||
# -----------------------------
|
|
||||||
# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
|
|
||||||
# associated separator.
|
|
||||||
# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
|
|
||||||
# versions in m4sugar had bugs.
|
|
||||||
m4_define([lt_join],
|
|
||||||
[m4_if([$#], [1], [],
|
|
||||||
[$#], [2], [[$2]],
|
|
||||||
[m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
|
|
||||||
m4_define([_lt_join],
|
|
||||||
[m4_if([$#$2], [2], [],
|
|
||||||
[m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_car(LIST)
|
|
||||||
# lt_cdr(LIST)
|
|
||||||
# ------------
|
|
||||||
# Manipulate m4 lists.
|
|
||||||
# These macros are necessary as long as will still need to support
|
|
||||||
# Autoconf-2.59 which quotes differently.
|
|
||||||
m4_define([lt_car], [[$1]])
|
|
||||||
m4_define([lt_cdr],
|
|
||||||
[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
|
|
||||||
[$#], 1, [],
|
|
||||||
[m4_dquote(m4_shift($@))])])
|
|
||||||
m4_define([lt_unquote], $1)
|
|
||||||
|
|
||||||
|
|
||||||
# lt_append(MACRO-NAME, STRING, [SEPARATOR])
|
|
||||||
# ------------------------------------------
|
|
||||||
# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
|
|
||||||
# Note that neither SEPARATOR nor STRING are expanded; they are appended
|
|
||||||
# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
|
|
||||||
# No SEPARATOR is output if MACRO-NAME was previously undefined (different
|
|
||||||
# than defined and empty).
|
|
||||||
#
|
|
||||||
# This macro is needed until we can rely on Autoconf 2.62, since earlier
|
|
||||||
# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
|
|
||||||
m4_define([lt_append],
|
|
||||||
[m4_define([$1],
|
|
||||||
m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
|
|
||||||
# ----------------------------------------------------------
|
|
||||||
# Produce a SEP delimited list of all paired combinations of elements of
|
|
||||||
# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list
|
|
||||||
# has the form PREFIXmINFIXSUFFIXn.
|
|
||||||
# Needed until we can rely on m4_combine added in Autoconf 2.62.
|
|
||||||
m4_define([lt_combine],
|
|
||||||
[m4_if(m4_eval([$# > 3]), [1],
|
|
||||||
[m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
|
|
||||||
[[m4_foreach([_Lt_prefix], [$2],
|
|
||||||
[m4_foreach([_Lt_suffix],
|
|
||||||
]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
|
|
||||||
[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
|
|
||||||
# -----------------------------------------------------------------------
|
|
||||||
# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
|
|
||||||
# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
|
|
||||||
m4_define([lt_if_append_uniq],
|
|
||||||
[m4_ifdef([$1],
|
|
||||||
[m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
|
|
||||||
[lt_append([$1], [$2], [$3])$4],
|
|
||||||
[$5])],
|
|
||||||
[lt_append([$1], [$2], [$3])$4])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_add(DICT, KEY, VALUE)
|
|
||||||
# -----------------------------
|
|
||||||
m4_define([lt_dict_add],
|
|
||||||
[m4_define([$1($2)], [$3])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
|
|
||||||
# --------------------------------------------
|
|
||||||
m4_define([lt_dict_add_subkey],
|
|
||||||
[m4_define([$1($2:$3)], [$4])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_fetch(DICT, KEY, [SUBKEY])
|
|
||||||
# ----------------------------------
|
|
||||||
m4_define([lt_dict_fetch],
|
|
||||||
[m4_ifval([$3],
|
|
||||||
m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
|
|
||||||
m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
|
|
||||||
# -----------------------------------------------------------------
|
|
||||||
m4_define([lt_if_dict_fetch],
|
|
||||||
[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
|
|
||||||
[$5],
|
|
||||||
[$6])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
|
|
||||||
# --------------------------------------------------------------
|
|
||||||
m4_define([lt_dict_filter],
|
|
||||||
[m4_if([$5], [], [],
|
|
||||||
[lt_join(m4_quote(m4_default([$4], [[, ]])),
|
|
||||||
lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
|
|
||||||
[lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
|
|
||||||
])
|
|
23
cpp/tests/gmock/gtest/m4/ltversion.m4
vendored
23
cpp/tests/gmock/gtest/m4/ltversion.m4
vendored
@ -1,23 +0,0 @@
|
|||||||
# ltversion.m4 -- version numbers -*- Autoconf -*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004 Free Software Foundation, Inc.
|
|
||||||
# Written by Scott James Remnant, 2004
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation gives
|
|
||||||
# unlimited permission to copy and/or distribute it, with or without
|
|
||||||
# modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# Generated from ltversion.in.
|
|
||||||
|
|
||||||
# serial 3017 ltversion.m4
|
|
||||||
# This file is part of GNU Libtool
|
|
||||||
|
|
||||||
m4_define([LT_PACKAGE_VERSION], [2.2.6b])
|
|
||||||
m4_define([LT_PACKAGE_REVISION], [1.3017])
|
|
||||||
|
|
||||||
AC_DEFUN([LTVERSION_VERSION],
|
|
||||||
[macro_version='2.2.6b'
|
|
||||||
macro_revision='1.3017'
|
|
||||||
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
|
|
||||||
_LT_DECL(, macro_revision, 0)
|
|
||||||
])
|
|
92
cpp/tests/gmock/gtest/m4/lt~obsolete.m4
vendored
92
cpp/tests/gmock/gtest/m4/lt~obsolete.m4
vendored
@ -1,92 +0,0 @@
|
|||||||
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
|
|
||||||
# Written by Scott James Remnant, 2004.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation gives
|
|
||||||
# unlimited permission to copy and/or distribute it, with or without
|
|
||||||
# modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# serial 4 lt~obsolete.m4
|
|
||||||
|
|
||||||
# These exist entirely to fool aclocal when bootstrapping libtool.
|
|
||||||
#
|
|
||||||
# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
|
|
||||||
# which have later been changed to m4_define as they aren't part of the
|
|
||||||
# exported API, or moved to Autoconf or Automake where they belong.
|
|
||||||
#
|
|
||||||
# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN
|
|
||||||
# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
|
|
||||||
# using a macro with the same name in our local m4/libtool.m4 it'll
|
|
||||||
# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
|
|
||||||
# and doesn't know about Autoconf macros at all.)
|
|
||||||
#
|
|
||||||
# So we provide this file, which has a silly filename so it's always
|
|
||||||
# included after everything else. This provides aclocal with the
|
|
||||||
# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
|
|
||||||
# because those macros already exist, or will be overwritten later.
|
|
||||||
# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
|
|
||||||
#
|
|
||||||
# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
|
|
||||||
# Yes, that means every name once taken will need to remain here until
|
|
||||||
# we give up compatibility with versions before 1.7, at which point
|
|
||||||
# we need to keep only those names which we still refer to.
|
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
||||||
AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
|
|
||||||
|
|
||||||
m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
|
|
||||||
m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])])
|
|
||||||
m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
|
|
||||||
m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])])
|
|
||||||
m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
|
|
||||||
m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])])
|
|
||||||
m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])])
|
|
||||||
m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
|
|
||||||
m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])])
|
|
||||||
m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])])
|
|
||||||
m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
|
|
||||||
m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
|
|
||||||
m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
|
|
||||||
m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])])
|
|
||||||
m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])])
|
|
||||||
m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
|
|
||||||
m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
|
|
||||||
m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])])
|
|
||||||
m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])])
|
|
||||||
m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])])
|
|
||||||
m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
|
|
||||||
m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
|
|
||||||
m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])])
|
|
||||||
m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
|
|
||||||
m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])])
|
|
||||||
m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
|
|
@ -117,20 +117,20 @@ TEST_F(IntegerFunctionTest, Factorial) {
|
|||||||
// Tests IsPrime()
|
// Tests IsPrime()
|
||||||
TEST_F(IntegerFunctionTest, IsPrime) {
|
TEST_F(IntegerFunctionTest, IsPrime) {
|
||||||
// Tests negative input.
|
// Tests negative input.
|
||||||
EXPECT_TRUE(!IsPrime(-1));
|
EXPECT_FALSE(IsPrime(-1));
|
||||||
EXPECT_TRUE(!IsPrime(-2));
|
EXPECT_FALSE(IsPrime(-2));
|
||||||
EXPECT_TRUE(!IsPrime(INT_MIN));
|
EXPECT_FALSE(IsPrime(INT_MIN));
|
||||||
|
|
||||||
// Tests some trivial cases.
|
// Tests some trivial cases.
|
||||||
EXPECT_TRUE(!IsPrime(0));
|
EXPECT_FALSE(IsPrime(0));
|
||||||
EXPECT_TRUE(!IsPrime(1));
|
EXPECT_FALSE(IsPrime(1));
|
||||||
EXPECT_TRUE(IsPrime(2));
|
EXPECT_TRUE(IsPrime(2));
|
||||||
EXPECT_TRUE(IsPrime(3));
|
EXPECT_TRUE(IsPrime(3));
|
||||||
|
|
||||||
// Tests positive input.
|
// Tests positive input.
|
||||||
EXPECT_TRUE(!IsPrime(4));
|
EXPECT_FALSE(IsPrime(4));
|
||||||
EXPECT_TRUE(IsPrime(5));
|
EXPECT_TRUE(IsPrime(5));
|
||||||
EXPECT_TRUE(!IsPrime(6));
|
EXPECT_FALSE(IsPrime(6));
|
||||||
EXPECT_TRUE(IsPrime(23));
|
EXPECT_TRUE(IsPrime(23));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1387
cpp/tests/gmock/gtest/scripts/upload.py
Executable file
1387
cpp/tests/gmock/gtest/scripts/upload.py
Executable file
File diff suppressed because it is too large
Load Diff
78
cpp/tests/gmock/gtest/scripts/upload_gtest.py
Executable file
78
cpp/tests/gmock/gtest/scripts/upload_gtest.py
Executable file
@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# Copyright 2009, Google Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above
|
||||||
|
# copyright notice, this list of conditions and the following disclaimer
|
||||||
|
# in the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
# * Neither the name of Google Inc. nor the names of its
|
||||||
|
# contributors may be used to endorse or promote products derived from
|
||||||
|
# this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
"""upload_gtest.py v0.1.0 -- uploads a Google Test patch for review.
|
||||||
|
|
||||||
|
This simple wrapper passes all command line flags and
|
||||||
|
--cc=googletestframework@googlegroups.com to upload.py.
|
||||||
|
|
||||||
|
USAGE: upload_gtest.py [options for upload.py]
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
CC_FLAG = '--cc='
|
||||||
|
GTEST_GROUP = 'googletestframework@googlegroups.com'
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Finds the path to upload.py, assuming it is in the same directory
|
||||||
|
# as this file.
|
||||||
|
my_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
upload_py_path = os.path.join(my_dir, 'upload.py')
|
||||||
|
|
||||||
|
# Adds Google Test discussion group to the cc line if it's not there
|
||||||
|
# already.
|
||||||
|
upload_py_argv = [upload_py_path]
|
||||||
|
found_cc_flag = False
|
||||||
|
for arg in sys.argv[1:]:
|
||||||
|
if arg.startswith(CC_FLAG):
|
||||||
|
found_cc_flag = True
|
||||||
|
cc_line = arg[len(CC_FLAG):]
|
||||||
|
cc_list = [addr for addr in cc_line.split(',') if addr]
|
||||||
|
if GTEST_GROUP not in cc_list:
|
||||||
|
cc_list.append(GTEST_GROUP)
|
||||||
|
upload_py_argv.append(CC_FLAG + ','.join(cc_list))
|
||||||
|
else:
|
||||||
|
upload_py_argv.append(arg)
|
||||||
|
|
||||||
|
if not found_cc_flag:
|
||||||
|
upload_py_argv.append(CC_FLAG + GTEST_GROUP)
|
||||||
|
|
||||||
|
# Invokes upload.py with the modified command line flags.
|
||||||
|
os.execv(upload_py_path, upload_py_argv)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
@ -43,6 +43,11 @@
|
|||||||
# include <errno.h>
|
# include <errno.h>
|
||||||
# include <fcntl.h>
|
# include <fcntl.h>
|
||||||
# include <limits.h>
|
# include <limits.h>
|
||||||
|
|
||||||
|
# if GTEST_OS_LINUX
|
||||||
|
# include <signal.h>
|
||||||
|
# endif // GTEST_OS_LINUX
|
||||||
|
|
||||||
# include <stdarg.h>
|
# include <stdarg.h>
|
||||||
|
|
||||||
# if GTEST_OS_WINDOWS
|
# if GTEST_OS_WINDOWS
|
||||||
@ -52,6 +57,10 @@
|
|||||||
# include <sys/wait.h>
|
# include <sys/wait.h>
|
||||||
# endif // GTEST_OS_WINDOWS
|
# endif // GTEST_OS_WINDOWS
|
||||||
|
|
||||||
|
# if GTEST_OS_QNX
|
||||||
|
# include <spawn.h>
|
||||||
|
# endif // GTEST_OS_QNX
|
||||||
|
|
||||||
#endif // GTEST_HAS_DEATH_TEST
|
#endif // GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
#include "gtest/gtest-message.h"
|
#include "gtest/gtest-message.h"
|
||||||
@ -835,6 +844,11 @@ class ExecDeathTest : public ForkingDeathTest {
|
|||||||
ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
|
ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
|
||||||
virtual TestRole AssumeRole();
|
virtual TestRole AssumeRole();
|
||||||
private:
|
private:
|
||||||
|
static ::std::vector<testing::internal::string>
|
||||||
|
GetArgvsForDeathTestChildProcess() {
|
||||||
|
::std::vector<testing::internal::string> args = GetInjectableArgvs();
|
||||||
|
return args;
|
||||||
|
}
|
||||||
// The name of the file in which the death test is located.
|
// The name of the file in which the death test is located.
|
||||||
const char* const file_;
|
const char* const file_;
|
||||||
// The line number on which the death test is located.
|
// The line number on which the death test is located.
|
||||||
@ -894,6 +908,7 @@ extern "C" char** environ;
|
|||||||
inline char** GetEnviron() { return environ; }
|
inline char** GetEnviron() { return environ; }
|
||||||
# endif // GTEST_OS_MAC
|
# endif // GTEST_OS_MAC
|
||||||
|
|
||||||
|
# if !GTEST_OS_QNX
|
||||||
// The main function for a threadsafe-style death test child process.
|
// The main function for a threadsafe-style death test child process.
|
||||||
// This function is called in a clone()-ed process and thus must avoid
|
// This function is called in a clone()-ed process and thus must avoid
|
||||||
// any potentially unsafe operations like malloc or libc functions.
|
// any potentially unsafe operations like malloc or libc functions.
|
||||||
@ -926,6 +941,7 @@ static int ExecDeathTestChildMain(void* child_arg) {
|
|||||||
GetLastErrnoDescription().c_str()));
|
GetLastErrnoDescription().c_str()));
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
# endif // !GTEST_OS_QNX
|
||||||
|
|
||||||
// Two utility routines that together determine the direction the stack
|
// Two utility routines that together determine the direction the stack
|
||||||
// grows.
|
// grows.
|
||||||
@ -936,24 +952,75 @@ static int ExecDeathTestChildMain(void* child_arg) {
|
|||||||
// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
|
// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
|
||||||
// StackLowerThanAddress into StackGrowsDown, which then doesn't give
|
// StackLowerThanAddress into StackGrowsDown, which then doesn't give
|
||||||
// correct answer.
|
// correct answer.
|
||||||
bool StackLowerThanAddress(const void* ptr) GTEST_NO_INLINE_;
|
void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
|
||||||
bool StackLowerThanAddress(const void* ptr) {
|
void StackLowerThanAddress(const void* ptr, bool* result) {
|
||||||
int dummy;
|
int dummy;
|
||||||
return &dummy < ptr;
|
*result = (&dummy < ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StackGrowsDown() {
|
bool StackGrowsDown() {
|
||||||
int dummy;
|
int dummy;
|
||||||
return StackLowerThanAddress(&dummy);
|
bool result;
|
||||||
|
StackLowerThanAddress(&dummy, &result);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// A threadsafe implementation of fork(2) for threadsafe-style death tests
|
// Spawns a child process with the same executable as the current process in
|
||||||
// that uses clone(2). It dies with an error message if anything goes
|
// a thread-safe manner and instructs it to run the death test. The
|
||||||
// wrong.
|
// implementation uses fork(2) + exec. On systems where clone(2) is
|
||||||
static pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
|
// available, it is used instead, being slightly more thread-safe. On QNX,
|
||||||
|
// fork supports only single-threaded environments, so this function uses
|
||||||
|
// spawn(2) there instead. The function dies with an error message if
|
||||||
|
// anything goes wrong.
|
||||||
|
static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
|
||||||
ExecDeathTestArgs args = { argv, close_fd };
|
ExecDeathTestArgs args = { argv, close_fd };
|
||||||
pid_t child_pid = -1;
|
pid_t child_pid = -1;
|
||||||
|
|
||||||
|
# if GTEST_OS_QNX
|
||||||
|
// Obtains the current directory and sets it to be closed in the child
|
||||||
|
// process.
|
||||||
|
const int cwd_fd = open(".", O_RDONLY);
|
||||||
|
GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
|
||||||
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
|
||||||
|
// We need to execute the test program in the same environment where
|
||||||
|
// it was originally invoked. Therefore we change to the original
|
||||||
|
// working directory first.
|
||||||
|
const char* const original_dir =
|
||||||
|
UnitTest::GetInstance()->original_working_dir();
|
||||||
|
// We can safely call chdir() as it's a direct system call.
|
||||||
|
if (chdir(original_dir) != 0) {
|
||||||
|
DeathTestAbort(String::Format("chdir(\"%s\") failed: %s",
|
||||||
|
original_dir,
|
||||||
|
GetLastErrnoDescription().c_str()));
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fd_flags;
|
||||||
|
// Set close_fd to be closed after spawn.
|
||||||
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
|
||||||
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
|
||||||
|
fd_flags | FD_CLOEXEC));
|
||||||
|
struct inheritance inherit = {0};
|
||||||
|
// spawn is a system call.
|
||||||
|
child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
|
||||||
|
// Restores the current working directory.
|
||||||
|
GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
|
||||||
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
|
||||||
|
|
||||||
|
# else // GTEST_OS_QNX
|
||||||
|
# if GTEST_OS_LINUX
|
||||||
|
// When a SIGPROF signal is received while fork() or clone() are executing,
|
||||||
|
// the process may hang. To avoid this, we ignore SIGPROF here and re-enable
|
||||||
|
// it after the call to fork()/clone() is complete.
|
||||||
|
struct sigaction saved_sigprof_action;
|
||||||
|
struct sigaction ignore_sigprof_action;
|
||||||
|
memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
|
||||||
|
sigemptyset(&ignore_sigprof_action.sa_mask);
|
||||||
|
ignore_sigprof_action.sa_handler = SIG_IGN;
|
||||||
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
|
||||||
|
SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
|
||||||
|
# endif // GTEST_OS_LINUX
|
||||||
|
|
||||||
# if GTEST_HAS_CLONE
|
# if GTEST_HAS_CLONE
|
||||||
const bool use_fork = GTEST_FLAG(death_test_use_fork);
|
const bool use_fork = GTEST_FLAG(death_test_use_fork);
|
||||||
|
|
||||||
@ -979,6 +1046,11 @@ static pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
|
|||||||
ExecDeathTestChildMain(&args);
|
ExecDeathTestChildMain(&args);
|
||||||
_exit(0);
|
_exit(0);
|
||||||
}
|
}
|
||||||
|
# endif // GTEST_OS_QNX
|
||||||
|
# if GTEST_OS_LINUX
|
||||||
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(
|
||||||
|
sigaction(SIGPROF, &saved_sigprof_action, NULL));
|
||||||
|
# endif // GTEST_OS_LINUX
|
||||||
|
|
||||||
GTEST_DEATH_TEST_CHECK_(child_pid != -1);
|
GTEST_DEATH_TEST_CHECK_(child_pid != -1);
|
||||||
return child_pid;
|
return child_pid;
|
||||||
@ -1015,7 +1087,7 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {
|
|||||||
GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag,
|
GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag,
|
||||||
file_, line_, death_test_index, pipe_fd[1]);
|
file_, line_, death_test_index, pipe_fd[1]);
|
||||||
Arguments args;
|
Arguments args;
|
||||||
args.AddArguments(GetArgvs());
|
args.AddArguments(GetArgvsForDeathTestChildProcess());
|
||||||
args.AddArgument(filter_flag.c_str());
|
args.AddArgument(filter_flag.c_str());
|
||||||
args.AddArgument(internal_flag.c_str());
|
args.AddArgument(internal_flag.c_str());
|
||||||
|
|
||||||
@ -1026,7 +1098,7 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {
|
|||||||
// is necessary.
|
// is necessary.
|
||||||
FlushInfoLog();
|
FlushInfoLog();
|
||||||
|
|
||||||
const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]);
|
const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
|
||||||
GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
|
||||||
set_child_pid(child_pid);
|
set_child_pid(child_pid);
|
||||||
set_read_fd(pipe_fd[0]);
|
set_read_fd(pipe_fd[0]);
|
||||||
|
@ -112,6 +112,12 @@ GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
|
|||||||
// Formats the given time in milliseconds as seconds.
|
// Formats the given time in milliseconds as seconds.
|
||||||
GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
|
GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
|
||||||
|
|
||||||
|
// Converts the given time in milliseconds to a date string in the ISO 8601
|
||||||
|
// format, without the timezone information. N.B.: due to the use the
|
||||||
|
// non-reentrant localtime() function, this function is not thread safe. Do
|
||||||
|
// not use it in any code that can be called from multiple threads.
|
||||||
|
GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
|
||||||
|
|
||||||
// Parses a string for an Int32 flag, in the form of "--flag=value".
|
// Parses a string for an Int32 flag, in the form of "--flag=value".
|
||||||
//
|
//
|
||||||
// On success, stores the value of the flag in *value, and returns
|
// On success, stores the value of the flag in *value, and returns
|
||||||
@ -432,8 +438,12 @@ class OsStackTraceGetterInterface {
|
|||||||
class OsStackTraceGetter : public OsStackTraceGetterInterface {
|
class OsStackTraceGetter : public OsStackTraceGetterInterface {
|
||||||
public:
|
public:
|
||||||
OsStackTraceGetter() : caller_frame_(NULL) {}
|
OsStackTraceGetter() : caller_frame_(NULL) {}
|
||||||
virtual String CurrentStackTrace(int max_depth, int skip_count);
|
|
||||||
|
virtual String CurrentStackTrace(int max_depth, int skip_count)
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_);
|
||||||
|
|
||||||
virtual void UponLeavingGTest();
|
virtual void UponLeavingGTest();
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_);
|
||||||
|
|
||||||
// This string is inserted in place of stack frames that are part of
|
// This string is inserted in place of stack frames that are part of
|
||||||
// Google Test's implementation.
|
// Google Test's implementation.
|
||||||
@ -548,6 +558,10 @@ class GTEST_API_ UnitTestImpl {
|
|||||||
// Gets the number of tests that should run.
|
// Gets the number of tests that should run.
|
||||||
int test_to_run_count() const;
|
int test_to_run_count() const;
|
||||||
|
|
||||||
|
// Gets the time of the test program start, in ms from the start of the
|
||||||
|
// UNIX epoch.
|
||||||
|
TimeInMillis start_timestamp() const { return start_timestamp_; }
|
||||||
|
|
||||||
// Gets the elapsed time, in milliseconds.
|
// Gets the elapsed time, in milliseconds.
|
||||||
TimeInMillis elapsed_time() const { return elapsed_time_; }
|
TimeInMillis elapsed_time() const { return elapsed_time_; }
|
||||||
|
|
||||||
@ -880,6 +894,10 @@ class GTEST_API_ UnitTestImpl {
|
|||||||
// Our random number generator.
|
// Our random number generator.
|
||||||
internal::Random random_;
|
internal::Random random_;
|
||||||
|
|
||||||
|
// The time of the test program start, in ms from the start of the
|
||||||
|
// UNIX epoch.
|
||||||
|
TimeInMillis start_timestamp_;
|
||||||
|
|
||||||
// How long the test took to run, in milliseconds.
|
// How long the test took to run, in milliseconds.
|
||||||
TimeInMillis elapsed_time_;
|
TimeInMillis elapsed_time_;
|
||||||
|
|
||||||
|
@ -51,6 +51,11 @@
|
|||||||
# include <mach/vm_map.h>
|
# include <mach/vm_map.h>
|
||||||
#endif // GTEST_OS_MAC
|
#endif // GTEST_OS_MAC
|
||||||
|
|
||||||
|
#if GTEST_OS_QNX
|
||||||
|
# include <devctl.h>
|
||||||
|
# include <sys/procfs.h>
|
||||||
|
#endif // GTEST_OS_QNX
|
||||||
|
|
||||||
#include "gtest/gtest-spi.h"
|
#include "gtest/gtest-spi.h"
|
||||||
#include "gtest/gtest-message.h"
|
#include "gtest/gtest-message.h"
|
||||||
#include "gtest/internal/gtest-internal.h"
|
#include "gtest/internal/gtest-internal.h"
|
||||||
@ -98,6 +103,26 @@ size_t GetThreadCount() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif GTEST_OS_QNX
|
||||||
|
|
||||||
|
// Returns the number of threads running in the process, or 0 to indicate that
|
||||||
|
// we cannot detect it.
|
||||||
|
size_t GetThreadCount() {
|
||||||
|
const int fd = open("/proc/self/as", O_RDONLY);
|
||||||
|
if (fd < 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
procfs_info process_info;
|
||||||
|
const int status =
|
||||||
|
devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
|
||||||
|
close(fd);
|
||||||
|
if (status == EOK) {
|
||||||
|
return static_cast<size_t>(process_info.num_threads);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
size_t GetThreadCount() {
|
size_t GetThreadCount() {
|
||||||
@ -628,11 +653,23 @@ String GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); }
|
|||||||
#if GTEST_HAS_DEATH_TEST
|
#if GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
// A copy of all command line arguments. Set by InitGoogleTest().
|
// A copy of all command line arguments. Set by InitGoogleTest().
|
||||||
::std::vector<String> g_argvs;
|
::std::vector<testing::internal::string> g_argvs;
|
||||||
|
|
||||||
// Returns the command line as a vector of strings.
|
static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
|
||||||
const ::std::vector<String>& GetArgvs() { return g_argvs; }
|
NULL; // Owned.
|
||||||
|
|
||||||
|
void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
|
||||||
|
if (g_injected_test_argvs != argvs)
|
||||||
|
delete g_injected_test_argvs;
|
||||||
|
g_injected_test_argvs = argvs;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
|
||||||
|
if (g_injected_test_argvs != NULL) {
|
||||||
|
return *g_injected_test_argvs;
|
||||||
|
}
|
||||||
|
return g_argvs;
|
||||||
|
}
|
||||||
#endif // GTEST_HAS_DEATH_TEST
|
#endif // GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
#if GTEST_OS_WINDOWS_MOBILE
|
#if GTEST_OS_WINDOWS_MOBILE
|
||||||
|
@ -55,14 +55,6 @@ namespace {
|
|||||||
|
|
||||||
using ::std::ostream;
|
using ::std::ostream;
|
||||||
|
|
||||||
#if GTEST_OS_WINDOWS_MOBILE // Windows CE does not define _snprintf_s.
|
|
||||||
# define snprintf _snprintf
|
|
||||||
#elif _MSC_VER >= 1400 // VC 8.0 and later deprecate snprintf and _snprintf.
|
|
||||||
# define snprintf _snprintf_s
|
|
||||||
#elif _MSC_VER
|
|
||||||
# define snprintf _snprintf
|
|
||||||
#endif // GTEST_OS_WINDOWS_MOBILE
|
|
||||||
|
|
||||||
// Prints a segment of bytes in the given object.
|
// Prints a segment of bytes in the given object.
|
||||||
void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
|
void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
|
||||||
size_t count, ostream* os) {
|
size_t count, ostream* os) {
|
||||||
@ -77,7 +69,7 @@ void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
|
|||||||
else
|
else
|
||||||
*os << '-';
|
*os << '-';
|
||||||
}
|
}
|
||||||
snprintf(text, sizeof(text), "%02X", obj_bytes[j]);
|
GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
|
||||||
*os << text;
|
*os << text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <wctype.h>
|
#include <wctype.h>
|
||||||
|
|
||||||
@ -305,7 +306,7 @@ UInt32 Random::Generate(UInt32 range) {
|
|||||||
// Test. g_init_gtest_count is set to the number of times
|
// Test. g_init_gtest_count is set to the number of times
|
||||||
// InitGoogleTest() has been called. We don't protect this variable
|
// InitGoogleTest() has been called. We don't protect this variable
|
||||||
// under a mutex as it is only accessed in the main thread.
|
// under a mutex as it is only accessed in the main thread.
|
||||||
int g_init_gtest_count = 0;
|
GTEST_API_ int g_init_gtest_count = 0;
|
||||||
static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
|
static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
|
||||||
|
|
||||||
// Iterates over a vector of TestCases, keeping a running sum of the
|
// Iterates over a vector of TestCases, keeping a running sum of the
|
||||||
@ -360,7 +361,7 @@ void AssertHelper::operator=(const Message& message) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Mutex for linked pointers.
|
// Mutex for linked pointers.
|
||||||
GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
|
GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
|
||||||
|
|
||||||
// Application pathname gotten in InitGoogleTest.
|
// Application pathname gotten in InitGoogleTest.
|
||||||
String g_executable_path;
|
String g_executable_path;
|
||||||
@ -2707,8 +2708,6 @@ class PrettyUnitTestResultPrinter : public TestEventListener {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
static void PrintFailedTests(const UnitTest& unit_test);
|
static void PrintFailedTests(const UnitTest& unit_test);
|
||||||
|
|
||||||
internal::String test_case_name_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Fired before each iteration of tests starts.
|
// Fired before each iteration of tests starts.
|
||||||
@ -2755,11 +2754,10 @@ void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
|
void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
|
||||||
test_case_name_ = test_case.name();
|
|
||||||
const internal::String counts =
|
const internal::String counts =
|
||||||
FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
|
FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
|
||||||
ColoredPrintf(COLOR_GREEN, "[----------] ");
|
ColoredPrintf(COLOR_GREEN, "[----------] ");
|
||||||
printf("%s from %s", counts.c_str(), test_case_name_.c_str());
|
printf("%s from %s", counts.c_str(), test_case.name());
|
||||||
if (test_case.type_param() == NULL) {
|
if (test_case.type_param() == NULL) {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
} else {
|
} else {
|
||||||
@ -2770,7 +2768,7 @@ void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
|
|||||||
|
|
||||||
void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
|
void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
|
||||||
ColoredPrintf(COLOR_GREEN, "[ RUN ] ");
|
ColoredPrintf(COLOR_GREEN, "[ RUN ] ");
|
||||||
PrintTestName(test_case_name_.c_str(), test_info.name());
|
PrintTestName(test_info.test_case_name(), test_info.name());
|
||||||
printf("\n");
|
printf("\n");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
@ -2793,7 +2791,7 @@ void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
|
|||||||
} else {
|
} else {
|
||||||
ColoredPrintf(COLOR_RED, "[ FAILED ] ");
|
ColoredPrintf(COLOR_RED, "[ FAILED ] ");
|
||||||
}
|
}
|
||||||
PrintTestName(test_case_name_.c_str(), test_info.name());
|
PrintTestName(test_info.test_case_name(), test_info.name());
|
||||||
if (test_info.result()->Failed())
|
if (test_info.result()->Failed())
|
||||||
PrintFullTestCommentIfPresent(test_info);
|
PrintFullTestCommentIfPresent(test_info);
|
||||||
|
|
||||||
@ -2809,12 +2807,11 @@ void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
|
|||||||
void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
|
void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
|
||||||
if (!GTEST_FLAG(print_time)) return;
|
if (!GTEST_FLAG(print_time)) return;
|
||||||
|
|
||||||
test_case_name_ = test_case.name();
|
|
||||||
const internal::String counts =
|
const internal::String counts =
|
||||||
FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
|
FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
|
||||||
ColoredPrintf(COLOR_GREEN, "[----------] ");
|
ColoredPrintf(COLOR_GREEN, "[----------] ");
|
||||||
printf("%s from %s (%s ms total)\n\n",
|
printf("%s from %s (%s ms total)\n\n",
|
||||||
counts.c_str(), test_case_name_.c_str(),
|
counts.c_str(), test_case.name(),
|
||||||
internal::StreamableToString(test_case.elapsed_time()).c_str());
|
internal::StreamableToString(test_case.elapsed_time()).c_str());
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
@ -3199,6 +3196,32 @@ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
|
|||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Converts the given epoch time in milliseconds to a date string in the ISO
|
||||||
|
// 8601 format, without the timezone information.
|
||||||
|
std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
|
||||||
|
// Using non-reentrant version as localtime_r is not portable.
|
||||||
|
time_t seconds = static_cast<time_t>(ms / 1000);
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# pragma warning(push) // Saves the current warning state.
|
||||||
|
# pragma warning(disable:4996) // Temporarily disables warning 4996
|
||||||
|
// (function or variable may be unsafe).
|
||||||
|
const struct tm* const time_struct = localtime(&seconds); // NOLINT
|
||||||
|
# pragma warning(pop) // Restores the warning state again.
|
||||||
|
#else
|
||||||
|
const struct tm* const time_struct = localtime(&seconds); // NOLINT
|
||||||
|
#endif
|
||||||
|
if (time_struct == NULL)
|
||||||
|
return ""; // Invalid ms value
|
||||||
|
|
||||||
|
return String::Format("%d-%02d-%02dT%02d:%02d:%02d", // YYYY-MM-DDThh:mm:ss
|
||||||
|
time_struct->tm_year + 1900,
|
||||||
|
time_struct->tm_mon + 1,
|
||||||
|
time_struct->tm_mday,
|
||||||
|
time_struct->tm_hour,
|
||||||
|
time_struct->tm_min,
|
||||||
|
time_struct->tm_sec);
|
||||||
|
}
|
||||||
|
|
||||||
// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
|
// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
|
||||||
void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
|
void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
|
||||||
const char* data) {
|
const char* data) {
|
||||||
@ -3295,10 +3318,11 @@ void XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out,
|
|||||||
fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
|
fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
|
||||||
fprintf(out,
|
fprintf(out,
|
||||||
"<testsuites tests=\"%d\" failures=\"%d\" disabled=\"%d\" "
|
"<testsuites tests=\"%d\" failures=\"%d\" disabled=\"%d\" "
|
||||||
"errors=\"0\" time=\"%s\" ",
|
"errors=\"0\" timestamp=\"%s\" time=\"%s\" ",
|
||||||
unit_test.total_test_count(),
|
unit_test.total_test_count(),
|
||||||
unit_test.failed_test_count(),
|
unit_test.failed_test_count(),
|
||||||
unit_test.disabled_test_count(),
|
unit_test.disabled_test_count(),
|
||||||
|
FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()).c_str(),
|
||||||
FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str());
|
FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str());
|
||||||
if (GTEST_FLAG(shuffle)) {
|
if (GTEST_FLAG(shuffle)) {
|
||||||
fprintf(out, "random_seed=\"%d\" ", unit_test.random_seed());
|
fprintf(out, "random_seed=\"%d\" ", unit_test.random_seed());
|
||||||
@ -3504,8 +3528,8 @@ void StreamingListener::MakeConnection() {
|
|||||||
|
|
||||||
// Pushes the given source file location and message onto a per-thread
|
// Pushes the given source file location and message onto a per-thread
|
||||||
// trace stack maintained by Google Test.
|
// trace stack maintained by Google Test.
|
||||||
// L < UnitTest::mutex_
|
ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
|
||||||
ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {
|
GTEST_LOCK_EXCLUDED_(UnitTest::mutex_) {
|
||||||
TraceInfo trace;
|
TraceInfo trace;
|
||||||
trace.file = file;
|
trace.file = file;
|
||||||
trace.line = line;
|
trace.line = line;
|
||||||
@ -3515,8 +3539,8 @@ ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Pops the info pushed by the c'tor.
|
// Pops the info pushed by the c'tor.
|
||||||
// L < UnitTest::mutex_
|
ScopedTrace::~ScopedTrace()
|
||||||
ScopedTrace::~ScopedTrace() {
|
GTEST_LOCK_EXCLUDED_(UnitTest::mutex_) {
|
||||||
UnitTest::GetInstance()->PopGTestTrace();
|
UnitTest::GetInstance()->PopGTestTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3530,14 +3554,14 @@ ScopedTrace::~ScopedTrace() {
|
|||||||
// skip_count - the number of top frames to be skipped; doesn't count
|
// skip_count - the number of top frames to be skipped; doesn't count
|
||||||
// against max_depth.
|
// against max_depth.
|
||||||
//
|
//
|
||||||
// L < mutex_
|
String OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
|
||||||
// We use "L < mutex_" to denote that the function may acquire mutex_.
|
int /* skip_count */)
|
||||||
String OsStackTraceGetter::CurrentStackTrace(int, int) {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
return String("");
|
return String("");
|
||||||
}
|
}
|
||||||
|
|
||||||
// L < mutex_
|
void OsStackTraceGetter::UponLeavingGTest()
|
||||||
void OsStackTraceGetter::UponLeavingGTest() {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* const
|
const char* const
|
||||||
@ -3691,6 +3715,12 @@ int UnitTest::total_test_count() const { return impl()->total_test_count(); }
|
|||||||
// Gets the number of tests that should run.
|
// Gets the number of tests that should run.
|
||||||
int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
|
int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
|
||||||
|
|
||||||
|
// Gets the time of the test program start, in ms from the start of the
|
||||||
|
// UNIX epoch.
|
||||||
|
internal::TimeInMillis UnitTest::start_timestamp() const {
|
||||||
|
return impl()->start_timestamp();
|
||||||
|
}
|
||||||
|
|
||||||
// Gets the elapsed time, in milliseconds.
|
// Gets the elapsed time, in milliseconds.
|
||||||
internal::TimeInMillis UnitTest::elapsed_time() const {
|
internal::TimeInMillis UnitTest::elapsed_time() const {
|
||||||
return impl()->elapsed_time();
|
return impl()->elapsed_time();
|
||||||
@ -3744,12 +3774,13 @@ Environment* UnitTest::AddEnvironment(Environment* env) {
|
|||||||
// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
|
// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
|
||||||
// this to report their results. The user code should use the
|
// this to report their results. The user code should use the
|
||||||
// assertion macros instead of calling this directly.
|
// assertion macros instead of calling this directly.
|
||||||
// L < mutex_
|
void UnitTest::AddTestPartResult(
|
||||||
void UnitTest::AddTestPartResult(TestPartResult::Type result_type,
|
TestPartResult::Type result_type,
|
||||||
const char* file_name,
|
const char* file_name,
|
||||||
int line_number,
|
int line_number,
|
||||||
const internal::String& message,
|
const internal::String& message,
|
||||||
const internal::String& os_stack_trace) {
|
const internal::String& os_stack_trace)
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
Message msg;
|
Message msg;
|
||||||
msg << message;
|
msg << message;
|
||||||
|
|
||||||
@ -3882,16 +3913,16 @@ const char* UnitTest::original_working_dir() const {
|
|||||||
|
|
||||||
// Returns the TestCase object for the test that's currently running,
|
// Returns the TestCase object for the test that's currently running,
|
||||||
// or NULL if no test is running.
|
// or NULL if no test is running.
|
||||||
// L < mutex_
|
const TestCase* UnitTest::current_test_case() const
|
||||||
const TestCase* UnitTest::current_test_case() const {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
internal::MutexLock lock(&mutex_);
|
internal::MutexLock lock(&mutex_);
|
||||||
return impl_->current_test_case();
|
return impl_->current_test_case();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the TestInfo object for the test that's currently running,
|
// Returns the TestInfo object for the test that's currently running,
|
||||||
// or NULL if no test is running.
|
// or NULL if no test is running.
|
||||||
// L < mutex_
|
const TestInfo* UnitTest::current_test_info() const
|
||||||
const TestInfo* UnitTest::current_test_info() const {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
internal::MutexLock lock(&mutex_);
|
internal::MutexLock lock(&mutex_);
|
||||||
return impl_->current_test_info();
|
return impl_->current_test_info();
|
||||||
}
|
}
|
||||||
@ -3902,9 +3933,9 @@ int UnitTest::random_seed() const { return impl_->random_seed(); }
|
|||||||
#if GTEST_HAS_PARAM_TEST
|
#if GTEST_HAS_PARAM_TEST
|
||||||
// Returns ParameterizedTestCaseRegistry object used to keep track of
|
// Returns ParameterizedTestCaseRegistry object used to keep track of
|
||||||
// value-parameterized tests and instantiate and register them.
|
// value-parameterized tests and instantiate and register them.
|
||||||
// L < mutex_
|
|
||||||
internal::ParameterizedTestCaseRegistry&
|
internal::ParameterizedTestCaseRegistry&
|
||||||
UnitTest::parameterized_test_registry() {
|
UnitTest::parameterized_test_registry()
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
return impl_->parameterized_test_registry();
|
return impl_->parameterized_test_registry();
|
||||||
}
|
}
|
||||||
#endif // GTEST_HAS_PARAM_TEST
|
#endif // GTEST_HAS_PARAM_TEST
|
||||||
@ -3921,15 +3952,15 @@ UnitTest::~UnitTest() {
|
|||||||
|
|
||||||
// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
|
// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
|
||||||
// Google Test trace stack.
|
// Google Test trace stack.
|
||||||
// L < mutex_
|
void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
|
||||||
void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
internal::MutexLock lock(&mutex_);
|
internal::MutexLock lock(&mutex_);
|
||||||
impl_->gtest_trace_stack().push_back(trace);
|
impl_->gtest_trace_stack().push_back(trace);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pops a trace from the per-thread Google Test trace stack.
|
// Pops a trace from the per-thread Google Test trace stack.
|
||||||
// L < mutex_
|
void UnitTest::PopGTestTrace()
|
||||||
void UnitTest::PopGTestTrace() {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
internal::MutexLock lock(&mutex_);
|
internal::MutexLock lock(&mutex_);
|
||||||
impl_->gtest_trace_stack().pop_back();
|
impl_->gtest_trace_stack().pop_back();
|
||||||
}
|
}
|
||||||
@ -3965,6 +3996,7 @@ UnitTestImpl::UnitTestImpl(UnitTest* parent)
|
|||||||
post_flag_parse_init_performed_(false),
|
post_flag_parse_init_performed_(false),
|
||||||
random_seed_(0), // Will be overridden by the flag before first use.
|
random_seed_(0), // Will be overridden by the flag before first use.
|
||||||
random_(0), // Will be reseeded before first use.
|
random_(0), // Will be reseeded before first use.
|
||||||
|
start_timestamp_(0),
|
||||||
elapsed_time_(0),
|
elapsed_time_(0),
|
||||||
#if GTEST_HAS_DEATH_TEST
|
#if GTEST_HAS_DEATH_TEST
|
||||||
internal_run_death_test_flag_(NULL),
|
internal_run_death_test_flag_(NULL),
|
||||||
@ -4196,6 +4228,7 @@ bool UnitTestImpl::RunAllTests() {
|
|||||||
|
|
||||||
TestEventListener* repeater = listeners()->repeater();
|
TestEventListener* repeater = listeners()->repeater();
|
||||||
|
|
||||||
|
start_timestamp_ = GetTimeInMillis();
|
||||||
repeater->OnTestProgramStart(*parent_);
|
repeater->OnTestProgramStart(*parent_);
|
||||||
|
|
||||||
// How many times to repeat the tests? We don't want to repeat them
|
// How many times to repeat the tests? We don't want to repeat them
|
||||||
|
@ -52,6 +52,10 @@ using testing::internal::AlwaysTrue;
|
|||||||
# include <signal.h>
|
# include <signal.h>
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
|
|
||||||
|
# if GTEST_OS_LINUX
|
||||||
|
# include <sys/time.h>
|
||||||
|
# endif // GTEST_OS_LINUX
|
||||||
|
|
||||||
# include "gtest/gtest-spi.h"
|
# include "gtest/gtest-spi.h"
|
||||||
|
|
||||||
// Indicates that this translation unit is part of Google Test's
|
// Indicates that this translation unit is part of Google Test's
|
||||||
@ -372,6 +376,58 @@ TEST_F(TestForDeathTest, FastDeathTestInChangedDir) {
|
|||||||
ASSERT_DEATH(_exit(1), "");
|
ASSERT_DEATH(_exit(1), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# if GTEST_OS_LINUX
|
||||||
|
void SigprofAction(int, siginfo_t*, void*) { /* no op */ }
|
||||||
|
|
||||||
|
// Sets SIGPROF action and ITIMER_PROF timer (interval: 1ms).
|
||||||
|
void SetSigprofActionAndTimer() {
|
||||||
|
struct itimerval timer;
|
||||||
|
timer.it_interval.tv_sec = 0;
|
||||||
|
timer.it_interval.tv_usec = 1;
|
||||||
|
timer.it_value = timer.it_interval;
|
||||||
|
ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, NULL));
|
||||||
|
struct sigaction signal_action;
|
||||||
|
memset(&signal_action, 0, sizeof(signal_action));
|
||||||
|
sigemptyset(&signal_action.sa_mask);
|
||||||
|
signal_action.sa_sigaction = SigprofAction;
|
||||||
|
signal_action.sa_flags = SA_RESTART | SA_SIGINFO;
|
||||||
|
ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disables ITIMER_PROF timer and ignores SIGPROF signal.
|
||||||
|
void DisableSigprofActionAndTimer(struct sigaction* old_signal_action) {
|
||||||
|
struct itimerval timer;
|
||||||
|
timer.it_interval.tv_sec = 0;
|
||||||
|
timer.it_interval.tv_usec = 0;
|
||||||
|
timer.it_value = timer.it_interval;
|
||||||
|
ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, NULL));
|
||||||
|
struct sigaction signal_action;
|
||||||
|
memset(&signal_action, 0, sizeof(signal_action));
|
||||||
|
sigemptyset(&signal_action.sa_mask);
|
||||||
|
signal_action.sa_handler = SIG_IGN;
|
||||||
|
ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, old_signal_action));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests that death tests work when SIGPROF handler and timer are set.
|
||||||
|
TEST_F(TestForDeathTest, FastSigprofActionSet) {
|
||||||
|
testing::GTEST_FLAG(death_test_style) = "fast";
|
||||||
|
SetSigprofActionAndTimer();
|
||||||
|
EXPECT_DEATH(_exit(1), "");
|
||||||
|
struct sigaction old_signal_action;
|
||||||
|
DisableSigprofActionAndTimer(&old_signal_action);
|
||||||
|
EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TestForDeathTest, ThreadSafeSigprofActionSet) {
|
||||||
|
testing::GTEST_FLAG(death_test_style) = "threadsafe";
|
||||||
|
SetSigprofActionAndTimer();
|
||||||
|
EXPECT_DEATH(_exit(1), "");
|
||||||
|
struct sigaction old_signal_action;
|
||||||
|
DisableSigprofActionAndTimer(&old_signal_action);
|
||||||
|
EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction);
|
||||||
|
}
|
||||||
|
# endif // GTEST_OS_LINUX
|
||||||
|
|
||||||
// Repeats a representative sample of death tests in the "threadsafe" style:
|
// Repeats a representative sample of death tests in the "threadsafe" style:
|
||||||
|
|
||||||
TEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) {
|
TEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) {
|
||||||
|
@ -267,7 +267,7 @@ TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFileAndLine) {
|
|||||||
EXPECT_EQ("unknown file", FormatCompilerIndependentFileLocation(NULL, -1));
|
EXPECT_EQ("unknown file", FormatCompilerIndependentFileLocation(NULL, -1));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GTEST_OS_MAC
|
#if GTEST_OS_MAC || GTEST_OS_QNX
|
||||||
void* ThreadFunc(void* data) {
|
void* ThreadFunc(void* data) {
|
||||||
pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data);
|
pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data);
|
||||||
pthread_mutex_lock(mutex);
|
pthread_mutex_lock(mutex);
|
||||||
@ -297,6 +297,8 @@ TEST(GetThreadCountTest, ReturnsCorrectValue) {
|
|||||||
void* dummy;
|
void* dummy;
|
||||||
ASSERT_EQ(0, pthread_join(thread_id, &dummy));
|
ASSERT_EQ(0, pthread_join(thread_id, &dummy));
|
||||||
|
|
||||||
|
# if GTEST_OS_MAC
|
||||||
|
|
||||||
// MacOS X may not immediately report the updated thread count after
|
// MacOS X may not immediately report the updated thread count after
|
||||||
// joining a thread, causing flakiness in this test. To counter that, we
|
// joining a thread, causing flakiness in this test. To counter that, we
|
||||||
// wait for up to .5 seconds for the OS to report the correct value.
|
// wait for up to .5 seconds for the OS to report the correct value.
|
||||||
@ -306,6 +308,9 @@ TEST(GetThreadCountTest, ReturnsCorrectValue) {
|
|||||||
|
|
||||||
SleepMilliseconds(100);
|
SleepMilliseconds(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# endif // GTEST_OS_MAC
|
||||||
|
|
||||||
EXPECT_EQ(1U, GetThreadCount());
|
EXPECT_EQ(1U, GetThreadCount());
|
||||||
pthread_mutex_destroy(&mutex);
|
pthread_mutex_destroy(&mutex);
|
||||||
}
|
}
|
||||||
@ -313,7 +318,7 @@ TEST(GetThreadCountTest, ReturnsCorrectValue) {
|
|||||||
TEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) {
|
TEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) {
|
||||||
EXPECT_EQ(0U, GetThreadCount());
|
EXPECT_EQ(0U, GetThreadCount());
|
||||||
}
|
}
|
||||||
#endif // GTEST_OS_MAC
|
#endif // GTEST_OS_MAC || GTEST_OS_QNX
|
||||||
|
|
||||||
TEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) {
|
TEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) {
|
||||||
const bool a_false_condition = false;
|
const bool a_false_condition = false;
|
||||||
@ -963,23 +968,23 @@ TEST(ThreadLocalTest, ValueDefaultContructorIsNotRequiredForParamVersion) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(ThreadLocalTest, GetAndPointerReturnSameValue) {
|
TEST(ThreadLocalTest, GetAndPointerReturnSameValue) {
|
||||||
ThreadLocal<String> thread_local;
|
ThreadLocal<String> thread_local_string;
|
||||||
|
|
||||||
EXPECT_EQ(thread_local.pointer(), &(thread_local.get()));
|
EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get()));
|
||||||
|
|
||||||
// Verifies the condition still holds after calling set.
|
// Verifies the condition still holds after calling set.
|
||||||
thread_local.set("foo");
|
thread_local_string.set("foo");
|
||||||
EXPECT_EQ(thread_local.pointer(), &(thread_local.get()));
|
EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(ThreadLocalTest, PointerAndConstPointerReturnSameValue) {
|
TEST(ThreadLocalTest, PointerAndConstPointerReturnSameValue) {
|
||||||
ThreadLocal<String> thread_local;
|
ThreadLocal<String> thread_local_string;
|
||||||
const ThreadLocal<String>& const_thread_local = thread_local;
|
const ThreadLocal<String>& const_thread_local_string = thread_local_string;
|
||||||
|
|
||||||
EXPECT_EQ(thread_local.pointer(), const_thread_local.pointer());
|
EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer());
|
||||||
|
|
||||||
thread_local.set("foo");
|
thread_local_string.set("foo");
|
||||||
EXPECT_EQ(thread_local.pointer(), const_thread_local.pointer());
|
EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer());
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GTEST_IS_THREADSAFE
|
#if GTEST_IS_THREADSAFE
|
||||||
@ -1032,6 +1037,7 @@ class AtomicCounterWithMutex {
|
|||||||
SleepMilliseconds(random_.Generate(30));
|
SleepMilliseconds(random_.Generate(30));
|
||||||
|
|
||||||
GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex));
|
GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex));
|
||||||
|
GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&memory_barrier_mutex));
|
||||||
}
|
}
|
||||||
value_ = temp + 1;
|
value_ = temp + 1;
|
||||||
}
|
}
|
||||||
@ -1088,14 +1094,15 @@ void RetrieveThreadLocalValue(pair<ThreadLocal<String>*, String*> param) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(ThreadLocalTest, ParameterizedConstructorSetsDefault) {
|
TEST(ThreadLocalTest, ParameterizedConstructorSetsDefault) {
|
||||||
ThreadLocal<String> thread_local("foo");
|
ThreadLocal<String> thread_local_string("foo");
|
||||||
EXPECT_STREQ("foo", thread_local.get().c_str());
|
EXPECT_STREQ("foo", thread_local_string.get().c_str());
|
||||||
|
|
||||||
thread_local.set("bar");
|
thread_local_string.set("bar");
|
||||||
EXPECT_STREQ("bar", thread_local.get().c_str());
|
EXPECT_STREQ("bar", thread_local_string.get().c_str());
|
||||||
|
|
||||||
String result;
|
String result;
|
||||||
RunFromThread(&RetrieveThreadLocalValue, make_pair(&thread_local, &result));
|
RunFromThread(&RetrieveThreadLocalValue,
|
||||||
|
make_pair(&thread_local_string, &result));
|
||||||
EXPECT_STREQ("foo", result.c_str());
|
EXPECT_STREQ("foo", result.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1124,8 +1131,8 @@ class DestructorTracker {
|
|||||||
|
|
||||||
typedef ThreadLocal<DestructorTracker>* ThreadParam;
|
typedef ThreadLocal<DestructorTracker>* ThreadParam;
|
||||||
|
|
||||||
void CallThreadLocalGet(ThreadParam thread_local) {
|
void CallThreadLocalGet(ThreadParam thread_local_param) {
|
||||||
thread_local->get();
|
thread_local_param->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tests that when a ThreadLocal object dies in a thread, it destroys
|
// Tests that when a ThreadLocal object dies in a thread, it destroys
|
||||||
@ -1135,19 +1142,19 @@ TEST(ThreadLocalTest, DestroysManagedObjectForOwnThreadWhenDying) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
// The next line default constructs a DestructorTracker object as
|
// The next line default constructs a DestructorTracker object as
|
||||||
// the default value of objects managed by thread_local.
|
// the default value of objects managed by thread_local_tracker.
|
||||||
ThreadLocal<DestructorTracker> thread_local;
|
ThreadLocal<DestructorTracker> thread_local_tracker;
|
||||||
ASSERT_EQ(1U, g_destroyed.size());
|
ASSERT_EQ(1U, g_destroyed.size());
|
||||||
ASSERT_FALSE(g_destroyed[0]);
|
ASSERT_FALSE(g_destroyed[0]);
|
||||||
|
|
||||||
// This creates another DestructorTracker object for the main thread.
|
// This creates another DestructorTracker object for the main thread.
|
||||||
thread_local.get();
|
thread_local_tracker.get();
|
||||||
ASSERT_EQ(2U, g_destroyed.size());
|
ASSERT_EQ(2U, g_destroyed.size());
|
||||||
ASSERT_FALSE(g_destroyed[0]);
|
ASSERT_FALSE(g_destroyed[0]);
|
||||||
ASSERT_FALSE(g_destroyed[1]);
|
ASSERT_FALSE(g_destroyed[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now thread_local has died. It should have destroyed both the
|
// Now thread_local_tracker has died. It should have destroyed both the
|
||||||
// default value shared by all threads and the value for the main
|
// default value shared by all threads and the value for the main
|
||||||
// thread.
|
// thread.
|
||||||
ASSERT_EQ(2U, g_destroyed.size());
|
ASSERT_EQ(2U, g_destroyed.size());
|
||||||
@ -1164,14 +1171,14 @@ TEST(ThreadLocalTest, DestroysManagedObjectAtThreadExit) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
// The next line default constructs a DestructorTracker object as
|
// The next line default constructs a DestructorTracker object as
|
||||||
// the default value of objects managed by thread_local.
|
// the default value of objects managed by thread_local_tracker.
|
||||||
ThreadLocal<DestructorTracker> thread_local;
|
ThreadLocal<DestructorTracker> thread_local_tracker;
|
||||||
ASSERT_EQ(1U, g_destroyed.size());
|
ASSERT_EQ(1U, g_destroyed.size());
|
||||||
ASSERT_FALSE(g_destroyed[0]);
|
ASSERT_FALSE(g_destroyed[0]);
|
||||||
|
|
||||||
// This creates another DestructorTracker object in the new thread.
|
// This creates another DestructorTracker object in the new thread.
|
||||||
ThreadWithParam<ThreadParam> thread(
|
ThreadWithParam<ThreadParam> thread(
|
||||||
&CallThreadLocalGet, &thread_local, NULL);
|
&CallThreadLocalGet, &thread_local_tracker, NULL);
|
||||||
thread.Join();
|
thread.Join();
|
||||||
|
|
||||||
// Now the new thread has exited. The per-thread object for it
|
// Now the new thread has exited. The per-thread object for it
|
||||||
@ -1181,7 +1188,7 @@ TEST(ThreadLocalTest, DestroysManagedObjectAtThreadExit) {
|
|||||||
ASSERT_TRUE(g_destroyed[1]);
|
ASSERT_TRUE(g_destroyed[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now thread_local has died. The default value should have been
|
// Now thread_local_tracker has died. The default value should have been
|
||||||
// destroyed too.
|
// destroyed too.
|
||||||
ASSERT_EQ(2U, g_destroyed.size());
|
ASSERT_EQ(2U, g_destroyed.size());
|
||||||
EXPECT_TRUE(g_destroyed[0]);
|
EXPECT_TRUE(g_destroyed[0]);
|
||||||
@ -1191,12 +1198,13 @@ TEST(ThreadLocalTest, DestroysManagedObjectAtThreadExit) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(ThreadLocalTest, ThreadLocalMutationsAffectOnlyCurrentThread) {
|
TEST(ThreadLocalTest, ThreadLocalMutationsAffectOnlyCurrentThread) {
|
||||||
ThreadLocal<String> thread_local;
|
ThreadLocal<String> thread_local_string;
|
||||||
thread_local.set("Foo");
|
thread_local_string.set("Foo");
|
||||||
EXPECT_STREQ("Foo", thread_local.get().c_str());
|
EXPECT_STREQ("Foo", thread_local_string.get().c_str());
|
||||||
|
|
||||||
String result;
|
String result;
|
||||||
RunFromThread(&RetrieveThreadLocalValue, make_pair(&thread_local, &result));
|
RunFromThread(&RetrieveThreadLocalValue,
|
||||||
|
make_pair(&thread_local_string, &result));
|
||||||
EXPECT_TRUE(result.c_str() == NULL);
|
EXPECT_TRUE(result.c_str() == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,6 +197,7 @@ using ::std::pair;
|
|||||||
using ::std::set;
|
using ::std::set;
|
||||||
using ::std::vector;
|
using ::std::vector;
|
||||||
using ::testing::PrintToString;
|
using ::testing::PrintToString;
|
||||||
|
using ::testing::internal::ImplicitCast_;
|
||||||
using ::testing::internal::NativeArray;
|
using ::testing::internal::NativeArray;
|
||||||
using ::testing::internal::RE;
|
using ::testing::internal::RE;
|
||||||
using ::testing::internal::Strings;
|
using ::testing::internal::Strings;
|
||||||
@ -1002,9 +1003,12 @@ TEST(PrintTupleTest, VariousSizes) {
|
|||||||
EXPECT_EQ("(false, 2, 3, 4, true, 6, 7, true, 9)", Print(t9));
|
EXPECT_EQ("(false, 2, 3, 4, true, 6, 7, true, 9)", Print(t9));
|
||||||
|
|
||||||
const char* const str = "8";
|
const char* const str = "8";
|
||||||
|
// VC++ 2010's implementation of tuple of C++0x is deficient, requiring
|
||||||
|
// an explicit type cast of NULL to be used.
|
||||||
tuple<bool, char, short, testing::internal::Int32, // NOLINT
|
tuple<bool, char, short, testing::internal::Int32, // NOLINT
|
||||||
testing::internal::Int64, float, double, const char*, void*, string>
|
testing::internal::Int64, float, double, const char*, void*, string>
|
||||||
t10(false, 'a', 3, 4, 5, 1.5F, -2.5, str, NULL, "10");
|
t10(false, 'a', 3, 4, 5, 1.5F, -2.5, str,
|
||||||
|
ImplicitCast_<void*>(NULL), "10");
|
||||||
EXPECT_EQ("(false, 'a' (97, 0x61), 3, 4, 5, 1.5, -2.5, " + PrintPointer(str) +
|
EXPECT_EQ("(false, 'a' (97, 0x61), 3, 4, 5, 1.5, -2.5, " + PrintPointer(str) +
|
||||||
" pointing to \"8\", NULL, \"10\")",
|
" pointing to \"8\", NULL, \"10\")",
|
||||||
Print(t10));
|
Print(t10));
|
||||||
|
@ -241,7 +241,7 @@ class Subprocess:
|
|||||||
# Changes made by os.environ.clear are not inheritable by child
|
# Changes made by os.environ.clear are not inheritable by child
|
||||||
# processes until Python 2.6. To produce inheritable changes we have
|
# processes until Python 2.6. To produce inheritable changes we have
|
||||||
# to delete environment items with the del statement.
|
# to delete environment items with the del statement.
|
||||||
for key in dest:
|
for key in dest.keys():
|
||||||
del dest[key]
|
del dest[key]
|
||||||
dest.update(src)
|
dest.update(src)
|
||||||
|
|
||||||
|
@ -37,12 +37,28 @@
|
|||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
#include <stdio.h> // for fflush, fprintf, NULL, etc.
|
||||||
|
#include <stdlib.h> // for exit
|
||||||
|
#include <exception> // for set_terminate
|
||||||
|
|
||||||
|
// This terminate handler aborts the program using exit() rather than abort().
|
||||||
|
// This avoids showing pop-ups on Windows systems and core dumps on Unix-like
|
||||||
|
// ones.
|
||||||
|
void TerminateHandler() {
|
||||||
|
fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program.");
|
||||||
|
fflush(NULL);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
#if GTEST_HAS_EXCEPTIONS
|
||||||
|
std::set_terminate(&TerminateHandler);
|
||||||
|
#endif
|
||||||
testing::InitGoogleTest(&argc, argv);
|
testing::InitGoogleTest(&argc, argv);
|
||||||
|
|
||||||
// We want to ensure that people can use Google Test assertions in
|
// We want to ensure that people can use Google Test assertions in
|
||||||
// other testing frameworks, as long as they initialize Google Test
|
// other testing frameworks, as long as they initialize Google Test
|
||||||
// properly and set the thrown-on-failure mode. Therefore, we don't
|
// properly and set the throw-on-failure mode. Therefore, we don't
|
||||||
// use Google Test's constructs for defining and running tests
|
// use Google Test's constructs for defining and running tests
|
||||||
// (e.g. TEST and RUN_ALL_TESTS) here.
|
// (e.g. TEST and RUN_ALL_TESTS) here.
|
||||||
|
|
||||||
|
@ -71,6 +71,7 @@ TEST(CommandLineFlagsTest, CanBeAccessedInCodeOnceGTestHIsIncluded) {
|
|||||||
|
|
||||||
#include <limits.h> // For INT_MAX.
|
#include <limits.h> // For INT_MAX.
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
@ -141,6 +142,7 @@ using testing::TestPartResult;
|
|||||||
using testing::TestPartResultArray;
|
using testing::TestPartResultArray;
|
||||||
using testing::TestProperty;
|
using testing::TestProperty;
|
||||||
using testing::TestResult;
|
using testing::TestResult;
|
||||||
|
using testing::TimeInMillis;
|
||||||
using testing::UnitTest;
|
using testing::UnitTest;
|
||||||
using testing::kMaxStackTraceDepth;
|
using testing::kMaxStackTraceDepth;
|
||||||
using testing::internal::AddReference;
|
using testing::internal::AddReference;
|
||||||
@ -156,6 +158,7 @@ using testing::internal::CountIf;
|
|||||||
using testing::internal::EqFailure;
|
using testing::internal::EqFailure;
|
||||||
using testing::internal::FloatingPoint;
|
using testing::internal::FloatingPoint;
|
||||||
using testing::internal::ForEach;
|
using testing::internal::ForEach;
|
||||||
|
using testing::internal::FormatEpochTimeInMillisAsIso8601;
|
||||||
using testing::internal::FormatTimeInMillisAsSeconds;
|
using testing::internal::FormatTimeInMillisAsSeconds;
|
||||||
using testing::internal::GTestFlagSaver;
|
using testing::internal::GTestFlagSaver;
|
||||||
using testing::internal::GetCurrentOsStackTraceExceptTop;
|
using testing::internal::GetCurrentOsStackTraceExceptTop;
|
||||||
@ -163,6 +166,7 @@ using testing::internal::GetElementOr;
|
|||||||
using testing::internal::GetNextRandomSeed;
|
using testing::internal::GetNextRandomSeed;
|
||||||
using testing::internal::GetRandomSeedFromFlag;
|
using testing::internal::GetRandomSeedFromFlag;
|
||||||
using testing::internal::GetTestTypeId;
|
using testing::internal::GetTestTypeId;
|
||||||
|
using testing::internal::GetTimeInMillis;
|
||||||
using testing::internal::GetTypeId;
|
using testing::internal::GetTypeId;
|
||||||
using testing::internal::GetUnitTestImpl;
|
using testing::internal::GetUnitTestImpl;
|
||||||
using testing::internal::ImplicitlyConvertible;
|
using testing::internal::ImplicitlyConvertible;
|
||||||
@ -308,6 +312,103 @@ TEST(FormatTimeInMillisAsSecondsTest, FormatsNegativeNumber) {
|
|||||||
EXPECT_EQ("-3", FormatTimeInMillisAsSeconds(-3000));
|
EXPECT_EQ("-3", FormatTimeInMillisAsSeconds(-3000));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tests FormatEpochTimeInMillisAsIso8601(). The correctness of conversion
|
||||||
|
// for particular dates below was verified in Python using
|
||||||
|
// datetime.datetime.fromutctimestamp(<timetamp>/1000).
|
||||||
|
|
||||||
|
// FormatEpochTimeInMillisAsIso8601 depends on the current timezone, so we
|
||||||
|
// have to set up a particular timezone to obtain predictable results.
|
||||||
|
class FormatEpochTimeInMillisAsIso8601Test : public Test {
|
||||||
|
public:
|
||||||
|
// On Cygwin, GCC doesn't allow unqualified integer literals to exceed
|
||||||
|
// 32 bits, even when 64-bit integer types are available. We have to
|
||||||
|
// force the constants to have a 64-bit type here.
|
||||||
|
static const TimeInMillis kMillisPerSec = 1000;
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual void SetUp() {
|
||||||
|
saved_tz_ = NULL;
|
||||||
|
#if _MSC_VER
|
||||||
|
# pragma warning(push) // Saves the current warning state.
|
||||||
|
# pragma warning(disable:4996) // Temporarily disables warning 4996
|
||||||
|
// (function or variable may be unsafe
|
||||||
|
// for getenv, function is deprecated for
|
||||||
|
// strdup).
|
||||||
|
if (getenv("TZ"))
|
||||||
|
saved_tz_ = strdup(getenv("TZ"));
|
||||||
|
# pragma warning(pop) // Restores the warning state again.
|
||||||
|
#else
|
||||||
|
if (getenv("TZ"))
|
||||||
|
saved_tz_ = strdup(getenv("TZ"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Set up the time zone for FormatEpochTimeInMillisAsIso8601 to use. We
|
||||||
|
// cannot use the local time zone because the function's output depends
|
||||||
|
// on the time zone.
|
||||||
|
SetTimeZone("UTC+00");
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void TearDown() {
|
||||||
|
SetTimeZone(saved_tz_);
|
||||||
|
free(const_cast<char*>(saved_tz_));
|
||||||
|
saved_tz_ = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetTimeZone(const char* time_zone) {
|
||||||
|
// tzset() distinguishes between the TZ variable being present and empty
|
||||||
|
// and not being present, so we have to consider the case of time_zone
|
||||||
|
// being NULL.
|
||||||
|
#if _MSC_VER
|
||||||
|
// ...Unless it's MSVC, whose standard library's _putenv doesn't
|
||||||
|
// distinguish between an empty and a missing variable.
|
||||||
|
const std::string env_var =
|
||||||
|
std::string("TZ=") + (time_zone ? time_zone : "");
|
||||||
|
_putenv(env_var.c_str());
|
||||||
|
# pragma warning(push) // Saves the current warning state.
|
||||||
|
# pragma warning(disable:4996) // Temporarily disables warning 4996
|
||||||
|
// (function is deprecated).
|
||||||
|
tzset();
|
||||||
|
# pragma warning(pop) // Restores the warning state again.
|
||||||
|
#else
|
||||||
|
if (time_zone) {
|
||||||
|
setenv(("TZ"), time_zone, 1);
|
||||||
|
} else {
|
||||||
|
unsetenv("TZ");
|
||||||
|
}
|
||||||
|
tzset();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* saved_tz_;
|
||||||
|
};
|
||||||
|
|
||||||
|
const TimeInMillis FormatEpochTimeInMillisAsIso8601Test::kMillisPerSec;
|
||||||
|
|
||||||
|
TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsTwoDigitSegments) {
|
||||||
|
EXPECT_EQ("2011-10-31T18:52:42",
|
||||||
|
FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(FormatEpochTimeInMillisAsIso8601Test, MillisecondsDoNotAffectResult) {
|
||||||
|
EXPECT_EQ(
|
||||||
|
"2011-10-31T18:52:42",
|
||||||
|
FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec + 234));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsLeadingZeroes) {
|
||||||
|
EXPECT_EQ("2011-09-03T05:07:02",
|
||||||
|
FormatEpochTimeInMillisAsIso8601(1315026422 * kMillisPerSec));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(FormatEpochTimeInMillisAsIso8601Test, Prints24HourTime) {
|
||||||
|
EXPECT_EQ("2011-09-28T17:08:22",
|
||||||
|
FormatEpochTimeInMillisAsIso8601(1317229702 * kMillisPerSec));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsEpochStart) {
|
||||||
|
EXPECT_EQ("1970-01-01T00:00:00", FormatEpochTimeInMillisAsIso8601(0));
|
||||||
|
}
|
||||||
|
|
||||||
#if GTEST_CAN_COMPARE_NULL
|
#if GTEST_CAN_COMPARE_NULL
|
||||||
|
|
||||||
# ifdef __BORLANDC__
|
# ifdef __BORLANDC__
|
||||||
@ -2130,6 +2231,11 @@ TEST(UnitTestTest, CanGetOriginalWorkingDir) {
|
|||||||
EXPECT_STRNE(UnitTest::GetInstance()->original_working_dir(), "");
|
EXPECT_STRNE(UnitTest::GetInstance()->original_working_dir(), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(UnitTestTest, ReturnsPlausibleTimestamp) {
|
||||||
|
EXPECT_LT(0, UnitTest::GetInstance()->start_timestamp());
|
||||||
|
EXPECT_LE(UnitTest::GetInstance()->start_timestamp(), GetTimeInMillis());
|
||||||
|
}
|
||||||
|
|
||||||
// This group of tests is for predicate assertions (ASSERT_PRED*, etc)
|
// This group of tests is for predicate assertions (ASSERT_PRED*, etc)
|
||||||
// of various arities. They do not attempt to be exhaustive. Rather,
|
// of various arities. They do not attempt to be exhaustive. Rather,
|
||||||
// view them as smoke tests that can be easily reviewed and verified.
|
// view them as smoke tests that can be easily reviewed and verified.
|
||||||
|
@ -45,7 +45,7 @@ GTEST_OUTPUT_1_TEST = "gtest_xml_outfile1_test_"
|
|||||||
GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_"
|
GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_"
|
||||||
|
|
||||||
EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
|
EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" name="AllTests">
|
<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
|
||||||
<testsuite name="PropertyOne" tests="1" failures="0" disabled="0" errors="0" time="*">
|
<testsuite name="PropertyOne" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||||
<testcase name="TestSomeProperties" status="run" time="*" classname="PropertyOne" SetUpProp="1" TestSomeProperty="1" TearDownProp="1" />
|
<testcase name="TestSomeProperties" status="run" time="*" classname="PropertyOne" SetUpProp="1" TestSomeProperty="1" TearDownProp="1" />
|
||||||
</testsuite>
|
</testsuite>
|
||||||
@ -53,7 +53,7 @@ EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
EXPECTED_XML_2 = """<?xml version="1.0" encoding="UTF-8"?>
|
EXPECTED_XML_2 = """<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" name="AllTests">
|
<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
|
||||||
<testsuite name="PropertyTwo" tests="1" failures="0" disabled="0" errors="0" time="*">
|
<testsuite name="PropertyTwo" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||||
<testcase name="TestSomeProperties" status="run" time="*" classname="PropertyTwo" SetUpProp="2" TestSomeProperty="2" TearDownProp="2" />
|
<testcase name="TestSomeProperties" status="run" time="*" classname="PropertyTwo" SetUpProp="2" TestSomeProperty="2" TearDownProp="2" />
|
||||||
</testsuite>
|
</testsuite>
|
||||||
|
@ -33,8 +33,10 @@
|
|||||||
|
|
||||||
__author__ = 'eefacm@gmail.com (Sean Mcafee)'
|
__author__ = 'eefacm@gmail.com (Sean Mcafee)'
|
||||||
|
|
||||||
|
import datetime
|
||||||
import errno
|
import errno
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import sys
|
import sys
|
||||||
from xml.dom import minidom, Node
|
from xml.dom import minidom, Node
|
||||||
|
|
||||||
@ -42,6 +44,7 @@ import gtest_test_utils
|
|||||||
import gtest_xml_test_utils
|
import gtest_xml_test_utils
|
||||||
|
|
||||||
|
|
||||||
|
GTEST_LIST_TESTS_FLAG = '--gtest_list_tests'
|
||||||
GTEST_OUTPUT_FLAG = "--gtest_output"
|
GTEST_OUTPUT_FLAG = "--gtest_output"
|
||||||
GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml"
|
GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml"
|
||||||
GTEST_PROGRAM_NAME = "gtest_xml_output_unittest_"
|
GTEST_PROGRAM_NAME = "gtest_xml_output_unittest_"
|
||||||
@ -49,12 +52,12 @@ GTEST_PROGRAM_NAME = "gtest_xml_output_unittest_"
|
|||||||
SUPPORTS_STACK_TRACES = False
|
SUPPORTS_STACK_TRACES = False
|
||||||
|
|
||||||
if SUPPORTS_STACK_TRACES:
|
if SUPPORTS_STACK_TRACES:
|
||||||
STACK_TRACE_TEMPLATE = "\nStack trace:\n*"
|
STACK_TRACE_TEMPLATE = '\nStack trace:\n*'
|
||||||
else:
|
else:
|
||||||
STACK_TRACE_TEMPLATE = ""
|
STACK_TRACE_TEMPLATE = ''
|
||||||
|
|
||||||
EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<testsuites tests="23" failures="4" disabled="2" errors="0" time="*" name="AllTests">
|
<testsuites tests="23" failures="4" disabled="2" errors="0" time="*" timestamp="*" name="AllTests">
|
||||||
<testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
<testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||||
<testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
|
<testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
@ -127,15 +130,23 @@ Invalid characters in brackets []%(stack)s]]></failure>
|
|||||||
|
|
||||||
|
|
||||||
EXPECTED_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
EXPECTED_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<testsuites tests="0" failures="0" disabled="0" errors="0" time="*" name="AllTests">
|
<testsuites tests="0" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
|
||||||
</testsuites>"""
|
</testsuites>"""
|
||||||
|
|
||||||
|
GTEST_PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath(GTEST_PROGRAM_NAME)
|
||||||
|
|
||||||
|
SUPPORTS_TYPED_TESTS = 'TypedTest' in gtest_test_utils.Subprocess(
|
||||||
|
[GTEST_PROGRAM_PATH, GTEST_LIST_TESTS_FLAG], capture_stderr=False).output
|
||||||
|
|
||||||
|
|
||||||
class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
|
class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
|
||||||
"""
|
"""
|
||||||
Unit test for Google Test's XML output functionality.
|
Unit test for Google Test's XML output functionality.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# This test currently breaks on platforms that do not support typed and
|
||||||
|
# type-parameterized tests, so we don't run it under them.
|
||||||
|
if SUPPORTS_TYPED_TESTS:
|
||||||
def testNonEmptyXmlOutput(self):
|
def testNonEmptyXmlOutput(self):
|
||||||
"""
|
"""
|
||||||
Runs a test program that generates a non-empty XML output, and
|
Runs a test program that generates a non-empty XML output, and
|
||||||
@ -144,13 +155,38 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
|
|||||||
self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_NON_EMPTY_XML, 1)
|
self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_NON_EMPTY_XML, 1)
|
||||||
|
|
||||||
def testEmptyXmlOutput(self):
|
def testEmptyXmlOutput(self):
|
||||||
"""
|
"""Verifies XML output for a Google Test binary without actual tests.
|
||||||
|
|
||||||
Runs a test program that generates an empty XML output, and
|
Runs a test program that generates an empty XML output, and
|
||||||
tests that the XML output is expected.
|
tests that the XML output is expected.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self._TestXmlOutput("gtest_no_test_unittest",
|
self._TestXmlOutput('gtest_no_test_unittest', EXPECTED_EMPTY_XML, 0)
|
||||||
EXPECTED_EMPTY_XML, 0)
|
|
||||||
|
def testTimestampValue(self):
|
||||||
|
"""Checks whether the timestamp attribute in the XML output is valid.
|
||||||
|
|
||||||
|
Runs a test program that generates an empty XML output, and checks if
|
||||||
|
the timestamp attribute in the testsuites tag is valid.
|
||||||
|
"""
|
||||||
|
actual = self._GetXmlOutput('gtest_no_test_unittest', 0)
|
||||||
|
date_time_str = actual.documentElement.getAttributeNode('timestamp').value
|
||||||
|
# datetime.strptime() is only available in Python 2.5+ so we have to
|
||||||
|
# parse the expected datetime manually.
|
||||||
|
match = re.match(r'(\d+)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)', date_time_str)
|
||||||
|
self.assertTrue(
|
||||||
|
re.match,
|
||||||
|
'XML datettime string %s has incorrect format' % date_time_str)
|
||||||
|
date_time_from_xml = datetime.datetime(
|
||||||
|
year=int(match.group(1)), month=int(match.group(2)),
|
||||||
|
day=int(match.group(3)), hour=int(match.group(4)),
|
||||||
|
minute=int(match.group(5)), second=int(match.group(6)))
|
||||||
|
|
||||||
|
time_delta = abs(datetime.datetime.now() - date_time_from_xml)
|
||||||
|
# timestamp value should be near the current local time
|
||||||
|
self.assertTrue(time_delta < datetime.timedelta(seconds=600),
|
||||||
|
'time_delta is %s' % time_delta)
|
||||||
|
actual.unlink()
|
||||||
|
|
||||||
def testDefaultOutputFile(self):
|
def testDefaultOutputFile(self):
|
||||||
"""
|
"""
|
||||||
@ -160,7 +196,7 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
|
|||||||
output_file = os.path.join(gtest_test_utils.GetTempDir(),
|
output_file = os.path.join(gtest_test_utils.GetTempDir(),
|
||||||
GTEST_DEFAULT_OUTPUT_FILE)
|
GTEST_DEFAULT_OUTPUT_FILE)
|
||||||
gtest_prog_path = gtest_test_utils.GetTestExecutablePath(
|
gtest_prog_path = gtest_test_utils.GetTestExecutablePath(
|
||||||
"gtest_no_test_unittest")
|
'gtest_no_test_unittest')
|
||||||
try:
|
try:
|
||||||
os.remove(output_file)
|
os.remove(output_file)
|
||||||
except OSError, e:
|
except OSError, e:
|
||||||
@ -168,7 +204,7 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
p = gtest_test_utils.Subprocess(
|
p = gtest_test_utils.Subprocess(
|
||||||
[gtest_prog_path, "%s=xml" % GTEST_OUTPUT_FLAG],
|
[gtest_prog_path, '%s=xml' % GTEST_OUTPUT_FLAG],
|
||||||
working_dir=gtest_test_utils.GetTempDir())
|
working_dir=gtest_test_utils.GetTempDir())
|
||||||
self.assert_(p.exited)
|
self.assert_(p.exited)
|
||||||
self.assertEquals(0, p.exit_code)
|
self.assertEquals(0, p.exit_code)
|
||||||
@ -181,28 +217,50 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
xml_path = os.path.join(gtest_test_utils.GetTempDir(),
|
xml_path = os.path.join(gtest_test_utils.GetTempDir(),
|
||||||
GTEST_PROGRAM_NAME + "out.xml")
|
GTEST_PROGRAM_NAME + 'out.xml')
|
||||||
if os.path.isfile(xml_path):
|
if os.path.isfile(xml_path):
|
||||||
os.remove(xml_path)
|
os.remove(xml_path)
|
||||||
|
|
||||||
gtest_prog_path = gtest_test_utils.GetTestExecutablePath(GTEST_PROGRAM_NAME)
|
command = [GTEST_PROGRAM_PATH,
|
||||||
|
'%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path),
|
||||||
command = [gtest_prog_path,
|
'--shut_down_xml']
|
||||||
"%s=xml:%s" % (GTEST_OUTPUT_FLAG, xml_path),
|
|
||||||
"--shut_down_xml"]
|
|
||||||
p = gtest_test_utils.Subprocess(command)
|
p = gtest_test_utils.Subprocess(command)
|
||||||
if p.terminated_by_signal:
|
if p.terminated_by_signal:
|
||||||
self.assert_(False,
|
# p.signal is avalable only if p.terminated_by_signal is True.
|
||||||
"%s was killed by signal %d" % (gtest_prog_name, p.signal))
|
self.assertFalse(
|
||||||
|
p.terminated_by_signal,
|
||||||
|
'%s was killed by signal %d' % (GTEST_PROGRAM_NAME, p.signal))
|
||||||
else:
|
else:
|
||||||
self.assert_(p.exited)
|
self.assert_(p.exited)
|
||||||
self.assertEquals(1, p.exit_code,
|
self.assertEquals(1, p.exit_code,
|
||||||
"'%s' exited with code %s, which doesn't match "
|
"'%s' exited with code %s, which doesn't match "
|
||||||
"the expected exit code %s."
|
'the expected exit code %s.'
|
||||||
% (command, p.exit_code, 1))
|
% (command, p.exit_code, 1))
|
||||||
|
|
||||||
self.assert_(not os.path.isfile(xml_path))
|
self.assert_(not os.path.isfile(xml_path))
|
||||||
|
|
||||||
|
def _GetXmlOutput(self, gtest_prog_name, expected_exit_code):
|
||||||
|
"""
|
||||||
|
Returns the xml output generated by running the program gtest_prog_name.
|
||||||
|
Furthermore, the program's exit code must be expected_exit_code.
|
||||||
|
"""
|
||||||
|
xml_path = os.path.join(gtest_test_utils.GetTempDir(),
|
||||||
|
gtest_prog_name + 'out.xml')
|
||||||
|
gtest_prog_path = gtest_test_utils.GetTestExecutablePath(gtest_prog_name)
|
||||||
|
|
||||||
|
command = [gtest_prog_path, '%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path)]
|
||||||
|
p = gtest_test_utils.Subprocess(command)
|
||||||
|
if p.terminated_by_signal:
|
||||||
|
self.assert_(False,
|
||||||
|
'%s was killed by signal %d' % (gtest_prog_name, p.signal))
|
||||||
|
else:
|
||||||
|
self.assert_(p.exited)
|
||||||
|
self.assertEquals(expected_exit_code, p.exit_code,
|
||||||
|
"'%s' exited with code %s, which doesn't match "
|
||||||
|
'the expected exit code %s.'
|
||||||
|
% (command, p.exit_code, expected_exit_code))
|
||||||
|
actual = minidom.parse(xml_path)
|
||||||
|
return actual
|
||||||
|
|
||||||
def _TestXmlOutput(self, gtest_prog_name, expected_xml, expected_exit_code):
|
def _TestXmlOutput(self, gtest_prog_name, expected_xml, expected_exit_code):
|
||||||
"""
|
"""
|
||||||
@ -211,30 +269,14 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
|
|||||||
XML document. Furthermore, the program's exit code must be
|
XML document. Furthermore, the program's exit code must be
|
||||||
expected_exit_code.
|
expected_exit_code.
|
||||||
"""
|
"""
|
||||||
xml_path = os.path.join(gtest_test_utils.GetTempDir(),
|
|
||||||
gtest_prog_name + "out.xml")
|
|
||||||
gtest_prog_path = gtest_test_utils.GetTestExecutablePath(gtest_prog_name)
|
|
||||||
|
|
||||||
command = [gtest_prog_path, "%s=xml:%s" % (GTEST_OUTPUT_FLAG, xml_path)]
|
|
||||||
p = gtest_test_utils.Subprocess(command)
|
|
||||||
if p.terminated_by_signal:
|
|
||||||
self.assert_(False,
|
|
||||||
"%s was killed by signal %d" % (gtest_prog_name, p.signal))
|
|
||||||
else:
|
|
||||||
self.assert_(p.exited)
|
|
||||||
self.assertEquals(expected_exit_code, p.exit_code,
|
|
||||||
"'%s' exited with code %s, which doesn't match "
|
|
||||||
"the expected exit code %s."
|
|
||||||
% (command, p.exit_code, expected_exit_code))
|
|
||||||
|
|
||||||
|
actual = self._GetXmlOutput(gtest_prog_name, expected_exit_code)
|
||||||
expected = minidom.parseString(expected_xml)
|
expected = minidom.parseString(expected_xml)
|
||||||
actual = minidom.parse(xml_path)
|
|
||||||
self.NormalizeXml(actual.documentElement)
|
self.NormalizeXml(actual.documentElement)
|
||||||
self.AssertEquivalentNodes(expected.documentElement,
|
self.AssertEquivalentNodes(expected.documentElement,
|
||||||
actual.documentElement)
|
actual.documentElement)
|
||||||
expected.unlink()
|
expected.unlink()
|
||||||
actual .unlink()
|
actual.unlink()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
@ -45,7 +45,6 @@ using ::testing::TestEventListeners;
|
|||||||
using ::testing::TestWithParam;
|
using ::testing::TestWithParam;
|
||||||
using ::testing::UnitTest;
|
using ::testing::UnitTest;
|
||||||
using ::testing::Test;
|
using ::testing::Test;
|
||||||
using ::testing::Types;
|
|
||||||
using ::testing::Values;
|
using ::testing::Values;
|
||||||
|
|
||||||
class SuccessfulTest : public Test {
|
class SuccessfulTest : public Test {
|
||||||
@ -145,23 +144,27 @@ TEST_P(ValueParamTest, HasValueParamAttribute) {}
|
|||||||
TEST_P(ValueParamTest, AnotherTestThatHasValueParamAttribute) {}
|
TEST_P(ValueParamTest, AnotherTestThatHasValueParamAttribute) {}
|
||||||
INSTANTIATE_TEST_CASE_P(Single, ValueParamTest, Values(33, 42));
|
INSTANTIATE_TEST_CASE_P(Single, ValueParamTest, Values(33, 42));
|
||||||
|
|
||||||
|
#if GTEST_HAS_TYPED_TEST
|
||||||
// Verifies that the type parameter name is output in the 'type_param'
|
// Verifies that the type parameter name is output in the 'type_param'
|
||||||
// XML attribute for typed tests.
|
// XML attribute for typed tests.
|
||||||
template <typename T> class TypedTest : public Test {};
|
template <typename T> class TypedTest : public Test {};
|
||||||
typedef Types<int, long> TypedTestTypes;
|
typedef testing::Types<int, long> TypedTestTypes;
|
||||||
TYPED_TEST_CASE(TypedTest, TypedTestTypes);
|
TYPED_TEST_CASE(TypedTest, TypedTestTypes);
|
||||||
TYPED_TEST(TypedTest, HasTypeParamAttribute) {}
|
TYPED_TEST(TypedTest, HasTypeParamAttribute) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if GTEST_HAS_TYPED_TEST_P
|
||||||
// Verifies that the type parameter name is output in the 'type_param'
|
// Verifies that the type parameter name is output in the 'type_param'
|
||||||
// XML attribute for type-parameterized tests.
|
// XML attribute for type-parameterized tests.
|
||||||
template <typename T> class TypeParameterizedTestCase : public Test {};
|
template <typename T> class TypeParameterizedTestCase : public Test {};
|
||||||
TYPED_TEST_CASE_P(TypeParameterizedTestCase);
|
TYPED_TEST_CASE_P(TypeParameterizedTestCase);
|
||||||
TYPED_TEST_P(TypeParameterizedTestCase, HasTypeParamAttribute) {}
|
TYPED_TEST_P(TypeParameterizedTestCase, HasTypeParamAttribute) {}
|
||||||
REGISTER_TYPED_TEST_CASE_P(TypeParameterizedTestCase, HasTypeParamAttribute);
|
REGISTER_TYPED_TEST_CASE_P(TypeParameterizedTestCase, HasTypeParamAttribute);
|
||||||
typedef Types<int, long> TypeParameterizedTestCaseTypes;
|
typedef testing::Types<int, long> TypeParameterizedTestCaseTypes;
|
||||||
INSTANTIATE_TYPED_TEST_CASE_P(Single,
|
INSTANTIATE_TYPED_TEST_CASE_P(Single,
|
||||||
TypeParameterizedTestCase,
|
TypeParameterizedTestCase,
|
||||||
TypeParameterizedTestCaseTypes);
|
TypeParameterizedTestCaseTypes);
|
||||||
|
#endif
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
InitGoogleTest(&argc, argv);
|
InitGoogleTest(&argc, argv);
|
||||||
|
@ -39,8 +39,8 @@ from xml.dom import minidom, Node
|
|||||||
import gtest_test_utils
|
import gtest_test_utils
|
||||||
|
|
||||||
|
|
||||||
GTEST_OUTPUT_FLAG = "--gtest_output"
|
GTEST_OUTPUT_FLAG = '--gtest_output'
|
||||||
GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml"
|
GTEST_DEFAULT_OUTPUT_FILE = 'test_detail.xml'
|
||||||
|
|
||||||
class GTestXMLTestCase(gtest_test_utils.TestCase):
|
class GTestXMLTestCase(gtest_test_utils.TestCase):
|
||||||
"""
|
"""
|
||||||
@ -80,23 +80,23 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
|||||||
actual_attributes = actual_node .attributes
|
actual_attributes = actual_node .attributes
|
||||||
self.assertEquals(
|
self.assertEquals(
|
||||||
expected_attributes.length, actual_attributes.length,
|
expected_attributes.length, actual_attributes.length,
|
||||||
"attribute numbers differ in element " + actual_node.tagName)
|
'attribute numbers differ in element ' + actual_node.tagName)
|
||||||
for i in range(expected_attributes.length):
|
for i in range(expected_attributes.length):
|
||||||
expected_attr = expected_attributes.item(i)
|
expected_attr = expected_attributes.item(i)
|
||||||
actual_attr = actual_attributes.get(expected_attr.name)
|
actual_attr = actual_attributes.get(expected_attr.name)
|
||||||
self.assert_(
|
self.assert_(
|
||||||
actual_attr is not None,
|
actual_attr is not None,
|
||||||
"expected attribute %s not found in element %s" %
|
'expected attribute %s not found in element %s' %
|
||||||
(expected_attr.name, actual_node.tagName))
|
(expected_attr.name, actual_node.tagName))
|
||||||
self.assertEquals(expected_attr.value, actual_attr.value,
|
self.assertEquals(expected_attr.value, actual_attr.value,
|
||||||
" values of attribute %s in element %s differ" %
|
' values of attribute %s in element %s differ' %
|
||||||
(expected_attr.name, actual_node.tagName))
|
(expected_attr.name, actual_node.tagName))
|
||||||
|
|
||||||
expected_children = self._GetChildren(expected_node)
|
expected_children = self._GetChildren(expected_node)
|
||||||
actual_children = self._GetChildren(actual_node)
|
actual_children = self._GetChildren(actual_node)
|
||||||
self.assertEquals(
|
self.assertEquals(
|
||||||
len(expected_children), len(actual_children),
|
len(expected_children), len(actual_children),
|
||||||
"number of child elements differ in element " + actual_node.tagName)
|
'number of child elements differ in element ' + actual_node.tagName)
|
||||||
for child_id, child in expected_children.iteritems():
|
for child_id, child in expected_children.iteritems():
|
||||||
self.assert_(child_id in actual_children,
|
self.assert_(child_id in actual_children,
|
||||||
'<%s> is not in <%s> (in element %s)' %
|
'<%s> is not in <%s> (in element %s)' %
|
||||||
@ -104,10 +104,10 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
|||||||
self.AssertEquivalentNodes(child, actual_children[child_id])
|
self.AssertEquivalentNodes(child, actual_children[child_id])
|
||||||
|
|
||||||
identifying_attribute = {
|
identifying_attribute = {
|
||||||
"testsuites": "name",
|
'testsuites': 'name',
|
||||||
"testsuite": "name",
|
'testsuite': 'name',
|
||||||
"testcase": "name",
|
'testcase': 'name',
|
||||||
"failure": "message",
|
'failure': 'message',
|
||||||
}
|
}
|
||||||
|
|
||||||
def _GetChildren(self, element):
|
def _GetChildren(self, element):
|
||||||
@ -127,20 +127,20 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
|||||||
for child in element.childNodes:
|
for child in element.childNodes:
|
||||||
if child.nodeType == Node.ELEMENT_NODE:
|
if child.nodeType == Node.ELEMENT_NODE:
|
||||||
self.assert_(child.tagName in self.identifying_attribute,
|
self.assert_(child.tagName in self.identifying_attribute,
|
||||||
"Encountered unknown element <%s>" % child.tagName)
|
'Encountered unknown element <%s>' % child.tagName)
|
||||||
childID = child.getAttribute(self.identifying_attribute[child.tagName])
|
childID = child.getAttribute(self.identifying_attribute[child.tagName])
|
||||||
self.assert_(childID not in children)
|
self.assert_(childID not in children)
|
||||||
children[childID] = child
|
children[childID] = child
|
||||||
elif child.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]:
|
elif child.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]:
|
||||||
if "detail" not in children:
|
if 'detail' not in children:
|
||||||
if (child.nodeType == Node.CDATA_SECTION_NODE or
|
if (child.nodeType == Node.CDATA_SECTION_NODE or
|
||||||
not child.nodeValue.isspace()):
|
not child.nodeValue.isspace()):
|
||||||
children["detail"] = child.ownerDocument.createCDATASection(
|
children['detail'] = child.ownerDocument.createCDATASection(
|
||||||
child.nodeValue)
|
child.nodeValue)
|
||||||
else:
|
else:
|
||||||
children["detail"].nodeValue += child.nodeValue
|
children['detail'].nodeValue += child.nodeValue
|
||||||
else:
|
else:
|
||||||
self.fail("Encountered unexpected node type %d" % child.nodeType)
|
self.fail('Encountered unexpected node type %d' % child.nodeType)
|
||||||
return children
|
return children
|
||||||
|
|
||||||
def NormalizeXml(self, element):
|
def NormalizeXml(self, element):
|
||||||
@ -151,6 +151,8 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
|||||||
* The "time" attribute of <testsuites>, <testsuite> and <testcase>
|
* The "time" attribute of <testsuites>, <testsuite> and <testcase>
|
||||||
elements is replaced with a single asterisk, if it contains
|
elements is replaced with a single asterisk, if it contains
|
||||||
only digit characters.
|
only digit characters.
|
||||||
|
* The "timestamp" attribute of <testsuites> elements is replaced with a
|
||||||
|
single asterisk, if it contains a valid ISO8601 datetime value.
|
||||||
* The "type_param" attribute of <testcase> elements is replaced with a
|
* The "type_param" attribute of <testcase> elements is replaced with a
|
||||||
single asterisk (if it sn non-empty) as it is the type name returned
|
single asterisk (if it sn non-empty) as it is the type name returned
|
||||||
by the compiler and is platform dependent.
|
by the compiler and is platform dependent.
|
||||||
@ -160,20 +162,24 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
|||||||
* The stack traces are removed.
|
* The stack traces are removed.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if element.tagName in ("testsuites", "testsuite", "testcase"):
|
if element.tagName == 'testsuites':
|
||||||
time = element.getAttributeNode("time")
|
timestamp = element.getAttributeNode('timestamp')
|
||||||
time.value = re.sub(r"^\d+(\.\d+)?$", "*", time.value)
|
timestamp.value = re.sub(r'^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d$',
|
||||||
type_param = element.getAttributeNode("type_param")
|
'*', timestamp.value)
|
||||||
|
if element.tagName in ('testsuites', 'testsuite', 'testcase'):
|
||||||
|
time = element.getAttributeNode('time')
|
||||||
|
time.value = re.sub(r'^\d+(\.\d+)?$', '*', time.value)
|
||||||
|
type_param = element.getAttributeNode('type_param')
|
||||||
if type_param and type_param.value:
|
if type_param and type_param.value:
|
||||||
type_param.value = "*"
|
type_param.value = '*'
|
||||||
elif element.tagName == "failure":
|
elif element.tagName == 'failure':
|
||||||
for child in element.childNodes:
|
for child in element.childNodes:
|
||||||
if child.nodeType == Node.CDATA_SECTION_NODE:
|
if child.nodeType == Node.CDATA_SECTION_NODE:
|
||||||
# Removes the source line number.
|
# Removes the source line number.
|
||||||
cdata = re.sub(r"^.*[/\\](.*:)\d+\n", "\\1*\n", child.nodeValue)
|
cdata = re.sub(r'^.*[/\\](.*:)\d+\n', '\\1*\n', child.nodeValue)
|
||||||
# Removes the actual stack trace.
|
# Removes the actual stack trace.
|
||||||
child.nodeValue = re.sub(r"\nStack trace:\n(.|\n)*",
|
child.nodeValue = re.sub(r'\nStack trace:\n(.|\n)*',
|
||||||
"", cdata)
|
'', cdata)
|
||||||
for child in element.childNodes:
|
for child in element.childNodes:
|
||||||
if child.nodeType == Node.ELEMENT_NODE:
|
if child.nodeType == Node.ELEMENT_NODE:
|
||||||
self.NormalizeXml(child)
|
self.NormalizeXml(child)
|
||||||
|
@ -54,7 +54,7 @@
|
|||||||
404884A40E2F7BE600CF7658 /* gtest-string.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E60E2F799B00CF7658 /* gtest-string.h */; };
|
404884A40E2F7BE600CF7658 /* gtest-string.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E60E2F799B00CF7658 /* gtest-string.h */; };
|
||||||
404884AC0E2F7CD900CF7658 /* CHANGES in Resources */ = {isa = PBXBuildFile; fileRef = 404884A90E2F7CD900CF7658 /* CHANGES */; };
|
404884AC0E2F7CD900CF7658 /* CHANGES in Resources */ = {isa = PBXBuildFile; fileRef = 404884A90E2F7CD900CF7658 /* CHANGES */; };
|
||||||
404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */ = {isa = PBXBuildFile; fileRef = 404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */; };
|
404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */ = {isa = PBXBuildFile; fileRef = 404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */; };
|
||||||
404884AE0E2F7CD900CF7658 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = 404884AB0E2F7CD900CF7658 /* COPYING */; };
|
404884AE0E2F7CD900CF7658 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 404884AB0E2F7CD900CF7658 /* LICENSE */; };
|
||||||
40899F3A0FFA70D4000B29AE /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = 224A12A10E9EADA700BD17FD /* gtest-all.cc */; };
|
40899F3A0FFA70D4000B29AE /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = 224A12A10E9EADA700BD17FD /* gtest-all.cc */; };
|
||||||
40899F500FFA7281000B29AE /* gtest-tuple.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 40899F4D0FFA7271000B29AE /* gtest-tuple.h */; };
|
40899F500FFA7281000B29AE /* gtest-tuple.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 40899F4D0FFA7271000B29AE /* gtest-tuple.h */; };
|
||||||
40899F530FFA72A0000B29AE /* gtest_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */; };
|
40899F530FFA72A0000B29AE /* gtest_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */; };
|
||||||
@ -221,7 +221,7 @@
|
|||||||
4048840D0E2F799B00CF7658 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gtest_main.cc; sourceTree = "<group>"; };
|
4048840D0E2F799B00CF7658 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gtest_main.cc; sourceTree = "<group>"; };
|
||||||
404884A90E2F7CD900CF7658 /* CHANGES */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CHANGES; path = ../CHANGES; sourceTree = SOURCE_ROOT; };
|
404884A90E2F7CD900CF7658 /* CHANGES */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CHANGES; path = ../CHANGES; sourceTree = SOURCE_ROOT; };
|
||||||
404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CONTRIBUTORS; path = ../CONTRIBUTORS; sourceTree = SOURCE_ROOT; };
|
404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CONTRIBUTORS; path = ../CONTRIBUTORS; sourceTree = SOURCE_ROOT; };
|
||||||
404884AB0E2F7CD900CF7658 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = COPYING; path = ../COPYING; sourceTree = SOURCE_ROOT; };
|
404884AB0E2F7CD900CF7658 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = SOURCE_ROOT; };
|
||||||
40899F430FFA7184000B29AE /* gtest_unittest-framework */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "gtest_unittest-framework"; sourceTree = BUILT_PRODUCTS_DIR; };
|
40899F430FFA7184000B29AE /* gtest_unittest-framework */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "gtest_unittest-framework"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
40899F4D0FFA7271000B29AE /* gtest-tuple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-tuple.h"; sourceTree = "<group>"; };
|
40899F4D0FFA7271000B29AE /* gtest-tuple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-tuple.h"; sourceTree = "<group>"; };
|
||||||
40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = StaticLibraryTarget.xcconfig; sourceTree = "<group>"; };
|
40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = StaticLibraryTarget.xcconfig; sourceTree = "<group>"; };
|
||||||
@ -317,7 +317,7 @@
|
|||||||
children = (
|
children = (
|
||||||
404884A90E2F7CD900CF7658 /* CHANGES */,
|
404884A90E2F7CD900CF7658 /* CHANGES */,
|
||||||
404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */,
|
404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */,
|
||||||
404884AB0E2F7CD900CF7658 /* COPYING */,
|
404884AB0E2F7CD900CF7658 /* LICENSE */,
|
||||||
404883F60E2F799B00CF7658 /* README */,
|
404883F60E2F799B00CF7658 /* README */,
|
||||||
404883D90E2F799B00CF7658 /* include */,
|
404883D90E2F799B00CF7658 /* include */,
|
||||||
4089A02F0FFACF84000B29AE /* samples */,
|
4089A02F0FFACF84000B29AE /* samples */,
|
||||||
@ -616,7 +616,7 @@
|
|||||||
404884500E2F799B00CF7658 /* README in Resources */,
|
404884500E2F799B00CF7658 /* README in Resources */,
|
||||||
404884AC0E2F7CD900CF7658 /* CHANGES in Resources */,
|
404884AC0E2F7CD900CF7658 /* CHANGES in Resources */,
|
||||||
404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */,
|
404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */,
|
||||||
404884AE0E2F7CD900CF7658 /* COPYING in Resources */,
|
404884AE0E2F7CD900CF7658 /* LICENSE in Resources */,
|
||||||
40C84978101A36540083642A /* libgtest_main.a in Resources */,
|
40C84978101A36540083642A /* libgtest_main.a in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
@ -36,13 +36,13 @@
|
|||||||
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
|
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
|
||||||
#define GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
|
#define GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#ifndef _WIN32_WCE
|
#ifndef _WIN32_WCE
|
||||||
# include <errno.h>
|
# include <errno.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "gmock/internal/gmock-internal-utils.h"
|
#include "gmock/internal/gmock-internal-utils.h"
|
||||||
#include "gmock/internal/gmock-port.h"
|
#include "gmock/internal/gmock-port.h"
|
||||||
|
|
||||||
@ -189,6 +189,7 @@ class DefaultValue {
|
|||||||
return value_ == NULL ?
|
return value_ == NULL ?
|
||||||
internal::BuiltInDefaultValue<T>::Get() : *value_;
|
internal::BuiltInDefaultValue<T>::Get() : *value_;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const T* value_;
|
static const T* value_;
|
||||||
};
|
};
|
||||||
@ -224,6 +225,7 @@ class DefaultValue<T&> {
|
|||||||
return address_ == NULL ?
|
return address_ == NULL ?
|
||||||
internal::BuiltInDefaultValue<T&>::Get() : *address_;
|
internal::BuiltInDefaultValue<T&>::Get() : *address_;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static T* address_;
|
static T* address_;
|
||||||
};
|
};
|
||||||
|
@ -80,7 +80,7 @@ class CardinalityInterface {
|
|||||||
// be called. The implementation of Cardinality is just a linked_ptr
|
// be called. The implementation of Cardinality is just a linked_ptr
|
||||||
// to const CardinalityInterface, so copying is fairly cheap.
|
// to const CardinalityInterface, so copying is fairly cheap.
|
||||||
// Don't inherit from Cardinality!
|
// Don't inherit from Cardinality!
|
||||||
class Cardinality {
|
class GTEST_API_ Cardinality {
|
||||||
public:
|
public:
|
||||||
// Constructs a null cardinality. Needed for storing Cardinality
|
// Constructs a null cardinality. Needed for storing Cardinality
|
||||||
// objects in STL containers.
|
// objects in STL containers.
|
||||||
@ -117,24 +117,25 @@ class Cardinality {
|
|||||||
// Describes the given actual call count to an ostream.
|
// Describes the given actual call count to an ostream.
|
||||||
static void DescribeActualCallCountTo(int actual_call_count,
|
static void DescribeActualCallCountTo(int actual_call_count,
|
||||||
::std::ostream* os);
|
::std::ostream* os);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
internal::linked_ptr<const CardinalityInterface> impl_;
|
internal::linked_ptr<const CardinalityInterface> impl_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Creates a cardinality that allows at least n calls.
|
// Creates a cardinality that allows at least n calls.
|
||||||
Cardinality AtLeast(int n);
|
GTEST_API_ Cardinality AtLeast(int n);
|
||||||
|
|
||||||
// Creates a cardinality that allows at most n calls.
|
// Creates a cardinality that allows at most n calls.
|
||||||
Cardinality AtMost(int n);
|
GTEST_API_ Cardinality AtMost(int n);
|
||||||
|
|
||||||
// Creates a cardinality that allows any number of calls.
|
// Creates a cardinality that allows any number of calls.
|
||||||
Cardinality AnyNumber();
|
GTEST_API_ Cardinality AnyNumber();
|
||||||
|
|
||||||
// Creates a cardinality that allows between min and max calls.
|
// Creates a cardinality that allows between min and max calls.
|
||||||
Cardinality Between(int min, int max);
|
GTEST_API_ Cardinality Between(int min, int max);
|
||||||
|
|
||||||
// Creates a cardinality that allows exactly n calls.
|
// Creates a cardinality that allows exactly n calls.
|
||||||
Cardinality Exactly(int n);
|
GTEST_API_ Cardinality Exactly(int n);
|
||||||
|
|
||||||
// Creates a cardinality from its implementation.
|
// Creates a cardinality from its implementation.
|
||||||
inline Cardinality MakeCardinality(const CardinalityInterface* c) {
|
inline Cardinality MakeCardinality(const CardinalityInterface* c) {
|
||||||
|
@ -381,7 +381,6 @@ class CallableHelper {
|
|||||||
A7 a7, A8 a8, A9 a9, A10 a10) {
|
A7 a7, A8 a8, A9 a9, A10 a10) {
|
||||||
return function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
|
return function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
|
||||||
}
|
}
|
||||||
|
|
||||||
}; // class CallableHelper
|
}; // class CallableHelper
|
||||||
|
|
||||||
// An INTERNAL macro for extracting the type of a tuple field. It's
|
// An INTERNAL macro for extracting the type of a tuple field. It's
|
||||||
@ -1018,16 +1017,16 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
|
|||||||
|
|
||||||
// An internal macro needed for implementing ACTION*().
|
// An internal macro needed for implementing ACTION*().
|
||||||
#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
|
#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
|
||||||
const args_type& args GTEST_ATTRIBUTE_UNUSED_,\
|
const args_type& args GTEST_ATTRIBUTE_UNUSED_, \
|
||||||
arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_,\
|
arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_, \
|
||||||
arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_,\
|
arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_, \
|
||||||
arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_,\
|
arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_, \
|
||||||
arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_,\
|
arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_, \
|
||||||
arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_,\
|
arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_, \
|
||||||
arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_,\
|
arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_, \
|
||||||
arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_,\
|
arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_, \
|
||||||
arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_,\
|
arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_, \
|
||||||
arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_,\
|
arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_, \
|
||||||
arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_
|
arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_
|
||||||
|
|
||||||
// Sometimes you want to give an action explicit template parameters
|
// Sometimes you want to give an action explicit template parameters
|
||||||
@ -1433,9 +1432,9 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
|
|||||||
template <GMOCK_INTERNAL_DECL_##template_params\
|
template <GMOCK_INTERNAL_DECL_##template_params\
|
||||||
GMOCK_INTERNAL_DECL_TYPE_##value_params>\
|
GMOCK_INTERNAL_DECL_TYPE_##value_params>\
|
||||||
template <typename F>\
|
template <typename F>\
|
||||||
template <typename arg0_type, typename arg1_type, typename arg2_type,\
|
template <typename arg0_type, typename arg1_type, typename arg2_type, \
|
||||||
typename arg3_type, typename arg4_type, typename arg5_type,\
|
typename arg3_type, typename arg4_type, typename arg5_type, \
|
||||||
typename arg6_type, typename arg7_type, typename arg8_type,\
|
typename arg6_type, typename arg7_type, typename arg8_type, \
|
||||||
typename arg9_type>\
|
typename arg9_type>\
|
||||||
typename ::testing::internal::Function<F>::Result\
|
typename ::testing::internal::Function<F>::Result\
|
||||||
GMOCK_ACTION_CLASS_(name, value_params)<\
|
GMOCK_ACTION_CLASS_(name, value_params)<\
|
||||||
|
@ -136,7 +136,6 @@ $var Ts = [[$for j, [[T$j]]]]
|
|||||||
}
|
}
|
||||||
|
|
||||||
]]
|
]]
|
||||||
|
|
||||||
}; // class CallableHelper
|
}; // class CallableHelper
|
||||||
|
|
||||||
// An INTERNAL macro for extracting the type of a tuple field. It's
|
// An INTERNAL macro for extracting the type of a tuple field. It's
|
||||||
@ -427,7 +426,7 @@ $range k 0..n-1
|
|||||||
// An internal macro needed for implementing ACTION*().
|
// An internal macro needed for implementing ACTION*().
|
||||||
#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
|
#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
|
||||||
const args_type& args GTEST_ATTRIBUTE_UNUSED_
|
const args_type& args GTEST_ATTRIBUTE_UNUSED_
|
||||||
$for k [[,\
|
$for k [[, \
|
||||||
arg$k[[]]_type arg$k GTEST_ATTRIBUTE_UNUSED_]]
|
arg$k[[]]_type arg$k GTEST_ATTRIBUTE_UNUSED_]]
|
||||||
|
|
||||||
|
|
||||||
@ -657,9 +656,9 @@ $for k [[, arg$k[[]]_type arg$k]]) const;\
|
|||||||
template <GMOCK_INTERNAL_DECL_##template_params\
|
template <GMOCK_INTERNAL_DECL_##template_params\
|
||||||
GMOCK_INTERNAL_DECL_TYPE_##value_params>\
|
GMOCK_INTERNAL_DECL_TYPE_##value_params>\
|
||||||
template <typename F>\
|
template <typename F>\
|
||||||
template <typename arg0_type, typename arg1_type, typename arg2_type,\
|
template <typename arg0_type, typename arg1_type, typename arg2_type, \
|
||||||
typename arg3_type, typename arg4_type, typename arg5_type,\
|
typename arg3_type, typename arg4_type, typename arg5_type, \
|
||||||
typename arg6_type, typename arg7_type, typename arg8_type,\
|
typename arg6_type, typename arg7_type, typename arg8_type, \
|
||||||
typename arg9_type>\
|
typename arg9_type>\
|
||||||
typename ::testing::internal::Function<F>::Result\
|
typename ::testing::internal::Function<F>::Result\
|
||||||
GMOCK_ACTION_CLASS_(name, value_params)<\
|
GMOCK_ACTION_CLASS_(name, value_params)<\
|
||||||
|
@ -661,6 +661,182 @@ class ElementsAreMatcher10 {
|
|||||||
GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher10);
|
GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher10);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// A set of metafunctions for computing the result type of AllOf.
|
||||||
|
// AllOf(m1, ..., mN) returns
|
||||||
|
// AllOfResultN<decltype(m1), ..., decltype(mN)>::type.
|
||||||
|
|
||||||
|
// Although AllOf isn't defined for one argument, AllOfResult1 is defined
|
||||||
|
// to simplify the implementation.
|
||||||
|
template <typename M1>
|
||||||
|
struct AllOfResult1 {
|
||||||
|
typedef M1 type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2>
|
||||||
|
struct AllOfResult2 {
|
||||||
|
typedef BothOfMatcher<
|
||||||
|
typename AllOfResult1<M1>::type,
|
||||||
|
typename AllOfResult1<M2>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3>
|
||||||
|
struct AllOfResult3 {
|
||||||
|
typedef BothOfMatcher<
|
||||||
|
typename AllOfResult1<M1>::type,
|
||||||
|
typename AllOfResult2<M2, M3>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4>
|
||||||
|
struct AllOfResult4 {
|
||||||
|
typedef BothOfMatcher<
|
||||||
|
typename AllOfResult2<M1, M2>::type,
|
||||||
|
typename AllOfResult2<M3, M4>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4, typename M5>
|
||||||
|
struct AllOfResult5 {
|
||||||
|
typedef BothOfMatcher<
|
||||||
|
typename AllOfResult2<M1, M2>::type,
|
||||||
|
typename AllOfResult3<M3, M4, M5>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
|
typename M6>
|
||||||
|
struct AllOfResult6 {
|
||||||
|
typedef BothOfMatcher<
|
||||||
|
typename AllOfResult3<M1, M2, M3>::type,
|
||||||
|
typename AllOfResult3<M4, M5, M6>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
|
typename M6, typename M7>
|
||||||
|
struct AllOfResult7 {
|
||||||
|
typedef BothOfMatcher<
|
||||||
|
typename AllOfResult3<M1, M2, M3>::type,
|
||||||
|
typename AllOfResult4<M4, M5, M6, M7>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
|
typename M6, typename M7, typename M8>
|
||||||
|
struct AllOfResult8 {
|
||||||
|
typedef BothOfMatcher<
|
||||||
|
typename AllOfResult4<M1, M2, M3, M4>::type,
|
||||||
|
typename AllOfResult4<M5, M6, M7, M8>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
|
typename M6, typename M7, typename M8, typename M9>
|
||||||
|
struct AllOfResult9 {
|
||||||
|
typedef BothOfMatcher<
|
||||||
|
typename AllOfResult4<M1, M2, M3, M4>::type,
|
||||||
|
typename AllOfResult5<M5, M6, M7, M8, M9>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
|
typename M6, typename M7, typename M8, typename M9, typename M10>
|
||||||
|
struct AllOfResult10 {
|
||||||
|
typedef BothOfMatcher<
|
||||||
|
typename AllOfResult5<M1, M2, M3, M4, M5>::type,
|
||||||
|
typename AllOfResult5<M6, M7, M8, M9, M10>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
// A set of metafunctions for computing the result type of AnyOf.
|
||||||
|
// AnyOf(m1, ..., mN) returns
|
||||||
|
// AnyOfResultN<decltype(m1), ..., decltype(mN)>::type.
|
||||||
|
|
||||||
|
// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined
|
||||||
|
// to simplify the implementation.
|
||||||
|
template <typename M1>
|
||||||
|
struct AnyOfResult1 {
|
||||||
|
typedef M1 type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2>
|
||||||
|
struct AnyOfResult2 {
|
||||||
|
typedef EitherOfMatcher<
|
||||||
|
typename AnyOfResult1<M1>::type,
|
||||||
|
typename AnyOfResult1<M2>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3>
|
||||||
|
struct AnyOfResult3 {
|
||||||
|
typedef EitherOfMatcher<
|
||||||
|
typename AnyOfResult1<M1>::type,
|
||||||
|
typename AnyOfResult2<M2, M3>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4>
|
||||||
|
struct AnyOfResult4 {
|
||||||
|
typedef EitherOfMatcher<
|
||||||
|
typename AnyOfResult2<M1, M2>::type,
|
||||||
|
typename AnyOfResult2<M3, M4>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4, typename M5>
|
||||||
|
struct AnyOfResult5 {
|
||||||
|
typedef EitherOfMatcher<
|
||||||
|
typename AnyOfResult2<M1, M2>::type,
|
||||||
|
typename AnyOfResult3<M3, M4, M5>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
|
typename M6>
|
||||||
|
struct AnyOfResult6 {
|
||||||
|
typedef EitherOfMatcher<
|
||||||
|
typename AnyOfResult3<M1, M2, M3>::type,
|
||||||
|
typename AnyOfResult3<M4, M5, M6>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
|
typename M6, typename M7>
|
||||||
|
struct AnyOfResult7 {
|
||||||
|
typedef EitherOfMatcher<
|
||||||
|
typename AnyOfResult3<M1, M2, M3>::type,
|
||||||
|
typename AnyOfResult4<M4, M5, M6, M7>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
|
typename M6, typename M7, typename M8>
|
||||||
|
struct AnyOfResult8 {
|
||||||
|
typedef EitherOfMatcher<
|
||||||
|
typename AnyOfResult4<M1, M2, M3, M4>::type,
|
||||||
|
typename AnyOfResult4<M5, M6, M7, M8>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
|
typename M6, typename M7, typename M8, typename M9>
|
||||||
|
struct AnyOfResult9 {
|
||||||
|
typedef EitherOfMatcher<
|
||||||
|
typename AnyOfResult4<M1, M2, M3, M4>::type,
|
||||||
|
typename AnyOfResult5<M5, M6, M7, M8, M9>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
|
typename M6, typename M7, typename M8, typename M9, typename M10>
|
||||||
|
struct AnyOfResult10 {
|
||||||
|
typedef EitherOfMatcher<
|
||||||
|
typename AnyOfResult5<M1, M2, M3, M4, M5>::type,
|
||||||
|
typename AnyOfResult5<M6, M7, M8, M9, M10>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
|
// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
|
||||||
@ -852,187 +1028,167 @@ ElementsAreArray(const T (&array)[N]) {
|
|||||||
// AllOf(m1, m2, ..., mk) matches any value that matches all of the given
|
// AllOf(m1, m2, ..., mk) matches any value that matches all of the given
|
||||||
// sub-matchers. AllOf is called fully qualified to prevent ADL from firing.
|
// sub-matchers. AllOf is called fully qualified to prevent ADL from firing.
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2>
|
template <typename M1, typename M2>
|
||||||
inline internal::BothOfMatcher<Matcher1, Matcher2>
|
inline typename internal::AllOfResult2<M1, M2>::type
|
||||||
AllOf(Matcher1 m1, Matcher2 m2) {
|
AllOf(M1 m1, M2 m2) {
|
||||||
return internal::BothOfMatcher<Matcher1, Matcher2>(m1, m2);
|
return typename internal::AllOfResult2<M1, M2>::type(
|
||||||
|
m1,
|
||||||
|
m2);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3>
|
template <typename M1, typename M2, typename M3>
|
||||||
inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
|
inline typename internal::AllOfResult3<M1, M2, M3>::type
|
||||||
Matcher3> >
|
AllOf(M1 m1, M2 m2, M3 m3) {
|
||||||
AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) {
|
return typename internal::AllOfResult3<M1, M2, M3>::type(
|
||||||
return ::testing::AllOf(m1, ::testing::AllOf(m2, m3));
|
m1,
|
||||||
|
::testing::AllOf(m2, m3));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4>
|
||||||
typename Matcher4>
|
inline typename internal::AllOfResult4<M1, M2, M3, M4>::type
|
||||||
inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
|
AllOf(M1 m1, M2 m2, M3 m3, M4 m4) {
|
||||||
internal::BothOfMatcher<Matcher3, Matcher4> > >
|
return typename internal::AllOfResult4<M1, M2, M3, M4>::type(
|
||||||
AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) {
|
::testing::AllOf(m1, m2),
|
||||||
return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4));
|
::testing::AllOf(m3, m4));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4, typename M5>
|
||||||
typename Matcher4, typename Matcher5>
|
inline typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type
|
||||||
inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
|
AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {
|
||||||
internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4,
|
return typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type(
|
||||||
Matcher5> > > >
|
::testing::AllOf(m1, m2),
|
||||||
AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) {
|
::testing::AllOf(m3, m4, m5));
|
||||||
return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
typename Matcher4, typename Matcher5, typename Matcher6>
|
typename M6>
|
||||||
inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
|
inline typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type
|
||||||
internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4,
|
AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {
|
||||||
internal::BothOfMatcher<Matcher5, Matcher6> > > > >
|
return typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type(
|
||||||
AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
::testing::AllOf(m1, m2, m3),
|
||||||
Matcher6 m6) {
|
::testing::AllOf(m4, m5, m6));
|
||||||
return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7>
|
typename M6, typename M7>
|
||||||
inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
|
inline typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type
|
||||||
internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4,
|
AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {
|
||||||
internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6,
|
return typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(
|
||||||
Matcher7> > > > > >
|
::testing::AllOf(m1, m2, m3),
|
||||||
AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
::testing::AllOf(m4, m5, m6, m7));
|
||||||
Matcher6 m6, Matcher7 m7) {
|
|
||||||
return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7,
|
typename M6, typename M7, typename M8>
|
||||||
typename Matcher8>
|
inline typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type
|
||||||
inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
|
AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {
|
||||||
internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4,
|
return typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(
|
||||||
internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6,
|
::testing::AllOf(m1, m2, m3, m4),
|
||||||
internal::BothOfMatcher<Matcher7, Matcher8> > > > > > >
|
::testing::AllOf(m5, m6, m7, m8));
|
||||||
AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|
||||||
Matcher6 m6, Matcher7 m7, Matcher8 m8) {
|
|
||||||
return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7, m8));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7,
|
typename M6, typename M7, typename M8, typename M9>
|
||||||
typename Matcher8, typename Matcher9>
|
inline typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type
|
||||||
inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
|
AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {
|
||||||
internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4,
|
return typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,
|
||||||
internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6,
|
M9>::type(
|
||||||
internal::BothOfMatcher<Matcher7, internal::BothOfMatcher<Matcher8,
|
::testing::AllOf(m1, m2, m3, m4),
|
||||||
Matcher9> > > > > > > >
|
::testing::AllOf(m5, m6, m7, m8, m9));
|
||||||
AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|
||||||
Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9) {
|
|
||||||
return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7, m8, m9));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7,
|
typename M6, typename M7, typename M8, typename M9, typename M10>
|
||||||
typename Matcher8, typename Matcher9, typename Matcher10>
|
inline typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
|
||||||
inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
|
M10>::type
|
||||||
internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4,
|
AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {
|
||||||
internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6,
|
return typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
|
||||||
internal::BothOfMatcher<Matcher7, internal::BothOfMatcher<Matcher8,
|
M10>::type(
|
||||||
internal::BothOfMatcher<Matcher9, Matcher10> > > > > > > > >
|
::testing::AllOf(m1, m2, m3, m4, m5),
|
||||||
AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
::testing::AllOf(m6, m7, m8, m9, m10));
|
||||||
Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9, Matcher10 m10) {
|
|
||||||
return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7, m8, m9,
|
|
||||||
m10));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given
|
// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given
|
||||||
// sub-matchers. AnyOf is called fully qualified to prevent ADL from firing.
|
// sub-matchers. AnyOf is called fully qualified to prevent ADL from firing.
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2>
|
template <typename M1, typename M2>
|
||||||
inline internal::EitherOfMatcher<Matcher1, Matcher2>
|
inline typename internal::AnyOfResult2<M1, M2>::type
|
||||||
AnyOf(Matcher1 m1, Matcher2 m2) {
|
AnyOf(M1 m1, M2 m2) {
|
||||||
return internal::EitherOfMatcher<Matcher1, Matcher2>(m1, m2);
|
return typename internal::AnyOfResult2<M1, M2>::type(
|
||||||
|
m1,
|
||||||
|
m2);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3>
|
template <typename M1, typename M2, typename M3>
|
||||||
inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
|
inline typename internal::AnyOfResult3<M1, M2, M3>::type
|
||||||
Matcher3> >
|
AnyOf(M1 m1, M2 m2, M3 m3) {
|
||||||
AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) {
|
return typename internal::AnyOfResult3<M1, M2, M3>::type(
|
||||||
return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3));
|
m1,
|
||||||
|
::testing::AnyOf(m2, m3));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4>
|
||||||
typename Matcher4>
|
inline typename internal::AnyOfResult4<M1, M2, M3, M4>::type
|
||||||
inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
|
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4) {
|
||||||
internal::EitherOfMatcher<Matcher3, Matcher4> > >
|
return typename internal::AnyOfResult4<M1, M2, M3, M4>::type(
|
||||||
AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) {
|
::testing::AnyOf(m1, m2),
|
||||||
return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4));
|
::testing::AnyOf(m3, m4));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4, typename M5>
|
||||||
typename Matcher4, typename Matcher5>
|
inline typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type
|
||||||
inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
|
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {
|
||||||
internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4,
|
return typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type(
|
||||||
Matcher5> > > >
|
::testing::AnyOf(m1, m2),
|
||||||
AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) {
|
::testing::AnyOf(m3, m4, m5));
|
||||||
return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
typename Matcher4, typename Matcher5, typename Matcher6>
|
typename M6>
|
||||||
inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
|
inline typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type
|
||||||
internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4,
|
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {
|
||||||
internal::EitherOfMatcher<Matcher5, Matcher6> > > > >
|
return typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type(
|
||||||
AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
::testing::AnyOf(m1, m2, m3),
|
||||||
Matcher6 m6) {
|
::testing::AnyOf(m4, m5, m6));
|
||||||
return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7>
|
typename M6, typename M7>
|
||||||
inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
|
inline typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type
|
||||||
internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4,
|
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {
|
||||||
internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6,
|
return typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(
|
||||||
Matcher7> > > > > >
|
::testing::AnyOf(m1, m2, m3),
|
||||||
AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
::testing::AnyOf(m4, m5, m6, m7));
|
||||||
Matcher6 m6, Matcher7 m7) {
|
|
||||||
return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7,
|
typename M6, typename M7, typename M8>
|
||||||
typename Matcher8>
|
inline typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type
|
||||||
inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
|
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {
|
||||||
internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4,
|
return typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(
|
||||||
internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6,
|
::testing::AnyOf(m1, m2, m3, m4),
|
||||||
internal::EitherOfMatcher<Matcher7, Matcher8> > > > > > >
|
::testing::AnyOf(m5, m6, m7, m8));
|
||||||
AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|
||||||
Matcher6 m6, Matcher7 m7, Matcher8 m8) {
|
|
||||||
return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7, m8));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7,
|
typename M6, typename M7, typename M8, typename M9>
|
||||||
typename Matcher8, typename Matcher9>
|
inline typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type
|
||||||
inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
|
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {
|
||||||
internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4,
|
return typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,
|
||||||
internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6,
|
M9>::type(
|
||||||
internal::EitherOfMatcher<Matcher7, internal::EitherOfMatcher<Matcher8,
|
::testing::AnyOf(m1, m2, m3, m4),
|
||||||
Matcher9> > > > > > > >
|
::testing::AnyOf(m5, m6, m7, m8, m9));
|
||||||
AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|
||||||
Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9) {
|
|
||||||
return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7, m8, m9));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Matcher1, typename Matcher2, typename Matcher3,
|
template <typename M1, typename M2, typename M3, typename M4, typename M5,
|
||||||
typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7,
|
typename M6, typename M7, typename M8, typename M9, typename M10>
|
||||||
typename Matcher8, typename Matcher9, typename Matcher10>
|
inline typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
|
||||||
inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
|
M10>::type
|
||||||
internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4,
|
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {
|
||||||
internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6,
|
return typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
|
||||||
internal::EitherOfMatcher<Matcher7, internal::EitherOfMatcher<Matcher8,
|
M10>::type(
|
||||||
internal::EitherOfMatcher<Matcher9, Matcher10> > > > > > > > >
|
::testing::AnyOf(m1, m2, m3, m4, m5),
|
||||||
AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
::testing::AnyOf(m6, m7, m8, m9, m10));
|
||||||
Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9, Matcher10 m10) {
|
|
||||||
return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7, m8, m9,
|
|
||||||
m10));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
@ -1275,7 +1431,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
if (!gmock_description.empty())\
|
if (!gmock_description.empty())\
|
||||||
return gmock_description;\
|
return gmock_description;\
|
||||||
return ::testing::internal::FormatMatcherDescription(\
|
return ::testing::internal::FormatMatcherDescription(\
|
||||||
negation, #name,\
|
negation, #name, \
|
||||||
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
||||||
::std::tr1::tuple<>()));\
|
::std::tr1::tuple<>()));\
|
||||||
}\
|
}\
|
||||||
@ -1296,7 +1452,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
}\
|
}\
|
||||||
template <typename arg_type>\
|
template <typename arg_type>\
|
||||||
bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\
|
bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\
|
||||||
arg_type arg,\
|
arg_type arg, \
|
||||||
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
||||||
const
|
const
|
||||||
|
|
||||||
@ -1324,7 +1480,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
if (!gmock_description.empty())\
|
if (!gmock_description.empty())\
|
||||||
return gmock_description;\
|
return gmock_description;\
|
||||||
return ::testing::internal::FormatMatcherDescription(\
|
return ::testing::internal::FormatMatcherDescription(\
|
||||||
negation, #name,\
|
negation, #name, \
|
||||||
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
||||||
::std::tr1::tuple<p0##_type>(p0)));\
|
::std::tr1::tuple<p0##_type>(p0)));\
|
||||||
}\
|
}\
|
||||||
@ -1348,7 +1504,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
template <typename p0##_type>\
|
template <typename p0##_type>\
|
||||||
template <typename arg_type>\
|
template <typename arg_type>\
|
||||||
bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
||||||
arg_type arg,\
|
arg_type arg, \
|
||||||
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
||||||
const
|
const
|
||||||
|
|
||||||
@ -1377,7 +1533,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
if (!gmock_description.empty())\
|
if (!gmock_description.empty())\
|
||||||
return gmock_description;\
|
return gmock_description;\
|
||||||
return ::testing::internal::FormatMatcherDescription(\
|
return ::testing::internal::FormatMatcherDescription(\
|
||||||
negation, #name,\
|
negation, #name, \
|
||||||
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
||||||
::std::tr1::tuple<p0##_type, p1##_type>(p0, p1)));\
|
::std::tr1::tuple<p0##_type, p1##_type>(p0, p1)));\
|
||||||
}\
|
}\
|
||||||
@ -1405,7 +1561,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
template <typename arg_type>\
|
template <typename arg_type>\
|
||||||
bool name##MatcherP2<p0##_type, \
|
bool name##MatcherP2<p0##_type, \
|
||||||
p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
||||||
arg_type arg,\
|
arg_type arg, \
|
||||||
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
||||||
const
|
const
|
||||||
|
|
||||||
@ -1435,7 +1591,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
if (!gmock_description.empty())\
|
if (!gmock_description.empty())\
|
||||||
return gmock_description;\
|
return gmock_description;\
|
||||||
return ::testing::internal::FormatMatcherDescription(\
|
return ::testing::internal::FormatMatcherDescription(\
|
||||||
negation, #name,\
|
negation, #name, \
|
||||||
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
||||||
::std::tr1::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \
|
::std::tr1::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \
|
||||||
p2)));\
|
p2)));\
|
||||||
@ -1465,7 +1621,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
template <typename arg_type>\
|
template <typename arg_type>\
|
||||||
bool name##MatcherP3<p0##_type, p1##_type, \
|
bool name##MatcherP3<p0##_type, p1##_type, \
|
||||||
p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
||||||
arg_type arg,\
|
arg_type arg, \
|
||||||
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
||||||
const
|
const
|
||||||
|
|
||||||
@ -1498,7 +1654,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
if (!gmock_description.empty())\
|
if (!gmock_description.empty())\
|
||||||
return gmock_description;\
|
return gmock_description;\
|
||||||
return ::testing::internal::FormatMatcherDescription(\
|
return ::testing::internal::FormatMatcherDescription(\
|
||||||
negation, #name,\
|
negation, #name, \
|
||||||
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
||||||
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, \
|
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, \
|
||||||
p3##_type>(p0, p1, p2, p3)));\
|
p3##_type>(p0, p1, p2, p3)));\
|
||||||
@ -1534,7 +1690,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
template <typename arg_type>\
|
template <typename arg_type>\
|
||||||
bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \
|
bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \
|
||||||
p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
||||||
arg_type arg,\
|
arg_type arg, \
|
||||||
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
||||||
const
|
const
|
||||||
|
|
||||||
@ -1569,7 +1725,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
if (!gmock_description.empty())\
|
if (!gmock_description.empty())\
|
||||||
return gmock_description;\
|
return gmock_description;\
|
||||||
return ::testing::internal::FormatMatcherDescription(\
|
return ::testing::internal::FormatMatcherDescription(\
|
||||||
negation, #name,\
|
negation, #name, \
|
||||||
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
||||||
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
|
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
|
||||||
p4##_type>(p0, p1, p2, p3, p4)));\
|
p4##_type>(p0, p1, p2, p3, p4)));\
|
||||||
@ -1607,7 +1763,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
template <typename arg_type>\
|
template <typename arg_type>\
|
||||||
bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
|
bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
|
||||||
p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
||||||
arg_type arg,\
|
arg_type arg, \
|
||||||
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
||||||
const
|
const
|
||||||
|
|
||||||
@ -1643,7 +1799,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
if (!gmock_description.empty())\
|
if (!gmock_description.empty())\
|
||||||
return gmock_description;\
|
return gmock_description;\
|
||||||
return ::testing::internal::FormatMatcherDescription(\
|
return ::testing::internal::FormatMatcherDescription(\
|
||||||
negation, #name,\
|
negation, #name, \
|
||||||
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
||||||
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
|
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
|
||||||
p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\
|
p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\
|
||||||
@ -1682,7 +1838,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
template <typename arg_type>\
|
template <typename arg_type>\
|
||||||
bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
|
bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
|
||||||
p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
||||||
arg_type arg,\
|
arg_type arg, \
|
||||||
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
||||||
const
|
const
|
||||||
|
|
||||||
@ -1721,7 +1877,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
if (!gmock_description.empty())\
|
if (!gmock_description.empty())\
|
||||||
return gmock_description;\
|
return gmock_description;\
|
||||||
return ::testing::internal::FormatMatcherDescription(\
|
return ::testing::internal::FormatMatcherDescription(\
|
||||||
negation, #name,\
|
negation, #name, \
|
||||||
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
||||||
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
|
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
|
||||||
p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \
|
p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \
|
||||||
@ -1766,7 +1922,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
template <typename arg_type>\
|
template <typename arg_type>\
|
||||||
bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
|
bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
|
||||||
p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
||||||
arg_type arg,\
|
arg_type arg, \
|
||||||
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
||||||
const
|
const
|
||||||
|
|
||||||
@ -1806,7 +1962,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
if (!gmock_description.empty())\
|
if (!gmock_description.empty())\
|
||||||
return gmock_description;\
|
return gmock_description;\
|
||||||
return ::testing::internal::FormatMatcherDescription(\
|
return ::testing::internal::FormatMatcherDescription(\
|
||||||
negation, #name,\
|
negation, #name, \
|
||||||
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
||||||
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
|
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
|
||||||
p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \
|
p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \
|
||||||
@ -1855,7 +2011,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
|
bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
|
||||||
p5##_type, p6##_type, \
|
p5##_type, p6##_type, \
|
||||||
p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
||||||
arg_type arg,\
|
arg_type arg, \
|
||||||
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
||||||
const
|
const
|
||||||
|
|
||||||
@ -1897,7 +2053,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
if (!gmock_description.empty())\
|
if (!gmock_description.empty())\
|
||||||
return gmock_description;\
|
return gmock_description;\
|
||||||
return ::testing::internal::FormatMatcherDescription(\
|
return ::testing::internal::FormatMatcherDescription(\
|
||||||
negation, #name,\
|
negation, #name, \
|
||||||
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
||||||
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
|
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
|
||||||
p4##_type, p5##_type, p6##_type, p7##_type, \
|
p4##_type, p5##_type, p6##_type, p7##_type, \
|
||||||
@ -1948,7 +2104,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
|
bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
|
||||||
p5##_type, p6##_type, p7##_type, \
|
p5##_type, p6##_type, p7##_type, \
|
||||||
p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
||||||
arg_type arg,\
|
arg_type arg, \
|
||||||
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
||||||
const
|
const
|
||||||
|
|
||||||
@ -1993,7 +2149,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
if (!gmock_description.empty())\
|
if (!gmock_description.empty())\
|
||||||
return gmock_description;\
|
return gmock_description;\
|
||||||
return ::testing::internal::FormatMatcherDescription(\
|
return ::testing::internal::FormatMatcherDescription(\
|
||||||
negation, #name,\
|
negation, #name, \
|
||||||
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
||||||
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
|
::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
|
||||||
p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
|
p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
|
||||||
@ -2047,7 +2203,7 @@ AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5,
|
|||||||
bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
|
bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
|
||||||
p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
|
p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
|
||||||
p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
|
||||||
arg_type arg,\
|
arg_type arg, \
|
||||||
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
||||||
const
|
const
|
||||||
|
|
||||||
|
@ -242,6 +242,66 @@ $for j [[
|
|||||||
|
|
||||||
|
|
||||||
]]
|
]]
|
||||||
|
// A set of metafunctions for computing the result type of AllOf.
|
||||||
|
// AllOf(m1, ..., mN) returns
|
||||||
|
// AllOfResultN<decltype(m1), ..., decltype(mN)>::type.
|
||||||
|
|
||||||
|
// Although AllOf isn't defined for one argument, AllOfResult1 is defined
|
||||||
|
// to simplify the implementation.
|
||||||
|
template <typename M1>
|
||||||
|
struct AllOfResult1 {
|
||||||
|
typedef M1 type;
|
||||||
|
};
|
||||||
|
|
||||||
|
$range i 1..n
|
||||||
|
|
||||||
|
$range i 2..n
|
||||||
|
$for i [[
|
||||||
|
$range j 2..i
|
||||||
|
$var m = i/2
|
||||||
|
$range k 1..m
|
||||||
|
$range t m+1..i
|
||||||
|
|
||||||
|
template <typename M1$for j [[, typename M$j]]>
|
||||||
|
struct AllOfResult$i {
|
||||||
|
typedef BothOfMatcher<
|
||||||
|
typename AllOfResult$m<$for k, [[M$k]]>::type,
|
||||||
|
typename AllOfResult$(i-m)<$for t, [[M$t]]>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
]]
|
||||||
|
|
||||||
|
// A set of metafunctions for computing the result type of AnyOf.
|
||||||
|
// AnyOf(m1, ..., mN) returns
|
||||||
|
// AnyOfResultN<decltype(m1), ..., decltype(mN)>::type.
|
||||||
|
|
||||||
|
// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined
|
||||||
|
// to simplify the implementation.
|
||||||
|
template <typename M1>
|
||||||
|
struct AnyOfResult1 {
|
||||||
|
typedef M1 type;
|
||||||
|
};
|
||||||
|
|
||||||
|
$range i 1..n
|
||||||
|
|
||||||
|
$range i 2..n
|
||||||
|
$for i [[
|
||||||
|
$range j 2..i
|
||||||
|
$var m = i/2
|
||||||
|
$range k 1..m
|
||||||
|
$range t m+1..i
|
||||||
|
|
||||||
|
template <typename M1$for j [[, typename M$j]]>
|
||||||
|
struct AnyOfResult$i {
|
||||||
|
typedef EitherOfMatcher<
|
||||||
|
typename AnyOfResult$m<$for k, [[M$k]]>::type,
|
||||||
|
typename AnyOfResult$(i-m)<$for t, [[M$t]]>::type
|
||||||
|
> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
]]
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
|
// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
|
||||||
@ -308,19 +368,16 @@ ElementsAreArray(const T (&array)[N]) {
|
|||||||
$range i 2..n
|
$range i 2..n
|
||||||
$for i [[
|
$for i [[
|
||||||
$range j 1..i
|
$range j 1..i
|
||||||
$range k 1..i-1
|
$var m = i/2
|
||||||
|
$range k 1..m
|
||||||
template <$for j, [[typename Matcher$j]]>
|
$range t m+1..i
|
||||||
inline $for k[[internal::BothOfMatcher<Matcher$k, ]]Matcher$i[[]]$for k [[> ]]
|
|
||||||
|
|
||||||
AllOf($for j, [[Matcher$j m$j]]) {
|
|
||||||
|
|
||||||
$if i == 2 [[
|
|
||||||
return internal::BothOfMatcher<Matcher1, Matcher2>(m1, m2);
|
|
||||||
]] $else [[
|
|
||||||
return ::testing::AllOf(m1, ::testing::AllOf($for k, [[m$(k + 1)]]));
|
|
||||||
]]
|
|
||||||
|
|
||||||
|
template <$for j, [[typename M$j]]>
|
||||||
|
inline typename internal::AllOfResult$i<$for j, [[M$j]]>::type
|
||||||
|
AllOf($for j, [[M$j m$j]]) {
|
||||||
|
return typename internal::AllOfResult$i<$for j, [[M$j]]>::type(
|
||||||
|
$if m == 1 [[m1]] $else [[::testing::AllOf($for k, [[m$k]])]],
|
||||||
|
$if m+1 == i [[m$i]] $else [[::testing::AllOf($for t, [[m$t]])]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
]]
|
]]
|
||||||
@ -331,19 +388,16 @@ $if i == 2 [[
|
|||||||
$range i 2..n
|
$range i 2..n
|
||||||
$for i [[
|
$for i [[
|
||||||
$range j 1..i
|
$range j 1..i
|
||||||
$range k 1..i-1
|
$var m = i/2
|
||||||
|
$range k 1..m
|
||||||
template <$for j, [[typename Matcher$j]]>
|
$range t m+1..i
|
||||||
inline $for k[[internal::EitherOfMatcher<Matcher$k, ]]Matcher$i[[]]$for k [[> ]]
|
|
||||||
|
|
||||||
AnyOf($for j, [[Matcher$j m$j]]) {
|
|
||||||
|
|
||||||
$if i == 2 [[
|
|
||||||
return internal::EitherOfMatcher<Matcher1, Matcher2>(m1, m2);
|
|
||||||
]] $else [[
|
|
||||||
return ::testing::AnyOf(m1, ::testing::AnyOf($for k, [[m$(k + 1)]]));
|
|
||||||
]]
|
|
||||||
|
|
||||||
|
template <$for j, [[typename M$j]]>
|
||||||
|
inline typename internal::AnyOfResult$i<$for j, [[M$j]]>::type
|
||||||
|
AnyOf($for j, [[M$j m$j]]) {
|
||||||
|
return typename internal::AnyOfResult$i<$for j, [[M$j]]>::type(
|
||||||
|
$if m == 1 [[m1]] $else [[::testing::AnyOf($for k, [[m$k]])]],
|
||||||
|
$if m+1 == i [[m$i]] $else [[::testing::AnyOf($for t, [[m$t]])]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
]]
|
]]
|
||||||
@ -621,7 +675,7 @@ $var param_field_decls2 = [[$for j
|
|||||||
if (!gmock_description.empty())\
|
if (!gmock_description.empty())\
|
||||||
return gmock_description;\
|
return gmock_description;\
|
||||||
return ::testing::internal::FormatMatcherDescription(\
|
return ::testing::internal::FormatMatcherDescription(\
|
||||||
negation, #name,\
|
negation, #name, \
|
||||||
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
|
||||||
::std::tr1::tuple<$for j, [[p$j##_type]]>($for j, [[p$j]])));\
|
::std::tr1::tuple<$for j, [[p$j##_type]]>($for j, [[p$j]])));\
|
||||||
}\
|
}\
|
||||||
@ -642,7 +696,7 @@ $var param_field_decls2 = [[$for j
|
|||||||
}\$template
|
}\$template
|
||||||
template <typename arg_type>\
|
template <typename arg_type>\
|
||||||
bool $class_name$param_types::gmock_Impl<arg_type>::MatchAndExplain(\
|
bool $class_name$param_types::gmock_Impl<arg_type>::MatchAndExplain(\
|
||||||
arg_type arg,\
|
arg_type arg, \
|
||||||
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
|
||||||
const
|
const
|
||||||
]]
|
]]
|
||||||
|
@ -268,7 +268,7 @@ class Matcher : public internal::MatcherBase<T> {
|
|||||||
// instead of Eq(str) and "foo" instead of Eq("foo") when a string
|
// instead of Eq(str) and "foo" instead of Eq("foo") when a string
|
||||||
// matcher is expected.
|
// matcher is expected.
|
||||||
template <>
|
template <>
|
||||||
class Matcher<const internal::string&>
|
class GTEST_API_ Matcher<const internal::string&>
|
||||||
: public internal::MatcherBase<const internal::string&> {
|
: public internal::MatcherBase<const internal::string&> {
|
||||||
public:
|
public:
|
||||||
Matcher() {}
|
Matcher() {}
|
||||||
@ -285,7 +285,7 @@ class Matcher<const internal::string&>
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
class Matcher<internal::string>
|
class GTEST_API_ Matcher<internal::string>
|
||||||
: public internal::MatcherBase<internal::string> {
|
: public internal::MatcherBase<internal::string> {
|
||||||
public:
|
public:
|
||||||
Matcher() {}
|
Matcher() {}
|
||||||
@ -384,12 +384,119 @@ inline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) {
|
|||||||
return PolymorphicMatcher<Impl>(impl);
|
return PolymorphicMatcher<Impl>(impl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
|
||||||
|
// and MUST NOT BE USED IN USER CODE!!!
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
// The MatcherCastImpl class template is a helper for implementing
|
||||||
|
// MatcherCast(). We need this helper in order to partially
|
||||||
|
// specialize the implementation of MatcherCast() (C++ allows
|
||||||
|
// class/struct templates to be partially specialized, but not
|
||||||
|
// function templates.).
|
||||||
|
|
||||||
|
// This general version is used when MatcherCast()'s argument is a
|
||||||
|
// polymorphic matcher (i.e. something that can be converted to a
|
||||||
|
// Matcher but is not one yet; for example, Eq(value)) or a value (for
|
||||||
|
// example, "hello").
|
||||||
|
template <typename T, typename M>
|
||||||
|
class MatcherCastImpl {
|
||||||
|
public:
|
||||||
|
static Matcher<T> Cast(M polymorphic_matcher_or_value) {
|
||||||
|
// M can be a polymorhic matcher, in which case we want to use
|
||||||
|
// its conversion operator to create Matcher<T>. Or it can be a value
|
||||||
|
// that should be passed to the Matcher<T>'s constructor.
|
||||||
|
//
|
||||||
|
// We can't call Matcher<T>(polymorphic_matcher_or_value) when M is a
|
||||||
|
// polymorphic matcher because it'll be ambiguous if T has an implicit
|
||||||
|
// constructor from M (this usually happens when T has an implicit
|
||||||
|
// constructor from any type).
|
||||||
|
//
|
||||||
|
// It won't work to unconditionally implict_cast
|
||||||
|
// polymorphic_matcher_or_value to Matcher<T> because it won't trigger
|
||||||
|
// a user-defined conversion from M to T if one exists (assuming M is
|
||||||
|
// a value).
|
||||||
|
return CastImpl(
|
||||||
|
polymorphic_matcher_or_value,
|
||||||
|
BooleanConstant<
|
||||||
|
internal::ImplicitlyConvertible<M, Matcher<T> >::value>());
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static Matcher<T> CastImpl(M value, BooleanConstant<false>) {
|
||||||
|
// M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic
|
||||||
|
// matcher. It must be a value then. Use direct initialization to create
|
||||||
|
// a matcher.
|
||||||
|
return Matcher<T>(ImplicitCast_<T>(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static Matcher<T> CastImpl(M polymorphic_matcher_or_value,
|
||||||
|
BooleanConstant<true>) {
|
||||||
|
// M is implicitly convertible to Matcher<T>, which means that either
|
||||||
|
// M is a polymorhpic matcher or Matcher<T> has an implicit constructor
|
||||||
|
// from M. In both cases using the implicit conversion will produce a
|
||||||
|
// matcher.
|
||||||
|
//
|
||||||
|
// Even if T has an implicit constructor from M, it won't be called because
|
||||||
|
// creating Matcher<T> would require a chain of two user-defined conversions
|
||||||
|
// (first to create T from M and then to create Matcher<T> from T).
|
||||||
|
return polymorphic_matcher_or_value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// This more specialized version is used when MatcherCast()'s argument
|
||||||
|
// is already a Matcher. This only compiles when type T can be
|
||||||
|
// statically converted to type U.
|
||||||
|
template <typename T, typename U>
|
||||||
|
class MatcherCastImpl<T, Matcher<U> > {
|
||||||
|
public:
|
||||||
|
static Matcher<T> Cast(const Matcher<U>& source_matcher) {
|
||||||
|
return Matcher<T>(new Impl(source_matcher));
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
class Impl : public MatcherInterface<T> {
|
||||||
|
public:
|
||||||
|
explicit Impl(const Matcher<U>& source_matcher)
|
||||||
|
: source_matcher_(source_matcher) {}
|
||||||
|
|
||||||
|
// We delegate the matching logic to the source matcher.
|
||||||
|
virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
|
||||||
|
return source_matcher_.MatchAndExplain(static_cast<U>(x), listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void DescribeTo(::std::ostream* os) const {
|
||||||
|
source_matcher_.DescribeTo(os);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void DescribeNegationTo(::std::ostream* os) const {
|
||||||
|
source_matcher_.DescribeNegationTo(os);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
const Matcher<U> source_matcher_;
|
||||||
|
|
||||||
|
GTEST_DISALLOW_ASSIGN_(Impl);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// This even more specialized version is used for efficiently casting
|
||||||
|
// a matcher to its own type.
|
||||||
|
template <typename T>
|
||||||
|
class MatcherCastImpl<T, Matcher<T> > {
|
||||||
|
public:
|
||||||
|
static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; }
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
|
||||||
// In order to be safe and clear, casting between different matcher
|
// In order to be safe and clear, casting between different matcher
|
||||||
// types is done explicitly via MatcherCast<T>(m), which takes a
|
// types is done explicitly via MatcherCast<T>(m), which takes a
|
||||||
// matcher m and returns a Matcher<T>. It compiles only when T can be
|
// matcher m and returns a Matcher<T>. It compiles only when T can be
|
||||||
// statically converted to the argument type of m.
|
// statically converted to the argument type of m.
|
||||||
template <typename T, typename M>
|
template <typename T, typename M>
|
||||||
Matcher<T> MatcherCast(M m);
|
inline Matcher<T> MatcherCast(M matcher) {
|
||||||
|
return internal::MatcherCastImpl<T, M>::Cast(matcher);
|
||||||
|
}
|
||||||
|
|
||||||
// Implements SafeMatcherCast().
|
// Implements SafeMatcherCast().
|
||||||
//
|
//
|
||||||
@ -401,11 +508,11 @@ Matcher<T> MatcherCast(M m);
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
class SafeMatcherCastImpl {
|
class SafeMatcherCastImpl {
|
||||||
public:
|
public:
|
||||||
// This overload handles polymorphic matchers only since monomorphic
|
// This overload handles polymorphic matchers and values only since
|
||||||
// matchers are handled by the next one.
|
// monomorphic matchers are handled by the next one.
|
||||||
template <typename M>
|
template <typename M>
|
||||||
static inline Matcher<T> Cast(M polymorphic_matcher) {
|
static inline Matcher<T> Cast(M polymorphic_matcher_or_value) {
|
||||||
return Matcher<T>(polymorphic_matcher);
|
return internal::MatcherCastImpl<T, M>::Cast(polymorphic_matcher_or_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This overload handles monomorphic matchers.
|
// This overload handles monomorphic matchers.
|
||||||
@ -600,67 +707,6 @@ void ExplainMatchFailureTupleTo(const MatcherTuple& matchers,
|
|||||||
matchers, values, os);
|
matchers, values, os);
|
||||||
}
|
}
|
||||||
|
|
||||||
// The MatcherCastImpl class template is a helper for implementing
|
|
||||||
// MatcherCast(). We need this helper in order to partially
|
|
||||||
// specialize the implementation of MatcherCast() (C++ allows
|
|
||||||
// class/struct templates to be partially specialized, but not
|
|
||||||
// function templates.).
|
|
||||||
|
|
||||||
// This general version is used when MatcherCast()'s argument is a
|
|
||||||
// polymorphic matcher (i.e. something that can be converted to a
|
|
||||||
// Matcher but is not one yet; for example, Eq(value)).
|
|
||||||
template <typename T, typename M>
|
|
||||||
class MatcherCastImpl {
|
|
||||||
public:
|
|
||||||
static Matcher<T> Cast(M polymorphic_matcher) {
|
|
||||||
return Matcher<T>(polymorphic_matcher);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// This more specialized version is used when MatcherCast()'s argument
|
|
||||||
// is already a Matcher. This only compiles when type T can be
|
|
||||||
// statically converted to type U.
|
|
||||||
template <typename T, typename U>
|
|
||||||
class MatcherCastImpl<T, Matcher<U> > {
|
|
||||||
public:
|
|
||||||
static Matcher<T> Cast(const Matcher<U>& source_matcher) {
|
|
||||||
return Matcher<T>(new Impl(source_matcher));
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
class Impl : public MatcherInterface<T> {
|
|
||||||
public:
|
|
||||||
explicit Impl(const Matcher<U>& source_matcher)
|
|
||||||
: source_matcher_(source_matcher) {}
|
|
||||||
|
|
||||||
// We delegate the matching logic to the source matcher.
|
|
||||||
virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
|
|
||||||
return source_matcher_.MatchAndExplain(static_cast<U>(x), listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void DescribeTo(::std::ostream* os) const {
|
|
||||||
source_matcher_.DescribeTo(os);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void DescribeNegationTo(::std::ostream* os) const {
|
|
||||||
source_matcher_.DescribeNegationTo(os);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
const Matcher<U> source_matcher_;
|
|
||||||
|
|
||||||
GTEST_DISALLOW_ASSIGN_(Impl);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// This even more specialized version is used for efficiently casting
|
|
||||||
// a matcher to its own type.
|
|
||||||
template <typename T>
|
|
||||||
class MatcherCastImpl<T, Matcher<T> > {
|
|
||||||
public:
|
|
||||||
static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; }
|
|
||||||
};
|
|
||||||
|
|
||||||
// Implements A<T>().
|
// Implements A<T>().
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class AnyMatcherImpl : public MatcherInterface<T> {
|
class AnyMatcherImpl : public MatcherInterface<T> {
|
||||||
@ -1596,6 +1642,7 @@ class FloatingEqMatcher {
|
|||||||
operator Matcher<FloatType&>() const {
|
operator Matcher<FloatType&>() const {
|
||||||
return MakeMatcher(new Impl<FloatType&>(rhs_, nan_eq_nan_));
|
return MakeMatcher(new Impl<FloatType&>(rhs_, nan_eq_nan_));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const FloatType rhs_;
|
const FloatType rhs_;
|
||||||
const bool nan_eq_nan_;
|
const bool nan_eq_nan_;
|
||||||
@ -1970,6 +2017,85 @@ class ContainerEqMatcher {
|
|||||||
GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher);
|
GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// A comparator functor that uses the < operator to compare two values.
|
||||||
|
struct LessComparator {
|
||||||
|
template <typename T, typename U>
|
||||||
|
bool operator()(const T& lhs, const U& rhs) const { return lhs < rhs; }
|
||||||
|
};
|
||||||
|
|
||||||
|
// Implements WhenSortedBy(comparator, container_matcher).
|
||||||
|
template <typename Comparator, typename ContainerMatcher>
|
||||||
|
class WhenSortedByMatcher {
|
||||||
|
public:
|
||||||
|
WhenSortedByMatcher(const Comparator& comparator,
|
||||||
|
const ContainerMatcher& matcher)
|
||||||
|
: comparator_(comparator), matcher_(matcher) {}
|
||||||
|
|
||||||
|
template <typename LhsContainer>
|
||||||
|
operator Matcher<LhsContainer>() const {
|
||||||
|
return MakeMatcher(new Impl<LhsContainer>(comparator_, matcher_));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename LhsContainer>
|
||||||
|
class Impl : public MatcherInterface<LhsContainer> {
|
||||||
|
public:
|
||||||
|
typedef internal::StlContainerView<
|
||||||
|
GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView;
|
||||||
|
typedef typename LhsView::type LhsStlContainer;
|
||||||
|
typedef typename LhsView::const_reference LhsStlContainerReference;
|
||||||
|
typedef typename LhsStlContainer::value_type LhsValue;
|
||||||
|
|
||||||
|
Impl(const Comparator& comparator, const ContainerMatcher& matcher)
|
||||||
|
: comparator_(comparator), matcher_(matcher) {}
|
||||||
|
|
||||||
|
virtual void DescribeTo(::std::ostream* os) const {
|
||||||
|
*os << "(when sorted) ";
|
||||||
|
matcher_.DescribeTo(os);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void DescribeNegationTo(::std::ostream* os) const {
|
||||||
|
*os << "(when sorted) ";
|
||||||
|
matcher_.DescribeNegationTo(os);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool MatchAndExplain(LhsContainer lhs,
|
||||||
|
MatchResultListener* listener) const {
|
||||||
|
LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
|
||||||
|
std::vector<LhsValue> sorted_container(lhs_stl_container.begin(),
|
||||||
|
lhs_stl_container.end());
|
||||||
|
std::sort(sorted_container.begin(), sorted_container.end(), comparator_);
|
||||||
|
|
||||||
|
if (!listener->IsInterested()) {
|
||||||
|
// If the listener is not interested, we do not need to
|
||||||
|
// construct the inner explanation.
|
||||||
|
return matcher_.Matches(sorted_container);
|
||||||
|
}
|
||||||
|
|
||||||
|
*listener << "which is ";
|
||||||
|
UniversalPrint(sorted_container, listener->stream());
|
||||||
|
*listener << " when sorted";
|
||||||
|
|
||||||
|
StringMatchResultListener inner_listener;
|
||||||
|
const bool match = matcher_.MatchAndExplain(sorted_container,
|
||||||
|
&inner_listener);
|
||||||
|
PrintIfNotEmpty(inner_listener.str(), listener->stream());
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
const Comparator comparator_;
|
||||||
|
const Matcher<const std::vector<LhsValue>&> matcher_;
|
||||||
|
|
||||||
|
GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl);
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
const Comparator comparator_;
|
||||||
|
const ContainerMatcher matcher_;
|
||||||
|
|
||||||
|
GTEST_DISALLOW_ASSIGN_(WhenSortedByMatcher);
|
||||||
|
};
|
||||||
|
|
||||||
// Implements Pointwise(tuple_matcher, rhs_container). tuple_matcher
|
// Implements Pointwise(tuple_matcher, rhs_container). tuple_matcher
|
||||||
// must be able to be safely cast to Matcher<tuple<const T1&, const
|
// must be able to be safely cast to Matcher<tuple<const T1&, const
|
||||||
// T2&> >, where T1 and T2 are the types of elements in the LHS
|
// T2&> >, where T1 and T2 are the types of elements in the LHS
|
||||||
@ -2548,17 +2674,12 @@ class ElementsAreArrayMatcher {
|
|||||||
// 'negation' is false; otherwise returns the description of the
|
// 'negation' is false; otherwise returns the description of the
|
||||||
// negation of the matcher. 'param_values' contains a list of strings
|
// negation of the matcher. 'param_values' contains a list of strings
|
||||||
// that are the print-out of the matcher's parameters.
|
// that are the print-out of the matcher's parameters.
|
||||||
string FormatMatcherDescription(bool negation, const char* matcher_name,
|
GTEST_API_ string FormatMatcherDescription(bool negation,
|
||||||
|
const char* matcher_name,
|
||||||
const Strings& param_values);
|
const Strings& param_values);
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
// Implements MatcherCast().
|
|
||||||
template <typename T, typename M>
|
|
||||||
inline Matcher<T> MatcherCast(M matcher) {
|
|
||||||
return internal::MatcherCastImpl<T, M>::Cast(matcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
// _ is a matcher that matches anything of any type.
|
// _ is a matcher that matches anything of any type.
|
||||||
//
|
//
|
||||||
// This definition is fine as:
|
// This definition is fine as:
|
||||||
@ -2929,6 +3050,26 @@ inline PolymorphicMatcher<internal::ContainerEqMatcher< // NOLINT
|
|||||||
internal::ContainerEqMatcher<RawContainer>(rhs));
|
internal::ContainerEqMatcher<RawContainer>(rhs));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns a matcher that matches a container that, when sorted using
|
||||||
|
// the given comparator, matches container_matcher.
|
||||||
|
template <typename Comparator, typename ContainerMatcher>
|
||||||
|
inline internal::WhenSortedByMatcher<Comparator, ContainerMatcher>
|
||||||
|
WhenSortedBy(const Comparator& comparator,
|
||||||
|
const ContainerMatcher& container_matcher) {
|
||||||
|
return internal::WhenSortedByMatcher<Comparator, ContainerMatcher>(
|
||||||
|
comparator, container_matcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a matcher that matches a container that, when sorted using
|
||||||
|
// the < operator, matches container_matcher.
|
||||||
|
template <typename ContainerMatcher>
|
||||||
|
inline internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>
|
||||||
|
WhenSorted(const ContainerMatcher& container_matcher) {
|
||||||
|
return
|
||||||
|
internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>(
|
||||||
|
internal::LessComparator(), container_matcher);
|
||||||
|
}
|
||||||
|
|
||||||
// Matches an STL-style container or a native array that contains the
|
// Matches an STL-style container or a native array that contains the
|
||||||
// same number of elements as in rhs, where its i-th element and rhs's
|
// same number of elements as in rhs, where its i-th element and rhs's
|
||||||
// i-th element (as a pair) satisfy the given pair matcher, for all i.
|
// i-th element (as a pair) satisfy the given pair matcher, for all i.
|
||||||
|
@ -111,7 +111,7 @@ template <typename F> class FunctionMockerBase;
|
|||||||
// expectations when InSequence() is used, and thus affect which
|
// expectations when InSequence() is used, and thus affect which
|
||||||
// expectation gets picked. Therefore, we sequence all mock function
|
// expectation gets picked. Therefore, we sequence all mock function
|
||||||
// calls to ensure the integrity of the mock objects' states.
|
// calls to ensure the integrity of the mock objects' states.
|
||||||
GTEST_DECLARE_STATIC_MUTEX_(g_gmock_mutex);
|
GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_gmock_mutex);
|
||||||
|
|
||||||
// Untyped base class for ActionResultHolder<R>.
|
// Untyped base class for ActionResultHolder<R>.
|
||||||
class UntypedActionResultHolderBase;
|
class UntypedActionResultHolderBase;
|
||||||
@ -119,7 +119,7 @@ class UntypedActionResultHolderBase;
|
|||||||
// Abstract base class of FunctionMockerBase. This is the
|
// Abstract base class of FunctionMockerBase. This is the
|
||||||
// type-agnostic part of the function mocker interface. Its pure
|
// type-agnostic part of the function mocker interface. Its pure
|
||||||
// virtual methods are implemented by FunctionMockerBase.
|
// virtual methods are implemented by FunctionMockerBase.
|
||||||
class UntypedFunctionMockerBase {
|
class GTEST_API_ UntypedFunctionMockerBase {
|
||||||
public:
|
public:
|
||||||
UntypedFunctionMockerBase();
|
UntypedFunctionMockerBase();
|
||||||
virtual ~UntypedFunctionMockerBase();
|
virtual ~UntypedFunctionMockerBase();
|
||||||
@ -127,12 +127,12 @@ class UntypedFunctionMockerBase {
|
|||||||
// Verifies that all expectations on this mock function have been
|
// Verifies that all expectations on this mock function have been
|
||||||
// satisfied. Reports one or more Google Test non-fatal failures
|
// satisfied. Reports one or more Google Test non-fatal failures
|
||||||
// and returns false if not.
|
// and returns false if not.
|
||||||
// L >= g_gmock_mutex
|
bool VerifyAndClearExpectationsLocked()
|
||||||
bool VerifyAndClearExpectationsLocked();
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
|
||||||
|
|
||||||
// Clears the ON_CALL()s set on this mock function.
|
// Clears the ON_CALL()s set on this mock function.
|
||||||
// L >= g_gmock_mutex
|
virtual void ClearDefaultActionsLocked()
|
||||||
virtual void ClearDefaultActionsLocked() = 0;
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) = 0;
|
||||||
|
|
||||||
// In all of the following Untyped* functions, it's the caller's
|
// In all of the following Untyped* functions, it's the caller's
|
||||||
// responsibility to guarantee the correctness of the arguments'
|
// responsibility to guarantee the correctness of the arguments'
|
||||||
@ -157,9 +157,10 @@ class UntypedFunctionMockerBase {
|
|||||||
// Writes a message that the call is uninteresting (i.e. neither
|
// Writes a message that the call is uninteresting (i.e. neither
|
||||||
// explicitly expected nor explicitly unexpected) to the given
|
// explicitly expected nor explicitly unexpected) to the given
|
||||||
// ostream.
|
// ostream.
|
||||||
// L < g_gmock_mutex
|
virtual void UntypedDescribeUninterestingCall(
|
||||||
virtual void UntypedDescribeUninterestingCall(const void* untyped_args,
|
const void* untyped_args,
|
||||||
::std::ostream* os) const = 0;
|
::std::ostream* os) const
|
||||||
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) = 0;
|
||||||
|
|
||||||
// Returns the expectation that matches the given function arguments
|
// Returns the expectation that matches the given function arguments
|
||||||
// (or NULL is there's no match); when a match is found,
|
// (or NULL is there's no match); when a match is found,
|
||||||
@ -167,11 +168,11 @@ class UntypedFunctionMockerBase {
|
|||||||
// performed (or NULL if the action is "do default"), and
|
// performed (or NULL if the action is "do default"), and
|
||||||
// is_excessive is modified to indicate whether the call exceeds the
|
// is_excessive is modified to indicate whether the call exceeds the
|
||||||
// expected number.
|
// expected number.
|
||||||
// L < g_gmock_mutex
|
|
||||||
virtual const ExpectationBase* UntypedFindMatchingExpectation(
|
virtual const ExpectationBase* UntypedFindMatchingExpectation(
|
||||||
const void* untyped_args,
|
const void* untyped_args,
|
||||||
const void** untyped_action, bool* is_excessive,
|
const void** untyped_action, bool* is_excessive,
|
||||||
::std::ostream* what, ::std::ostream* why) = 0;
|
::std::ostream* what, ::std::ostream* why)
|
||||||
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) = 0;
|
||||||
|
|
||||||
// Prints the given function arguments to the ostream.
|
// Prints the given function arguments to the ostream.
|
||||||
virtual void UntypedPrintArgs(const void* untyped_args,
|
virtual void UntypedPrintArgs(const void* untyped_args,
|
||||||
@ -182,33 +183,33 @@ class UntypedFunctionMockerBase {
|
|||||||
// whenever an EXPECT_CALL() or ON_CALL() is executed on this mock
|
// whenever an EXPECT_CALL() or ON_CALL() is executed on this mock
|
||||||
// method.
|
// method.
|
||||||
// TODO(wan@google.com): rename to SetAndRegisterOwner().
|
// TODO(wan@google.com): rename to SetAndRegisterOwner().
|
||||||
// L < g_gmock_mutex
|
void RegisterOwner(const void* mock_obj)
|
||||||
void RegisterOwner(const void* mock_obj);
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
|
||||||
|
|
||||||
// Sets the mock object this mock method belongs to, and sets the
|
// Sets the mock object this mock method belongs to, and sets the
|
||||||
// name of the mock function. Will be called upon each invocation
|
// name of the mock function. Will be called upon each invocation
|
||||||
// of this mock function.
|
// of this mock function.
|
||||||
// L < g_gmock_mutex
|
void SetOwnerAndName(const void* mock_obj, const char* name)
|
||||||
void SetOwnerAndName(const void* mock_obj, const char* name);
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
|
||||||
|
|
||||||
// Returns the mock object this mock method belongs to. Must be
|
// Returns the mock object this mock method belongs to. Must be
|
||||||
// called after RegisterOwner() or SetOwnerAndName() has been
|
// called after RegisterOwner() or SetOwnerAndName() has been
|
||||||
// called.
|
// called.
|
||||||
// L < g_gmock_mutex
|
const void* MockObject() const
|
||||||
const void* MockObject() const;
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
|
||||||
|
|
||||||
// Returns the name of this mock method. Must be called after
|
// Returns the name of this mock method. Must be called after
|
||||||
// SetOwnerAndName() has been called.
|
// SetOwnerAndName() has been called.
|
||||||
// L < g_gmock_mutex
|
const char* Name() const
|
||||||
const char* Name() const;
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
|
||||||
|
|
||||||
// Returns the result of invoking this mock function with the given
|
// Returns the result of invoking this mock function with the given
|
||||||
// arguments. This function can be safely called from multiple
|
// arguments. This function can be safely called from multiple
|
||||||
// threads concurrently. The caller is responsible for deleting the
|
// threads concurrently. The caller is responsible for deleting the
|
||||||
// result.
|
// result.
|
||||||
// L < g_gmock_mutex
|
|
||||||
const UntypedActionResultHolderBase* UntypedInvokeWith(
|
const UntypedActionResultHolderBase* UntypedInvokeWith(
|
||||||
const void* untyped_args);
|
const void* untyped_args)
|
||||||
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
typedef std::vector<const void*> UntypedOnCallSpecs;
|
typedef std::vector<const void*> UntypedOnCallSpecs;
|
||||||
@ -363,23 +364,27 @@ enum CallReaction {
|
|||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
// Utilities for manipulating mock objects.
|
// Utilities for manipulating mock objects.
|
||||||
class Mock {
|
class GTEST_API_ Mock {
|
||||||
public:
|
public:
|
||||||
// The following public methods can be called concurrently.
|
// The following public methods can be called concurrently.
|
||||||
|
|
||||||
// Tells Google Mock to ignore mock_obj when checking for leaked
|
// Tells Google Mock to ignore mock_obj when checking for leaked
|
||||||
// mock objects.
|
// mock objects.
|
||||||
static void AllowLeak(const void* mock_obj);
|
static void AllowLeak(const void* mock_obj)
|
||||||
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
|
||||||
|
|
||||||
// Verifies and clears all expectations on the given mock object.
|
// Verifies and clears all expectations on the given mock object.
|
||||||
// If the expectations aren't satisfied, generates one or more
|
// If the expectations aren't satisfied, generates one or more
|
||||||
// Google Test non-fatal failures and returns false.
|
// Google Test non-fatal failures and returns false.
|
||||||
static bool VerifyAndClearExpectations(void* mock_obj);
|
static bool VerifyAndClearExpectations(void* mock_obj)
|
||||||
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
|
||||||
|
|
||||||
// Verifies all expectations on the given mock object and clears its
|
// Verifies all expectations on the given mock object and clears its
|
||||||
// default actions and expectations. Returns true iff the
|
// default actions and expectations. Returns true iff the
|
||||||
// verification was successful.
|
// verification was successful.
|
||||||
static bool VerifyAndClear(void* mock_obj);
|
static bool VerifyAndClear(void* mock_obj)
|
||||||
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class internal::UntypedFunctionMockerBase;
|
friend class internal::UntypedFunctionMockerBase;
|
||||||
|
|
||||||
@ -396,58 +401,59 @@ class Mock {
|
|||||||
|
|
||||||
// Tells Google Mock to allow uninteresting calls on the given mock
|
// Tells Google Mock to allow uninteresting calls on the given mock
|
||||||
// object.
|
// object.
|
||||||
// L < g_gmock_mutex
|
static void AllowUninterestingCalls(const void* mock_obj)
|
||||||
static void AllowUninterestingCalls(const void* mock_obj);
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
|
||||||
|
|
||||||
// Tells Google Mock to warn the user about uninteresting calls on
|
// Tells Google Mock to warn the user about uninteresting calls on
|
||||||
// the given mock object.
|
// the given mock object.
|
||||||
// L < g_gmock_mutex
|
static void WarnUninterestingCalls(const void* mock_obj)
|
||||||
static void WarnUninterestingCalls(const void* mock_obj);
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
|
||||||
|
|
||||||
// Tells Google Mock to fail uninteresting calls on the given mock
|
// Tells Google Mock to fail uninteresting calls on the given mock
|
||||||
// object.
|
// object.
|
||||||
// L < g_gmock_mutex
|
static void FailUninterestingCalls(const void* mock_obj)
|
||||||
static void FailUninterestingCalls(const void* mock_obj);
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
|
||||||
|
|
||||||
// Tells Google Mock the given mock object is being destroyed and
|
// Tells Google Mock the given mock object is being destroyed and
|
||||||
// its entry in the call-reaction table should be removed.
|
// its entry in the call-reaction table should be removed.
|
||||||
// L < g_gmock_mutex
|
static void UnregisterCallReaction(const void* mock_obj)
|
||||||
static void UnregisterCallReaction(const void* mock_obj);
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
|
||||||
|
|
||||||
// Returns the reaction Google Mock will have on uninteresting calls
|
// Returns the reaction Google Mock will have on uninteresting calls
|
||||||
// made on the given mock object.
|
// made on the given mock object.
|
||||||
// L < g_gmock_mutex
|
|
||||||
static internal::CallReaction GetReactionOnUninterestingCalls(
|
static internal::CallReaction GetReactionOnUninterestingCalls(
|
||||||
const void* mock_obj);
|
const void* mock_obj);
|
||||||
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
|
||||||
|
|
||||||
// Verifies that all expectations on the given mock object have been
|
// Verifies that all expectations on the given mock object have been
|
||||||
// satisfied. Reports one or more Google Test non-fatal failures
|
// satisfied. Reports one or more Google Test non-fatal failures
|
||||||
// and returns false if not.
|
// and returns false if not.
|
||||||
// L >= g_gmock_mutex
|
static bool VerifyAndClearExpectationsLocked(void* mock_obj)
|
||||||
static bool VerifyAndClearExpectationsLocked(void* mock_obj);
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);
|
||||||
|
|
||||||
// Clears all ON_CALL()s set on the given mock object.
|
// Clears all ON_CALL()s set on the given mock object.
|
||||||
// L >= g_gmock_mutex
|
static void ClearDefaultActionsLocked(void* mock_obj)
|
||||||
static void ClearDefaultActionsLocked(void* mock_obj);
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);
|
||||||
|
|
||||||
// Registers a mock object and a mock method it owns.
|
// Registers a mock object and a mock method it owns.
|
||||||
// L < g_gmock_mutex
|
static void Register(
|
||||||
static void Register(const void* mock_obj,
|
const void* mock_obj,
|
||||||
internal::UntypedFunctionMockerBase* mocker);
|
internal::UntypedFunctionMockerBase* mocker)
|
||||||
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
|
||||||
|
|
||||||
// Tells Google Mock where in the source code mock_obj is used in an
|
// Tells Google Mock where in the source code mock_obj is used in an
|
||||||
// ON_CALL or EXPECT_CALL. In case mock_obj is leaked, this
|
// ON_CALL or EXPECT_CALL. In case mock_obj is leaked, this
|
||||||
// information helps the user identify which object it is.
|
// information helps the user identify which object it is.
|
||||||
// L < g_gmock_mutex
|
|
||||||
static void RegisterUseByOnCallOrExpectCall(
|
static void RegisterUseByOnCallOrExpectCall(
|
||||||
const void* mock_obj, const char* file, int line);
|
const void* mock_obj, const char* file, int line)
|
||||||
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
|
||||||
|
|
||||||
// Unregisters a mock method; removes the owning mock object from
|
// Unregisters a mock method; removes the owning mock object from
|
||||||
// the registry when the last mock method associated with it has
|
// the registry when the last mock method associated with it has
|
||||||
// been unregistered. This is called only in the destructor of
|
// been unregistered. This is called only in the destructor of
|
||||||
// FunctionMockerBase.
|
// FunctionMockerBase.
|
||||||
// L >= g_gmock_mutex
|
static void UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)
|
||||||
static void UnregisterLocked(internal::UntypedFunctionMockerBase* mocker);
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);
|
||||||
}; // class Mock
|
}; // class Mock
|
||||||
|
|
||||||
// An abstract handle of an expectation. Useful in the .After()
|
// An abstract handle of an expectation. Useful in the .After()
|
||||||
@ -471,7 +477,7 @@ class Mock {
|
|||||||
// ExpectationBase available yet, leading to incorrect destruction
|
// ExpectationBase available yet, leading to incorrect destruction
|
||||||
// in the linked_ptr (or compilation errors if using a checking
|
// in the linked_ptr (or compilation errors if using a checking
|
||||||
// linked_ptr).
|
// linked_ptr).
|
||||||
class Expectation {
|
class GTEST_API_ Expectation {
|
||||||
public:
|
public:
|
||||||
// Constructs a null object that doesn't reference any expectation.
|
// Constructs a null object that doesn't reference any expectation.
|
||||||
Expectation();
|
Expectation();
|
||||||
@ -603,7 +609,7 @@ class ExpectationSet {
|
|||||||
// Sequence objects are used by a user to specify the relative order
|
// Sequence objects are used by a user to specify the relative order
|
||||||
// in which the expectations should match. They are copyable (we rely
|
// in which the expectations should match. They are copyable (we rely
|
||||||
// on the compiler-defined copy constructor and assignment operator).
|
// on the compiler-defined copy constructor and assignment operator).
|
||||||
class Sequence {
|
class GTEST_API_ Sequence {
|
||||||
public:
|
public:
|
||||||
// Constructs an empty sequence.
|
// Constructs an empty sequence.
|
||||||
Sequence() : last_expectation_(new Expectation) {}
|
Sequence() : last_expectation_(new Expectation) {}
|
||||||
@ -644,7 +650,7 @@ class Sequence {
|
|||||||
// thread. However, for clarity of your tests we recommend you to set
|
// thread. However, for clarity of your tests we recommend you to set
|
||||||
// up mocks in the main thread unless you have a good reason not to do
|
// up mocks in the main thread unless you have a good reason not to do
|
||||||
// so.
|
// so.
|
||||||
class InSequence {
|
class GTEST_API_ InSequence {
|
||||||
public:
|
public:
|
||||||
InSequence();
|
InSequence();
|
||||||
~InSequence();
|
~InSequence();
|
||||||
@ -658,7 +664,7 @@ namespace internal {
|
|||||||
|
|
||||||
// Points to the implicit sequence introduced by a living InSequence
|
// Points to the implicit sequence introduced by a living InSequence
|
||||||
// object (if any) in the current thread or NULL.
|
// object (if any) in the current thread or NULL.
|
||||||
extern ThreadLocal<Sequence*> g_gmock_implicit_sequence;
|
GTEST_API_ extern ThreadLocal<Sequence*> g_gmock_implicit_sequence;
|
||||||
|
|
||||||
// Base class for implementing expectations.
|
// Base class for implementing expectations.
|
||||||
//
|
//
|
||||||
@ -674,7 +680,7 @@ extern ThreadLocal<Sequence*> g_gmock_implicit_sequence;
|
|||||||
// on the template argument of Expectation to the base class.
|
// on the template argument of Expectation to the base class.
|
||||||
//
|
//
|
||||||
// This class is internal and mustn't be used by user code directly.
|
// This class is internal and mustn't be used by user code directly.
|
||||||
class ExpectationBase {
|
class GTEST_API_ ExpectationBase {
|
||||||
public:
|
public:
|
||||||
// source_text is the EXPECT_CALL(...) source that created this Expectation.
|
// source_text is the EXPECT_CALL(...) source that created this Expectation.
|
||||||
ExpectationBase(const char* file, int line, const string& source_text);
|
ExpectationBase(const char* file, int line, const string& source_text);
|
||||||
@ -695,8 +701,8 @@ class ExpectationBase {
|
|||||||
|
|
||||||
// Describes how many times a function call matching this
|
// Describes how many times a function call matching this
|
||||||
// expectation has occurred.
|
// expectation has occurred.
|
||||||
// L >= g_gmock_mutex
|
void DescribeCallCountTo(::std::ostream* os) const
|
||||||
void DescribeCallCountTo(::std::ostream* os) const;
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
|
||||||
|
|
||||||
// If this mock method has an extra matcher (i.e. .With(matcher)),
|
// If this mock method has an extra matcher (i.e. .With(matcher)),
|
||||||
// describes it to the ostream.
|
// describes it to the ostream.
|
||||||
@ -752,62 +758,62 @@ class ExpectationBase {
|
|||||||
// the current thread.
|
// the current thread.
|
||||||
|
|
||||||
// Retires all pre-requisites of this expectation.
|
// Retires all pre-requisites of this expectation.
|
||||||
// L >= g_gmock_mutex
|
void RetireAllPreRequisites()
|
||||||
void RetireAllPreRequisites();
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
|
||||||
|
|
||||||
// Returns true iff this expectation is retired.
|
// Returns true iff this expectation is retired.
|
||||||
// L >= g_gmock_mutex
|
bool is_retired() const
|
||||||
bool is_retired() const {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
return retired_;
|
return retired_;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retires this expectation.
|
// Retires this expectation.
|
||||||
// L >= g_gmock_mutex
|
void Retire()
|
||||||
void Retire() {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
retired_ = true;
|
retired_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true iff this expectation is satisfied.
|
// Returns true iff this expectation is satisfied.
|
||||||
// L >= g_gmock_mutex
|
bool IsSatisfied() const
|
||||||
bool IsSatisfied() const {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
return cardinality().IsSatisfiedByCallCount(call_count_);
|
return cardinality().IsSatisfiedByCallCount(call_count_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true iff this expectation is saturated.
|
// Returns true iff this expectation is saturated.
|
||||||
// L >= g_gmock_mutex
|
bool IsSaturated() const
|
||||||
bool IsSaturated() const {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
return cardinality().IsSaturatedByCallCount(call_count_);
|
return cardinality().IsSaturatedByCallCount(call_count_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true iff this expectation is over-saturated.
|
// Returns true iff this expectation is over-saturated.
|
||||||
// L >= g_gmock_mutex
|
bool IsOverSaturated() const
|
||||||
bool IsOverSaturated() const {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
return cardinality().IsOverSaturatedByCallCount(call_count_);
|
return cardinality().IsOverSaturatedByCallCount(call_count_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true iff all pre-requisites of this expectation are satisfied.
|
// Returns true iff all pre-requisites of this expectation are satisfied.
|
||||||
// L >= g_gmock_mutex
|
bool AllPrerequisitesAreSatisfied() const
|
||||||
bool AllPrerequisitesAreSatisfied() const;
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
|
||||||
|
|
||||||
// Adds unsatisfied pre-requisites of this expectation to 'result'.
|
// Adds unsatisfied pre-requisites of this expectation to 'result'.
|
||||||
// L >= g_gmock_mutex
|
void FindUnsatisfiedPrerequisites(ExpectationSet* result) const
|
||||||
void FindUnsatisfiedPrerequisites(ExpectationSet* result) const;
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
|
||||||
|
|
||||||
// Returns the number this expectation has been invoked.
|
// Returns the number this expectation has been invoked.
|
||||||
// L >= g_gmock_mutex
|
int call_count() const
|
||||||
int call_count() const {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
return call_count_;
|
return call_count_;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Increments the number this expectation has been invoked.
|
// Increments the number this expectation has been invoked.
|
||||||
// L >= g_gmock_mutex
|
void IncrementCallCount()
|
||||||
void IncrementCallCount() {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
call_count_++;
|
call_count_++;
|
||||||
}
|
}
|
||||||
@ -816,8 +822,8 @@ class ExpectationBase {
|
|||||||
// WillRepeatedly() clauses) against the cardinality if this hasn't
|
// WillRepeatedly() clauses) against the cardinality if this hasn't
|
||||||
// been done before. Prints a warning if there are too many or too
|
// been done before. Prints a warning if there are too many or too
|
||||||
// few actions.
|
// few actions.
|
||||||
// L < mutex_
|
void CheckActionCountIfNotDone() const
|
||||||
void CheckActionCountIfNotDone() const;
|
GTEST_LOCK_EXCLUDED_(mutex_);
|
||||||
|
|
||||||
friend class ::testing::Sequence;
|
friend class ::testing::Sequence;
|
||||||
friend class ::testing::internal::ExpectationTester;
|
friend class ::testing::internal::ExpectationTester;
|
||||||
@ -1069,15 +1075,15 @@ class TypedExpectation : public ExpectationBase {
|
|||||||
// g_gmock_mutex.
|
// g_gmock_mutex.
|
||||||
|
|
||||||
// Returns true iff this expectation matches the given arguments.
|
// Returns true iff this expectation matches the given arguments.
|
||||||
// L >= g_gmock_mutex
|
bool Matches(const ArgumentTuple& args) const
|
||||||
bool Matches(const ArgumentTuple& args) const {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);
|
return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true iff this expectation should handle the given arguments.
|
// Returns true iff this expectation should handle the given arguments.
|
||||||
// L >= g_gmock_mutex
|
bool ShouldHandleArguments(const ArgumentTuple& args) const
|
||||||
bool ShouldHandleArguments(const ArgumentTuple& args) const {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
|
|
||||||
// In case the action count wasn't checked when the expectation
|
// In case the action count wasn't checked when the expectation
|
||||||
@ -1090,9 +1096,10 @@ class TypedExpectation : public ExpectationBase {
|
|||||||
|
|
||||||
// Describes the result of matching the arguments against this
|
// Describes the result of matching the arguments against this
|
||||||
// expectation to the given ostream.
|
// expectation to the given ostream.
|
||||||
// L >= g_gmock_mutex
|
void ExplainMatchResultTo(
|
||||||
void ExplainMatchResultTo(const ArgumentTuple& args,
|
const ArgumentTuple& args,
|
||||||
::std::ostream* os) const {
|
::std::ostream* os) const
|
||||||
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
|
|
||||||
if (is_retired()) {
|
if (is_retired()) {
|
||||||
@ -1134,9 +1141,10 @@ class TypedExpectation : public ExpectationBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Returns the action that should be taken for the current invocation.
|
// Returns the action that should be taken for the current invocation.
|
||||||
// L >= g_gmock_mutex
|
const Action<F>& GetCurrentAction(
|
||||||
const Action<F>& GetCurrentAction(const FunctionMockerBase<F>* mocker,
|
const FunctionMockerBase<F>* mocker,
|
||||||
const ArgumentTuple& args) const {
|
const ArgumentTuple& args) const
|
||||||
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
const int count = call_count();
|
const int count = call_count();
|
||||||
Assert(count >= 1, __FILE__, __LINE__,
|
Assert(count >= 1, __FILE__, __LINE__,
|
||||||
@ -1170,11 +1178,12 @@ class TypedExpectation : public ExpectationBase {
|
|||||||
// Mock does it to 'why'. This method is not const as it calls
|
// Mock does it to 'why'. This method is not const as it calls
|
||||||
// IncrementCallCount(). A return value of NULL means the default
|
// IncrementCallCount(). A return value of NULL means the default
|
||||||
// action.
|
// action.
|
||||||
// L >= g_gmock_mutex
|
const Action<F>* GetActionForArguments(
|
||||||
const Action<F>* GetActionForArguments(const FunctionMockerBase<F>* mocker,
|
const FunctionMockerBase<F>* mocker,
|
||||||
const ArgumentTuple& args,
|
const ArgumentTuple& args,
|
||||||
::std::ostream* what,
|
::std::ostream* what,
|
||||||
::std::ostream* why) {
|
::std::ostream* why)
|
||||||
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
if (IsSaturated()) {
|
if (IsSaturated()) {
|
||||||
// We have an excessive call.
|
// We have an excessive call.
|
||||||
@ -1222,7 +1231,7 @@ class TypedExpectation : public ExpectationBase {
|
|||||||
// ::testing::internal and import it into ::testing.
|
// ::testing::internal and import it into ::testing.
|
||||||
|
|
||||||
// Logs a message including file and line number information.
|
// Logs a message including file and line number information.
|
||||||
void LogWithLocation(testing::internal::LogSeverity severity,
|
GTEST_API_ void LogWithLocation(testing::internal::LogSeverity severity,
|
||||||
const char* file, int line,
|
const char* file, int line,
|
||||||
const string& message);
|
const string& message);
|
||||||
|
|
||||||
@ -1393,8 +1402,8 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {
|
|||||||
// The destructor verifies that all expectations on this mock
|
// The destructor verifies that all expectations on this mock
|
||||||
// function have been satisfied. If not, it will report Google Test
|
// function have been satisfied. If not, it will report Google Test
|
||||||
// non-fatal failures for the violations.
|
// non-fatal failures for the violations.
|
||||||
// L < g_gmock_mutex
|
virtual ~FunctionMockerBase()
|
||||||
virtual ~FunctionMockerBase() {
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
|
||||||
MutexLock l(&g_gmock_mutex);
|
MutexLock l(&g_gmock_mutex);
|
||||||
VerifyAndClearExpectationsLocked();
|
VerifyAndClearExpectationsLocked();
|
||||||
Mock::UnregisterLocked(this);
|
Mock::UnregisterLocked(this);
|
||||||
@ -1464,15 +1473,30 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {
|
|||||||
|
|
||||||
// Implements UntypedFunctionMockerBase::ClearDefaultActionsLocked():
|
// Implements UntypedFunctionMockerBase::ClearDefaultActionsLocked():
|
||||||
// clears the ON_CALL()s set on this mock function.
|
// clears the ON_CALL()s set on this mock function.
|
||||||
// L >= g_gmock_mutex
|
virtual void ClearDefaultActionsLocked()
|
||||||
virtual void ClearDefaultActionsLocked() {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
|
|
||||||
|
// Deleting our default actions may trigger other mock objects to be
|
||||||
|
// deleted, for example if an action contains a reference counted smart
|
||||||
|
// pointer to that mock object, and that is the last reference. So if we
|
||||||
|
// delete our actions within the context of the global mutex we may deadlock
|
||||||
|
// when this method is called again. Instead, make a copy of the set of
|
||||||
|
// actions to delete, clear our set within the mutex, and then delete the
|
||||||
|
// actions outside of the mutex.
|
||||||
|
UntypedOnCallSpecs specs_to_delete;
|
||||||
|
untyped_on_call_specs_.swap(specs_to_delete);
|
||||||
|
|
||||||
|
g_gmock_mutex.Unlock();
|
||||||
for (UntypedOnCallSpecs::const_iterator it =
|
for (UntypedOnCallSpecs::const_iterator it =
|
||||||
untyped_on_call_specs_.begin();
|
specs_to_delete.begin();
|
||||||
it != untyped_on_call_specs_.end(); ++it) {
|
it != specs_to_delete.end(); ++it) {
|
||||||
delete static_cast<const OnCallSpec<F>*>(*it);
|
delete static_cast<const OnCallSpec<F>*>(*it);
|
||||||
}
|
}
|
||||||
untyped_on_call_specs_.clear();
|
|
||||||
|
// Lock the mutex again, since the caller expects it to be locked when we
|
||||||
|
// return.
|
||||||
|
g_gmock_mutex.Lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -1484,17 +1508,17 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {
|
|||||||
// Returns the result of invoking this mock function with the given
|
// Returns the result of invoking this mock function with the given
|
||||||
// arguments. This function can be safely called from multiple
|
// arguments. This function can be safely called from multiple
|
||||||
// threads concurrently.
|
// threads concurrently.
|
||||||
// L < g_gmock_mutex
|
Result InvokeWith(const ArgumentTuple& args)
|
||||||
Result InvokeWith(const ArgumentTuple& args) {
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
|
||||||
return static_cast<const ResultHolder*>(
|
return static_cast<const ResultHolder*>(
|
||||||
this->UntypedInvokeWith(&args))->GetValueAndDelete();
|
this->UntypedInvokeWith(&args))->GetValueAndDelete();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adds and returns a default action spec for this mock function.
|
// Adds and returns a default action spec for this mock function.
|
||||||
// L < g_gmock_mutex
|
|
||||||
OnCallSpec<F>& AddNewOnCallSpec(
|
OnCallSpec<F>& AddNewOnCallSpec(
|
||||||
const char* file, int line,
|
const char* file, int line,
|
||||||
const ArgumentMatcherTuple& m) {
|
const ArgumentMatcherTuple& m)
|
||||||
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
|
||||||
Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);
|
Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);
|
||||||
OnCallSpec<F>* const on_call_spec = new OnCallSpec<F>(file, line, m);
|
OnCallSpec<F>* const on_call_spec = new OnCallSpec<F>(file, line, m);
|
||||||
untyped_on_call_specs_.push_back(on_call_spec);
|
untyped_on_call_specs_.push_back(on_call_spec);
|
||||||
@ -1502,12 +1526,12 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Adds and returns an expectation spec for this mock function.
|
// Adds and returns an expectation spec for this mock function.
|
||||||
// L < g_gmock_mutex
|
|
||||||
TypedExpectation<F>& AddNewExpectation(
|
TypedExpectation<F>& AddNewExpectation(
|
||||||
const char* file,
|
const char* file,
|
||||||
int line,
|
int line,
|
||||||
const string& source_text,
|
const string& source_text,
|
||||||
const ArgumentMatcherTuple& m) {
|
const ArgumentMatcherTuple& m)
|
||||||
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
|
||||||
Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);
|
Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);
|
||||||
TypedExpectation<F>* const expectation =
|
TypedExpectation<F>* const expectation =
|
||||||
new TypedExpectation<F>(this, file, line, source_text, m);
|
new TypedExpectation<F>(this, file, line, source_text, m);
|
||||||
@ -1552,9 +1576,10 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {
|
|||||||
// Writes a message that the call is uninteresting (i.e. neither
|
// Writes a message that the call is uninteresting (i.e. neither
|
||||||
// explicitly expected nor explicitly unexpected) to the given
|
// explicitly expected nor explicitly unexpected) to the given
|
||||||
// ostream.
|
// ostream.
|
||||||
// L < g_gmock_mutex
|
virtual void UntypedDescribeUninterestingCall(
|
||||||
virtual void UntypedDescribeUninterestingCall(const void* untyped_args,
|
const void* untyped_args,
|
||||||
::std::ostream* os) const {
|
::std::ostream* os) const
|
||||||
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
|
||||||
const ArgumentTuple& args =
|
const ArgumentTuple& args =
|
||||||
*static_cast<const ArgumentTuple*>(untyped_args);
|
*static_cast<const ArgumentTuple*>(untyped_args);
|
||||||
*os << "Uninteresting mock function call - ";
|
*os << "Uninteresting mock function call - ";
|
||||||
@ -1579,11 +1604,11 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {
|
|||||||
// section. The reason is that we have no control on what the
|
// section. The reason is that we have no control on what the
|
||||||
// action does (it can invoke an arbitrary user function or even a
|
// action does (it can invoke an arbitrary user function or even a
|
||||||
// mock function) and excessive locking could cause a dead lock.
|
// mock function) and excessive locking could cause a dead lock.
|
||||||
// L < g_gmock_mutex
|
|
||||||
virtual const ExpectationBase* UntypedFindMatchingExpectation(
|
virtual const ExpectationBase* UntypedFindMatchingExpectation(
|
||||||
const void* untyped_args,
|
const void* untyped_args,
|
||||||
const void** untyped_action, bool* is_excessive,
|
const void** untyped_action, bool* is_excessive,
|
||||||
::std::ostream* what, ::std::ostream* why) {
|
::std::ostream* what, ::std::ostream* why)
|
||||||
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
|
||||||
const ArgumentTuple& args =
|
const ArgumentTuple& args =
|
||||||
*static_cast<const ArgumentTuple*>(untyped_args);
|
*static_cast<const ArgumentTuple*>(untyped_args);
|
||||||
MutexLock l(&g_gmock_mutex);
|
MutexLock l(&g_gmock_mutex);
|
||||||
@ -1614,9 +1639,9 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {
|
|||||||
|
|
||||||
// Returns the expectation that matches the arguments, or NULL if no
|
// Returns the expectation that matches the arguments, or NULL if no
|
||||||
// expectation matches them.
|
// expectation matches them.
|
||||||
// L >= g_gmock_mutex
|
|
||||||
TypedExpectation<F>* FindMatchingExpectationLocked(
|
TypedExpectation<F>* FindMatchingExpectationLocked(
|
||||||
const ArgumentTuple& args) const {
|
const ArgumentTuple& args) const
|
||||||
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
for (typename UntypedExpectations::const_reverse_iterator it =
|
for (typename UntypedExpectations::const_reverse_iterator it =
|
||||||
untyped_expectations_.rbegin();
|
untyped_expectations_.rbegin();
|
||||||
@ -1631,10 +1656,11 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Returns a message that the arguments don't match any expectation.
|
// Returns a message that the arguments don't match any expectation.
|
||||||
// L >= g_gmock_mutex
|
void FormatUnexpectedCallMessageLocked(
|
||||||
void FormatUnexpectedCallMessageLocked(const ArgumentTuple& args,
|
const ArgumentTuple& args,
|
||||||
::std::ostream* os,
|
::std::ostream* os,
|
||||||
::std::ostream* why) const {
|
::std::ostream* why) const
|
||||||
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
*os << "\nUnexpected mock function call - ";
|
*os << "\nUnexpected mock function call - ";
|
||||||
DescribeDefaultActionTo(args, os);
|
DescribeDefaultActionTo(args, os);
|
||||||
@ -1643,9 +1669,10 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {
|
|||||||
|
|
||||||
// Prints a list of expectations that have been tried against the
|
// Prints a list of expectations that have been tried against the
|
||||||
// current mock function call.
|
// current mock function call.
|
||||||
// L >= g_gmock_mutex
|
void PrintTriedExpectationsLocked(
|
||||||
void PrintTriedExpectationsLocked(const ArgumentTuple& args,
|
const ArgumentTuple& args,
|
||||||
::std::ostream* why) const {
|
::std::ostream* why) const
|
||||||
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
const int count = static_cast<int>(untyped_expectations_.size());
|
const int count = static_cast<int>(untyped_expectations_.size());
|
||||||
*why << "Google Mock tried the following " << count << " "
|
*why << "Google Mock tried the following " << count << " "
|
||||||
@ -1694,7 +1721,6 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {
|
|||||||
// Verifies that all expectations on this mock function have been
|
// Verifies that all expectations on this mock function have been
|
||||||
// satisfied. Reports one or more Google Test non-fatal failures and
|
// satisfied. Reports one or more Google Test non-fatal failures and
|
||||||
// returns false if not.
|
// returns false if not.
|
||||||
// L >= g_gmock_mutex
|
|
||||||
|
|
||||||
// Reports an uninteresting call (whose description is in msg) in the
|
// Reports an uninteresting call (whose description is in msg) in the
|
||||||
// manner specified by 'reaction'.
|
// manner specified by 'reaction'.
|
||||||
|
@ -82,11 +82,11 @@ GMOCK_DECLARE_string_(verbose);
|
|||||||
// Since Google Test is needed for Google Mock to work, this function
|
// Since Google Test is needed for Google Mock to work, this function
|
||||||
// also initializes Google Test and parses its flags, if that hasn't
|
// also initializes Google Test and parses its flags, if that hasn't
|
||||||
// been done.
|
// been done.
|
||||||
void InitGoogleMock(int* argc, char** argv);
|
GTEST_API_ void InitGoogleMock(int* argc, char** argv);
|
||||||
|
|
||||||
// This overloaded version can be used in Windows programs compiled in
|
// This overloaded version can be used in Windows programs compiled in
|
||||||
// UNICODE mode.
|
// UNICODE mode.
|
||||||
void InitGoogleMock(int* argc, wchar_t** argv);
|
GTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv);
|
||||||
|
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// This file was GENERATED by a script. DO NOT EDIT BY HAND!!!
|
// This file was GENERATED by command:
|
||||||
|
// pump.py gmock-generated-internal-utils.h.pump
|
||||||
|
// DO NOT EDIT BY HAND!!!
|
||||||
|
|
||||||
// Copyright 2007, Google Inc.
|
// Copyright 2007, Google Inc.
|
||||||
// All rights reserved.
|
// All rights reserved.
|
||||||
@ -58,7 +60,7 @@ class IgnoredValue {
|
|||||||
// deliberately omit the 'explicit' keyword in order to allow the
|
// deliberately omit the 'explicit' keyword in order to allow the
|
||||||
// conversion to be implicit.
|
// conversion to be implicit.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
IgnoredValue(const T&) {}
|
IgnoredValue(const T& /* ignored */) {} // NOLINT(runtime/explicit)
|
||||||
};
|
};
|
||||||
|
|
||||||
// MatcherTuple<T>::type is a tuple type where each field is a Matcher
|
// MatcherTuple<T>::type is a tuple type where each field is a Matcher
|
||||||
|
@ -61,7 +61,7 @@ class IgnoredValue {
|
|||||||
// deliberately omit the 'explicit' keyword in order to allow the
|
// deliberately omit the 'explicit' keyword in order to allow the
|
||||||
// conversion to be implicit.
|
// conversion to be implicit.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
IgnoredValue(const T&) {}
|
IgnoredValue(const T& /* ignored */) {} // NOLINT(runtime/explicit)
|
||||||
};
|
};
|
||||||
|
|
||||||
// MatcherTuple<T>::type is a tuple type where each field is a Matcher
|
// MatcherTuple<T>::type is a tuple type where each field is a Matcher
|
||||||
|
@ -53,7 +53,7 @@ namespace internal {
|
|||||||
// words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is
|
// words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is
|
||||||
// treated as one word. For example, both "FooBar123" and
|
// treated as one word. For example, both "FooBar123" and
|
||||||
// "foo_bar_123" are converted to "foo bar 123".
|
// "foo_bar_123" are converted to "foo bar 123".
|
||||||
string ConvertIdentifierNameToWords(const char* id_name);
|
GTEST_API_ string ConvertIdentifierNameToWords(const char* id_name);
|
||||||
|
|
||||||
// PointeeOf<Pointer>::type is the type of a value pointed to by a
|
// PointeeOf<Pointer>::type is the type of a value pointed to by a
|
||||||
// Pointer, which can be either a smart pointer or a raw pointer. The
|
// Pointer, which can be either a smart pointer or a raw pointer. The
|
||||||
@ -271,7 +271,7 @@ class FailureReporterInterface {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Returns the failure reporter used by Google Mock.
|
// Returns the failure reporter used by Google Mock.
|
||||||
FailureReporterInterface* GetFailureReporter();
|
GTEST_API_ FailureReporterInterface* GetFailureReporter();
|
||||||
|
|
||||||
// Asserts that condition is true; aborts the process with the given
|
// Asserts that condition is true; aborts the process with the given
|
||||||
// message if condition is false. We cannot use LOG(FATAL) or CHECK()
|
// message if condition is false. We cannot use LOG(FATAL) or CHECK()
|
||||||
@ -319,7 +319,7 @@ const char kErrorVerbosity[] = "error";
|
|||||||
|
|
||||||
// Returns true iff a log with the given severity is visible according
|
// Returns true iff a log with the given severity is visible according
|
||||||
// to the --gmock_verbose flag.
|
// to the --gmock_verbose flag.
|
||||||
bool LogIsVisible(LogSeverity severity);
|
GTEST_API_ bool LogIsVisible(LogSeverity severity);
|
||||||
|
|
||||||
// Prints the given message to stdout iff 'severity' >= the level
|
// Prints the given message to stdout iff 'severity' >= the level
|
||||||
// specified by the --gmock_verbose flag. If stack_frames_to_skip >=
|
// specified by the --gmock_verbose flag. If stack_frames_to_skip >=
|
||||||
@ -328,7 +328,9 @@ bool LogIsVisible(LogSeverity severity);
|
|||||||
// stack_frames_to_skip is treated as 0, since we don't know which
|
// stack_frames_to_skip is treated as 0, since we don't know which
|
||||||
// function calls will be inlined by the compiler and need to be
|
// function calls will be inlined by the compiler and need to be
|
||||||
// conservative.
|
// conservative.
|
||||||
void Log(LogSeverity severity, const string& message, int stack_frames_to_skip);
|
GTEST_API_ void Log(LogSeverity severity,
|
||||||
|
const string& message,
|
||||||
|
int stack_frames_to_skip);
|
||||||
|
|
||||||
// TODO(wan@google.com): group all type utilities together.
|
// TODO(wan@google.com): group all type utilities together.
|
||||||
|
|
||||||
@ -352,7 +354,8 @@ template <typename T> struct remove_reference<T&> { typedef T type; }; // NOLINT
|
|||||||
// crashes).
|
// crashes).
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline T Invalid() {
|
inline T Invalid() {
|
||||||
return *static_cast<typename remove_reference<T>::type*>(NULL);
|
return const_cast<typename remove_reference<T>::type&>(
|
||||||
|
*static_cast<volatile typename remove_reference<T>::type*>(NULL));
|
||||||
}
|
}
|
||||||
template <>
|
template <>
|
||||||
inline void Invalid<void>() {}
|
inline void Invalid<void>() {}
|
||||||
@ -457,6 +460,11 @@ class StlContainerView< ::std::tr1::tuple<ElementPointer, Size> > {
|
|||||||
// StlContainer with a reference type.
|
// StlContainer with a reference type.
|
||||||
template <typename T> class StlContainerView<T&>;
|
template <typename T> class StlContainerView<T&>;
|
||||||
|
|
||||||
|
// Mapping from booleans to types. Similar to boost::bool_<kValue> and
|
||||||
|
// std::integral_constant<bool, kValue>.
|
||||||
|
template <bool kValue>
|
||||||
|
struct BooleanConstant {};
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
|
|
||||||
|
@ -61,18 +61,18 @@
|
|||||||
#define GMOCK_FLAG(name) FLAGS_gmock_##name
|
#define GMOCK_FLAG(name) FLAGS_gmock_##name
|
||||||
|
|
||||||
// Macros for declaring flags.
|
// Macros for declaring flags.
|
||||||
#define GMOCK_DECLARE_bool_(name) extern bool GMOCK_FLAG(name)
|
#define GMOCK_DECLARE_bool_(name) extern GTEST_API_ bool GMOCK_FLAG(name)
|
||||||
#define GMOCK_DECLARE_int32_(name) \
|
#define GMOCK_DECLARE_int32_(name) \
|
||||||
extern ::testing::internal::Int32 GMOCK_FLAG(name)
|
extern GTEST_API_ ::testing::internal::Int32 GMOCK_FLAG(name)
|
||||||
#define GMOCK_DECLARE_string_(name) \
|
#define GMOCK_DECLARE_string_(name) \
|
||||||
extern ::testing::internal::String GMOCK_FLAG(name)
|
extern GTEST_API_ ::testing::internal::String GMOCK_FLAG(name)
|
||||||
|
|
||||||
// Macros for defining flags.
|
// Macros for defining flags.
|
||||||
#define GMOCK_DEFINE_bool_(name, default_val, doc) \
|
#define GMOCK_DEFINE_bool_(name, default_val, doc) \
|
||||||
bool GMOCK_FLAG(name) = (default_val)
|
GTEST_API_ bool GMOCK_FLAG(name) = (default_val)
|
||||||
#define GMOCK_DEFINE_int32_(name, default_val, doc) \
|
#define GMOCK_DEFINE_int32_(name, default_val, doc) \
|
||||||
::testing::internal::Int32 GMOCK_FLAG(name) = (default_val)
|
GTEST_API_ ::testing::internal::Int32 GMOCK_FLAG(name) = (default_val)
|
||||||
#define GMOCK_DEFINE_string_(name, default_val, doc) \
|
#define GMOCK_DEFINE_string_(name, default_val, doc) \
|
||||||
::testing::internal::String GMOCK_FLAG(name) = (default_val)
|
GTEST_API_ ::testing::internal::String GMOCK_FLAG(name) = (default_val)
|
||||||
|
|
||||||
#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_
|
#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_
|
||||||
|
@ -82,9 +82,25 @@ def _GenerateMethods(output_lines, source, class_node):
|
|||||||
return_type += '*'
|
return_type += '*'
|
||||||
if node.return_type.reference:
|
if node.return_type.reference:
|
||||||
return_type += '&'
|
return_type += '&'
|
||||||
mock_method_macro = 'MOCK_%sMETHOD%d' % (const, len(node.parameters))
|
num_parameters = len(node.parameters)
|
||||||
|
if len(node.parameters) == 1:
|
||||||
|
first_param = node.parameters[0]
|
||||||
|
if source[first_param.start:first_param.end].strip() == 'void':
|
||||||
|
# We must treat T(void) as a function with no parameters.
|
||||||
|
num_parameters = 0
|
||||||
|
mock_method_macro = 'MOCK_%sMETHOD%d' % (const, num_parameters)
|
||||||
args = ''
|
args = ''
|
||||||
if node.parameters:
|
if node.parameters:
|
||||||
|
# Due to the parser limitations, it is impossible to keep comments
|
||||||
|
# while stripping the default parameters. When defaults are
|
||||||
|
# present, we choose to strip them and comments (and produce
|
||||||
|
# compilable code).
|
||||||
|
# TODO(nnorwitz@google.com): Investigate whether it is possible to
|
||||||
|
# preserve parameter name when reconstructing parameter text from
|
||||||
|
# the AST.
|
||||||
|
if len([param for param in node.parameters if param.default]) > 0:
|
||||||
|
args = ', '.join(param.type.name for param in node.parameters)
|
||||||
|
else:
|
||||||
# Get the full text of the parameters from the start
|
# Get the full text of the parameters from the start
|
||||||
# of the first parameter to the end of the last parameter.
|
# of the first parameter to the end of the last parameter.
|
||||||
start = node.parameters[0].start
|
start = node.parameters[0].start
|
||||||
|
259
cpp/tests/gmock/scripts/generator/cpp/gmock_class_test.py
Executable file
259
cpp/tests/gmock/scripts/generator/cpp/gmock_class_test.py
Executable file
@ -0,0 +1,259 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# Copyright 2009 Neal Norwitz All Rights Reserved.
|
||||||
|
# Portions Copyright 2009 Google Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
"""Tests for gmock.scripts.generator.cpp.gmock_class."""
|
||||||
|
|
||||||
|
__author__ = 'nnorwitz@google.com (Neal Norwitz)'
|
||||||
|
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
# Allow the cpp imports below to work when run as a standalone script.
|
||||||
|
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
|
||||||
|
|
||||||
|
from cpp import ast
|
||||||
|
from cpp import gmock_class
|
||||||
|
|
||||||
|
|
||||||
|
class TestCase(unittest.TestCase):
|
||||||
|
"""Helper class that adds assert methods."""
|
||||||
|
|
||||||
|
def StripLeadingWhitespace(self, lines):
|
||||||
|
"""Strip leading whitespace in each line in 'lines'."""
|
||||||
|
return '\n'.join([s.lstrip() for s in lines.split('\n')])
|
||||||
|
|
||||||
|
def assertEqualIgnoreLeadingWhitespace(self, expected_lines, lines):
|
||||||
|
"""Specialized assert that ignores the indent level."""
|
||||||
|
self.assertEqual(expected_lines, self.StripLeadingWhitespace(lines))
|
||||||
|
|
||||||
|
|
||||||
|
class GenerateMethodsTest(TestCase):
|
||||||
|
|
||||||
|
def GenerateMethodSource(self, cpp_source):
|
||||||
|
"""Convert C++ source to Google Mock output source lines."""
|
||||||
|
method_source_lines = []
|
||||||
|
# <test> is a pseudo-filename, it is not read or written.
|
||||||
|
builder = ast.BuilderFromSource(cpp_source, '<test>')
|
||||||
|
ast_list = list(builder.Generate())
|
||||||
|
gmock_class._GenerateMethods(method_source_lines, cpp_source, ast_list[0])
|
||||||
|
return '\n'.join(method_source_lines)
|
||||||
|
|
||||||
|
def testSimpleMethod(self):
|
||||||
|
source = """
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
virtual int Bar();
|
||||||
|
};
|
||||||
|
"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
'MOCK_METHOD0(Bar,\nint());',
|
||||||
|
self.GenerateMethodSource(source))
|
||||||
|
|
||||||
|
def testSimpleConstMethod(self):
|
||||||
|
source = """
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
virtual void Bar(bool flag) const;
|
||||||
|
};
|
||||||
|
"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
'MOCK_CONST_METHOD1(Bar,\nvoid(bool flag));',
|
||||||
|
self.GenerateMethodSource(source))
|
||||||
|
|
||||||
|
def testExplicitVoid(self):
|
||||||
|
source = """
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
virtual int Bar(void);
|
||||||
|
};
|
||||||
|
"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
'MOCK_METHOD0(Bar,\nint(void));',
|
||||||
|
self.GenerateMethodSource(source))
|
||||||
|
|
||||||
|
def testStrangeNewlineInParameter(self):
|
||||||
|
source = """
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
virtual void Bar(int
|
||||||
|
a) = 0;
|
||||||
|
};
|
||||||
|
"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
'MOCK_METHOD1(Bar,\nvoid(int a));',
|
||||||
|
self.GenerateMethodSource(source))
|
||||||
|
|
||||||
|
def testDefaultParameters(self):
|
||||||
|
source = """
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
virtual void Bar(int a, char c = 'x') = 0;
|
||||||
|
};
|
||||||
|
"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
'MOCK_METHOD2(Bar,\nvoid(int, char));',
|
||||||
|
self.GenerateMethodSource(source))
|
||||||
|
|
||||||
|
def testMultipleDefaultParameters(self):
|
||||||
|
source = """
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
virtual void Bar(int a = 42, char c = 'x') = 0;
|
||||||
|
};
|
||||||
|
"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
'MOCK_METHOD2(Bar,\nvoid(int, char));',
|
||||||
|
self.GenerateMethodSource(source))
|
||||||
|
|
||||||
|
def testRemovesCommentsWhenDefaultsArePresent(self):
|
||||||
|
source = """
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
virtual void Bar(int a = 42 /* a comment */,
|
||||||
|
char /* other comment */ c= 'x') = 0;
|
||||||
|
};
|
||||||
|
"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
'MOCK_METHOD2(Bar,\nvoid(int, char));',
|
||||||
|
self.GenerateMethodSource(source))
|
||||||
|
|
||||||
|
def testDoubleSlashCommentsInParameterListAreRemoved(self):
|
||||||
|
source = """
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
virtual void Bar(int a, // inline comments should be elided.
|
||||||
|
int b // inline comments should be elided.
|
||||||
|
) const = 0;
|
||||||
|
};
|
||||||
|
"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
'MOCK_CONST_METHOD2(Bar,\nvoid(int a, int b));',
|
||||||
|
self.GenerateMethodSource(source))
|
||||||
|
|
||||||
|
def testCStyleCommentsInParameterListAreNotRemoved(self):
|
||||||
|
# NOTE(nnorwitz): I'm not sure if it's the best behavior to keep these
|
||||||
|
# comments. Also note that C style comments after the last parameter
|
||||||
|
# are still elided.
|
||||||
|
source = """
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
virtual const string& Bar(int /* keeper */, int b);
|
||||||
|
};
|
||||||
|
"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
'MOCK_METHOD2(Bar,\nconst string&(int /* keeper */, int b));',
|
||||||
|
self.GenerateMethodSource(source))
|
||||||
|
|
||||||
|
def testArgsOfTemplateTypes(self):
|
||||||
|
source = """
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
virtual int Bar(const vector<int>& v, map<int, string>* output);
|
||||||
|
};"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
'MOCK_METHOD2(Bar,\n'
|
||||||
|
'int(const vector<int>& v, map<int, string>* output));',
|
||||||
|
self.GenerateMethodSource(source))
|
||||||
|
|
||||||
|
def testReturnTypeWithOneTemplateArg(self):
|
||||||
|
source = """
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
virtual vector<int>* Bar(int n);
|
||||||
|
};"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
'MOCK_METHOD1(Bar,\nvector<int>*(int n));',
|
||||||
|
self.GenerateMethodSource(source))
|
||||||
|
|
||||||
|
def testReturnTypeWithManyTemplateArgs(self):
|
||||||
|
source = """
|
||||||
|
class Foo {
|
||||||
|
public:
|
||||||
|
virtual map<int, string> Bar();
|
||||||
|
};"""
|
||||||
|
# Comparing the comment text is brittle - we'll think of something
|
||||||
|
# better in case this gets annoying, but for now let's keep it simple.
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
'// The following line won\'t really compile, as the return\n'
|
||||||
|
'// type has multiple template arguments. To fix it, use a\n'
|
||||||
|
'// typedef for the return type.\n'
|
||||||
|
'MOCK_METHOD0(Bar,\nmap<int, string>());',
|
||||||
|
self.GenerateMethodSource(source))
|
||||||
|
|
||||||
|
|
||||||
|
class GenerateMocksTest(TestCase):
|
||||||
|
|
||||||
|
def GenerateMocks(self, cpp_source):
|
||||||
|
"""Convert C++ source to complete Google Mock output source."""
|
||||||
|
# <test> is a pseudo-filename, it is not read or written.
|
||||||
|
filename = '<test>'
|
||||||
|
builder = ast.BuilderFromSource(cpp_source, filename)
|
||||||
|
ast_list = list(builder.Generate())
|
||||||
|
lines = gmock_class._GenerateMocks(filename, cpp_source, ast_list, None)
|
||||||
|
return '\n'.join(lines)
|
||||||
|
|
||||||
|
def testNamespaces(self):
|
||||||
|
source = """
|
||||||
|
namespace Foo {
|
||||||
|
namespace Bar { class Forward; }
|
||||||
|
namespace Baz {
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
public:
|
||||||
|
virtual void Foo();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Baz
|
||||||
|
} // namespace Foo
|
||||||
|
"""
|
||||||
|
expected = """\
|
||||||
|
namespace Foo {
|
||||||
|
namespace Baz {
|
||||||
|
|
||||||
|
class MockTest : public Test {
|
||||||
|
public:
|
||||||
|
MOCK_METHOD0(Foo,
|
||||||
|
void());
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Baz
|
||||||
|
} // namespace Foo
|
||||||
|
"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
expected, self.GenerateMocks(source))
|
||||||
|
|
||||||
|
def testClassWithStorageSpecifierMacro(self):
|
||||||
|
source = """
|
||||||
|
class STORAGE_SPECIFIER Test {
|
||||||
|
public:
|
||||||
|
virtual void Foo();
|
||||||
|
};
|
||||||
|
"""
|
||||||
|
expected = """\
|
||||||
|
class MockTest : public Test {
|
||||||
|
public:
|
||||||
|
MOCK_METHOD0(Foo,
|
||||||
|
void());
|
||||||
|
};
|
||||||
|
"""
|
||||||
|
self.assertEqualIgnoreLeadingWhitespace(
|
||||||
|
expected, self.GenerateMocks(source))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
621
cpp/tests/gmock/scripts/gmock_doctor.py
Executable file
621
cpp/tests/gmock/scripts/gmock_doctor.py
Executable file
@ -0,0 +1,621 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# Copyright 2008, Google Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above
|
||||||
|
# copyright notice, this list of conditions and the following disclaimer
|
||||||
|
# in the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
# * Neither the name of Google Inc. nor the names of its
|
||||||
|
# contributors may be used to endorse or promote products derived from
|
||||||
|
# this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
"""Converts compiler's errors in code using Google Mock to plain English."""
|
||||||
|
|
||||||
|
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||||
|
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
_VERSION = '1.0.3'
|
||||||
|
|
||||||
|
_EMAIL = 'googlemock@googlegroups.com'
|
||||||
|
|
||||||
|
_COMMON_GMOCK_SYMBOLS = [
|
||||||
|
# Matchers
|
||||||
|
'_',
|
||||||
|
'A',
|
||||||
|
'AddressSatisfies',
|
||||||
|
'AllOf',
|
||||||
|
'An',
|
||||||
|
'AnyOf',
|
||||||
|
'ContainerEq',
|
||||||
|
'Contains',
|
||||||
|
'ContainsRegex',
|
||||||
|
'DoubleEq',
|
||||||
|
'ElementsAre',
|
||||||
|
'ElementsAreArray',
|
||||||
|
'EndsWith',
|
||||||
|
'Eq',
|
||||||
|
'Field',
|
||||||
|
'FloatEq',
|
||||||
|
'Ge',
|
||||||
|
'Gt',
|
||||||
|
'HasSubstr',
|
||||||
|
'IsInitializedProto',
|
||||||
|
'Le',
|
||||||
|
'Lt',
|
||||||
|
'MatcherCast',
|
||||||
|
'Matches',
|
||||||
|
'MatchesRegex',
|
||||||
|
'NanSensitiveDoubleEq',
|
||||||
|
'NanSensitiveFloatEq',
|
||||||
|
'Ne',
|
||||||
|
'Not',
|
||||||
|
'NotNull',
|
||||||
|
'Pointee',
|
||||||
|
'Property',
|
||||||
|
'Ref',
|
||||||
|
'ResultOf',
|
||||||
|
'SafeMatcherCast',
|
||||||
|
'StartsWith',
|
||||||
|
'StrCaseEq',
|
||||||
|
'StrCaseNe',
|
||||||
|
'StrEq',
|
||||||
|
'StrNe',
|
||||||
|
'Truly',
|
||||||
|
'TypedEq',
|
||||||
|
'Value',
|
||||||
|
|
||||||
|
# Actions
|
||||||
|
'Assign',
|
||||||
|
'ByRef',
|
||||||
|
'DeleteArg',
|
||||||
|
'DoAll',
|
||||||
|
'DoDefault',
|
||||||
|
'IgnoreResult',
|
||||||
|
'Invoke',
|
||||||
|
'InvokeArgument',
|
||||||
|
'InvokeWithoutArgs',
|
||||||
|
'Return',
|
||||||
|
'ReturnNew',
|
||||||
|
'ReturnNull',
|
||||||
|
'ReturnRef',
|
||||||
|
'SaveArg',
|
||||||
|
'SetArgReferee',
|
||||||
|
'SetArgPointee',
|
||||||
|
'SetArgumentPointee',
|
||||||
|
'SetArrayArgument',
|
||||||
|
'SetErrnoAndReturn',
|
||||||
|
'Throw',
|
||||||
|
'WithArg',
|
||||||
|
'WithArgs',
|
||||||
|
'WithoutArgs',
|
||||||
|
|
||||||
|
# Cardinalities
|
||||||
|
'AnyNumber',
|
||||||
|
'AtLeast',
|
||||||
|
'AtMost',
|
||||||
|
'Between',
|
||||||
|
'Exactly',
|
||||||
|
|
||||||
|
# Sequences
|
||||||
|
'InSequence',
|
||||||
|
'Sequence',
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
'DefaultValue',
|
||||||
|
'Mock',
|
||||||
|
]
|
||||||
|
|
||||||
|
# Regex for matching source file path and line number in the compiler's errors.
|
||||||
|
_GCC_FILE_LINE_RE = r'(?P<file>.*):(?P<line>\d+):(\d+:)?\s+'
|
||||||
|
_CLANG_FILE_LINE_RE = r'(?P<file>.*):(?P<line>\d+):(?P<column>\d+):\s+'
|
||||||
|
_CLANG_NON_GMOCK_FILE_LINE_RE = (
|
||||||
|
r'(?P<file>.*[/\\^](?!gmock-)[^/\\]+):(?P<line>\d+):(?P<column>\d+):\s+')
|
||||||
|
|
||||||
|
|
||||||
|
def _FindAllMatches(regex, s):
|
||||||
|
"""Generates all matches of regex in string s."""
|
||||||
|
|
||||||
|
r = re.compile(regex)
|
||||||
|
return r.finditer(s)
|
||||||
|
|
||||||
|
|
||||||
|
def _GenericDiagnoser(short_name, long_name, diagnoses, msg):
|
||||||
|
"""Diagnoses the given disease by pattern matching.
|
||||||
|
|
||||||
|
Can provide different diagnoses for different patterns.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
short_name: Short name of the disease.
|
||||||
|
long_name: Long name of the disease.
|
||||||
|
diagnoses: A list of pairs (regex, pattern for formatting the diagnosis
|
||||||
|
for matching regex).
|
||||||
|
msg: Compiler's error messages.
|
||||||
|
Yields:
|
||||||
|
Tuples of the form
|
||||||
|
(short name of disease, long name of disease, diagnosis).
|
||||||
|
"""
|
||||||
|
for regex, diagnosis in diagnoses:
|
||||||
|
if re.search(regex, msg):
|
||||||
|
diagnosis = '%(file)s:%(line)s:' + diagnosis
|
||||||
|
for m in _FindAllMatches(regex, msg):
|
||||||
|
yield (short_name, long_name, diagnosis % m.groupdict())
|
||||||
|
|
||||||
|
|
||||||
|
def _NeedToReturnReferenceDiagnoser(msg):
|
||||||
|
"""Diagnoses the NRR disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
gcc_regex = (r'In member function \'testing::internal::ReturnAction<R>.*\n'
|
||||||
|
+ _GCC_FILE_LINE_RE + r'instantiated from here\n'
|
||||||
|
r'.*gmock-actions\.h.*error: creating array with negative size')
|
||||||
|
clang_regex = (r'error:.*array.*negative.*\r?\n'
|
||||||
|
r'(.*\n)*?' +
|
||||||
|
_CLANG_NON_GMOCK_FILE_LINE_RE +
|
||||||
|
r'note: in instantiation of function template specialization '
|
||||||
|
r'\'testing::internal::ReturnAction<(?P<type>.*)>'
|
||||||
|
r'::operator Action<.*>\' requested here')
|
||||||
|
diagnosis = """
|
||||||
|
You are using a Return() action in a function that returns a reference to
|
||||||
|
%(type)s. Please use ReturnRef() instead."""
|
||||||
|
return _GenericDiagnoser('NRR', 'Need to Return Reference',
|
||||||
|
[(clang_regex, diagnosis),
|
||||||
|
(gcc_regex, diagnosis % {'type': 'a type'})],
|
||||||
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
def _NeedToReturnSomethingDiagnoser(msg):
|
||||||
|
"""Diagnoses the NRS disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
gcc_regex = (_GCC_FILE_LINE_RE + r'(instantiated from here\n.'
|
||||||
|
r'*gmock.*actions\.h.*error: void value not ignored)'
|
||||||
|
r'|(error: control reaches end of non-void function)')
|
||||||
|
clang_regex1 = (_CLANG_FILE_LINE_RE +
|
||||||
|
r'error: cannot initialize return object '
|
||||||
|
r'of type \'Result\' \(aka \'(?P<return_type>.*)\'\) '
|
||||||
|
r'with an rvalue of type \'void\'')
|
||||||
|
clang_regex2 = (_CLANG_FILE_LINE_RE +
|
||||||
|
r'error: cannot initialize return object '
|
||||||
|
r'of type \'(?P<return_type>.*)\' '
|
||||||
|
r'with an rvalue of type \'void\'')
|
||||||
|
diagnosis = """
|
||||||
|
You are using an action that returns void, but it needs to return
|
||||||
|
%(return_type)s. Please tell it *what* to return. Perhaps you can use
|
||||||
|
the pattern DoAll(some_action, Return(some_value))?"""
|
||||||
|
return _GenericDiagnoser(
|
||||||
|
'NRS',
|
||||||
|
'Need to Return Something',
|
||||||
|
[(gcc_regex, diagnosis % {'return_type': '*something*'}),
|
||||||
|
(clang_regex1, diagnosis),
|
||||||
|
(clang_regex2, diagnosis)],
|
||||||
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
def _NeedToReturnNothingDiagnoser(msg):
|
||||||
|
"""Diagnoses the NRN disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
gcc_regex = (_GCC_FILE_LINE_RE + r'instantiated from here\n'
|
||||||
|
r'.*gmock-actions\.h.*error: instantiation of '
|
||||||
|
r'\'testing::internal::ReturnAction<R>::Impl<F>::value_\' '
|
||||||
|
r'as type \'void\'')
|
||||||
|
clang_regex1 = (r'error: field has incomplete type '
|
||||||
|
r'\'Result\' \(aka \'void\'\)(\r)?\n'
|
||||||
|
r'(.*\n)*?' +
|
||||||
|
_CLANG_NON_GMOCK_FILE_LINE_RE + r'note: in instantiation '
|
||||||
|
r'of function template specialization '
|
||||||
|
r'\'testing::internal::ReturnAction<(?P<return_type>.*)>'
|
||||||
|
r'::operator Action<void \(.*\)>\' requested here')
|
||||||
|
clang_regex2 = (r'error: field has incomplete type '
|
||||||
|
r'\'Result\' \(aka \'void\'\)(\r)?\n'
|
||||||
|
r'(.*\n)*?' +
|
||||||
|
_CLANG_NON_GMOCK_FILE_LINE_RE + r'note: in instantiation '
|
||||||
|
r'of function template specialization '
|
||||||
|
r'\'testing::internal::DoBothAction<.*>'
|
||||||
|
r'::operator Action<(?P<return_type>.*) \(.*\)>\' '
|
||||||
|
r'requested here')
|
||||||
|
diagnosis = """
|
||||||
|
You are using an action that returns %(return_type)s, but it needs to return
|
||||||
|
void. Please use a void-returning action instead.
|
||||||
|
|
||||||
|
All actions but the last in DoAll(...) must return void. Perhaps you need
|
||||||
|
to re-arrange the order of actions in a DoAll(), if you are using one?"""
|
||||||
|
return _GenericDiagnoser(
|
||||||
|
'NRN',
|
||||||
|
'Need to Return Nothing',
|
||||||
|
[(gcc_regex, diagnosis % {'return_type': '*something*'}),
|
||||||
|
(clang_regex1, diagnosis),
|
||||||
|
(clang_regex2, diagnosis)],
|
||||||
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
def _IncompleteByReferenceArgumentDiagnoser(msg):
|
||||||
|
"""Diagnoses the IBRA disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
gcc_regex = (_GCC_FILE_LINE_RE + r'instantiated from here\n'
|
||||||
|
r'.*gtest-printers\.h.*error: invalid application of '
|
||||||
|
r'\'sizeof\' to incomplete type \'(?P<type>.*)\'')
|
||||||
|
|
||||||
|
clang_regex = (r'.*gtest-printers\.h.*error: invalid application of '
|
||||||
|
r'\'sizeof\' to an incomplete type '
|
||||||
|
r'\'(?P<type>.*)( const)?\'\r?\n'
|
||||||
|
r'(.*\n)*?' +
|
||||||
|
_CLANG_NON_GMOCK_FILE_LINE_RE +
|
||||||
|
r'note: in instantiation of member function '
|
||||||
|
r'\'testing::internal2::TypeWithoutFormatter<.*>::'
|
||||||
|
r'PrintValue\' requested here')
|
||||||
|
diagnosis = """
|
||||||
|
In order to mock this function, Google Mock needs to see the definition
|
||||||
|
of type "%(type)s" - declaration alone is not enough. Either #include
|
||||||
|
the header that defines it, or change the argument to be passed
|
||||||
|
by pointer."""
|
||||||
|
|
||||||
|
return _GenericDiagnoser('IBRA', 'Incomplete By-Reference Argument Type',
|
||||||
|
[(gcc_regex, diagnosis),
|
||||||
|
(clang_regex, diagnosis)],
|
||||||
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
def _OverloadedFunctionMatcherDiagnoser(msg):
|
||||||
|
"""Diagnoses the OFM disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
gcc_regex = (_GCC_FILE_LINE_RE + r'error: no matching function for '
|
||||||
|
r'call to \'Truly\(<unresolved overloaded function type>\)')
|
||||||
|
clang_regex = (_CLANG_FILE_LINE_RE + r'error: no matching function for '
|
||||||
|
r'call to \'Truly')
|
||||||
|
diagnosis = """
|
||||||
|
The argument you gave to Truly() is an overloaded function. Please tell
|
||||||
|
your compiler which overloaded version you want to use.
|
||||||
|
|
||||||
|
For example, if you want to use the version whose signature is
|
||||||
|
bool Foo(int n);
|
||||||
|
you should write
|
||||||
|
Truly(static_cast<bool (*)(int n)>(Foo))"""
|
||||||
|
return _GenericDiagnoser('OFM', 'Overloaded Function Matcher',
|
||||||
|
[(gcc_regex, diagnosis),
|
||||||
|
(clang_regex, diagnosis)],
|
||||||
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
def _OverloadedFunctionActionDiagnoser(msg):
|
||||||
|
"""Diagnoses the OFA disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
gcc_regex = (_GCC_FILE_LINE_RE + r'error: no matching function for call to '
|
||||||
|
r'\'Invoke\(<unresolved overloaded function type>')
|
||||||
|
clang_regex = (_CLANG_FILE_LINE_RE + r'error: no matching '
|
||||||
|
r'function for call to \'Invoke\'\r?\n'
|
||||||
|
r'(.*\n)*?'
|
||||||
|
r'.*\bgmock-\w+-actions\.h:\d+:\d+:\s+'
|
||||||
|
r'note: candidate template ignored:\s+'
|
||||||
|
r'couldn\'t infer template argument \'FunctionImpl\'')
|
||||||
|
diagnosis = """
|
||||||
|
Function you are passing to Invoke is overloaded. Please tell your compiler
|
||||||
|
which overloaded version you want to use.
|
||||||
|
|
||||||
|
For example, if you want to use the version whose signature is
|
||||||
|
bool MyFunction(int n, double x);
|
||||||
|
you should write something like
|
||||||
|
Invoke(static_cast<bool (*)(int n, double x)>(MyFunction))"""
|
||||||
|
return _GenericDiagnoser('OFA', 'Overloaded Function Action',
|
||||||
|
[(gcc_regex, diagnosis),
|
||||||
|
(clang_regex, diagnosis)],
|
||||||
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
def _OverloadedMethodActionDiagnoser(msg):
|
||||||
|
"""Diagnoses the OMA disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
gcc_regex = (_GCC_FILE_LINE_RE + r'error: no matching function for '
|
||||||
|
r'call to \'Invoke\(.+, <unresolved overloaded function '
|
||||||
|
r'type>\)')
|
||||||
|
clang_regex = (_CLANG_FILE_LINE_RE + r'error: no matching function '
|
||||||
|
r'for call to \'Invoke\'\r?\n'
|
||||||
|
r'(.*\n)*?'
|
||||||
|
r'.*\bgmock-\w+-actions\.h:\d+:\d+: '
|
||||||
|
r'note: candidate function template not viable: '
|
||||||
|
r'requires 1 argument, but 2 were provided')
|
||||||
|
diagnosis = """
|
||||||
|
The second argument you gave to Invoke() is an overloaded method. Please
|
||||||
|
tell your compiler which overloaded version you want to use.
|
||||||
|
|
||||||
|
For example, if you want to use the version whose signature is
|
||||||
|
class Foo {
|
||||||
|
...
|
||||||
|
bool Bar(int n, double x);
|
||||||
|
};
|
||||||
|
you should write something like
|
||||||
|
Invoke(foo, static_cast<bool (Foo::*)(int n, double x)>(&Foo::Bar))"""
|
||||||
|
return _GenericDiagnoser('OMA', 'Overloaded Method Action',
|
||||||
|
[(gcc_regex, diagnosis),
|
||||||
|
(clang_regex, diagnosis)],
|
||||||
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
def _MockObjectPointerDiagnoser(msg):
|
||||||
|
"""Diagnoses the MOP disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
gcc_regex = (_GCC_FILE_LINE_RE + r'error: request for member '
|
||||||
|
r'\'gmock_(?P<method>.+)\' in \'(?P<mock_object>.+)\', '
|
||||||
|
r'which is of non-class type \'(.*::)*(?P<class_name>.+)\*\'')
|
||||||
|
clang_regex = (_CLANG_FILE_LINE_RE + r'error: member reference type '
|
||||||
|
r'\'(?P<class_name>.*?) *\' is a pointer; '
|
||||||
|
r'maybe you meant to use \'->\'\?')
|
||||||
|
diagnosis = """
|
||||||
|
The first argument to ON_CALL() and EXPECT_CALL() must be a mock *object*,
|
||||||
|
not a *pointer* to it. Please write '*(%(mock_object)s)' instead of
|
||||||
|
'%(mock_object)s' as your first argument.
|
||||||
|
|
||||||
|
For example, given the mock class:
|
||||||
|
|
||||||
|
class %(class_name)s : public ... {
|
||||||
|
...
|
||||||
|
MOCK_METHOD0(%(method)s, ...);
|
||||||
|
};
|
||||||
|
|
||||||
|
and the following mock instance:
|
||||||
|
|
||||||
|
%(class_name)s* mock_ptr = ...
|
||||||
|
|
||||||
|
you should use the EXPECT_CALL like this:
|
||||||
|
|
||||||
|
EXPECT_CALL(*mock_ptr, %(method)s(...));"""
|
||||||
|
|
||||||
|
return _GenericDiagnoser(
|
||||||
|
'MOP',
|
||||||
|
'Mock Object Pointer',
|
||||||
|
[(gcc_regex, diagnosis),
|
||||||
|
(clang_regex, diagnosis % {'mock_object': 'mock_object',
|
||||||
|
'method': 'method',
|
||||||
|
'class_name': '%(class_name)s'})],
|
||||||
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
def _NeedToUseSymbolDiagnoser(msg):
|
||||||
|
"""Diagnoses the NUS disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
gcc_regex = (_GCC_FILE_LINE_RE + r'error: \'(?P<symbol>.+)\' '
|
||||||
|
r'(was not declared in this scope|has not been declared)')
|
||||||
|
clang_regex = (_CLANG_FILE_LINE_RE +
|
||||||
|
r'error: (use of undeclared identifier|unknown type name|'
|
||||||
|
r'no template named) \'(?P<symbol>[^\']+)\'')
|
||||||
|
diagnosis = """
|
||||||
|
'%(symbol)s' is defined by Google Mock in the testing namespace.
|
||||||
|
Did you forget to write
|
||||||
|
using testing::%(symbol)s;
|
||||||
|
?"""
|
||||||
|
for m in (list(_FindAllMatches(gcc_regex, msg)) +
|
||||||
|
list(_FindAllMatches(clang_regex, msg))):
|
||||||
|
symbol = m.groupdict()['symbol']
|
||||||
|
if symbol in _COMMON_GMOCK_SYMBOLS:
|
||||||
|
yield ('NUS', 'Need to Use Symbol', diagnosis % m.groupdict())
|
||||||
|
|
||||||
|
|
||||||
|
def _NeedToUseReturnNullDiagnoser(msg):
|
||||||
|
"""Diagnoses the NRNULL disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
gcc_regex = ('instantiated from \'testing::internal::ReturnAction<R>'
|
||||||
|
'::operator testing::Action<Func>\(\) const.*\n' +
|
||||||
|
_GCC_FILE_LINE_RE + r'instantiated from here\n'
|
||||||
|
r'.*error: no matching function for call to \'ImplicitCast_\('
|
||||||
|
r'(:?long )?int&\)')
|
||||||
|
clang_regex = (r'\bgmock-actions.h:.* error: no matching function for '
|
||||||
|
r'call to \'ImplicitCast_\'\r?\n'
|
||||||
|
r'(.*\n)*?' +
|
||||||
|
_CLANG_NON_GMOCK_FILE_LINE_RE + r'note: in instantiation '
|
||||||
|
r'of function template specialization '
|
||||||
|
r'\'testing::internal::ReturnAction<(int|long)>::operator '
|
||||||
|
r'Action<(?P<type>.*)\(\)>\' requested here')
|
||||||
|
diagnosis = """
|
||||||
|
You are probably calling Return(NULL) and the compiler isn't sure how to turn
|
||||||
|
NULL into %(type)s. Use ReturnNull() instead.
|
||||||
|
Note: the line number may be off; please fix all instances of Return(NULL)."""
|
||||||
|
return _GenericDiagnoser(
|
||||||
|
'NRNULL', 'Need to use ReturnNull',
|
||||||
|
[(clang_regex, diagnosis),
|
||||||
|
(gcc_regex, diagnosis % {'type': 'the right type'})],
|
||||||
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
def _TypeInTemplatedBaseDiagnoser(msg):
|
||||||
|
"""Diagnoses the TTB disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
# This version works when the type is used as the mock function's return
|
||||||
|
# type.
|
||||||
|
gcc_4_3_1_regex_type_in_retval = (
|
||||||
|
r'In member function \'int .*\n' + _GCC_FILE_LINE_RE +
|
||||||
|
r'error: a function call cannot appear in a constant-expression')
|
||||||
|
gcc_4_4_0_regex_type_in_retval = (
|
||||||
|
r'error: a function call cannot appear in a constant-expression'
|
||||||
|
+ _GCC_FILE_LINE_RE + r'error: template argument 1 is invalid\n')
|
||||||
|
# This version works when the type is used as the mock function's sole
|
||||||
|
# parameter type.
|
||||||
|
gcc_regex_type_of_sole_param = (
|
||||||
|
_GCC_FILE_LINE_RE +
|
||||||
|
r'error: \'(?P<type>.+)\' was not declared in this scope\n'
|
||||||
|
r'.*error: template argument 1 is invalid\n')
|
||||||
|
# This version works when the type is used as a parameter of a mock
|
||||||
|
# function that has multiple parameters.
|
||||||
|
gcc_regex_type_of_a_param = (
|
||||||
|
r'error: expected `;\' before \'::\' token\n'
|
||||||
|
+ _GCC_FILE_LINE_RE +
|
||||||
|
r'error: \'(?P<type>.+)\' was not declared in this scope\n'
|
||||||
|
r'.*error: template argument 1 is invalid\n'
|
||||||
|
r'.*error: \'.+\' was not declared in this scope')
|
||||||
|
clang_regex_type_of_retval_or_sole_param = (
|
||||||
|
_CLANG_FILE_LINE_RE +
|
||||||
|
r'error: use of undeclared identifier \'(?P<type>.*)\'\n'
|
||||||
|
r'(.*\n)*?'
|
||||||
|
r'(?P=file):(?P=line):\d+: error: '
|
||||||
|
r'non-friend class member \'Result\' cannot have a qualified name'
|
||||||
|
)
|
||||||
|
clang_regex_type_of_a_param = (
|
||||||
|
_CLANG_FILE_LINE_RE +
|
||||||
|
r'error: C\+\+ requires a type specifier for all declarations\n'
|
||||||
|
r'(.*\n)*?'
|
||||||
|
r'(?P=file):(?P=line):(?P=column): error: '
|
||||||
|
r'C\+\+ requires a type specifier for all declarations'
|
||||||
|
)
|
||||||
|
|
||||||
|
diagnosis = """
|
||||||
|
In a mock class template, types or typedefs defined in the base class
|
||||||
|
template are *not* automatically visible. This is how C++ works. Before
|
||||||
|
you can use a type or typedef named %(type)s defined in base class Base<T>, you
|
||||||
|
need to make it visible. One way to do it is:
|
||||||
|
|
||||||
|
typedef typename Base<T>::%(type)s %(type)s;"""
|
||||||
|
|
||||||
|
return _GenericDiagnoser(
|
||||||
|
'TTB', 'Type in Template Base',
|
||||||
|
[(gcc_4_3_1_regex_type_in_retval, diagnosis % {'type': 'Foo'}),
|
||||||
|
(gcc_4_4_0_regex_type_in_retval, diagnosis % {'type': 'Foo'}),
|
||||||
|
(gcc_regex_type_of_sole_param, diagnosis),
|
||||||
|
(gcc_regex_type_of_a_param, diagnosis),
|
||||||
|
(clang_regex_type_of_retval_or_sole_param, diagnosis),
|
||||||
|
(clang_regex_type_of_a_param, diagnosis % {'type': 'Foo'})],
|
||||||
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
def _WrongMockMethodMacroDiagnoser(msg):
|
||||||
|
"""Diagnoses the WMM disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
gcc_regex = (_GCC_FILE_LINE_RE +
|
||||||
|
r'.*this_method_does_not_take_(?P<wrong_args>\d+)_argument.*\n'
|
||||||
|
r'.*\n'
|
||||||
|
r'.*candidates are.*FunctionMocker<[^>]+A(?P<args>\d+)\)>')
|
||||||
|
clang_regex = (_CLANG_NON_GMOCK_FILE_LINE_RE +
|
||||||
|
r'error:.*array.*negative.*r?\n'
|
||||||
|
r'(.*\n)*?'
|
||||||
|
r'(?P=file):(?P=line):(?P=column): error: too few arguments '
|
||||||
|
r'to function call, expected (?P<args>\d+), '
|
||||||
|
r'have (?P<wrong_args>\d+)')
|
||||||
|
diagnosis = """
|
||||||
|
You are using MOCK_METHOD%(wrong_args)s to define a mock method that has
|
||||||
|
%(args)s arguments. Use MOCK_METHOD%(args)s (or MOCK_CONST_METHOD%(args)s,
|
||||||
|
MOCK_METHOD%(args)s_T, MOCK_CONST_METHOD%(args)s_T as appropriate) instead."""
|
||||||
|
return _GenericDiagnoser('WMM', 'Wrong MOCK_METHODn Macro',
|
||||||
|
[(gcc_regex, diagnosis),
|
||||||
|
(clang_regex, diagnosis)],
|
||||||
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
def _WrongParenPositionDiagnoser(msg):
|
||||||
|
"""Diagnoses the WPP disease, given the error messages by the compiler."""
|
||||||
|
|
||||||
|
gcc_regex = (_GCC_FILE_LINE_RE +
|
||||||
|
r'error:.*testing::internal::MockSpec<.* has no member named \''
|
||||||
|
r'(?P<method>\w+)\'')
|
||||||
|
clang_regex = (_CLANG_NON_GMOCK_FILE_LINE_RE +
|
||||||
|
r'error: no member named \'(?P<method>\w+)\' in '
|
||||||
|
r'\'testing::internal::MockSpec<.*>\'')
|
||||||
|
diagnosis = """
|
||||||
|
The closing parenthesis of ON_CALL or EXPECT_CALL should be *before*
|
||||||
|
".%(method)s". For example, you should write:
|
||||||
|
EXPECT_CALL(my_mock, Foo(_)).%(method)s(...);
|
||||||
|
instead of:
|
||||||
|
EXPECT_CALL(my_mock, Foo(_).%(method)s(...));"""
|
||||||
|
return _GenericDiagnoser('WPP', 'Wrong Parenthesis Position',
|
||||||
|
[(gcc_regex, diagnosis),
|
||||||
|
(clang_regex, diagnosis)],
|
||||||
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
_DIAGNOSERS = [
|
||||||
|
_IncompleteByReferenceArgumentDiagnoser,
|
||||||
|
_MockObjectPointerDiagnoser,
|
||||||
|
_NeedToReturnNothingDiagnoser,
|
||||||
|
_NeedToReturnReferenceDiagnoser,
|
||||||
|
_NeedToReturnSomethingDiagnoser,
|
||||||
|
_NeedToUseReturnNullDiagnoser,
|
||||||
|
_NeedToUseSymbolDiagnoser,
|
||||||
|
_OverloadedFunctionActionDiagnoser,
|
||||||
|
_OverloadedFunctionMatcherDiagnoser,
|
||||||
|
_OverloadedMethodActionDiagnoser,
|
||||||
|
_TypeInTemplatedBaseDiagnoser,
|
||||||
|
_WrongMockMethodMacroDiagnoser,
|
||||||
|
_WrongParenPositionDiagnoser,
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def Diagnose(msg):
|
||||||
|
"""Generates all possible diagnoses given the compiler error message."""
|
||||||
|
|
||||||
|
msg = re.sub(r'\x1b\[[^m]*m', '', msg) # Strips all color formatting.
|
||||||
|
# Assuming the string is using the UTF-8 encoding, replaces the left and
|
||||||
|
# the right single quote characters with apostrophes.
|
||||||
|
msg = re.sub(r'(\xe2\x80\x98|\xe2\x80\x99)', "'", msg)
|
||||||
|
|
||||||
|
diagnoses = []
|
||||||
|
for diagnoser in _DIAGNOSERS:
|
||||||
|
for diag in diagnoser(msg):
|
||||||
|
diagnosis = '[%s - %s]\n%s' % diag
|
||||||
|
if not diagnosis in diagnoses:
|
||||||
|
diagnoses.append(diagnosis)
|
||||||
|
return diagnoses
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print ('Google Mock Doctor v%s - '
|
||||||
|
'diagnoses problems in code using Google Mock.' % _VERSION)
|
||||||
|
|
||||||
|
if sys.stdin.isatty():
|
||||||
|
print ('Please copy and paste the compiler errors here. Press c-D when '
|
||||||
|
'you are done:')
|
||||||
|
else:
|
||||||
|
print 'Waiting for compiler errors on stdin . . .'
|
||||||
|
|
||||||
|
msg = sys.stdin.read().strip()
|
||||||
|
diagnoses = Diagnose(msg)
|
||||||
|
count = len(diagnoses)
|
||||||
|
if not count:
|
||||||
|
print ("""
|
||||||
|
Your compiler complained:
|
||||||
|
8<------------------------------------------------------------
|
||||||
|
%s
|
||||||
|
------------------------------------------------------------>8
|
||||||
|
|
||||||
|
Uh-oh, I'm not smart enough to figure out what the problem is. :-(
|
||||||
|
However...
|
||||||
|
If you send your source code and the compiler's error messages to
|
||||||
|
%s, you can be helped and I can get smarter --
|
||||||
|
win-win for us!""" % (msg, _EMAIL))
|
||||||
|
else:
|
||||||
|
print '------------------------------------------------------------'
|
||||||
|
print 'Your code appears to have the following',
|
||||||
|
if count > 1:
|
||||||
|
print '%s diseases:' % (count,)
|
||||||
|
else:
|
||||||
|
print 'disease:'
|
||||||
|
i = 0
|
||||||
|
for d in diagnoses:
|
||||||
|
i += 1
|
||||||
|
if count > 1:
|
||||||
|
print '\n#%s:' % (i,)
|
||||||
|
print d
|
||||||
|
print ("""
|
||||||
|
How did I do? If you think I'm wrong or unhelpful, please send your
|
||||||
|
source code and the compiler's error messages to %s.
|
||||||
|
Then you can be helped and I can get smarter -- I promise I won't be upset!""" %
|
||||||
|
_EMAIL)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
1387
cpp/tests/gmock/scripts/upload.py
Executable file
1387
cpp/tests/gmock/scripts/upload.py
Executable file
File diff suppressed because it is too large
Load Diff
78
cpp/tests/gmock/scripts/upload_gmock.py
Executable file
78
cpp/tests/gmock/scripts/upload_gmock.py
Executable file
@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# Copyright 2009, Google Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above
|
||||||
|
# copyright notice, this list of conditions and the following disclaimer
|
||||||
|
# in the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
# * Neither the name of Google Inc. nor the names of its
|
||||||
|
# contributors may be used to endorse or promote products derived from
|
||||||
|
# this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
"""upload_gmock.py v0.1.0 -- uploads a Google Mock patch for review.
|
||||||
|
|
||||||
|
This simple wrapper passes all command line flags and
|
||||||
|
--cc=googlemock@googlegroups.com to upload.py.
|
||||||
|
|
||||||
|
USAGE: upload_gmock.py [options for upload.py]
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = 'wan@google.com (Zhanyong Wan)'
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
CC_FLAG = '--cc='
|
||||||
|
GMOCK_GROUP = 'googlemock@googlegroups.com'
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Finds the path to upload.py, assuming it is in the same directory
|
||||||
|
# as this file.
|
||||||
|
my_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
upload_py_path = os.path.join(my_dir, 'upload.py')
|
||||||
|
|
||||||
|
# Adds Google Mock discussion group to the cc line if it's not there
|
||||||
|
# already.
|
||||||
|
upload_py_argv = [upload_py_path]
|
||||||
|
found_cc_flag = False
|
||||||
|
for arg in sys.argv[1:]:
|
||||||
|
if arg.startswith(CC_FLAG):
|
||||||
|
found_cc_flag = True
|
||||||
|
cc_line = arg[len(CC_FLAG):]
|
||||||
|
cc_list = [addr for addr in cc_line.split(',') if addr]
|
||||||
|
if GMOCK_GROUP not in cc_list:
|
||||||
|
cc_list.append(GMOCK_GROUP)
|
||||||
|
upload_py_argv.append(CC_FLAG + ','.join(cc_list))
|
||||||
|
else:
|
||||||
|
upload_py_argv.append(arg)
|
||||||
|
|
||||||
|
if not found_cc_flag:
|
||||||
|
upload_py_argv.append(CC_FLAG + GMOCK_GROUP)
|
||||||
|
|
||||||
|
# Invokes upload.py with the modified command line flags.
|
||||||
|
os.execv(upload_py_path, upload_py_argv)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
@ -75,7 +75,7 @@ class BetweenCardinalityImpl : public CardinalityInterface {
|
|||||||
virtual int ConservativeUpperBound() const { return max_; }
|
virtual int ConservativeUpperBound() const { return max_; }
|
||||||
|
|
||||||
virtual bool IsSatisfiedByCallCount(int call_count) const {
|
virtual bool IsSatisfiedByCallCount(int call_count) const {
|
||||||
return min_ <= call_count && call_count <= max_ ;
|
return min_ <= call_count && call_count <= max_;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool IsSaturatedByCallCount(int call_count) const {
|
virtual bool IsSaturatedByCallCount(int call_count) const {
|
||||||
@ -83,6 +83,7 @@ class BetweenCardinalityImpl : public CardinalityInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual void DescribeTo(::std::ostream* os) const;
|
virtual void DescribeTo(::std::ostream* os) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const int min_;
|
const int min_;
|
||||||
const int max_;
|
const int max_;
|
||||||
@ -136,20 +137,20 @@ void Cardinality::DescribeActualCallCountTo(int actual_call_count,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Creates a cardinality that allows at least n calls.
|
// Creates a cardinality that allows at least n calls.
|
||||||
Cardinality AtLeast(int n) { return Between(n, INT_MAX); }
|
GTEST_API_ Cardinality AtLeast(int n) { return Between(n, INT_MAX); }
|
||||||
|
|
||||||
// Creates a cardinality that allows at most n calls.
|
// Creates a cardinality that allows at most n calls.
|
||||||
Cardinality AtMost(int n) { return Between(0, n); }
|
GTEST_API_ Cardinality AtMost(int n) { return Between(0, n); }
|
||||||
|
|
||||||
// Creates a cardinality that allows any number of calls.
|
// Creates a cardinality that allows any number of calls.
|
||||||
Cardinality AnyNumber() { return AtLeast(0); }
|
GTEST_API_ Cardinality AnyNumber() { return AtLeast(0); }
|
||||||
|
|
||||||
// Creates a cardinality that allows between min and max calls.
|
// Creates a cardinality that allows between min and max calls.
|
||||||
Cardinality Between(int min, int max) {
|
GTEST_API_ Cardinality Between(int min, int max) {
|
||||||
return Cardinality(new BetweenCardinalityImpl(min, max));
|
return Cardinality(new BetweenCardinalityImpl(min, max));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates a cardinality that allows exactly n calls.
|
// Creates a cardinality that allows exactly n calls.
|
||||||
Cardinality Exactly(int n) { return Between(n, n); }
|
GTEST_API_ Cardinality Exactly(int n) { return Between(n, n); }
|
||||||
|
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
|
@ -51,7 +51,7 @@ namespace internal {
|
|||||||
// words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is
|
// words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is
|
||||||
// treated as one word. For example, both "FooBar123" and
|
// treated as one word. For example, both "FooBar123" and
|
||||||
// "foo_bar_123" are converted to "foo bar 123".
|
// "foo_bar_123" are converted to "foo bar 123".
|
||||||
string ConvertIdentifierNameToWords(const char* id_name) {
|
GTEST_API_ string ConvertIdentifierNameToWords(const char* id_name) {
|
||||||
string result;
|
string result;
|
||||||
char prev_char = '\0';
|
char prev_char = '\0';
|
||||||
for (const char* p = id_name; *p != '\0'; prev_char = *(p++)) {
|
for (const char* p = id_name; *p != '\0'; prev_char = *(p++)) {
|
||||||
@ -91,7 +91,7 @@ class GoogleTestFailureReporter : public FailureReporterInterface {
|
|||||||
|
|
||||||
// Returns the global failure reporter. Will create a
|
// Returns the global failure reporter. Will create a
|
||||||
// GoogleTestFailureReporter and return it the first time called.
|
// GoogleTestFailureReporter and return it the first time called.
|
||||||
FailureReporterInterface* GetFailureReporter() {
|
GTEST_API_ FailureReporterInterface* GetFailureReporter() {
|
||||||
// Points to the global failure reporter used by Google Mock. gcc
|
// Points to the global failure reporter used by Google Mock. gcc
|
||||||
// guarantees that the following use of failure_reporter is
|
// guarantees that the following use of failure_reporter is
|
||||||
// thread-safe. We may need to add additional synchronization to
|
// thread-safe. We may need to add additional synchronization to
|
||||||
@ -107,7 +107,7 @@ static GTEST_DEFINE_STATIC_MUTEX_(g_log_mutex);
|
|||||||
|
|
||||||
// Returns true iff a log with the given severity is visible according
|
// Returns true iff a log with the given severity is visible according
|
||||||
// to the --gmock_verbose flag.
|
// to the --gmock_verbose flag.
|
||||||
bool LogIsVisible(LogSeverity severity) {
|
GTEST_API_ bool LogIsVisible(LogSeverity severity) {
|
||||||
if (GMOCK_FLAG(verbose) == kInfoVerbosity) {
|
if (GMOCK_FLAG(verbose) == kInfoVerbosity) {
|
||||||
// Always show the log if --gmock_verbose=info.
|
// Always show the log if --gmock_verbose=info.
|
||||||
return true;
|
return true;
|
||||||
@ -128,7 +128,8 @@ bool LogIsVisible(LogSeverity severity) {
|
|||||||
// stack_frames_to_skip is treated as 0, since we don't know which
|
// stack_frames_to_skip is treated as 0, since we don't know which
|
||||||
// function calls will be inlined by the compiler and need to be
|
// function calls will be inlined by the compiler and need to be
|
||||||
// conservative.
|
// conservative.
|
||||||
void Log(LogSeverity severity, const string& message,
|
GTEST_API_ void Log(LogSeverity severity,
|
||||||
|
const string& message,
|
||||||
int stack_frames_to_skip) {
|
int stack_frames_to_skip) {
|
||||||
if (!LogIsVisible(severity))
|
if (!LogIsVisible(severity))
|
||||||
return;
|
return;
|
||||||
|
@ -67,7 +67,7 @@ namespace internal {
|
|||||||
|
|
||||||
// Joins a vector of strings as if they are fields of a tuple; returns
|
// Joins a vector of strings as if they are fields of a tuple; returns
|
||||||
// the joined string.
|
// the joined string.
|
||||||
string JoinAsTuple(const Strings& fields) {
|
GTEST_API_ string JoinAsTuple(const Strings& fields) {
|
||||||
switch (fields.size()) {
|
switch (fields.size()) {
|
||||||
case 0:
|
case 0:
|
||||||
return "";
|
return "";
|
||||||
@ -89,7 +89,8 @@ string JoinAsTuple(const Strings& fields) {
|
|||||||
// 'negation' is false; otherwise returns the description of the
|
// 'negation' is false; otherwise returns the description of the
|
||||||
// negation of the matcher. 'param_values' contains a list of strings
|
// negation of the matcher. 'param_values' contains a list of strings
|
||||||
// that are the print-out of the matcher's parameters.
|
// that are the print-out of the matcher's parameters.
|
||||||
string FormatMatcherDescription(bool negation, const char* matcher_name,
|
GTEST_API_ string FormatMatcherDescription(bool negation,
|
||||||
|
const char* matcher_name,
|
||||||
const Strings& param_values) {
|
const Strings& param_values) {
|
||||||
string result = ConvertIdentifierNameToWords(matcher_name);
|
string result = ConvertIdentifierNameToWords(matcher_name);
|
||||||
if (param_values.size() >= 1)
|
if (param_values.size() >= 1)
|
||||||
|
@ -53,10 +53,10 @@ namespace internal {
|
|||||||
|
|
||||||
// Protects the mock object registry (in class Mock), all function
|
// Protects the mock object registry (in class Mock), all function
|
||||||
// mockers, and all expectations.
|
// mockers, and all expectations.
|
||||||
GTEST_DEFINE_STATIC_MUTEX_(g_gmock_mutex);
|
GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_gmock_mutex);
|
||||||
|
|
||||||
// Logs a message including file and line number information.
|
// Logs a message including file and line number information.
|
||||||
void LogWithLocation(testing::internal::LogSeverity severity,
|
GTEST_API_ void LogWithLocation(testing::internal::LogSeverity severity,
|
||||||
const char* file, int line,
|
const char* file, int line,
|
||||||
const string& message) {
|
const string& message) {
|
||||||
::std::ostringstream s;
|
::std::ostringstream s;
|
||||||
@ -92,7 +92,8 @@ void ExpectationBase::SpecifyCardinality(const Cardinality& a_cardinality) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Retires all pre-requisites of this expectation.
|
// Retires all pre-requisites of this expectation.
|
||||||
void ExpectationBase::RetireAllPreRequisites() {
|
void ExpectationBase::RetireAllPreRequisites()
|
||||||
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
if (is_retired()) {
|
if (is_retired()) {
|
||||||
// We can take this short-cut as we never retire an expectation
|
// We can take this short-cut as we never retire an expectation
|
||||||
// until we have retired all its pre-requisites.
|
// until we have retired all its pre-requisites.
|
||||||
@ -111,8 +112,8 @@ void ExpectationBase::RetireAllPreRequisites() {
|
|||||||
|
|
||||||
// Returns true iff all pre-requisites of this expectation have been
|
// Returns true iff all pre-requisites of this expectation have been
|
||||||
// satisfied.
|
// satisfied.
|
||||||
// L >= g_gmock_mutex
|
bool ExpectationBase::AllPrerequisitesAreSatisfied() const
|
||||||
bool ExpectationBase::AllPrerequisitesAreSatisfied() const {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin();
|
for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin();
|
||||||
it != immediate_prerequisites_.end(); ++it) {
|
it != immediate_prerequisites_.end(); ++it) {
|
||||||
@ -124,9 +125,8 @@ bool ExpectationBase::AllPrerequisitesAreSatisfied() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Adds unsatisfied pre-requisites of this expectation to 'result'.
|
// Adds unsatisfied pre-requisites of this expectation to 'result'.
|
||||||
// L >= g_gmock_mutex
|
void ExpectationBase::FindUnsatisfiedPrerequisites(ExpectationSet* result) const
|
||||||
void ExpectationBase::FindUnsatisfiedPrerequisites(
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
ExpectationSet* result) const {
|
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin();
|
for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin();
|
||||||
it != immediate_prerequisites_.end(); ++it) {
|
it != immediate_prerequisites_.end(); ++it) {
|
||||||
@ -147,8 +147,8 @@ void ExpectationBase::FindUnsatisfiedPrerequisites(
|
|||||||
|
|
||||||
// Describes how many times a function call matching this
|
// Describes how many times a function call matching this
|
||||||
// expectation has occurred.
|
// expectation has occurred.
|
||||||
// L >= g_gmock_mutex
|
void ExpectationBase::DescribeCallCountTo(::std::ostream* os) const
|
||||||
void ExpectationBase::DescribeCallCountTo(::std::ostream* os) const {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
|
|
||||||
// Describes how many times the function is expected to be called.
|
// Describes how many times the function is expected to be called.
|
||||||
@ -170,8 +170,8 @@ void ExpectationBase::DescribeCallCountTo(::std::ostream* os) const {
|
|||||||
// WillRepeatedly() clauses) against the cardinality if this hasn't
|
// WillRepeatedly() clauses) against the cardinality if this hasn't
|
||||||
// been done before. Prints a warning if there are too many or too
|
// been done before. Prints a warning if there are too many or too
|
||||||
// few actions.
|
// few actions.
|
||||||
// L < mutex_
|
void ExpectationBase::CheckActionCountIfNotDone() const
|
||||||
void ExpectationBase::CheckActionCountIfNotDone() const {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
bool should_check = false;
|
bool should_check = false;
|
||||||
{
|
{
|
||||||
MutexLock l(&mutex_);
|
MutexLock l(&mutex_);
|
||||||
@ -240,7 +240,7 @@ void ExpectationBase::UntypedTimes(const Cardinality& a_cardinality) {
|
|||||||
|
|
||||||
// Points to the implicit sequence introduced by a living InSequence
|
// Points to the implicit sequence introduced by a living InSequence
|
||||||
// object (if any) in the current thread or NULL.
|
// object (if any) in the current thread or NULL.
|
||||||
ThreadLocal<Sequence*> g_gmock_implicit_sequence;
|
GTEST_API_ ThreadLocal<Sequence*> g_gmock_implicit_sequence;
|
||||||
|
|
||||||
// Reports an uninteresting call (whose description is in msg) in the
|
// Reports an uninteresting call (whose description is in msg) in the
|
||||||
// manner specified by 'reaction'.
|
// manner specified by 'reaction'.
|
||||||
@ -266,8 +266,8 @@ UntypedFunctionMockerBase::~UntypedFunctionMockerBase() {}
|
|||||||
// this information in the global mock registry. Will be called
|
// this information in the global mock registry. Will be called
|
||||||
// whenever an EXPECT_CALL() or ON_CALL() is executed on this mock
|
// whenever an EXPECT_CALL() or ON_CALL() is executed on this mock
|
||||||
// method.
|
// method.
|
||||||
// L < g_gmock_mutex
|
void UntypedFunctionMockerBase::RegisterOwner(const void* mock_obj)
|
||||||
void UntypedFunctionMockerBase::RegisterOwner(const void* mock_obj) {
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
|
||||||
{
|
{
|
||||||
MutexLock l(&g_gmock_mutex);
|
MutexLock l(&g_gmock_mutex);
|
||||||
mock_obj_ = mock_obj;
|
mock_obj_ = mock_obj;
|
||||||
@ -278,9 +278,9 @@ void UntypedFunctionMockerBase::RegisterOwner(const void* mock_obj) {
|
|||||||
// Sets the mock object this mock method belongs to, and sets the name
|
// Sets the mock object this mock method belongs to, and sets the name
|
||||||
// of the mock function. Will be called upon each invocation of this
|
// of the mock function. Will be called upon each invocation of this
|
||||||
// mock function.
|
// mock function.
|
||||||
// L < g_gmock_mutex
|
void UntypedFunctionMockerBase::SetOwnerAndName(const void* mock_obj,
|
||||||
void UntypedFunctionMockerBase::SetOwnerAndName(
|
const char* name)
|
||||||
const void* mock_obj, const char* name) {
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
|
||||||
// We protect name_ under g_gmock_mutex in case this mock function
|
// We protect name_ under g_gmock_mutex in case this mock function
|
||||||
// is called from two threads concurrently.
|
// is called from two threads concurrently.
|
||||||
MutexLock l(&g_gmock_mutex);
|
MutexLock l(&g_gmock_mutex);
|
||||||
@ -290,8 +290,8 @@ void UntypedFunctionMockerBase::SetOwnerAndName(
|
|||||||
|
|
||||||
// Returns the name of the function being mocked. Must be called
|
// Returns the name of the function being mocked. Must be called
|
||||||
// after RegisterOwner() or SetOwnerAndName() has been called.
|
// after RegisterOwner() or SetOwnerAndName() has been called.
|
||||||
// L < g_gmock_mutex
|
const void* UntypedFunctionMockerBase::MockObject() const
|
||||||
const void* UntypedFunctionMockerBase::MockObject() const {
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
|
||||||
const void* mock_obj;
|
const void* mock_obj;
|
||||||
{
|
{
|
||||||
// We protect mock_obj_ under g_gmock_mutex in case this mock
|
// We protect mock_obj_ under g_gmock_mutex in case this mock
|
||||||
@ -307,8 +307,8 @@ const void* UntypedFunctionMockerBase::MockObject() const {
|
|||||||
|
|
||||||
// Returns the name of this mock method. Must be called after
|
// Returns the name of this mock method. Must be called after
|
||||||
// SetOwnerAndName() has been called.
|
// SetOwnerAndName() has been called.
|
||||||
// L < g_gmock_mutex
|
const char* UntypedFunctionMockerBase::Name() const
|
||||||
const char* UntypedFunctionMockerBase::Name() const {
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
|
||||||
const char* name;
|
const char* name;
|
||||||
{
|
{
|
||||||
// We protect name_ under g_gmock_mutex in case this mock
|
// We protect name_ under g_gmock_mutex in case this mock
|
||||||
@ -325,9 +325,9 @@ const char* UntypedFunctionMockerBase::Name() const {
|
|||||||
// Calculates the result of invoking this mock function with the given
|
// Calculates the result of invoking this mock function with the given
|
||||||
// arguments, prints it, and returns it. The caller is responsible
|
// arguments, prints it, and returns it. The caller is responsible
|
||||||
// for deleting the result.
|
// for deleting the result.
|
||||||
// L < g_gmock_mutex
|
|
||||||
const UntypedActionResultHolderBase*
|
const UntypedActionResultHolderBase*
|
||||||
UntypedFunctionMockerBase::UntypedInvokeWith(const void* const untyped_args) {
|
UntypedFunctionMockerBase::UntypedInvokeWith(const void* const untyped_args)
|
||||||
|
GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
|
||||||
if (untyped_expectations_.size() == 0) {
|
if (untyped_expectations_.size() == 0) {
|
||||||
// No expectation is set on this mock method - we have an
|
// No expectation is set on this mock method - we have an
|
||||||
// uninteresting call.
|
// uninteresting call.
|
||||||
@ -453,8 +453,8 @@ Expectation UntypedFunctionMockerBase::GetHandleOf(ExpectationBase* exp) {
|
|||||||
// Verifies that all expectations on this mock function have been
|
// Verifies that all expectations on this mock function have been
|
||||||
// satisfied. Reports one or more Google Test non-fatal failures
|
// satisfied. Reports one or more Google Test non-fatal failures
|
||||||
// and returns false if not.
|
// and returns false if not.
|
||||||
// L >= g_gmock_mutex
|
bool UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked()
|
||||||
bool UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked() {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
|
||||||
g_gmock_mutex.AssertHeld();
|
g_gmock_mutex.AssertHeld();
|
||||||
bool expectations_met = true;
|
bool expectations_met = true;
|
||||||
for (UntypedExpectations::const_iterator it =
|
for (UntypedExpectations::const_iterator it =
|
||||||
@ -480,7 +480,21 @@ bool UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked() {
|
|||||||
untyped_expectation->line(), ss.str());
|
untyped_expectation->line(), ss.str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
untyped_expectations_.clear();
|
|
||||||
|
// Deleting our expectations may trigger other mock objects to be deleted, for
|
||||||
|
// example if an action contains a reference counted smart pointer to that
|
||||||
|
// mock object, and that is the last reference. So if we delete our
|
||||||
|
// expectations within the context of the global mutex we may deadlock when
|
||||||
|
// this method is called again. Instead, make a copy of the set of
|
||||||
|
// expectations to delete, clear our set within the mutex, and then clear the
|
||||||
|
// copied set outside of it.
|
||||||
|
UntypedExpectations expectations_to_delete;
|
||||||
|
untyped_expectations_.swap(expectations_to_delete);
|
||||||
|
|
||||||
|
g_gmock_mutex.Unlock();
|
||||||
|
expectations_to_delete.clear();
|
||||||
|
g_gmock_mutex.Lock();
|
||||||
|
|
||||||
return expectations_met;
|
return expectations_met;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -565,6 +579,7 @@ class MockObjectRegistry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
StateMap& states() { return states_; }
|
StateMap& states() { return states_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
StateMap states_;
|
StateMap states_;
|
||||||
};
|
};
|
||||||
@ -578,9 +593,9 @@ std::map<const void*, internal::CallReaction> g_uninteresting_call_reaction;
|
|||||||
|
|
||||||
// Sets the reaction Google Mock should have when an uninteresting
|
// Sets the reaction Google Mock should have when an uninteresting
|
||||||
// method of the given mock object is called.
|
// method of the given mock object is called.
|
||||||
// L < g_gmock_mutex
|
|
||||||
void SetReactionOnUninterestingCalls(const void* mock_obj,
|
void SetReactionOnUninterestingCalls(const void* mock_obj,
|
||||||
internal::CallReaction reaction) {
|
internal::CallReaction reaction)
|
||||||
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
|
||||||
internal::MutexLock l(&internal::g_gmock_mutex);
|
internal::MutexLock l(&internal::g_gmock_mutex);
|
||||||
g_uninteresting_call_reaction[mock_obj] = reaction;
|
g_uninteresting_call_reaction[mock_obj] = reaction;
|
||||||
}
|
}
|
||||||
@ -589,38 +604,38 @@ void SetReactionOnUninterestingCalls(const void* mock_obj,
|
|||||||
|
|
||||||
// Tells Google Mock to allow uninteresting calls on the given mock
|
// Tells Google Mock to allow uninteresting calls on the given mock
|
||||||
// object.
|
// object.
|
||||||
// L < g_gmock_mutex
|
void Mock::AllowUninterestingCalls(const void* mock_obj)
|
||||||
void Mock::AllowUninterestingCalls(const void* mock_obj) {
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
|
||||||
SetReactionOnUninterestingCalls(mock_obj, internal::ALLOW);
|
SetReactionOnUninterestingCalls(mock_obj, internal::ALLOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tells Google Mock to warn the user about uninteresting calls on the
|
// Tells Google Mock to warn the user about uninteresting calls on the
|
||||||
// given mock object.
|
// given mock object.
|
||||||
// L < g_gmock_mutex
|
void Mock::WarnUninterestingCalls(const void* mock_obj)
|
||||||
void Mock::WarnUninterestingCalls(const void* mock_obj) {
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
|
||||||
SetReactionOnUninterestingCalls(mock_obj, internal::WARN);
|
SetReactionOnUninterestingCalls(mock_obj, internal::WARN);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tells Google Mock to fail uninteresting calls on the given mock
|
// Tells Google Mock to fail uninteresting calls on the given mock
|
||||||
// object.
|
// object.
|
||||||
// L < g_gmock_mutex
|
void Mock::FailUninterestingCalls(const void* mock_obj)
|
||||||
void Mock::FailUninterestingCalls(const void* mock_obj) {
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
|
||||||
SetReactionOnUninterestingCalls(mock_obj, internal::FAIL);
|
SetReactionOnUninterestingCalls(mock_obj, internal::FAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tells Google Mock the given mock object is being destroyed and its
|
// Tells Google Mock the given mock object is being destroyed and its
|
||||||
// entry in the call-reaction table should be removed.
|
// entry in the call-reaction table should be removed.
|
||||||
// L < g_gmock_mutex
|
void Mock::UnregisterCallReaction(const void* mock_obj)
|
||||||
void Mock::UnregisterCallReaction(const void* mock_obj) {
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
|
||||||
internal::MutexLock l(&internal::g_gmock_mutex);
|
internal::MutexLock l(&internal::g_gmock_mutex);
|
||||||
g_uninteresting_call_reaction.erase(mock_obj);
|
g_uninteresting_call_reaction.erase(mock_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the reaction Google Mock will have on uninteresting calls
|
// Returns the reaction Google Mock will have on uninteresting calls
|
||||||
// made on the given mock object.
|
// made on the given mock object.
|
||||||
// L < g_gmock_mutex
|
|
||||||
internal::CallReaction Mock::GetReactionOnUninterestingCalls(
|
internal::CallReaction Mock::GetReactionOnUninterestingCalls(
|
||||||
const void* mock_obj) {
|
const void* mock_obj)
|
||||||
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
|
||||||
internal::MutexLock l(&internal::g_gmock_mutex);
|
internal::MutexLock l(&internal::g_gmock_mutex);
|
||||||
return (g_uninteresting_call_reaction.count(mock_obj) == 0) ?
|
return (g_uninteresting_call_reaction.count(mock_obj) == 0) ?
|
||||||
internal::WARN : g_uninteresting_call_reaction[mock_obj];
|
internal::WARN : g_uninteresting_call_reaction[mock_obj];
|
||||||
@ -628,8 +643,8 @@ internal::CallReaction Mock::GetReactionOnUninterestingCalls(
|
|||||||
|
|
||||||
// Tells Google Mock to ignore mock_obj when checking for leaked mock
|
// Tells Google Mock to ignore mock_obj when checking for leaked mock
|
||||||
// objects.
|
// objects.
|
||||||
// L < g_gmock_mutex
|
void Mock::AllowLeak(const void* mock_obj)
|
||||||
void Mock::AllowLeak(const void* mock_obj) {
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
|
||||||
internal::MutexLock l(&internal::g_gmock_mutex);
|
internal::MutexLock l(&internal::g_gmock_mutex);
|
||||||
g_mock_object_registry.states()[mock_obj].leakable = true;
|
g_mock_object_registry.states()[mock_obj].leakable = true;
|
||||||
}
|
}
|
||||||
@ -637,8 +652,8 @@ void Mock::AllowLeak(const void* mock_obj) {
|
|||||||
// Verifies and clears all expectations on the given mock object. If
|
// Verifies and clears all expectations on the given mock object. If
|
||||||
// the expectations aren't satisfied, generates one or more Google
|
// the expectations aren't satisfied, generates one or more Google
|
||||||
// Test non-fatal failures and returns false.
|
// Test non-fatal failures and returns false.
|
||||||
// L < g_gmock_mutex
|
bool Mock::VerifyAndClearExpectations(void* mock_obj)
|
||||||
bool Mock::VerifyAndClearExpectations(void* mock_obj) {
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
|
||||||
internal::MutexLock l(&internal::g_gmock_mutex);
|
internal::MutexLock l(&internal::g_gmock_mutex);
|
||||||
return VerifyAndClearExpectationsLocked(mock_obj);
|
return VerifyAndClearExpectationsLocked(mock_obj);
|
||||||
}
|
}
|
||||||
@ -646,8 +661,8 @@ bool Mock::VerifyAndClearExpectations(void* mock_obj) {
|
|||||||
// Verifies all expectations on the given mock object and clears its
|
// Verifies all expectations on the given mock object and clears its
|
||||||
// default actions and expectations. Returns true iff the
|
// default actions and expectations. Returns true iff the
|
||||||
// verification was successful.
|
// verification was successful.
|
||||||
// L < g_gmock_mutex
|
bool Mock::VerifyAndClear(void* mock_obj)
|
||||||
bool Mock::VerifyAndClear(void* mock_obj) {
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
|
||||||
internal::MutexLock l(&internal::g_gmock_mutex);
|
internal::MutexLock l(&internal::g_gmock_mutex);
|
||||||
ClearDefaultActionsLocked(mock_obj);
|
ClearDefaultActionsLocked(mock_obj);
|
||||||
return VerifyAndClearExpectationsLocked(mock_obj);
|
return VerifyAndClearExpectationsLocked(mock_obj);
|
||||||
@ -656,8 +671,8 @@ bool Mock::VerifyAndClear(void* mock_obj) {
|
|||||||
// Verifies and clears all expectations on the given mock object. If
|
// Verifies and clears all expectations on the given mock object. If
|
||||||
// the expectations aren't satisfied, generates one or more Google
|
// the expectations aren't satisfied, generates one or more Google
|
||||||
// Test non-fatal failures and returns false.
|
// Test non-fatal failures and returns false.
|
||||||
// L >= g_gmock_mutex
|
bool Mock::VerifyAndClearExpectationsLocked(void* mock_obj)
|
||||||
bool Mock::VerifyAndClearExpectationsLocked(void* mock_obj) {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex) {
|
||||||
internal::g_gmock_mutex.AssertHeld();
|
internal::g_gmock_mutex.AssertHeld();
|
||||||
if (g_mock_object_registry.states().count(mock_obj) == 0) {
|
if (g_mock_object_registry.states().count(mock_obj) == 0) {
|
||||||
// No EXPECT_CALL() was set on the given mock object.
|
// No EXPECT_CALL() was set on the given mock object.
|
||||||
@ -682,9 +697,9 @@ bool Mock::VerifyAndClearExpectationsLocked(void* mock_obj) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Registers a mock object and a mock method it owns.
|
// Registers a mock object and a mock method it owns.
|
||||||
// L < g_gmock_mutex
|
|
||||||
void Mock::Register(const void* mock_obj,
|
void Mock::Register(const void* mock_obj,
|
||||||
internal::UntypedFunctionMockerBase* mocker) {
|
internal::UntypedFunctionMockerBase* mocker)
|
||||||
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
|
||||||
internal::MutexLock l(&internal::g_gmock_mutex);
|
internal::MutexLock l(&internal::g_gmock_mutex);
|
||||||
g_mock_object_registry.states()[mock_obj].function_mockers.insert(mocker);
|
g_mock_object_registry.states()[mock_obj].function_mockers.insert(mocker);
|
||||||
}
|
}
|
||||||
@ -692,9 +707,9 @@ void Mock::Register(const void* mock_obj,
|
|||||||
// Tells Google Mock where in the source code mock_obj is used in an
|
// Tells Google Mock where in the source code mock_obj is used in an
|
||||||
// ON_CALL or EXPECT_CALL. In case mock_obj is leaked, this
|
// ON_CALL or EXPECT_CALL. In case mock_obj is leaked, this
|
||||||
// information helps the user identify which object it is.
|
// information helps the user identify which object it is.
|
||||||
// L < g_gmock_mutex
|
void Mock::RegisterUseByOnCallOrExpectCall(const void* mock_obj,
|
||||||
void Mock::RegisterUseByOnCallOrExpectCall(
|
const char* file, int line)
|
||||||
const void* mock_obj, const char* file, int line) {
|
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {
|
||||||
internal::MutexLock l(&internal::g_gmock_mutex);
|
internal::MutexLock l(&internal::g_gmock_mutex);
|
||||||
MockObjectState& state = g_mock_object_registry.states()[mock_obj];
|
MockObjectState& state = g_mock_object_registry.states()[mock_obj];
|
||||||
if (state.first_used_file == NULL) {
|
if (state.first_used_file == NULL) {
|
||||||
@ -716,8 +731,8 @@ void Mock::RegisterUseByOnCallOrExpectCall(
|
|||||||
// registry when the last mock method associated with it has been
|
// registry when the last mock method associated with it has been
|
||||||
// unregistered. This is called only in the destructor of
|
// unregistered. This is called only in the destructor of
|
||||||
// FunctionMockerBase.
|
// FunctionMockerBase.
|
||||||
// L >= g_gmock_mutex
|
void Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)
|
||||||
void Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker) {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex) {
|
||||||
internal::g_gmock_mutex.AssertHeld();
|
internal::g_gmock_mutex.AssertHeld();
|
||||||
for (MockObjectRegistry::StateMap::iterator it =
|
for (MockObjectRegistry::StateMap::iterator it =
|
||||||
g_mock_object_registry.states().begin();
|
g_mock_object_registry.states().begin();
|
||||||
@ -734,8 +749,8 @@ void Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Clears all ON_CALL()s set on the given mock object.
|
// Clears all ON_CALL()s set on the given mock object.
|
||||||
// L >= g_gmock_mutex
|
void Mock::ClearDefaultActionsLocked(void* mock_obj)
|
||||||
void Mock::ClearDefaultActionsLocked(void* mock_obj) {
|
GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex) {
|
||||||
internal::g_gmock_mutex.AssertHeld();
|
internal::g_gmock_mutex.AssertHeld();
|
||||||
|
|
||||||
if (g_mock_object_registry.states().count(mock_obj) == 0) {
|
if (g_mock_object_registry.states().count(mock_obj) == 0) {
|
||||||
|
@ -169,13 +169,13 @@ void InitGoogleMockImpl(int* argc, CharType** argv) {
|
|||||||
// Since Google Test is needed for Google Mock to work, this function
|
// Since Google Test is needed for Google Mock to work, this function
|
||||||
// also initializes Google Test and parses its flags, if that hasn't
|
// also initializes Google Test and parses its flags, if that hasn't
|
||||||
// been done.
|
// been done.
|
||||||
void InitGoogleMock(int* argc, char** argv) {
|
GTEST_API_ void InitGoogleMock(int* argc, char** argv) {
|
||||||
internal::InitGoogleMockImpl(argc, argv);
|
internal::InitGoogleMockImpl(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This overloaded version can be used in Windows programs compiled in
|
// This overloaded version can be used in Windows programs compiled in
|
||||||
// UNICODE mode.
|
// UNICODE mode.
|
||||||
void InitGoogleMock(int* argc, wchar_t** argv) {
|
GTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv) {
|
||||||
internal::InitGoogleMockImpl(argc, argv);
|
internal::InitGoogleMockImpl(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,9 +41,9 @@
|
|||||||
#if GTEST_OS_WINDOWS_MOBILE
|
#if GTEST_OS_WINDOWS_MOBILE
|
||||||
# include <tchar.h> // NOLINT
|
# include <tchar.h> // NOLINT
|
||||||
|
|
||||||
int _tmain(int argc, TCHAR** argv) {
|
GTEST_API_ int _tmain(int argc, TCHAR** argv) {
|
||||||
#else
|
#else
|
||||||
int main(int argc, char** argv) {
|
GTEST_API_ int main(int argc, char** argv) {
|
||||||
#endif // GTEST_OS_WINDOWS_MOBILE
|
#endif // GTEST_OS_WINDOWS_MOBILE
|
||||||
std::cout << "Running main() from gmock_main.cc\n";
|
std::cout << "Running main() from gmock_main.cc\n";
|
||||||
// Since Google Mock depends on Google Test, InitGoogleMock() is
|
// Since Google Mock depends on Google Test, InitGoogleMock() is
|
||||||
|
@ -518,7 +518,7 @@ TEST(ReturnTest, IsCovariant) {
|
|||||||
// gmock-actions.h for more information.
|
// gmock-actions.h for more information.
|
||||||
class FromType {
|
class FromType {
|
||||||
public:
|
public:
|
||||||
FromType(bool* is_converted) : converted_(is_converted) {}
|
explicit FromType(bool* is_converted) : converted_(is_converted) {}
|
||||||
bool* converted() const { return converted_; }
|
bool* converted() const { return converted_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -529,7 +529,8 @@ class FromType {
|
|||||||
|
|
||||||
class ToType {
|
class ToType {
|
||||||
public:
|
public:
|
||||||
ToType(const FromType& x) { *x.converted() = true; }
|
// Must allow implicit conversion due to use in ImplicitCast_<T>.
|
||||||
|
ToType(const FromType& x) { *x.converted() = true; } // NOLINT
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST(ReturnTest, ConvertsArgumentWhenConverted) {
|
TEST(ReturnTest, ConvertsArgumentWhenConverted) {
|
||||||
@ -541,7 +542,7 @@ TEST(ReturnTest, ConvertsArgumentWhenConverted) {
|
|||||||
converted = false;
|
converted = false;
|
||||||
action.Perform(tuple<>());
|
action.Perform(tuple<>());
|
||||||
EXPECT_FALSE(converted) << "Action must NOT convert its argument "
|
EXPECT_FALSE(converted) << "Action must NOT convert its argument "
|
||||||
<< "when performed." ;
|
<< "when performed.";
|
||||||
}
|
}
|
||||||
|
|
||||||
class DestinationType {};
|
class DestinationType {};
|
||||||
@ -1226,7 +1227,8 @@ TEST(ByRefTest, IsCopyable) {
|
|||||||
const std::string s1 = "Hi";
|
const std::string s1 = "Hi";
|
||||||
const std::string s2 = "Hello";
|
const std::string s2 = "Hello";
|
||||||
|
|
||||||
::testing::internal::ReferenceWrapper<const std::string> ref_wrapper = ByRef(s1);
|
::testing::internal::ReferenceWrapper<const std::string> ref_wrapper =
|
||||||
|
ByRef(s1);
|
||||||
const std::string& r1 = ref_wrapper;
|
const std::string& r1 = ref_wrapper;
|
||||||
EXPECT_EQ(&s1, &r1);
|
EXPECT_EQ(&s1, &r1);
|
||||||
|
|
||||||
@ -1235,7 +1237,8 @@ TEST(ByRefTest, IsCopyable) {
|
|||||||
const std::string& r2 = ref_wrapper;
|
const std::string& r2 = ref_wrapper;
|
||||||
EXPECT_EQ(&s2, &r2);
|
EXPECT_EQ(&s2, &r2);
|
||||||
|
|
||||||
::testing::internal::ReferenceWrapper<const std::string> ref_wrapper1 = ByRef(s1);
|
::testing::internal::ReferenceWrapper<const std::string> ref_wrapper1 =
|
||||||
|
ByRef(s1);
|
||||||
// Copies ref_wrapper1 to ref_wrapper.
|
// Copies ref_wrapper1 to ref_wrapper.
|
||||||
ref_wrapper = ref_wrapper1;
|
ref_wrapper = ref_wrapper1;
|
||||||
const std::string& r3 = ref_wrapper;
|
const std::string& r3 = ref_wrapper;
|
||||||
|
@ -35,11 +35,6 @@
|
|||||||
|
|
||||||
#include "gmock/gmock-generated-function-mockers.h"
|
#include "gmock/gmock-generated-function-mockers.h"
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
#include "gmock/gmock.h"
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
#if GTEST_OS_WINDOWS
|
#if GTEST_OS_WINDOWS
|
||||||
// MSDN says the header file to be included for STDMETHOD is BaseTyps.h but
|
// MSDN says the header file to be included for STDMETHOD is BaseTyps.h but
|
||||||
// we are getting compiler errors if we use basetyps.h, hence including
|
// we are getting compiler errors if we use basetyps.h, hence including
|
||||||
@ -47,6 +42,11 @@
|
|||||||
# include <objbase.h>
|
# include <objbase.h>
|
||||||
#endif // GTEST_OS_WINDOWS
|
#endif // GTEST_OS_WINDOWS
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
#include "gmock/gmock.h"
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
// There is a bug in MSVC (fixed in VS 2008) that prevents creating a
|
// There is a bug in MSVC (fixed in VS 2008) that prevents creating a
|
||||||
// mock for a function with const arguments, so we don't test such
|
// mock for a function with const arguments, so we don't test such
|
||||||
// cases for MSVC versions older than 2008.
|
// cases for MSVC versions older than 2008.
|
||||||
|
@ -1091,6 +1091,20 @@ TEST(ContainsTest, WorksForTwoDimensionalNativeArray) {
|
|||||||
EXPECT_THAT(a, Contains(Not(Contains(5))));
|
EXPECT_THAT(a, Contains(Not(Contains(5))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(AllOfTest, HugeMatcher) {
|
||||||
|
// Verify that using AllOf with many arguments doesn't cause
|
||||||
|
// the compiler to exceed template instantiation depth limit.
|
||||||
|
EXPECT_THAT(0, testing::AllOf(_, _, _, _, _, _, _, _, _,
|
||||||
|
testing::AllOf(_, _, _, _, _, _, _, _, _, _)));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(AnyOfTest, HugeMatcher) {
|
||||||
|
// Verify that using AnyOf with many arguments doesn't cause
|
||||||
|
// the compiler to exceed template instantiation depth limit.
|
||||||
|
EXPECT_THAT(0, testing::AnyOf(_, _, _, _, _, _, _, _, _,
|
||||||
|
testing::AnyOf(_, _, _, _, _, _, _, _, _, _)));
|
||||||
|
}
|
||||||
|
|
||||||
namespace adl_test {
|
namespace adl_test {
|
||||||
|
|
||||||
// Verifies that the implementation of ::testing::AllOf and ::testing::AnyOf
|
// Verifies that the implementation of ::testing::AllOf and ::testing::AnyOf
|
||||||
|
@ -52,11 +52,13 @@
|
|||||||
namespace testing {
|
namespace testing {
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
string JoinAsTuple(const Strings& fields);
|
GTEST_API_ string JoinAsTuple(const Strings& fields);
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
namespace gmock_matchers_test {
|
namespace gmock_matchers_test {
|
||||||
|
|
||||||
|
using std::greater;
|
||||||
|
using std::less;
|
||||||
using std::list;
|
using std::list;
|
||||||
using std::make_pair;
|
using std::make_pair;
|
||||||
using std::map;
|
using std::map;
|
||||||
@ -118,6 +120,8 @@ using testing::StrNe;
|
|||||||
using testing::Truly;
|
using testing::Truly;
|
||||||
using testing::TypedEq;
|
using testing::TypedEq;
|
||||||
using testing::Value;
|
using testing::Value;
|
||||||
|
using testing::WhenSorted;
|
||||||
|
using testing::WhenSortedBy;
|
||||||
using testing::_;
|
using testing::_;
|
||||||
using testing::internal::DummyMatchResultListener;
|
using testing::internal::DummyMatchResultListener;
|
||||||
using testing::internal::ExplainMatchFailureTupleTo;
|
using testing::internal::ExplainMatchFailureTupleTo;
|
||||||
@ -541,6 +545,37 @@ TEST(MatcherCastTest, FromSameType) {
|
|||||||
EXPECT_FALSE(m2.Matches(1));
|
EXPECT_FALSE(m2.Matches(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Implicitly convertible form any type.
|
||||||
|
struct ConvertibleFromAny {
|
||||||
|
ConvertibleFromAny(int a_value) : value(a_value) {}
|
||||||
|
template <typename T>
|
||||||
|
ConvertibleFromAny(const T& a_value) : value(-1) {
|
||||||
|
ADD_FAILURE() << "Conversion constructor called";
|
||||||
|
}
|
||||||
|
int value;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator==(const ConvertibleFromAny& a, const ConvertibleFromAny& b) {
|
||||||
|
return a.value == b.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
ostream& operator<<(ostream& os, const ConvertibleFromAny& a) {
|
||||||
|
return os << a.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(MatcherCastTest, ConversionConstructorIsUsed) {
|
||||||
|
Matcher<ConvertibleFromAny> m = MatcherCast<ConvertibleFromAny>(1);
|
||||||
|
EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
|
||||||
|
EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(MatcherCastTest, FromConvertibleFromAny) {
|
||||||
|
Matcher<ConvertibleFromAny> m =
|
||||||
|
MatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1)));
|
||||||
|
EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
|
||||||
|
EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
|
||||||
|
}
|
||||||
|
|
||||||
class Base {};
|
class Base {};
|
||||||
class Derived : public Base {};
|
class Derived : public Base {};
|
||||||
|
|
||||||
@ -616,6 +651,19 @@ TEST(SafeMatcherCastTest, FromSameType) {
|
|||||||
EXPECT_FALSE(m2.Matches(1));
|
EXPECT_FALSE(m2.Matches(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(SafeMatcherCastTest, ConversionConstructorIsUsed) {
|
||||||
|
Matcher<ConvertibleFromAny> m = SafeMatcherCast<ConvertibleFromAny>(1);
|
||||||
|
EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
|
||||||
|
EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(SafeMatcherCastTest, FromConvertibleFromAny) {
|
||||||
|
Matcher<ConvertibleFromAny> m =
|
||||||
|
SafeMatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1)));
|
||||||
|
EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
|
||||||
|
EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
|
||||||
|
}
|
||||||
|
|
||||||
// Tests that A<T>() matches any value of type T.
|
// Tests that A<T>() matches any value of type T.
|
||||||
TEST(ATest, MatchesAnyValue) {
|
TEST(ATest, MatchesAnyValue) {
|
||||||
// Tests a matcher for a value type.
|
// Tests a matcher for a value type.
|
||||||
@ -1936,19 +1984,19 @@ TEST(AllOfTest, CanDescribeSelf) {
|
|||||||
|
|
||||||
|
|
||||||
m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
|
m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
|
||||||
EXPECT_EQ("(is > 0) and "
|
EXPECT_EQ("((is > 0) and "
|
||||||
"((isn't equal to 1) and "
|
"(isn't equal to 1)) and "
|
||||||
"((isn't equal to 2) and "
|
"((isn't equal to 2) and "
|
||||||
"(isn't equal to 3)))",
|
"(isn't equal to 3))",
|
||||||
Describe(m));
|
Describe(m));
|
||||||
|
|
||||||
|
|
||||||
m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
|
m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
|
||||||
EXPECT_EQ("(is >= 0) and "
|
EXPECT_EQ("((is >= 0) and "
|
||||||
"((is < 10) and "
|
"(is < 10)) and "
|
||||||
"((isn't equal to 3) and "
|
"((isn't equal to 3) and "
|
||||||
"((isn't equal to 5) and "
|
"((isn't equal to 5) and "
|
||||||
"(isn't equal to 7))))",
|
"(isn't equal to 7)))",
|
||||||
Describe(m));
|
Describe(m));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1968,19 +2016,19 @@ TEST(AllOfTest, CanDescribeNegation) {
|
|||||||
|
|
||||||
|
|
||||||
m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
|
m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
|
||||||
EXPECT_EQ("(isn't > 0) or "
|
EXPECT_EQ("((isn't > 0) or "
|
||||||
"((is equal to 1) or "
|
"(is equal to 1)) or "
|
||||||
"((is equal to 2) or "
|
"((is equal to 2) or "
|
||||||
"(is equal to 3)))",
|
"(is equal to 3))",
|
||||||
DescribeNegation(m));
|
DescribeNegation(m));
|
||||||
|
|
||||||
|
|
||||||
m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
|
m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
|
||||||
EXPECT_EQ("(isn't >= 0) or "
|
EXPECT_EQ("((isn't >= 0) or "
|
||||||
"((isn't < 10) or "
|
"(isn't < 10)) or "
|
||||||
"((is equal to 3) or "
|
"((is equal to 3) or "
|
||||||
"((is equal to 5) or "
|
"((is equal to 5) or "
|
||||||
"(is equal to 7))))",
|
"(is equal to 7)))",
|
||||||
DescribeNegation(m));
|
DescribeNegation(m));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2108,18 +2156,18 @@ TEST(AnyOfTest, CanDescribeSelf) {
|
|||||||
Describe(m));
|
Describe(m));
|
||||||
|
|
||||||
m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
|
m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
|
||||||
EXPECT_EQ("(is < 0) or "
|
EXPECT_EQ("((is < 0) or "
|
||||||
"((is equal to 1) or "
|
"(is equal to 1)) or "
|
||||||
"((is equal to 2) or "
|
"((is equal to 2) or "
|
||||||
"(is equal to 3)))",
|
"(is equal to 3))",
|
||||||
Describe(m));
|
Describe(m));
|
||||||
|
|
||||||
m = AnyOf(Le(0), Gt(10), 3, 5, 7);
|
m = AnyOf(Le(0), Gt(10), 3, 5, 7);
|
||||||
EXPECT_EQ("(is <= 0) or "
|
EXPECT_EQ("((is <= 0) or "
|
||||||
"((is > 10) or "
|
"(is > 10)) or "
|
||||||
"((is equal to 3) or "
|
"((is equal to 3) or "
|
||||||
"((is equal to 5) or "
|
"((is equal to 5) or "
|
||||||
"(is equal to 7))))",
|
"(is equal to 7)))",
|
||||||
Describe(m));
|
Describe(m));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2136,18 +2184,18 @@ TEST(AnyOfTest, CanDescribeNegation) {
|
|||||||
DescribeNegation(m));
|
DescribeNegation(m));
|
||||||
|
|
||||||
m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
|
m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
|
||||||
EXPECT_EQ("(isn't < 0) and "
|
EXPECT_EQ("((isn't < 0) and "
|
||||||
"((isn't equal to 1) and "
|
"(isn't equal to 1)) and "
|
||||||
"((isn't equal to 2) and "
|
"((isn't equal to 2) and "
|
||||||
"(isn't equal to 3)))",
|
"(isn't equal to 3))",
|
||||||
DescribeNegation(m));
|
DescribeNegation(m));
|
||||||
|
|
||||||
m = AnyOf(Le(0), Gt(10), 3, 5, 7);
|
m = AnyOf(Le(0), Gt(10), 3, 5, 7);
|
||||||
EXPECT_EQ("(isn't <= 0) and "
|
EXPECT_EQ("((isn't <= 0) and "
|
||||||
"((isn't > 10) and "
|
"(isn't > 10)) and "
|
||||||
"((isn't equal to 3) and "
|
"((isn't equal to 3) and "
|
||||||
"((isn't equal to 5) and "
|
"((isn't equal to 5) and "
|
||||||
"(isn't equal to 7))))",
|
"(isn't equal to 7)))",
|
||||||
DescribeNegation(m));
|
DescribeNegation(m));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3725,6 +3773,83 @@ TEST(ContainerEqExtraTest, CopiesNativeArrayParameter) {
|
|||||||
EXPECT_THAT(a1, m);
|
EXPECT_THAT(a1, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(WhenSortedByTest, WorksForEmptyContainer) {
|
||||||
|
const vector<int> numbers;
|
||||||
|
EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre()));
|
||||||
|
EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1))));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(WhenSortedByTest, WorksForNonEmptyContainer) {
|
||||||
|
vector<unsigned> numbers;
|
||||||
|
numbers.push_back(3);
|
||||||
|
numbers.push_back(1);
|
||||||
|
numbers.push_back(2);
|
||||||
|
numbers.push_back(2);
|
||||||
|
EXPECT_THAT(numbers, WhenSortedBy(greater<unsigned>(),
|
||||||
|
ElementsAre(3, 2, 2, 1)));
|
||||||
|
EXPECT_THAT(numbers, Not(WhenSortedBy(greater<unsigned>(),
|
||||||
|
ElementsAre(1, 2, 2, 3))));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(WhenSortedByTest, WorksForNonVectorContainer) {
|
||||||
|
list<string> words;
|
||||||
|
words.push_back("say");
|
||||||
|
words.push_back("hello");
|
||||||
|
words.push_back("world");
|
||||||
|
EXPECT_THAT(words, WhenSortedBy(less<string>(),
|
||||||
|
ElementsAre("hello", "say", "world")));
|
||||||
|
EXPECT_THAT(words, Not(WhenSortedBy(less<string>(),
|
||||||
|
ElementsAre("say", "hello", "world"))));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(WhenSortedByTest, WorksForNativeArray) {
|
||||||
|
const int numbers[] = { 1, 3, 2, 4 };
|
||||||
|
const int sorted_numbers[] = { 1, 2, 3, 4 };
|
||||||
|
EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre(1, 2, 3, 4)));
|
||||||
|
EXPECT_THAT(numbers, WhenSortedBy(less<int>(),
|
||||||
|
ElementsAreArray(sorted_numbers)));
|
||||||
|
EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1, 3, 2, 4))));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(WhenSortedByTest, CanDescribeSelf) {
|
||||||
|
const Matcher<vector<int> > m = WhenSortedBy(less<int>(), ElementsAre(1, 2));
|
||||||
|
EXPECT_EQ("(when sorted) has 2 elements where\n"
|
||||||
|
"element #0 is equal to 1,\n"
|
||||||
|
"element #1 is equal to 2",
|
||||||
|
Describe(m));
|
||||||
|
EXPECT_EQ("(when sorted) doesn't have 2 elements, or\n"
|
||||||
|
"element #0 isn't equal to 1, or\n"
|
||||||
|
"element #1 isn't equal to 2",
|
||||||
|
DescribeNegation(m));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(WhenSortedByTest, ExplainsMatchResult) {
|
||||||
|
const int a[] = { 2, 1 };
|
||||||
|
EXPECT_EQ("which is { 1, 2 } when sorted, whose element #0 doesn't match",
|
||||||
|
Explain(WhenSortedBy(less<int>(), ElementsAre(2, 3)), a));
|
||||||
|
EXPECT_EQ("which is { 1, 2 } when sorted",
|
||||||
|
Explain(WhenSortedBy(less<int>(), ElementsAre(1, 2)), a));
|
||||||
|
}
|
||||||
|
|
||||||
|
// WhenSorted() is a simple wrapper on WhenSortedBy(). Hence we don't
|
||||||
|
// need to test it as exhaustively as we test the latter.
|
||||||
|
|
||||||
|
TEST(WhenSortedTest, WorksForEmptyContainer) {
|
||||||
|
const vector<int> numbers;
|
||||||
|
EXPECT_THAT(numbers, WhenSorted(ElementsAre()));
|
||||||
|
EXPECT_THAT(numbers, Not(WhenSorted(ElementsAre(1))));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(WhenSortedTest, WorksForNonEmptyContainer) {
|
||||||
|
list<string> words;
|
||||||
|
words.push_back("3");
|
||||||
|
words.push_back("1");
|
||||||
|
words.push_back("2");
|
||||||
|
words.push_back("2");
|
||||||
|
EXPECT_THAT(words, WhenSorted(ElementsAre("1", "2", "2", "3")));
|
||||||
|
EXPECT_THAT(words, Not(WhenSorted(ElementsAre("3", "1", "2", "2"))));
|
||||||
|
}
|
||||||
|
|
||||||
// Tests IsReadableTypeName().
|
// Tests IsReadableTypeName().
|
||||||
|
|
||||||
TEST(IsReadableTypeNameTest, ReturnsTrueForShortNames) {
|
TEST(IsReadableTypeNameTest, ReturnsTrueForShortNames) {
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user