Remove the cruft
This commit is contained in:
		
							parent
							
								
									0b321237b6
								
							
						
					
					
						commit
						fe0ebd6cff
					
				
					 141 changed files with 0 additions and 109176 deletions
				
			
		| 
						 | 
				
			
			@ -1,252 +0,0 @@
 | 
			
		|||
########################################################################
 | 
			
		||||
# CMake build script for Google Test.
 | 
			
		||||
#
 | 
			
		||||
# To run the tests for Google Test itself on Linux, use 'make test' or
 | 
			
		||||
# ctest.  You can select which tests to run using 'ctest -R regex'.
 | 
			
		||||
# For more options, run 'ctest --help'.
 | 
			
		||||
 | 
			
		||||
# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to
 | 
			
		||||
# make it prominent in the GUI.
 | 
			
		||||
option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)
 | 
			
		||||
 | 
			
		||||
# When other libraries are using a shared version of runtime libraries,
 | 
			
		||||
# Google Test also has to use one.
 | 
			
		||||
option(
 | 
			
		||||
  gtest_force_shared_crt
 | 
			
		||||
  "Use shared (DLL) run-time lib even when Google Test is built as static lib."
 | 
			
		||||
  OFF)
 | 
			
		||||
 | 
			
		||||
option(gtest_build_tests "Build all of gtest's own tests." OFF)
 | 
			
		||||
 | 
			
		||||
option(gtest_build_samples "Build gtest's sample programs." OFF)
 | 
			
		||||
 | 
			
		||||
option(gtest_disable_pthreads "Disable uses of pthreads in gtest." OFF)
 | 
			
		||||
 | 
			
		||||
# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build().
 | 
			
		||||
include(cmake/hermetic_build.cmake OPTIONAL)
 | 
			
		||||
 | 
			
		||||
if (COMMAND pre_project_set_up_hermetic_build)
 | 
			
		||||
  pre_project_set_up_hermetic_build()
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
########################################################################
 | 
			
		||||
#
 | 
			
		||||
# Project-wide settings
 | 
			
		||||
 | 
			
		||||
# Name of the project.
 | 
			
		||||
#
 | 
			
		||||
# CMake files in this project can refer to the root source directory
 | 
			
		||||
# as ${gtest_SOURCE_DIR} and to the root binary directory as
 | 
			
		||||
# ${gtest_BINARY_DIR}.
 | 
			
		||||
# Language "C" is required for find_package(Threads).
 | 
			
		||||
project(gtest CXX C)
 | 
			
		||||
cmake_minimum_required(VERSION 2.6.2)
 | 
			
		||||
 | 
			
		||||
if (COMMAND set_up_hermetic_build)
 | 
			
		||||
  set_up_hermetic_build()
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
# Define helper functions and macros used by Google Test.
 | 
			
		||||
include(cmake/internal_utils.cmake)
 | 
			
		||||
 | 
			
		||||
config_compiler_and_linker()  # Defined in internal_utils.cmake.
 | 
			
		||||
 | 
			
		||||
# Where Google Test's .h files can be found.
 | 
			
		||||
include_directories(
 | 
			
		||||
  ${gtest_SOURCE_DIR}/include
 | 
			
		||||
  ${gtest_SOURCE_DIR})
 | 
			
		||||
 | 
			
		||||
# Where Google Test's libraries can be found.
 | 
			
		||||
link_directories(${gtest_BINARY_DIR}/src)
 | 
			
		||||
 | 
			
		||||
########################################################################
 | 
			
		||||
#
 | 
			
		||||
# Defines the gtest & gtest_main libraries.  User tests should link
 | 
			
		||||
# with one of them.
 | 
			
		||||
 | 
			
		||||
# Google Test libraries.  We build them using more strict warnings than what
 | 
			
		||||
# are used for other targets, to ensure that gtest can be compiled by a user
 | 
			
		||||
# aggressive about warnings.
 | 
			
		||||
cxx_library(gtest "${cxx_strict}" src/gtest-all.cc)
 | 
			
		||||
cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc)
 | 
			
		||||
target_link_libraries(gtest_main gtest)
 | 
			
		||||
 | 
			
		||||
########################################################################
 | 
			
		||||
#
 | 
			
		||||
# Samples on how to link user tests with gtest or gtest_main.
 | 
			
		||||
#
 | 
			
		||||
# They are not built by default.  To build them, set the
 | 
			
		||||
# gtest_build_samples option to ON.  You can do it by running ccmake
 | 
			
		||||
# or specifying the -Dgtest_build_samples=ON flag when running cmake.
 | 
			
		||||
 | 
			
		||||
if (gtest_build_samples)
 | 
			
		||||
  cxx_executable(sample1_unittest samples gtest_main samples/sample1.cc)
 | 
			
		||||
  cxx_executable(sample2_unittest samples gtest_main samples/sample2.cc)
 | 
			
		||||
  cxx_executable(sample3_unittest samples gtest_main)
 | 
			
		||||
  cxx_executable(sample4_unittest samples gtest_main samples/sample4.cc)
 | 
			
		||||
  cxx_executable(sample5_unittest samples gtest_main samples/sample1.cc)
 | 
			
		||||
  cxx_executable(sample6_unittest samples gtest_main)
 | 
			
		||||
  cxx_executable(sample7_unittest samples gtest_main)
 | 
			
		||||
  cxx_executable(sample8_unittest samples gtest_main)
 | 
			
		||||
  cxx_executable(sample9_unittest samples gtest)
 | 
			
		||||
  cxx_executable(sample10_unittest samples gtest)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
########################################################################
 | 
			
		||||
#
 | 
			
		||||
# Google Test's own tests.
 | 
			
		||||
#
 | 
			
		||||
# You can skip this section if you aren't interested in testing
 | 
			
		||||
# Google Test itself.
 | 
			
		||||
#
 | 
			
		||||
# The tests are not built by default.  To build them, set the
 | 
			
		||||
# gtest_build_tests option to ON.  You can do it by running ccmake
 | 
			
		||||
# or specifying the -Dgtest_build_tests=ON flag when running cmake.
 | 
			
		||||
 | 
			
		||||
if (gtest_build_tests)
 | 
			
		||||
  # This must be set in the root directory for the tests to be run by
 | 
			
		||||
  # 'make test' or ctest.
 | 
			
		||||
  enable_testing()
 | 
			
		||||
 | 
			
		||||
  ############################################################
 | 
			
		||||
  # C++ tests built with standard compiler flags.
 | 
			
		||||
 | 
			
		||||
  cxx_test(gtest-death-test_test gtest_main)
 | 
			
		||||
  cxx_test(gtest_environment_test gtest)
 | 
			
		||||
  cxx_test(gtest-filepath_test gtest_main)
 | 
			
		||||
  cxx_test(gtest-linked_ptr_test gtest_main)
 | 
			
		||||
  cxx_test(gtest-listener_test gtest_main)
 | 
			
		||||
  cxx_test(gtest_main_unittest gtest_main)
 | 
			
		||||
  cxx_test(gtest-message_test gtest_main)
 | 
			
		||||
  cxx_test(gtest_no_test_unittest gtest)
 | 
			
		||||
  cxx_test(gtest-options_test gtest_main)
 | 
			
		||||
  cxx_test(gtest-param-test_test gtest
 | 
			
		||||
    test/gtest-param-test2_test.cc)
 | 
			
		||||
  cxx_test(gtest-port_test gtest_main)
 | 
			
		||||
  cxx_test(gtest_pred_impl_unittest gtest_main)
 | 
			
		||||
  cxx_test(gtest_premature_exit_test gtest
 | 
			
		||||
    test/gtest_premature_exit_test.cc)
 | 
			
		||||
  cxx_test(gtest-printers_test gtest_main)
 | 
			
		||||
  cxx_test(gtest_prod_test gtest_main
 | 
			
		||||
    test/production.cc)
 | 
			
		||||
  cxx_test(gtest_repeat_test gtest)
 | 
			
		||||
  cxx_test(gtest_sole_header_test gtest_main)
 | 
			
		||||
  cxx_test(gtest_stress_test gtest)
 | 
			
		||||
  cxx_test(gtest-test-part_test gtest_main)
 | 
			
		||||
  cxx_test(gtest_throw_on_failure_ex_test gtest)
 | 
			
		||||
  cxx_test(gtest-typed-test_test gtest_main
 | 
			
		||||
    test/gtest-typed-test2_test.cc)
 | 
			
		||||
  cxx_test(gtest_unittest gtest_main)
 | 
			
		||||
  cxx_test(gtest-unittest-api_test gtest)
 | 
			
		||||
 | 
			
		||||
  ############################################################
 | 
			
		||||
  # 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}"
 | 
			
		||||
      src/gtest-all.cc)
 | 
			
		||||
    cxx_library(gtest_main_no_exception "${cxx_no_exception}"
 | 
			
		||||
      src/gtest-all.cc src/gtest_main.cc)
 | 
			
		||||
  endif()
 | 
			
		||||
  cxx_library(gtest_main_no_rtti "${cxx_no_rtti}"
 | 
			
		||||
    src/gtest-all.cc src/gtest_main.cc)
 | 
			
		||||
 | 
			
		||||
  cxx_test_with_flags(gtest-death-test_ex_nocatch_test
 | 
			
		||||
    "${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=0"
 | 
			
		||||
    gtest test/gtest-death-test_ex_test.cc)
 | 
			
		||||
  cxx_test_with_flags(gtest-death-test_ex_catch_test
 | 
			
		||||
    "${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=1"
 | 
			
		||||
    gtest test/gtest-death-test_ex_test.cc)
 | 
			
		||||
 | 
			
		||||
  cxx_test_with_flags(gtest_no_rtti_unittest "${cxx_no_rtti}"
 | 
			
		||||
    gtest_main_no_rtti test/gtest_unittest.cc)
 | 
			
		||||
 | 
			
		||||
  cxx_shared_library(gtest_dll "${cxx_default}"
 | 
			
		||||
    src/gtest-all.cc src/gtest_main.cc)
 | 
			
		||||
 | 
			
		||||
  cxx_executable_with_flags(gtest_dll_test_ "${cxx_default}"
 | 
			
		||||
    gtest_dll test/gtest_all_test.cc)
 | 
			
		||||
  set_target_properties(gtest_dll_test_
 | 
			
		||||
                        PROPERTIES
 | 
			
		||||
                        COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
 | 
			
		||||
 | 
			
		||||
  if (NOT MSVC OR NOT MSVC_VERSION EQUAL 1600)
 | 
			
		||||
    # The C++ Standard specifies tuple_element<int, class>.
 | 
			
		||||
    # Yet MSVC 10's <utility> declares tuple_element<size_t, class>.
 | 
			
		||||
    # That declaration conflicts with our own standard-conforming
 | 
			
		||||
    # tuple implementation.  Therefore using our own tuple with
 | 
			
		||||
    # MSVC 10 doesn't compile.
 | 
			
		||||
    cxx_library(gtest_main_use_own_tuple "${cxx_use_own_tuple}"
 | 
			
		||||
      src/gtest-all.cc src/gtest_main.cc)
 | 
			
		||||
 | 
			
		||||
    cxx_test_with_flags(gtest-tuple_test "${cxx_use_own_tuple}"
 | 
			
		||||
      gtest_main_use_own_tuple test/gtest-tuple_test.cc)
 | 
			
		||||
 | 
			
		||||
    cxx_test_with_flags(gtest_use_own_tuple_test "${cxx_use_own_tuple}"
 | 
			
		||||
      gtest_main_use_own_tuple
 | 
			
		||||
      test/gtest-param-test_test.cc test/gtest-param-test2_test.cc)
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  ############################################################
 | 
			
		||||
  # Python tests.
 | 
			
		||||
 | 
			
		||||
  cxx_executable(gtest_break_on_failure_unittest_ test gtest)
 | 
			
		||||
  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(
 | 
			
		||||
      gtest_catch_exceptions_no_ex_test_
 | 
			
		||||
      "${cxx_no_exception}"
 | 
			
		||||
      gtest_main_no_exception
 | 
			
		||||
      test/gtest_catch_exceptions_test_.cc)
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  cxx_executable_with_flags(
 | 
			
		||||
    gtest_catch_exceptions_ex_test_
 | 
			
		||||
    "${cxx_exception}"
 | 
			
		||||
    gtest_main
 | 
			
		||||
    test/gtest_catch_exceptions_test_.cc)
 | 
			
		||||
  py_test(gtest_catch_exceptions_test)
 | 
			
		||||
 | 
			
		||||
  cxx_executable(gtest_color_test_ test gtest)
 | 
			
		||||
  py_test(gtest_color_test)
 | 
			
		||||
 | 
			
		||||
  cxx_executable(gtest_env_var_test_ test gtest)
 | 
			
		||||
  py_test(gtest_env_var_test)
 | 
			
		||||
 | 
			
		||||
  cxx_executable(gtest_filter_unittest_ test gtest)
 | 
			
		||||
  py_test(gtest_filter_unittest)
 | 
			
		||||
 | 
			
		||||
  cxx_executable(gtest_help_test_ test gtest_main)
 | 
			
		||||
  py_test(gtest_help_test)
 | 
			
		||||
 | 
			
		||||
  cxx_executable(gtest_list_tests_unittest_ test gtest)
 | 
			
		||||
  py_test(gtest_list_tests_unittest)
 | 
			
		||||
 | 
			
		||||
  cxx_executable(gtest_output_test_ test gtest)
 | 
			
		||||
  py_test(gtest_output_test)
 | 
			
		||||
 | 
			
		||||
  cxx_executable(gtest_shuffle_test_ test gtest)
 | 
			
		||||
  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)
 | 
			
		||||
    set_target_properties(gtest_throw_on_failure_test_
 | 
			
		||||
      PROPERTIES
 | 
			
		||||
      COMPILE_FLAGS "${cxx_no_exception}")
 | 
			
		||||
    py_test(gtest_throw_on_failure_test)
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  cxx_executable(gtest_uninitialized_test_ test gtest)
 | 
			
		||||
  py_test(gtest_uninitialized_test)
 | 
			
		||||
 | 
			
		||||
  cxx_executable(gtest_xml_outfile1_test_ test gtest_main)
 | 
			
		||||
  cxx_executable(gtest_xml_outfile2_test_ test gtest_main)
 | 
			
		||||
  py_test(gtest_xml_outfiles_test)
 | 
			
		||||
 | 
			
		||||
  cxx_executable(gtest_xml_output_unittest_ test gtest)
 | 
			
		||||
  py_test(gtest_xml_output_unittest)
 | 
			
		||||
endif()
 | 
			
		||||
| 
						 | 
				
			
			@ -1,306 +0,0 @@
 | 
			
		|||
# Automake file
 | 
			
		||||
 | 
			
		||||
ACLOCAL_AMFLAGS = -I m4
 | 
			
		||||
 | 
			
		||||
# Nonstandard package files for distribution
 | 
			
		||||
EXTRA_DIST = \
 | 
			
		||||
  CHANGES \
 | 
			
		||||
  CONTRIBUTORS \
 | 
			
		||||
  LICENSE \
 | 
			
		||||
  include/gtest/gtest-param-test.h.pump \
 | 
			
		||||
  include/gtest/internal/gtest-param-util-generated.h.pump \
 | 
			
		||||
  include/gtest/internal/gtest-tuple.h.pump \
 | 
			
		||||
  include/gtest/internal/gtest-type-util.h.pump \
 | 
			
		||||
  make/Makefile \
 | 
			
		||||
  scripts/fuse_gtest_files.py \
 | 
			
		||||
  scripts/gen_gtest_pred_impl.py \
 | 
			
		||||
  scripts/pump.py \
 | 
			
		||||
  scripts/test/Makefile
 | 
			
		||||
 | 
			
		||||
# gtest source files that we don't compile directly.  They are
 | 
			
		||||
# #included by gtest-all.cc.
 | 
			
		||||
GTEST_SRC = \
 | 
			
		||||
  src/gtest-death-test.cc \
 | 
			
		||||
  src/gtest-filepath.cc \
 | 
			
		||||
  src/gtest-internal-inl.h \
 | 
			
		||||
  src/gtest-port.cc \
 | 
			
		||||
  src/gtest-printers.cc \
 | 
			
		||||
  src/gtest-test-part.cc \
 | 
			
		||||
  src/gtest-typed-test.cc \
 | 
			
		||||
  src/gtest.cc
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST += $(GTEST_SRC)
 | 
			
		||||
 | 
			
		||||
# Sample files that we don't compile.
 | 
			
		||||
EXTRA_DIST += \
 | 
			
		||||
  samples/prime_tables.h \
 | 
			
		||||
  samples/sample2_unittest.cc \
 | 
			
		||||
  samples/sample3_unittest.cc \
 | 
			
		||||
  samples/sample4_unittest.cc \
 | 
			
		||||
  samples/sample5_unittest.cc \
 | 
			
		||||
  samples/sample6_unittest.cc \
 | 
			
		||||
  samples/sample7_unittest.cc \
 | 
			
		||||
  samples/sample8_unittest.cc \
 | 
			
		||||
  samples/sample9_unittest.cc
 | 
			
		||||
 | 
			
		||||
# C++ test files that we don't compile directly.
 | 
			
		||||
EXTRA_DIST += \
 | 
			
		||||
  test/gtest-death-test_ex_test.cc \
 | 
			
		||||
  test/gtest-death-test_test.cc \
 | 
			
		||||
  test/gtest-filepath_test.cc \
 | 
			
		||||
  test/gtest-linked_ptr_test.cc \
 | 
			
		||||
  test/gtest-listener_test.cc \
 | 
			
		||||
  test/gtest-message_test.cc \
 | 
			
		||||
  test/gtest-options_test.cc \
 | 
			
		||||
  test/gtest-param-test2_test.cc \
 | 
			
		||||
  test/gtest-param-test2_test.cc \
 | 
			
		||||
  test/gtest-param-test_test.cc \
 | 
			
		||||
  test/gtest-param-test_test.cc \
 | 
			
		||||
  test/gtest-param-test_test.h \
 | 
			
		||||
  test/gtest-port_test.cc \
 | 
			
		||||
  test/gtest_premature_exit_test.cc \
 | 
			
		||||
  test/gtest-printers_test.cc \
 | 
			
		||||
  test/gtest-test-part_test.cc \
 | 
			
		||||
  test/gtest-tuple_test.cc \
 | 
			
		||||
  test/gtest-typed-test2_test.cc \
 | 
			
		||||
  test/gtest-typed-test_test.cc \
 | 
			
		||||
  test/gtest-typed-test_test.h \
 | 
			
		||||
  test/gtest-unittest-api_test.cc \
 | 
			
		||||
  test/gtest_break_on_failure_unittest_.cc \
 | 
			
		||||
  test/gtest_catch_exceptions_test_.cc \
 | 
			
		||||
  test/gtest_color_test_.cc \
 | 
			
		||||
  test/gtest_env_var_test_.cc \
 | 
			
		||||
  test/gtest_environment_test.cc \
 | 
			
		||||
  test/gtest_filter_unittest_.cc \
 | 
			
		||||
  test/gtest_help_test_.cc \
 | 
			
		||||
  test/gtest_list_tests_unittest_.cc \
 | 
			
		||||
  test/gtest_main_unittest.cc \
 | 
			
		||||
  test/gtest_no_test_unittest.cc \
 | 
			
		||||
  test/gtest_output_test_.cc \
 | 
			
		||||
  test/gtest_pred_impl_unittest.cc \
 | 
			
		||||
  test/gtest_prod_test.cc \
 | 
			
		||||
  test/gtest_repeat_test.cc \
 | 
			
		||||
  test/gtest_shuffle_test_.cc \
 | 
			
		||||
  test/gtest_sole_header_test.cc \
 | 
			
		||||
  test/gtest_stress_test.cc \
 | 
			
		||||
  test/gtest_throw_on_failure_ex_test.cc \
 | 
			
		||||
  test/gtest_throw_on_failure_test_.cc \
 | 
			
		||||
  test/gtest_uninitialized_test_.cc \
 | 
			
		||||
  test/gtest_unittest.cc \
 | 
			
		||||
  test/gtest_unittest.cc \
 | 
			
		||||
  test/gtest_xml_outfile1_test_.cc \
 | 
			
		||||
  test/gtest_xml_outfile2_test_.cc \
 | 
			
		||||
  test/gtest_xml_output_unittest_.cc \
 | 
			
		||||
  test/production.cc \
 | 
			
		||||
  test/production.h
 | 
			
		||||
 | 
			
		||||
# Python tests that we don't run.
 | 
			
		||||
EXTRA_DIST += \
 | 
			
		||||
  test/gtest_break_on_failure_unittest.py \
 | 
			
		||||
  test/gtest_catch_exceptions_test.py \
 | 
			
		||||
  test/gtest_color_test.py \
 | 
			
		||||
  test/gtest_env_var_test.py \
 | 
			
		||||
  test/gtest_filter_unittest.py \
 | 
			
		||||
  test/gtest_help_test.py \
 | 
			
		||||
  test/gtest_list_tests_unittest.py \
 | 
			
		||||
  test/gtest_output_test.py \
 | 
			
		||||
  test/gtest_output_test_golden_lin.txt \
 | 
			
		||||
  test/gtest_shuffle_test.py \
 | 
			
		||||
  test/gtest_test_utils.py \
 | 
			
		||||
  test/gtest_throw_on_failure_test.py \
 | 
			
		||||
  test/gtest_uninitialized_test.py \
 | 
			
		||||
  test/gtest_xml_outfiles_test.py \
 | 
			
		||||
  test/gtest_xml_output_unittest.py \
 | 
			
		||||
  test/gtest_xml_test_utils.py
 | 
			
		||||
 | 
			
		||||
# CMake script
 | 
			
		||||
EXTRA_DIST += \
 | 
			
		||||
  CMakeLists.txt \
 | 
			
		||||
  cmake/internal_utils.cmake
 | 
			
		||||
 | 
			
		||||
# MSVC project files
 | 
			
		||||
EXTRA_DIST += \
 | 
			
		||||
  msvc/gtest-md.sln \
 | 
			
		||||
  msvc/gtest-md.vcproj \
 | 
			
		||||
  msvc/gtest.sln \
 | 
			
		||||
  msvc/gtest.vcproj \
 | 
			
		||||
  msvc/gtest_main-md.vcproj \
 | 
			
		||||
  msvc/gtest_main.vcproj \
 | 
			
		||||
  msvc/gtest_prod_test-md.vcproj \
 | 
			
		||||
  msvc/gtest_prod_test.vcproj \
 | 
			
		||||
  msvc/gtest_unittest-md.vcproj \
 | 
			
		||||
  msvc/gtest_unittest.vcproj
 | 
			
		||||
 | 
			
		||||
# xcode project files
 | 
			
		||||
EXTRA_DIST += \
 | 
			
		||||
  xcode/Config/DebugProject.xcconfig \
 | 
			
		||||
  xcode/Config/FrameworkTarget.xcconfig \
 | 
			
		||||
  xcode/Config/General.xcconfig \
 | 
			
		||||
  xcode/Config/ReleaseProject.xcconfig \
 | 
			
		||||
  xcode/Config/StaticLibraryTarget.xcconfig \
 | 
			
		||||
  xcode/Config/TestTarget.xcconfig \
 | 
			
		||||
  xcode/Resources/Info.plist \
 | 
			
		||||
  xcode/Scripts/runtests.sh \
 | 
			
		||||
  xcode/Scripts/versiongenerate.py \
 | 
			
		||||
  xcode/gtest.xcodeproj/project.pbxproj
 | 
			
		||||
 | 
			
		||||
# xcode sample files
 | 
			
		||||
EXTRA_DIST += \
 | 
			
		||||
  xcode/Samples/FrameworkSample/Info.plist \
 | 
			
		||||
  xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj \
 | 
			
		||||
  xcode/Samples/FrameworkSample/runtests.sh \
 | 
			
		||||
  xcode/Samples/FrameworkSample/widget.cc \
 | 
			
		||||
  xcode/Samples/FrameworkSample/widget.h \
 | 
			
		||||
  xcode/Samples/FrameworkSample/widget_test.cc
 | 
			
		||||
 | 
			
		||||
# C++Builder project files
 | 
			
		||||
EXTRA_DIST += \
 | 
			
		||||
  codegear/gtest.cbproj \
 | 
			
		||||
  codegear/gtest.groupproj \
 | 
			
		||||
  codegear/gtest_all.cc \
 | 
			
		||||
  codegear/gtest_link.cc \
 | 
			
		||||
  codegear/gtest_main.cbproj \
 | 
			
		||||
  codegear/gtest_unittest.cbproj
 | 
			
		||||
 | 
			
		||||
# Distribute and install M4 macro
 | 
			
		||||
m4datadir = $(datadir)/aclocal
 | 
			
		||||
m4data_DATA = m4/gtest.m4
 | 
			
		||||
EXTRA_DIST += $(m4data_DATA)
 | 
			
		||||
 | 
			
		||||
# We define the global AM_CPPFLAGS as everything we compile includes from these
 | 
			
		||||
# directories.
 | 
			
		||||
AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/include
 | 
			
		||||
 | 
			
		||||
# Modifies compiler and linker flags for pthreads compatibility.
 | 
			
		||||
if HAVE_PTHREADS
 | 
			
		||||
  AM_CXXFLAGS = @PTHREAD_CFLAGS@ -DGTEST_HAS_PTHREAD=1
 | 
			
		||||
  AM_LIBS = @PTHREAD_LIBS@
 | 
			
		||||
else
 | 
			
		||||
  AM_CXXFLAGS = -DGTEST_HAS_PTHREAD=0
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# Build rules for libraries.
 | 
			
		||||
lib_LTLIBRARIES = lib/libgtest.la lib/libgtest_main.la
 | 
			
		||||
 | 
			
		||||
lib_libgtest_la_SOURCES = src/gtest-all.cc
 | 
			
		||||
 | 
			
		||||
pkginclude_HEADERS = \
 | 
			
		||||
  include/gtest/gtest-death-test.h \
 | 
			
		||||
  include/gtest/gtest-message.h \
 | 
			
		||||
  include/gtest/gtest-param-test.h \
 | 
			
		||||
  include/gtest/gtest-printers.h \
 | 
			
		||||
  include/gtest/gtest-spi.h \
 | 
			
		||||
  include/gtest/gtest-test-part.h \
 | 
			
		||||
  include/gtest/gtest-typed-test.h \
 | 
			
		||||
  include/gtest/gtest.h \
 | 
			
		||||
  include/gtest/gtest_pred_impl.h \
 | 
			
		||||
  include/gtest/gtest_prod.h
 | 
			
		||||
 | 
			
		||||
pkginclude_internaldir = $(pkgincludedir)/internal
 | 
			
		||||
pkginclude_internal_HEADERS = \
 | 
			
		||||
  include/gtest/internal/gtest-death-test-internal.h \
 | 
			
		||||
  include/gtest/internal/gtest-filepath.h \
 | 
			
		||||
  include/gtest/internal/gtest-internal.h \
 | 
			
		||||
  include/gtest/internal/gtest-linked_ptr.h \
 | 
			
		||||
  include/gtest/internal/gtest-param-util-generated.h \
 | 
			
		||||
  include/gtest/internal/gtest-param-util.h \
 | 
			
		||||
  include/gtest/internal/gtest-port.h \
 | 
			
		||||
  include/gtest/internal/gtest-string.h \
 | 
			
		||||
  include/gtest/internal/gtest-tuple.h \
 | 
			
		||||
  include/gtest/internal/gtest-type-util.h
 | 
			
		||||
 | 
			
		||||
lib_libgtest_main_la_SOURCES = src/gtest_main.cc
 | 
			
		||||
lib_libgtest_main_la_LIBADD = lib/libgtest.la
 | 
			
		||||
 | 
			
		||||
# Bulid rules for samples and tests. Automake's naming for some of
 | 
			
		||||
# these variables isn't terribly obvious, so this is a brief
 | 
			
		||||
# reference:
 | 
			
		||||
#
 | 
			
		||||
# TESTS -- Programs run automatically by "make check"
 | 
			
		||||
# check_PROGRAMS -- Programs built by "make check" but not necessarily run
 | 
			
		||||
 | 
			
		||||
noinst_LTLIBRARIES = samples/libsamples.la
 | 
			
		||||
 | 
			
		||||
samples_libsamples_la_SOURCES = \
 | 
			
		||||
  samples/sample1.cc \
 | 
			
		||||
  samples/sample1.h \
 | 
			
		||||
  samples/sample2.cc \
 | 
			
		||||
  samples/sample2.h \
 | 
			
		||||
  samples/sample3-inl.h \
 | 
			
		||||
  samples/sample4.cc \
 | 
			
		||||
  samples/sample4.h
 | 
			
		||||
 | 
			
		||||
TESTS=
 | 
			
		||||
TESTS_ENVIRONMENT = GTEST_SOURCE_DIR="$(srcdir)/test" \
 | 
			
		||||
                    GTEST_BUILD_DIR="$(top_builddir)/test"
 | 
			
		||||
check_PROGRAMS=
 | 
			
		||||
 | 
			
		||||
# A simple sample on using gtest.
 | 
			
		||||
TESTS += samples/sample1_unittest
 | 
			
		||||
check_PROGRAMS += samples/sample1_unittest
 | 
			
		||||
samples_sample1_unittest_SOURCES = samples/sample1_unittest.cc
 | 
			
		||||
samples_sample1_unittest_LDADD = lib/libgtest_main.la \
 | 
			
		||||
                                 lib/libgtest.la \
 | 
			
		||||
                                 samples/libsamples.la
 | 
			
		||||
 | 
			
		||||
# Another sample.  It also verifies that libgtest works.
 | 
			
		||||
TESTS += samples/sample10_unittest
 | 
			
		||||
check_PROGRAMS += samples/sample10_unittest
 | 
			
		||||
samples_sample10_unittest_SOURCES = samples/sample10_unittest.cc
 | 
			
		||||
samples_sample10_unittest_LDADD = lib/libgtest.la
 | 
			
		||||
 | 
			
		||||
# This tests most constructs of gtest and verifies that libgtest_main
 | 
			
		||||
# and libgtest work.
 | 
			
		||||
TESTS += test/gtest_all_test
 | 
			
		||||
check_PROGRAMS += test/gtest_all_test
 | 
			
		||||
test_gtest_all_test_SOURCES = test/gtest_all_test.cc
 | 
			
		||||
test_gtest_all_test_LDADD = lib/libgtest_main.la \
 | 
			
		||||
                            lib/libgtest.la
 | 
			
		||||
 | 
			
		||||
# Tests that fused gtest files compile and work.
 | 
			
		||||
FUSED_GTEST_SRC = \
 | 
			
		||||
  fused-src/gtest/gtest-all.cc \
 | 
			
		||||
  fused-src/gtest/gtest.h \
 | 
			
		||||
  fused-src/gtest/gtest_main.cc
 | 
			
		||||
 | 
			
		||||
if HAVE_PYTHON
 | 
			
		||||
TESTS += test/fused_gtest_test
 | 
			
		||||
check_PROGRAMS += test/fused_gtest_test
 | 
			
		||||
test_fused_gtest_test_SOURCES = $(FUSED_GTEST_SRC) \
 | 
			
		||||
                                samples/sample1.cc samples/sample1_unittest.cc
 | 
			
		||||
test_fused_gtest_test_CPPFLAGS = -I"$(srcdir)/fused-src"
 | 
			
		||||
 | 
			
		||||
# Build rules for putting fused Google Test files into the distribution
 | 
			
		||||
# package. The user can also create those files by manually running
 | 
			
		||||
# scripts/fuse_gtest_files.py.
 | 
			
		||||
$(test_fused_gtest_test_SOURCES): fused-gtest
 | 
			
		||||
 | 
			
		||||
fused-gtest: $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS) \
 | 
			
		||||
             $(GTEST_SRC) src/gtest-all.cc src/gtest_main.cc \
 | 
			
		||||
             scripts/fuse_gtest_files.py
 | 
			
		||||
	mkdir -p "$(srcdir)/fused-src"
 | 
			
		||||
	chmod -R u+w "$(srcdir)/fused-src"
 | 
			
		||||
	rm -f "$(srcdir)/fused-src/gtest/gtest-all.cc"
 | 
			
		||||
	rm -f "$(srcdir)/fused-src/gtest/gtest.h"
 | 
			
		||||
	"$(srcdir)/scripts/fuse_gtest_files.py" "$(srcdir)/fused-src"
 | 
			
		||||
	cp -f "$(srcdir)/src/gtest_main.cc" "$(srcdir)/fused-src/gtest/"
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
	rm -rf "$(srcdir)/fused-src"
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# Death tests may produce core dumps in the build directory. In case
 | 
			
		||||
# this happens, clean them to keep distcleancheck happy.
 | 
			
		||||
CLEANFILES = core
 | 
			
		||||
 | 
			
		||||
# Disables 'make install' as installing a compiled version of Google
 | 
			
		||||
# Test can lead to undefined behavior due to violation of the
 | 
			
		||||
# One-Definition Rule.
 | 
			
		||||
 | 
			
		||||
install-exec-local:
 | 
			
		||||
	echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
 | 
			
		||||
	false
 | 
			
		||||
 | 
			
		||||
install-data-local:
 | 
			
		||||
	echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
 | 
			
		||||
	false
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										1198
									
								
								lib/gtest/aclocal.m4
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1198
									
								
								lib/gtest/aclocal.m4
									
										
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										1530
									
								
								lib/gtest/build-aux/config.guess
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1530
									
								
								lib/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
 | 
			
		||||
							
								
								
									
										1773
									
								
								lib/gtest/build-aux/config.sub
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1773
									
								
								lib/gtest/build-aux/config.sub
									
										
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -1,688 +0,0 @@
 | 
			
		|||
#! /bin/sh
 | 
			
		||||
# depcomp - compile a program generating dependencies as side-effects
 | 
			
		||||
 | 
			
		||||
scriptversion=2011-12-04.11; # UTC
 | 
			
		||||
 | 
			
		||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
 | 
			
		||||
# 2011 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 outputting 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
 | 
			
		||||
 | 
			
		||||
if test "$depmode" = msvc7msys; then
 | 
			
		||||
   # This is just like msvc7 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=msvc7
 | 
			
		||||
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.  hp depmode also adds that space, but also prefixes the VPATH
 | 
			
		||||
## to the object.  Take care to not repeat it in the output.
 | 
			
		||||
## 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 "s|.*$object$||" -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"
 | 
			
		||||
   ;;
 | 
			
		||||
 | 
			
		||||
msvc7)
 | 
			
		||||
  if test "$libtool" = yes; then
 | 
			
		||||
    showIncludes=-Wc,-showIncludes
 | 
			
		||||
  else
 | 
			
		||||
    showIncludes=-showIncludes
 | 
			
		||||
  fi
 | 
			
		||||
  "$@" $showIncludes > "$tmpdepfile"
 | 
			
		||||
  stat=$?
 | 
			
		||||
  grep -v '^Note: including file: ' "$tmpdepfile"
 | 
			
		||||
  if test "$stat" = 0; then :
 | 
			
		||||
  else
 | 
			
		||||
    rm -f "$tmpdepfile"
 | 
			
		||||
    exit $stat
 | 
			
		||||
  fi
 | 
			
		||||
  rm -f "$depfile"
 | 
			
		||||
  echo "$object : \\" > "$depfile"
 | 
			
		||||
  # The first sed program below extracts the file names and escapes
 | 
			
		||||
  # backslashes for cygpath.  The second sed program outputs the file
 | 
			
		||||
  # name when reading, but also accumulates all include files in the
 | 
			
		||||
  # hold buffer in order to output them again at the end.  This only
 | 
			
		||||
  # works with sed implementations that can handle large buffers.
 | 
			
		||||
  sed < "$tmpdepfile" -n '
 | 
			
		||||
/^Note: including file:  *\(.*\)/ {
 | 
			
		||||
  s//\1/
 | 
			
		||||
  s/\\/\\\\/g
 | 
			
		||||
  p
 | 
			
		||||
}' | $cygpath_u | sort -u | sed -n '
 | 
			
		||||
s/ /\\ /g
 | 
			
		||||
s/\(.*\)/	\1 \\/p
 | 
			
		||||
s/.\(.*\) \\/\1:/
 | 
			
		||||
H
 | 
			
		||||
$ {
 | 
			
		||||
  s/.*/	/
 | 
			
		||||
  G
 | 
			
		||||
  p
 | 
			
		||||
}' >> "$depfile"
 | 
			
		||||
  rm -f "$tmpdepfile"
 | 
			
		||||
  ;;
 | 
			
		||||
 | 
			
		||||
msvc7msys)
 | 
			
		||||
  # 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
 | 
			
		||||
  ;;
 | 
			
		||||
 | 
			
		||||
#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"
 | 
			
		||||
  # makedepend may prepend the VPATH from the source file name to the object.
 | 
			
		||||
  # No need to regex-escape $object, excess matching of '.' is harmless.
 | 
			
		||||
  sed "s|^.*\($object *:\)|\1|" "$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,527 +0,0 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
# install - install a program, script, or datafile
 | 
			
		||||
 | 
			
		||||
scriptversion=2011-01-19.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
 | 
			
		||||
	# Protect names problematic for `test' and other utilities.
 | 
			
		||||
	case $dst_arg in
 | 
			
		||||
	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
 | 
			
		||||
	esac
 | 
			
		||||
	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
 | 
			
		||||
    # Protect names problematic for `test' and other utilities.
 | 
			
		||||
    case $dst_arg in
 | 
			
		||||
      -* | [=\(\)!]) dst_arg=./$dst_arg;;
 | 
			
		||||
    esac
 | 
			
		||||
  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
 | 
			
		||||
  do_exit='(exit $ret); exit $ret'
 | 
			
		||||
  trap "ret=129; $do_exit" 1
 | 
			
		||||
  trap "ret=130; $do_exit" 2
 | 
			
		||||
  trap "ret=141; $do_exit" 13
 | 
			
		||||
  trap "ret=143; $do_exit" 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 problematic for `test' and other utilities.
 | 
			
		||||
  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
 | 
			
		||||
 | 
			
		||||
    # 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 X"$d" = X && 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,331 +0,0 @@
 | 
			
		|||
#! /bin/sh
 | 
			
		||||
# Common stub for a few missing GNU programs while installing.
 | 
			
		||||
 | 
			
		||||
scriptversion=2012-01-06.13; # UTC
 | 
			
		||||
 | 
			
		||||
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
 | 
			
		||||
# 2008, 2009, 2010, 2011, 2012 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
 | 
			
		||||
  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.
 | 
			
		||||
    ;;
 | 
			
		||||
 | 
			
		||||
  *)
 | 
			
		||||
    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
 | 
			
		||||
    ;;
 | 
			
		||||
 | 
			
		||||
  *)
 | 
			
		||||
    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:
 | 
			
		||||
| 
						 | 
				
			
			@ -1,227 +0,0 @@
 | 
			
		|||
# Defines functions and macros useful for building Google Test and
 | 
			
		||||
# Google Mock.
 | 
			
		||||
#
 | 
			
		||||
# Note:
 | 
			
		||||
#
 | 
			
		||||
# - This file will be run twice when building Google Mock (once via
 | 
			
		||||
#   Google Test's CMakeLists.txt, and once via Google Mock's).
 | 
			
		||||
#   Therefore it shouldn't have any side effects other than defining
 | 
			
		||||
#   the functions and macros.
 | 
			
		||||
#
 | 
			
		||||
# - The functions/macros defined in this file may depend on Google
 | 
			
		||||
#   Test and Google Mock's option() definitions, and thus must be
 | 
			
		||||
#   called *after* the options have been defined.
 | 
			
		||||
 | 
			
		||||
# Tweaks CMake's default compiler/linker settings to suit Google Test's needs.
 | 
			
		||||
#
 | 
			
		||||
# This must be a macro(), as inside a function string() can only
 | 
			
		||||
# update variables in the function scope.
 | 
			
		||||
macro(fix_default_compiler_settings_)
 | 
			
		||||
  if (MSVC)
 | 
			
		||||
    # For MSVC, CMake sets certain flags to defaults we want to override.
 | 
			
		||||
    # This replacement code is taken from sample in the CMake Wiki at
 | 
			
		||||
    # http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace.
 | 
			
		||||
    foreach (flag_var
 | 
			
		||||
             CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
 | 
			
		||||
             CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
 | 
			
		||||
      if (NOT BUILD_SHARED_LIBS AND NOT gtest_force_shared_crt)
 | 
			
		||||
        # When Google Test is built as a shared library, it should also use
 | 
			
		||||
        # shared runtime libraries.  Otherwise, it may end up with multiple
 | 
			
		||||
        # copies of runtime library data in different modules, resulting in
 | 
			
		||||
        # hard-to-find crashes. When it is built as a static library, it is
 | 
			
		||||
        # preferable to use CRT as static libraries, as we don't have to rely
 | 
			
		||||
        # on CRT DLLs being available. CMake always defaults to using shared
 | 
			
		||||
        # CRT libraries, so we override that default here.
 | 
			
		||||
        string(REPLACE "/MD" "-MT" ${flag_var} "${${flag_var}}")
 | 
			
		||||
      endif()
 | 
			
		||||
 | 
			
		||||
      # We prefer more strict warning checking for building Google Test.
 | 
			
		||||
      # Replaces /W3 with /W4 in defaults.
 | 
			
		||||
      string(REPLACE "/W3" "-W4" ${flag_var} "${${flag_var}}")
 | 
			
		||||
    endforeach()
 | 
			
		||||
  endif()
 | 
			
		||||
endmacro()
 | 
			
		||||
 | 
			
		||||
# Defines the compiler/linker flags used to build Google Test and
 | 
			
		||||
# Google Mock.  You can tweak these definitions to suit your need.  A
 | 
			
		||||
# variable's value is empty before it's explicitly assigned to.
 | 
			
		||||
macro(config_compiler_and_linker)
 | 
			
		||||
  if (NOT gtest_disable_pthreads)
 | 
			
		||||
    # Defines CMAKE_USE_PTHREADS_INIT and CMAKE_THREAD_LIBS_INIT.
 | 
			
		||||
    find_package(Threads)
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  fix_default_compiler_settings_()
 | 
			
		||||
  if (MSVC)
 | 
			
		||||
    # Newlines inside flags variables break CMake's NMake generator.
 | 
			
		||||
    # TODO(vladl@google.com): Add -RTCs and -RTCu to debug builds.
 | 
			
		||||
    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} -DSTRICT -DWIN32_LEAN_AND_MEAN")
 | 
			
		||||
    set(cxx_exception_flags "-EHsc -D_HAS_EXCEPTIONS=1")
 | 
			
		||||
    set(cxx_no_exception_flags "-D_HAS_EXCEPTIONS=0")
 | 
			
		||||
    set(cxx_no_rtti_flags "-GR-")
 | 
			
		||||
  elseif (CMAKE_COMPILER_IS_GNUCXX)
 | 
			
		||||
    set(cxx_base_flags "-Wall -Wshadow")
 | 
			
		||||
    set(cxx_exception_flags "-fexceptions")
 | 
			
		||||
    set(cxx_no_exception_flags "-fno-exceptions")
 | 
			
		||||
    # Until version 4.3.2, GCC doesn't define a macro to indicate
 | 
			
		||||
    # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI
 | 
			
		||||
    # explicitly.
 | 
			
		||||
    set(cxx_no_rtti_flags "-fno-rtti -DGTEST_HAS_RTTI=0")
 | 
			
		||||
    set(cxx_strict_flags
 | 
			
		||||
      "-Wextra -Wno-unused-parameter -Wno-missing-field-initializers")
 | 
			
		||||
  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
 | 
			
		||||
    set(cxx_exception_flags "-features=except")
 | 
			
		||||
    # Sun Pro doesn't provide macros to indicate whether exceptions and
 | 
			
		||||
    # RTTI are enabled, so we define GTEST_HAS_* explicitly.
 | 
			
		||||
    set(cxx_no_exception_flags "-features=no%except -DGTEST_HAS_EXCEPTIONS=0")
 | 
			
		||||
    set(cxx_no_rtti_flags "-features=no%rtti -DGTEST_HAS_RTTI=0")
 | 
			
		||||
  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "VisualAge" OR
 | 
			
		||||
      CMAKE_CXX_COMPILER_ID STREQUAL "XL")
 | 
			
		||||
    # CMake 2.8 changes Visual Age's compiler ID to "XL".
 | 
			
		||||
    set(cxx_exception_flags "-qeh")
 | 
			
		||||
    set(cxx_no_exception_flags "-qnoeh")
 | 
			
		||||
    # Until version 9.0, Visual Age doesn't define a macro to indicate
 | 
			
		||||
    # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI
 | 
			
		||||
    # explicitly.
 | 
			
		||||
    set(cxx_no_rtti_flags "-qnortti -DGTEST_HAS_RTTI=0")
 | 
			
		||||
  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "HP")
 | 
			
		||||
    set(cxx_base_flags "-AA -mt")
 | 
			
		||||
    set(cxx_exception_flags "-DGTEST_HAS_EXCEPTIONS=1")
 | 
			
		||||
    set(cxx_no_exception_flags "+noeh -DGTEST_HAS_EXCEPTIONS=0")
 | 
			
		||||
    # RTTI can not be disabled in HP aCC compiler.
 | 
			
		||||
    set(cxx_no_rtti_flags "")
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if (CMAKE_USE_PTHREADS_INIT)  # The pthreads library is available and allowed.
 | 
			
		||||
    set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=1")
 | 
			
		||||
  else()
 | 
			
		||||
    set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=0")
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  # For building gtest's own tests and samples.
 | 
			
		||||
  set(cxx_exception "${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_exception_flags}")
 | 
			
		||||
  set(cxx_no_exception
 | 
			
		||||
    "${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_no_exception_flags}")
 | 
			
		||||
  set(cxx_default "${cxx_exception}")
 | 
			
		||||
  set(cxx_no_rtti "${cxx_default} ${cxx_no_rtti_flags}")
 | 
			
		||||
  set(cxx_use_own_tuple "${cxx_default} -DGTEST_USE_OWN_TR1_TUPLE=1")
 | 
			
		||||
 | 
			
		||||
  # For building the gtest libraries.
 | 
			
		||||
  set(cxx_strict "${cxx_default} ${cxx_strict_flags}")
 | 
			
		||||
endmacro()
 | 
			
		||||
 | 
			
		||||
# Defines the gtest & gtest_main libraries.  User tests should link
 | 
			
		||||
# with one of them.
 | 
			
		||||
function(cxx_library_with_type name type cxx_flags)
 | 
			
		||||
  # type can be either STATIC or SHARED to denote a static or shared library.
 | 
			
		||||
  # ARGN refers to additional arguments after 'cxx_flags'.
 | 
			
		||||
  add_library(${name} ${type} ${ARGN})
 | 
			
		||||
  set_target_properties(${name}
 | 
			
		||||
    PROPERTIES
 | 
			
		||||
    COMPILE_FLAGS "${cxx_flags}")
 | 
			
		||||
  if (BUILD_SHARED_LIBS OR type STREQUAL "SHARED")
 | 
			
		||||
    set_target_properties(${name}
 | 
			
		||||
      PROPERTIES
 | 
			
		||||
      COMPILE_DEFINITIONS "GTEST_CREATE_SHARED_LIBRARY=1")
 | 
			
		||||
  endif()
 | 
			
		||||
  if (CMAKE_USE_PTHREADS_INIT)
 | 
			
		||||
    target_link_libraries(${name} ${CMAKE_THREAD_LIBS_INIT})
 | 
			
		||||
  endif()
 | 
			
		||||
endfunction()
 | 
			
		||||
 | 
			
		||||
########################################################################
 | 
			
		||||
#
 | 
			
		||||
# Helper functions for creating build targets.
 | 
			
		||||
 | 
			
		||||
function(cxx_shared_library name cxx_flags)
 | 
			
		||||
  cxx_library_with_type(${name} SHARED "${cxx_flags}" ${ARGN})
 | 
			
		||||
endfunction()
 | 
			
		||||
 | 
			
		||||
function(cxx_library name cxx_flags)
 | 
			
		||||
  cxx_library_with_type(${name} "" "${cxx_flags}" ${ARGN})
 | 
			
		||||
endfunction()
 | 
			
		||||
 | 
			
		||||
# cxx_executable_with_flags(name cxx_flags libs srcs...)
 | 
			
		||||
#
 | 
			
		||||
# creates a named C++ executable that depends on the given libraries and
 | 
			
		||||
# is built from the given source files with the given compiler flags.
 | 
			
		||||
function(cxx_executable_with_flags name cxx_flags libs)
 | 
			
		||||
  add_executable(${name} ${ARGN})
 | 
			
		||||
  if (cxx_flags)
 | 
			
		||||
    set_target_properties(${name}
 | 
			
		||||
      PROPERTIES
 | 
			
		||||
      COMPILE_FLAGS "${cxx_flags}")
 | 
			
		||||
  endif()
 | 
			
		||||
  if (BUILD_SHARED_LIBS)
 | 
			
		||||
    set_target_properties(${name}
 | 
			
		||||
      PROPERTIES
 | 
			
		||||
      COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
 | 
			
		||||
  endif()
 | 
			
		||||
  # To support mixing linking in static and dynamic libraries, link each
 | 
			
		||||
  # library in with an extra call to target_link_libraries.
 | 
			
		||||
  foreach (lib "${libs}")
 | 
			
		||||
    target_link_libraries(${name} ${lib})
 | 
			
		||||
  endforeach()
 | 
			
		||||
endfunction()
 | 
			
		||||
 | 
			
		||||
# cxx_executable(name dir lib srcs...)
 | 
			
		||||
#
 | 
			
		||||
# creates a named target that depends on the given libs and is built
 | 
			
		||||
# from the given source files.  dir/name.cc is implicitly included in
 | 
			
		||||
# the source file list.
 | 
			
		||||
function(cxx_executable name dir libs)
 | 
			
		||||
  cxx_executable_with_flags(
 | 
			
		||||
    ${name} "${cxx_default}" "${libs}" "${dir}/${name}.cc" ${ARGN})
 | 
			
		||||
endfunction()
 | 
			
		||||
 | 
			
		||||
# Sets PYTHONINTERP_FOUND and PYTHON_EXECUTABLE.
 | 
			
		||||
find_package(PythonInterp)
 | 
			
		||||
 | 
			
		||||
# cxx_test_with_flags(name cxx_flags libs srcs...)
 | 
			
		||||
#
 | 
			
		||||
# creates a named C++ test that depends on the given libs and is built
 | 
			
		||||
# from the given source files with the given compiler flags.
 | 
			
		||||
function(cxx_test_with_flags name cxx_flags libs)
 | 
			
		||||
  cxx_executable_with_flags(${name} "${cxx_flags}" "${libs}" ${ARGN})
 | 
			
		||||
  add_test(${name} ${name})
 | 
			
		||||
endfunction()
 | 
			
		||||
 | 
			
		||||
# cxx_test(name libs srcs...)
 | 
			
		||||
#
 | 
			
		||||
# creates a named test target that depends on the given libs and is
 | 
			
		||||
# built from the given source files.  Unlike cxx_test_with_flags,
 | 
			
		||||
# test/name.cc is already implicitly included in the source file list.
 | 
			
		||||
function(cxx_test name libs)
 | 
			
		||||
  cxx_test_with_flags("${name}" "${cxx_default}" "${libs}"
 | 
			
		||||
    "test/${name}.cc" ${ARGN})
 | 
			
		||||
endfunction()
 | 
			
		||||
 | 
			
		||||
# py_test(name)
 | 
			
		||||
#
 | 
			
		||||
# creates a Python test with the given name whose main module is in
 | 
			
		||||
# test/name.py.  It does nothing if Python is not installed.
 | 
			
		||||
function(py_test name)
 | 
			
		||||
  # We are not supporting Python tests on Linux yet as they consider
 | 
			
		||||
  # all Linux environments to be google3 and try to use google3 features.
 | 
			
		||||
  if (PYTHONINTERP_FOUND)
 | 
			
		||||
    # ${CMAKE_BINARY_DIR} is known at configuration time, so we can
 | 
			
		||||
    # directly bind it from cmake. ${CTEST_CONFIGURATION_TYPE} is known
 | 
			
		||||
    # only at ctest runtime (by calling ctest -c <Configuration>), so
 | 
			
		||||
    # we have to escape $ to delay variable substitution here.
 | 
			
		||||
    add_test(${name}
 | 
			
		||||
      ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py
 | 
			
		||||
          --build_dir=${CMAKE_CURRENT_BINARY_DIR}/\${CTEST_CONFIGURATION_TYPE})
 | 
			
		||||
  endif()
 | 
			
		||||
endfunction()
 | 
			
		||||
| 
						 | 
				
			
			@ -1,138 +0,0 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>
 | 
			
		||||
    <Config Condition="'$(Config)'==''">Release</Config>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
 | 
			
		||||
    <Base>true</Base>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
 | 
			
		||||
    <Base>true</Base>
 | 
			
		||||
    <Cfg_1>true</Cfg_1>
 | 
			
		||||
    <CfgParent>Base</CfgParent>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
 | 
			
		||||
    <Base>true</Base>
 | 
			
		||||
    <Cfg_2>true</Cfg_2>
 | 
			
		||||
    <CfgParent>Base</CfgParent>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Base)'!=''">
 | 
			
		||||
    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
 | 
			
		||||
    <OutputExt>lib</OutputExt>
 | 
			
		||||
    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
 | 
			
		||||
    <Defines>NO_STRICT</Defines>
 | 
			
		||||
    <DynamicRTL>true</DynamicRTL>
 | 
			
		||||
    <UsePackages>true</UsePackages>
 | 
			
		||||
    <ProjectType>CppStaticLibrary</ProjectType>
 | 
			
		||||
    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
 | 
			
		||||
    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi</PackageImports>
 | 
			
		||||
    <BCC_wpar>false</BCC_wpar>
 | 
			
		||||
    <IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</IncludePath>
 | 
			
		||||
    <AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>
 | 
			
		||||
    <TLIB_PageSize>32</TLIB_PageSize>
 | 
			
		||||
    <ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Cfg_1)'!=''">
 | 
			
		||||
    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
 | 
			
		||||
    <DCC_Optimize>false</DCC_Optimize>
 | 
			
		||||
    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
 | 
			
		||||
    <Defines>_DEBUG;$(Defines)</Defines>
 | 
			
		||||
    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
 | 
			
		||||
    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
 | 
			
		||||
    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
 | 
			
		||||
    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
 | 
			
		||||
    <DCC_Define>DEBUG</DCC_Define>
 | 
			
		||||
    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
 | 
			
		||||
    <IntermediateOutputDir>Debug</IntermediateOutputDir>
 | 
			
		||||
    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
 | 
			
		||||
    <BCC_StackFrames>true</BCC_StackFrames>
 | 
			
		||||
    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
 | 
			
		||||
    <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
 | 
			
		||||
    <TASM_Debugging>Full</TASM_Debugging>
 | 
			
		||||
    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Cfg_2)'!=''">
 | 
			
		||||
    <Defines>NDEBUG;$(Defines)</Defines>
 | 
			
		||||
    <IntermediateOutputDir>Release</IntermediateOutputDir>
 | 
			
		||||
    <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
 | 
			
		||||
    <TASM_Debugging>None</TASM_Debugging>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ProjectExtensions>
 | 
			
		||||
    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
 | 
			
		||||
    <Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>
 | 
			
		||||
    <BorlandProject>
 | 
			
		||||
<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo Name="Private">False</VersionInfo><VersionInfo Name="DLL">False</VersionInfo><VersionInfo Name="Locale">1033</VersionInfo><VersionInfo Name="CodePage">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name="CompanyName"></VersionInfoKeys><VersionInfoKeys Name="FileDescription"></VersionInfoKeys><VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="InternalName"></VersionInfoKeys><VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys><VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys><VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys><VersionInfoKeys Name="ProductName"></VersionInfoKeys><VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="Comments"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name="DebugSourceDirs"></Debugging></Debugging><Parameters><Parameters Name="RunParams"></Parameters><Parameters Name="Launcher"></Parameters><Parameters Name="UseLauncher">False</Parameters><Parameters Name="DebugCWD"></Parameters><Parameters Name="HostApplication"></Parameters><Parameters Name="RemoteHost"></Parameters><Parameters Name="RemotePath"></Parameters><Parameters Name="RemoteParams"></Parameters><Parameters Name="RemoteLauncher"></Parameters><Parameters Name="UseRemoteLauncher">False</Parameters><Parameters Name="RemoteCWD"></Parameters><Parameters Name="RemoteDebug">False</Parameters><Parameters Name="Debug Symbols Search Path"></Parameters><Parameters Name="LoadAllSymbols">True</Parameters><Parameters Name="LoadUnspecifiedSymbols">False</Parameters></Parameters><Excluded_Packages>
 | 
			
		||||
      
 | 
			
		||||
      
 | 
			
		||||
      <Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
 | 
			
		||||
      <Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
 | 
			
		||||
    </Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item0">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item1">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item2">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\src;..\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Count">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item0">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name="Count">1</HistoryLists_hlDefines><HistoryLists_hlDefines Name="Item0">NO_STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines><HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Count">1</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Item0">32</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Item1">16</HistoryLists_hlTLIB_PageSize></HistoryLists_hlTLIB_PageSize></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>
 | 
			
		||||
  </ProjectExtensions>
 | 
			
		||||
  <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <None Include="..\include\gtest\gtest-death-test.h">
 | 
			
		||||
      <BuildOrder>3</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\gtest-message.h">
 | 
			
		||||
      <BuildOrder>4</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\gtest-param-test.h">
 | 
			
		||||
      <BuildOrder>5</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\gtest-spi.h">
 | 
			
		||||
      <BuildOrder>6</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\gtest-test-part.h">
 | 
			
		||||
      <BuildOrder>7</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\gtest-typed-test.h">
 | 
			
		||||
      <BuildOrder>8</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\gtest.h">
 | 
			
		||||
      <BuildOrder>0</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\gtest_pred_impl.h">
 | 
			
		||||
      <BuildOrder>1</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\gtest_prod.h">
 | 
			
		||||
      <BuildOrder>2</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\internal\gtest-death-test-internal.h">
 | 
			
		||||
      <BuildOrder>9</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\internal\gtest-filepath.h">
 | 
			
		||||
      <BuildOrder>10</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\internal\gtest-internal.h">
 | 
			
		||||
      <BuildOrder>11</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\internal\gtest-linked_ptr.h">
 | 
			
		||||
      <BuildOrder>12</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\internal\gtest-param-util-generated.h">
 | 
			
		||||
      <BuildOrder>14</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\internal\gtest-param-util.h">
 | 
			
		||||
      <BuildOrder>13</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\internal\gtest-port.h">
 | 
			
		||||
      <BuildOrder>15</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\internal\gtest-string.h">
 | 
			
		||||
      <BuildOrder>16</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <None Include="..\include\gtest\internal\gtest-type-util.h">
 | 
			
		||||
      <BuildOrder>17</BuildOrder>
 | 
			
		||||
    </None>
 | 
			
		||||
    <CppCompile Include="gtest_all.cc">
 | 
			
		||||
      <BuildOrder>18</BuildOrder>
 | 
			
		||||
    </CppCompile>
 | 
			
		||||
    <BuildConfiguration Include="Debug">
 | 
			
		||||
      <Key>Cfg_1</Key>
 | 
			
		||||
    </BuildConfiguration>
 | 
			
		||||
    <BuildConfiguration Include="Release">
 | 
			
		||||
      <Key>Cfg_2</Key>
 | 
			
		||||
    </BuildConfiguration>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,54 +0,0 @@
 | 
			
		|||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <ProjectGuid>{c1d923e0-6cba-4332-9b6f-3420acbf5091}</ProjectGuid>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ItemGroup />
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Projects Include="gtest.cbproj" />
 | 
			
		||||
    <Projects Include="gtest_main.cbproj" />
 | 
			
		||||
    <Projects Include="gtest_unittest.cbproj" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ProjectExtensions>
 | 
			
		||||
    <Borland.Personality>Default.Personality</Borland.Personality>
 | 
			
		||||
    <Borland.ProjectType />
 | 
			
		||||
    <BorlandProject>
 | 
			
		||||
<BorlandProject xmlns=""><Default.Personality></Default.Personality></BorlandProject></BorlandProject>
 | 
			
		||||
  </ProjectExtensions>
 | 
			
		||||
  <Target Name="gtest">
 | 
			
		||||
    <MSBuild Projects="gtest.cbproj" Targets="" />
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Target Name="gtest:Clean">
 | 
			
		||||
    <MSBuild Projects="gtest.cbproj" Targets="Clean" />
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Target Name="gtest:Make">
 | 
			
		||||
    <MSBuild Projects="gtest.cbproj" Targets="Make" />
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Target Name="gtest_main">
 | 
			
		||||
    <MSBuild Projects="gtest_main.cbproj" Targets="" />
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Target Name="gtest_main:Clean">
 | 
			
		||||
    <MSBuild Projects="gtest_main.cbproj" Targets="Clean" />
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Target Name="gtest_main:Make">
 | 
			
		||||
    <MSBuild Projects="gtest_main.cbproj" Targets="Make" />
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Target Name="gtest_unittest">
 | 
			
		||||
    <MSBuild Projects="gtest_unittest.cbproj" Targets="" />
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Target Name="gtest_unittest:Clean">
 | 
			
		||||
    <MSBuild Projects="gtest_unittest.cbproj" Targets="Clean" />
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Target Name="gtest_unittest:Make">
 | 
			
		||||
    <MSBuild Projects="gtest_unittest.cbproj" Targets="Make" />
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Target Name="Build">
 | 
			
		||||
    <CallTarget Targets="gtest;gtest_main;gtest_unittest" />
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Target Name="Clean">
 | 
			
		||||
    <CallTarget Targets="gtest:Clean;gtest_main:Clean;gtest_unittest:Clean" />
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Target Name="Make">
 | 
			
		||||
    <CallTarget Targets="gtest:Make;gtest_main:Make;gtest_unittest:Make" />
 | 
			
		||||
  </Target>
 | 
			
		||||
  <Import Condition="Exists('$(MSBuildBinPath)\Borland.Group.Targets')" Project="$(MSBuildBinPath)\Borland.Group.Targets" />
 | 
			
		||||
</Project>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,38 +0,0 @@
 | 
			
		|||
// 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.
 | 
			
		||||
//
 | 
			
		||||
// Author: Josh Kelley (joshkel@gmail.com)
 | 
			
		||||
//
 | 
			
		||||
// Google C++ Testing Framework (Google Test)
 | 
			
		||||
//
 | 
			
		||||
// C++Builder's IDE cannot build a static library from files with hyphens
 | 
			
		||||
// in their name.  See http://qc.codegear.com/wc/qcmain.aspx?d=70977 .
 | 
			
		||||
// This file serves as a workaround.
 | 
			
		||||
 | 
			
		||||
#include "src/gtest-all.cc"
 | 
			
		||||
| 
						 | 
				
			
			@ -1,40 +0,0 @@
 | 
			
		|||
// 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.
 | 
			
		||||
//
 | 
			
		||||
// Author: Josh Kelley (joshkel@gmail.com)
 | 
			
		||||
//
 | 
			
		||||
// Google C++ Testing Framework (Google Test)
 | 
			
		||||
//
 | 
			
		||||
// Links gtest.lib and gtest_main.lib into the current project in C++Builder.
 | 
			
		||||
// This means that these libraries can't be renamed, but it's the only way to
 | 
			
		||||
// ensure that Debug versus Release test builds are linked against the
 | 
			
		||||
// appropriate Debug or Release build of the libraries.
 | 
			
		||||
 | 
			
		||||
#pragma link "gtest.lib"
 | 
			
		||||
#pragma link "gtest_main.lib"
 | 
			
		||||
| 
						 | 
				
			
			@ -1,82 +0,0 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>
 | 
			
		||||
    <Config Condition="'$(Config)'==''">Release</Config>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
 | 
			
		||||
    <Base>true</Base>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
 | 
			
		||||
    <Base>true</Base>
 | 
			
		||||
    <Cfg_1>true</Cfg_1>
 | 
			
		||||
    <CfgParent>Base</CfgParent>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
 | 
			
		||||
    <Base>true</Base>
 | 
			
		||||
    <Cfg_2>true</Cfg_2>
 | 
			
		||||
    <CfgParent>Base</CfgParent>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Base)'!=''">
 | 
			
		||||
    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
 | 
			
		||||
    <OutputExt>lib</OutputExt>
 | 
			
		||||
    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
 | 
			
		||||
    <Defines>NO_STRICT</Defines>
 | 
			
		||||
    <DynamicRTL>true</DynamicRTL>
 | 
			
		||||
    <UsePackages>true</UsePackages>
 | 
			
		||||
    <ProjectType>CppStaticLibrary</ProjectType>
 | 
			
		||||
    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
 | 
			
		||||
    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi</PackageImports>
 | 
			
		||||
    <BCC_wpar>false</BCC_wpar>
 | 
			
		||||
    <IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</IncludePath>
 | 
			
		||||
    <AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>
 | 
			
		||||
    <TLIB_PageSize>32</TLIB_PageSize>
 | 
			
		||||
    <ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Cfg_1)'!=''">
 | 
			
		||||
    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
 | 
			
		||||
    <DCC_Optimize>false</DCC_Optimize>
 | 
			
		||||
    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
 | 
			
		||||
    <Defines>_DEBUG;$(Defines)</Defines>
 | 
			
		||||
    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
 | 
			
		||||
    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
 | 
			
		||||
    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
 | 
			
		||||
    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
 | 
			
		||||
    <DCC_Define>DEBUG</DCC_Define>
 | 
			
		||||
    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
 | 
			
		||||
    <IntermediateOutputDir>Debug</IntermediateOutputDir>
 | 
			
		||||
    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
 | 
			
		||||
    <BCC_StackFrames>true</BCC_StackFrames>
 | 
			
		||||
    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
 | 
			
		||||
    <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
 | 
			
		||||
    <TASM_Debugging>Full</TASM_Debugging>
 | 
			
		||||
    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Cfg_2)'!=''">
 | 
			
		||||
    <Defines>NDEBUG;$(Defines)</Defines>
 | 
			
		||||
    <IntermediateOutputDir>Release</IntermediateOutputDir>
 | 
			
		||||
    <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
 | 
			
		||||
    <TASM_Debugging>None</TASM_Debugging>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ProjectExtensions>
 | 
			
		||||
    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
 | 
			
		||||
    <Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>
 | 
			
		||||
    <BorlandProject>
 | 
			
		||||
<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo Name="Private">False</VersionInfo><VersionInfo Name="DLL">False</VersionInfo><VersionInfo Name="Locale">1033</VersionInfo><VersionInfo Name="CodePage">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name="CompanyName"></VersionInfoKeys><VersionInfoKeys Name="FileDescription"></VersionInfoKeys><VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="InternalName"></VersionInfoKeys><VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys><VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys><VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys><VersionInfoKeys Name="ProductName"></VersionInfoKeys><VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="Comments"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name="DebugSourceDirs"></Debugging></Debugging><Parameters><Parameters Name="RunParams"></Parameters><Parameters Name="Launcher"></Parameters><Parameters Name="UseLauncher">False</Parameters><Parameters Name="DebugCWD"></Parameters><Parameters Name="HostApplication"></Parameters><Parameters Name="RemoteHost"></Parameters><Parameters Name="RemotePath"></Parameters><Parameters Name="RemoteParams"></Parameters><Parameters Name="RemoteLauncher"></Parameters><Parameters Name="UseRemoteLauncher">False</Parameters><Parameters Name="RemoteCWD"></Parameters><Parameters Name="RemoteDebug">False</Parameters><Parameters Name="Debug Symbols Search Path"></Parameters><Parameters Name="LoadAllSymbols">True</Parameters><Parameters Name="LoadUnspecifiedSymbols">False</Parameters></Parameters><Excluded_Packages>
 | 
			
		||||
      <Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
 | 
			
		||||
      <Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
 | 
			
		||||
    </Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item0">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item1">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item2">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\src;..\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Count">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item0">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name="Count">1</HistoryLists_hlDefines><HistoryLists_hlDefines Name="Item0">NO_STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines><HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Count">1</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Item0">32</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Item1">16</HistoryLists_hlTLIB_PageSize></HistoryLists_hlTLIB_PageSize></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>
 | 
			
		||||
  </ProjectExtensions>
 | 
			
		||||
  <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <CppCompile Include="..\src\gtest_main.cc">
 | 
			
		||||
      <BuildOrder>0</BuildOrder>
 | 
			
		||||
    </CppCompile>
 | 
			
		||||
    <BuildConfiguration Include="Debug">
 | 
			
		||||
      <Key>Cfg_1</Key>
 | 
			
		||||
    </BuildConfiguration>
 | 
			
		||||
    <BuildConfiguration Include="Release">
 | 
			
		||||
      <Key>Cfg_2</Key>
 | 
			
		||||
    </BuildConfiguration>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,88 +0,0 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <ProjectGuid>{eea63393-5ac5-4b9c-8909-d75fef2daa41}</ProjectGuid>
 | 
			
		||||
    <Config Condition="'$(Config)'==''">Release</Config>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
 | 
			
		||||
    <Base>true</Base>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
 | 
			
		||||
    <Base>true</Base>
 | 
			
		||||
    <Cfg_1>true</Cfg_1>
 | 
			
		||||
    <CfgParent>Base</CfgParent>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
 | 
			
		||||
    <Base>true</Base>
 | 
			
		||||
    <Cfg_2>true</Cfg_2>
 | 
			
		||||
    <CfgParent>Base</CfgParent>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Base)'!=''">
 | 
			
		||||
    <OutputExt>exe</OutputExt>
 | 
			
		||||
    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
 | 
			
		||||
    <Defines>NO_STRICT</Defines>
 | 
			
		||||
    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
 | 
			
		||||
    <DynamicRTL>true</DynamicRTL>
 | 
			
		||||
    <ILINK_ObjectSearchPath>..\test</ILINK_ObjectSearchPath>
 | 
			
		||||
    <UsePackages>true</UsePackages>
 | 
			
		||||
    <ProjectType>CppConsoleApplication</ProjectType>
 | 
			
		||||
    <NoVCL>true</NoVCL>
 | 
			
		||||
    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
 | 
			
		||||
    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi</PackageImports>
 | 
			
		||||
    <BCC_wpar>false</BCC_wpar>
 | 
			
		||||
    <IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;..</IncludePath>
 | 
			
		||||
    <ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test</ILINK_LibraryPath>
 | 
			
		||||
    <Multithreaded>true</Multithreaded>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Cfg_1)'!=''">
 | 
			
		||||
    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
 | 
			
		||||
    <DCC_Optimize>false</DCC_Optimize>
 | 
			
		||||
    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
 | 
			
		||||
    <Defines>_DEBUG;$(Defines)</Defines>
 | 
			
		||||
    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
 | 
			
		||||
    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
 | 
			
		||||
    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
 | 
			
		||||
    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
 | 
			
		||||
    <DCC_Define>DEBUG</DCC_Define>
 | 
			
		||||
    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
 | 
			
		||||
    <IntermediateOutputDir>Debug</IntermediateOutputDir>
 | 
			
		||||
    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
 | 
			
		||||
    <BCC_StackFrames>true</BCC_StackFrames>
 | 
			
		||||
    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
 | 
			
		||||
    <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
 | 
			
		||||
    <TASM_Debugging>Full</TASM_Debugging>
 | 
			
		||||
    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Cfg_2)'!=''">
 | 
			
		||||
    <Defines>NDEBUG;$(Defines)</Defines>
 | 
			
		||||
    <IntermediateOutputDir>Release</IntermediateOutputDir>
 | 
			
		||||
    <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
 | 
			
		||||
    <TASM_Debugging>None</TASM_Debugging>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ProjectExtensions>
 | 
			
		||||
    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
 | 
			
		||||
    <Borland.ProjectType>CppConsoleApplication</Borland.ProjectType>
 | 
			
		||||
    <BorlandProject>
 | 
			
		||||
<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo Name="Private">False</VersionInfo><VersionInfo Name="DLL">False</VersionInfo><VersionInfo Name="Locale">1033</VersionInfo><VersionInfo Name="CodePage">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name="CompanyName"></VersionInfoKeys><VersionInfoKeys Name="FileDescription"></VersionInfoKeys><VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="InternalName"></VersionInfoKeys><VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys><VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys><VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys><VersionInfoKeys Name="ProductName"></VersionInfoKeys><VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="Comments"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name="DebugSourceDirs"></Debugging></Debugging><Parameters><Parameters Name="RunParams"></Parameters><Parameters Name="Launcher"></Parameters><Parameters Name="UseLauncher">False</Parameters><Parameters Name="DebugCWD"></Parameters><Parameters Name="HostApplication"></Parameters><Parameters Name="RemoteHost"></Parameters><Parameters Name="RemotePath"></Parameters><Parameters Name="RemoteParams"></Parameters><Parameters Name="RemoteLauncher"></Parameters><Parameters Name="UseRemoteLauncher">False</Parameters><Parameters Name="RemoteCWD"></Parameters><Parameters Name="RemoteDebug">False</Parameters><Parameters Name="Debug Symbols Search Path"></Parameters><Parameters Name="LoadAllSymbols">True</Parameters><Parameters Name="LoadUnspecifiedSymbols">False</Parameters></Parameters><Excluded_Packages>
 | 
			
		||||
      
 | 
			
		||||
      
 | 
			
		||||
      <Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
 | 
			
		||||
      <Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
 | 
			
		||||
    </Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item0">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item1">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item2">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Count">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item0">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item1">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item2">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;$(OUTPUTDIR);..\test</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name="Count">2</HistoryLists_hlDefines><HistoryLists_hlDefines Name="Item0">NO_STRICT</HistoryLists_hlDefines><HistoryLists_hlDefines Name="Item1">STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>
 | 
			
		||||
  </ProjectExtensions>
 | 
			
		||||
  <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <CppCompile Include="..\test\gtest_unittest.cc">
 | 
			
		||||
      <BuildOrder>0</BuildOrder>
 | 
			
		||||
    </CppCompile>
 | 
			
		||||
    <CppCompile Include="gtest_link.cc">
 | 
			
		||||
      <BuildOrder>1</BuildOrder>
 | 
			
		||||
    </CppCompile>
 | 
			
		||||
    <BuildConfiguration Include="Debug">
 | 
			
		||||
      <Key>Cfg_1</Key>
 | 
			
		||||
    </BuildConfiguration>
 | 
			
		||||
    <BuildConfiguration Include="Release">
 | 
			
		||||
      <Key>Cfg_2</Key>
 | 
			
		||||
    </BuildConfiguration>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
							
								
								
									
										18222
									
								
								lib/gtest/configure
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										18222
									
								
								lib/gtest/configure
									
										
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -1,68 +0,0 @@
 | 
			
		|||
m4_include(m4/acx_pthread.m4)
 | 
			
		||||
 | 
			
		||||
# At this point, the Xcode project assumes the version string will be three
 | 
			
		||||
# integers separated by periods and surrounded by square brackets (e.g.
 | 
			
		||||
# "[1.0.1]"). It also asumes that there won't be any closing parenthesis
 | 
			
		||||
# between "AC_INIT(" and the closing ")" including comments and strings.
 | 
			
		||||
AC_INIT([Google C++ Testing Framework],
 | 
			
		||||
        [1.7.0],
 | 
			
		||||
        [googletestframework@googlegroups.com],
 | 
			
		||||
        [gtest])
 | 
			
		||||
 | 
			
		||||
# Provide various options to initialize the Autoconf and configure processes.
 | 
			
		||||
AC_PREREQ([2.59])
 | 
			
		||||
AC_CONFIG_SRCDIR([./LICENSE])
 | 
			
		||||
AC_CONFIG_MACRO_DIR([m4])
 | 
			
		||||
AC_CONFIG_AUX_DIR([build-aux])
 | 
			
		||||
AC_CONFIG_HEADERS([build-aux/config.h])
 | 
			
		||||
AC_CONFIG_FILES([Makefile])
 | 
			
		||||
AC_CONFIG_FILES([scripts/gtest-config], [chmod +x scripts/gtest-config])
 | 
			
		||||
 | 
			
		||||
# Initialize Automake with various options. We require at least v1.9, prevent
 | 
			
		||||
# pedantic complaints about package files, and enable various distribution
 | 
			
		||||
# targets.
 | 
			
		||||
AM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects])
 | 
			
		||||
 | 
			
		||||
# Check for programs used in building Google Test.
 | 
			
		||||
AC_PROG_CC
 | 
			
		||||
AC_PROG_CXX
 | 
			
		||||
AC_LANG([C++])
 | 
			
		||||
AC_PROG_LIBTOOL
 | 
			
		||||
 | 
			
		||||
# TODO(chandlerc@google.com): Currently we aren't running the Python tests
 | 
			
		||||
# against the interpreter detected by AM_PATH_PYTHON, and so we condition
 | 
			
		||||
# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's
 | 
			
		||||
# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env"
 | 
			
		||||
# hashbang.
 | 
			
		||||
PYTHON=  # We *do not* allow the user to specify a python interpreter
 | 
			
		||||
AC_PATH_PROG([PYTHON],[python],[:])
 | 
			
		||||
AS_IF([test "$PYTHON" != ":"],
 | 
			
		||||
      [AM_PYTHON_CHECK_VERSION([$PYTHON],[2.3],[:],[PYTHON=":"])])
 | 
			
		||||
AM_CONDITIONAL([HAVE_PYTHON],[test "$PYTHON" != ":"])
 | 
			
		||||
 | 
			
		||||
# Configure pthreads.
 | 
			
		||||
AC_ARG_WITH([pthreads],
 | 
			
		||||
            [AS_HELP_STRING([--with-pthreads],
 | 
			
		||||
               [use pthreads (default is yes)])],
 | 
			
		||||
            [with_pthreads=$withval],
 | 
			
		||||
            [with_pthreads=check])
 | 
			
		||||
 | 
			
		||||
have_pthreads=no
 | 
			
		||||
AS_IF([test "x$with_pthreads" != "xno"],
 | 
			
		||||
      [ACX_PTHREAD(
 | 
			
		||||
        [],
 | 
			
		||||
        [AS_IF([test "x$with_pthreads" != "xcheck"],
 | 
			
		||||
               [AC_MSG_FAILURE(
 | 
			
		||||
                 [--with-pthreads was specified, but unable to be used])])])
 | 
			
		||||
       have_pthreads="$acx_pthread_ok"])
 | 
			
		||||
AM_CONDITIONAL([HAVE_PTHREADS],[test "x$have_pthreads" = "xyes"])
 | 
			
		||||
AC_SUBST(PTHREAD_CFLAGS)
 | 
			
		||||
AC_SUBST(PTHREAD_LIBS)
 | 
			
		||||
 | 
			
		||||
# TODO(chandlerc@google.com) Check for the necessary system headers.
 | 
			
		||||
 | 
			
		||||
# TODO(chandlerc@google.com) Check the types, structures, and other compiler
 | 
			
		||||
# and architecture characteristics.
 | 
			
		||||
 | 
			
		||||
# Output the generated files. No further autoconf macros may be used.
 | 
			
		||||
AC_OUTPUT
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -1,38 +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 <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
GTEST_API_ int main(int argc, char **argv) {
 | 
			
		||||
  printf("Running main() from gtest_main.cc\n");
 | 
			
		||||
  testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,363 +0,0 @@
 | 
			
		|||
# This was retrieved from
 | 
			
		||||
#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi
 | 
			
		||||
# See also (perhaps for new versions?)
 | 
			
		||||
#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi
 | 
			
		||||
#
 | 
			
		||||
# We've rewritten the inconsistency check code (from avahi), to work
 | 
			
		||||
# more broadly.  In particular, it no longer assumes ld accepts -zdefs.
 | 
			
		||||
# This caused a restructing of the code, but the functionality has only
 | 
			
		||||
# changed a little.
 | 
			
		||||
 | 
			
		||||
dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
 | 
			
		||||
dnl
 | 
			
		||||
dnl @summary figure out how to build C programs using POSIX threads
 | 
			
		||||
dnl
 | 
			
		||||
dnl This macro figures out how to build C programs using POSIX threads.
 | 
			
		||||
dnl It sets the PTHREAD_LIBS output variable to the threads library and
 | 
			
		||||
dnl linker flags, and the PTHREAD_CFLAGS output variable to any special
 | 
			
		||||
dnl C compiler flags that are needed. (The user can also force certain
 | 
			
		||||
dnl compiler flags/libs to be tested by setting these environment
 | 
			
		||||
dnl variables.)
 | 
			
		||||
dnl
 | 
			
		||||
dnl Also sets PTHREAD_CC to any special C compiler that is needed for
 | 
			
		||||
dnl multi-threaded programs (defaults to the value of CC otherwise).
 | 
			
		||||
dnl (This is necessary on AIX to use the special cc_r compiler alias.)
 | 
			
		||||
dnl
 | 
			
		||||
dnl NOTE: You are assumed to not only compile your program with these
 | 
			
		||||
dnl flags, but also link it with them as well. e.g. you should link
 | 
			
		||||
dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
 | 
			
		||||
dnl $LIBS
 | 
			
		||||
dnl
 | 
			
		||||
dnl If you are only building threads programs, you may wish to use
 | 
			
		||||
dnl these variables in your default LIBS, CFLAGS, and CC:
 | 
			
		||||
dnl
 | 
			
		||||
dnl        LIBS="$PTHREAD_LIBS $LIBS"
 | 
			
		||||
dnl        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 | 
			
		||||
dnl        CC="$PTHREAD_CC"
 | 
			
		||||
dnl
 | 
			
		||||
dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
 | 
			
		||||
dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
 | 
			
		||||
dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
 | 
			
		||||
dnl
 | 
			
		||||
dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
 | 
			
		||||
dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to
 | 
			
		||||
dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the
 | 
			
		||||
dnl default action will define HAVE_PTHREAD.
 | 
			
		||||
dnl
 | 
			
		||||
dnl Please let the authors know if this macro fails on any platform, or
 | 
			
		||||
dnl if you have any other suggestions or comments. This macro was based
 | 
			
		||||
dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with
 | 
			
		||||
dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros
 | 
			
		||||
dnl posted by Alejandro Forero Cuervo to the autoconf macro repository.
 | 
			
		||||
dnl We are also grateful for the helpful feedback of numerous users.
 | 
			
		||||
dnl
 | 
			
		||||
dnl @category InstalledPackages
 | 
			
		||||
dnl @author Steven G. Johnson <stevenj@alum.mit.edu>
 | 
			
		||||
dnl @version 2006-05-29
 | 
			
		||||
dnl @license GPLWithACException
 | 
			
		||||
dnl 
 | 
			
		||||
dnl Checks for GCC shared/pthread inconsistency based on work by
 | 
			
		||||
dnl Marcin Owsiany <marcin@owsiany.pl>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
AC_DEFUN([ACX_PTHREAD], [
 | 
			
		||||
AC_REQUIRE([AC_CANONICAL_HOST])
 | 
			
		||||
AC_LANG_SAVE
 | 
			
		||||
AC_LANG_C
 | 
			
		||||
acx_pthread_ok=no
 | 
			
		||||
 | 
			
		||||
# We used to check for pthread.h first, but this fails if pthread.h
 | 
			
		||||
# requires special compiler flags (e.g. on True64 or Sequent).
 | 
			
		||||
# It gets checked for in the link test anyway.
 | 
			
		||||
 | 
			
		||||
# First of all, check if the user has set any of the PTHREAD_LIBS,
 | 
			
		||||
# etcetera environment variables, and if threads linking works using
 | 
			
		||||
# them:
 | 
			
		||||
if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
 | 
			
		||||
        save_CFLAGS="$CFLAGS"
 | 
			
		||||
        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 | 
			
		||||
        save_LIBS="$LIBS"
 | 
			
		||||
        LIBS="$PTHREAD_LIBS $LIBS"
 | 
			
		||||
        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
 | 
			
		||||
        AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
 | 
			
		||||
        AC_MSG_RESULT($acx_pthread_ok)
 | 
			
		||||
        if test x"$acx_pthread_ok" = xno; then
 | 
			
		||||
                PTHREAD_LIBS=""
 | 
			
		||||
                PTHREAD_CFLAGS=""
 | 
			
		||||
        fi
 | 
			
		||||
        LIBS="$save_LIBS"
 | 
			
		||||
        CFLAGS="$save_CFLAGS"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# We must check for the threads library under a number of different
 | 
			
		||||
# names; the ordering is very important because some systems
 | 
			
		||||
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
 | 
			
		||||
# libraries is broken (non-POSIX).
 | 
			
		||||
 | 
			
		||||
# Create a list of thread flags to try.  Items starting with a "-" are
 | 
			
		||||
# C compiler flags, and other items are library names, except for "none"
 | 
			
		||||
# which indicates that we try without any flags at all, and "pthread-config"
 | 
			
		||||
# which is a program returning the flags for the Pth emulation library.
 | 
			
		||||
 | 
			
		||||
acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
 | 
			
		||||
 | 
			
		||||
# The ordering *is* (sometimes) important.  Some notes on the
 | 
			
		||||
# individual items follow:
 | 
			
		||||
 | 
			
		||||
# pthreads: AIX (must check this before -lpthread)
 | 
			
		||||
# none: in case threads are in libc; should be tried before -Kthread and
 | 
			
		||||
#       other compiler flags to prevent continual compiler warnings
 | 
			
		||||
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
 | 
			
		||||
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
 | 
			
		||||
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
 | 
			
		||||
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
 | 
			
		||||
# -pthreads: Solaris/gcc
 | 
			
		||||
# -mthreads: Mingw32/gcc, Lynx/gcc
 | 
			
		||||
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
 | 
			
		||||
#      doesn't hurt to check since this sometimes defines pthreads too;
 | 
			
		||||
#      also defines -D_REENTRANT)
 | 
			
		||||
#      ... -mt is also the pthreads flag for HP/aCC
 | 
			
		||||
# pthread: Linux, etcetera
 | 
			
		||||
# --thread-safe: KAI C++
 | 
			
		||||
# pthread-config: use pthread-config program (for GNU Pth library)
 | 
			
		||||
 | 
			
		||||
case "${host_cpu}-${host_os}" in
 | 
			
		||||
        *solaris*)
 | 
			
		||||
 | 
			
		||||
        # On Solaris (at least, for some versions), libc contains stubbed
 | 
			
		||||
        # (non-functional) versions of the pthreads routines, so link-based
 | 
			
		||||
        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/
 | 
			
		||||
        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
 | 
			
		||||
        # a function called by this macro, so we could check for that, but
 | 
			
		||||
        # who knows whether they'll stub that too in a future libc.)  So,
 | 
			
		||||
        # we'll just look for -pthreads and -lpthread first:
 | 
			
		||||
 | 
			
		||||
        acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
 | 
			
		||||
        ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
if test x"$acx_pthread_ok" = xno; then
 | 
			
		||||
for flag in $acx_pthread_flags; do
 | 
			
		||||
 | 
			
		||||
        case $flag in
 | 
			
		||||
                none)
 | 
			
		||||
                AC_MSG_CHECKING([whether pthreads work without any flags])
 | 
			
		||||
                ;;
 | 
			
		||||
 | 
			
		||||
                -*)
 | 
			
		||||
                AC_MSG_CHECKING([whether pthreads work with $flag])
 | 
			
		||||
                PTHREAD_CFLAGS="$flag"
 | 
			
		||||
                ;;
 | 
			
		||||
 | 
			
		||||
		pthread-config)
 | 
			
		||||
		AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
 | 
			
		||||
		if test x"$acx_pthread_config" = xno; then continue; fi
 | 
			
		||||
		PTHREAD_CFLAGS="`pthread-config --cflags`"
 | 
			
		||||
		PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
 | 
			
		||||
		;;
 | 
			
		||||
 | 
			
		||||
                *)
 | 
			
		||||
                AC_MSG_CHECKING([for the pthreads library -l$flag])
 | 
			
		||||
                PTHREAD_LIBS="-l$flag"
 | 
			
		||||
                ;;
 | 
			
		||||
        esac
 | 
			
		||||
 | 
			
		||||
        save_LIBS="$LIBS"
 | 
			
		||||
        save_CFLAGS="$CFLAGS"
 | 
			
		||||
        LIBS="$PTHREAD_LIBS $LIBS"
 | 
			
		||||
        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 | 
			
		||||
 | 
			
		||||
        # Check for various functions.  We must include pthread.h,
 | 
			
		||||
        # since some functions may be macros.  (On the Sequent, we
 | 
			
		||||
        # need a special flag -Kthread to make this header compile.)
 | 
			
		||||
        # We check for pthread_join because it is in -lpthread on IRIX
 | 
			
		||||
        # while pthread_create is in libc.  We check for pthread_attr_init
 | 
			
		||||
        # due to DEC craziness with -lpthreads.  We check for
 | 
			
		||||
        # pthread_cleanup_push because it is one of the few pthread
 | 
			
		||||
        # functions on Solaris that doesn't have a non-functional libc stub.
 | 
			
		||||
        # We try pthread_create on general principles.
 | 
			
		||||
        AC_TRY_LINK([#include <pthread.h>],
 | 
			
		||||
                    [pthread_t th; pthread_join(th, 0);
 | 
			
		||||
                     pthread_attr_init(0); pthread_cleanup_push(0, 0);
 | 
			
		||||
                     pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
 | 
			
		||||
                    [acx_pthread_ok=yes])
 | 
			
		||||
 | 
			
		||||
        LIBS="$save_LIBS"
 | 
			
		||||
        CFLAGS="$save_CFLAGS"
 | 
			
		||||
 | 
			
		||||
        AC_MSG_RESULT($acx_pthread_ok)
 | 
			
		||||
        if test "x$acx_pthread_ok" = xyes; then
 | 
			
		||||
                break;
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        PTHREAD_LIBS=""
 | 
			
		||||
        PTHREAD_CFLAGS=""
 | 
			
		||||
done
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Various other checks:
 | 
			
		||||
if test "x$acx_pthread_ok" = xyes; then
 | 
			
		||||
        save_LIBS="$LIBS"
 | 
			
		||||
        LIBS="$PTHREAD_LIBS $LIBS"
 | 
			
		||||
        save_CFLAGS="$CFLAGS"
 | 
			
		||||
        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 | 
			
		||||
 | 
			
		||||
        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
 | 
			
		||||
	AC_MSG_CHECKING([for joinable pthread attribute])
 | 
			
		||||
	attr_name=unknown
 | 
			
		||||
	for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
 | 
			
		||||
	    AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],
 | 
			
		||||
                        [attr_name=$attr; break])
 | 
			
		||||
	done
 | 
			
		||||
        AC_MSG_RESULT($attr_name)
 | 
			
		||||
        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
 | 
			
		||||
            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
 | 
			
		||||
                               [Define to necessary symbol if this constant
 | 
			
		||||
                                uses a non-standard name on your system.])
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        AC_MSG_CHECKING([if more special flags are required for pthreads])
 | 
			
		||||
        flag=no
 | 
			
		||||
        case "${host_cpu}-${host_os}" in
 | 
			
		||||
            *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
 | 
			
		||||
            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
 | 
			
		||||
        esac
 | 
			
		||||
        AC_MSG_RESULT(${flag})
 | 
			
		||||
        if test "x$flag" != xno; then
 | 
			
		||||
            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        LIBS="$save_LIBS"
 | 
			
		||||
        CFLAGS="$save_CFLAGS"
 | 
			
		||||
        # More AIX lossage: must compile with xlc_r or cc_r
 | 
			
		||||
	if test x"$GCC" != xyes; then
 | 
			
		||||
          AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
 | 
			
		||||
        else
 | 
			
		||||
          PTHREAD_CC=$CC
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	# The next part tries to detect GCC inconsistency with -shared on some
 | 
			
		||||
	# architectures and systems. The problem is that in certain
 | 
			
		||||
	# configurations, when -shared is specified, GCC "forgets" to
 | 
			
		||||
	# internally use various flags which are still necessary.
 | 
			
		||||
	
 | 
			
		||||
	#
 | 
			
		||||
	# Prepare the flags
 | 
			
		||||
	#
 | 
			
		||||
	save_CFLAGS="$CFLAGS"
 | 
			
		||||
	save_LIBS="$LIBS"
 | 
			
		||||
	save_CC="$CC"
 | 
			
		||||
	
 | 
			
		||||
	# Try with the flags determined by the earlier checks.
 | 
			
		||||
	#
 | 
			
		||||
	# -Wl,-z,defs forces link-time symbol resolution, so that the
 | 
			
		||||
	# linking checks with -shared actually have any value
 | 
			
		||||
	#
 | 
			
		||||
	# FIXME: -fPIC is required for -shared on many architectures,
 | 
			
		||||
	# so we specify it here, but the right way would probably be to
 | 
			
		||||
	# properly detect whether it is actually required.
 | 
			
		||||
	CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS"
 | 
			
		||||
	LIBS="$PTHREAD_LIBS $LIBS"
 | 
			
		||||
	CC="$PTHREAD_CC"
 | 
			
		||||
	
 | 
			
		||||
	# In order not to create several levels of indentation, we test
 | 
			
		||||
	# the value of "$done" until we find the cure or run out of ideas.
 | 
			
		||||
	done="no"
 | 
			
		||||
	
 | 
			
		||||
	# First, make sure the CFLAGS we added are actually accepted by our
 | 
			
		||||
	# compiler.  If not (and OS X's ld, for instance, does not accept -z),
 | 
			
		||||
	# then we can't do this test.
 | 
			
		||||
	if test x"$done" = xno; then
 | 
			
		||||
	   AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies])
 | 
			
		||||
	   AC_TRY_LINK(,, , [done=yes])
 | 
			
		||||
	
 | 
			
		||||
	   if test "x$done" = xyes ; then
 | 
			
		||||
	      AC_MSG_RESULT([no])
 | 
			
		||||
	   else
 | 
			
		||||
	      AC_MSG_RESULT([yes])
 | 
			
		||||
	   fi
 | 
			
		||||
	fi
 | 
			
		||||
	
 | 
			
		||||
	if test x"$done" = xno; then
 | 
			
		||||
	   AC_MSG_CHECKING([whether -pthread is sufficient with -shared])
 | 
			
		||||
	   AC_TRY_LINK([#include <pthread.h>],
 | 
			
		||||
	      [pthread_t th; pthread_join(th, 0);
 | 
			
		||||
	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
 | 
			
		||||
	      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
 | 
			
		||||
	      [done=yes])
 | 
			
		||||
	   
 | 
			
		||||
	   if test "x$done" = xyes; then
 | 
			
		||||
	      AC_MSG_RESULT([yes])
 | 
			
		||||
	   else
 | 
			
		||||
	      AC_MSG_RESULT([no])
 | 
			
		||||
	   fi
 | 
			
		||||
	fi
 | 
			
		||||
	
 | 
			
		||||
	#
 | 
			
		||||
	# Linux gcc on some architectures such as mips/mipsel forgets
 | 
			
		||||
	# about -lpthread
 | 
			
		||||
	#
 | 
			
		||||
	if test x"$done" = xno; then
 | 
			
		||||
	   AC_MSG_CHECKING([whether -lpthread fixes that])
 | 
			
		||||
	   LIBS="-lpthread $PTHREAD_LIBS $save_LIBS"
 | 
			
		||||
	   AC_TRY_LINK([#include <pthread.h>],
 | 
			
		||||
	      [pthread_t th; pthread_join(th, 0);
 | 
			
		||||
	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
 | 
			
		||||
	      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
 | 
			
		||||
	      [done=yes])
 | 
			
		||||
	
 | 
			
		||||
	   if test "x$done" = xyes; then
 | 
			
		||||
	      AC_MSG_RESULT([yes])
 | 
			
		||||
	      PTHREAD_LIBS="-lpthread $PTHREAD_LIBS"
 | 
			
		||||
	   else
 | 
			
		||||
	      AC_MSG_RESULT([no])
 | 
			
		||||
	   fi
 | 
			
		||||
	fi
 | 
			
		||||
	#
 | 
			
		||||
	# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc
 | 
			
		||||
	#
 | 
			
		||||
	if test x"$done" = xno; then
 | 
			
		||||
	   AC_MSG_CHECKING([whether -lc_r fixes that])
 | 
			
		||||
	   LIBS="-lc_r $PTHREAD_LIBS $save_LIBS"
 | 
			
		||||
	   AC_TRY_LINK([#include <pthread.h>],
 | 
			
		||||
	       [pthread_t th; pthread_join(th, 0);
 | 
			
		||||
	        pthread_attr_init(0); pthread_cleanup_push(0, 0);
 | 
			
		||||
	        pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
 | 
			
		||||
	       [done=yes])
 | 
			
		||||
	
 | 
			
		||||
	   if test "x$done" = xyes; then
 | 
			
		||||
	      AC_MSG_RESULT([yes])
 | 
			
		||||
	      PTHREAD_LIBS="-lc_r $PTHREAD_LIBS"
 | 
			
		||||
	   else
 | 
			
		||||
	      AC_MSG_RESULT([no])
 | 
			
		||||
	   fi
 | 
			
		||||
	fi
 | 
			
		||||
	if test x"$done" = xno; then
 | 
			
		||||
	   # OK, we have run out of ideas
 | 
			
		||||
	   AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries])
 | 
			
		||||
	
 | 
			
		||||
	   # so it's not safe to assume that we may use pthreads
 | 
			
		||||
	   acx_pthread_ok=no
 | 
			
		||||
	fi
 | 
			
		||||
	
 | 
			
		||||
	CFLAGS="$save_CFLAGS"
 | 
			
		||||
	LIBS="$save_LIBS"
 | 
			
		||||
	CC="$save_CC"
 | 
			
		||||
else
 | 
			
		||||
        PTHREAD_CC="$CC"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
AC_SUBST(PTHREAD_LIBS)
 | 
			
		||||
AC_SUBST(PTHREAD_CFLAGS)
 | 
			
		||||
AC_SUBST(PTHREAD_CC)
 | 
			
		||||
 | 
			
		||||
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
 | 
			
		||||
if test x"$acx_pthread_ok" = xyes; then
 | 
			
		||||
        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
 | 
			
		||||
        :
 | 
			
		||||
else
 | 
			
		||||
        acx_pthread_ok=no
 | 
			
		||||
        $2
 | 
			
		||||
fi
 | 
			
		||||
AC_LANG_RESTORE
 | 
			
		||||
])dnl ACX_PTHREAD
 | 
			
		||||
| 
						 | 
				
			
			@ -1,74 +0,0 @@
 | 
			
		|||
dnl GTEST_LIB_CHECK([minimum version [,
 | 
			
		||||
dnl                  action if found [,action if not found]]])
 | 
			
		||||
dnl
 | 
			
		||||
dnl Check for the presence of the Google Test library, optionally at a minimum
 | 
			
		||||
dnl version, and indicate a viable version with the HAVE_GTEST flag. It defines
 | 
			
		||||
dnl standard variables for substitution including GTEST_CPPFLAGS,
 | 
			
		||||
dnl GTEST_CXXFLAGS, GTEST_LDFLAGS, and GTEST_LIBS. It also defines
 | 
			
		||||
dnl GTEST_VERSION as the version of Google Test found. Finally, it provides
 | 
			
		||||
dnl optional custom action slots in the event GTEST is found or not.
 | 
			
		||||
AC_DEFUN([GTEST_LIB_CHECK],
 | 
			
		||||
[
 | 
			
		||||
dnl Provide a flag to enable or disable Google Test usage.
 | 
			
		||||
AC_ARG_ENABLE([gtest],
 | 
			
		||||
  [AS_HELP_STRING([--enable-gtest],
 | 
			
		||||
                  [Enable tests using the Google C++ Testing Framework.
 | 
			
		||||
                  (Default is enabled.)])],
 | 
			
		||||
  [],
 | 
			
		||||
  [enable_gtest=])
 | 
			
		||||
AC_ARG_VAR([GTEST_CONFIG],
 | 
			
		||||
           [The exact path of Google Test's 'gtest-config' script.])
 | 
			
		||||
AC_ARG_VAR([GTEST_CPPFLAGS],
 | 
			
		||||
           [C-like preprocessor flags for Google Test.])
 | 
			
		||||
AC_ARG_VAR([GTEST_CXXFLAGS],
 | 
			
		||||
           [C++ compile flags for Google Test.])
 | 
			
		||||
AC_ARG_VAR([GTEST_LDFLAGS],
 | 
			
		||||
           [Linker path and option flags for Google Test.])
 | 
			
		||||
AC_ARG_VAR([GTEST_LIBS],
 | 
			
		||||
           [Library linking flags for Google Test.])
 | 
			
		||||
AC_ARG_VAR([GTEST_VERSION],
 | 
			
		||||
           [The version of Google Test available.])
 | 
			
		||||
HAVE_GTEST="no"
 | 
			
		||||
AS_IF([test "x${enable_gtest}" != "xno"],
 | 
			
		||||
  [AC_MSG_CHECKING([for 'gtest-config'])
 | 
			
		||||
   AS_IF([test "x${enable_gtest}" != "xyes"],
 | 
			
		||||
     [AS_IF([test -x "${enable_gtest}/scripts/gtest-config"],
 | 
			
		||||
        [GTEST_CONFIG="${enable_gtest}/scripts/gtest-config"],
 | 
			
		||||
        [GTEST_CONFIG="${enable_gtest}/bin/gtest-config"])
 | 
			
		||||
      AS_IF([test -x "${GTEST_CONFIG}"], [],
 | 
			
		||||
        [AC_MSG_RESULT([no])
 | 
			
		||||
         AC_MSG_ERROR([dnl
 | 
			
		||||
Unable to locate either a built or installed Google Test.
 | 
			
		||||
The specific location '${enable_gtest}' was provided for a built or installed
 | 
			
		||||
Google Test, but no 'gtest-config' script could be found at this location.])
 | 
			
		||||
         ])],
 | 
			
		||||
     [AC_PATH_PROG([GTEST_CONFIG], [gtest-config])])
 | 
			
		||||
   AS_IF([test -x "${GTEST_CONFIG}"],
 | 
			
		||||
     [AC_MSG_RESULT([${GTEST_CONFIG}])
 | 
			
		||||
      m4_ifval([$1],
 | 
			
		||||
        [_gtest_min_version="--min-version=$1"
 | 
			
		||||
         AC_MSG_CHECKING([for Google Test at least version >= $1])],
 | 
			
		||||
        [_gtest_min_version="--min-version=0"
 | 
			
		||||
         AC_MSG_CHECKING([for Google Test])])
 | 
			
		||||
      AS_IF([${GTEST_CONFIG} ${_gtest_min_version}],
 | 
			
		||||
        [AC_MSG_RESULT([yes])
 | 
			
		||||
         HAVE_GTEST='yes'],
 | 
			
		||||
        [AC_MSG_RESULT([no])])],
 | 
			
		||||
     [AC_MSG_RESULT([no])])
 | 
			
		||||
   AS_IF([test "x${HAVE_GTEST}" = "xyes"],
 | 
			
		||||
     [GTEST_CPPFLAGS=`${GTEST_CONFIG} --cppflags`
 | 
			
		||||
      GTEST_CXXFLAGS=`${GTEST_CONFIG} --cxxflags`
 | 
			
		||||
      GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags`
 | 
			
		||||
      GTEST_LIBS=`${GTEST_CONFIG} --libs`
 | 
			
		||||
      GTEST_VERSION=`${GTEST_CONFIG} --version`
 | 
			
		||||
      AC_DEFINE([HAVE_GTEST],[1],[Defined when Google Test is available.])],
 | 
			
		||||
     [AS_IF([test "x${enable_gtest}" = "xyes"],
 | 
			
		||||
        [AC_MSG_ERROR([dnl
 | 
			
		||||
Google Test was enabled, but no viable version could be found.])
 | 
			
		||||
         ])])])
 | 
			
		||||
AC_SUBST([HAVE_GTEST])
 | 
			
		||||
AM_CONDITIONAL([HAVE_GTEST],[test "x$HAVE_GTEST" = "xyes"])
 | 
			
		||||
AS_IF([test "x$HAVE_GTEST" = "xyes"],
 | 
			
		||||
  [m4_ifval([$2], [$2])],
 | 
			
		||||
  [m4_ifval([$3], [$3])])
 | 
			
		||||
])
 | 
			
		||||
							
								
								
									
										8001
									
								
								lib/gtest/m4/libtool.m4
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										8001
									
								
								lib/gtest/m4/libtool.m4
									
										
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										384
									
								
								lib/gtest/m4/ltoptions.m4
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										384
									
								
								lib/gtest/m4/ltoptions.m4
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,384 +0,0 @@
 | 
			
		|||
# Helper functions for option handling.                    -*- Autoconf -*-
 | 
			
		||||
#
 | 
			
		||||
#   Copyright (C) 2004, 2005, 2007, 2008, 2009 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 7 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],      [1], [Assembler program])dnl
 | 
			
		||||
 | 
			
		||||
test -z "$DLLTOOL" && DLLTOOL=dlltool
 | 
			
		||||
_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
 | 
			
		||||
 | 
			
		||||
test -z "$OBJDUMP" && OBJDUMP=objdump
 | 
			
		||||
_LT_DECL([], [OBJDUMP], [1], [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@<:@=PKGS@:>@],
 | 
			
		||||
	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
 | 
			
		||||
    [lt_p=${PACKAGE-default}
 | 
			
		||||
    case $withval in
 | 
			
		||||
    yes|no) pic_mode=$withval ;;
 | 
			
		||||
    *)
 | 
			
		||||
      pic_mode=default
 | 
			
		||||
      # Look at the argument we got.  We use all the common list separators.
 | 
			
		||||
      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
 | 
			
		||||
      for lt_pkg in $withval; do
 | 
			
		||||
	IFS="$lt_save_ifs"
 | 
			
		||||
	if test "X$lt_pkg" = "X$lt_p"; then
 | 
			
		||||
	  pic_mode=yes
 | 
			
		||||
	fi
 | 
			
		||||
      done
 | 
			
		||||
      IFS="$lt_save_ifs"
 | 
			
		||||
      ;;
 | 
			
		||||
    esac],
 | 
			
		||||
    [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
									
								
								lib/gtest/m4/ltsugar.m4
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										123
									
								
								lib/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
									
								
								lib/gtest/m4/ltversion.m4
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								lib/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.
 | 
			
		||||
 | 
			
		||||
# @configure_input@
 | 
			
		||||
 | 
			
		||||
# serial 3337 ltversion.m4
 | 
			
		||||
# This file is part of GNU Libtool
 | 
			
		||||
 | 
			
		||||
m4_define([LT_PACKAGE_VERSION], [2.4.2])
 | 
			
		||||
m4_define([LT_PACKAGE_REVISION], [1.3337])
 | 
			
		||||
 | 
			
		||||
AC_DEFUN([LTVERSION_VERSION],
 | 
			
		||||
[macro_version='2.4.2'
 | 
			
		||||
macro_revision='1.3337'
 | 
			
		||||
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
 | 
			
		||||
_LT_DECL(, macro_revision, 0)
 | 
			
		||||
])
 | 
			
		||||
							
								
								
									
										98
									
								
								lib/gtest/m4/lt~obsolete.m4
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										98
									
								
								lib/gtest/m4/lt~obsolete.m4
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,98 +0,0 @@
 | 
			
		|||
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
 | 
			
		||||
#
 | 
			
		||||
#   Copyright (C) 2004, 2005, 2007, 2009 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 5 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_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])])
 | 
			
		||||
m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
 | 
			
		||||
m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
 | 
			
		||||
m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
 | 
			
		||||
m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
 | 
			
		||||
m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
 | 
			
		||||
m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
 | 
			
		||||
m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
 | 
			
		||||
| 
						 | 
				
			
			@ -1,45 +0,0 @@
 | 
			
		|||
Microsoft Visual Studio Solution File, Format Version 8.00
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest-md", "gtest-md.vcproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
 | 
			
		||||
	ProjectSection(ProjectDependencies) = postProject
 | 
			
		||||
	EndProjectSection
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_main-md", "gtest_main-md.vcproj", "{3AF54C8A-10BF-4332-9147-F68ED9862033}"
 | 
			
		||||
	ProjectSection(ProjectDependencies) = postProject
 | 
			
		||||
	EndProjectSection
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_prod_test-md", "gtest_prod_test-md.vcproj", "{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}"
 | 
			
		||||
	ProjectSection(ProjectDependencies) = postProject
 | 
			
		||||
	EndProjectSection
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_unittest-md", "gtest_unittest-md.vcproj", "{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}"
 | 
			
		||||
	ProjectSection(ProjectDependencies) = postProject
 | 
			
		||||
	EndProjectSection
 | 
			
		||||
EndProject
 | 
			
		||||
Global
 | 
			
		||||
	GlobalSection(SolutionConfiguration) = preSolution
 | 
			
		||||
		Debug = Debug
 | 
			
		||||
		Release = Release
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(ProjectConfiguration) = postSolution
 | 
			
		||||
		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug.ActiveCfg = Debug|Win32
 | 
			
		||||
		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug.Build.0 = Debug|Win32
 | 
			
		||||
		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release.ActiveCfg = Release|Win32
 | 
			
		||||
		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release.Build.0 = Release|Win32
 | 
			
		||||
		{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug.ActiveCfg = Debug|Win32
 | 
			
		||||
		{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug.Build.0 = Debug|Win32
 | 
			
		||||
		{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release.ActiveCfg = Release|Win32
 | 
			
		||||
		{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release.Build.0 = Release|Win32
 | 
			
		||||
		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug.ActiveCfg = Debug|Win32
 | 
			
		||||
		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug.Build.0 = Debug|Win32
 | 
			
		||||
		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release.ActiveCfg = Release|Win32
 | 
			
		||||
		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release.Build.0 = Release|Win32
 | 
			
		||||
		{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug.ActiveCfg = Debug|Win32
 | 
			
		||||
		{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug.Build.0 = Debug|Win32
 | 
			
		||||
		{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release.ActiveCfg = Release|Win32
 | 
			
		||||
		{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release.Build.0 = Release|Win32
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(ExtensibilityGlobals) = postSolution
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(ExtensibilityAddIns) = postSolution
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
EndGlobal
 | 
			
		||||
| 
						 | 
				
			
			@ -1,126 +0,0 @@
 | 
			
		|||
<?xml version="1.0" encoding="Windows-1252"?>
 | 
			
		||||
<VisualStudioProject
 | 
			
		||||
	ProjectType="Visual C++"
 | 
			
		||||
	Version="7.10"
 | 
			
		||||
	Name="gtest-md"
 | 
			
		||||
	ProjectGUID="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
 | 
			
		||||
	Keyword="Win32Proj">
 | 
			
		||||
	<Platforms>
 | 
			
		||||
		<Platform
 | 
			
		||||
			Name="Win32"/>
 | 
			
		||||
	</Platforms>
 | 
			
		||||
	<Configurations>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Debug|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="4"
 | 
			
		||||
			CharacterSet="2"
 | 
			
		||||
			ReferencesPath="">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
 | 
			
		||||
				MinimalRebuild="TRUE"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
				RuntimeLibrary="3"
 | 
			
		||||
				UsePrecompiledHeader="0"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="4"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLibrarianTool"
 | 
			
		||||
				OutputFile="$(OutDir)/gtestd.lib"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Release|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="4"
 | 
			
		||||
			CharacterSet="2"
 | 
			
		||||
			ReferencesPath=""..\include";".."">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
 | 
			
		||||
				RuntimeLibrary="2"
 | 
			
		||||
				UsePrecompiledHeader="0"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="3"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLibrarianTool"
 | 
			
		||||
				OutputFile="$(OutDir)/gtest.lib"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
	</Configurations>
 | 
			
		||||
	<References>
 | 
			
		||||
	</References>
 | 
			
		||||
	<Files>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Source Files"
 | 
			
		||||
			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
 | 
			
		||||
			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\src\gtest-all.cc">
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Debug|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Release|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
			</File>
 | 
			
		||||
		</Filter>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Header Files"
 | 
			
		||||
			Filter="h;hpp;hxx;hm;inl;inc;xsd"
 | 
			
		||||
			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
 | 
			
		||||
		</Filter>
 | 
			
		||||
	</Files>
 | 
			
		||||
	<Globals>
 | 
			
		||||
	</Globals>
 | 
			
		||||
</VisualStudioProject>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,45 +0,0 @@
 | 
			
		|||
Microsoft Visual Studio Solution File, Format Version 8.00
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest", "gtest.vcproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
 | 
			
		||||
	ProjectSection(ProjectDependencies) = postProject
 | 
			
		||||
	EndProjectSection
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_main", "gtest_main.vcproj", "{3AF54C8A-10BF-4332-9147-F68ED9862032}"
 | 
			
		||||
	ProjectSection(ProjectDependencies) = postProject
 | 
			
		||||
	EndProjectSection
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_unittest", "gtest_unittest.vcproj", "{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}"
 | 
			
		||||
	ProjectSection(ProjectDependencies) = postProject
 | 
			
		||||
	EndProjectSection
 | 
			
		||||
EndProject
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_prod_test", "gtest_prod_test.vcproj", "{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}"
 | 
			
		||||
	ProjectSection(ProjectDependencies) = postProject
 | 
			
		||||
	EndProjectSection
 | 
			
		||||
EndProject
 | 
			
		||||
Global
 | 
			
		||||
	GlobalSection(SolutionConfiguration) = preSolution
 | 
			
		||||
		Debug = Debug
 | 
			
		||||
		Release = Release
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(ProjectConfiguration) = postSolution
 | 
			
		||||
		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.ActiveCfg = Debug|Win32
 | 
			
		||||
		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.Build.0 = Debug|Win32
 | 
			
		||||
		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.ActiveCfg = Release|Win32
 | 
			
		||||
		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.Build.0 = Release|Win32
 | 
			
		||||
		{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.ActiveCfg = Debug|Win32
 | 
			
		||||
		{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.Build.0 = Debug|Win32
 | 
			
		||||
		{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.ActiveCfg = Release|Win32
 | 
			
		||||
		{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.Build.0 = Release|Win32
 | 
			
		||||
		{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.ActiveCfg = Debug|Win32
 | 
			
		||||
		{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.Build.0 = Debug|Win32
 | 
			
		||||
		{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.ActiveCfg = Release|Win32
 | 
			
		||||
		{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.Build.0 = Release|Win32
 | 
			
		||||
		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.ActiveCfg = Debug|Win32
 | 
			
		||||
		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.Build.0 = Debug|Win32
 | 
			
		||||
		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.ActiveCfg = Release|Win32
 | 
			
		||||
		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.Build.0 = Release|Win32
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(ExtensibilityGlobals) = postSolution
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(ExtensibilityAddIns) = postSolution
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
EndGlobal
 | 
			
		||||
| 
						 | 
				
			
			@ -1,126 +0,0 @@
 | 
			
		|||
<?xml version="1.0" encoding="Windows-1252"?>
 | 
			
		||||
<VisualStudioProject
 | 
			
		||||
	ProjectType="Visual C++"
 | 
			
		||||
	Version="7.10"
 | 
			
		||||
	Name="gtest"
 | 
			
		||||
	ProjectGUID="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
 | 
			
		||||
	Keyword="Win32Proj">
 | 
			
		||||
	<Platforms>
 | 
			
		||||
		<Platform
 | 
			
		||||
			Name="Win32"/>
 | 
			
		||||
	</Platforms>
 | 
			
		||||
	<Configurations>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Debug|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="4"
 | 
			
		||||
			CharacterSet="2"
 | 
			
		||||
			ReferencesPath="">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
 | 
			
		||||
				MinimalRebuild="TRUE"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
				RuntimeLibrary="5"
 | 
			
		||||
				UsePrecompiledHeader="0"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="4"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLibrarianTool"
 | 
			
		||||
				OutputFile="$(OutDir)/gtestd.lib"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Release|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="4"
 | 
			
		||||
			CharacterSet="2"
 | 
			
		||||
			ReferencesPath=""..\include";".."">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
 | 
			
		||||
				RuntimeLibrary="4"
 | 
			
		||||
				UsePrecompiledHeader="0"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="3"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLibrarianTool"
 | 
			
		||||
				OutputFile="$(OutDir)/gtest.lib"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
	</Configurations>
 | 
			
		||||
	<References>
 | 
			
		||||
	</References>
 | 
			
		||||
	<Files>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Source Files"
 | 
			
		||||
			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
 | 
			
		||||
			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\src\gtest-all.cc">
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Debug|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Release|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
			</File>
 | 
			
		||||
		</Filter>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Header Files"
 | 
			
		||||
			Filter="h;hpp;hxx;hm;inl;inc;xsd"
 | 
			
		||||
			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
 | 
			
		||||
		</Filter>
 | 
			
		||||
	</Files>
 | 
			
		||||
	<Globals>
 | 
			
		||||
	</Globals>
 | 
			
		||||
</VisualStudioProject>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,129 +0,0 @@
 | 
			
		|||
<?xml version="1.0" encoding="Windows-1252"?>
 | 
			
		||||
<VisualStudioProject
 | 
			
		||||
	ProjectType="Visual C++"
 | 
			
		||||
	Version="7.10"
 | 
			
		||||
	Name="gtest_main-md"
 | 
			
		||||
	ProjectGUID="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
 | 
			
		||||
	Keyword="Win32Proj">
 | 
			
		||||
	<Platforms>
 | 
			
		||||
		<Platform
 | 
			
		||||
			Name="Win32"/>
 | 
			
		||||
	</Platforms>
 | 
			
		||||
	<Configurations>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Debug|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="4"
 | 
			
		||||
			CharacterSet="2"
 | 
			
		||||
			ReferencesPath="">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
 | 
			
		||||
				MinimalRebuild="TRUE"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
				RuntimeLibrary="3"
 | 
			
		||||
				UsePrecompiledHeader="0"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="4"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLibrarianTool"
 | 
			
		||||
				OutputFile="$(OutDir)/$(ProjectName)d.lib"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Release|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="4"
 | 
			
		||||
			CharacterSet="2"
 | 
			
		||||
			ReferencesPath=""..\include";".."">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
 | 
			
		||||
				RuntimeLibrary="2"
 | 
			
		||||
				UsePrecompiledHeader="0"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="3"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLibrarianTool"
 | 
			
		||||
				OutputFile="$(OutDir)/$(ProjectName).lib"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
	</Configurations>
 | 
			
		||||
	<References>
 | 
			
		||||
		<ProjectReference
 | 
			
		||||
			ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
 | 
			
		||||
			Name="gtest-md"/>
 | 
			
		||||
	</References>
 | 
			
		||||
	<Files>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Source Files"
 | 
			
		||||
			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
 | 
			
		||||
			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\src\gtest_main.cc">
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Debug|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Release|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
			</File>
 | 
			
		||||
		</Filter>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Header Files"
 | 
			
		||||
			Filter="h;hpp;hxx;hm;inl;inc;xsd"
 | 
			
		||||
			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
 | 
			
		||||
		</Filter>
 | 
			
		||||
	</Files>
 | 
			
		||||
	<Globals>
 | 
			
		||||
	</Globals>
 | 
			
		||||
</VisualStudioProject>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,129 +0,0 @@
 | 
			
		|||
<?xml version="1.0" encoding="Windows-1252"?>
 | 
			
		||||
<VisualStudioProject
 | 
			
		||||
	ProjectType="Visual C++"
 | 
			
		||||
	Version="7.10"
 | 
			
		||||
	Name="gtest_main"
 | 
			
		||||
	ProjectGUID="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
 | 
			
		||||
	Keyword="Win32Proj">
 | 
			
		||||
	<Platforms>
 | 
			
		||||
		<Platform
 | 
			
		||||
			Name="Win32"/>
 | 
			
		||||
	</Platforms>
 | 
			
		||||
	<Configurations>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Debug|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="4"
 | 
			
		||||
			CharacterSet="2"
 | 
			
		||||
			ReferencesPath="">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
 | 
			
		||||
				MinimalRebuild="TRUE"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
				RuntimeLibrary="5"
 | 
			
		||||
				UsePrecompiledHeader="0"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="4"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLibrarianTool"
 | 
			
		||||
				OutputFile="$(OutDir)/$(ProjectName)d.lib"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Release|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="4"
 | 
			
		||||
			CharacterSet="2"
 | 
			
		||||
			ReferencesPath=""..\include";".."">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
 | 
			
		||||
				RuntimeLibrary="4"
 | 
			
		||||
				UsePrecompiledHeader="0"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="3"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLibrarianTool"
 | 
			
		||||
				OutputFile="$(OutDir)/$(ProjectName).lib"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
	</Configurations>
 | 
			
		||||
	<References>
 | 
			
		||||
		<ProjectReference
 | 
			
		||||
			ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
 | 
			
		||||
			Name="gtest"/>
 | 
			
		||||
	</References>
 | 
			
		||||
	<Files>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Source Files"
 | 
			
		||||
			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
 | 
			
		||||
			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\src\gtest_main.cc">
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Debug|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Release|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
			</File>
 | 
			
		||||
		</Filter>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Header Files"
 | 
			
		||||
			Filter="h;hpp;hxx;hm;inl;inc;xsd"
 | 
			
		||||
			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
 | 
			
		||||
		</Filter>
 | 
			
		||||
	</Files>
 | 
			
		||||
	<Globals>
 | 
			
		||||
	</Globals>
 | 
			
		||||
</VisualStudioProject>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,164 +0,0 @@
 | 
			
		|||
<?xml version="1.0" encoding="Windows-1252"?>
 | 
			
		||||
<VisualStudioProject
 | 
			
		||||
	ProjectType="Visual C++"
 | 
			
		||||
	Version="7.10"
 | 
			
		||||
	Name="gtest_prod_test-md"
 | 
			
		||||
	ProjectGUID="{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}"
 | 
			
		||||
	Keyword="Win32Proj">
 | 
			
		||||
	<Platforms>
 | 
			
		||||
		<Platform
 | 
			
		||||
			Name="Win32"/>
 | 
			
		||||
	</Platforms>
 | 
			
		||||
	<Configurations>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Debug|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="1"
 | 
			
		||||
			CharacterSet="2">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
 | 
			
		||||
				MinimalRebuild="TRUE"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
				RuntimeLibrary="3"
 | 
			
		||||
				UsePrecompiledHeader="3"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="4"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLinkerTool"
 | 
			
		||||
				OutputFile="$(OutDir)/gtest_prod_test.exe"
 | 
			
		||||
				LinkIncremental="2"
 | 
			
		||||
				GenerateDebugInformation="TRUE"
 | 
			
		||||
				ProgramDatabaseFile="$(OutDir)/gtest_prod_test.pdb"
 | 
			
		||||
				SubSystem="1"
 | 
			
		||||
				TargetMachine="1"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebDeploymentTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Release|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="1"
 | 
			
		||||
			CharacterSet="2">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 | 
			
		||||
				RuntimeLibrary="2"
 | 
			
		||||
				UsePrecompiledHeader="3"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="3"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLinkerTool"
 | 
			
		||||
				OutputFile="$(OutDir)/gtest_prod_test.exe"
 | 
			
		||||
				LinkIncremental="1"
 | 
			
		||||
				GenerateDebugInformation="TRUE"
 | 
			
		||||
				SubSystem="1"
 | 
			
		||||
				OptimizeReferences="2"
 | 
			
		||||
				EnableCOMDATFolding="2"
 | 
			
		||||
				TargetMachine="1"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebDeploymentTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
	</Configurations>
 | 
			
		||||
	<References>
 | 
			
		||||
		<ProjectReference
 | 
			
		||||
			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
 | 
			
		||||
			Name="gtest_main-md"/>
 | 
			
		||||
	</References>
 | 
			
		||||
	<Files>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Source Files"
 | 
			
		||||
			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
 | 
			
		||||
			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\test\gtest_prod_test.cc">
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Debug|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""
 | 
			
		||||
						UsePrecompiledHeader="0"/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Release|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""
 | 
			
		||||
						UsePrecompiledHeader="0"/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\test\production.cc">
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Debug|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""
 | 
			
		||||
						UsePrecompiledHeader="0"/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Release|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""
 | 
			
		||||
						UsePrecompiledHeader="0"/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
			</File>
 | 
			
		||||
		</Filter>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Header Files"
 | 
			
		||||
			Filter="h;hpp;hxx;hm;inl;inc;xsd"
 | 
			
		||||
			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\test\production.h">
 | 
			
		||||
			</File>
 | 
			
		||||
		</Filter>
 | 
			
		||||
	</Files>
 | 
			
		||||
	<Globals>
 | 
			
		||||
	</Globals>
 | 
			
		||||
</VisualStudioProject>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,164 +0,0 @@
 | 
			
		|||
<?xml version="1.0" encoding="Windows-1252"?>
 | 
			
		||||
<VisualStudioProject
 | 
			
		||||
	ProjectType="Visual C++"
 | 
			
		||||
	Version="7.10"
 | 
			
		||||
	Name="gtest_prod_test"
 | 
			
		||||
	ProjectGUID="{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}"
 | 
			
		||||
	Keyword="Win32Proj">
 | 
			
		||||
	<Platforms>
 | 
			
		||||
		<Platform
 | 
			
		||||
			Name="Win32"/>
 | 
			
		||||
	</Platforms>
 | 
			
		||||
	<Configurations>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Debug|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="1"
 | 
			
		||||
			CharacterSet="2">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
 | 
			
		||||
				MinimalRebuild="TRUE"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
				RuntimeLibrary="5"
 | 
			
		||||
				UsePrecompiledHeader="3"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="4"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLinkerTool"
 | 
			
		||||
				OutputFile="$(OutDir)/gtest_prod_test.exe"
 | 
			
		||||
				LinkIncremental="2"
 | 
			
		||||
				GenerateDebugInformation="TRUE"
 | 
			
		||||
				ProgramDatabaseFile="$(OutDir)/gtest_prod_test.pdb"
 | 
			
		||||
				SubSystem="1"
 | 
			
		||||
				TargetMachine="1"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebDeploymentTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Release|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="1"
 | 
			
		||||
			CharacterSet="2">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 | 
			
		||||
				RuntimeLibrary="4"
 | 
			
		||||
				UsePrecompiledHeader="3"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="3"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLinkerTool"
 | 
			
		||||
				OutputFile="$(OutDir)/gtest_prod_test.exe"
 | 
			
		||||
				LinkIncremental="1"
 | 
			
		||||
				GenerateDebugInformation="TRUE"
 | 
			
		||||
				SubSystem="1"
 | 
			
		||||
				OptimizeReferences="2"
 | 
			
		||||
				EnableCOMDATFolding="2"
 | 
			
		||||
				TargetMachine="1"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebDeploymentTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
	</Configurations>
 | 
			
		||||
	<References>
 | 
			
		||||
		<ProjectReference
 | 
			
		||||
			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
 | 
			
		||||
			Name="gtest_main"/>
 | 
			
		||||
	</References>
 | 
			
		||||
	<Files>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Source Files"
 | 
			
		||||
			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
 | 
			
		||||
			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\test\gtest_prod_test.cc">
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Debug|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""
 | 
			
		||||
						UsePrecompiledHeader="0"/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Release|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""
 | 
			
		||||
						UsePrecompiledHeader="0"/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\test\production.cc">
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Debug|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""
 | 
			
		||||
						UsePrecompiledHeader="0"/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Release|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""
 | 
			
		||||
						UsePrecompiledHeader="0"/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
			</File>
 | 
			
		||||
		</Filter>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Header Files"
 | 
			
		||||
			Filter="h;hpp;hxx;hm;inl;inc;xsd"
 | 
			
		||||
			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\test\production.h">
 | 
			
		||||
			</File>
 | 
			
		||||
		</Filter>
 | 
			
		||||
	</Files>
 | 
			
		||||
	<Globals>
 | 
			
		||||
	</Globals>
 | 
			
		||||
</VisualStudioProject>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,147 +0,0 @@
 | 
			
		|||
<?xml version="1.0" encoding="Windows-1252"?>
 | 
			
		||||
<VisualStudioProject
 | 
			
		||||
	ProjectType="Visual C++"
 | 
			
		||||
	Version="7.10"
 | 
			
		||||
	Name="gtest_unittest-md"
 | 
			
		||||
	ProjectGUID="{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}"
 | 
			
		||||
	Keyword="Win32Proj">
 | 
			
		||||
	<Platforms>
 | 
			
		||||
		<Platform
 | 
			
		||||
			Name="Win32"/>
 | 
			
		||||
	</Platforms>
 | 
			
		||||
	<Configurations>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Debug|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="1"
 | 
			
		||||
			CharacterSet="2">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
 | 
			
		||||
				MinimalRebuild="TRUE"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
				RuntimeLibrary="3"
 | 
			
		||||
				UsePrecompiledHeader="3"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="4"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLinkerTool"
 | 
			
		||||
				OutputFile="$(OutDir)/gtest_unittest.exe"
 | 
			
		||||
				LinkIncremental="2"
 | 
			
		||||
				GenerateDebugInformation="TRUE"
 | 
			
		||||
				ProgramDatabaseFile="$(OutDir)/gtest_unittest.pdb"
 | 
			
		||||
				SubSystem="1"
 | 
			
		||||
				TargetMachine="1"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebDeploymentTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Release|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="1"
 | 
			
		||||
			CharacterSet="2">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 | 
			
		||||
				RuntimeLibrary="2"
 | 
			
		||||
				UsePrecompiledHeader="3"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="3"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLinkerTool"
 | 
			
		||||
				OutputFile="$(OutDir)/gtest_unittest.exe"
 | 
			
		||||
				LinkIncremental="1"
 | 
			
		||||
				GenerateDebugInformation="TRUE"
 | 
			
		||||
				SubSystem="1"
 | 
			
		||||
				OptimizeReferences="2"
 | 
			
		||||
				EnableCOMDATFolding="2"
 | 
			
		||||
				TargetMachine="1"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebDeploymentTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
	</Configurations>
 | 
			
		||||
	<References>
 | 
			
		||||
		<ProjectReference
 | 
			
		||||
			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
 | 
			
		||||
			Name="gtest_main-md"/>
 | 
			
		||||
	</References>
 | 
			
		||||
	<Files>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Source Files"
 | 
			
		||||
			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
 | 
			
		||||
			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\test\gtest_unittest.cc">
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Debug|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						Optimization="1"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""
 | 
			
		||||
						BasicRuntimeChecks="0"
 | 
			
		||||
						UsePrecompiledHeader="0"
 | 
			
		||||
						DebugInformationFormat="3"/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Release|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""
 | 
			
		||||
						UsePrecompiledHeader="0"/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
			</File>
 | 
			
		||||
		</Filter>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Header Files"
 | 
			
		||||
			Filter="h;hpp;hxx;hm;inl;inc;xsd"
 | 
			
		||||
			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
 | 
			
		||||
		</Filter>
 | 
			
		||||
	</Files>
 | 
			
		||||
	<Globals>
 | 
			
		||||
	</Globals>
 | 
			
		||||
</VisualStudioProject>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,147 +0,0 @@
 | 
			
		|||
<?xml version="1.0" encoding="Windows-1252"?>
 | 
			
		||||
<VisualStudioProject
 | 
			
		||||
	ProjectType="Visual C++"
 | 
			
		||||
	Version="7.10"
 | 
			
		||||
	Name="gtest_unittest"
 | 
			
		||||
	ProjectGUID="{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}"
 | 
			
		||||
	Keyword="Win32Proj">
 | 
			
		||||
	<Platforms>
 | 
			
		||||
		<Platform
 | 
			
		||||
			Name="Win32"/>
 | 
			
		||||
	</Platforms>
 | 
			
		||||
	<Configurations>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Debug|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="1"
 | 
			
		||||
			CharacterSet="2">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
 | 
			
		||||
				MinimalRebuild="TRUE"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
				RuntimeLibrary="5"
 | 
			
		||||
				UsePrecompiledHeader="3"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="4"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLinkerTool"
 | 
			
		||||
				OutputFile="$(OutDir)/gtest_unittest.exe"
 | 
			
		||||
				LinkIncremental="2"
 | 
			
		||||
				GenerateDebugInformation="TRUE"
 | 
			
		||||
				ProgramDatabaseFile="$(OutDir)/gtest_unittest.pdb"
 | 
			
		||||
				SubSystem="1"
 | 
			
		||||
				TargetMachine="1"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebDeploymentTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Release|Win32"
 | 
			
		||||
			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
 | 
			
		||||
			IntermediateDirectory="$(OutDir)/$(ProjectName)"
 | 
			
		||||
			ConfigurationType="1"
 | 
			
		||||
			CharacterSet="2">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 | 
			
		||||
				RuntimeLibrary="4"
 | 
			
		||||
				UsePrecompiledHeader="3"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				Detect64BitPortabilityProblems="FALSE"
 | 
			
		||||
				DebugInformationFormat="3"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLinkerTool"
 | 
			
		||||
				OutputFile="$(OutDir)/gtest_unittest.exe"
 | 
			
		||||
				LinkIncremental="1"
 | 
			
		||||
				GenerateDebugInformation="TRUE"
 | 
			
		||||
				SubSystem="1"
 | 
			
		||||
				OptimizeReferences="2"
 | 
			
		||||
				EnableCOMDATFolding="2"
 | 
			
		||||
				TargetMachine="1"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebDeploymentTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
	</Configurations>
 | 
			
		||||
	<References>
 | 
			
		||||
		<ProjectReference
 | 
			
		||||
			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
 | 
			
		||||
			Name="gtest_main"/>
 | 
			
		||||
	</References>
 | 
			
		||||
	<Files>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Source Files"
 | 
			
		||||
			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
 | 
			
		||||
			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\test\gtest_unittest.cc">
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Debug|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						Optimization="1"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""
 | 
			
		||||
						BasicRuntimeChecks="0"
 | 
			
		||||
						UsePrecompiledHeader="0"
 | 
			
		||||
						DebugInformationFormat="3"/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
				<FileConfiguration
 | 
			
		||||
					Name="Release|Win32">
 | 
			
		||||
					<Tool
 | 
			
		||||
						Name="VCCLCompilerTool"
 | 
			
		||||
						AdditionalIncludeDirectories=""..";"..\include""
 | 
			
		||||
						UsePrecompiledHeader="0"/>
 | 
			
		||||
				</FileConfiguration>
 | 
			
		||||
			</File>
 | 
			
		||||
		</Filter>
 | 
			
		||||
		<Filter
 | 
			
		||||
			Name="Header Files"
 | 
			
		||||
			Filter="h;hpp;hxx;hm;inl;inc;xsd"
 | 
			
		||||
			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
 | 
			
		||||
		</Filter>
 | 
			
		||||
	</Files>
 | 
			
		||||
	<Globals>
 | 
			
		||||
	</Globals>
 | 
			
		||||
</VisualStudioProject>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,123 +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)
 | 
			
		||||
// Author: vladl@google.com (Vlad Losev)
 | 
			
		||||
 | 
			
		||||
// This provides interface PrimeTable that determines whether a number is a
 | 
			
		||||
// prime and determines a next prime number. This interface is used
 | 
			
		||||
// in Google Test samples demonstrating use of parameterized tests.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_SAMPLES_PRIME_TABLES_H_
 | 
			
		||||
#define GTEST_SAMPLES_PRIME_TABLES_H_
 | 
			
		||||
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
 | 
			
		||||
// The prime table interface.
 | 
			
		||||
class PrimeTable {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual ~PrimeTable() {}
 | 
			
		||||
 | 
			
		||||
  // Returns true iff n is a prime number.
 | 
			
		||||
  virtual bool IsPrime(int n) const = 0;
 | 
			
		||||
 | 
			
		||||
  // Returns the smallest prime number greater than p; or returns -1
 | 
			
		||||
  // if the next prime is beyond the capacity of the table.
 | 
			
		||||
  virtual int GetNextPrime(int p) const = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Implementation #1 calculates the primes on-the-fly.
 | 
			
		||||
class OnTheFlyPrimeTable : public PrimeTable {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual bool IsPrime(int n) const {
 | 
			
		||||
    if (n <= 1) return false;
 | 
			
		||||
 | 
			
		||||
    for (int i = 2; i*i <= n; i++) {
 | 
			
		||||
      // n is divisible by an integer other than 1 and itself.
 | 
			
		||||
      if ((n % i) == 0) return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual int GetNextPrime(int p) const {
 | 
			
		||||
    for (int n = p + 1; n > 0; n++) {
 | 
			
		||||
      if (IsPrime(n)) return n;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return -1;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Implementation #2 pre-calculates the primes and stores the result
 | 
			
		||||
// in an array.
 | 
			
		||||
class PreCalculatedPrimeTable : public PrimeTable {
 | 
			
		||||
 public:
 | 
			
		||||
  // 'max' specifies the maximum number the prime table holds.
 | 
			
		||||
  explicit PreCalculatedPrimeTable(int max)
 | 
			
		||||
      : is_prime_size_(max + 1), is_prime_(new bool[max + 1]) {
 | 
			
		||||
    CalculatePrimesUpTo(max);
 | 
			
		||||
  }
 | 
			
		||||
  virtual ~PreCalculatedPrimeTable() { delete[] is_prime_; }
 | 
			
		||||
 | 
			
		||||
  virtual bool IsPrime(int n) const {
 | 
			
		||||
    return 0 <= n && n < is_prime_size_ && is_prime_[n];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual int GetNextPrime(int p) const {
 | 
			
		||||
    for (int n = p + 1; n < is_prime_size_; n++) {
 | 
			
		||||
      if (is_prime_[n]) return n;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return -1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  void CalculatePrimesUpTo(int max) {
 | 
			
		||||
    ::std::fill(is_prime_, is_prime_ + is_prime_size_, true);
 | 
			
		||||
    is_prime_[0] = is_prime_[1] = false;
 | 
			
		||||
 | 
			
		||||
    for (int i = 2; i <= max; i++) {
 | 
			
		||||
      if (!is_prime_[i]) continue;
 | 
			
		||||
 | 
			
		||||
      // Marks all multiples of i (except i itself) as non-prime.
 | 
			
		||||
      for (int j = 2*i; j <= max; j += i) {
 | 
			
		||||
        is_prime_[j] = false;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const int is_prime_size_;
 | 
			
		||||
  bool* const is_prime_;
 | 
			
		||||
 | 
			
		||||
  // Disables compiler warning "assignment operator could not be generated."
 | 
			
		||||
  void operator=(const PreCalculatedPrimeTable& rhs);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_SAMPLES_PRIME_TABLES_H_
 | 
			
		||||
| 
						 | 
				
			
			@ -1,68 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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.
 | 
			
		||||
 | 
			
		||||
// A sample program demonstrating using Google C++ testing framework.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
#include "sample1.h"
 | 
			
		||||
 | 
			
		||||
// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
 | 
			
		||||
int Factorial(int n) {
 | 
			
		||||
  int result = 1;
 | 
			
		||||
  for (int i = 1; i <= n; i++) {
 | 
			
		||||
    result *= i;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns true iff n is a prime number.
 | 
			
		||||
bool IsPrime(int n) {
 | 
			
		||||
  // Trivial case 1: small numbers
 | 
			
		||||
  if (n <= 1) return false;
 | 
			
		||||
 | 
			
		||||
  // Trivial case 2: even numbers
 | 
			
		||||
  if (n % 2 == 0) return n == 2;
 | 
			
		||||
 | 
			
		||||
  // Now, we have that n is odd and n >= 3.
 | 
			
		||||
 | 
			
		||||
  // Try to divide n by every odd number i, starting from 3
 | 
			
		||||
  for (int i = 3; ; i += 2) {
 | 
			
		||||
    // We only have to try i up to the squre root of n
 | 
			
		||||
    if (i > n/i) break;
 | 
			
		||||
 | 
			
		||||
    // Now, we have i <= n/i < n.
 | 
			
		||||
    // If n is divisible by i, n is not prime.
 | 
			
		||||
    if (n % i == 0) return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // n has no integer factor in the range (1, n), and thus is prime.
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,43 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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.
 | 
			
		||||
 | 
			
		||||
// A sample program demonstrating using Google C++ testing framework.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_SAMPLES_SAMPLE1_H_
 | 
			
		||||
#define GTEST_SAMPLES_SAMPLE1_H_
 | 
			
		||||
 | 
			
		||||
// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
 | 
			
		||||
int Factorial(int n);
 | 
			
		||||
 | 
			
		||||
// Returns true iff n is a prime number.
 | 
			
		||||
bool IsPrime(int n);
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_SAMPLES_SAMPLE1_H_
 | 
			
		||||
| 
						 | 
				
			
			@ -1,144 +0,0 @@
 | 
			
		|||
// 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.
 | 
			
		||||
//
 | 
			
		||||
// Author: vladl@google.com (Vlad Losev)
 | 
			
		||||
 | 
			
		||||
// This sample shows how to use Google Test listener API to implement
 | 
			
		||||
// a primitive leak checker.
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
using ::testing::EmptyTestEventListener;
 | 
			
		||||
using ::testing::InitGoogleTest;
 | 
			
		||||
using ::testing::Test;
 | 
			
		||||
using ::testing::TestCase;
 | 
			
		||||
using ::testing::TestEventListeners;
 | 
			
		||||
using ::testing::TestInfo;
 | 
			
		||||
using ::testing::TestPartResult;
 | 
			
		||||
using ::testing::UnitTest;
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
// We will track memory used by this class.
 | 
			
		||||
class Water {
 | 
			
		||||
 public:
 | 
			
		||||
  // Normal Water declarations go here.
 | 
			
		||||
 | 
			
		||||
  // operator new and operator delete help us control water allocation.
 | 
			
		||||
  void* operator new(size_t allocation_size) {
 | 
			
		||||
    allocated_++;
 | 
			
		||||
    return malloc(allocation_size);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void operator delete(void* block, size_t /* allocation_size */) {
 | 
			
		||||
    allocated_--;
 | 
			
		||||
    free(block);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static int allocated() { return allocated_; }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  static int allocated_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int Water::allocated_ = 0;
 | 
			
		||||
 | 
			
		||||
// This event listener monitors how many Water objects are created and
 | 
			
		||||
// destroyed by each test, and reports a failure if a test leaks some Water
 | 
			
		||||
// objects. It does this by comparing the number of live Water objects at
 | 
			
		||||
// the beginning of a test and at the end of a test.
 | 
			
		||||
class LeakChecker : public EmptyTestEventListener {
 | 
			
		||||
 private:
 | 
			
		||||
  // Called before a test starts.
 | 
			
		||||
  virtual void OnTestStart(const TestInfo& /* test_info */) {
 | 
			
		||||
    initially_allocated_ = Water::allocated();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Called after a test ends.
 | 
			
		||||
  virtual void OnTestEnd(const TestInfo& /* test_info */) {
 | 
			
		||||
    int difference = Water::allocated() - initially_allocated_;
 | 
			
		||||
 | 
			
		||||
    // You can generate a failure in any event handler except
 | 
			
		||||
    // OnTestPartResult. Just use an appropriate Google Test assertion to do
 | 
			
		||||
    // it.
 | 
			
		||||
    EXPECT_LE(difference, 0) << "Leaked " << difference << " unit(s) of Water!";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int initially_allocated_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST(ListenersTest, DoesNotLeak) {
 | 
			
		||||
  Water* water = new Water;
 | 
			
		||||
  delete water;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This should fail when the --check_for_leaks command line flag is
 | 
			
		||||
// specified.
 | 
			
		||||
TEST(ListenersTest, LeaksWater) {
 | 
			
		||||
  Water* water = new Water;
 | 
			
		||||
  EXPECT_TRUE(water != NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  bool check_for_leaks = false;
 | 
			
		||||
  if (argc > 1 && strcmp(argv[1], "--check_for_leaks") == 0 )
 | 
			
		||||
    check_for_leaks = true;
 | 
			
		||||
  else
 | 
			
		||||
    printf("%s\n", "Run this program with --check_for_leaks to enable "
 | 
			
		||||
           "custom leak checking in the tests.");
 | 
			
		||||
 | 
			
		||||
  // If we are given the --check_for_leaks command line flag, installs the
 | 
			
		||||
  // leak checker.
 | 
			
		||||
  if (check_for_leaks) {
 | 
			
		||||
    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
 | 
			
		||||
 | 
			
		||||
    // Adds the leak checker to the end of the test event listener list,
 | 
			
		||||
    // after the default text output printer and the default XML report
 | 
			
		||||
    // generator.
 | 
			
		||||
    //
 | 
			
		||||
    // The order is important - it ensures that failures generated in the
 | 
			
		||||
    // leak checker's OnTestEnd() method are processed by the text and XML
 | 
			
		||||
    // printers *before* their OnTestEnd() methods are called, such that
 | 
			
		||||
    // they are attributed to the right test. Remember that a listener
 | 
			
		||||
    // receives an OnXyzStart event *after* listeners preceding it in the
 | 
			
		||||
    // list received that event, and receives an OnXyzEnd event *before*
 | 
			
		||||
    // listeners preceding it.
 | 
			
		||||
    //
 | 
			
		||||
    // We don't need to worry about deleting the new listener later, as
 | 
			
		||||
    // Google Test will do it.
 | 
			
		||||
    listeners.Append(new LeakChecker);
 | 
			
		||||
  }
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,153 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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.
 | 
			
		||||
 | 
			
		||||
// A sample program demonstrating using Google C++ testing framework.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// This sample shows how to write a simple unit test for a function,
 | 
			
		||||
// using Google C++ testing framework.
 | 
			
		||||
//
 | 
			
		||||
// Writing a unit test using Google C++ testing framework is easy as 1-2-3:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Step 1. Include necessary header files such that the stuff your
 | 
			
		||||
// test logic needs is declared.
 | 
			
		||||
//
 | 
			
		||||
// Don't forget gtest.h, which declares the testing framework.
 | 
			
		||||
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include "sample1.h"
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Step 2. Use the TEST macro to define your tests.
 | 
			
		||||
//
 | 
			
		||||
// TEST has two parameters: the test case name and the test name.
 | 
			
		||||
// After using the macro, you should define your test logic between a
 | 
			
		||||
// pair of braces.  You can use a bunch of macros to indicate the
 | 
			
		||||
// success or failure of a test.  EXPECT_TRUE and EXPECT_EQ are
 | 
			
		||||
// examples of such macros.  For a complete list, see gtest.h.
 | 
			
		||||
//
 | 
			
		||||
// <TechnicalDetails>
 | 
			
		||||
//
 | 
			
		||||
// In Google Test, tests are grouped into test cases.  This is how we
 | 
			
		||||
// keep test code organized.  You should put logically related tests
 | 
			
		||||
// into the same test case.
 | 
			
		||||
//
 | 
			
		||||
// The test case name and the test name should both be valid C++
 | 
			
		||||
// identifiers.  And you should not use underscore (_) in the names.
 | 
			
		||||
//
 | 
			
		||||
// Google Test guarantees that each test you define is run exactly
 | 
			
		||||
// once, but it makes no guarantee on the order the tests are
 | 
			
		||||
// executed.  Therefore, you should write your tests in such a way
 | 
			
		||||
// that their results don't depend on their order.
 | 
			
		||||
//
 | 
			
		||||
// </TechnicalDetails>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Tests Factorial().
 | 
			
		||||
 | 
			
		||||
// Tests factorial of negative numbers.
 | 
			
		||||
TEST(FactorialTest, Negative) {
 | 
			
		||||
  // This test is named "Negative", and belongs to the "FactorialTest"
 | 
			
		||||
  // test case.
 | 
			
		||||
  EXPECT_EQ(1, Factorial(-5));
 | 
			
		||||
  EXPECT_EQ(1, Factorial(-1));
 | 
			
		||||
  EXPECT_GT(Factorial(-10), 0);
 | 
			
		||||
 | 
			
		||||
  // <TechnicalDetails>
 | 
			
		||||
  //
 | 
			
		||||
  // EXPECT_EQ(expected, actual) is the same as
 | 
			
		||||
  //
 | 
			
		||||
  //   EXPECT_TRUE((expected) == (actual))
 | 
			
		||||
  //
 | 
			
		||||
  // except that it will print both the expected value and the actual
 | 
			
		||||
  // value when the assertion fails.  This is very helpful for
 | 
			
		||||
  // debugging.  Therefore in this case EXPECT_EQ is preferred.
 | 
			
		||||
  //
 | 
			
		||||
  // On the other hand, EXPECT_TRUE accepts any Boolean expression,
 | 
			
		||||
  // and is thus more general.
 | 
			
		||||
  //
 | 
			
		||||
  // </TechnicalDetails>
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests factorial of 0.
 | 
			
		||||
TEST(FactorialTest, Zero) {
 | 
			
		||||
  EXPECT_EQ(1, Factorial(0));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests factorial of positive numbers.
 | 
			
		||||
TEST(FactorialTest, Positive) {
 | 
			
		||||
  EXPECT_EQ(1, Factorial(1));
 | 
			
		||||
  EXPECT_EQ(2, Factorial(2));
 | 
			
		||||
  EXPECT_EQ(6, Factorial(3));
 | 
			
		||||
  EXPECT_EQ(40320, Factorial(8));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Tests IsPrime()
 | 
			
		||||
 | 
			
		||||
// Tests negative input.
 | 
			
		||||
TEST(IsPrimeTest, Negative) {
 | 
			
		||||
  // This test belongs to the IsPrimeTest test case.
 | 
			
		||||
 | 
			
		||||
  EXPECT_FALSE(IsPrime(-1));
 | 
			
		||||
  EXPECT_FALSE(IsPrime(-2));
 | 
			
		||||
  EXPECT_FALSE(IsPrime(INT_MIN));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests some trivial cases.
 | 
			
		||||
TEST(IsPrimeTest, Trivial) {
 | 
			
		||||
  EXPECT_FALSE(IsPrime(0));
 | 
			
		||||
  EXPECT_FALSE(IsPrime(1));
 | 
			
		||||
  EXPECT_TRUE(IsPrime(2));
 | 
			
		||||
  EXPECT_TRUE(IsPrime(3));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests positive input.
 | 
			
		||||
TEST(IsPrimeTest, Positive) {
 | 
			
		||||
  EXPECT_FALSE(IsPrime(4));
 | 
			
		||||
  EXPECT_TRUE(IsPrime(5));
 | 
			
		||||
  EXPECT_FALSE(IsPrime(6));
 | 
			
		||||
  EXPECT_TRUE(IsPrime(23));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Step 3. Call RUN_ALL_TESTS() in main().
 | 
			
		||||
//
 | 
			
		||||
// We do this by linking in src/gtest_main.cc file, which consists of
 | 
			
		||||
// a main() function which calls RUN_ALL_TESTS() for us.
 | 
			
		||||
//
 | 
			
		||||
// This runs all the tests you've defined, prints the result, and
 | 
			
		||||
// returns 0 if successful, or 1 otherwise.
 | 
			
		||||
//
 | 
			
		||||
// Did you notice that we didn't register the tests?  The
 | 
			
		||||
// RUN_ALL_TESTS() macro magically knows about all the tests we
 | 
			
		||||
// defined.  Isn't this convenient?
 | 
			
		||||
| 
						 | 
				
			
			@ -1,56 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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.
 | 
			
		||||
 | 
			
		||||
// A sample program demonstrating using Google C++ testing framework.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
#include "sample2.h"
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
// Clones a 0-terminated C string, allocating memory using new.
 | 
			
		||||
const char* MyString::CloneCString(const char* a_c_string) {
 | 
			
		||||
  if (a_c_string == NULL) return NULL;
 | 
			
		||||
 | 
			
		||||
  const size_t len = strlen(a_c_string);
 | 
			
		||||
  char* const clone = new char[ len + 1 ];
 | 
			
		||||
  memcpy(clone, a_c_string, len + 1);
 | 
			
		||||
 | 
			
		||||
  return clone;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Sets the 0-terminated C string this MyString object
 | 
			
		||||
// represents.
 | 
			
		||||
void MyString::Set(const char* a_c_string) {
 | 
			
		||||
  // Makes sure this works when c_string == c_string_
 | 
			
		||||
  const char* const temp = MyString::CloneCString(a_c_string);
 | 
			
		||||
  delete[] c_string_;
 | 
			
		||||
  c_string_ = temp;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,85 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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.
 | 
			
		||||
 | 
			
		||||
// A sample program demonstrating using Google C++ testing framework.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_SAMPLES_SAMPLE2_H_
 | 
			
		||||
#define GTEST_SAMPLES_SAMPLE2_H_
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// A simple string class.
 | 
			
		||||
class MyString {
 | 
			
		||||
 private:
 | 
			
		||||
  const char* c_string_;
 | 
			
		||||
  const MyString& operator=(const MyString& rhs);
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  // Clones a 0-terminated C string, allocating memory using new.
 | 
			
		||||
  static const char* CloneCString(const char* a_c_string);
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////////////////////////////////////
 | 
			
		||||
  //
 | 
			
		||||
  // C'tors
 | 
			
		||||
 | 
			
		||||
  // The default c'tor constructs a NULL string.
 | 
			
		||||
  MyString() : c_string_(NULL) {}
 | 
			
		||||
 | 
			
		||||
  // Constructs a MyString by cloning a 0-terminated C string.
 | 
			
		||||
  explicit MyString(const char* a_c_string) : c_string_(NULL) {
 | 
			
		||||
    Set(a_c_string);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Copy c'tor
 | 
			
		||||
  MyString(const MyString& string) : c_string_(NULL) {
 | 
			
		||||
    Set(string.c_string_);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////////////////////////////////////
 | 
			
		||||
  //
 | 
			
		||||
  // D'tor.  MyString is intended to be a final class, so the d'tor
 | 
			
		||||
  // doesn't need to be virtual.
 | 
			
		||||
  ~MyString() { delete[] c_string_; }
 | 
			
		||||
 | 
			
		||||
  // Gets the 0-terminated C string this MyString object represents.
 | 
			
		||||
  const char* c_string() const { return c_string_; }
 | 
			
		||||
 | 
			
		||||
  size_t Length() const {
 | 
			
		||||
    return c_string_ == NULL ? 0 : strlen(c_string_);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Sets the 0-terminated C string this MyString object represents.
 | 
			
		||||
  void Set(const char* c_string);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_SAMPLES_SAMPLE2_H_
 | 
			
		||||
| 
						 | 
				
			
			@ -1,109 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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.
 | 
			
		||||
 | 
			
		||||
// A sample program demonstrating using Google C++ testing framework.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// This sample shows how to write a more complex unit test for a class
 | 
			
		||||
// that has multiple member functions.
 | 
			
		||||
//
 | 
			
		||||
// Usually, it's a good idea to have one test for each method in your
 | 
			
		||||
// class.  You don't have to do that exactly, but it helps to keep
 | 
			
		||||
// your tests organized.  You may also throw in additional tests as
 | 
			
		||||
// needed.
 | 
			
		||||
 | 
			
		||||
#include "sample2.h"
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
// In this example, we test the MyString class (a simple string).
 | 
			
		||||
 | 
			
		||||
// Tests the default c'tor.
 | 
			
		||||
TEST(MyString, DefaultConstructor) {
 | 
			
		||||
  const MyString s;
 | 
			
		||||
 | 
			
		||||
  // Asserts that s.c_string() returns NULL.
 | 
			
		||||
  //
 | 
			
		||||
  // <TechnicalDetails>
 | 
			
		||||
  //
 | 
			
		||||
  // If we write NULL instead of
 | 
			
		||||
  //
 | 
			
		||||
  //   static_cast<const char *>(NULL)
 | 
			
		||||
  //
 | 
			
		||||
  // in this assertion, it will generate a warning on gcc 3.4.  The
 | 
			
		||||
  // reason is that EXPECT_EQ needs to know the types of its
 | 
			
		||||
  // arguments in order to print them when it fails.  Since NULL is
 | 
			
		||||
  // #defined as 0, the compiler will use the formatter function for
 | 
			
		||||
  // int to print it.  However, gcc thinks that NULL should be used as
 | 
			
		||||
  // a pointer, not an int, and therefore complains.
 | 
			
		||||
  //
 | 
			
		||||
  // The root of the problem is C++'s lack of distinction between the
 | 
			
		||||
  // integer number 0 and the null pointer constant.  Unfortunately,
 | 
			
		||||
  // we have to live with this fact.
 | 
			
		||||
  //
 | 
			
		||||
  // </TechnicalDetails>
 | 
			
		||||
  EXPECT_STREQ(NULL, s.c_string());
 | 
			
		||||
 | 
			
		||||
  EXPECT_EQ(0u, s.Length());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char kHelloString[] = "Hello, world!";
 | 
			
		||||
 | 
			
		||||
// Tests the c'tor that accepts a C string.
 | 
			
		||||
TEST(MyString, ConstructorFromCString) {
 | 
			
		||||
  const MyString s(kHelloString);
 | 
			
		||||
  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
 | 
			
		||||
  EXPECT_EQ(sizeof(kHelloString)/sizeof(kHelloString[0]) - 1,
 | 
			
		||||
            s.Length());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests the copy c'tor.
 | 
			
		||||
TEST(MyString, CopyConstructor) {
 | 
			
		||||
  const MyString s1(kHelloString);
 | 
			
		||||
  const MyString s2 = s1;
 | 
			
		||||
  EXPECT_EQ(0, strcmp(s2.c_string(), kHelloString));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests the Set method.
 | 
			
		||||
TEST(MyString, Set) {
 | 
			
		||||
  MyString s;
 | 
			
		||||
 | 
			
		||||
  s.Set(kHelloString);
 | 
			
		||||
  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
 | 
			
		||||
 | 
			
		||||
  // Set should work when the input pointer is the same as the one
 | 
			
		||||
  // already in the MyString object.
 | 
			
		||||
  s.Set(s.c_string());
 | 
			
		||||
  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
 | 
			
		||||
 | 
			
		||||
  // Can we set the MyString to NULL?
 | 
			
		||||
  s.Set(NULL);
 | 
			
		||||
  EXPECT_STREQ(NULL, s.c_string());
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,172 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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.
 | 
			
		||||
 | 
			
		||||
// A sample program demonstrating using Google C++ testing framework.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_SAMPLES_SAMPLE3_INL_H_
 | 
			
		||||
#define GTEST_SAMPLES_SAMPLE3_INL_H_
 | 
			
		||||
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Queue is a simple queue implemented as a singled-linked list.
 | 
			
		||||
//
 | 
			
		||||
// The element type must support copy constructor.
 | 
			
		||||
template <typename E>  // E is the element type
 | 
			
		||||
class Queue;
 | 
			
		||||
 | 
			
		||||
// QueueNode is a node in a Queue, which consists of an element of
 | 
			
		||||
// type E and a pointer to the next node.
 | 
			
		||||
template <typename E>  // E is the element type
 | 
			
		||||
class QueueNode {
 | 
			
		||||
  friend class Queue<E>;
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  // Gets the element in this node.
 | 
			
		||||
  const E& element() const { return element_; }
 | 
			
		||||
 | 
			
		||||
  // Gets the next node in the queue.
 | 
			
		||||
  QueueNode* next() { return next_; }
 | 
			
		||||
  const QueueNode* next() const { return next_; }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // Creates a node with a given element value.  The next pointer is
 | 
			
		||||
  // set to NULL.
 | 
			
		||||
  explicit QueueNode(const E& an_element) : element_(an_element), next_(NULL) {}
 | 
			
		||||
 | 
			
		||||
  // We disable the default assignment operator and copy c'tor.
 | 
			
		||||
  const QueueNode& operator = (const QueueNode&);
 | 
			
		||||
  QueueNode(const QueueNode&);
 | 
			
		||||
 | 
			
		||||
  E element_;
 | 
			
		||||
  QueueNode* next_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename E>  // E is the element type.
 | 
			
		||||
class Queue {
 | 
			
		||||
 public:
 | 
			
		||||
  // Creates an empty queue.
 | 
			
		||||
  Queue() : head_(NULL), last_(NULL), size_(0) {}
 | 
			
		||||
 | 
			
		||||
  // D'tor.  Clears the queue.
 | 
			
		||||
  ~Queue() { Clear(); }
 | 
			
		||||
 | 
			
		||||
  // Clears the queue.
 | 
			
		||||
  void Clear() {
 | 
			
		||||
    if (size_ > 0) {
 | 
			
		||||
      // 1. Deletes every node.
 | 
			
		||||
      QueueNode<E>* node = head_;
 | 
			
		||||
      QueueNode<E>* next = node->next();
 | 
			
		||||
      for (; ;) {
 | 
			
		||||
        delete node;
 | 
			
		||||
        node = next;
 | 
			
		||||
        if (node == NULL) break;
 | 
			
		||||
        next = node->next();
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // 2. Resets the member variables.
 | 
			
		||||
      head_ = last_ = NULL;
 | 
			
		||||
      size_ = 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Gets the number of elements.
 | 
			
		||||
  size_t Size() const { return size_; }
 | 
			
		||||
 | 
			
		||||
  // Gets the first element of the queue, or NULL if the queue is empty.
 | 
			
		||||
  QueueNode<E>* Head() { return head_; }
 | 
			
		||||
  const QueueNode<E>* Head() const { return head_; }
 | 
			
		||||
 | 
			
		||||
  // Gets the last element of the queue, or NULL if the queue is empty.
 | 
			
		||||
  QueueNode<E>* Last() { return last_; }
 | 
			
		||||
  const QueueNode<E>* Last() const { return last_; }
 | 
			
		||||
 | 
			
		||||
  // Adds an element to the end of the queue.  A copy of the element is
 | 
			
		||||
  // created using the copy constructor, and then stored in the queue.
 | 
			
		||||
  // Changes made to the element in the queue doesn't affect the source
 | 
			
		||||
  // object, and vice versa.
 | 
			
		||||
  void Enqueue(const E& element) {
 | 
			
		||||
    QueueNode<E>* new_node = new QueueNode<E>(element);
 | 
			
		||||
 | 
			
		||||
    if (size_ == 0) {
 | 
			
		||||
      head_ = last_ = new_node;
 | 
			
		||||
      size_ = 1;
 | 
			
		||||
    } else {
 | 
			
		||||
      last_->next_ = new_node;
 | 
			
		||||
      last_ = new_node;
 | 
			
		||||
      size_++;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Removes the head of the queue and returns it.  Returns NULL if
 | 
			
		||||
  // the queue is empty.
 | 
			
		||||
  E* Dequeue() {
 | 
			
		||||
    if (size_ == 0) {
 | 
			
		||||
      return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const QueueNode<E>* const old_head = head_;
 | 
			
		||||
    head_ = head_->next_;
 | 
			
		||||
    size_--;
 | 
			
		||||
    if (size_ == 0) {
 | 
			
		||||
      last_ = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    E* element = new E(old_head->element());
 | 
			
		||||
    delete old_head;
 | 
			
		||||
 | 
			
		||||
    return element;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Applies a function/functor on each element of the queue, and
 | 
			
		||||
  // returns the result in a new queue.  The original queue is not
 | 
			
		||||
  // affected.
 | 
			
		||||
  template <typename F>
 | 
			
		||||
  Queue* Map(F function) const {
 | 
			
		||||
    Queue* new_queue = new Queue();
 | 
			
		||||
    for (const QueueNode<E>* node = head_; node != NULL; node = node->next_) {
 | 
			
		||||
      new_queue->Enqueue(function(node->element()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return new_queue;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  QueueNode<E>* head_;  // The first node of the queue.
 | 
			
		||||
  QueueNode<E>* last_;  // The last node of the queue.
 | 
			
		||||
  size_t size_;  // The number of elements in the queue.
 | 
			
		||||
 | 
			
		||||
  // We disallow copying a queue.
 | 
			
		||||
  Queue(const Queue&);
 | 
			
		||||
  const Queue& operator = (const Queue&);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_SAMPLES_SAMPLE3_INL_H_
 | 
			
		||||
| 
						 | 
				
			
			@ -1,151 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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.
 | 
			
		||||
 | 
			
		||||
// A sample program demonstrating using Google C++ testing framework.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// In this example, we use a more advanced feature of Google Test called
 | 
			
		||||
// test fixture.
 | 
			
		||||
//
 | 
			
		||||
// A test fixture is a place to hold objects and functions shared by
 | 
			
		||||
// all tests in a test case.  Using a test fixture avoids duplicating
 | 
			
		||||
// the test code necessary to initialize and cleanup those common
 | 
			
		||||
// objects for each test.  It is also useful for defining sub-routines
 | 
			
		||||
// that your tests need to invoke a lot.
 | 
			
		||||
//
 | 
			
		||||
// <TechnicalDetails>
 | 
			
		||||
//
 | 
			
		||||
// The tests share the test fixture in the sense of code sharing, not
 | 
			
		||||
// data sharing.  Each test is given its own fresh copy of the
 | 
			
		||||
// fixture.  You cannot expect the data modified by one test to be
 | 
			
		||||
// passed on to another test, which is a bad idea.
 | 
			
		||||
//
 | 
			
		||||
// The reason for this design is that tests should be independent and
 | 
			
		||||
// repeatable.  In particular, a test should not fail as the result of
 | 
			
		||||
// another test's failure.  If one test depends on info produced by
 | 
			
		||||
// another test, then the two tests should really be one big test.
 | 
			
		||||
//
 | 
			
		||||
// The macros for indicating the success/failure of a test
 | 
			
		||||
// (EXPECT_TRUE, FAIL, etc) need to know what the current test is
 | 
			
		||||
// (when Google Test prints the test result, it tells you which test
 | 
			
		||||
// each failure belongs to).  Technically, these macros invoke a
 | 
			
		||||
// member function of the Test class.  Therefore, you cannot use them
 | 
			
		||||
// in a global function.  That's why you should put test sub-routines
 | 
			
		||||
// in a test fixture.
 | 
			
		||||
//
 | 
			
		||||
// </TechnicalDetails>
 | 
			
		||||
 | 
			
		||||
#include "sample3-inl.h"
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
// To use a test fixture, derive a class from testing::Test.
 | 
			
		||||
class QueueTest : public testing::Test {
 | 
			
		||||
 protected:  // You should make the members protected s.t. they can be
 | 
			
		||||
             // accessed from sub-classes.
 | 
			
		||||
 | 
			
		||||
  // virtual void SetUp() will be called before each test is run.  You
 | 
			
		||||
  // should define it if you need to initialize the varaibles.
 | 
			
		||||
  // Otherwise, this can be skipped.
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    q1_.Enqueue(1);
 | 
			
		||||
    q2_.Enqueue(2);
 | 
			
		||||
    q2_.Enqueue(3);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // virtual void TearDown() will be called after each test is run.
 | 
			
		||||
  // You should define it if there is cleanup work to do.  Otherwise,
 | 
			
		||||
  // you don't have to provide it.
 | 
			
		||||
  //
 | 
			
		||||
  // virtual void TearDown() {
 | 
			
		||||
  // }
 | 
			
		||||
 | 
			
		||||
  // A helper function that some test uses.
 | 
			
		||||
  static int Double(int n) {
 | 
			
		||||
    return 2*n;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // A helper function for testing Queue::Map().
 | 
			
		||||
  void MapTester(const Queue<int> * q) {
 | 
			
		||||
    // Creates a new queue, where each element is twice as big as the
 | 
			
		||||
    // corresponding one in q.
 | 
			
		||||
    const Queue<int> * const new_q = q->Map(Double);
 | 
			
		||||
 | 
			
		||||
    // Verifies that the new queue has the same size as q.
 | 
			
		||||
    ASSERT_EQ(q->Size(), new_q->Size());
 | 
			
		||||
 | 
			
		||||
    // Verifies the relationship between the elements of the two queues.
 | 
			
		||||
    for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head();
 | 
			
		||||
          n1 != NULL; n1 = n1->next(), n2 = n2->next() ) {
 | 
			
		||||
      EXPECT_EQ(2 * n1->element(), n2->element());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    delete new_q;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Declares the variables your tests want to use.
 | 
			
		||||
  Queue<int> q0_;
 | 
			
		||||
  Queue<int> q1_;
 | 
			
		||||
  Queue<int> q2_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// When you have a test fixture, you define a test using TEST_F
 | 
			
		||||
// instead of TEST.
 | 
			
		||||
 | 
			
		||||
// Tests the default c'tor.
 | 
			
		||||
TEST_F(QueueTest, DefaultConstructor) {
 | 
			
		||||
  // You can access data in the test fixture here.
 | 
			
		||||
  EXPECT_EQ(0u, q0_.Size());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests Dequeue().
 | 
			
		||||
TEST_F(QueueTest, Dequeue) {
 | 
			
		||||
  int * n = q0_.Dequeue();
 | 
			
		||||
  EXPECT_TRUE(n == NULL);
 | 
			
		||||
 | 
			
		||||
  n = q1_.Dequeue();
 | 
			
		||||
  ASSERT_TRUE(n != NULL);
 | 
			
		||||
  EXPECT_EQ(1, *n);
 | 
			
		||||
  EXPECT_EQ(0u, q1_.Size());
 | 
			
		||||
  delete n;
 | 
			
		||||
 | 
			
		||||
  n = q2_.Dequeue();
 | 
			
		||||
  ASSERT_TRUE(n != NULL);
 | 
			
		||||
  EXPECT_EQ(2, *n);
 | 
			
		||||
  EXPECT_EQ(1u, q2_.Size());
 | 
			
		||||
  delete n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests the Queue::Map() function.
 | 
			
		||||
TEST_F(QueueTest, Map) {
 | 
			
		||||
  MapTester(&q0_);
 | 
			
		||||
  MapTester(&q1_);
 | 
			
		||||
  MapTester(&q2_);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,46 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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.
 | 
			
		||||
 | 
			
		||||
// A sample program demonstrating using Google C++ testing framework.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include "sample4.h"
 | 
			
		||||
 | 
			
		||||
// Returns the current counter value, and increments it.
 | 
			
		||||
int Counter::Increment() {
 | 
			
		||||
  return counter_++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Prints the current counter value to STDOUT.
 | 
			
		||||
void Counter::Print() const {
 | 
			
		||||
  printf("%d", counter_);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,53 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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.
 | 
			
		||||
 | 
			
		||||
// A sample program demonstrating using Google C++ testing framework.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_SAMPLES_SAMPLE4_H_
 | 
			
		||||
#define GTEST_SAMPLES_SAMPLE4_H_
 | 
			
		||||
 | 
			
		||||
// A simple monotonic counter.
 | 
			
		||||
class Counter {
 | 
			
		||||
 private:
 | 
			
		||||
  int counter_;
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  // Creates a counter that starts at 0.
 | 
			
		||||
  Counter() : counter_(0) {}
 | 
			
		||||
 | 
			
		||||
  // Returns the current counter value, and increments it.
 | 
			
		||||
  int Increment();
 | 
			
		||||
 | 
			
		||||
  // Prints the current counter value to STDOUT.
 | 
			
		||||
  void Print() const;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_SAMPLES_SAMPLE4_H_
 | 
			
		||||
| 
						 | 
				
			
			@ -1,45 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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 "gtest/gtest.h"
 | 
			
		||||
#include "sample4.h"
 | 
			
		||||
 | 
			
		||||
// Tests the Increment() method.
 | 
			
		||||
TEST(Counter, Increment) {
 | 
			
		||||
  Counter c;
 | 
			
		||||
 | 
			
		||||
  // EXPECT_EQ() evaluates its arguments exactly once, so they
 | 
			
		||||
  // can have side effects.
 | 
			
		||||
 | 
			
		||||
  EXPECT_EQ(0, c.Increment());
 | 
			
		||||
  EXPECT_EQ(1, c.Increment());
 | 
			
		||||
  EXPECT_EQ(2, c.Increment());
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,199 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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)
 | 
			
		||||
 | 
			
		||||
// This sample teaches how to reuse a test fixture in multiple test
 | 
			
		||||
// cases by deriving sub-fixtures from it.
 | 
			
		||||
//
 | 
			
		||||
// When you define a test fixture, you specify the name of the test
 | 
			
		||||
// case that will use this fixture.  Therefore, a test fixture can
 | 
			
		||||
// be used by only one test case.
 | 
			
		||||
//
 | 
			
		||||
// Sometimes, more than one test cases may want to use the same or
 | 
			
		||||
// slightly different test fixtures.  For example, you may want to
 | 
			
		||||
// make sure that all tests for a GUI library don't leak important
 | 
			
		||||
// system resources like fonts and brushes.  In Google Test, you do
 | 
			
		||||
// this by putting the shared logic in a super (as in "super class")
 | 
			
		||||
// test fixture, and then have each test case use a fixture derived
 | 
			
		||||
// from this super fixture.
 | 
			
		||||
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include "sample3-inl.h"
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
#include "sample1.h"
 | 
			
		||||
 | 
			
		||||
// In this sample, we want to ensure that every test finishes within
 | 
			
		||||
// ~5 seconds.  If a test takes longer to run, we consider it a
 | 
			
		||||
// failure.
 | 
			
		||||
//
 | 
			
		||||
// We put the code for timing a test in a test fixture called
 | 
			
		||||
// "QuickTest".  QuickTest is intended to be the super fixture that
 | 
			
		||||
// other fixtures derive from, therefore there is no test case with
 | 
			
		||||
// the name "QuickTest".  This is OK.
 | 
			
		||||
//
 | 
			
		||||
// Later, we will derive multiple test fixtures from QuickTest.
 | 
			
		||||
class QuickTest : public testing::Test {
 | 
			
		||||
 protected:
 | 
			
		||||
  // Remember that SetUp() is run immediately before a test starts.
 | 
			
		||||
  // This is a good place to record the start time.
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    start_time_ = time(NULL);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // TearDown() is invoked immediately after a test finishes.  Here we
 | 
			
		||||
  // check if the test was too slow.
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    // Gets the time when the test finishes
 | 
			
		||||
    const time_t end_time = time(NULL);
 | 
			
		||||
 | 
			
		||||
    // Asserts that the test took no more than ~5 seconds.  Did you
 | 
			
		||||
    // know that you can use assertions in SetUp() and TearDown() as
 | 
			
		||||
    // well?
 | 
			
		||||
    EXPECT_TRUE(end_time - start_time_ <= 5) << "The test took too long.";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // The UTC time (in seconds) when the test starts
 | 
			
		||||
  time_t start_time_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// We derive a fixture named IntegerFunctionTest from the QuickTest
 | 
			
		||||
// fixture.  All tests using this fixture will be automatically
 | 
			
		||||
// required to be quick.
 | 
			
		||||
class IntegerFunctionTest : public QuickTest {
 | 
			
		||||
  // We don't need any more logic than already in the QuickTest fixture.
 | 
			
		||||
  // Therefore the body is empty.
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Now we can write tests in the IntegerFunctionTest test case.
 | 
			
		||||
 | 
			
		||||
// Tests Factorial()
 | 
			
		||||
TEST_F(IntegerFunctionTest, Factorial) {
 | 
			
		||||
  // Tests factorial of negative numbers.
 | 
			
		||||
  EXPECT_EQ(1, Factorial(-5));
 | 
			
		||||
  EXPECT_EQ(1, Factorial(-1));
 | 
			
		||||
  EXPECT_GT(Factorial(-10), 0);
 | 
			
		||||
 | 
			
		||||
  // Tests factorial of 0.
 | 
			
		||||
  EXPECT_EQ(1, Factorial(0));
 | 
			
		||||
 | 
			
		||||
  // Tests factorial of positive numbers.
 | 
			
		||||
  EXPECT_EQ(1, Factorial(1));
 | 
			
		||||
  EXPECT_EQ(2, Factorial(2));
 | 
			
		||||
  EXPECT_EQ(6, Factorial(3));
 | 
			
		||||
  EXPECT_EQ(40320, Factorial(8));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Tests IsPrime()
 | 
			
		||||
TEST_F(IntegerFunctionTest, IsPrime) {
 | 
			
		||||
  // Tests negative input.
 | 
			
		||||
  EXPECT_FALSE(IsPrime(-1));
 | 
			
		||||
  EXPECT_FALSE(IsPrime(-2));
 | 
			
		||||
  EXPECT_FALSE(IsPrime(INT_MIN));
 | 
			
		||||
 | 
			
		||||
  // Tests some trivial cases.
 | 
			
		||||
  EXPECT_FALSE(IsPrime(0));
 | 
			
		||||
  EXPECT_FALSE(IsPrime(1));
 | 
			
		||||
  EXPECT_TRUE(IsPrime(2));
 | 
			
		||||
  EXPECT_TRUE(IsPrime(3));
 | 
			
		||||
 | 
			
		||||
  // Tests positive input.
 | 
			
		||||
  EXPECT_FALSE(IsPrime(4));
 | 
			
		||||
  EXPECT_TRUE(IsPrime(5));
 | 
			
		||||
  EXPECT_FALSE(IsPrime(6));
 | 
			
		||||
  EXPECT_TRUE(IsPrime(23));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// The next test case (named "QueueTest") also needs to be quick, so
 | 
			
		||||
// we derive another fixture from QuickTest.
 | 
			
		||||
//
 | 
			
		||||
// The QueueTest test fixture has some logic and shared objects in
 | 
			
		||||
// addition to what's in QuickTest already.  We define the additional
 | 
			
		||||
// stuff inside the body of the test fixture, as usual.
 | 
			
		||||
class QueueTest : public QuickTest {
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    // First, we need to set up the super fixture (QuickTest).
 | 
			
		||||
    QuickTest::SetUp();
 | 
			
		||||
 | 
			
		||||
    // Second, some additional setup for this fixture.
 | 
			
		||||
    q1_.Enqueue(1);
 | 
			
		||||
    q2_.Enqueue(2);
 | 
			
		||||
    q2_.Enqueue(3);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // By default, TearDown() inherits the behavior of
 | 
			
		||||
  // QuickTest::TearDown().  As we have no additional cleaning work
 | 
			
		||||
  // for QueueTest, we omit it here.
 | 
			
		||||
  //
 | 
			
		||||
  // virtual void TearDown() {
 | 
			
		||||
  //   QuickTest::TearDown();
 | 
			
		||||
  // }
 | 
			
		||||
 | 
			
		||||
  Queue<int> q0_;
 | 
			
		||||
  Queue<int> q1_;
 | 
			
		||||
  Queue<int> q2_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Now, let's write tests using the QueueTest fixture.
 | 
			
		||||
 | 
			
		||||
// Tests the default constructor.
 | 
			
		||||
TEST_F(QueueTest, DefaultConstructor) {
 | 
			
		||||
  EXPECT_EQ(0u, q0_.Size());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests Dequeue().
 | 
			
		||||
TEST_F(QueueTest, Dequeue) {
 | 
			
		||||
  int* n = q0_.Dequeue();
 | 
			
		||||
  EXPECT_TRUE(n == NULL);
 | 
			
		||||
 | 
			
		||||
  n = q1_.Dequeue();
 | 
			
		||||
  EXPECT_TRUE(n != NULL);
 | 
			
		||||
  EXPECT_EQ(1, *n);
 | 
			
		||||
  EXPECT_EQ(0u, q1_.Size());
 | 
			
		||||
  delete n;
 | 
			
		||||
 | 
			
		||||
  n = q2_.Dequeue();
 | 
			
		||||
  EXPECT_TRUE(n != NULL);
 | 
			
		||||
  EXPECT_EQ(2, *n);
 | 
			
		||||
  EXPECT_EQ(1u, q2_.Size());
 | 
			
		||||
  delete n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// If necessary, you can derive further test fixtures from a derived
 | 
			
		||||
// fixture itself.  For example, you can derive another fixture from
 | 
			
		||||
// QueueTest.  Google Test imposes no limit on how deep the hierarchy
 | 
			
		||||
// can be.  In practice, however, you probably don't want it to be too
 | 
			
		||||
// deep as to be confusing.
 | 
			
		||||
| 
						 | 
				
			
			@ -1,224 +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)
 | 
			
		||||
 | 
			
		||||
// This sample shows how to test common properties of multiple
 | 
			
		||||
// implementations of the same interface (aka interface tests).
 | 
			
		||||
 | 
			
		||||
// The interface and its implementations are in this header.
 | 
			
		||||
#include "prime_tables.h"
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
// First, we define some factory functions for creating instances of
 | 
			
		||||
// the implementations.  You may be able to skip this step if all your
 | 
			
		||||
// implementations can be constructed the same way.
 | 
			
		||||
 | 
			
		||||
template <class T>
 | 
			
		||||
PrimeTable* CreatePrimeTable();
 | 
			
		||||
 | 
			
		||||
template <>
 | 
			
		||||
PrimeTable* CreatePrimeTable<OnTheFlyPrimeTable>() {
 | 
			
		||||
  return new OnTheFlyPrimeTable;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <>
 | 
			
		||||
PrimeTable* CreatePrimeTable<PreCalculatedPrimeTable>() {
 | 
			
		||||
  return new PreCalculatedPrimeTable(10000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Then we define a test fixture class template.
 | 
			
		||||
template <class T>
 | 
			
		||||
class PrimeTableTest : public testing::Test {
 | 
			
		||||
 protected:
 | 
			
		||||
  // The ctor calls the factory function to create a prime table
 | 
			
		||||
  // implemented by T.
 | 
			
		||||
  PrimeTableTest() : table_(CreatePrimeTable<T>()) {}
 | 
			
		||||
 | 
			
		||||
  virtual ~PrimeTableTest() { delete table_; }
 | 
			
		||||
 | 
			
		||||
  // Note that we test an implementation via the base interface
 | 
			
		||||
  // instead of the actual implementation class.  This is important
 | 
			
		||||
  // for keeping the tests close to the real world scenario, where the
 | 
			
		||||
  // implementation is invoked via the base interface.  It avoids
 | 
			
		||||
  // got-yas where the implementation class has a method that shadows
 | 
			
		||||
  // a method with the same name (but slightly different argument
 | 
			
		||||
  // types) in the base interface, for example.
 | 
			
		||||
  PrimeTable* const table_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST
 | 
			
		||||
 | 
			
		||||
using testing::Types;
 | 
			
		||||
 | 
			
		||||
// Google Test offers two ways for reusing tests for different types.
 | 
			
		||||
// The first is called "typed tests".  You should use it if you
 | 
			
		||||
// already know *all* the types you are gonna exercise when you write
 | 
			
		||||
// the tests.
 | 
			
		||||
 | 
			
		||||
// To write a typed test case, first use
 | 
			
		||||
//
 | 
			
		||||
//   TYPED_TEST_CASE(TestCaseName, TypeList);
 | 
			
		||||
//
 | 
			
		||||
// to declare it and specify the type parameters.  As with TEST_F,
 | 
			
		||||
// TestCaseName must match the test fixture name.
 | 
			
		||||
 | 
			
		||||
// The list of types we want to test.
 | 
			
		||||
typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable> Implementations;
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_CASE(PrimeTableTest, Implementations);
 | 
			
		||||
 | 
			
		||||
// Then use TYPED_TEST(TestCaseName, TestName) to define a typed test,
 | 
			
		||||
// similar to TEST_F.
 | 
			
		||||
TYPED_TEST(PrimeTableTest, ReturnsFalseForNonPrimes) {
 | 
			
		||||
  // Inside the test body, you can refer to the type parameter by
 | 
			
		||||
  // TypeParam, and refer to the fixture class by TestFixture.  We
 | 
			
		||||
  // don't need them in this example.
 | 
			
		||||
 | 
			
		||||
  // Since we are in the template world, C++ requires explicitly
 | 
			
		||||
  // writing 'this->' when referring to members of the fixture class.
 | 
			
		||||
  // This is something you have to learn to live with.
 | 
			
		||||
  EXPECT_FALSE(this->table_->IsPrime(-5));
 | 
			
		||||
  EXPECT_FALSE(this->table_->IsPrime(0));
 | 
			
		||||
  EXPECT_FALSE(this->table_->IsPrime(1));
 | 
			
		||||
  EXPECT_FALSE(this->table_->IsPrime(4));
 | 
			
		||||
  EXPECT_FALSE(this->table_->IsPrime(6));
 | 
			
		||||
  EXPECT_FALSE(this->table_->IsPrime(100));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TYPED_TEST(PrimeTableTest, ReturnsTrueForPrimes) {
 | 
			
		||||
  EXPECT_TRUE(this->table_->IsPrime(2));
 | 
			
		||||
  EXPECT_TRUE(this->table_->IsPrime(3));
 | 
			
		||||
  EXPECT_TRUE(this->table_->IsPrime(5));
 | 
			
		||||
  EXPECT_TRUE(this->table_->IsPrime(7));
 | 
			
		||||
  EXPECT_TRUE(this->table_->IsPrime(11));
 | 
			
		||||
  EXPECT_TRUE(this->table_->IsPrime(131));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TYPED_TEST(PrimeTableTest, CanGetNextPrime) {
 | 
			
		||||
  EXPECT_EQ(2, this->table_->GetNextPrime(0));
 | 
			
		||||
  EXPECT_EQ(3, this->table_->GetNextPrime(2));
 | 
			
		||||
  EXPECT_EQ(5, this->table_->GetNextPrime(3));
 | 
			
		||||
  EXPECT_EQ(7, this->table_->GetNextPrime(5));
 | 
			
		||||
  EXPECT_EQ(11, this->table_->GetNextPrime(7));
 | 
			
		||||
  EXPECT_EQ(131, this->table_->GetNextPrime(128));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// That's it!  Google Test will repeat each TYPED_TEST for each type
 | 
			
		||||
// in the type list specified in TYPED_TEST_CASE.  Sit back and be
 | 
			
		||||
// happy that you don't have to define them multiple times.
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST_P
 | 
			
		||||
 | 
			
		||||
using testing::Types;
 | 
			
		||||
 | 
			
		||||
// Sometimes, however, you don't yet know all the types that you want
 | 
			
		||||
// to test when you write the tests.  For example, if you are the
 | 
			
		||||
// author of an interface and expect other people to implement it, you
 | 
			
		||||
// might want to write a set of tests to make sure each implementation
 | 
			
		||||
// conforms to some basic requirements, but you don't know what
 | 
			
		||||
// implementations will be written in the future.
 | 
			
		||||
//
 | 
			
		||||
// How can you write the tests without committing to the type
 | 
			
		||||
// parameters?  That's what "type-parameterized tests" can do for you.
 | 
			
		||||
// It is a bit more involved than typed tests, but in return you get a
 | 
			
		||||
// test pattern that can be reused in many contexts, which is a big
 | 
			
		||||
// win.  Here's how you do it:
 | 
			
		||||
 | 
			
		||||
// First, define a test fixture class template.  Here we just reuse
 | 
			
		||||
// the PrimeTableTest fixture defined earlier:
 | 
			
		||||
 | 
			
		||||
template <class T>
 | 
			
		||||
class PrimeTableTest2 : public PrimeTableTest<T> {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Then, declare the test case.  The argument is the name of the test
 | 
			
		||||
// fixture, and also the name of the test case (as usual).  The _P
 | 
			
		||||
// suffix is for "parameterized" or "pattern".
 | 
			
		||||
TYPED_TEST_CASE_P(PrimeTableTest2);
 | 
			
		||||
 | 
			
		||||
// Next, use TYPED_TEST_P(TestCaseName, TestName) to define a test,
 | 
			
		||||
// similar to what you do with TEST_F.
 | 
			
		||||
TYPED_TEST_P(PrimeTableTest2, ReturnsFalseForNonPrimes) {
 | 
			
		||||
  EXPECT_FALSE(this->table_->IsPrime(-5));
 | 
			
		||||
  EXPECT_FALSE(this->table_->IsPrime(0));
 | 
			
		||||
  EXPECT_FALSE(this->table_->IsPrime(1));
 | 
			
		||||
  EXPECT_FALSE(this->table_->IsPrime(4));
 | 
			
		||||
  EXPECT_FALSE(this->table_->IsPrime(6));
 | 
			
		||||
  EXPECT_FALSE(this->table_->IsPrime(100));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_P(PrimeTableTest2, ReturnsTrueForPrimes) {
 | 
			
		||||
  EXPECT_TRUE(this->table_->IsPrime(2));
 | 
			
		||||
  EXPECT_TRUE(this->table_->IsPrime(3));
 | 
			
		||||
  EXPECT_TRUE(this->table_->IsPrime(5));
 | 
			
		||||
  EXPECT_TRUE(this->table_->IsPrime(7));
 | 
			
		||||
  EXPECT_TRUE(this->table_->IsPrime(11));
 | 
			
		||||
  EXPECT_TRUE(this->table_->IsPrime(131));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_P(PrimeTableTest2, CanGetNextPrime) {
 | 
			
		||||
  EXPECT_EQ(2, this->table_->GetNextPrime(0));
 | 
			
		||||
  EXPECT_EQ(3, this->table_->GetNextPrime(2));
 | 
			
		||||
  EXPECT_EQ(5, this->table_->GetNextPrime(3));
 | 
			
		||||
  EXPECT_EQ(7, this->table_->GetNextPrime(5));
 | 
			
		||||
  EXPECT_EQ(11, this->table_->GetNextPrime(7));
 | 
			
		||||
  EXPECT_EQ(131, this->table_->GetNextPrime(128));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Type-parameterized tests involve one extra step: you have to
 | 
			
		||||
// enumerate the tests you defined:
 | 
			
		||||
REGISTER_TYPED_TEST_CASE_P(
 | 
			
		||||
    PrimeTableTest2,  // The first argument is the test case name.
 | 
			
		||||
    // The rest of the arguments are the test names.
 | 
			
		||||
    ReturnsFalseForNonPrimes, ReturnsTrueForPrimes, CanGetNextPrime);
 | 
			
		||||
 | 
			
		||||
// At this point the test pattern is done.  However, you don't have
 | 
			
		||||
// any real test yet as you haven't said which types you want to run
 | 
			
		||||
// the tests with.
 | 
			
		||||
 | 
			
		||||
// To turn the abstract test pattern into real tests, you instantiate
 | 
			
		||||
// it with a list of types.  Usually the test pattern will be defined
 | 
			
		||||
// in a .h file, and anyone can #include and instantiate it.  You can
 | 
			
		||||
// even instantiate it more than once in the same program.  To tell
 | 
			
		||||
// different instances apart, you give each of them a name, which will
 | 
			
		||||
// become part of the test case name and can be used in test filters.
 | 
			
		||||
 | 
			
		||||
// The list of types we want to test.  Note that it doesn't have to be
 | 
			
		||||
// defined at the time we write the TYPED_TEST_P()s.
 | 
			
		||||
typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable>
 | 
			
		||||
    PrimeTableImplementations;
 | 
			
		||||
INSTANTIATE_TYPED_TEST_CASE_P(OnTheFlyAndPreCalculated,    // Instance name
 | 
			
		||||
                              PrimeTableTest2,             // Test case name
 | 
			
		||||
                              PrimeTableImplementations);  // Type list
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST_P
 | 
			
		||||
| 
						 | 
				
			
			@ -1,130 +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: vladl@google.com (Vlad Losev)
 | 
			
		||||
 | 
			
		||||
// This sample shows how to test common properties of multiple
 | 
			
		||||
// implementations of an interface (aka interface tests) using
 | 
			
		||||
// value-parameterized tests. Each test in the test case has
 | 
			
		||||
// a parameter that is an interface pointer to an implementation
 | 
			
		||||
// tested.
 | 
			
		||||
 | 
			
		||||
// The interface and its implementations are in this header.
 | 
			
		||||
#include "prime_tables.h"
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
using ::testing::TestWithParam;
 | 
			
		||||
using ::testing::Values;
 | 
			
		||||
 | 
			
		||||
// As a general rule, to prevent a test from affecting the tests that come
 | 
			
		||||
// after it, you should create and destroy the tested objects for each test
 | 
			
		||||
// instead of reusing them.  In this sample we will define a simple factory
 | 
			
		||||
// function for PrimeTable objects.  We will instantiate objects in test's
 | 
			
		||||
// SetUp() method and delete them in TearDown() method.
 | 
			
		||||
typedef PrimeTable* CreatePrimeTableFunc();
 | 
			
		||||
 | 
			
		||||
PrimeTable* CreateOnTheFlyPrimeTable() {
 | 
			
		||||
  return new OnTheFlyPrimeTable();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <size_t max_precalculated>
 | 
			
		||||
PrimeTable* CreatePreCalculatedPrimeTable() {
 | 
			
		||||
  return new PreCalculatedPrimeTable(max_precalculated);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Inside the test body, fixture constructor, SetUp(), and TearDown() you
 | 
			
		||||
// can refer to the test parameter by GetParam().  In this case, the test
 | 
			
		||||
// parameter is a factory function which we call in fixture's SetUp() to
 | 
			
		||||
// create and store an instance of PrimeTable.
 | 
			
		||||
class PrimeTableTest : public TestWithParam<CreatePrimeTableFunc*> {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual ~PrimeTableTest() { delete table_; }
 | 
			
		||||
  virtual void SetUp() { table_ = (*GetParam())(); }
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    delete table_;
 | 
			
		||||
    table_ = NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  PrimeTable* table_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
 | 
			
		||||
  EXPECT_FALSE(table_->IsPrime(-5));
 | 
			
		||||
  EXPECT_FALSE(table_->IsPrime(0));
 | 
			
		||||
  EXPECT_FALSE(table_->IsPrime(1));
 | 
			
		||||
  EXPECT_FALSE(table_->IsPrime(4));
 | 
			
		||||
  EXPECT_FALSE(table_->IsPrime(6));
 | 
			
		||||
  EXPECT_FALSE(table_->IsPrime(100));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
 | 
			
		||||
  EXPECT_TRUE(table_->IsPrime(2));
 | 
			
		||||
  EXPECT_TRUE(table_->IsPrime(3));
 | 
			
		||||
  EXPECT_TRUE(table_->IsPrime(5));
 | 
			
		||||
  EXPECT_TRUE(table_->IsPrime(7));
 | 
			
		||||
  EXPECT_TRUE(table_->IsPrime(11));
 | 
			
		||||
  EXPECT_TRUE(table_->IsPrime(131));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_P(PrimeTableTest, CanGetNextPrime) {
 | 
			
		||||
  EXPECT_EQ(2, table_->GetNextPrime(0));
 | 
			
		||||
  EXPECT_EQ(3, table_->GetNextPrime(2));
 | 
			
		||||
  EXPECT_EQ(5, table_->GetNextPrime(3));
 | 
			
		||||
  EXPECT_EQ(7, table_->GetNextPrime(5));
 | 
			
		||||
  EXPECT_EQ(11, table_->GetNextPrime(7));
 | 
			
		||||
  EXPECT_EQ(131, table_->GetNextPrime(128));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// In order to run value-parameterized tests, you need to instantiate them,
 | 
			
		||||
// or bind them to a list of values which will be used as test parameters.
 | 
			
		||||
// You can instantiate them in a different translation module, or even
 | 
			
		||||
// instantiate them several times.
 | 
			
		||||
//
 | 
			
		||||
// Here, we instantiate our tests with a list of two PrimeTable object
 | 
			
		||||
// factory functions:
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(
 | 
			
		||||
    OnTheFlyAndPreCalculated,
 | 
			
		||||
    PrimeTableTest,
 | 
			
		||||
    Values(&CreateOnTheFlyPrimeTable, &CreatePreCalculatedPrimeTable<1000>));
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
// Google Test may not support value-parameterized tests with some
 | 
			
		||||
// compilers. If we use conditional compilation to compile out all
 | 
			
		||||
// code referring to the gtest_main library, MSVC linker will not link
 | 
			
		||||
// that library at all and consequently complain about missing entry
 | 
			
		||||
// point defined in that library (fatal error LNK1561: entry point
 | 
			
		||||
// must be defined). This dummy test keeps gtest_main linked in.
 | 
			
		||||
TEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {}
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_PARAM_TEST
 | 
			
		||||
| 
						 | 
				
			
			@ -1,173 +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: vladl@google.com (Vlad Losev)
 | 
			
		||||
 | 
			
		||||
// This sample shows how to test code relying on some global flag variables.
 | 
			
		||||
// Combine() helps with generating all possible combinations of such flags,
 | 
			
		||||
// and each test is given one combination as a parameter.
 | 
			
		||||
 | 
			
		||||
// Use class definitions to test from this header.
 | 
			
		||||
#include "prime_tables.h"
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_COMBINE
 | 
			
		||||
 | 
			
		||||
// Suppose we want to introduce a new, improved implementation of PrimeTable
 | 
			
		||||
// which combines speed of PrecalcPrimeTable and versatility of
 | 
			
		||||
// OnTheFlyPrimeTable (see prime_tables.h). Inside it instantiates both
 | 
			
		||||
// PrecalcPrimeTable and OnTheFlyPrimeTable and uses the one that is more
 | 
			
		||||
// appropriate under the circumstances. But in low memory conditions, it can be
 | 
			
		||||
// told to instantiate without PrecalcPrimeTable instance at all and use only
 | 
			
		||||
// OnTheFlyPrimeTable.
 | 
			
		||||
class HybridPrimeTable : public PrimeTable {
 | 
			
		||||
 public:
 | 
			
		||||
  HybridPrimeTable(bool force_on_the_fly, int max_precalculated)
 | 
			
		||||
      : on_the_fly_impl_(new OnTheFlyPrimeTable),
 | 
			
		||||
        precalc_impl_(force_on_the_fly ? NULL :
 | 
			
		||||
                          new PreCalculatedPrimeTable(max_precalculated)),
 | 
			
		||||
        max_precalculated_(max_precalculated) {}
 | 
			
		||||
  virtual ~HybridPrimeTable() {
 | 
			
		||||
    delete on_the_fly_impl_;
 | 
			
		||||
    delete precalc_impl_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual bool IsPrime(int n) const {
 | 
			
		||||
    if (precalc_impl_ != NULL && n < max_precalculated_)
 | 
			
		||||
      return precalc_impl_->IsPrime(n);
 | 
			
		||||
    else
 | 
			
		||||
      return on_the_fly_impl_->IsPrime(n);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual int GetNextPrime(int p) const {
 | 
			
		||||
    int next_prime = -1;
 | 
			
		||||
    if (precalc_impl_ != NULL && p < max_precalculated_)
 | 
			
		||||
      next_prime = precalc_impl_->GetNextPrime(p);
 | 
			
		||||
 | 
			
		||||
    return next_prime != -1 ? next_prime : on_the_fly_impl_->GetNextPrime(p);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  OnTheFlyPrimeTable* on_the_fly_impl_;
 | 
			
		||||
  PreCalculatedPrimeTable* precalc_impl_;
 | 
			
		||||
  int max_precalculated_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
using ::testing::TestWithParam;
 | 
			
		||||
using ::testing::Bool;
 | 
			
		||||
using ::testing::Values;
 | 
			
		||||
using ::testing::Combine;
 | 
			
		||||
 | 
			
		||||
// To test all code paths for HybridPrimeTable we must test it with numbers
 | 
			
		||||
// both within and outside PreCalculatedPrimeTable's capacity and also with
 | 
			
		||||
// PreCalculatedPrimeTable disabled. We do this by defining fixture which will
 | 
			
		||||
// accept different combinations of parameters for instantiating a
 | 
			
		||||
// HybridPrimeTable instance.
 | 
			
		||||
class PrimeTableTest : public TestWithParam< ::std::tr1::tuple<bool, int> > {
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    // This can be written as
 | 
			
		||||
    //
 | 
			
		||||
    // bool force_on_the_fly;
 | 
			
		||||
    // int max_precalculated;
 | 
			
		||||
    // tie(force_on_the_fly, max_precalculated) = GetParam();
 | 
			
		||||
    //
 | 
			
		||||
    // once the Google C++ Style Guide allows use of ::std::tr1::tie.
 | 
			
		||||
    //
 | 
			
		||||
    bool force_on_the_fly = ::std::tr1::get<0>(GetParam());
 | 
			
		||||
    int max_precalculated = ::std::tr1::get<1>(GetParam());
 | 
			
		||||
    table_ = new HybridPrimeTable(force_on_the_fly, max_precalculated);
 | 
			
		||||
  }
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    delete table_;
 | 
			
		||||
    table_ = NULL;
 | 
			
		||||
  }
 | 
			
		||||
  HybridPrimeTable* table_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
 | 
			
		||||
  // Inside the test body, you can refer to the test parameter by GetParam().
 | 
			
		||||
  // In this case, the test parameter is a PrimeTable interface pointer which
 | 
			
		||||
  // we can use directly.
 | 
			
		||||
  // Please note that you can also save it in the fixture's SetUp() method
 | 
			
		||||
  // or constructor and use saved copy in the tests.
 | 
			
		||||
 | 
			
		||||
  EXPECT_FALSE(table_->IsPrime(-5));
 | 
			
		||||
  EXPECT_FALSE(table_->IsPrime(0));
 | 
			
		||||
  EXPECT_FALSE(table_->IsPrime(1));
 | 
			
		||||
  EXPECT_FALSE(table_->IsPrime(4));
 | 
			
		||||
  EXPECT_FALSE(table_->IsPrime(6));
 | 
			
		||||
  EXPECT_FALSE(table_->IsPrime(100));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
 | 
			
		||||
  EXPECT_TRUE(table_->IsPrime(2));
 | 
			
		||||
  EXPECT_TRUE(table_->IsPrime(3));
 | 
			
		||||
  EXPECT_TRUE(table_->IsPrime(5));
 | 
			
		||||
  EXPECT_TRUE(table_->IsPrime(7));
 | 
			
		||||
  EXPECT_TRUE(table_->IsPrime(11));
 | 
			
		||||
  EXPECT_TRUE(table_->IsPrime(131));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_P(PrimeTableTest, CanGetNextPrime) {
 | 
			
		||||
  EXPECT_EQ(2, table_->GetNextPrime(0));
 | 
			
		||||
  EXPECT_EQ(3, table_->GetNextPrime(2));
 | 
			
		||||
  EXPECT_EQ(5, table_->GetNextPrime(3));
 | 
			
		||||
  EXPECT_EQ(7, table_->GetNextPrime(5));
 | 
			
		||||
  EXPECT_EQ(11, table_->GetNextPrime(7));
 | 
			
		||||
  EXPECT_EQ(131, table_->GetNextPrime(128));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// In order to run value-parameterized tests, you need to instantiate them,
 | 
			
		||||
// or bind them to a list of values which will be used as test parameters.
 | 
			
		||||
// You can instantiate them in a different translation module, or even
 | 
			
		||||
// instantiate them several times.
 | 
			
		||||
//
 | 
			
		||||
// Here, we instantiate our tests with a list of parameters. We must combine
 | 
			
		||||
// all variations of the boolean flag suppressing PrecalcPrimeTable and some
 | 
			
		||||
// meaningful values for tests. We choose a small value (1), and a value that
 | 
			
		||||
// will put some of the tested numbers beyond the capability of the
 | 
			
		||||
// PrecalcPrimeTable instance and some inside it (10). Combine will produce all
 | 
			
		||||
// possible combinations.
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(MeaningfulTestParameters,
 | 
			
		||||
                        PrimeTableTest,
 | 
			
		||||
                        Combine(Bool(), Values(1, 10)));
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
// Google Test may not support Combine() with some compilers. If we
 | 
			
		||||
// use conditional compilation to compile out all code referring to
 | 
			
		||||
// the gtest_main library, MSVC linker will not link that library at
 | 
			
		||||
// all and consequently complain about missing entry point defined in
 | 
			
		||||
// that library (fatal error LNK1561: entry point must be
 | 
			
		||||
// defined). This dummy test keeps gtest_main linked in.
 | 
			
		||||
TEST(DummyTest, CombineIsNotSupportedOnThisPlatform) {}
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_COMBINE
 | 
			
		||||
| 
						 | 
				
			
			@ -1,160 +0,0 @@
 | 
			
		|||
// 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.
 | 
			
		||||
//
 | 
			
		||||
// Author: vladl@google.com (Vlad Losev)
 | 
			
		||||
 | 
			
		||||
// This sample shows how to use Google Test listener API to implement
 | 
			
		||||
// an alternative console output and how to use the UnitTest reflection API
 | 
			
		||||
// to enumerate test cases and tests and to inspect their results.
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
using ::testing::EmptyTestEventListener;
 | 
			
		||||
using ::testing::InitGoogleTest;
 | 
			
		||||
using ::testing::Test;
 | 
			
		||||
using ::testing::TestCase;
 | 
			
		||||
using ::testing::TestEventListeners;
 | 
			
		||||
using ::testing::TestInfo;
 | 
			
		||||
using ::testing::TestPartResult;
 | 
			
		||||
using ::testing::UnitTest;
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
// Provides alternative output mode which produces minimal amount of
 | 
			
		||||
// information about tests.
 | 
			
		||||
class TersePrinter : public EmptyTestEventListener {
 | 
			
		||||
 private:
 | 
			
		||||
  // Called before any test activity starts.
 | 
			
		||||
  virtual void OnTestProgramStart(const UnitTest& /* unit_test */) {}
 | 
			
		||||
 | 
			
		||||
  // Called after all test activities have ended.
 | 
			
		||||
  virtual void OnTestProgramEnd(const UnitTest& unit_test) {
 | 
			
		||||
    fprintf(stdout, "TEST %s\n", unit_test.Passed() ? "PASSED" : "FAILED");
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Called before a test starts.
 | 
			
		||||
  virtual void OnTestStart(const TestInfo& test_info) {
 | 
			
		||||
    fprintf(stdout,
 | 
			
		||||
            "*** Test %s.%s starting.\n",
 | 
			
		||||
            test_info.test_case_name(),
 | 
			
		||||
            test_info.name());
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Called after a failed assertion or a SUCCEED() invocation.
 | 
			
		||||
  virtual void OnTestPartResult(const TestPartResult& test_part_result) {
 | 
			
		||||
    fprintf(stdout,
 | 
			
		||||
            "%s in %s:%d\n%s\n",
 | 
			
		||||
            test_part_result.failed() ? "*** Failure" : "Success",
 | 
			
		||||
            test_part_result.file_name(),
 | 
			
		||||
            test_part_result.line_number(),
 | 
			
		||||
            test_part_result.summary());
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Called after a test ends.
 | 
			
		||||
  virtual void OnTestEnd(const TestInfo& test_info) {
 | 
			
		||||
    fprintf(stdout,
 | 
			
		||||
            "*** Test %s.%s ending.\n",
 | 
			
		||||
            test_info.test_case_name(),
 | 
			
		||||
            test_info.name());
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
  }
 | 
			
		||||
};  // class TersePrinter
 | 
			
		||||
 | 
			
		||||
TEST(CustomOutputTest, PrintsMessage) {
 | 
			
		||||
  printf("Printing something from the test body...\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(CustomOutputTest, Succeeds) {
 | 
			
		||||
  SUCCEED() << "SUCCEED() has been invoked from here";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(CustomOutputTest, Fails) {
 | 
			
		||||
  EXPECT_EQ(1, 2)
 | 
			
		||||
      << "This test fails in order to demonstrate alternative failure messages";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  bool terse_output = false;
 | 
			
		||||
  if (argc > 1 && strcmp(argv[1], "--terse_output") == 0 )
 | 
			
		||||
    terse_output = true;
 | 
			
		||||
  else
 | 
			
		||||
    printf("%s\n", "Run this program with --terse_output to change the way "
 | 
			
		||||
           "it prints its output.");
 | 
			
		||||
 | 
			
		||||
  UnitTest& unit_test = *UnitTest::GetInstance();
 | 
			
		||||
 | 
			
		||||
  // If we are given the --terse_output command line flag, suppresses the
 | 
			
		||||
  // standard output and attaches own result printer.
 | 
			
		||||
  if (terse_output) {
 | 
			
		||||
    TestEventListeners& listeners = unit_test.listeners();
 | 
			
		||||
 | 
			
		||||
    // Removes the default console output listener from the list so it will
 | 
			
		||||
    // not receive events from Google Test and won't print any output. Since
 | 
			
		||||
    // this operation transfers ownership of the listener to the caller we
 | 
			
		||||
    // have to delete it as well.
 | 
			
		||||
    delete listeners.Release(listeners.default_result_printer());
 | 
			
		||||
 | 
			
		||||
    // Adds the custom output listener to the list. It will now receive
 | 
			
		||||
    // events from Google Test and print the alternative output. We don't
 | 
			
		||||
    // have to worry about deleting it since Google Test assumes ownership
 | 
			
		||||
    // over it after adding it to the list.
 | 
			
		||||
    listeners.Append(new TersePrinter);
 | 
			
		||||
  }
 | 
			
		||||
  int ret_val = RUN_ALL_TESTS();
 | 
			
		||||
 | 
			
		||||
  // This is an example of using the UnitTest reflection API to inspect test
 | 
			
		||||
  // results. Here we discount failures from the tests we expected to fail.
 | 
			
		||||
  int unexpectedly_failed_tests = 0;
 | 
			
		||||
  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
 | 
			
		||||
    const TestCase& test_case = *unit_test.GetTestCase(i);
 | 
			
		||||
    for (int j = 0; j < test_case.total_test_count(); ++j) {
 | 
			
		||||
      const TestInfo& test_info = *test_case.GetTestInfo(j);
 | 
			
		||||
      // Counts failed tests that were not meant to fail (those without
 | 
			
		||||
      // 'Fails' in the name).
 | 
			
		||||
      if (test_info.result()->Failed() &&
 | 
			
		||||
          strcmp(test_info.name(), "Fails") != 0) {
 | 
			
		||||
        unexpectedly_failed_tests++;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Test that were meant to fail should not affect the test program outcome.
 | 
			
		||||
  if (unexpectedly_failed_tests == 0)
 | 
			
		||||
    ret_val = 0;
 | 
			
		||||
 | 
			
		||||
  return ret_val;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,250 +0,0 @@
 | 
			
		|||
#!/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.
 | 
			
		||||
 | 
			
		||||
"""fuse_gtest_files.py v0.2.0
 | 
			
		||||
Fuses Google Test source code into a .h file and a .cc file.
 | 
			
		||||
 | 
			
		||||
SYNOPSIS
 | 
			
		||||
       fuse_gtest_files.py [GTEST_ROOT_DIR] OUTPUT_DIR
 | 
			
		||||
 | 
			
		||||
       Scans GTEST_ROOT_DIR for Google Test source code, and generates
 | 
			
		||||
       two files: OUTPUT_DIR/gtest/gtest.h and OUTPUT_DIR/gtest/gtest-all.cc.
 | 
			
		||||
       Then you can build your tests by adding OUTPUT_DIR to the include
 | 
			
		||||
       search path and linking with OUTPUT_DIR/gtest/gtest-all.cc.  These
 | 
			
		||||
       two files contain everything you need to use Google Test.  Hence
 | 
			
		||||
       you can "install" Google Test by copying them to wherever you want.
 | 
			
		||||
 | 
			
		||||
       GTEST_ROOT_DIR can be omitted and defaults to the parent
 | 
			
		||||
       directory of the directory holding this script.
 | 
			
		||||
 | 
			
		||||
EXAMPLES
 | 
			
		||||
       ./fuse_gtest_files.py fused_gtest
 | 
			
		||||
       ./fuse_gtest_files.py path/to/unpacked/gtest fused_gtest
 | 
			
		||||
 | 
			
		||||
This tool is experimental.  In particular, it assumes that there is no
 | 
			
		||||
conditional inclusion of Google Test headers.  Please report any
 | 
			
		||||
problems to googletestframework@googlegroups.com.  You can read
 | 
			
		||||
http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide for
 | 
			
		||||
more information.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
__author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import re
 | 
			
		||||
import sets
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
# We assume that this file is in the scripts/ directory in the Google
 | 
			
		||||
# Test root directory.
 | 
			
		||||
DEFAULT_GTEST_ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')
 | 
			
		||||
 | 
			
		||||
# Regex for matching '#include "gtest/..."'.
 | 
			
		||||
INCLUDE_GTEST_FILE_REGEX = re.compile(r'^\s*#\s*include\s*"(gtest/.+)"')
 | 
			
		||||
 | 
			
		||||
# Regex for matching '#include "src/..."'.
 | 
			
		||||
INCLUDE_SRC_FILE_REGEX = re.compile(r'^\s*#\s*include\s*"(src/.+)"')
 | 
			
		||||
 | 
			
		||||
# Where to find the source seed files.
 | 
			
		||||
GTEST_H_SEED = 'include/gtest/gtest.h'
 | 
			
		||||
GTEST_SPI_H_SEED = 'include/gtest/gtest-spi.h'
 | 
			
		||||
GTEST_ALL_CC_SEED = 'src/gtest-all.cc'
 | 
			
		||||
 | 
			
		||||
# Where to put the generated files.
 | 
			
		||||
GTEST_H_OUTPUT = 'gtest/gtest.h'
 | 
			
		||||
GTEST_ALL_CC_OUTPUT = 'gtest/gtest-all.cc'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def VerifyFileExists(directory, relative_path):
 | 
			
		||||
  """Verifies that the given file exists; aborts on failure.
 | 
			
		||||
 | 
			
		||||
  relative_path is the file path relative to the given directory.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  if not os.path.isfile(os.path.join(directory, relative_path)):
 | 
			
		||||
    print 'ERROR: Cannot find %s in directory %s.' % (relative_path,
 | 
			
		||||
                                                      directory)
 | 
			
		||||
    print ('Please either specify a valid project root directory '
 | 
			
		||||
           'or omit it on the command line.')
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ValidateGTestRootDir(gtest_root):
 | 
			
		||||
  """Makes sure gtest_root points to a valid gtest root directory.
 | 
			
		||||
 | 
			
		||||
  The function aborts the program on failure.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  VerifyFileExists(gtest_root, GTEST_H_SEED)
 | 
			
		||||
  VerifyFileExists(gtest_root, GTEST_ALL_CC_SEED)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def VerifyOutputFile(output_dir, relative_path):
 | 
			
		||||
  """Verifies that the given output file path is valid.
 | 
			
		||||
 | 
			
		||||
  relative_path is relative to the output_dir directory.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  # Makes sure the output file either doesn't exist or can be overwritten.
 | 
			
		||||
  output_file = os.path.join(output_dir, relative_path)
 | 
			
		||||
  if os.path.exists(output_file):
 | 
			
		||||
    # TODO(wan@google.com): The following user-interaction doesn't
 | 
			
		||||
    # work with automated processes.  We should provide a way for the
 | 
			
		||||
    # Makefile to force overwriting the files.
 | 
			
		||||
    print ('%s already exists in directory %s - overwrite it? (y/N) ' %
 | 
			
		||||
           (relative_path, output_dir))
 | 
			
		||||
    answer = sys.stdin.readline().strip()
 | 
			
		||||
    if answer not in ['y', 'Y']:
 | 
			
		||||
      print 'ABORTED.'
 | 
			
		||||
      sys.exit(1)
 | 
			
		||||
 | 
			
		||||
  # Makes sure the directory holding the output file exists; creates
 | 
			
		||||
  # it and all its ancestors if necessary.
 | 
			
		||||
  parent_directory = os.path.dirname(output_file)
 | 
			
		||||
  if not os.path.isdir(parent_directory):
 | 
			
		||||
    os.makedirs(parent_directory)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ValidateOutputDir(output_dir):
 | 
			
		||||
  """Makes sure output_dir points to a valid output directory.
 | 
			
		||||
 | 
			
		||||
  The function aborts the program on failure.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  VerifyOutputFile(output_dir, GTEST_H_OUTPUT)
 | 
			
		||||
  VerifyOutputFile(output_dir, GTEST_ALL_CC_OUTPUT)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def FuseGTestH(gtest_root, output_dir):
 | 
			
		||||
  """Scans folder gtest_root to generate gtest/gtest.h in output_dir."""
 | 
			
		||||
 | 
			
		||||
  output_file = file(os.path.join(output_dir, GTEST_H_OUTPUT), 'w')
 | 
			
		||||
  processed_files = sets.Set()  # Holds all gtest headers we've processed.
 | 
			
		||||
 | 
			
		||||
  def ProcessFile(gtest_header_path):
 | 
			
		||||
    """Processes the given gtest header file."""
 | 
			
		||||
 | 
			
		||||
    # We don't process the same header twice.
 | 
			
		||||
    if gtest_header_path in processed_files:
 | 
			
		||||
      return
 | 
			
		||||
 | 
			
		||||
    processed_files.add(gtest_header_path)
 | 
			
		||||
 | 
			
		||||
    # Reads each line in the given gtest header.
 | 
			
		||||
    for line in file(os.path.join(gtest_root, gtest_header_path), 'r'):
 | 
			
		||||
      m = INCLUDE_GTEST_FILE_REGEX.match(line)
 | 
			
		||||
      if m:
 | 
			
		||||
        # It's '#include "gtest/..."' - let's process it recursively.
 | 
			
		||||
        ProcessFile('include/' + m.group(1))
 | 
			
		||||
      else:
 | 
			
		||||
        # Otherwise we copy the line unchanged to the output file.
 | 
			
		||||
        output_file.write(line)
 | 
			
		||||
 | 
			
		||||
  ProcessFile(GTEST_H_SEED)
 | 
			
		||||
  output_file.close()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def FuseGTestAllCcToFile(gtest_root, output_file):
 | 
			
		||||
  """Scans folder gtest_root to generate gtest/gtest-all.cc in output_file."""
 | 
			
		||||
 | 
			
		||||
  processed_files = sets.Set()
 | 
			
		||||
 | 
			
		||||
  def ProcessFile(gtest_source_file):
 | 
			
		||||
    """Processes the given gtest source file."""
 | 
			
		||||
 | 
			
		||||
    # We don't process the same #included file twice.
 | 
			
		||||
    if gtest_source_file in processed_files:
 | 
			
		||||
      return
 | 
			
		||||
 | 
			
		||||
    processed_files.add(gtest_source_file)
 | 
			
		||||
 | 
			
		||||
    # Reads each line in the given gtest source file.
 | 
			
		||||
    for line in file(os.path.join(gtest_root, gtest_source_file), 'r'):
 | 
			
		||||
      m = INCLUDE_GTEST_FILE_REGEX.match(line)
 | 
			
		||||
      if m:
 | 
			
		||||
        if 'include/' + m.group(1) == GTEST_SPI_H_SEED:
 | 
			
		||||
          # It's '#include "gtest/gtest-spi.h"'.  This file is not
 | 
			
		||||
          # #included by "gtest/gtest.h", so we need to process it.
 | 
			
		||||
          ProcessFile(GTEST_SPI_H_SEED)
 | 
			
		||||
        else:
 | 
			
		||||
          # It's '#include "gtest/foo.h"' where foo is not gtest-spi.
 | 
			
		||||
          # We treat it as '#include "gtest/gtest.h"', as all other
 | 
			
		||||
          # gtest headers are being fused into gtest.h and cannot be
 | 
			
		||||
          # #included directly.
 | 
			
		||||
 | 
			
		||||
          # There is no need to #include "gtest/gtest.h" more than once.
 | 
			
		||||
          if not GTEST_H_SEED in processed_files:
 | 
			
		||||
            processed_files.add(GTEST_H_SEED)
 | 
			
		||||
            output_file.write('#include "%s"\n' % (GTEST_H_OUTPUT,))
 | 
			
		||||
      else:
 | 
			
		||||
        m = INCLUDE_SRC_FILE_REGEX.match(line)
 | 
			
		||||
        if m:
 | 
			
		||||
          # It's '#include "src/foo"' - let's process it recursively.
 | 
			
		||||
          ProcessFile(m.group(1))
 | 
			
		||||
        else:
 | 
			
		||||
          output_file.write(line)
 | 
			
		||||
 | 
			
		||||
  ProcessFile(GTEST_ALL_CC_SEED)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def FuseGTestAllCc(gtest_root, output_dir):
 | 
			
		||||
  """Scans folder gtest_root to generate gtest/gtest-all.cc in output_dir."""
 | 
			
		||||
 | 
			
		||||
  output_file = file(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w')
 | 
			
		||||
  FuseGTestAllCcToFile(gtest_root, output_file)
 | 
			
		||||
  output_file.close()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def FuseGTest(gtest_root, output_dir):
 | 
			
		||||
  """Fuses gtest.h and gtest-all.cc."""
 | 
			
		||||
 | 
			
		||||
  ValidateGTestRootDir(gtest_root)
 | 
			
		||||
  ValidateOutputDir(output_dir)
 | 
			
		||||
 | 
			
		||||
  FuseGTestH(gtest_root, output_dir)
 | 
			
		||||
  FuseGTestAllCc(gtest_root, output_dir)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
  argc = len(sys.argv)
 | 
			
		||||
  if argc == 2:
 | 
			
		||||
    # fuse_gtest_files.py OUTPUT_DIR
 | 
			
		||||
    FuseGTest(DEFAULT_GTEST_ROOT_DIR, sys.argv[1])
 | 
			
		||||
  elif argc == 3:
 | 
			
		||||
    # fuse_gtest_files.py GTEST_ROOT_DIR OUTPUT_DIR
 | 
			
		||||
    FuseGTest(sys.argv[1], sys.argv[2])
 | 
			
		||||
  else:
 | 
			
		||||
    print __doc__
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  main()
 | 
			
		||||
| 
						 | 
				
			
			@ -1,730 +0,0 @@
 | 
			
		|||
#!/usr/bin/env python
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
 | 
			
		||||
"""gen_gtest_pred_impl.py v0.1
 | 
			
		||||
 | 
			
		||||
Generates the implementation of Google Test predicate assertions and
 | 
			
		||||
accompanying tests.
 | 
			
		||||
 | 
			
		||||
Usage:
 | 
			
		||||
 | 
			
		||||
  gen_gtest_pred_impl.py MAX_ARITY
 | 
			
		||||
 | 
			
		||||
where MAX_ARITY is a positive integer.
 | 
			
		||||
 | 
			
		||||
The command generates the implementation of up-to MAX_ARITY-ary
 | 
			
		||||
predicate assertions, and writes it to file gtest_pred_impl.h in the
 | 
			
		||||
directory where the script is.  It also generates the accompanying
 | 
			
		||||
unit test in file gtest_pred_impl_unittest.cc.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
__author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import time
 | 
			
		||||
 | 
			
		||||
# Where this script is.
 | 
			
		||||
SCRIPT_DIR = os.path.dirname(sys.argv[0])
 | 
			
		||||
 | 
			
		||||
# Where to store the generated header.
 | 
			
		||||
HEADER = os.path.join(SCRIPT_DIR, '../include/gtest/gtest_pred_impl.h')
 | 
			
		||||
 | 
			
		||||
# Where to store the generated unit test.
 | 
			
		||||
UNIT_TEST = os.path.join(SCRIPT_DIR, '../test/gtest_pred_impl_unittest.cc')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def HeaderPreamble(n):
 | 
			
		||||
  """Returns the preamble for the header file.
 | 
			
		||||
 | 
			
		||||
  Args:
 | 
			
		||||
    n:  the maximum arity of the predicate macros to be generated.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  # A map that defines the values used in the preamble template.
 | 
			
		||||
  DEFS = {
 | 
			
		||||
    'today' : time.strftime('%m/%d/%Y'),
 | 
			
		||||
    'year' : time.strftime('%Y'),
 | 
			
		||||
    'command' : '%s %s' % (os.path.basename(sys.argv[0]), n),
 | 
			
		||||
    'n' : n
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
"""// 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.
 | 
			
		||||
 | 
			
		||||
// This file is AUTOMATICALLY GENERATED on %(today)s by command
 | 
			
		||||
// '%(command)s'.  DO NOT EDIT BY HAND!
 | 
			
		||||
//
 | 
			
		||||
// Implements a family of generic predicate assertion macros.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
 | 
			
		||||
 | 
			
		||||
// Makes sure this header is not included before gtest.h.
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
 | 
			
		||||
# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
 | 
			
		||||
 | 
			
		||||
// This header implements a family of generic predicate assertion
 | 
			
		||||
// macros:
 | 
			
		||||
//
 | 
			
		||||
//   ASSERT_PRED_FORMAT1(pred_format, v1)
 | 
			
		||||
//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
 | 
			
		||||
//   ...
 | 
			
		||||
//
 | 
			
		||||
// where pred_format is a function or functor that takes n (in the
 | 
			
		||||
// case of ASSERT_PRED_FORMATn) values and their source expression
 | 
			
		||||
// text, and returns a testing::AssertionResult.  See the definition
 | 
			
		||||
// of ASSERT_EQ in gtest.h for an example.
 | 
			
		||||
//
 | 
			
		||||
// If you don't care about formatting, you can use the more
 | 
			
		||||
// restrictive version:
 | 
			
		||||
//
 | 
			
		||||
//   ASSERT_PRED1(pred, v1)
 | 
			
		||||
//   ASSERT_PRED2(pred, v1, v2)
 | 
			
		||||
//   ...
 | 
			
		||||
//
 | 
			
		||||
// where pred is an n-ary function or functor that returns bool,
 | 
			
		||||
// and the values v1, v2, ..., must support the << operator for
 | 
			
		||||
// streaming to std::ostream.
 | 
			
		||||
//
 | 
			
		||||
// We also define the EXPECT_* variations.
 | 
			
		||||
//
 | 
			
		||||
// For now we only support predicates whose arity is at most %(n)s.
 | 
			
		||||
// Please email googletestframework@googlegroups.com if you need
 | 
			
		||||
// support for higher arities.
 | 
			
		||||
 | 
			
		||||
// GTEST_ASSERT_ is the basic statement to which all of the assertions
 | 
			
		||||
// in this file reduce.  Don't use this in your code.
 | 
			
		||||
 | 
			
		||||
#define GTEST_ASSERT_(expression, on_failure) \\
 | 
			
		||||
  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\
 | 
			
		||||
  if (const ::testing::AssertionResult gtest_ar = (expression)) \\
 | 
			
		||||
    ; \\
 | 
			
		||||
  else \\
 | 
			
		||||
    on_failure(gtest_ar.failure_message())
 | 
			
		||||
""" % DEFS)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def Arity(n):
 | 
			
		||||
  """Returns the English name of the given arity."""
 | 
			
		||||
 | 
			
		||||
  if n < 0:
 | 
			
		||||
    return None
 | 
			
		||||
  elif n <= 3:
 | 
			
		||||
    return ['nullary', 'unary', 'binary', 'ternary'][n]
 | 
			
		||||
  else:
 | 
			
		||||
    return '%s-ary' % n
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def Title(word):
 | 
			
		||||
  """Returns the given word in title case.  The difference between
 | 
			
		||||
  this and string's title() method is that Title('4-ary') is '4-ary'
 | 
			
		||||
  while '4-ary'.title() is '4-Ary'."""
 | 
			
		||||
 | 
			
		||||
  return word[0].upper() + word[1:]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def OneTo(n):
 | 
			
		||||
  """Returns the list [1, 2, 3, ..., n]."""
 | 
			
		||||
 | 
			
		||||
  return range(1, n + 1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def Iter(n, format, sep=''):
 | 
			
		||||
  """Given a positive integer n, a format string that contains 0 or
 | 
			
		||||
  more '%s' format specs, and optionally a separator string, returns
 | 
			
		||||
  the join of n strings, each formatted with the format string on an
 | 
			
		||||
  iterator ranged from 1 to n.
 | 
			
		||||
 | 
			
		||||
  Example:
 | 
			
		||||
 | 
			
		||||
  Iter(3, 'v%s', sep=', ') returns 'v1, v2, v3'.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  # How many '%s' specs are in format?
 | 
			
		||||
  spec_count = len(format.split('%s')) - 1
 | 
			
		||||
  return sep.join([format % (spec_count * (i,)) for i in OneTo(n)])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ImplementationForArity(n):
 | 
			
		||||
  """Returns the implementation of n-ary predicate assertions."""
 | 
			
		||||
 | 
			
		||||
  # A map the defines the values used in the implementation template.
 | 
			
		||||
  DEFS = {
 | 
			
		||||
    'n' : str(n),
 | 
			
		||||
    'vs' : Iter(n, 'v%s', sep=', '),
 | 
			
		||||
    'vts' : Iter(n, '#v%s', sep=', '),
 | 
			
		||||
    'arity' : Arity(n),
 | 
			
		||||
    'Arity' : Title(Arity(n))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  impl = """
 | 
			
		||||
 | 
			
		||||
// Helper function for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use
 | 
			
		||||
// this in your code.
 | 
			
		||||
template <typename Pred""" % DEFS
 | 
			
		||||
 | 
			
		||||
  impl += Iter(n, """,
 | 
			
		||||
          typename T%s""")
 | 
			
		||||
 | 
			
		||||
  impl += """>
 | 
			
		||||
AssertionResult AssertPred%(n)sHelper(const char* pred_text""" % DEFS
 | 
			
		||||
 | 
			
		||||
  impl += Iter(n, """,
 | 
			
		||||
                                  const char* e%s""")
 | 
			
		||||
 | 
			
		||||
  impl += """,
 | 
			
		||||
                                  Pred pred"""
 | 
			
		||||
 | 
			
		||||
  impl += Iter(n, """,
 | 
			
		||||
                                  const T%s& v%s""")
 | 
			
		||||
 | 
			
		||||
  impl += """) {
 | 
			
		||||
  if (pred(%(vs)s)) return AssertionSuccess();
 | 
			
		||||
 | 
			
		||||
""" % DEFS
 | 
			
		||||
 | 
			
		||||
  impl += '  return AssertionFailure() << pred_text << "("'
 | 
			
		||||
 | 
			
		||||
  impl += Iter(n, """
 | 
			
		||||
                            << e%s""", sep=' << ", "')
 | 
			
		||||
 | 
			
		||||
  impl += ' << ") evaluates to false, where"'
 | 
			
		||||
 | 
			
		||||
  impl += Iter(n, """
 | 
			
		||||
                            << "\\n" << e%s << " evaluates to " << v%s""")
 | 
			
		||||
 | 
			
		||||
  impl += """;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
 | 
			
		||||
// Don't use this in your code.
 | 
			
		||||
#define GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, on_failure)\\
 | 
			
		||||
  GTEST_ASSERT_(pred_format(%(vts)s, %(vs)s), \\
 | 
			
		||||
                on_failure)
 | 
			
		||||
 | 
			
		||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use
 | 
			
		||||
// this in your code.
 | 
			
		||||
#define GTEST_PRED%(n)s_(pred, %(vs)s, on_failure)\\
 | 
			
		||||
  GTEST_ASSERT_(::testing::AssertPred%(n)sHelper(#pred""" % DEFS
 | 
			
		||||
 | 
			
		||||
  impl += Iter(n, """, \\
 | 
			
		||||
                                             #v%s""")
 | 
			
		||||
 | 
			
		||||
  impl += """, \\
 | 
			
		||||
                                             pred"""
 | 
			
		||||
 | 
			
		||||
  impl += Iter(n, """, \\
 | 
			
		||||
                                             v%s""")
 | 
			
		||||
 | 
			
		||||
  impl += """), on_failure)
 | 
			
		||||
 | 
			
		||||
// %(Arity)s predicate assertion macros.
 | 
			
		||||
#define EXPECT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
 | 
			
		||||
  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
#define EXPECT_PRED%(n)s(pred, %(vs)s) \\
 | 
			
		||||
  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
#define ASSERT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
 | 
			
		||||
  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_FATAL_FAILURE_)
 | 
			
		||||
#define ASSERT_PRED%(n)s(pred, %(vs)s) \\
 | 
			
		||||
  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_FATAL_FAILURE_)
 | 
			
		||||
 | 
			
		||||
""" % DEFS
 | 
			
		||||
 | 
			
		||||
  return impl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def HeaderPostamble():
 | 
			
		||||
  """Returns the postamble for the header file."""
 | 
			
		||||
 | 
			
		||||
  return """
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def GenerateFile(path, content):
 | 
			
		||||
  """Given a file path and a content string, overwrites it with the
 | 
			
		||||
  given content."""
 | 
			
		||||
 | 
			
		||||
  print 'Updating file %s . . .' % path
 | 
			
		||||
 | 
			
		||||
  f = file(path, 'w+')
 | 
			
		||||
  print >>f, content,
 | 
			
		||||
  f.close()
 | 
			
		||||
 | 
			
		||||
  print 'File %s has been updated.' % path
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def GenerateHeader(n):
 | 
			
		||||
  """Given the maximum arity n, updates the header file that implements
 | 
			
		||||
  the predicate assertions."""
 | 
			
		||||
 | 
			
		||||
  GenerateFile(HEADER,
 | 
			
		||||
               HeaderPreamble(n)
 | 
			
		||||
               + ''.join([ImplementationForArity(i) for i in OneTo(n)])
 | 
			
		||||
               + HeaderPostamble())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def UnitTestPreamble():
 | 
			
		||||
  """Returns the preamble for the unit test file."""
 | 
			
		||||
 | 
			
		||||
  # A map that defines the values used in the preamble template.
 | 
			
		||||
  DEFS = {
 | 
			
		||||
    'today' : time.strftime('%m/%d/%Y'),
 | 
			
		||||
    'year' : time.strftime('%Y'),
 | 
			
		||||
    'command' : '%s %s' % (os.path.basename(sys.argv[0]), sys.argv[1]),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
"""// 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.
 | 
			
		||||
 | 
			
		||||
// This file is AUTOMATICALLY GENERATED on %(today)s by command
 | 
			
		||||
// '%(command)s'.  DO NOT EDIT BY HAND!
 | 
			
		||||
 | 
			
		||||
// Regression test for gtest_pred_impl.h
 | 
			
		||||
//
 | 
			
		||||
// This file is generated by a script and quite long.  If you intend to
 | 
			
		||||
// learn how Google Test works by reading its unit tests, read
 | 
			
		||||
// gtest_unittest.cc instead.
 | 
			
		||||
//
 | 
			
		||||
// This is intended as a regression test for the Google Test predicate
 | 
			
		||||
// assertions.  We compile it as part of the gtest_unittest target
 | 
			
		||||
// only to keep the implementation tidy and compact, as it is quite
 | 
			
		||||
// involved to set up the stage for testing Google Test using Google
 | 
			
		||||
// Test itself.
 | 
			
		||||
//
 | 
			
		||||
// Currently, gtest_unittest takes ~11 seconds to run in the testing
 | 
			
		||||
// daemon.  In the future, if it grows too large and needs much more
 | 
			
		||||
// time to finish, we should consider separating this file into a
 | 
			
		||||
// stand-alone regression test.
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
#include "gtest/gtest-spi.h"
 | 
			
		||||
 | 
			
		||||
// A user-defined data type.
 | 
			
		||||
struct Bool {
 | 
			
		||||
  explicit Bool(int val) : value(val != 0) {}
 | 
			
		||||
 | 
			
		||||
  bool operator>(int n) const { return value > Bool(n).value; }
 | 
			
		||||
 | 
			
		||||
  Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }
 | 
			
		||||
 | 
			
		||||
  bool operator==(const Bool& rhs) const { return value == rhs.value; }
 | 
			
		||||
 | 
			
		||||
  bool value;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Enables Bool to be used in assertions.
 | 
			
		||||
std::ostream& operator<<(std::ostream& os, const Bool& x) {
 | 
			
		||||
  return os << (x.value ? "true" : "false");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
""" % DEFS)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def TestsForArity(n):
 | 
			
		||||
  """Returns the tests for n-ary predicate assertions."""
 | 
			
		||||
 | 
			
		||||
  # A map that defines the values used in the template for the tests.
 | 
			
		||||
  DEFS = {
 | 
			
		||||
    'n' : n,
 | 
			
		||||
    'es' : Iter(n, 'e%s', sep=', '),
 | 
			
		||||
    'vs' : Iter(n, 'v%s', sep=', '),
 | 
			
		||||
    'vts' : Iter(n, '#v%s', sep=', '),
 | 
			
		||||
    'tvs' : Iter(n, 'T%s v%s', sep=', '),
 | 
			
		||||
    'int_vs' : Iter(n, 'int v%s', sep=', '),
 | 
			
		||||
    'Bool_vs' : Iter(n, 'Bool v%s', sep=', '),
 | 
			
		||||
    'types' : Iter(n, 'typename T%s', sep=', '),
 | 
			
		||||
    'v_sum' : Iter(n, 'v%s', sep=' + '),
 | 
			
		||||
    'arity' : Arity(n),
 | 
			
		||||
    'Arity' : Title(Arity(n)),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  tests = (
 | 
			
		||||
"""// Sample functions/functors for testing %(arity)s predicate assertions.
 | 
			
		||||
 | 
			
		||||
// A %(arity)s predicate function.
 | 
			
		||||
template <%(types)s>
 | 
			
		||||
bool PredFunction%(n)s(%(tvs)s) {
 | 
			
		||||
  return %(v_sum)s > 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The following two functions are needed to circumvent a bug in
 | 
			
		||||
// gcc 2.95.3, which sometimes has problem with the above template
 | 
			
		||||
// function.
 | 
			
		||||
bool PredFunction%(n)sInt(%(int_vs)s) {
 | 
			
		||||
  return %(v_sum)s > 0;
 | 
			
		||||
}
 | 
			
		||||
bool PredFunction%(n)sBool(%(Bool_vs)s) {
 | 
			
		||||
  return %(v_sum)s > 0;
 | 
			
		||||
}
 | 
			
		||||
""" % DEFS)
 | 
			
		||||
 | 
			
		||||
  tests += """
 | 
			
		||||
// A %(arity)s predicate functor.
 | 
			
		||||
struct PredFunctor%(n)s {
 | 
			
		||||
  template <%(types)s>
 | 
			
		||||
  bool operator()(""" % DEFS
 | 
			
		||||
 | 
			
		||||
  tests += Iter(n, 'const T%s& v%s', sep=""",
 | 
			
		||||
                  """)
 | 
			
		||||
 | 
			
		||||
  tests += """) {
 | 
			
		||||
    return %(v_sum)s > 0;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
""" % DEFS
 | 
			
		||||
 | 
			
		||||
  tests += """
 | 
			
		||||
// A %(arity)s predicate-formatter function.
 | 
			
		||||
template <%(types)s>
 | 
			
		||||
testing::AssertionResult PredFormatFunction%(n)s(""" % DEFS
 | 
			
		||||
 | 
			
		||||
  tests += Iter(n, 'const char* e%s', sep=""",
 | 
			
		||||
                                             """)
 | 
			
		||||
 | 
			
		||||
  tests += Iter(n, """,
 | 
			
		||||
                                             const T%s& v%s""")
 | 
			
		||||
 | 
			
		||||
  tests += """) {
 | 
			
		||||
  if (PredFunction%(n)s(%(vs)s))
 | 
			
		||||
    return testing::AssertionSuccess();
 | 
			
		||||
 | 
			
		||||
  return testing::AssertionFailure()
 | 
			
		||||
      << """ % DEFS
 | 
			
		||||
 | 
			
		||||
  tests += Iter(n, 'e%s', sep=' << " + " << ')
 | 
			
		||||
 | 
			
		||||
  tests += """
 | 
			
		||||
      << " is expected to be positive, but evaluates to "
 | 
			
		||||
      << %(v_sum)s << ".";
 | 
			
		||||
}
 | 
			
		||||
""" % DEFS
 | 
			
		||||
 | 
			
		||||
  tests += """
 | 
			
		||||
// A %(arity)s predicate-formatter functor.
 | 
			
		||||
struct PredFormatFunctor%(n)s {
 | 
			
		||||
  template <%(types)s>
 | 
			
		||||
  testing::AssertionResult operator()(""" % DEFS
 | 
			
		||||
 | 
			
		||||
  tests += Iter(n, 'const char* e%s', sep=""",
 | 
			
		||||
                                      """)
 | 
			
		||||
 | 
			
		||||
  tests += Iter(n, """,
 | 
			
		||||
                                      const T%s& v%s""")
 | 
			
		||||
 | 
			
		||||
  tests += """) const {
 | 
			
		||||
    return PredFormatFunction%(n)s(%(es)s, %(vs)s);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
""" % DEFS
 | 
			
		||||
 | 
			
		||||
  tests += """
 | 
			
		||||
// Tests for {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
 | 
			
		||||
 | 
			
		||||
class Predicate%(n)sTest : public testing::Test {
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    expected_to_finish_ = true;
 | 
			
		||||
    finished_ = false;""" % DEFS
 | 
			
		||||
 | 
			
		||||
  tests += """
 | 
			
		||||
    """ + Iter(n, 'n%s_ = ') + """0;
 | 
			
		||||
  }
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
  tests += """
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    // Verifies that each of the predicate's arguments was evaluated
 | 
			
		||||
    // exactly once."""
 | 
			
		||||
 | 
			
		||||
  tests += ''.join(["""
 | 
			
		||||
    EXPECT_EQ(1, n%s_) <<
 | 
			
		||||
        "The predicate assertion didn't evaluate argument %s "
 | 
			
		||||
        "exactly once.";""" % (i, i + 1) for i in OneTo(n)])
 | 
			
		||||
 | 
			
		||||
  tests += """
 | 
			
		||||
 | 
			
		||||
    // Verifies that the control flow in the test function is expected.
 | 
			
		||||
    if (expected_to_finish_ && !finished_) {
 | 
			
		||||
      FAIL() << "The predicate assertion unexpactedly aborted the test.";
 | 
			
		||||
    } else if (!expected_to_finish_ && finished_) {
 | 
			
		||||
      FAIL() << "The failed predicate assertion didn't abort the test "
 | 
			
		||||
                "as expected.";
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // true iff the test function is expected to run to finish.
 | 
			
		||||
  static bool expected_to_finish_;
 | 
			
		||||
 | 
			
		||||
  // true iff the test function did run to finish.
 | 
			
		||||
  static bool finished_;
 | 
			
		||||
""" % DEFS
 | 
			
		||||
 | 
			
		||||
  tests += Iter(n, """
 | 
			
		||||
  static int n%s_;""")
 | 
			
		||||
 | 
			
		||||
  tests += """
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
bool Predicate%(n)sTest::expected_to_finish_;
 | 
			
		||||
bool Predicate%(n)sTest::finished_;
 | 
			
		||||
""" % DEFS
 | 
			
		||||
 | 
			
		||||
  tests += Iter(n, """int Predicate%%(n)sTest::n%s_;
 | 
			
		||||
""") % DEFS
 | 
			
		||||
 | 
			
		||||
  tests += """
 | 
			
		||||
typedef Predicate%(n)sTest EXPECT_PRED_FORMAT%(n)sTest;
 | 
			
		||||
typedef Predicate%(n)sTest ASSERT_PRED_FORMAT%(n)sTest;
 | 
			
		||||
typedef Predicate%(n)sTest EXPECT_PRED%(n)sTest;
 | 
			
		||||
typedef Predicate%(n)sTest ASSERT_PRED%(n)sTest;
 | 
			
		||||
""" % DEFS
 | 
			
		||||
 | 
			
		||||
  def GenTest(use_format, use_assert, expect_failure,
 | 
			
		||||
              use_functor, use_user_type):
 | 
			
		||||
    """Returns the test for a predicate assertion macro.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
      use_format:     true iff the assertion is a *_PRED_FORMAT*.
 | 
			
		||||
      use_assert:     true iff the assertion is a ASSERT_*.
 | 
			
		||||
      expect_failure: true iff the assertion is expected to fail.
 | 
			
		||||
      use_functor:    true iff the first argument of the assertion is
 | 
			
		||||
                      a functor (as opposed to a function)
 | 
			
		||||
      use_user_type:  true iff the predicate functor/function takes
 | 
			
		||||
                      argument(s) of a user-defined type.
 | 
			
		||||
 | 
			
		||||
    Example:
 | 
			
		||||
 | 
			
		||||
      GenTest(1, 0, 0, 1, 0) returns a test that tests the behavior
 | 
			
		||||
      of a successful EXPECT_PRED_FORMATn() that takes a functor
 | 
			
		||||
      whose arguments have built-in types."""
 | 
			
		||||
 | 
			
		||||
    if use_assert:
 | 
			
		||||
      assrt = 'ASSERT'  # 'assert' is reserved, so we cannot use
 | 
			
		||||
                        # that identifier here.
 | 
			
		||||
    else:
 | 
			
		||||
      assrt = 'EXPECT'
 | 
			
		||||
 | 
			
		||||
    assertion = assrt + '_PRED'
 | 
			
		||||
 | 
			
		||||
    if use_format:
 | 
			
		||||
      pred_format = 'PredFormat'
 | 
			
		||||
      assertion += '_FORMAT'
 | 
			
		||||
    else:
 | 
			
		||||
      pred_format = 'Pred'
 | 
			
		||||
 | 
			
		||||
    assertion += '%(n)s' % DEFS
 | 
			
		||||
 | 
			
		||||
    if use_functor:
 | 
			
		||||
      pred_format_type = 'functor'
 | 
			
		||||
      pred_format += 'Functor%(n)s()'
 | 
			
		||||
    else:
 | 
			
		||||
      pred_format_type = 'function'
 | 
			
		||||
      pred_format += 'Function%(n)s'
 | 
			
		||||
      if not use_format:
 | 
			
		||||
        if use_user_type:
 | 
			
		||||
          pred_format += 'Bool'
 | 
			
		||||
        else:
 | 
			
		||||
          pred_format += 'Int'
 | 
			
		||||
 | 
			
		||||
    test_name = pred_format_type.title()
 | 
			
		||||
 | 
			
		||||
    if use_user_type:
 | 
			
		||||
      arg_type = 'user-defined type (Bool)'
 | 
			
		||||
      test_name += 'OnUserType'
 | 
			
		||||
      if expect_failure:
 | 
			
		||||
        arg = 'Bool(n%s_++)'
 | 
			
		||||
      else:
 | 
			
		||||
        arg = 'Bool(++n%s_)'
 | 
			
		||||
    else:
 | 
			
		||||
      arg_type = 'built-in type (int)'
 | 
			
		||||
      test_name += 'OnBuiltInType'
 | 
			
		||||
      if expect_failure:
 | 
			
		||||
        arg = 'n%s_++'
 | 
			
		||||
      else:
 | 
			
		||||
        arg = '++n%s_'
 | 
			
		||||
 | 
			
		||||
    if expect_failure:
 | 
			
		||||
      successful_or_failed = 'failed'
 | 
			
		||||
      expected_or_not = 'expected.'
 | 
			
		||||
      test_name +=  'Failure'
 | 
			
		||||
    else:
 | 
			
		||||
      successful_or_failed = 'successful'
 | 
			
		||||
      expected_or_not = 'UNEXPECTED!'
 | 
			
		||||
      test_name +=  'Success'
 | 
			
		||||
 | 
			
		||||
    # A map that defines the values used in the test template.
 | 
			
		||||
    defs = DEFS.copy()
 | 
			
		||||
    defs.update({
 | 
			
		||||
      'assert' : assrt,
 | 
			
		||||
      'assertion' : assertion,
 | 
			
		||||
      'test_name' : test_name,
 | 
			
		||||
      'pf_type' : pred_format_type,
 | 
			
		||||
      'pf' : pred_format,
 | 
			
		||||
      'arg_type' : arg_type,
 | 
			
		||||
      'arg' : arg,
 | 
			
		||||
      'successful' : successful_or_failed,
 | 
			
		||||
      'expected' : expected_or_not,
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
    test = """
 | 
			
		||||
// Tests a %(successful)s %(assertion)s where the
 | 
			
		||||
// predicate-formatter is a %(pf_type)s on a %(arg_type)s.
 | 
			
		||||
TEST_F(%(assertion)sTest, %(test_name)s) {""" % defs
 | 
			
		||||
 | 
			
		||||
    indent = (len(assertion) + 3)*' '
 | 
			
		||||
    extra_indent = ''
 | 
			
		||||
 | 
			
		||||
    if expect_failure:
 | 
			
		||||
      extra_indent = '  '
 | 
			
		||||
      if use_assert:
 | 
			
		||||
        test += """
 | 
			
		||||
  expected_to_finish_ = false;
 | 
			
		||||
  EXPECT_FATAL_FAILURE({  // NOLINT"""
 | 
			
		||||
      else:
 | 
			
		||||
        test += """
 | 
			
		||||
  EXPECT_NONFATAL_FAILURE({  // NOLINT"""
 | 
			
		||||
 | 
			
		||||
    test += '\n' + extra_indent + """  %(assertion)s(%(pf)s""" % defs
 | 
			
		||||
 | 
			
		||||
    test = test % defs
 | 
			
		||||
    test += Iter(n, ',\n' + indent + extra_indent + '%(arg)s' % defs)
 | 
			
		||||
    test += ');\n' + extra_indent + '  finished_ = true;\n'
 | 
			
		||||
 | 
			
		||||
    if expect_failure:
 | 
			
		||||
      test += '  }, "");\n'
 | 
			
		||||
 | 
			
		||||
    test += '}\n'
 | 
			
		||||
    return test
 | 
			
		||||
 | 
			
		||||
  # Generates tests for all 2**6 = 64 combinations.
 | 
			
		||||
  tests += ''.join([GenTest(use_format, use_assert, expect_failure,
 | 
			
		||||
                            use_functor, use_user_type)
 | 
			
		||||
                    for use_format in [0, 1]
 | 
			
		||||
                    for use_assert in [0, 1]
 | 
			
		||||
                    for expect_failure in [0, 1]
 | 
			
		||||
                    for use_functor in [0, 1]
 | 
			
		||||
                    for use_user_type in [0, 1]
 | 
			
		||||
                    ])
 | 
			
		||||
 | 
			
		||||
  return tests
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def UnitTestPostamble():
 | 
			
		||||
  """Returns the postamble for the tests."""
 | 
			
		||||
 | 
			
		||||
  return ''
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def GenerateUnitTest(n):
 | 
			
		||||
  """Returns the tests for up-to n-ary predicate assertions."""
 | 
			
		||||
 | 
			
		||||
  GenerateFile(UNIT_TEST,
 | 
			
		||||
               UnitTestPreamble()
 | 
			
		||||
               + ''.join([TestsForArity(i) for i in OneTo(n)])
 | 
			
		||||
               + UnitTestPostamble())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _Main():
 | 
			
		||||
  """The entry point of the script.  Generates the header file and its
 | 
			
		||||
  unit test."""
 | 
			
		||||
 | 
			
		||||
  if len(sys.argv) != 2:
 | 
			
		||||
    print __doc__
 | 
			
		||||
    print 'Author: ' + __author__
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
  n = int(sys.argv[1])
 | 
			
		||||
  GenerateHeader(n)
 | 
			
		||||
  GenerateUnitTest(n)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  _Main()
 | 
			
		||||
| 
						 | 
				
			
			@ -1,274 +0,0 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
# These variables are automatically filled in by the configure script.
 | 
			
		||||
name="@PACKAGE_TARNAME@"
 | 
			
		||||
version="@PACKAGE_VERSION@"
 | 
			
		||||
 | 
			
		||||
show_usage()
 | 
			
		||||
{
 | 
			
		||||
  echo "Usage: gtest-config [OPTIONS...]"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
show_help()
 | 
			
		||||
{
 | 
			
		||||
  show_usage
 | 
			
		||||
  cat <<\EOF
 | 
			
		||||
 | 
			
		||||
The `gtest-config' script provides access to the necessary compile and linking
 | 
			
		||||
flags to connect with Google C++ Testing Framework, both in a build prior to
 | 
			
		||||
installation, and on the system proper after installation. The installation
 | 
			
		||||
overrides may be issued in combination with any other queries, but will only
 | 
			
		||||
affect installation queries if called on a built but not installed gtest. The
 | 
			
		||||
installation queries may not be issued with any other types of queries, and
 | 
			
		||||
only one installation query may be made at a time. The version queries and
 | 
			
		||||
compiler flag queries may be combined as desired but not mixed. Different
 | 
			
		||||
version queries are always combined with logical "and" semantics, and only the
 | 
			
		||||
last of any particular query is used while all previous ones ignored. All
 | 
			
		||||
versions must be specified as a sequence of numbers separated by periods.
 | 
			
		||||
Compiler flag queries output the union of the sets of flags when combined.
 | 
			
		||||
 | 
			
		||||
 Examples:
 | 
			
		||||
  gtest-config --min-version=1.0 || echo "Insufficient Google Test version."
 | 
			
		||||
 | 
			
		||||
  g++ $(gtest-config --cppflags --cxxflags) -o foo.o -c foo.cpp
 | 
			
		||||
  g++ $(gtest-config --ldflags --libs) -o foo foo.o
 | 
			
		||||
 | 
			
		||||
  # When using a built but not installed Google Test:
 | 
			
		||||
  g++ $(../../my_gtest_build/scripts/gtest-config ...) ...
 | 
			
		||||
 | 
			
		||||
  # When using an installed Google Test, but with installation overrides:
 | 
			
		||||
  export GTEST_PREFIX="/opt"
 | 
			
		||||
  g++ $(gtest-config --libdir="/opt/lib64" ...) ...
 | 
			
		||||
 | 
			
		||||
 Help:
 | 
			
		||||
  --usage                    brief usage information
 | 
			
		||||
  --help                     display this help message
 | 
			
		||||
 | 
			
		||||
 Installation Overrides:
 | 
			
		||||
  --prefix=<dir>             overrides the installation prefix
 | 
			
		||||
  --exec-prefix=<dir>        overrides the executable installation prefix
 | 
			
		||||
  --libdir=<dir>             overrides the library installation prefix
 | 
			
		||||
  --includedir=<dir>         overrides the header file installation prefix
 | 
			
		||||
 | 
			
		||||
 Installation Queries:
 | 
			
		||||
  --prefix                   installation prefix
 | 
			
		||||
  --exec-prefix              executable installation prefix
 | 
			
		||||
  --libdir                   library installation directory
 | 
			
		||||
  --includedir               header file installation directory
 | 
			
		||||
  --version                  the version of the Google Test installation
 | 
			
		||||
 | 
			
		||||
 Version Queries:
 | 
			
		||||
  --min-version=VERSION      return 0 if the version is at least VERSION
 | 
			
		||||
  --exact-version=VERSION    return 0 if the version is exactly VERSION
 | 
			
		||||
  --max-version=VERSION      return 0 if the version is at most VERSION
 | 
			
		||||
 | 
			
		||||
 Compilation Flag Queries:
 | 
			
		||||
  --cppflags                 compile flags specific to the C-like preprocessors
 | 
			
		||||
  --cxxflags                 compile flags appropriate for C++ programs
 | 
			
		||||
  --ldflags                  linker flags
 | 
			
		||||
  --libs                     libraries for linking
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function bounds our version with a min and a max. It uses some clever
 | 
			
		||||
# POSIX-compliant variable expansion to portably do all the work in the shell
 | 
			
		||||
# and avoid any dependency on a particular "sed" or "awk" implementation.
 | 
			
		||||
# Notable is that it will only ever compare the first 3 components of versions.
 | 
			
		||||
# Further components will be cleanly stripped off. All versions must be
 | 
			
		||||
# unadorned, so "v1.0" will *not* work. The minimum version must be in $1, and
 | 
			
		||||
# the max in $2. TODO(chandlerc@google.com): If this ever breaks, we should
 | 
			
		||||
# investigate expanding this via autom4te from AS_VERSION_COMPARE rather than
 | 
			
		||||
# continuing to maintain our own shell version.
 | 
			
		||||
check_versions()
 | 
			
		||||
{
 | 
			
		||||
  major_version=${version%%.*}
 | 
			
		||||
  minor_version="0"
 | 
			
		||||
  point_version="0"
 | 
			
		||||
  if test "${version#*.}" != "${version}"; then
 | 
			
		||||
    minor_version=${version#*.}
 | 
			
		||||
    minor_version=${minor_version%%.*}
 | 
			
		||||
  fi
 | 
			
		||||
  if test "${version#*.*.}" != "${version}"; then
 | 
			
		||||
    point_version=${version#*.*.}
 | 
			
		||||
    point_version=${point_version%%.*}
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  min_version="$1"
 | 
			
		||||
  min_major_version=${min_version%%.*}
 | 
			
		||||
  min_minor_version="0"
 | 
			
		||||
  min_point_version="0"
 | 
			
		||||
  if test "${min_version#*.}" != "${min_version}"; then
 | 
			
		||||
    min_minor_version=${min_version#*.}
 | 
			
		||||
    min_minor_version=${min_minor_version%%.*}
 | 
			
		||||
  fi
 | 
			
		||||
  if test "${min_version#*.*.}" != "${min_version}"; then
 | 
			
		||||
    min_point_version=${min_version#*.*.}
 | 
			
		||||
    min_point_version=${min_point_version%%.*}
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  max_version="$2"
 | 
			
		||||
  max_major_version=${max_version%%.*}
 | 
			
		||||
  max_minor_version="0"
 | 
			
		||||
  max_point_version="0"
 | 
			
		||||
  if test "${max_version#*.}" != "${max_version}"; then
 | 
			
		||||
    max_minor_version=${max_version#*.}
 | 
			
		||||
    max_minor_version=${max_minor_version%%.*}
 | 
			
		||||
  fi
 | 
			
		||||
  if test "${max_version#*.*.}" != "${max_version}"; then
 | 
			
		||||
    max_point_version=${max_version#*.*.}
 | 
			
		||||
    max_point_version=${max_point_version%%.*}
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  test $(($major_version)) -lt $(($min_major_version)) && exit 1
 | 
			
		||||
  if test $(($major_version)) -eq $(($min_major_version)); then
 | 
			
		||||
    test $(($minor_version)) -lt $(($min_minor_version)) && exit 1
 | 
			
		||||
    if test $(($minor_version)) -eq $(($min_minor_version)); then
 | 
			
		||||
      test $(($point_version)) -lt $(($min_point_version)) && exit 1
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  test $(($major_version)) -gt $(($max_major_version)) && exit 1
 | 
			
		||||
  if test $(($major_version)) -eq $(($max_major_version)); then
 | 
			
		||||
    test $(($minor_version)) -gt $(($max_minor_version)) && exit 1
 | 
			
		||||
    if test $(($minor_version)) -eq $(($max_minor_version)); then
 | 
			
		||||
      test $(($point_version)) -gt $(($max_point_version)) && exit 1
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Show the usage line when no arguments are specified.
 | 
			
		||||
if test $# -eq 0; then
 | 
			
		||||
  show_usage
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
while test $# -gt 0; do
 | 
			
		||||
  case $1 in
 | 
			
		||||
    --usage)          show_usage;         exit 0;;
 | 
			
		||||
    --help)           show_help;          exit 0;;
 | 
			
		||||
 | 
			
		||||
    # Installation overrides
 | 
			
		||||
    --prefix=*)       GTEST_PREFIX=${1#--prefix=};;
 | 
			
		||||
    --exec-prefix=*)  GTEST_EXEC_PREFIX=${1#--exec-prefix=};;
 | 
			
		||||
    --libdir=*)       GTEST_LIBDIR=${1#--libdir=};;
 | 
			
		||||
    --includedir=*)   GTEST_INCLUDEDIR=${1#--includedir=};;
 | 
			
		||||
 | 
			
		||||
    # Installation queries
 | 
			
		||||
    --prefix|--exec-prefix|--libdir|--includedir|--version)
 | 
			
		||||
      if test -n "${do_query}"; then
 | 
			
		||||
        show_usage
 | 
			
		||||
        exit 1
 | 
			
		||||
      fi
 | 
			
		||||
      do_query=${1#--}
 | 
			
		||||
      ;;
 | 
			
		||||
 | 
			
		||||
    # Version checking
 | 
			
		||||
    --min-version=*)
 | 
			
		||||
      do_check_versions=yes
 | 
			
		||||
      min_version=${1#--min-version=}
 | 
			
		||||
      ;;
 | 
			
		||||
    --max-version=*)
 | 
			
		||||
      do_check_versions=yes
 | 
			
		||||
      max_version=${1#--max-version=}
 | 
			
		||||
      ;;
 | 
			
		||||
    --exact-version=*)
 | 
			
		||||
      do_check_versions=yes
 | 
			
		||||
      exact_version=${1#--exact-version=}
 | 
			
		||||
      ;;
 | 
			
		||||
 | 
			
		||||
    # Compiler flag output
 | 
			
		||||
    --cppflags)       echo_cppflags=yes;;
 | 
			
		||||
    --cxxflags)       echo_cxxflags=yes;;
 | 
			
		||||
    --ldflags)        echo_ldflags=yes;;
 | 
			
		||||
    --libs)           echo_libs=yes;;
 | 
			
		||||
 | 
			
		||||
    # Everything else is an error
 | 
			
		||||
    *)                show_usage;         exit 1;;
 | 
			
		||||
  esac
 | 
			
		||||
  shift
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
# These have defaults filled in by the configure script but can also be
 | 
			
		||||
# overridden by environment variables or command line parameters.
 | 
			
		||||
prefix="${GTEST_PREFIX:-@prefix@}"
 | 
			
		||||
exec_prefix="${GTEST_EXEC_PREFIX:-@exec_prefix@}"
 | 
			
		||||
libdir="${GTEST_LIBDIR:-@libdir@}"
 | 
			
		||||
includedir="${GTEST_INCLUDEDIR:-@includedir@}"
 | 
			
		||||
 | 
			
		||||
# We try and detect if our binary is not located at its installed location. If
 | 
			
		||||
# it's not, we provide variables pointing to the source and build tree rather
 | 
			
		||||
# than to the install tree. This allows building against a just-built gtest
 | 
			
		||||
# rather than an installed gtest.
 | 
			
		||||
bindir="@bindir@"
 | 
			
		||||
this_relative_bindir=`dirname $0`
 | 
			
		||||
this_bindir=`cd ${this_relative_bindir}; pwd -P`
 | 
			
		||||
if test "${this_bindir}" = "${this_bindir%${bindir}}"; then
 | 
			
		||||
  # The path to the script doesn't end in the bindir sequence from Autoconf,
 | 
			
		||||
  # assume that we are in a build tree.
 | 
			
		||||
  build_dir=`dirname ${this_bindir}`
 | 
			
		||||
  src_dir=`cd ${this_bindir}; cd @top_srcdir@; pwd -P`
 | 
			
		||||
 | 
			
		||||
  # TODO(chandlerc@google.com): This is a dangerous dependency on libtool, we
 | 
			
		||||
  # should work to remove it, and/or remove libtool altogether, replacing it
 | 
			
		||||
  # with direct references to the library and a link path.
 | 
			
		||||
  gtest_libs="${build_dir}/lib/libgtest.la @PTHREAD_CFLAGS@ @PTHREAD_LIBS@"
 | 
			
		||||
  gtest_ldflags=""
 | 
			
		||||
 | 
			
		||||
  # We provide hooks to include from either the source or build dir, where the
 | 
			
		||||
  # build dir is always preferred. This will potentially allow us to write
 | 
			
		||||
  # build rules for generated headers and have them automatically be preferred
 | 
			
		||||
  # over provided versions.
 | 
			
		||||
  gtest_cppflags="-I${build_dir}/include -I${src_dir}/include"
 | 
			
		||||
  gtest_cxxflags="@PTHREAD_CFLAGS@"
 | 
			
		||||
else
 | 
			
		||||
  # We're using an installed gtest, although it may be staged under some
 | 
			
		||||
  # prefix. Assume (as our own libraries do) that we can resolve the prefix,
 | 
			
		||||
  # and are present in the dynamic link paths.
 | 
			
		||||
  gtest_ldflags="-L${libdir}"
 | 
			
		||||
  gtest_libs="-l${name} @PTHREAD_CFLAGS@ @PTHREAD_LIBS@"
 | 
			
		||||
  gtest_cppflags="-I${includedir}"
 | 
			
		||||
  gtest_cxxflags="@PTHREAD_CFLAGS@"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Do an installation query if requested.
 | 
			
		||||
if test -n "$do_query"; then
 | 
			
		||||
  case $do_query in
 | 
			
		||||
    prefix)           echo $prefix;       exit 0;;
 | 
			
		||||
    exec-prefix)      echo $exec_prefix;  exit 0;;
 | 
			
		||||
    libdir)           echo $libdir;       exit 0;;
 | 
			
		||||
    includedir)       echo $includedir;   exit 0;;
 | 
			
		||||
    version)          echo $version;      exit 0;;
 | 
			
		||||
    *)                show_usage;         exit 1;;
 | 
			
		||||
  esac
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Do a version check if requested.
 | 
			
		||||
if test "$do_check_versions" = "yes"; then
 | 
			
		||||
  # Make sure we didn't receive a bad combination of parameters.
 | 
			
		||||
  test "$echo_cppflags" = "yes" && show_usage && exit 1
 | 
			
		||||
  test "$echo_cxxflags" = "yes" && show_usage && exit 1
 | 
			
		||||
  test "$echo_ldflags" = "yes"  && show_usage && exit 1
 | 
			
		||||
  test "$echo_libs" = "yes"     && show_usage && exit 1
 | 
			
		||||
 | 
			
		||||
  if test "$exact_version" != ""; then
 | 
			
		||||
    check_versions $exact_version $exact_version
 | 
			
		||||
    # unreachable
 | 
			
		||||
  else
 | 
			
		||||
    check_versions ${min_version:-0.0.0} ${max_version:-9999.9999.9999}
 | 
			
		||||
    # unreachable
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Do the output in the correct order so that these can be used in-line of
 | 
			
		||||
# a compiler invocation.
 | 
			
		||||
output=""
 | 
			
		||||
test "$echo_cppflags" = "yes" && output="$output $gtest_cppflags"
 | 
			
		||||
test "$echo_cxxflags" = "yes" && output="$output $gtest_cxxflags"
 | 
			
		||||
test "$echo_ldflags" = "yes"  && output="$output $gtest_ldflags"
 | 
			
		||||
test "$echo_libs" = "yes"     && output="$output $gtest_libs"
 | 
			
		||||
echo $output
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
| 
						 | 
				
			
			@ -1,855 +0,0 @@
 | 
			
		|||
#!/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.
 | 
			
		||||
 | 
			
		||||
"""pump v0.2.0 - Pretty Useful for Meta Programming.
 | 
			
		||||
 | 
			
		||||
A tool for preprocessor meta programming.  Useful for generating
 | 
			
		||||
repetitive boilerplate code.  Especially useful for writing C++
 | 
			
		||||
classes, functions, macros, and templates that need to work with
 | 
			
		||||
various number of arguments.
 | 
			
		||||
 | 
			
		||||
USAGE:
 | 
			
		||||
       pump.py SOURCE_FILE
 | 
			
		||||
 | 
			
		||||
EXAMPLES:
 | 
			
		||||
       pump.py foo.cc.pump
 | 
			
		||||
         Converts foo.cc.pump to foo.cc.
 | 
			
		||||
 | 
			
		||||
GRAMMAR:
 | 
			
		||||
       CODE ::= ATOMIC_CODE*
 | 
			
		||||
       ATOMIC_CODE ::= $var ID = EXPRESSION
 | 
			
		||||
           | $var ID = [[ CODE ]]
 | 
			
		||||
           | $range ID EXPRESSION..EXPRESSION
 | 
			
		||||
           | $for ID SEPARATOR [[ CODE ]]
 | 
			
		||||
           | $($)
 | 
			
		||||
           | $ID
 | 
			
		||||
           | $(EXPRESSION)
 | 
			
		||||
           | $if EXPRESSION [[ CODE ]] ELSE_BRANCH
 | 
			
		||||
           | [[ CODE ]]
 | 
			
		||||
           | RAW_CODE
 | 
			
		||||
       SEPARATOR ::= RAW_CODE | EMPTY
 | 
			
		||||
       ELSE_BRANCH ::= $else [[ CODE ]]
 | 
			
		||||
           | $elif EXPRESSION [[ CODE ]] ELSE_BRANCH
 | 
			
		||||
           | EMPTY
 | 
			
		||||
       EXPRESSION has Python syntax.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
__author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import re
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TOKEN_TABLE = [
 | 
			
		||||
    (re.compile(r'\$var\s+'), '$var'),
 | 
			
		||||
    (re.compile(r'\$elif\s+'), '$elif'),
 | 
			
		||||
    (re.compile(r'\$else\s+'), '$else'),
 | 
			
		||||
    (re.compile(r'\$for\s+'), '$for'),
 | 
			
		||||
    (re.compile(r'\$if\s+'), '$if'),
 | 
			
		||||
    (re.compile(r'\$range\s+'), '$range'),
 | 
			
		||||
    (re.compile(r'\$[_A-Za-z]\w*'), '$id'),
 | 
			
		||||
    (re.compile(r'\$\(\$\)'), '$($)'),
 | 
			
		||||
    (re.compile(r'\$'), '$'),
 | 
			
		||||
    (re.compile(r'\[\[\n?'), '[['),
 | 
			
		||||
    (re.compile(r'\]\]\n?'), ']]'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Cursor:
 | 
			
		||||
  """Represents a position (line and column) in a text file."""
 | 
			
		||||
 | 
			
		||||
  def __init__(self, line=-1, column=-1):
 | 
			
		||||
    self.line = line
 | 
			
		||||
    self.column = column
 | 
			
		||||
 | 
			
		||||
  def __eq__(self, rhs):
 | 
			
		||||
    return self.line == rhs.line and self.column == rhs.column
 | 
			
		||||
 | 
			
		||||
  def __ne__(self, rhs):
 | 
			
		||||
    return not self == rhs
 | 
			
		||||
 | 
			
		||||
  def __lt__(self, rhs):
 | 
			
		||||
    return self.line < rhs.line or (
 | 
			
		||||
        self.line == rhs.line and self.column < rhs.column)
 | 
			
		||||
 | 
			
		||||
  def __le__(self, rhs):
 | 
			
		||||
    return self < rhs or self == rhs
 | 
			
		||||
 | 
			
		||||
  def __gt__(self, rhs):
 | 
			
		||||
    return rhs < self
 | 
			
		||||
 | 
			
		||||
  def __ge__(self, rhs):
 | 
			
		||||
    return rhs <= self
 | 
			
		||||
 | 
			
		||||
  def __str__(self):
 | 
			
		||||
    if self == Eof():
 | 
			
		||||
      return 'EOF'
 | 
			
		||||
    else:
 | 
			
		||||
      return '%s(%s)' % (self.line + 1, self.column)
 | 
			
		||||
 | 
			
		||||
  def __add__(self, offset):
 | 
			
		||||
    return Cursor(self.line, self.column + offset)
 | 
			
		||||
 | 
			
		||||
  def __sub__(self, offset):
 | 
			
		||||
    return Cursor(self.line, self.column - offset)
 | 
			
		||||
 | 
			
		||||
  def Clone(self):
 | 
			
		||||
    """Returns a copy of self."""
 | 
			
		||||
 | 
			
		||||
    return Cursor(self.line, self.column)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Special cursor to indicate the end-of-file.
 | 
			
		||||
def Eof():
 | 
			
		||||
  """Returns the special cursor to denote the end-of-file."""
 | 
			
		||||
  return Cursor(-1, -1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Token:
 | 
			
		||||
  """Represents a token in a Pump source file."""
 | 
			
		||||
 | 
			
		||||
  def __init__(self, start=None, end=None, value=None, token_type=None):
 | 
			
		||||
    if start is None:
 | 
			
		||||
      self.start = Eof()
 | 
			
		||||
    else:
 | 
			
		||||
      self.start = start
 | 
			
		||||
    if end is None:
 | 
			
		||||
      self.end = Eof()
 | 
			
		||||
    else:
 | 
			
		||||
      self.end = end
 | 
			
		||||
    self.value = value
 | 
			
		||||
    self.token_type = token_type
 | 
			
		||||
 | 
			
		||||
  def __str__(self):
 | 
			
		||||
    return 'Token @%s: \'%s\' type=%s' % (
 | 
			
		||||
        self.start, self.value, self.token_type)
 | 
			
		||||
 | 
			
		||||
  def Clone(self):
 | 
			
		||||
    """Returns a copy of self."""
 | 
			
		||||
 | 
			
		||||
    return Token(self.start.Clone(), self.end.Clone(), self.value,
 | 
			
		||||
                 self.token_type)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def StartsWith(lines, pos, string):
 | 
			
		||||
  """Returns True iff the given position in lines starts with 'string'."""
 | 
			
		||||
 | 
			
		||||
  return lines[pos.line][pos.column:].startswith(string)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def FindFirstInLine(line, token_table):
 | 
			
		||||
  best_match_start = -1
 | 
			
		||||
  for (regex, token_type) in token_table:
 | 
			
		||||
    m = regex.search(line)
 | 
			
		||||
    if m:
 | 
			
		||||
      # We found regex in lines
 | 
			
		||||
      if best_match_start < 0 or m.start() < best_match_start:
 | 
			
		||||
        best_match_start = m.start()
 | 
			
		||||
        best_match_length = m.end() - m.start()
 | 
			
		||||
        best_match_token_type = token_type
 | 
			
		||||
 | 
			
		||||
  if best_match_start < 0:
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
  return (best_match_start, best_match_length, best_match_token_type)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def FindFirst(lines, token_table, cursor):
 | 
			
		||||
  """Finds the first occurrence of any string in strings in lines."""
 | 
			
		||||
 | 
			
		||||
  start = cursor.Clone()
 | 
			
		||||
  cur_line_number = cursor.line
 | 
			
		||||
  for line in lines[start.line:]:
 | 
			
		||||
    if cur_line_number == start.line:
 | 
			
		||||
      line = line[start.column:]
 | 
			
		||||
    m = FindFirstInLine(line, token_table)
 | 
			
		||||
    if m:
 | 
			
		||||
      # We found a regex in line.
 | 
			
		||||
      (start_column, length, token_type) = m
 | 
			
		||||
      if cur_line_number == start.line:
 | 
			
		||||
        start_column += start.column
 | 
			
		||||
      found_start = Cursor(cur_line_number, start_column)
 | 
			
		||||
      found_end = found_start + length
 | 
			
		||||
      return MakeToken(lines, found_start, found_end, token_type)
 | 
			
		||||
    cur_line_number += 1
 | 
			
		||||
  # We failed to find str in lines
 | 
			
		||||
  return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def SubString(lines, start, end):
 | 
			
		||||
  """Returns a substring in lines."""
 | 
			
		||||
 | 
			
		||||
  if end == Eof():
 | 
			
		||||
    end = Cursor(len(lines) - 1, len(lines[-1]))
 | 
			
		||||
 | 
			
		||||
  if start >= end:
 | 
			
		||||
    return ''
 | 
			
		||||
 | 
			
		||||
  if start.line == end.line:
 | 
			
		||||
    return lines[start.line][start.column:end.column]
 | 
			
		||||
 | 
			
		||||
  result_lines = ([lines[start.line][start.column:]] +
 | 
			
		||||
                  lines[start.line + 1:end.line] +
 | 
			
		||||
                  [lines[end.line][:end.column]])
 | 
			
		||||
  return ''.join(result_lines)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def StripMetaComments(str):
 | 
			
		||||
  """Strip meta comments from each line in the given string."""
 | 
			
		||||
 | 
			
		||||
  # First, completely remove lines containing nothing but a meta
 | 
			
		||||
  # comment, including the trailing \n.
 | 
			
		||||
  str = re.sub(r'^\s*\$\$.*\n', '', str)
 | 
			
		||||
 | 
			
		||||
  # Then, remove meta comments from contentful lines.
 | 
			
		||||
  return re.sub(r'\s*\$\$.*', '', str)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def MakeToken(lines, start, end, token_type):
 | 
			
		||||
  """Creates a new instance of Token."""
 | 
			
		||||
 | 
			
		||||
  return Token(start, end, SubString(lines, start, end), token_type)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ParseToken(lines, pos, regex, token_type):
 | 
			
		||||
  line = lines[pos.line][pos.column:]
 | 
			
		||||
  m = regex.search(line)
 | 
			
		||||
  if m and not m.start():
 | 
			
		||||
    return MakeToken(lines, pos, pos + m.end(), token_type)
 | 
			
		||||
  else:
 | 
			
		||||
    print 'ERROR: %s expected at %s.' % (token_type, pos)
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ID_REGEX = re.compile(r'[_A-Za-z]\w*')
 | 
			
		||||
EQ_REGEX = re.compile(r'=')
 | 
			
		||||
REST_OF_LINE_REGEX = re.compile(r'.*?(?=$|\$\$)')
 | 
			
		||||
OPTIONAL_WHITE_SPACES_REGEX = re.compile(r'\s*')
 | 
			
		||||
WHITE_SPACE_REGEX = re.compile(r'\s')
 | 
			
		||||
DOT_DOT_REGEX = re.compile(r'\.\.')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def Skip(lines, pos, regex):
 | 
			
		||||
  line = lines[pos.line][pos.column:]
 | 
			
		||||
  m = re.search(regex, line)
 | 
			
		||||
  if m and not m.start():
 | 
			
		||||
    return pos + m.end()
 | 
			
		||||
  else:
 | 
			
		||||
    return pos
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def SkipUntil(lines, pos, regex, token_type):
 | 
			
		||||
  line = lines[pos.line][pos.column:]
 | 
			
		||||
  m = re.search(regex, line)
 | 
			
		||||
  if m:
 | 
			
		||||
    return pos + m.start()
 | 
			
		||||
  else:
 | 
			
		||||
    print ('ERROR: %s expected on line %s after column %s.' %
 | 
			
		||||
           (token_type, pos.line + 1, pos.column))
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ParseExpTokenInParens(lines, pos):
 | 
			
		||||
  def ParseInParens(pos):
 | 
			
		||||
    pos = Skip(lines, pos, OPTIONAL_WHITE_SPACES_REGEX)
 | 
			
		||||
    pos = Skip(lines, pos, r'\(')
 | 
			
		||||
    pos = Parse(pos)
 | 
			
		||||
    pos = Skip(lines, pos, r'\)')
 | 
			
		||||
    return pos
 | 
			
		||||
 | 
			
		||||
  def Parse(pos):
 | 
			
		||||
    pos = SkipUntil(lines, pos, r'\(|\)', ')')
 | 
			
		||||
    if SubString(lines, pos, pos + 1) == '(':
 | 
			
		||||
      pos = Parse(pos + 1)
 | 
			
		||||
      pos = Skip(lines, pos, r'\)')
 | 
			
		||||
      return Parse(pos)
 | 
			
		||||
    else:
 | 
			
		||||
      return pos
 | 
			
		||||
 | 
			
		||||
  start = pos.Clone()
 | 
			
		||||
  pos = ParseInParens(pos)
 | 
			
		||||
  return MakeToken(lines, start, pos, 'exp')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RStripNewLineFromToken(token):
 | 
			
		||||
  if token.value.endswith('\n'):
 | 
			
		||||
    return Token(token.start, token.end, token.value[:-1], token.token_type)
 | 
			
		||||
  else:
 | 
			
		||||
    return token
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def TokenizeLines(lines, pos):
 | 
			
		||||
  while True:
 | 
			
		||||
    found = FindFirst(lines, TOKEN_TABLE, pos)
 | 
			
		||||
    if not found:
 | 
			
		||||
      yield MakeToken(lines, pos, Eof(), 'code')
 | 
			
		||||
      return
 | 
			
		||||
 | 
			
		||||
    if found.start == pos:
 | 
			
		||||
      prev_token = None
 | 
			
		||||
      prev_token_rstripped = None
 | 
			
		||||
    else:
 | 
			
		||||
      prev_token = MakeToken(lines, pos, found.start, 'code')
 | 
			
		||||
      prev_token_rstripped = RStripNewLineFromToken(prev_token)
 | 
			
		||||
 | 
			
		||||
    if found.token_type == '$var':
 | 
			
		||||
      if prev_token_rstripped:
 | 
			
		||||
        yield prev_token_rstripped
 | 
			
		||||
      yield found
 | 
			
		||||
      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')
 | 
			
		||||
      yield id_token
 | 
			
		||||
      pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX)
 | 
			
		||||
 | 
			
		||||
      eq_token = ParseToken(lines, pos, EQ_REGEX, '=')
 | 
			
		||||
      yield eq_token
 | 
			
		||||
      pos = Skip(lines, eq_token.end, r'\s*')
 | 
			
		||||
 | 
			
		||||
      if SubString(lines, pos, pos + 2) != '[[':
 | 
			
		||||
        exp_token = ParseToken(lines, pos, REST_OF_LINE_REGEX, 'exp')
 | 
			
		||||
        yield exp_token
 | 
			
		||||
        pos = Cursor(exp_token.end.line + 1, 0)
 | 
			
		||||
    elif found.token_type == '$for':
 | 
			
		||||
      if prev_token_rstripped:
 | 
			
		||||
        yield prev_token_rstripped
 | 
			
		||||
      yield found
 | 
			
		||||
      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')
 | 
			
		||||
      yield id_token
 | 
			
		||||
      pos = Skip(lines, id_token.end, WHITE_SPACE_REGEX)
 | 
			
		||||
    elif found.token_type == '$range':
 | 
			
		||||
      if prev_token_rstripped:
 | 
			
		||||
        yield prev_token_rstripped
 | 
			
		||||
      yield found
 | 
			
		||||
      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')
 | 
			
		||||
      yield id_token
 | 
			
		||||
      pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX)
 | 
			
		||||
 | 
			
		||||
      dots_pos = SkipUntil(lines, pos, DOT_DOT_REGEX, '..')
 | 
			
		||||
      yield MakeToken(lines, pos, dots_pos, 'exp')
 | 
			
		||||
      yield MakeToken(lines, dots_pos, dots_pos + 2, '..')
 | 
			
		||||
      pos = dots_pos + 2
 | 
			
		||||
      new_pos = Cursor(pos.line + 1, 0)
 | 
			
		||||
      yield MakeToken(lines, pos, new_pos, 'exp')
 | 
			
		||||
      pos = new_pos
 | 
			
		||||
    elif found.token_type == '$':
 | 
			
		||||
      if prev_token:
 | 
			
		||||
        yield prev_token
 | 
			
		||||
      yield found
 | 
			
		||||
      exp_token = ParseExpTokenInParens(lines, found.end)
 | 
			
		||||
      yield exp_token
 | 
			
		||||
      pos = exp_token.end
 | 
			
		||||
    elif (found.token_type == ']]' or found.token_type == '$if' or
 | 
			
		||||
          found.token_type == '$elif' or found.token_type == '$else'):
 | 
			
		||||
      if prev_token_rstripped:
 | 
			
		||||
        yield prev_token_rstripped
 | 
			
		||||
      yield found
 | 
			
		||||
      pos = found.end
 | 
			
		||||
    else:
 | 
			
		||||
      if prev_token:
 | 
			
		||||
        yield prev_token
 | 
			
		||||
      yield found
 | 
			
		||||
      pos = found.end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def Tokenize(s):
 | 
			
		||||
  """A generator that yields the tokens in the given string."""
 | 
			
		||||
  if s != '':
 | 
			
		||||
    lines = s.splitlines(True)
 | 
			
		||||
    for token in TokenizeLines(lines, Cursor(0, 0)):
 | 
			
		||||
      yield token
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CodeNode:
 | 
			
		||||
  def __init__(self, atomic_code_list=None):
 | 
			
		||||
    self.atomic_code = atomic_code_list
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class VarNode:
 | 
			
		||||
  def __init__(self, identifier=None, atomic_code=None):
 | 
			
		||||
    self.identifier = identifier
 | 
			
		||||
    self.atomic_code = atomic_code
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RangeNode:
 | 
			
		||||
  def __init__(self, identifier=None, exp1=None, exp2=None):
 | 
			
		||||
    self.identifier = identifier
 | 
			
		||||
    self.exp1 = exp1
 | 
			
		||||
    self.exp2 = exp2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ForNode:
 | 
			
		||||
  def __init__(self, identifier=None, sep=None, code=None):
 | 
			
		||||
    self.identifier = identifier
 | 
			
		||||
    self.sep = sep
 | 
			
		||||
    self.code = code
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ElseNode:
 | 
			
		||||
  def __init__(self, else_branch=None):
 | 
			
		||||
    self.else_branch = else_branch
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class IfNode:
 | 
			
		||||
  def __init__(self, exp=None, then_branch=None, else_branch=None):
 | 
			
		||||
    self.exp = exp
 | 
			
		||||
    self.then_branch = then_branch
 | 
			
		||||
    self.else_branch = else_branch
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RawCodeNode:
 | 
			
		||||
  def __init__(self, token=None):
 | 
			
		||||
    self.raw_code = token
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class LiteralDollarNode:
 | 
			
		||||
  def __init__(self, token):
 | 
			
		||||
    self.token = token
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ExpNode:
 | 
			
		||||
  def __init__(self, token, python_exp):
 | 
			
		||||
    self.token = token
 | 
			
		||||
    self.python_exp = python_exp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def PopFront(a_list):
 | 
			
		||||
  head = a_list[0]
 | 
			
		||||
  a_list[:1] = []
 | 
			
		||||
  return head
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def PushFront(a_list, elem):
 | 
			
		||||
  a_list[:0] = [elem]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def PopToken(a_list, token_type=None):
 | 
			
		||||
  token = PopFront(a_list)
 | 
			
		||||
  if token_type is not None and token.token_type != token_type:
 | 
			
		||||
    print 'ERROR: %s expected at %s' % (token_type, token.start)
 | 
			
		||||
    print 'ERROR: %s found instead' % (token,)
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
  return token
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def PeekToken(a_list):
 | 
			
		||||
  if not a_list:
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
  return a_list[0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ParseExpNode(token):
 | 
			
		||||
  python_exp = re.sub(r'([_A-Za-z]\w*)', r'self.GetValue("\1")', token.value)
 | 
			
		||||
  return ExpNode(token, python_exp)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ParseElseNode(tokens):
 | 
			
		||||
  def Pop(token_type=None):
 | 
			
		||||
    return PopToken(tokens, token_type)
 | 
			
		||||
 | 
			
		||||
  next = PeekToken(tokens)
 | 
			
		||||
  if not next:
 | 
			
		||||
    return None
 | 
			
		||||
  if next.token_type == '$else':
 | 
			
		||||
    Pop('$else')
 | 
			
		||||
    Pop('[[')
 | 
			
		||||
    code_node = ParseCodeNode(tokens)
 | 
			
		||||
    Pop(']]')
 | 
			
		||||
    return code_node
 | 
			
		||||
  elif next.token_type == '$elif':
 | 
			
		||||
    Pop('$elif')
 | 
			
		||||
    exp = Pop('code')
 | 
			
		||||
    Pop('[[')
 | 
			
		||||
    code_node = ParseCodeNode(tokens)
 | 
			
		||||
    Pop(']]')
 | 
			
		||||
    inner_else_node = ParseElseNode(tokens)
 | 
			
		||||
    return CodeNode([IfNode(ParseExpNode(exp), code_node, inner_else_node)])
 | 
			
		||||
  elif not next.value.strip():
 | 
			
		||||
    Pop('code')
 | 
			
		||||
    return ParseElseNode(tokens)
 | 
			
		||||
  else:
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ParseAtomicCodeNode(tokens):
 | 
			
		||||
  def Pop(token_type=None):
 | 
			
		||||
    return PopToken(tokens, token_type)
 | 
			
		||||
 | 
			
		||||
  head = PopFront(tokens)
 | 
			
		||||
  t = head.token_type
 | 
			
		||||
  if t == 'code':
 | 
			
		||||
    return RawCodeNode(head)
 | 
			
		||||
  elif t == '$var':
 | 
			
		||||
    id_token = Pop('id')
 | 
			
		||||
    Pop('=')
 | 
			
		||||
    next = PeekToken(tokens)
 | 
			
		||||
    if next.token_type == 'exp':
 | 
			
		||||
      exp_token = Pop()
 | 
			
		||||
      return VarNode(id_token, ParseExpNode(exp_token))
 | 
			
		||||
    Pop('[[')
 | 
			
		||||
    code_node = ParseCodeNode(tokens)
 | 
			
		||||
    Pop(']]')
 | 
			
		||||
    return VarNode(id_token, code_node)
 | 
			
		||||
  elif t == '$for':
 | 
			
		||||
    id_token = Pop('id')
 | 
			
		||||
    next_token = PeekToken(tokens)
 | 
			
		||||
    if next_token.token_type == 'code':
 | 
			
		||||
      sep_token = next_token
 | 
			
		||||
      Pop('code')
 | 
			
		||||
    else:
 | 
			
		||||
      sep_token = None
 | 
			
		||||
    Pop('[[')
 | 
			
		||||
    code_node = ParseCodeNode(tokens)
 | 
			
		||||
    Pop(']]')
 | 
			
		||||
    return ForNode(id_token, sep_token, code_node)
 | 
			
		||||
  elif t == '$if':
 | 
			
		||||
    exp_token = Pop('code')
 | 
			
		||||
    Pop('[[')
 | 
			
		||||
    code_node = ParseCodeNode(tokens)
 | 
			
		||||
    Pop(']]')
 | 
			
		||||
    else_node = ParseElseNode(tokens)
 | 
			
		||||
    return IfNode(ParseExpNode(exp_token), code_node, else_node)
 | 
			
		||||
  elif t == '$range':
 | 
			
		||||
    id_token = Pop('id')
 | 
			
		||||
    exp1_token = Pop('exp')
 | 
			
		||||
    Pop('..')
 | 
			
		||||
    exp2_token = Pop('exp')
 | 
			
		||||
    return RangeNode(id_token, ParseExpNode(exp1_token),
 | 
			
		||||
                     ParseExpNode(exp2_token))
 | 
			
		||||
  elif t == '$id':
 | 
			
		||||
    return ParseExpNode(Token(head.start + 1, head.end, head.value[1:], 'id'))
 | 
			
		||||
  elif t == '$($)':
 | 
			
		||||
    return LiteralDollarNode(head)
 | 
			
		||||
  elif t == '$':
 | 
			
		||||
    exp_token = Pop('exp')
 | 
			
		||||
    return ParseExpNode(exp_token)
 | 
			
		||||
  elif t == '[[':
 | 
			
		||||
    code_node = ParseCodeNode(tokens)
 | 
			
		||||
    Pop(']]')
 | 
			
		||||
    return code_node
 | 
			
		||||
  else:
 | 
			
		||||
    PushFront(tokens, head)
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ParseCodeNode(tokens):
 | 
			
		||||
  atomic_code_list = []
 | 
			
		||||
  while True:
 | 
			
		||||
    if not tokens:
 | 
			
		||||
      break
 | 
			
		||||
    atomic_code_node = ParseAtomicCodeNode(tokens)
 | 
			
		||||
    if atomic_code_node:
 | 
			
		||||
      atomic_code_list.append(atomic_code_node)
 | 
			
		||||
    else:
 | 
			
		||||
      break
 | 
			
		||||
  return CodeNode(atomic_code_list)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ParseToAST(pump_src_text):
 | 
			
		||||
  """Convert the given Pump source text into an AST."""
 | 
			
		||||
  tokens = list(Tokenize(pump_src_text))
 | 
			
		||||
  code_node = ParseCodeNode(tokens)
 | 
			
		||||
  return code_node
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Env:
 | 
			
		||||
  def __init__(self):
 | 
			
		||||
    self.variables = []
 | 
			
		||||
    self.ranges = []
 | 
			
		||||
 | 
			
		||||
  def Clone(self):
 | 
			
		||||
    clone = Env()
 | 
			
		||||
    clone.variables = self.variables[:]
 | 
			
		||||
    clone.ranges = self.ranges[:]
 | 
			
		||||
    return clone
 | 
			
		||||
 | 
			
		||||
  def PushVariable(self, var, value):
 | 
			
		||||
    # If value looks like an int, store it as an int.
 | 
			
		||||
    try:
 | 
			
		||||
      int_value = int(value)
 | 
			
		||||
      if ('%s' % int_value) == value:
 | 
			
		||||
        value = int_value
 | 
			
		||||
    except Exception:
 | 
			
		||||
      pass
 | 
			
		||||
    self.variables[:0] = [(var, value)]
 | 
			
		||||
 | 
			
		||||
  def PopVariable(self):
 | 
			
		||||
    self.variables[:1] = []
 | 
			
		||||
 | 
			
		||||
  def PushRange(self, var, lower, upper):
 | 
			
		||||
    self.ranges[:0] = [(var, lower, upper)]
 | 
			
		||||
 | 
			
		||||
  def PopRange(self):
 | 
			
		||||
    self.ranges[:1] = []
 | 
			
		||||
 | 
			
		||||
  def GetValue(self, identifier):
 | 
			
		||||
    for (var, value) in self.variables:
 | 
			
		||||
      if identifier == var:
 | 
			
		||||
        return value
 | 
			
		||||
 | 
			
		||||
    print 'ERROR: meta variable %s is undefined.' % (identifier,)
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
  def EvalExp(self, exp):
 | 
			
		||||
    try:
 | 
			
		||||
      result = eval(exp.python_exp)
 | 
			
		||||
    except Exception, e:
 | 
			
		||||
      print 'ERROR: caught exception %s: %s' % (e.__class__.__name__, e)
 | 
			
		||||
      print ('ERROR: failed to evaluate meta expression %s at %s' %
 | 
			
		||||
             (exp.python_exp, exp.token.start))
 | 
			
		||||
      sys.exit(1)
 | 
			
		||||
    return result
 | 
			
		||||
 | 
			
		||||
  def GetRange(self, identifier):
 | 
			
		||||
    for (var, lower, upper) in self.ranges:
 | 
			
		||||
      if identifier == var:
 | 
			
		||||
        return (lower, upper)
 | 
			
		||||
 | 
			
		||||
    print 'ERROR: range %s is undefined.' % (identifier,)
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Output:
 | 
			
		||||
  def __init__(self):
 | 
			
		||||
    self.string = ''
 | 
			
		||||
 | 
			
		||||
  def GetLastLine(self):
 | 
			
		||||
    index = self.string.rfind('\n')
 | 
			
		||||
    if index < 0:
 | 
			
		||||
      return ''
 | 
			
		||||
 | 
			
		||||
    return self.string[index + 1:]
 | 
			
		||||
 | 
			
		||||
  def Append(self, s):
 | 
			
		||||
    self.string += s
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RunAtomicCode(env, node, output):
 | 
			
		||||
  if isinstance(node, VarNode):
 | 
			
		||||
    identifier = node.identifier.value.strip()
 | 
			
		||||
    result = Output()
 | 
			
		||||
    RunAtomicCode(env.Clone(), node.atomic_code, result)
 | 
			
		||||
    value = result.string
 | 
			
		||||
    env.PushVariable(identifier, value)
 | 
			
		||||
  elif isinstance(node, RangeNode):
 | 
			
		||||
    identifier = node.identifier.value.strip()
 | 
			
		||||
    lower = int(env.EvalExp(node.exp1))
 | 
			
		||||
    upper = int(env.EvalExp(node.exp2))
 | 
			
		||||
    env.PushRange(identifier, lower, upper)
 | 
			
		||||
  elif isinstance(node, ForNode):
 | 
			
		||||
    identifier = node.identifier.value.strip()
 | 
			
		||||
    if node.sep is None:
 | 
			
		||||
      sep = ''
 | 
			
		||||
    else:
 | 
			
		||||
      sep = node.sep.value
 | 
			
		||||
    (lower, upper) = env.GetRange(identifier)
 | 
			
		||||
    for i in range(lower, upper + 1):
 | 
			
		||||
      new_env = env.Clone()
 | 
			
		||||
      new_env.PushVariable(identifier, i)
 | 
			
		||||
      RunCode(new_env, node.code, output)
 | 
			
		||||
      if i != upper:
 | 
			
		||||
        output.Append(sep)
 | 
			
		||||
  elif isinstance(node, RawCodeNode):
 | 
			
		||||
    output.Append(node.raw_code.value)
 | 
			
		||||
  elif isinstance(node, IfNode):
 | 
			
		||||
    cond = env.EvalExp(node.exp)
 | 
			
		||||
    if cond:
 | 
			
		||||
      RunCode(env.Clone(), node.then_branch, output)
 | 
			
		||||
    elif node.else_branch is not None:
 | 
			
		||||
      RunCode(env.Clone(), node.else_branch, output)
 | 
			
		||||
  elif isinstance(node, ExpNode):
 | 
			
		||||
    value = env.EvalExp(node)
 | 
			
		||||
    output.Append('%s' % (value,))
 | 
			
		||||
  elif isinstance(node, LiteralDollarNode):
 | 
			
		||||
    output.Append('$')
 | 
			
		||||
  elif isinstance(node, CodeNode):
 | 
			
		||||
    RunCode(env.Clone(), node, output)
 | 
			
		||||
  else:
 | 
			
		||||
    print 'BAD'
 | 
			
		||||
    print node
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RunCode(env, code_node, output):
 | 
			
		||||
  for atomic_code in code_node.atomic_code:
 | 
			
		||||
    RunAtomicCode(env, atomic_code, output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def IsSingleLineComment(cur_line):
 | 
			
		||||
  return '//' in cur_line
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def IsInPreprocessorDirective(prev_lines, cur_line):
 | 
			
		||||
  if cur_line.lstrip().startswith('#'):
 | 
			
		||||
    return True
 | 
			
		||||
  return prev_lines and prev_lines[-1].endswith('\\')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def WrapComment(line, output):
 | 
			
		||||
  loc = line.find('//')
 | 
			
		||||
  before_comment = line[:loc].rstrip()
 | 
			
		||||
  if before_comment == '':
 | 
			
		||||
    indent = loc
 | 
			
		||||
  else:
 | 
			
		||||
    output.append(before_comment)
 | 
			
		||||
    indent = len(before_comment) - len(before_comment.lstrip())
 | 
			
		||||
  prefix = indent*' ' + '// '
 | 
			
		||||
  max_len = 80 - len(prefix)
 | 
			
		||||
  comment = line[loc + 2:].strip()
 | 
			
		||||
  segs = [seg for seg in re.split(r'(\w+\W*)', comment) if seg != '']
 | 
			
		||||
  cur_line = ''
 | 
			
		||||
  for seg in segs:
 | 
			
		||||
    if len((cur_line + seg).rstrip()) < max_len:
 | 
			
		||||
      cur_line += seg
 | 
			
		||||
    else:
 | 
			
		||||
      if cur_line.strip() != '':
 | 
			
		||||
        output.append(prefix + cur_line.rstrip())
 | 
			
		||||
      cur_line = seg.lstrip()
 | 
			
		||||
  if cur_line.strip() != '':
 | 
			
		||||
    output.append(prefix + cur_line.strip())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def WrapCode(line, line_concat, output):
 | 
			
		||||
  indent = len(line) - len(line.lstrip())
 | 
			
		||||
  prefix = indent*' '  # Prefix of the current line
 | 
			
		||||
  max_len = 80 - indent - len(line_concat)  # Maximum length of the current line
 | 
			
		||||
  new_prefix = prefix + 4*' '  # Prefix of a continuation line
 | 
			
		||||
  new_max_len = max_len - 4  # Maximum length of a continuation line
 | 
			
		||||
  # Prefers to wrap a line after a ',' or ';'.
 | 
			
		||||
  segs = [seg for seg in re.split(r'([^,;]+[,;]?)', line.strip()) if seg != '']
 | 
			
		||||
  cur_line = ''  # The current line without leading spaces.
 | 
			
		||||
  for seg in segs:
 | 
			
		||||
    # If the line is still too long, wrap at a space.
 | 
			
		||||
    while cur_line == '' and len(seg.strip()) > max_len:
 | 
			
		||||
      seg = seg.lstrip()
 | 
			
		||||
      split_at = seg.rfind(' ', 0, max_len)
 | 
			
		||||
      output.append(prefix + seg[:split_at].strip() + line_concat)
 | 
			
		||||
      seg = seg[split_at + 1:]
 | 
			
		||||
      prefix = new_prefix
 | 
			
		||||
      max_len = new_max_len
 | 
			
		||||
 | 
			
		||||
    if len((cur_line + seg).rstrip()) < max_len:
 | 
			
		||||
      cur_line = (cur_line + seg).lstrip()
 | 
			
		||||
    else:
 | 
			
		||||
      output.append(prefix + cur_line.rstrip() + line_concat)
 | 
			
		||||
      prefix = new_prefix
 | 
			
		||||
      max_len = new_max_len
 | 
			
		||||
      cur_line = seg.lstrip()
 | 
			
		||||
  if cur_line.strip() != '':
 | 
			
		||||
    output.append(prefix + cur_line.strip())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def WrapPreprocessorDirective(line, output):
 | 
			
		||||
  WrapCode(line, ' \\', output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def WrapPlainCode(line, output):
 | 
			
		||||
  WrapCode(line, '', output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def IsMultiLineIWYUPragma(line):
 | 
			
		||||
  return re.search(r'/\* IWYU pragma: ', line)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def IsHeaderGuardIncludeOrOneLineIWYUPragma(line):
 | 
			
		||||
  return (re.match(r'^#(ifndef|define|endif\s*//)\s*[\w_]+\s*$', line) or
 | 
			
		||||
          re.match(r'^#include\s', line) or
 | 
			
		||||
          # Don't break IWYU pragmas, either; that causes iwyu.py problems.
 | 
			
		||||
          re.search(r'// IWYU pragma: ', line))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def WrapLongLine(line, output):
 | 
			
		||||
  line = line.rstrip()
 | 
			
		||||
  if len(line) <= 80:
 | 
			
		||||
    output.append(line)
 | 
			
		||||
  elif IsSingleLineComment(line):
 | 
			
		||||
    if IsHeaderGuardIncludeOrOneLineIWYUPragma(line):
 | 
			
		||||
      # The style guide made an exception to allow long header guard lines,
 | 
			
		||||
      # includes and IWYU pragmas.
 | 
			
		||||
      output.append(line)
 | 
			
		||||
    else:
 | 
			
		||||
      WrapComment(line, output)
 | 
			
		||||
  elif IsInPreprocessorDirective(output, line):
 | 
			
		||||
    if IsHeaderGuardIncludeOrOneLineIWYUPragma(line):
 | 
			
		||||
      # The style guide made an exception to allow long header guard lines,
 | 
			
		||||
      # includes and IWYU pragmas.
 | 
			
		||||
      output.append(line)
 | 
			
		||||
    else:
 | 
			
		||||
      WrapPreprocessorDirective(line, output)
 | 
			
		||||
  elif IsMultiLineIWYUPragma(line):
 | 
			
		||||
    output.append(line)
 | 
			
		||||
  else:
 | 
			
		||||
    WrapPlainCode(line, output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def BeautifyCode(string):
 | 
			
		||||
  lines = string.splitlines()
 | 
			
		||||
  output = []
 | 
			
		||||
  for line in lines:
 | 
			
		||||
    WrapLongLine(line, output)
 | 
			
		||||
  output2 = [line.rstrip() for line in output]
 | 
			
		||||
  return '\n'.join(output2) + '\n'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ConvertFromPumpSource(src_text):
 | 
			
		||||
  """Return the text generated from the given Pump source text."""
 | 
			
		||||
  ast = ParseToAST(StripMetaComments(src_text))
 | 
			
		||||
  output = Output()
 | 
			
		||||
  RunCode(Env(), ast, output)
 | 
			
		||||
  return BeautifyCode(output.string)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main(argv):
 | 
			
		||||
  if len(argv) == 1:
 | 
			
		||||
    print __doc__
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
  file_path = argv[-1]
 | 
			
		||||
  output_str = ConvertFromPumpSource(file(file_path, 'r').read())
 | 
			
		||||
  if file_path.endswith('.pump'):
 | 
			
		||||
    output_file_path = file_path[:-5]
 | 
			
		||||
  else:
 | 
			
		||||
    output_file_path = '-'
 | 
			
		||||
  if output_file_path == '-':
 | 
			
		||||
    print output_str,
 | 
			
		||||
  else:
 | 
			
		||||
    output_file = file(output_file_path, 'w')
 | 
			
		||||
    output_file.write('// This file was GENERATED by command:\n')
 | 
			
		||||
    output_file.write('//     %s %s\n' %
 | 
			
		||||
                      (os.path.basename(__file__), os.path.basename(file_path)))
 | 
			
		||||
    output_file.write('// DO NOT EDIT BY HAND!!!\n\n')
 | 
			
		||||
    output_file.write(output_str)
 | 
			
		||||
    output_file.close()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  main(sys.argv)
 | 
			
		||||
| 
						 | 
				
			
			@ -1,59 +0,0 @@
 | 
			
		|||
# A Makefile for fusing Google Test and building a sample test against it.
 | 
			
		||||
#
 | 
			
		||||
# SYNOPSIS:
 | 
			
		||||
#
 | 
			
		||||
#   make [all]  - makes everything.
 | 
			
		||||
#   make TARGET - makes the given target.
 | 
			
		||||
#   make check  - makes everything and runs the built sample test.
 | 
			
		||||
#   make clean  - removes all files generated by make.
 | 
			
		||||
 | 
			
		||||
# Points to the root of fused Google Test, relative to where this file is.
 | 
			
		||||
FUSED_GTEST_DIR = output
 | 
			
		||||
 | 
			
		||||
# Paths to the fused gtest files.
 | 
			
		||||
FUSED_GTEST_H = $(FUSED_GTEST_DIR)/gtest/gtest.h
 | 
			
		||||
FUSED_GTEST_ALL_CC = $(FUSED_GTEST_DIR)/gtest/gtest-all.cc
 | 
			
		||||
 | 
			
		||||
# Where to find the sample test.
 | 
			
		||||
SAMPLE_DIR = ../../samples
 | 
			
		||||
 | 
			
		||||
# Where to find gtest_main.cc.
 | 
			
		||||
GTEST_MAIN_CC = ../../src/gtest_main.cc
 | 
			
		||||
 | 
			
		||||
# Flags passed to the preprocessor.
 | 
			
		||||
# We have no idea here whether pthreads is available in the system, so
 | 
			
		||||
# disable its use.
 | 
			
		||||
CPPFLAGS += -I$(FUSED_GTEST_DIR) -DGTEST_HAS_PTHREAD=0
 | 
			
		||||
 | 
			
		||||
# Flags passed to the C++ compiler.
 | 
			
		||||
CXXFLAGS += -g
 | 
			
		||||
 | 
			
		||||
all : sample1_unittest
 | 
			
		||||
 | 
			
		||||
check : all
 | 
			
		||||
	./sample1_unittest
 | 
			
		||||
 | 
			
		||||
clean :
 | 
			
		||||
	rm -rf $(FUSED_GTEST_DIR) sample1_unittest *.o
 | 
			
		||||
 | 
			
		||||
$(FUSED_GTEST_H) :
 | 
			
		||||
	../fuse_gtest_files.py $(FUSED_GTEST_DIR)
 | 
			
		||||
 | 
			
		||||
$(FUSED_GTEST_ALL_CC) :
 | 
			
		||||
	../fuse_gtest_files.py $(FUSED_GTEST_DIR)
 | 
			
		||||
 | 
			
		||||
gtest-all.o : $(FUSED_GTEST_H) $(FUSED_GTEST_ALL_CC)
 | 
			
		||||
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(FUSED_GTEST_DIR)/gtest/gtest-all.cc
 | 
			
		||||
 | 
			
		||||
gtest_main.o : $(FUSED_GTEST_H) $(GTEST_MAIN_CC)
 | 
			
		||||
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(GTEST_MAIN_CC)
 | 
			
		||||
 | 
			
		||||
sample1.o : $(SAMPLE_DIR)/sample1.cc $(SAMPLE_DIR)/sample1.h
 | 
			
		||||
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(SAMPLE_DIR)/sample1.cc
 | 
			
		||||
 | 
			
		||||
sample1_unittest.o : $(SAMPLE_DIR)/sample1_unittest.cc \
 | 
			
		||||
                     $(SAMPLE_DIR)/sample1.h $(FUSED_GTEST_H)
 | 
			
		||||
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(SAMPLE_DIR)/sample1_unittest.cc
 | 
			
		||||
 | 
			
		||||
sample1_unittest : sample1.o sample1_unittest.o gtest-all.o gtest_main.o
 | 
			
		||||
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@
 | 
			
		||||
| 
						 | 
				
			
			@ -1,93 +0,0 @@
 | 
			
		|||
// Copyright 2010, 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: vladl@google.com (Vlad Losev)
 | 
			
		||||
//
 | 
			
		||||
// Tests that verify interaction of exceptions and death tests.
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest-death-test.h"
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_DEATH_TEST
 | 
			
		||||
 | 
			
		||||
# if GTEST_HAS_SEH
 | 
			
		||||
#  include <windows.h>          // For RaiseException().
 | 
			
		||||
# endif
 | 
			
		||||
 | 
			
		||||
# include "gtest/gtest-spi.h"
 | 
			
		||||
 | 
			
		||||
# if GTEST_HAS_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
#  include <exception>  // For std::exception.
 | 
			
		||||
 | 
			
		||||
// Tests that death tests report thrown exceptions as failures and that the
 | 
			
		||||
// exceptions do not escape death test macros.
 | 
			
		||||
TEST(CxxExceptionDeathTest, ExceptionIsFailure) {
 | 
			
		||||
  try {
 | 
			
		||||
    EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw 1, ""), "threw an exception");
 | 
			
		||||
  } catch (...) {  // NOLINT
 | 
			
		||||
    FAIL() << "An exception escaped a death test macro invocation "
 | 
			
		||||
           << "with catch_exceptions "
 | 
			
		||||
           << (testing::GTEST_FLAG(catch_exceptions) ? "enabled" : "disabled");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class TestException : public std::exception {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual const char* what() const throw() { return "exceptional message"; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST(CxxExceptionDeathTest, PrintsMessageForStdExceptions) {
 | 
			
		||||
  // Verifies that the exception message is quoted in the failure text.
 | 
			
		||||
  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), ""),
 | 
			
		||||
                          "exceptional message");
 | 
			
		||||
  // Verifies that the location is mentioned in the failure text.
 | 
			
		||||
  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), ""),
 | 
			
		||||
                          "gtest-death-test_ex_test.cc");
 | 
			
		||||
}
 | 
			
		||||
# endif  // GTEST_HAS_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
# if GTEST_HAS_SEH
 | 
			
		||||
// Tests that enabling interception of SEH exceptions with the
 | 
			
		||||
// catch_exceptions flag does not interfere with SEH exceptions being
 | 
			
		||||
// treated as death by death tests.
 | 
			
		||||
TEST(SehExceptionDeasTest, CatchExceptionsDoesNotInterfere) {
 | 
			
		||||
  EXPECT_DEATH(RaiseException(42, 0x0, 0, NULL), "")
 | 
			
		||||
      << "with catch_exceptions "
 | 
			
		||||
      << (testing::GTEST_FLAG(catch_exceptions) ? "enabled" : "disabled");
 | 
			
		||||
}
 | 
			
		||||
# endif
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_DEATH_TEST
 | 
			
		||||
 | 
			
		||||
int main(int argc, char** argv) {
 | 
			
		||||
  testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
  testing::GTEST_FLAG(catch_exceptions) = GTEST_ENABLE_CATCH_EXCEPTIONS_ != 0;
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -1,680 +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.
 | 
			
		||||
//
 | 
			
		||||
// Authors: keith.ray@gmail.com (Keith Ray)
 | 
			
		||||
//
 | 
			
		||||
// Google Test filepath utilities
 | 
			
		||||
//
 | 
			
		||||
// This file tests classes and functions used internally by
 | 
			
		||||
// Google Test.  They are subject to change without notice.
 | 
			
		||||
//
 | 
			
		||||
// This file is #included from gtest_unittest.cc, to avoid changing
 | 
			
		||||
// build or make-files for some existing Google Test clients. Do not
 | 
			
		||||
// #include this file anywhere else!
 | 
			
		||||
 | 
			
		||||
#include "gtest/internal/gtest-filepath.h"
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
// Indicates that this translation unit is part of Google Test's
 | 
			
		||||
// implementation.  It must come before gtest-internal-inl.h is
 | 
			
		||||
// included, or there will be a compiler error.  This trick is to
 | 
			
		||||
// prevent a user from accidentally including gtest-internal-inl.h in
 | 
			
		||||
// his code.
 | 
			
		||||
#define GTEST_IMPLEMENTATION_ 1
 | 
			
		||||
#include "src/gtest-internal-inl.h"
 | 
			
		||||
#undef GTEST_IMPLEMENTATION_
 | 
			
		||||
 | 
			
		||||
#if GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
# include <windows.h>  // NOLINT
 | 
			
		||||
#elif GTEST_OS_WINDOWS
 | 
			
		||||
# include <direct.h>  // NOLINT
 | 
			
		||||
#endif  // GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
#if GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
// TODO(wan@google.com): Move these to the POSIX adapter section in
 | 
			
		||||
// gtest-port.h.
 | 
			
		||||
 | 
			
		||||
// Windows CE doesn't have the remove C function.
 | 
			
		||||
int remove(const char* path) {
 | 
			
		||||
  LPCWSTR wpath = String::AnsiToUtf16(path);
 | 
			
		||||
  int ret = DeleteFile(wpath) ? 0 : -1;
 | 
			
		||||
  delete [] wpath;
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
// Windows CE doesn't have the _rmdir C function.
 | 
			
		||||
int _rmdir(const char* path) {
 | 
			
		||||
  FilePath filepath(path);
 | 
			
		||||
  LPCWSTR wpath = String::AnsiToUtf16(
 | 
			
		||||
      filepath.RemoveTrailingPathSeparator().c_str());
 | 
			
		||||
  int ret = RemoveDirectory(wpath) ? 0 : -1;
 | 
			
		||||
  delete [] wpath;
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
TEST(GetCurrentDirTest, ReturnsCurrentDir) {
 | 
			
		||||
  const FilePath original_dir = FilePath::GetCurrentDir();
 | 
			
		||||
  EXPECT_FALSE(original_dir.IsEmpty());
 | 
			
		||||
 | 
			
		||||
  posix::ChDir(GTEST_PATH_SEP_);
 | 
			
		||||
  const FilePath cwd = FilePath::GetCurrentDir();
 | 
			
		||||
  posix::ChDir(original_dir.c_str());
 | 
			
		||||
 | 
			
		||||
# if GTEST_OS_WINDOWS
 | 
			
		||||
 | 
			
		||||
  // Skips the ":".
 | 
			
		||||
  const char* const cwd_without_drive = strchr(cwd.c_str(), ':');
 | 
			
		||||
  ASSERT_TRUE(cwd_without_drive != NULL);
 | 
			
		||||
  EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);
 | 
			
		||||
 | 
			
		||||
# else
 | 
			
		||||
 | 
			
		||||
  EXPECT_EQ(GTEST_PATH_SEP_, cwd.string());
 | 
			
		||||
 | 
			
		||||
# endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
 | 
			
		||||
TEST(IsEmptyTest, ReturnsTrueForEmptyPath) {
 | 
			
		||||
  EXPECT_TRUE(FilePath("").IsEmpty());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {
 | 
			
		||||
  EXPECT_FALSE(FilePath("a").IsEmpty());
 | 
			
		||||
  EXPECT_FALSE(FilePath(".").IsEmpty());
 | 
			
		||||
  EXPECT_FALSE(FilePath("a/b").IsEmpty());
 | 
			
		||||
  EXPECT_FALSE(FilePath("a\\b\\").IsEmpty());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveDirectoryName "" -> ""
 | 
			
		||||
TEST(RemoveDirectoryNameTest, WhenEmptyName) {
 | 
			
		||||
  EXPECT_EQ("", FilePath("").RemoveDirectoryName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveDirectoryName "afile" -> "afile"
 | 
			
		||||
TEST(RemoveDirectoryNameTest, ButNoDirectory) {
 | 
			
		||||
  EXPECT_EQ("afile",
 | 
			
		||||
      FilePath("afile").RemoveDirectoryName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveDirectoryName "/afile" -> "afile"
 | 
			
		||||
TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {
 | 
			
		||||
  EXPECT_EQ("afile",
 | 
			
		||||
      FilePath(GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveDirectoryName "adir/" -> ""
 | 
			
		||||
TEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {
 | 
			
		||||
  EXPECT_EQ("",
 | 
			
		||||
      FilePath("adir" GTEST_PATH_SEP_).RemoveDirectoryName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveDirectoryName "adir/afile" -> "afile"
 | 
			
		||||
TEST(RemoveDirectoryNameTest, ShouldGiveFileName) {
 | 
			
		||||
  EXPECT_EQ("afile",
 | 
			
		||||
      FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveDirectoryName "adir/subdir/afile" -> "afile"
 | 
			
		||||
TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {
 | 
			
		||||
  EXPECT_EQ("afile",
 | 
			
		||||
      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
 | 
			
		||||
      .RemoveDirectoryName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_ALT_PATH_SEP_
 | 
			
		||||
 | 
			
		||||
// Tests that RemoveDirectoryName() works with the alternate separator
 | 
			
		||||
// on Windows.
 | 
			
		||||
 | 
			
		||||
// RemoveDirectoryName("/afile") -> "afile"
 | 
			
		||||
TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) {
 | 
			
		||||
  EXPECT_EQ("afile", FilePath("/afile").RemoveDirectoryName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveDirectoryName("adir/") -> ""
 | 
			
		||||
TEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) {
 | 
			
		||||
  EXPECT_EQ("", FilePath("adir/").RemoveDirectoryName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveDirectoryName("adir/afile") -> "afile"
 | 
			
		||||
TEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) {
 | 
			
		||||
  EXPECT_EQ("afile", FilePath("adir/afile").RemoveDirectoryName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveDirectoryName("adir/subdir/afile") -> "afile"
 | 
			
		||||
TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) {
 | 
			
		||||
  EXPECT_EQ("afile",
 | 
			
		||||
            FilePath("adir/subdir/afile").RemoveDirectoryName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// RemoveFileName "" -> "./"
 | 
			
		||||
TEST(RemoveFileNameTest, EmptyName) {
 | 
			
		||||
#if GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
  // On Windows CE, we use the root as the current directory.
 | 
			
		||||
  EXPECT_EQ(GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
 | 
			
		||||
#else
 | 
			
		||||
  EXPECT_EQ("." GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveFileName "adir/" -> "adir/"
 | 
			
		||||
TEST(RemoveFileNameTest, ButNoFile) {
 | 
			
		||||
  EXPECT_EQ("adir" GTEST_PATH_SEP_,
 | 
			
		||||
      FilePath("adir" GTEST_PATH_SEP_).RemoveFileName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveFileName "adir/afile" -> "adir/"
 | 
			
		||||
TEST(RemoveFileNameTest, GivesDirName) {
 | 
			
		||||
  EXPECT_EQ("adir" GTEST_PATH_SEP_,
 | 
			
		||||
            FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveFileName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveFileName "adir/subdir/afile" -> "adir/subdir/"
 | 
			
		||||
TEST(RemoveFileNameTest, GivesDirAndSubDirName) {
 | 
			
		||||
  EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
 | 
			
		||||
      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
 | 
			
		||||
      .RemoveFileName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveFileName "/afile" -> "/"
 | 
			
		||||
TEST(RemoveFileNameTest, GivesRootDir) {
 | 
			
		||||
  EXPECT_EQ(GTEST_PATH_SEP_,
 | 
			
		||||
      FilePath(GTEST_PATH_SEP_ "afile").RemoveFileName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_ALT_PATH_SEP_
 | 
			
		||||
 | 
			
		||||
// Tests that RemoveFileName() works with the alternate separator on
 | 
			
		||||
// Windows.
 | 
			
		||||
 | 
			
		||||
// RemoveFileName("adir/") -> "adir/"
 | 
			
		||||
TEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) {
 | 
			
		||||
  EXPECT_EQ("adir" GTEST_PATH_SEP_,
 | 
			
		||||
            FilePath("adir/").RemoveFileName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveFileName("adir/afile") -> "adir/"
 | 
			
		||||
TEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) {
 | 
			
		||||
  EXPECT_EQ("adir" GTEST_PATH_SEP_,
 | 
			
		||||
            FilePath("adir/afile").RemoveFileName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveFileName("adir/subdir/afile") -> "adir/subdir/"
 | 
			
		||||
TEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) {
 | 
			
		||||
  EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
 | 
			
		||||
            FilePath("adir/subdir/afile").RemoveFileName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveFileName("/afile") -> "\"
 | 
			
		||||
TEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) {
 | 
			
		||||
  EXPECT_EQ(GTEST_PATH_SEP_, FilePath("/afile").RemoveFileName().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
TEST(MakeFileNameTest, GenerateWhenNumberIsZero) {
 | 
			
		||||
  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
 | 
			
		||||
      0, "xml");
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {
 | 
			
		||||
  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
 | 
			
		||||
      12, "xml");
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {
 | 
			
		||||
  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
 | 
			
		||||
      FilePath("bar"), 0, "xml");
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {
 | 
			
		||||
  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
 | 
			
		||||
      FilePath("bar"), 12, "xml");
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {
 | 
			
		||||
  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
 | 
			
		||||
      0, "xml");
 | 
			
		||||
  EXPECT_EQ("bar.xml", actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {
 | 
			
		||||
  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
 | 
			
		||||
      14, "xml");
 | 
			
		||||
  EXPECT_EQ("bar_14.xml", actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {
 | 
			
		||||
  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
 | 
			
		||||
                                          FilePath("bar.xml"));
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {
 | 
			
		||||
  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_),
 | 
			
		||||
                                          FilePath("bar.xml"));
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(ConcatPathsTest, Path1BeingEmpty) {
 | 
			
		||||
  FilePath actual = FilePath::ConcatPaths(FilePath(""),
 | 
			
		||||
                                          FilePath("bar.xml"));
 | 
			
		||||
  EXPECT_EQ("bar.xml", actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(ConcatPathsTest, Path2BeingEmpty) {
 | 
			
		||||
  FilePath actual = FilePath::ConcatPaths(FilePath("foo"), FilePath(""));
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_, actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(ConcatPathsTest, BothPathBeingEmpty) {
 | 
			
		||||
  FilePath actual = FilePath::ConcatPaths(FilePath(""),
 | 
			
		||||
                                          FilePath(""));
 | 
			
		||||
  EXPECT_EQ("", actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(ConcatPathsTest, Path1ContainsPathSep) {
 | 
			
		||||
  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_ "bar"),
 | 
			
		||||
                                          FilePath("foobar.xml"));
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "foobar.xml",
 | 
			
		||||
            actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(ConcatPathsTest, Path2ContainsPathSep) {
 | 
			
		||||
  FilePath actual = FilePath::ConcatPaths(
 | 
			
		||||
      FilePath("foo" GTEST_PATH_SEP_),
 | 
			
		||||
      FilePath("bar" GTEST_PATH_SEP_ "bar.xml"));
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "bar.xml",
 | 
			
		||||
            actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(ConcatPathsTest, Path2EndsWithPathSep) {
 | 
			
		||||
  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
 | 
			
		||||
                                          FilePath("bar" GTEST_PATH_SEP_));
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_, actual.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveTrailingPathSeparator "" -> ""
 | 
			
		||||
TEST(RemoveTrailingPathSeparatorTest, EmptyString) {
 | 
			
		||||
  EXPECT_EQ("", FilePath("").RemoveTrailingPathSeparator().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveTrailingPathSeparator "foo" -> "foo"
 | 
			
		||||
TEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {
 | 
			
		||||
  EXPECT_EQ("foo", FilePath("foo").RemoveTrailingPathSeparator().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveTrailingPathSeparator "foo/" -> "foo"
 | 
			
		||||
TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {
 | 
			
		||||
  EXPECT_EQ("foo",
 | 
			
		||||
      FilePath("foo" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().string());
 | 
			
		||||
#if GTEST_HAS_ALT_PATH_SEP_
 | 
			
		||||
  EXPECT_EQ("foo", FilePath("foo/").RemoveTrailingPathSeparator().string());
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveTrailingPathSeparator "foo/bar/" -> "foo/bar/"
 | 
			
		||||
TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
 | 
			
		||||
            FilePath("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_)
 | 
			
		||||
                .RemoveTrailingPathSeparator().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveTrailingPathSeparator "foo/bar" -> "foo/bar"
 | 
			
		||||
TEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
 | 
			
		||||
            FilePath("foo" GTEST_PATH_SEP_ "bar")
 | 
			
		||||
                .RemoveTrailingPathSeparator().string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(DirectoryTest, RootDirectoryExists) {
 | 
			
		||||
#if GTEST_OS_WINDOWS  // We are on Windows.
 | 
			
		||||
  char current_drive[_MAX_PATH];  // NOLINT
 | 
			
		||||
  current_drive[0] = static_cast<char>(_getdrive() + 'A' - 1);
 | 
			
		||||
  current_drive[1] = ':';
 | 
			
		||||
  current_drive[2] = '\\';
 | 
			
		||||
  current_drive[3] = '\0';
 | 
			
		||||
  EXPECT_TRUE(FilePath(current_drive).DirectoryExists());
 | 
			
		||||
#else
 | 
			
		||||
  EXPECT_TRUE(FilePath("/").DirectoryExists());
 | 
			
		||||
#endif  // GTEST_OS_WINDOWS
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if GTEST_OS_WINDOWS
 | 
			
		||||
TEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {
 | 
			
		||||
  const int saved_drive_ = _getdrive();
 | 
			
		||||
  // Find a drive that doesn't exist. Start with 'Z' to avoid common ones.
 | 
			
		||||
  for (char drive = 'Z'; drive >= 'A'; drive--)
 | 
			
		||||
    if (_chdrive(drive - 'A' + 1) == -1) {
 | 
			
		||||
      char non_drive[_MAX_PATH];  // NOLINT
 | 
			
		||||
      non_drive[0] = drive;
 | 
			
		||||
      non_drive[1] = ':';
 | 
			
		||||
      non_drive[2] = '\\';
 | 
			
		||||
      non_drive[3] = '\0';
 | 
			
		||||
      EXPECT_FALSE(FilePath(non_drive).DirectoryExists());
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  _chdrive(saved_drive_);
 | 
			
		||||
}
 | 
			
		||||
#endif  // GTEST_OS_WINDOWS
 | 
			
		||||
 | 
			
		||||
#if !GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
// Windows CE _does_ consider an empty directory to exist.
 | 
			
		||||
TEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {
 | 
			
		||||
  EXPECT_FALSE(FilePath("").DirectoryExists());
 | 
			
		||||
}
 | 
			
		||||
#endif  // !GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
 | 
			
		||||
TEST(DirectoryTest, CurrentDirectoryExists) {
 | 
			
		||||
#if GTEST_OS_WINDOWS  // We are on Windows.
 | 
			
		||||
# ifndef _WIN32_CE  // Windows CE doesn't have a current directory.
 | 
			
		||||
 | 
			
		||||
  EXPECT_TRUE(FilePath(".").DirectoryExists());
 | 
			
		||||
  EXPECT_TRUE(FilePath(".\\").DirectoryExists());
 | 
			
		||||
 | 
			
		||||
# endif  // _WIN32_CE
 | 
			
		||||
#else
 | 
			
		||||
  EXPECT_TRUE(FilePath(".").DirectoryExists());
 | 
			
		||||
  EXPECT_TRUE(FilePath("./").DirectoryExists());
 | 
			
		||||
#endif  // GTEST_OS_WINDOWS
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// "foo/bar" == foo//bar" == "foo///bar"
 | 
			
		||||
TEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
 | 
			
		||||
            FilePath("foo" GTEST_PATH_SEP_ "bar").string());
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
 | 
			
		||||
            FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
 | 
			
		||||
            FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_
 | 
			
		||||
                     GTEST_PATH_SEP_ "bar").string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// "/bar" == //bar" == "///bar"
 | 
			
		||||
TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {
 | 
			
		||||
  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
 | 
			
		||||
    FilePath(GTEST_PATH_SEP_ "bar").string());
 | 
			
		||||
  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
 | 
			
		||||
    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
 | 
			
		||||
  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
 | 
			
		||||
    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// "foo/" == foo//" == "foo///"
 | 
			
		||||
TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_,
 | 
			
		||||
    FilePath("foo" GTEST_PATH_SEP_).string());
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_,
 | 
			
		||||
    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_,
 | 
			
		||||
    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_ALT_PATH_SEP_
 | 
			
		||||
 | 
			
		||||
// Tests that separators at the end of the string are normalized
 | 
			
		||||
// regardless of their combination (e.g. "foo\" =="foo/\" ==
 | 
			
		||||
// "foo\\/").
 | 
			
		||||
TEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) {
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_,
 | 
			
		||||
            FilePath("foo/").string());
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_,
 | 
			
		||||
            FilePath("foo" GTEST_PATH_SEP_ "/").string());
 | 
			
		||||
  EXPECT_EQ("foo" GTEST_PATH_SEP_,
 | 
			
		||||
            FilePath("foo//" GTEST_PATH_SEP_).string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
TEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {
 | 
			
		||||
  FilePath default_path;
 | 
			
		||||
  FilePath non_default_path("path");
 | 
			
		||||
  non_default_path = default_path;
 | 
			
		||||
  EXPECT_EQ("", non_default_path.string());
 | 
			
		||||
  EXPECT_EQ("", default_path.string());  // RHS var is unchanged.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {
 | 
			
		||||
  FilePath non_default_path("path");
 | 
			
		||||
  FilePath default_path;
 | 
			
		||||
  default_path = non_default_path;
 | 
			
		||||
  EXPECT_EQ("path", default_path.string());
 | 
			
		||||
  EXPECT_EQ("path", non_default_path.string());  // RHS var is unchanged.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(AssignmentOperatorTest, ConstAssignedToNonConst) {
 | 
			
		||||
  const FilePath const_default_path("const_path");
 | 
			
		||||
  FilePath non_default_path("path");
 | 
			
		||||
  non_default_path = const_default_path;
 | 
			
		||||
  EXPECT_EQ("const_path", non_default_path.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class DirectoryCreationTest : public Test {
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    testdata_path_.Set(FilePath(
 | 
			
		||||
        TempDir() + GetCurrentExecutableName().string() +
 | 
			
		||||
        "_directory_creation" GTEST_PATH_SEP_ "test" GTEST_PATH_SEP_));
 | 
			
		||||
    testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());
 | 
			
		||||
 | 
			
		||||
    unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
 | 
			
		||||
        0, "txt"));
 | 
			
		||||
    unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
 | 
			
		||||
        1, "txt"));
 | 
			
		||||
 | 
			
		||||
    remove(testdata_file_.c_str());
 | 
			
		||||
    remove(unique_file0_.c_str());
 | 
			
		||||
    remove(unique_file1_.c_str());
 | 
			
		||||
    posix::RmDir(testdata_path_.c_str());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    remove(testdata_file_.c_str());
 | 
			
		||||
    remove(unique_file0_.c_str());
 | 
			
		||||
    remove(unique_file1_.c_str());
 | 
			
		||||
    posix::RmDir(testdata_path_.c_str());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  std::string TempDir() const {
 | 
			
		||||
#if GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
    return "\\temp\\";
 | 
			
		||||
#elif GTEST_OS_WINDOWS
 | 
			
		||||
    const char* temp_dir = posix::GetEnv("TEMP");
 | 
			
		||||
    if (temp_dir == NULL || temp_dir[0] == '\0')
 | 
			
		||||
      return "\\temp\\";
 | 
			
		||||
    else if (temp_dir[strlen(temp_dir) - 1] == '\\')
 | 
			
		||||
      return temp_dir;
 | 
			
		||||
    else
 | 
			
		||||
      return std::string(temp_dir) + "\\";
 | 
			
		||||
#elif GTEST_OS_LINUX_ANDROID
 | 
			
		||||
    return "/sdcard/";
 | 
			
		||||
#else
 | 
			
		||||
    return "/tmp/";
 | 
			
		||||
#endif  // GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void CreateTextFile(const char* filename) {
 | 
			
		||||
    FILE* f = posix::FOpen(filename, "w");
 | 
			
		||||
    fprintf(f, "text\n");
 | 
			
		||||
    fclose(f);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Strings representing a directory and a file, with identical paths
 | 
			
		||||
  // except for the trailing separator character that distinquishes
 | 
			
		||||
  // a directory named 'test' from a file named 'test'. Example names:
 | 
			
		||||
  FilePath testdata_path_;  // "/tmp/directory_creation/test/"
 | 
			
		||||
  FilePath testdata_file_;  // "/tmp/directory_creation/test"
 | 
			
		||||
  FilePath unique_file0_;  // "/tmp/directory_creation/test/unique.txt"
 | 
			
		||||
  FilePath unique_file1_;  // "/tmp/directory_creation/test/unique_1.txt"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {
 | 
			
		||||
  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
 | 
			
		||||
  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
 | 
			
		||||
  EXPECT_TRUE(testdata_path_.DirectoryExists());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {
 | 
			
		||||
  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
 | 
			
		||||
  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
 | 
			
		||||
  // Call 'create' again... should still succeed.
 | 
			
		||||
  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {
 | 
			
		||||
  FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,
 | 
			
		||||
      FilePath("unique"), "txt"));
 | 
			
		||||
  EXPECT_EQ(unique_file0_.string(), file_path.string());
 | 
			
		||||
  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file not there
 | 
			
		||||
 | 
			
		||||
  testdata_path_.CreateDirectoriesRecursively();
 | 
			
		||||
  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file still not there
 | 
			
		||||
  CreateTextFile(file_path.c_str());
 | 
			
		||||
  EXPECT_TRUE(file_path.FileOrDirectoryExists());
 | 
			
		||||
 | 
			
		||||
  FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,
 | 
			
		||||
      FilePath("unique"), "txt"));
 | 
			
		||||
  EXPECT_EQ(unique_file1_.string(), file_path2.string());
 | 
			
		||||
  EXPECT_FALSE(file_path2.FileOrDirectoryExists());  // file not there
 | 
			
		||||
  CreateTextFile(file_path2.c_str());
 | 
			
		||||
  EXPECT_TRUE(file_path2.FileOrDirectoryExists());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(DirectoryCreationTest, CreateDirectoriesFail) {
 | 
			
		||||
  // force a failure by putting a file where we will try to create a directory.
 | 
			
		||||
  CreateTextFile(testdata_file_.c_str());
 | 
			
		||||
  EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());
 | 
			
		||||
  EXPECT_FALSE(testdata_file_.DirectoryExists());
 | 
			
		||||
  EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {
 | 
			
		||||
  const FilePath test_detail_xml("test_detail.xml");
 | 
			
		||||
  EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(FilePathTest, DefaultConstructor) {
 | 
			
		||||
  FilePath fp;
 | 
			
		||||
  EXPECT_EQ("", fp.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(FilePathTest, CharAndCopyConstructors) {
 | 
			
		||||
  const FilePath fp("spicy");
 | 
			
		||||
  EXPECT_EQ("spicy", fp.string());
 | 
			
		||||
 | 
			
		||||
  const FilePath fp_copy(fp);
 | 
			
		||||
  EXPECT_EQ("spicy", fp_copy.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(FilePathTest, StringConstructor) {
 | 
			
		||||
  const FilePath fp(std::string("cider"));
 | 
			
		||||
  EXPECT_EQ("cider", fp.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(FilePathTest, Set) {
 | 
			
		||||
  const FilePath apple("apple");
 | 
			
		||||
  FilePath mac("mac");
 | 
			
		||||
  mac.Set(apple);  // Implement Set() since overloading operator= is forbidden.
 | 
			
		||||
  EXPECT_EQ("apple", mac.string());
 | 
			
		||||
  EXPECT_EQ("apple", apple.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(FilePathTest, ToString) {
 | 
			
		||||
  const FilePath file("drink");
 | 
			
		||||
  EXPECT_EQ("drink", file.string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(FilePathTest, RemoveExtension) {
 | 
			
		||||
  EXPECT_EQ("app", FilePath("app.cc").RemoveExtension("cc").string());
 | 
			
		||||
  EXPECT_EQ("app", FilePath("app.exe").RemoveExtension("exe").string());
 | 
			
		||||
  EXPECT_EQ("APP", FilePath("APP.EXE").RemoveExtension("exe").string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {
 | 
			
		||||
  EXPECT_EQ("app", FilePath("app").RemoveExtension("exe").string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(FilePathTest, IsDirectory) {
 | 
			
		||||
  EXPECT_FALSE(FilePath("cola").IsDirectory());
 | 
			
		||||
  EXPECT_TRUE(FilePath("koala" GTEST_PATH_SEP_).IsDirectory());
 | 
			
		||||
#if GTEST_HAS_ALT_PATH_SEP_
 | 
			
		||||
  EXPECT_TRUE(FilePath("koala/").IsDirectory());
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(FilePathTest, IsAbsolutePath) {
 | 
			
		||||
  EXPECT_FALSE(FilePath("is" GTEST_PATH_SEP_ "relative").IsAbsolutePath());
 | 
			
		||||
  EXPECT_FALSE(FilePath("").IsAbsolutePath());
 | 
			
		||||
#if GTEST_OS_WINDOWS
 | 
			
		||||
  EXPECT_TRUE(FilePath("c:\\" GTEST_PATH_SEP_ "is_not"
 | 
			
		||||
                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
 | 
			
		||||
  EXPECT_FALSE(FilePath("c:foo" GTEST_PATH_SEP_ "bar").IsAbsolutePath());
 | 
			
		||||
  EXPECT_TRUE(FilePath("c:/" GTEST_PATH_SEP_ "is_not"
 | 
			
		||||
                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
 | 
			
		||||
#else
 | 
			
		||||
  EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ "is_not" GTEST_PATH_SEP_ "relative")
 | 
			
		||||
              .IsAbsolutePath());
 | 
			
		||||
#endif  // GTEST_OS_WINDOWS
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(FilePathTest, IsRootDirectory) {
 | 
			
		||||
#if GTEST_OS_WINDOWS
 | 
			
		||||
  EXPECT_TRUE(FilePath("a:\\").IsRootDirectory());
 | 
			
		||||
  EXPECT_TRUE(FilePath("Z:/").IsRootDirectory());
 | 
			
		||||
  EXPECT_TRUE(FilePath("e://").IsRootDirectory());
 | 
			
		||||
  EXPECT_FALSE(FilePath("").IsRootDirectory());
 | 
			
		||||
  EXPECT_FALSE(FilePath("b:").IsRootDirectory());
 | 
			
		||||
  EXPECT_FALSE(FilePath("b:a").IsRootDirectory());
 | 
			
		||||
  EXPECT_FALSE(FilePath("8:/").IsRootDirectory());
 | 
			
		||||
  EXPECT_FALSE(FilePath("c|/").IsRootDirectory());
 | 
			
		||||
#else
 | 
			
		||||
  EXPECT_TRUE(FilePath("/").IsRootDirectory());
 | 
			
		||||
  EXPECT_TRUE(FilePath("//").IsRootDirectory());
 | 
			
		||||
  EXPECT_FALSE(FilePath("").IsRootDirectory());
 | 
			
		||||
  EXPECT_FALSE(FilePath("\\").IsRootDirectory());
 | 
			
		||||
  EXPECT_FALSE(FilePath("/x").IsRootDirectory());
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
| 
						 | 
				
			
			@ -1,154 +0,0 @@
 | 
			
		|||
// Copyright 2003, 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.
 | 
			
		||||
//
 | 
			
		||||
// Authors: Dan Egnor (egnor@google.com)
 | 
			
		||||
// Ported to Windows: Vadim Berman (vadimb@google.com)
 | 
			
		||||
 | 
			
		||||
#include "gtest/internal/gtest-linked_ptr.h"
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
using testing::Message;
 | 
			
		||||
using testing::internal::linked_ptr;
 | 
			
		||||
 | 
			
		||||
int num;
 | 
			
		||||
Message* history = NULL;
 | 
			
		||||
 | 
			
		||||
// Class which tracks allocation/deallocation
 | 
			
		||||
class A {
 | 
			
		||||
 public:
 | 
			
		||||
  A(): mynum(num++) { *history << "A" << mynum << " ctor\n"; }
 | 
			
		||||
  virtual ~A() { *history << "A" << mynum << " dtor\n"; }
 | 
			
		||||
  virtual void Use() { *history << "A" << mynum << " use\n"; }
 | 
			
		||||
 protected:
 | 
			
		||||
  int mynum;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Subclass
 | 
			
		||||
class B : public A {
 | 
			
		||||
 public:
 | 
			
		||||
  B() { *history << "B" << mynum << " ctor\n"; }
 | 
			
		||||
  ~B() { *history << "B" << mynum << " dtor\n"; }
 | 
			
		||||
  virtual void Use() { *history << "B" << mynum << " use\n"; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class LinkedPtrTest : public testing::Test {
 | 
			
		||||
 public:
 | 
			
		||||
  LinkedPtrTest() {
 | 
			
		||||
    num = 0;
 | 
			
		||||
    history = new Message;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ~LinkedPtrTest() {
 | 
			
		||||
    delete history;
 | 
			
		||||
    history = NULL;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(LinkedPtrTest, GeneralTest) {
 | 
			
		||||
  {
 | 
			
		||||
    linked_ptr<A> a0, a1, a2;
 | 
			
		||||
    // Use explicit function call notation here to suppress self-assign warning.
 | 
			
		||||
    a0.operator=(a0);
 | 
			
		||||
    a1 = a2;
 | 
			
		||||
    ASSERT_EQ(a0.get(), static_cast<A*>(NULL));
 | 
			
		||||
    ASSERT_EQ(a1.get(), static_cast<A*>(NULL));
 | 
			
		||||
    ASSERT_EQ(a2.get(), static_cast<A*>(NULL));
 | 
			
		||||
    ASSERT_TRUE(a0 == NULL);
 | 
			
		||||
    ASSERT_TRUE(a1 == NULL);
 | 
			
		||||
    ASSERT_TRUE(a2 == NULL);
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
      linked_ptr<A> a3(new A);
 | 
			
		||||
      a0 = a3;
 | 
			
		||||
      ASSERT_TRUE(a0 == a3);
 | 
			
		||||
      ASSERT_TRUE(a0 != NULL);
 | 
			
		||||
      ASSERT_TRUE(a0.get() == a3);
 | 
			
		||||
      ASSERT_TRUE(a0 == a3.get());
 | 
			
		||||
      linked_ptr<A> a4(a0);
 | 
			
		||||
      a1 = a4;
 | 
			
		||||
      linked_ptr<A> a5(new A);
 | 
			
		||||
      ASSERT_TRUE(a5.get() != a3);
 | 
			
		||||
      ASSERT_TRUE(a5 != a3.get());
 | 
			
		||||
      a2 = a5;
 | 
			
		||||
      linked_ptr<B> b0(new B);
 | 
			
		||||
      linked_ptr<A> a6(b0);
 | 
			
		||||
      ASSERT_TRUE(b0 == a6);
 | 
			
		||||
      ASSERT_TRUE(a6 == b0);
 | 
			
		||||
      ASSERT_TRUE(b0 != NULL);
 | 
			
		||||
      a5 = b0;
 | 
			
		||||
      a5 = b0;
 | 
			
		||||
      a3->Use();
 | 
			
		||||
      a4->Use();
 | 
			
		||||
      a5->Use();
 | 
			
		||||
      a6->Use();
 | 
			
		||||
      b0->Use();
 | 
			
		||||
      (*b0).Use();
 | 
			
		||||
      b0.get()->Use();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    a0->Use();
 | 
			
		||||
    a1->Use();
 | 
			
		||||
    a2->Use();
 | 
			
		||||
 | 
			
		||||
    a1 = a2;
 | 
			
		||||
    a2.reset(new A);
 | 
			
		||||
    a0.reset();
 | 
			
		||||
 | 
			
		||||
    linked_ptr<A> a7;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ASSERT_STREQ(
 | 
			
		||||
    "A0 ctor\n"
 | 
			
		||||
    "A1 ctor\n"
 | 
			
		||||
    "A2 ctor\n"
 | 
			
		||||
    "B2 ctor\n"
 | 
			
		||||
    "A0 use\n"
 | 
			
		||||
    "A0 use\n"
 | 
			
		||||
    "B2 use\n"
 | 
			
		||||
    "B2 use\n"
 | 
			
		||||
    "B2 use\n"
 | 
			
		||||
    "B2 use\n"
 | 
			
		||||
    "B2 use\n"
 | 
			
		||||
    "B2 dtor\n"
 | 
			
		||||
    "A2 dtor\n"
 | 
			
		||||
    "A0 use\n"
 | 
			
		||||
    "A0 use\n"
 | 
			
		||||
    "A1 use\n"
 | 
			
		||||
    "A3 ctor\n"
 | 
			
		||||
    "A0 dtor\n"
 | 
			
		||||
    "A3 dtor\n"
 | 
			
		||||
    "A1 dtor\n",
 | 
			
		||||
    history->GetString().c_str());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // Unnamed namespace
 | 
			
		||||
| 
						 | 
				
			
			@ -1,310 +0,0 @@
 | 
			
		|||
// 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.
 | 
			
		||||
//
 | 
			
		||||
// Author: vladl@google.com (Vlad Losev)
 | 
			
		||||
//
 | 
			
		||||
// The Google C++ Testing Framework (Google Test)
 | 
			
		||||
//
 | 
			
		||||
// This file verifies Google Test event listeners receive events at the
 | 
			
		||||
// right times.
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
using ::testing::AddGlobalTestEnvironment;
 | 
			
		||||
using ::testing::Environment;
 | 
			
		||||
using ::testing::InitGoogleTest;
 | 
			
		||||
using ::testing::Test;
 | 
			
		||||
using ::testing::TestCase;
 | 
			
		||||
using ::testing::TestEventListener;
 | 
			
		||||
using ::testing::TestInfo;
 | 
			
		||||
using ::testing::TestPartResult;
 | 
			
		||||
using ::testing::UnitTest;
 | 
			
		||||
 | 
			
		||||
// Used by tests to register their events.
 | 
			
		||||
std::vector<std::string>* g_events = NULL;
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
class EventRecordingListener : public TestEventListener {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit EventRecordingListener(const char* name) : name_(name) {}
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
 | 
			
		||||
    g_events->push_back(GetFullMethodName("OnTestProgramStart"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
 | 
			
		||||
                                    int iteration) {
 | 
			
		||||
    Message message;
 | 
			
		||||
    message << GetFullMethodName("OnTestIterationStart")
 | 
			
		||||
            << "(" << iteration << ")";
 | 
			
		||||
    g_events->push_back(message.GetString());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {
 | 
			
		||||
    g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {
 | 
			
		||||
    g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {
 | 
			
		||||
    g_events->push_back(GetFullMethodName("OnTestCaseStart"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnTestStart(const TestInfo& /*test_info*/) {
 | 
			
		||||
    g_events->push_back(GetFullMethodName("OnTestStart"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {
 | 
			
		||||
    g_events->push_back(GetFullMethodName("OnTestPartResult"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnTestEnd(const TestInfo& /*test_info*/) {
 | 
			
		||||
    g_events->push_back(GetFullMethodName("OnTestEnd"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {
 | 
			
		||||
    g_events->push_back(GetFullMethodName("OnTestCaseEnd"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {
 | 
			
		||||
    g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {
 | 
			
		||||
    g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
 | 
			
		||||
                                  int iteration) {
 | 
			
		||||
    Message message;
 | 
			
		||||
    message << GetFullMethodName("OnTestIterationEnd")
 | 
			
		||||
            << "("  << iteration << ")";
 | 
			
		||||
    g_events->push_back(message.GetString());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {
 | 
			
		||||
    g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  std::string GetFullMethodName(const char* name) {
 | 
			
		||||
    return name_ + "." + name;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  std::string name_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class EnvironmentInvocationCatcher : public Environment {
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    g_events->push_back("Environment::SetUp");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    g_events->push_back("Environment::TearDown");
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ListenerTest : public Test {
 | 
			
		||||
 protected:
 | 
			
		||||
  static void SetUpTestCase() {
 | 
			
		||||
    g_events->push_back("ListenerTest::SetUpTestCase");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static void TearDownTestCase() {
 | 
			
		||||
    g_events->push_back("ListenerTest::TearDownTestCase");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    g_events->push_back("ListenerTest::SetUp");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    g_events->push_back("ListenerTest::TearDown");
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(ListenerTest, DoesFoo) {
 | 
			
		||||
  // Test execution order within a test case is not guaranteed so we are not
 | 
			
		||||
  // recording the test name.
 | 
			
		||||
  g_events->push_back("ListenerTest::* Test Body");
 | 
			
		||||
  SUCCEED();  // Triggers OnTestPartResult.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(ListenerTest, DoesBar) {
 | 
			
		||||
  g_events->push_back("ListenerTest::* Test Body");
 | 
			
		||||
  SUCCEED();  // Triggers OnTestPartResult.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
using ::testing::internal::EnvironmentInvocationCatcher;
 | 
			
		||||
using ::testing::internal::EventRecordingListener;
 | 
			
		||||
 | 
			
		||||
void VerifyResults(const std::vector<std::string>& data,
 | 
			
		||||
                   const char* const* expected_data,
 | 
			
		||||
                   int expected_data_size) {
 | 
			
		||||
  const int actual_size = data.size();
 | 
			
		||||
  // If the following assertion fails, a new entry will be appended to
 | 
			
		||||
  // data.  Hence we save data.size() first.
 | 
			
		||||
  EXPECT_EQ(expected_data_size, actual_size);
 | 
			
		||||
 | 
			
		||||
  // Compares the common prefix.
 | 
			
		||||
  const int shorter_size = expected_data_size <= actual_size ?
 | 
			
		||||
      expected_data_size : actual_size;
 | 
			
		||||
  int i = 0;
 | 
			
		||||
  for (; i < shorter_size; ++i) {
 | 
			
		||||
    ASSERT_STREQ(expected_data[i], data[i].c_str())
 | 
			
		||||
        << "at position " << i;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Prints extra elements in the actual data.
 | 
			
		||||
  for (; i < actual_size; ++i) {
 | 
			
		||||
    printf("  Actual event #%d: %s\n", i, data[i].c_str());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  std::vector<std::string> events;
 | 
			
		||||
  g_events = &events;
 | 
			
		||||
  InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  UnitTest::GetInstance()->listeners().Append(
 | 
			
		||||
      new EventRecordingListener("1st"));
 | 
			
		||||
  UnitTest::GetInstance()->listeners().Append(
 | 
			
		||||
      new EventRecordingListener("2nd"));
 | 
			
		||||
 | 
			
		||||
  AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);
 | 
			
		||||
 | 
			
		||||
  GTEST_CHECK_(events.size() == 0)
 | 
			
		||||
      << "AddGlobalTestEnvironment should not generate any events itself.";
 | 
			
		||||
 | 
			
		||||
  ::testing::GTEST_FLAG(repeat) = 2;
 | 
			
		||||
  int ret_val = RUN_ALL_TESTS();
 | 
			
		||||
 | 
			
		||||
  const char* const expected_events[] = {
 | 
			
		||||
    "1st.OnTestProgramStart",
 | 
			
		||||
    "2nd.OnTestProgramStart",
 | 
			
		||||
    "1st.OnTestIterationStart(0)",
 | 
			
		||||
    "2nd.OnTestIterationStart(0)",
 | 
			
		||||
    "1st.OnEnvironmentsSetUpStart",
 | 
			
		||||
    "2nd.OnEnvironmentsSetUpStart",
 | 
			
		||||
    "Environment::SetUp",
 | 
			
		||||
    "2nd.OnEnvironmentsSetUpEnd",
 | 
			
		||||
    "1st.OnEnvironmentsSetUpEnd",
 | 
			
		||||
    "1st.OnTestCaseStart",
 | 
			
		||||
    "2nd.OnTestCaseStart",
 | 
			
		||||
    "ListenerTest::SetUpTestCase",
 | 
			
		||||
    "1st.OnTestStart",
 | 
			
		||||
    "2nd.OnTestStart",
 | 
			
		||||
    "ListenerTest::SetUp",
 | 
			
		||||
    "ListenerTest::* Test Body",
 | 
			
		||||
    "1st.OnTestPartResult",
 | 
			
		||||
    "2nd.OnTestPartResult",
 | 
			
		||||
    "ListenerTest::TearDown",
 | 
			
		||||
    "2nd.OnTestEnd",
 | 
			
		||||
    "1st.OnTestEnd",
 | 
			
		||||
    "1st.OnTestStart",
 | 
			
		||||
    "2nd.OnTestStart",
 | 
			
		||||
    "ListenerTest::SetUp",
 | 
			
		||||
    "ListenerTest::* Test Body",
 | 
			
		||||
    "1st.OnTestPartResult",
 | 
			
		||||
    "2nd.OnTestPartResult",
 | 
			
		||||
    "ListenerTest::TearDown",
 | 
			
		||||
    "2nd.OnTestEnd",
 | 
			
		||||
    "1st.OnTestEnd",
 | 
			
		||||
    "ListenerTest::TearDownTestCase",
 | 
			
		||||
    "2nd.OnTestCaseEnd",
 | 
			
		||||
    "1st.OnTestCaseEnd",
 | 
			
		||||
    "1st.OnEnvironmentsTearDownStart",
 | 
			
		||||
    "2nd.OnEnvironmentsTearDownStart",
 | 
			
		||||
    "Environment::TearDown",
 | 
			
		||||
    "2nd.OnEnvironmentsTearDownEnd",
 | 
			
		||||
    "1st.OnEnvironmentsTearDownEnd",
 | 
			
		||||
    "2nd.OnTestIterationEnd(0)",
 | 
			
		||||
    "1st.OnTestIterationEnd(0)",
 | 
			
		||||
    "1st.OnTestIterationStart(1)",
 | 
			
		||||
    "2nd.OnTestIterationStart(1)",
 | 
			
		||||
    "1st.OnEnvironmentsSetUpStart",
 | 
			
		||||
    "2nd.OnEnvironmentsSetUpStart",
 | 
			
		||||
    "Environment::SetUp",
 | 
			
		||||
    "2nd.OnEnvironmentsSetUpEnd",
 | 
			
		||||
    "1st.OnEnvironmentsSetUpEnd",
 | 
			
		||||
    "1st.OnTestCaseStart",
 | 
			
		||||
    "2nd.OnTestCaseStart",
 | 
			
		||||
    "ListenerTest::SetUpTestCase",
 | 
			
		||||
    "1st.OnTestStart",
 | 
			
		||||
    "2nd.OnTestStart",
 | 
			
		||||
    "ListenerTest::SetUp",
 | 
			
		||||
    "ListenerTest::* Test Body",
 | 
			
		||||
    "1st.OnTestPartResult",
 | 
			
		||||
    "2nd.OnTestPartResult",
 | 
			
		||||
    "ListenerTest::TearDown",
 | 
			
		||||
    "2nd.OnTestEnd",
 | 
			
		||||
    "1st.OnTestEnd",
 | 
			
		||||
    "1st.OnTestStart",
 | 
			
		||||
    "2nd.OnTestStart",
 | 
			
		||||
    "ListenerTest::SetUp",
 | 
			
		||||
    "ListenerTest::* Test Body",
 | 
			
		||||
    "1st.OnTestPartResult",
 | 
			
		||||
    "2nd.OnTestPartResult",
 | 
			
		||||
    "ListenerTest::TearDown",
 | 
			
		||||
    "2nd.OnTestEnd",
 | 
			
		||||
    "1st.OnTestEnd",
 | 
			
		||||
    "ListenerTest::TearDownTestCase",
 | 
			
		||||
    "2nd.OnTestCaseEnd",
 | 
			
		||||
    "1st.OnTestCaseEnd",
 | 
			
		||||
    "1st.OnEnvironmentsTearDownStart",
 | 
			
		||||
    "2nd.OnEnvironmentsTearDownStart",
 | 
			
		||||
    "Environment::TearDown",
 | 
			
		||||
    "2nd.OnEnvironmentsTearDownEnd",
 | 
			
		||||
    "1st.OnEnvironmentsTearDownEnd",
 | 
			
		||||
    "2nd.OnTestIterationEnd(1)",
 | 
			
		||||
    "1st.OnTestIterationEnd(1)",
 | 
			
		||||
    "2nd.OnTestProgramEnd",
 | 
			
		||||
    "1st.OnTestProgramEnd"
 | 
			
		||||
  };
 | 
			
		||||
  VerifyResults(events,
 | 
			
		||||
                expected_events,
 | 
			
		||||
                sizeof(expected_events)/sizeof(expected_events[0]));
 | 
			
		||||
 | 
			
		||||
  // We need to check manually for ad hoc test failures that happen after
 | 
			
		||||
  // RUN_ALL_TESTS finishes.
 | 
			
		||||
  if (UnitTest::GetInstance()->Failed())
 | 
			
		||||
    ret_val = 1;
 | 
			
		||||
 | 
			
		||||
  return ret_val;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,159 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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)
 | 
			
		||||
//
 | 
			
		||||
// Tests for the Message class.
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest-message.h"
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
using ::testing::Message;
 | 
			
		||||
 | 
			
		||||
// Tests the testing::Message class
 | 
			
		||||
 | 
			
		||||
// Tests the default constructor.
 | 
			
		||||
TEST(MessageTest, DefaultConstructor) {
 | 
			
		||||
  const Message msg;
 | 
			
		||||
  EXPECT_EQ("", msg.GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests the copy constructor.
 | 
			
		||||
TEST(MessageTest, CopyConstructor) {
 | 
			
		||||
  const Message msg1("Hello");
 | 
			
		||||
  const Message msg2(msg1);
 | 
			
		||||
  EXPECT_EQ("Hello", msg2.GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests constructing a Message from a C-string.
 | 
			
		||||
TEST(MessageTest, ConstructsFromCString) {
 | 
			
		||||
  Message msg("Hello");
 | 
			
		||||
  EXPECT_EQ("Hello", msg.GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests streaming a float.
 | 
			
		||||
TEST(MessageTest, StreamsFloat) {
 | 
			
		||||
  const std::string s = (Message() << 1.23456F << " " << 2.34567F).GetString();
 | 
			
		||||
  // Both numbers should be printed with enough precision.
 | 
			
		||||
  EXPECT_PRED_FORMAT2(testing::IsSubstring, "1.234560", s.c_str());
 | 
			
		||||
  EXPECT_PRED_FORMAT2(testing::IsSubstring, " 2.345669", s.c_str());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests streaming a double.
 | 
			
		||||
TEST(MessageTest, StreamsDouble) {
 | 
			
		||||
  const std::string s = (Message() << 1260570880.4555497 << " "
 | 
			
		||||
                                  << 1260572265.1954534).GetString();
 | 
			
		||||
  // Both numbers should be printed with enough precision.
 | 
			
		||||
  EXPECT_PRED_FORMAT2(testing::IsSubstring, "1260570880.45", s.c_str());
 | 
			
		||||
  EXPECT_PRED_FORMAT2(testing::IsSubstring, " 1260572265.19", s.c_str());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests streaming a non-char pointer.
 | 
			
		||||
TEST(MessageTest, StreamsPointer) {
 | 
			
		||||
  int n = 0;
 | 
			
		||||
  int* p = &n;
 | 
			
		||||
  EXPECT_NE("(null)", (Message() << p).GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests streaming a NULL non-char pointer.
 | 
			
		||||
TEST(MessageTest, StreamsNullPointer) {
 | 
			
		||||
  int* p = NULL;
 | 
			
		||||
  EXPECT_EQ("(null)", (Message() << p).GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests streaming a C string.
 | 
			
		||||
TEST(MessageTest, StreamsCString) {
 | 
			
		||||
  EXPECT_EQ("Foo", (Message() << "Foo").GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests streaming a NULL C string.
 | 
			
		||||
TEST(MessageTest, StreamsNullCString) {
 | 
			
		||||
  char* p = NULL;
 | 
			
		||||
  EXPECT_EQ("(null)", (Message() << p).GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests streaming std::string.
 | 
			
		||||
TEST(MessageTest, StreamsString) {
 | 
			
		||||
  const ::std::string str("Hello");
 | 
			
		||||
  EXPECT_EQ("Hello", (Message() << str).GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that we can output strings containing embedded NULs.
 | 
			
		||||
TEST(MessageTest, StreamsStringWithEmbeddedNUL) {
 | 
			
		||||
  const char char_array_with_nul[] =
 | 
			
		||||
      "Here's a NUL\0 and some more string";
 | 
			
		||||
  const ::std::string string_with_nul(char_array_with_nul,
 | 
			
		||||
                                      sizeof(char_array_with_nul) - 1);
 | 
			
		||||
  EXPECT_EQ("Here's a NUL\\0 and some more string",
 | 
			
		||||
            (Message() << string_with_nul).GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests streaming a NUL char.
 | 
			
		||||
TEST(MessageTest, StreamsNULChar) {
 | 
			
		||||
  EXPECT_EQ("\\0", (Message() << '\0').GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests streaming int.
 | 
			
		||||
TEST(MessageTest, StreamsInt) {
 | 
			
		||||
  EXPECT_EQ("123", (Message() << 123).GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that basic IO manipulators (endl, ends, and flush) can be
 | 
			
		||||
// streamed to Message.
 | 
			
		||||
TEST(MessageTest, StreamsBasicIoManip) {
 | 
			
		||||
  EXPECT_EQ("Line 1.\nA NUL char \\0 in line 2.",
 | 
			
		||||
               (Message() << "Line 1." << std::endl
 | 
			
		||||
                         << "A NUL char " << std::ends << std::flush
 | 
			
		||||
                         << " in line 2.").GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests Message::GetString()
 | 
			
		||||
TEST(MessageTest, GetString) {
 | 
			
		||||
  Message msg;
 | 
			
		||||
  msg << 1 << " lamb";
 | 
			
		||||
  EXPECT_EQ("1 lamb", msg.GetString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests streaming a Message object to an ostream.
 | 
			
		||||
TEST(MessageTest, StreamsToOStream) {
 | 
			
		||||
  Message msg("Hello");
 | 
			
		||||
  ::std::stringstream ss;
 | 
			
		||||
  ss << msg;
 | 
			
		||||
  EXPECT_EQ("Hello", testing::internal::StringStreamToString(&ss));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that a Message object doesn't take up too much stack space.
 | 
			
		||||
TEST(MessageTest, DoesNotTakeUpMuchStackSpace) {
 | 
			
		||||
  EXPECT_LE(sizeof(Message), 16U);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
| 
						 | 
				
			
			@ -1,215 +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.
 | 
			
		||||
//
 | 
			
		||||
// Authors: keith.ray@gmail.com (Keith Ray)
 | 
			
		||||
//
 | 
			
		||||
// Google Test UnitTestOptions tests
 | 
			
		||||
//
 | 
			
		||||
// This file tests classes and functions used internally by
 | 
			
		||||
// Google Test.  They are subject to change without notice.
 | 
			
		||||
//
 | 
			
		||||
// This file is #included from gtest.cc, to avoid changing build or
 | 
			
		||||
// make-files on Windows and other platforms. Do not #include this file
 | 
			
		||||
// anywhere else!
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
# include <windows.h>
 | 
			
		||||
#elif GTEST_OS_WINDOWS
 | 
			
		||||
# include <direct.h>
 | 
			
		||||
#endif  // GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
 | 
			
		||||
// Indicates that this translation unit is part of Google Test's
 | 
			
		||||
// implementation.  It must come before gtest-internal-inl.h is
 | 
			
		||||
// included, or there will be a compiler error.  This trick is to
 | 
			
		||||
// prevent a user from accidentally including gtest-internal-inl.h in
 | 
			
		||||
// his code.
 | 
			
		||||
#define GTEST_IMPLEMENTATION_ 1
 | 
			
		||||
#include "src/gtest-internal-inl.h"
 | 
			
		||||
#undef GTEST_IMPLEMENTATION_
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
// Turns the given relative path into an absolute path.
 | 
			
		||||
FilePath GetAbsolutePathOf(const FilePath& relative_path) {
 | 
			
		||||
  return FilePath::ConcatPaths(FilePath::GetCurrentDir(), relative_path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Testing UnitTestOptions::GetOutputFormat/GetOutputFile.
 | 
			
		||||
 | 
			
		||||
TEST(XmlOutputTest, GetOutputFormatDefault) {
 | 
			
		||||
  GTEST_FLAG(output) = "";
 | 
			
		||||
  EXPECT_STREQ("", UnitTestOptions::GetOutputFormat().c_str());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(XmlOutputTest, GetOutputFormat) {
 | 
			
		||||
  GTEST_FLAG(output) = "xml:filename";
 | 
			
		||||
  EXPECT_STREQ("xml", UnitTestOptions::GetOutputFormat().c_str());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(XmlOutputTest, GetOutputFileDefault) {
 | 
			
		||||
  GTEST_FLAG(output) = "";
 | 
			
		||||
  EXPECT_EQ(GetAbsolutePathOf(FilePath("test_detail.xml")).string(),
 | 
			
		||||
            UnitTestOptions::GetAbsolutePathToOutputFile());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(XmlOutputTest, GetOutputFileSingleFile) {
 | 
			
		||||
  GTEST_FLAG(output) = "xml:filename.abc";
 | 
			
		||||
  EXPECT_EQ(GetAbsolutePathOf(FilePath("filename.abc")).string(),
 | 
			
		||||
            UnitTestOptions::GetAbsolutePathToOutputFile());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(XmlOutputTest, GetOutputFileFromDirectoryPath) {
 | 
			
		||||
  GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_;
 | 
			
		||||
  const std::string expected_output_file =
 | 
			
		||||
      GetAbsolutePathOf(
 | 
			
		||||
          FilePath(std::string("path") + GTEST_PATH_SEP_ +
 | 
			
		||||
                   GetCurrentExecutableName().string() + ".xml")).string();
 | 
			
		||||
  const std::string& output_file =
 | 
			
		||||
      UnitTestOptions::GetAbsolutePathToOutputFile();
 | 
			
		||||
#if GTEST_OS_WINDOWS
 | 
			
		||||
  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
 | 
			
		||||
#else
 | 
			
		||||
  EXPECT_EQ(expected_output_file, output_file.c_str());
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(OutputFileHelpersTest, GetCurrentExecutableName) {
 | 
			
		||||
  const std::string exe_str = GetCurrentExecutableName().string();
 | 
			
		||||
#if GTEST_OS_WINDOWS
 | 
			
		||||
  const bool success =
 | 
			
		||||
      _strcmpi("gtest-options_test", exe_str.c_str()) == 0 ||
 | 
			
		||||
      _strcmpi("gtest-options-ex_test", exe_str.c_str()) == 0 ||
 | 
			
		||||
      _strcmpi("gtest_all_test", exe_str.c_str()) == 0 ||
 | 
			
		||||
      _strcmpi("gtest_dll_test", exe_str.c_str()) == 0;
 | 
			
		||||
#else
 | 
			
		||||
  // TODO(wan@google.com): remove the hard-coded "lt-" prefix when
 | 
			
		||||
  //   Chandler Carruth's libtool replacement is ready.
 | 
			
		||||
  const bool success =
 | 
			
		||||
      exe_str == "gtest-options_test" ||
 | 
			
		||||
      exe_str == "gtest_all_test" ||
 | 
			
		||||
      exe_str == "lt-gtest_all_test" ||
 | 
			
		||||
      exe_str == "gtest_dll_test";
 | 
			
		||||
#endif  // GTEST_OS_WINDOWS
 | 
			
		||||
  if (!success)
 | 
			
		||||
    FAIL() << "GetCurrentExecutableName() returns " << exe_str;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class XmlOutputChangeDirTest : public Test {
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    original_working_dir_ = FilePath::GetCurrentDir();
 | 
			
		||||
    posix::ChDir("..");
 | 
			
		||||
    // This will make the test fail if run from the root directory.
 | 
			
		||||
    EXPECT_NE(original_working_dir_.string(),
 | 
			
		||||
              FilePath::GetCurrentDir().string());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    posix::ChDir(original_working_dir_.string().c_str());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  FilePath original_working_dir_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefault) {
 | 
			
		||||
  GTEST_FLAG(output) = "";
 | 
			
		||||
  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
 | 
			
		||||
                                  FilePath("test_detail.xml")).string(),
 | 
			
		||||
            UnitTestOptions::GetAbsolutePathToOutputFile());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefaultXML) {
 | 
			
		||||
  GTEST_FLAG(output) = "xml";
 | 
			
		||||
  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
 | 
			
		||||
                                  FilePath("test_detail.xml")).string(),
 | 
			
		||||
            UnitTestOptions::GetAbsolutePathToOutputFile());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativeFile) {
 | 
			
		||||
  GTEST_FLAG(output) = "xml:filename.abc";
 | 
			
		||||
  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
 | 
			
		||||
                                  FilePath("filename.abc")).string(),
 | 
			
		||||
            UnitTestOptions::GetAbsolutePathToOutputFile());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativePath) {
 | 
			
		||||
  GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_;
 | 
			
		||||
  const std::string expected_output_file =
 | 
			
		||||
      FilePath::ConcatPaths(
 | 
			
		||||
          original_working_dir_,
 | 
			
		||||
          FilePath(std::string("path") + GTEST_PATH_SEP_ +
 | 
			
		||||
                   GetCurrentExecutableName().string() + ".xml")).string();
 | 
			
		||||
  const std::string& output_file =
 | 
			
		||||
      UnitTestOptions::GetAbsolutePathToOutputFile();
 | 
			
		||||
#if GTEST_OS_WINDOWS
 | 
			
		||||
  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
 | 
			
		||||
#else
 | 
			
		||||
  EXPECT_EQ(expected_output_file, output_file.c_str());
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsoluteFile) {
 | 
			
		||||
#if GTEST_OS_WINDOWS
 | 
			
		||||
  GTEST_FLAG(output) = "xml:c:\\tmp\\filename.abc";
 | 
			
		||||
  EXPECT_EQ(FilePath("c:\\tmp\\filename.abc").string(),
 | 
			
		||||
            UnitTestOptions::GetAbsolutePathToOutputFile());
 | 
			
		||||
#else
 | 
			
		||||
  GTEST_FLAG(output) ="xml:/tmp/filename.abc";
 | 
			
		||||
  EXPECT_EQ(FilePath("/tmp/filename.abc").string(),
 | 
			
		||||
            UnitTestOptions::GetAbsolutePathToOutputFile());
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsolutePath) {
 | 
			
		||||
#if GTEST_OS_WINDOWS
 | 
			
		||||
  const std::string path = "c:\\tmp\\";
 | 
			
		||||
#else
 | 
			
		||||
  const std::string path = "/tmp/";
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  GTEST_FLAG(output) = "xml:" + path;
 | 
			
		||||
  const std::string expected_output_file =
 | 
			
		||||
      path + GetCurrentExecutableName().string() + ".xml";
 | 
			
		||||
  const std::string& output_file =
 | 
			
		||||
      UnitTestOptions::GetAbsolutePathToOutputFile();
 | 
			
		||||
 | 
			
		||||
#if GTEST_OS_WINDOWS
 | 
			
		||||
  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
 | 
			
		||||
#else
 | 
			
		||||
  EXPECT_EQ(expected_output_file, output_file.c_str());
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
| 
						 | 
				
			
			@ -1,65 +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: vladl@google.com (Vlad Losev)
 | 
			
		||||
//
 | 
			
		||||
// Tests for Google Test itself.  This verifies that the basic constructs of
 | 
			
		||||
// Google Test work.
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#include "test/gtest-param-test_test.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
using ::testing::Values;
 | 
			
		||||
using ::testing::internal::ParamGenerator;
 | 
			
		||||
 | 
			
		||||
// Tests that generators defined in a different translation unit
 | 
			
		||||
// are functional. The test using extern_gen is defined
 | 
			
		||||
// in gtest-param-test_test.cc.
 | 
			
		||||
ParamGenerator<int> extern_gen = Values(33);
 | 
			
		||||
 | 
			
		||||
// Tests that a parameterized test case can be defined in one translation unit
 | 
			
		||||
// and instantiated in another. The test is defined in gtest-param-test_test.cc
 | 
			
		||||
// and ExternalInstantiationTest fixture class is defined in
 | 
			
		||||
// gtest-param-test_test.h.
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(MultiplesOf33,
 | 
			
		||||
                        ExternalInstantiationTest,
 | 
			
		||||
                        Values(33, 66));
 | 
			
		||||
 | 
			
		||||
// Tests that a parameterized test case can be instantiated
 | 
			
		||||
// in multiple translation units. Another instantiation is defined
 | 
			
		||||
// in gtest-param-test_test.cc and InstantiationInMultipleTranslaionUnitsTest
 | 
			
		||||
// fixture is defined in gtest-param-test_test.h
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(Sequence2,
 | 
			
		||||
                        InstantiationInMultipleTranslaionUnitsTest,
 | 
			
		||||
                        Values(42*3, 42*4, 42*5));
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_PARAM_TEST
 | 
			
		||||
| 
						 | 
				
			
			@ -1,904 +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: vladl@google.com (Vlad Losev)
 | 
			
		||||
//
 | 
			
		||||
// Tests for Google Test itself. This file verifies that the parameter
 | 
			
		||||
// generators objects produce correct parameter sequences and that
 | 
			
		||||
// Google Test runtime instantiates correct tests from those sequences.
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
# include <algorithm>
 | 
			
		||||
# include <iostream>
 | 
			
		||||
# include <list>
 | 
			
		||||
# include <sstream>
 | 
			
		||||
# include <string>
 | 
			
		||||
# include <vector>
 | 
			
		||||
 | 
			
		||||
// To include gtest-internal-inl.h.
 | 
			
		||||
# define GTEST_IMPLEMENTATION_ 1
 | 
			
		||||
# include "src/gtest-internal-inl.h"  // for UnitTestOptions
 | 
			
		||||
# undef GTEST_IMPLEMENTATION_
 | 
			
		||||
 | 
			
		||||
# include "test/gtest-param-test_test.h"
 | 
			
		||||
 | 
			
		||||
using ::std::vector;
 | 
			
		||||
using ::std::sort;
 | 
			
		||||
 | 
			
		||||
using ::testing::AddGlobalTestEnvironment;
 | 
			
		||||
using ::testing::Bool;
 | 
			
		||||
using ::testing::Message;
 | 
			
		||||
using ::testing::Range;
 | 
			
		||||
using ::testing::TestWithParam;
 | 
			
		||||
using ::testing::Values;
 | 
			
		||||
using ::testing::ValuesIn;
 | 
			
		||||
 | 
			
		||||
# if GTEST_HAS_COMBINE
 | 
			
		||||
using ::testing::Combine;
 | 
			
		||||
using ::std::tr1::get;
 | 
			
		||||
using ::std::tr1::make_tuple;
 | 
			
		||||
using ::std::tr1::tuple;
 | 
			
		||||
# endif  // GTEST_HAS_COMBINE
 | 
			
		||||
 | 
			
		||||
using ::testing::internal::ParamGenerator;
 | 
			
		||||
using ::testing::internal::UnitTestOptions;
 | 
			
		||||
 | 
			
		||||
// Prints a value to a string.
 | 
			
		||||
//
 | 
			
		||||
// TODO(wan@google.com): remove PrintValue() when we move matchers and
 | 
			
		||||
// EXPECT_THAT() from Google Mock to Google Test.  At that time, we
 | 
			
		||||
// can write EXPECT_THAT(x, Eq(y)) to compare two tuples x and y, as
 | 
			
		||||
// EXPECT_THAT() and the matchers know how to print tuples.
 | 
			
		||||
template <typename T>
 | 
			
		||||
::std::string PrintValue(const T& value) {
 | 
			
		||||
  ::std::stringstream stream;
 | 
			
		||||
  stream << value;
 | 
			
		||||
  return stream.str();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# if GTEST_HAS_COMBINE
 | 
			
		||||
 | 
			
		||||
// These overloads allow printing tuples in our tests.  We cannot
 | 
			
		||||
// define an operator<< for tuples, as that definition needs to be in
 | 
			
		||||
// the std namespace in order to be picked up by Google Test via
 | 
			
		||||
// Argument-Dependent Lookup, yet defining anything in the std
 | 
			
		||||
// namespace in non-STL code is undefined behavior.
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2>
 | 
			
		||||
::std::string PrintValue(const tuple<T1, T2>& value) {
 | 
			
		||||
  ::std::stringstream stream;
 | 
			
		||||
  stream << "(" << get<0>(value) << ", " << get<1>(value) << ")";
 | 
			
		||||
  return stream.str();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2, typename T3>
 | 
			
		||||
::std::string PrintValue(const tuple<T1, T2, T3>& value) {
 | 
			
		||||
  ::std::stringstream stream;
 | 
			
		||||
  stream << "(" << get<0>(value) << ", " << get<1>(value)
 | 
			
		||||
         << ", "<< get<2>(value) << ")";
 | 
			
		||||
  return stream.str();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | 
			
		||||
          typename T6, typename T7, typename T8, typename T9, typename T10>
 | 
			
		||||
::std::string PrintValue(
 | 
			
		||||
    const tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& value) {
 | 
			
		||||
  ::std::stringstream stream;
 | 
			
		||||
  stream << "(" << get<0>(value) << ", " << get<1>(value)
 | 
			
		||||
         << ", "<< get<2>(value) << ", " << get<3>(value)
 | 
			
		||||
         << ", "<< get<4>(value) << ", " << get<5>(value)
 | 
			
		||||
         << ", "<< get<6>(value) << ", " << get<7>(value)
 | 
			
		||||
         << ", "<< get<8>(value) << ", " << get<9>(value) << ")";
 | 
			
		||||
  return stream.str();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# endif  // GTEST_HAS_COMBINE
 | 
			
		||||
 | 
			
		||||
// Verifies that a sequence generated by the generator and accessed
 | 
			
		||||
// via the iterator object matches the expected one using Google Test
 | 
			
		||||
// assertions.
 | 
			
		||||
template <typename T, size_t N>
 | 
			
		||||
void VerifyGenerator(const ParamGenerator<T>& generator,
 | 
			
		||||
                     const T (&expected_values)[N]) {
 | 
			
		||||
  typename ParamGenerator<T>::iterator it = generator.begin();
 | 
			
		||||
  for (size_t i = 0; i < N; ++i) {
 | 
			
		||||
    ASSERT_FALSE(it == generator.end())
 | 
			
		||||
        << "At element " << i << " when accessing via an iterator "
 | 
			
		||||
        << "created with the copy constructor.\n";
 | 
			
		||||
    // We cannot use EXPECT_EQ() here as the values may be tuples,
 | 
			
		||||
    // which don't support <<.
 | 
			
		||||
    EXPECT_TRUE(expected_values[i] == *it)
 | 
			
		||||
        << "where i is " << i
 | 
			
		||||
        << ", expected_values[i] is " << PrintValue(expected_values[i])
 | 
			
		||||
        << ", *it is " << PrintValue(*it)
 | 
			
		||||
        << ", and 'it' is an iterator created with the copy constructor.\n";
 | 
			
		||||
    it++;
 | 
			
		||||
  }
 | 
			
		||||
  EXPECT_TRUE(it == generator.end())
 | 
			
		||||
        << "At the presumed end of sequence when accessing via an iterator "
 | 
			
		||||
        << "created with the copy constructor.\n";
 | 
			
		||||
 | 
			
		||||
  // Test the iterator assignment. The following lines verify that
 | 
			
		||||
  // the sequence accessed via an iterator initialized via the
 | 
			
		||||
  // assignment operator (as opposed to a copy constructor) matches
 | 
			
		||||
  // just the same.
 | 
			
		||||
  it = generator.begin();
 | 
			
		||||
  for (size_t i = 0; i < N; ++i) {
 | 
			
		||||
    ASSERT_FALSE(it == generator.end())
 | 
			
		||||
        << "At element " << i << " when accessing via an iterator "
 | 
			
		||||
        << "created with the assignment operator.\n";
 | 
			
		||||
    EXPECT_TRUE(expected_values[i] == *it)
 | 
			
		||||
        << "where i is " << i
 | 
			
		||||
        << ", expected_values[i] is " << PrintValue(expected_values[i])
 | 
			
		||||
        << ", *it is " << PrintValue(*it)
 | 
			
		||||
        << ", and 'it' is an iterator created with the copy constructor.\n";
 | 
			
		||||
    it++;
 | 
			
		||||
  }
 | 
			
		||||
  EXPECT_TRUE(it == generator.end())
 | 
			
		||||
        << "At the presumed end of sequence when accessing via an iterator "
 | 
			
		||||
        << "created with the assignment operator.\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
void VerifyGeneratorIsEmpty(const ParamGenerator<T>& generator) {
 | 
			
		||||
  typename ParamGenerator<T>::iterator it = generator.begin();
 | 
			
		||||
  EXPECT_TRUE(it == generator.end());
 | 
			
		||||
 | 
			
		||||
  it = generator.begin();
 | 
			
		||||
  EXPECT_TRUE(it == generator.end());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Generator tests. They test that each of the provided generator functions
 | 
			
		||||
// generates an expected sequence of values. The general test pattern
 | 
			
		||||
// instantiates a generator using one of the generator functions,
 | 
			
		||||
// checks the sequence produced by the generator using its iterator API,
 | 
			
		||||
// and then resets the iterator back to the beginning of the sequence
 | 
			
		||||
// and checks the sequence again.
 | 
			
		||||
 | 
			
		||||
// Tests that iterators produced by generator functions conform to the
 | 
			
		||||
// ForwardIterator concept.
 | 
			
		||||
TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) {
 | 
			
		||||
  const ParamGenerator<int> gen = Range(0, 10);
 | 
			
		||||
  ParamGenerator<int>::iterator it = gen.begin();
 | 
			
		||||
 | 
			
		||||
  // Verifies that iterator initialization works as expected.
 | 
			
		||||
  ParamGenerator<int>::iterator it2 = it;
 | 
			
		||||
  EXPECT_TRUE(*it == *it2) << "Initialized iterators must point to the "
 | 
			
		||||
                           << "element same as its source points to";
 | 
			
		||||
 | 
			
		||||
  // Verifies that iterator assignment works as expected.
 | 
			
		||||
  it++;
 | 
			
		||||
  EXPECT_FALSE(*it == *it2);
 | 
			
		||||
  it2 = it;
 | 
			
		||||
  EXPECT_TRUE(*it == *it2) << "Assigned iterators must point to the "
 | 
			
		||||
                           << "element same as its source points to";
 | 
			
		||||
 | 
			
		||||
  // Verifies that prefix operator++() returns *this.
 | 
			
		||||
  EXPECT_EQ(&it, &(++it)) << "Result of the prefix operator++ must be "
 | 
			
		||||
                          << "refer to the original object";
 | 
			
		||||
 | 
			
		||||
  // Verifies that the result of the postfix operator++ points to the value
 | 
			
		||||
  // pointed to by the original iterator.
 | 
			
		||||
  int original_value = *it;  // Have to compute it outside of macro call to be
 | 
			
		||||
                             // unaffected by the parameter evaluation order.
 | 
			
		||||
  EXPECT_EQ(original_value, *(it++));
 | 
			
		||||
 | 
			
		||||
  // Verifies that prefix and postfix operator++() advance an iterator
 | 
			
		||||
  // all the same.
 | 
			
		||||
  it2 = it;
 | 
			
		||||
  it++;
 | 
			
		||||
  ++it2;
 | 
			
		||||
  EXPECT_TRUE(*it == *it2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that Range() generates the expected sequence.
 | 
			
		||||
TEST(RangeTest, IntRangeWithDefaultStep) {
 | 
			
		||||
  const ParamGenerator<int> gen = Range(0, 3);
 | 
			
		||||
  const int expected_values[] = {0, 1, 2};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Edge case. Tests that Range() generates the single element sequence
 | 
			
		||||
// as expected when provided with range limits that are equal.
 | 
			
		||||
TEST(RangeTest, IntRangeSingleValue) {
 | 
			
		||||
  const ParamGenerator<int> gen = Range(0, 1);
 | 
			
		||||
  const int expected_values[] = {0};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Edge case. Tests that Range() with generates empty sequence when
 | 
			
		||||
// supplied with an empty range.
 | 
			
		||||
TEST(RangeTest, IntRangeEmpty) {
 | 
			
		||||
  const ParamGenerator<int> gen = Range(0, 0);
 | 
			
		||||
  VerifyGeneratorIsEmpty(gen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that Range() with custom step (greater then one) generates
 | 
			
		||||
// the expected sequence.
 | 
			
		||||
TEST(RangeTest, IntRangeWithCustomStep) {
 | 
			
		||||
  const ParamGenerator<int> gen = Range(0, 9, 3);
 | 
			
		||||
  const int expected_values[] = {0, 3, 6};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that Range() with custom step (greater then one) generates
 | 
			
		||||
// the expected sequence when the last element does not fall on the
 | 
			
		||||
// upper range limit. Sequences generated by Range() must not have
 | 
			
		||||
// elements beyond the range limits.
 | 
			
		||||
TEST(RangeTest, IntRangeWithCustomStepOverUpperBound) {
 | 
			
		||||
  const ParamGenerator<int> gen = Range(0, 4, 3);
 | 
			
		||||
  const int expected_values[] = {0, 3};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Verifies that Range works with user-defined types that define
 | 
			
		||||
// copy constructor, operator=(), operator+(), and operator<().
 | 
			
		||||
class DogAdder {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit DogAdder(const char* a_value) : value_(a_value) {}
 | 
			
		||||
  DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {}
 | 
			
		||||
 | 
			
		||||
  DogAdder operator=(const DogAdder& other) {
 | 
			
		||||
    if (this != &other)
 | 
			
		||||
      value_ = other.value_;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
  DogAdder operator+(const DogAdder& other) const {
 | 
			
		||||
    Message msg;
 | 
			
		||||
    msg << value_.c_str() << other.value_.c_str();
 | 
			
		||||
    return DogAdder(msg.GetString().c_str());
 | 
			
		||||
  }
 | 
			
		||||
  bool operator<(const DogAdder& other) const {
 | 
			
		||||
    return value_ < other.value_;
 | 
			
		||||
  }
 | 
			
		||||
  const std::string& value() const { return value_; }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  std::string value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST(RangeTest, WorksWithACustomType) {
 | 
			
		||||
  const ParamGenerator<DogAdder> gen =
 | 
			
		||||
      Range(DogAdder("cat"), DogAdder("catdogdog"), DogAdder("dog"));
 | 
			
		||||
  ParamGenerator<DogAdder>::iterator it = gen.begin();
 | 
			
		||||
 | 
			
		||||
  ASSERT_FALSE(it == gen.end());
 | 
			
		||||
  EXPECT_STREQ("cat", it->value().c_str());
 | 
			
		||||
 | 
			
		||||
  ASSERT_FALSE(++it == gen.end());
 | 
			
		||||
  EXPECT_STREQ("catdog", it->value().c_str());
 | 
			
		||||
 | 
			
		||||
  EXPECT_TRUE(++it == gen.end());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class IntWrapper {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit IntWrapper(int a_value) : value_(a_value) {}
 | 
			
		||||
  IntWrapper(const IntWrapper& other) : value_(other.value_) {}
 | 
			
		||||
 | 
			
		||||
  IntWrapper operator=(const IntWrapper& other) {
 | 
			
		||||
    value_ = other.value_;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
  // operator+() adds a different type.
 | 
			
		||||
  IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }
 | 
			
		||||
  bool operator<(const IntWrapper& other) const {
 | 
			
		||||
    return value_ < other.value_;
 | 
			
		||||
  }
 | 
			
		||||
  int value() const { return value_; }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  int value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) {
 | 
			
		||||
  const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2));
 | 
			
		||||
  ParamGenerator<IntWrapper>::iterator it = gen.begin();
 | 
			
		||||
 | 
			
		||||
  ASSERT_FALSE(it == gen.end());
 | 
			
		||||
  EXPECT_EQ(0, it->value());
 | 
			
		||||
 | 
			
		||||
  ASSERT_FALSE(++it == gen.end());
 | 
			
		||||
  EXPECT_EQ(1, it->value());
 | 
			
		||||
 | 
			
		||||
  EXPECT_TRUE(++it == gen.end());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that ValuesIn() with an array parameter generates
 | 
			
		||||
// the expected sequence.
 | 
			
		||||
TEST(ValuesInTest, ValuesInArray) {
 | 
			
		||||
  int array[] = {3, 5, 8};
 | 
			
		||||
  const ParamGenerator<int> gen = ValuesIn(array);
 | 
			
		||||
  VerifyGenerator(gen, array);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that ValuesIn() with a const array parameter generates
 | 
			
		||||
// the expected sequence.
 | 
			
		||||
TEST(ValuesInTest, ValuesInConstArray) {
 | 
			
		||||
  const int array[] = {3, 5, 8};
 | 
			
		||||
  const ParamGenerator<int> gen = ValuesIn(array);
 | 
			
		||||
  VerifyGenerator(gen, array);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Edge case. Tests that ValuesIn() with an array parameter containing a
 | 
			
		||||
// single element generates the single element sequence.
 | 
			
		||||
TEST(ValuesInTest, ValuesInSingleElementArray) {
 | 
			
		||||
  int array[] = {42};
 | 
			
		||||
  const ParamGenerator<int> gen = ValuesIn(array);
 | 
			
		||||
  VerifyGenerator(gen, array);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that ValuesIn() generates the expected sequence for an STL
 | 
			
		||||
// container (vector).
 | 
			
		||||
TEST(ValuesInTest, ValuesInVector) {
 | 
			
		||||
  typedef ::std::vector<int> ContainerType;
 | 
			
		||||
  ContainerType values;
 | 
			
		||||
  values.push_back(3);
 | 
			
		||||
  values.push_back(5);
 | 
			
		||||
  values.push_back(8);
 | 
			
		||||
  const ParamGenerator<int> gen = ValuesIn(values);
 | 
			
		||||
 | 
			
		||||
  const int expected_values[] = {3, 5, 8};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that ValuesIn() generates the expected sequence.
 | 
			
		||||
TEST(ValuesInTest, ValuesInIteratorRange) {
 | 
			
		||||
  typedef ::std::vector<int> ContainerType;
 | 
			
		||||
  ContainerType values;
 | 
			
		||||
  values.push_back(3);
 | 
			
		||||
  values.push_back(5);
 | 
			
		||||
  values.push_back(8);
 | 
			
		||||
  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
 | 
			
		||||
 | 
			
		||||
  const int expected_values[] = {3, 5, 8};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Edge case. Tests that ValuesIn() provided with an iterator range specifying a
 | 
			
		||||
// single value generates a single-element sequence.
 | 
			
		||||
TEST(ValuesInTest, ValuesInSingleElementIteratorRange) {
 | 
			
		||||
  typedef ::std::vector<int> ContainerType;
 | 
			
		||||
  ContainerType values;
 | 
			
		||||
  values.push_back(42);
 | 
			
		||||
  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
 | 
			
		||||
 | 
			
		||||
  const int expected_values[] = {42};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Edge case. Tests that ValuesIn() provided with an empty iterator range
 | 
			
		||||
// generates an empty sequence.
 | 
			
		||||
TEST(ValuesInTest, ValuesInEmptyIteratorRange) {
 | 
			
		||||
  typedef ::std::vector<int> ContainerType;
 | 
			
		||||
  ContainerType values;
 | 
			
		||||
  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
 | 
			
		||||
 | 
			
		||||
  VerifyGeneratorIsEmpty(gen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that the Values() generates the expected sequence.
 | 
			
		||||
TEST(ValuesTest, ValuesWorks) {
 | 
			
		||||
  const ParamGenerator<int> gen = Values(3, 5, 8);
 | 
			
		||||
 | 
			
		||||
  const int expected_values[] = {3, 5, 8};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that Values() generates the expected sequences from elements of
 | 
			
		||||
// different types convertible to ParamGenerator's parameter type.
 | 
			
		||||
TEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) {
 | 
			
		||||
  const ParamGenerator<double> gen = Values(3, 5.0f, 8.0);
 | 
			
		||||
 | 
			
		||||
  const double expected_values[] = {3.0, 5.0, 8.0};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(ValuesTest, ValuesWorksForMaxLengthList) {
 | 
			
		||||
  const ParamGenerator<int> gen = Values(
 | 
			
		||||
      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
 | 
			
		||||
      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
 | 
			
		||||
      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
 | 
			
		||||
      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
 | 
			
		||||
      410, 420, 430, 440, 450, 460, 470, 480, 490, 500);
 | 
			
		||||
 | 
			
		||||
  const int expected_values[] = {
 | 
			
		||||
      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
 | 
			
		||||
      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
 | 
			
		||||
      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
 | 
			
		||||
      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
 | 
			
		||||
      410, 420, 430, 440, 450, 460, 470, 480, 490, 500};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Edge case test. Tests that single-parameter Values() generates the sequence
 | 
			
		||||
// with the single value.
 | 
			
		||||
TEST(ValuesTest, ValuesWithSingleParameter) {
 | 
			
		||||
  const ParamGenerator<int> gen = Values(42);
 | 
			
		||||
 | 
			
		||||
  const int expected_values[] = {42};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that Bool() generates sequence (false, true).
 | 
			
		||||
TEST(BoolTest, BoolWorks) {
 | 
			
		||||
  const ParamGenerator<bool> gen = Bool();
 | 
			
		||||
 | 
			
		||||
  const bool expected_values[] = {false, true};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# if GTEST_HAS_COMBINE
 | 
			
		||||
 | 
			
		||||
// Tests that Combine() with two parameters generates the expected sequence.
 | 
			
		||||
TEST(CombineTest, CombineWithTwoParameters) {
 | 
			
		||||
  const char* foo = "foo";
 | 
			
		||||
  const char* bar = "bar";
 | 
			
		||||
  const ParamGenerator<tuple<const char*, int> > gen =
 | 
			
		||||
      Combine(Values(foo, bar), Values(3, 4));
 | 
			
		||||
 | 
			
		||||
  tuple<const char*, int> expected_values[] = {
 | 
			
		||||
    make_tuple(foo, 3), make_tuple(foo, 4),
 | 
			
		||||
    make_tuple(bar, 3), make_tuple(bar, 4)};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that Combine() with three parameters generates the expected sequence.
 | 
			
		||||
TEST(CombineTest, CombineWithThreeParameters) {
 | 
			
		||||
  const ParamGenerator<tuple<int, int, int> > gen = Combine(Values(0, 1),
 | 
			
		||||
                                                            Values(3, 4),
 | 
			
		||||
                                                            Values(5, 6));
 | 
			
		||||
  tuple<int, int, int> expected_values[] = {
 | 
			
		||||
    make_tuple(0, 3, 5), make_tuple(0, 3, 6),
 | 
			
		||||
    make_tuple(0, 4, 5), make_tuple(0, 4, 6),
 | 
			
		||||
    make_tuple(1, 3, 5), make_tuple(1, 3, 6),
 | 
			
		||||
    make_tuple(1, 4, 5), make_tuple(1, 4, 6)};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that the Combine() with the first parameter generating a single value
 | 
			
		||||
// sequence generates a sequence with the number of elements equal to the
 | 
			
		||||
// number of elements in the sequence generated by the second parameter.
 | 
			
		||||
TEST(CombineTest, CombineWithFirstParameterSingleValue) {
 | 
			
		||||
  const ParamGenerator<tuple<int, int> > gen = Combine(Values(42),
 | 
			
		||||
                                                       Values(0, 1));
 | 
			
		||||
 | 
			
		||||
  tuple<int, int> expected_values[] = {make_tuple(42, 0), make_tuple(42, 1)};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that the Combine() with the second parameter generating a single value
 | 
			
		||||
// sequence generates a sequence with the number of elements equal to the
 | 
			
		||||
// number of elements in the sequence generated by the first parameter.
 | 
			
		||||
TEST(CombineTest, CombineWithSecondParameterSingleValue) {
 | 
			
		||||
  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
 | 
			
		||||
                                                       Values(42));
 | 
			
		||||
 | 
			
		||||
  tuple<int, int> expected_values[] = {make_tuple(0, 42), make_tuple(1, 42)};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that when the first parameter produces an empty sequence,
 | 
			
		||||
// Combine() produces an empty sequence, too.
 | 
			
		||||
TEST(CombineTest, CombineWithFirstParameterEmptyRange) {
 | 
			
		||||
  const ParamGenerator<tuple<int, int> > gen = Combine(Range(0, 0),
 | 
			
		||||
                                                       Values(0, 1));
 | 
			
		||||
  VerifyGeneratorIsEmpty(gen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that when the second parameter produces an empty sequence,
 | 
			
		||||
// Combine() produces an empty sequence, too.
 | 
			
		||||
TEST(CombineTest, CombineWithSecondParameterEmptyRange) {
 | 
			
		||||
  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
 | 
			
		||||
                                                       Range(1, 1));
 | 
			
		||||
  VerifyGeneratorIsEmpty(gen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Edge case. Tests that combine works with the maximum number
 | 
			
		||||
// of parameters supported by Google Test (currently 10).
 | 
			
		||||
TEST(CombineTest, CombineWithMaxNumberOfParameters) {
 | 
			
		||||
  const char* foo = "foo";
 | 
			
		||||
  const char* bar = "bar";
 | 
			
		||||
  const ParamGenerator<tuple<const char*, int, int, int, int, int, int, int,
 | 
			
		||||
                             int, int> > gen = Combine(Values(foo, bar),
 | 
			
		||||
                                                       Values(1), Values(2),
 | 
			
		||||
                                                       Values(3), Values(4),
 | 
			
		||||
                                                       Values(5), Values(6),
 | 
			
		||||
                                                       Values(7), Values(8),
 | 
			
		||||
                                                       Values(9));
 | 
			
		||||
 | 
			
		||||
  tuple<const char*, int, int, int, int, int, int, int, int, int>
 | 
			
		||||
      expected_values[] = {make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9),
 | 
			
		||||
                           make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# endif  // GTEST_HAS_COMBINE
 | 
			
		||||
 | 
			
		||||
// Tests that an generator produces correct sequence after being
 | 
			
		||||
// assigned from another generator.
 | 
			
		||||
TEST(ParamGeneratorTest, AssignmentWorks) {
 | 
			
		||||
  ParamGenerator<int> gen = Values(1, 2);
 | 
			
		||||
  const ParamGenerator<int> gen2 = Values(3, 4);
 | 
			
		||||
  gen = gen2;
 | 
			
		||||
 | 
			
		||||
  const int expected_values[] = {3, 4};
 | 
			
		||||
  VerifyGenerator(gen, expected_values);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This test verifies that the tests are expanded and run as specified:
 | 
			
		||||
// one test per element from the sequence produced by the generator
 | 
			
		||||
// specified in INSTANTIATE_TEST_CASE_P. It also verifies that the test's
 | 
			
		||||
// fixture constructor, SetUp(), and TearDown() have run and have been
 | 
			
		||||
// supplied with the correct parameters.
 | 
			
		||||
 | 
			
		||||
// The use of environment object allows detection of the case where no test
 | 
			
		||||
// case functionality is run at all. In this case TestCaseTearDown will not
 | 
			
		||||
// be able to detect missing tests, naturally.
 | 
			
		||||
template <int kExpectedCalls>
 | 
			
		||||
class TestGenerationEnvironment : public ::testing::Environment {
 | 
			
		||||
 public:
 | 
			
		||||
  static TestGenerationEnvironment* Instance() {
 | 
			
		||||
    static TestGenerationEnvironment* instance = new TestGenerationEnvironment;
 | 
			
		||||
    return instance;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void FixtureConstructorExecuted() { fixture_constructor_count_++; }
 | 
			
		||||
  void SetUpExecuted() { set_up_count_++; }
 | 
			
		||||
  void TearDownExecuted() { tear_down_count_++; }
 | 
			
		||||
  void TestBodyExecuted() { test_body_count_++; }
 | 
			
		||||
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    // If all MultipleTestGenerationTest tests have been de-selected
 | 
			
		||||
    // by the filter flag, the following checks make no sense.
 | 
			
		||||
    bool perform_check = false;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < kExpectedCalls; ++i) {
 | 
			
		||||
      Message msg;
 | 
			
		||||
      msg << "TestsExpandedAndRun/" << i;
 | 
			
		||||
      if (UnitTestOptions::FilterMatchesTest(
 | 
			
		||||
             "TestExpansionModule/MultipleTestGenerationTest",
 | 
			
		||||
              msg.GetString().c_str())) {
 | 
			
		||||
        perform_check = true;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (perform_check) {
 | 
			
		||||
      EXPECT_EQ(kExpectedCalls, fixture_constructor_count_)
 | 
			
		||||
          << "Fixture constructor of ParamTestGenerationTest test case "
 | 
			
		||||
          << "has not been run as expected.";
 | 
			
		||||
      EXPECT_EQ(kExpectedCalls, set_up_count_)
 | 
			
		||||
          << "Fixture SetUp method of ParamTestGenerationTest test case "
 | 
			
		||||
          << "has not been run as expected.";
 | 
			
		||||
      EXPECT_EQ(kExpectedCalls, tear_down_count_)
 | 
			
		||||
          << "Fixture TearDown method of ParamTestGenerationTest test case "
 | 
			
		||||
          << "has not been run as expected.";
 | 
			
		||||
      EXPECT_EQ(kExpectedCalls, test_body_count_)
 | 
			
		||||
          << "Test in ParamTestGenerationTest test case "
 | 
			
		||||
          << "has not been run as expected.";
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0),
 | 
			
		||||
                                tear_down_count_(0), test_body_count_(0) {}
 | 
			
		||||
 | 
			
		||||
  int fixture_constructor_count_;
 | 
			
		||||
  int set_up_count_;
 | 
			
		||||
  int tear_down_count_;
 | 
			
		||||
  int test_body_count_;
 | 
			
		||||
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const int test_generation_params[] = {36, 42, 72};
 | 
			
		||||
 | 
			
		||||
class TestGenerationTest : public TestWithParam<int> {
 | 
			
		||||
 public:
 | 
			
		||||
  enum {
 | 
			
		||||
    PARAMETER_COUNT =
 | 
			
		||||
        sizeof(test_generation_params)/sizeof(test_generation_params[0])
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment;
 | 
			
		||||
 | 
			
		||||
  TestGenerationTest() {
 | 
			
		||||
    Environment::Instance()->FixtureConstructorExecuted();
 | 
			
		||||
    current_parameter_ = GetParam();
 | 
			
		||||
  }
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    Environment::Instance()->SetUpExecuted();
 | 
			
		||||
    EXPECT_EQ(current_parameter_, GetParam());
 | 
			
		||||
  }
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    Environment::Instance()->TearDownExecuted();
 | 
			
		||||
    EXPECT_EQ(current_parameter_, GetParam());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static void SetUpTestCase() {
 | 
			
		||||
    bool all_tests_in_test_case_selected = true;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < PARAMETER_COUNT; ++i) {
 | 
			
		||||
      Message test_name;
 | 
			
		||||
      test_name << "TestsExpandedAndRun/" << i;
 | 
			
		||||
      if ( !UnitTestOptions::FilterMatchesTest(
 | 
			
		||||
                "TestExpansionModule/MultipleTestGenerationTest",
 | 
			
		||||
                test_name.GetString())) {
 | 
			
		||||
        all_tests_in_test_case_selected = false;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    EXPECT_TRUE(all_tests_in_test_case_selected)
 | 
			
		||||
        << "When running the TestGenerationTest test case all of its tests\n"
 | 
			
		||||
        << "must be selected by the filter flag for the test case to pass.\n"
 | 
			
		||||
        << "If not all of them are enabled, we can't reliably conclude\n"
 | 
			
		||||
        << "that the correct number of tests have been generated.";
 | 
			
		||||
 | 
			
		||||
    collected_parameters_.clear();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static void TearDownTestCase() {
 | 
			
		||||
    vector<int> expected_values(test_generation_params,
 | 
			
		||||
                                test_generation_params + PARAMETER_COUNT);
 | 
			
		||||
    // Test execution order is not guaranteed by Google Test,
 | 
			
		||||
    // so the order of values in collected_parameters_ can be
 | 
			
		||||
    // different and we have to sort to compare.
 | 
			
		||||
    sort(expected_values.begin(), expected_values.end());
 | 
			
		||||
    sort(collected_parameters_.begin(), collected_parameters_.end());
 | 
			
		||||
 | 
			
		||||
    EXPECT_TRUE(collected_parameters_ == expected_values);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  int current_parameter_;
 | 
			
		||||
  static vector<int> collected_parameters_;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest);
 | 
			
		||||
};
 | 
			
		||||
vector<int> TestGenerationTest::collected_parameters_;
 | 
			
		||||
 | 
			
		||||
TEST_P(TestGenerationTest, TestsExpandedAndRun) {
 | 
			
		||||
  Environment::Instance()->TestBodyExecuted();
 | 
			
		||||
  EXPECT_EQ(current_parameter_, GetParam());
 | 
			
		||||
  collected_parameters_.push_back(GetParam());
 | 
			
		||||
}
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(TestExpansionModule, TestGenerationTest,
 | 
			
		||||
                        ValuesIn(test_generation_params));
 | 
			
		||||
 | 
			
		||||
// This test verifies that the element sequence (third parameter of
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P) is evaluated in InitGoogleTest() and neither at
 | 
			
		||||
// the call site of INSTANTIATE_TEST_CASE_P nor in RUN_ALL_TESTS().  For
 | 
			
		||||
// that, we declare param_value_ to be a static member of
 | 
			
		||||
// GeneratorEvaluationTest and initialize it to 0.  We set it to 1 in
 | 
			
		||||
// main(), just before invocation of InitGoogleTest().  After calling
 | 
			
		||||
// InitGoogleTest(), we set the value to 2.  If the sequence is evaluated
 | 
			
		||||
// before or after InitGoogleTest, INSTANTIATE_TEST_CASE_P will create a
 | 
			
		||||
// test with parameter other than 1, and the test body will fail the
 | 
			
		||||
// assertion.
 | 
			
		||||
class GeneratorEvaluationTest : public TestWithParam<int> {
 | 
			
		||||
 public:
 | 
			
		||||
  static int param_value() { return param_value_; }
 | 
			
		||||
  static void set_param_value(int param_value) { param_value_ = param_value; }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  static int param_value_;
 | 
			
		||||
};
 | 
			
		||||
int GeneratorEvaluationTest::param_value_ = 0;
 | 
			
		||||
 | 
			
		||||
TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) {
 | 
			
		||||
  EXPECT_EQ(1, GetParam());
 | 
			
		||||
}
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(GenEvalModule,
 | 
			
		||||
                        GeneratorEvaluationTest,
 | 
			
		||||
                        Values(GeneratorEvaluationTest::param_value()));
 | 
			
		||||
 | 
			
		||||
// Tests that generators defined in a different translation unit are
 | 
			
		||||
// functional. Generator extern_gen is defined in gtest-param-test_test2.cc.
 | 
			
		||||
extern ParamGenerator<int> extern_gen;
 | 
			
		||||
class ExternalGeneratorTest : public TestWithParam<int> {};
 | 
			
		||||
TEST_P(ExternalGeneratorTest, ExternalGenerator) {
 | 
			
		||||
  // Sequence produced by extern_gen contains only a single value
 | 
			
		||||
  // which we verify here.
 | 
			
		||||
  EXPECT_EQ(GetParam(), 33);
 | 
			
		||||
}
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(ExternalGeneratorModule,
 | 
			
		||||
                        ExternalGeneratorTest,
 | 
			
		||||
                        extern_gen);
 | 
			
		||||
 | 
			
		||||
// Tests that a parameterized test case can be defined in one translation
 | 
			
		||||
// unit and instantiated in another. This test will be instantiated in
 | 
			
		||||
// gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is
 | 
			
		||||
// defined in gtest-param-test_test.h.
 | 
			
		||||
TEST_P(ExternalInstantiationTest, IsMultipleOf33) {
 | 
			
		||||
  EXPECT_EQ(0, GetParam() % 33);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that a parameterized test case can be instantiated with multiple
 | 
			
		||||
// generators.
 | 
			
		||||
class MultipleInstantiationTest : public TestWithParam<int> {};
 | 
			
		||||
TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) {
 | 
			
		||||
}
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(Sequence1, MultipleInstantiationTest, Values(1, 2));
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(Sequence2, MultipleInstantiationTest, Range(3, 5));
 | 
			
		||||
 | 
			
		||||
// Tests that a parameterized test case can be instantiated
 | 
			
		||||
// in multiple translation units. This test will be instantiated
 | 
			
		||||
// here and in gtest-param-test_test2.cc.
 | 
			
		||||
// InstantiationInMultipleTranslationUnitsTest fixture class
 | 
			
		||||
// is defined in gtest-param-test_test.h.
 | 
			
		||||
TEST_P(InstantiationInMultipleTranslaionUnitsTest, IsMultipleOf42) {
 | 
			
		||||
  EXPECT_EQ(0, GetParam() % 42);
 | 
			
		||||
}
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(Sequence1,
 | 
			
		||||
                        InstantiationInMultipleTranslaionUnitsTest,
 | 
			
		||||
                        Values(42, 42*2));
 | 
			
		||||
 | 
			
		||||
// Tests that each iteration of parameterized test runs in a separate test
 | 
			
		||||
// object.
 | 
			
		||||
class SeparateInstanceTest : public TestWithParam<int> {
 | 
			
		||||
 public:
 | 
			
		||||
  SeparateInstanceTest() : count_(0) {}
 | 
			
		||||
 | 
			
		||||
  static void TearDownTestCase() {
 | 
			
		||||
    EXPECT_GE(global_count_, 2)
 | 
			
		||||
        << "If some (but not all) SeparateInstanceTest tests have been "
 | 
			
		||||
        << "filtered out this test will fail. Make sure that all "
 | 
			
		||||
        << "GeneratorEvaluationTest are selected or de-selected together "
 | 
			
		||||
        << "by the test filter.";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  int count_;
 | 
			
		||||
  static int global_count_;
 | 
			
		||||
};
 | 
			
		||||
int SeparateInstanceTest::global_count_ = 0;
 | 
			
		||||
 | 
			
		||||
TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) {
 | 
			
		||||
  EXPECT_EQ(0, count_++);
 | 
			
		||||
  global_count_++;
 | 
			
		||||
}
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4));
 | 
			
		||||
 | 
			
		||||
// Tests that all instantiations of a test have named appropriately. Test
 | 
			
		||||
// defined with TEST_P(TestCaseName, TestName) and instantiated with
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P(SequenceName, TestCaseName, generator) must be named
 | 
			
		||||
// SequenceName/TestCaseName.TestName/i, where i is the 0-based index of the
 | 
			
		||||
// sequence element used to instantiate the test.
 | 
			
		||||
class NamingTest : public TestWithParam<int> {};
 | 
			
		||||
 | 
			
		||||
TEST_P(NamingTest, TestsReportCorrectNamesAndParameters) {
 | 
			
		||||
  const ::testing::TestInfo* const test_info =
 | 
			
		||||
     ::testing::UnitTest::GetInstance()->current_test_info();
 | 
			
		||||
 | 
			
		||||
  EXPECT_STREQ("ZeroToFiveSequence/NamingTest", test_info->test_case_name());
 | 
			
		||||
 | 
			
		||||
  Message index_stream;
 | 
			
		||||
  index_stream << "TestsReportCorrectNamesAndParameters/" << GetParam();
 | 
			
		||||
  EXPECT_STREQ(index_stream.GetString().c_str(), test_info->name());
 | 
			
		||||
 | 
			
		||||
  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(ZeroToFiveSequence, NamingTest, Range(0, 5));
 | 
			
		||||
 | 
			
		||||
// Class that cannot be streamed into an ostream.  It needs to be copyable
 | 
			
		||||
// (and, in case of MSVC, also assignable) in order to be a test parameter
 | 
			
		||||
// type.  Its default copy constructor and assignment operator do exactly
 | 
			
		||||
// what we need.
 | 
			
		||||
class Unstreamable {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit Unstreamable(int value) : value_(value) {}
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  int value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class CommentTest : public TestWithParam<Unstreamable> {};
 | 
			
		||||
 | 
			
		||||
TEST_P(CommentTest, TestsCorrectlyReportUnstreamableParams) {
 | 
			
		||||
  const ::testing::TestInfo* const test_info =
 | 
			
		||||
     ::testing::UnitTest::GetInstance()->current_test_info();
 | 
			
		||||
 | 
			
		||||
  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(InstantiationWithComments,
 | 
			
		||||
                        CommentTest,
 | 
			
		||||
                        Values(Unstreamable(1)));
 | 
			
		||||
 | 
			
		||||
// Verify that we can create a hierarchy of test fixtures, where the base
 | 
			
		||||
// class fixture is not parameterized and the derived class is. In this case
 | 
			
		||||
// ParameterizedDerivedTest inherits from NonParameterizedBaseTest.  We
 | 
			
		||||
// perform simple tests on both.
 | 
			
		||||
class NonParameterizedBaseTest : public ::testing::Test {
 | 
			
		||||
 public:
 | 
			
		||||
  NonParameterizedBaseTest() : n_(17) { }
 | 
			
		||||
 protected:
 | 
			
		||||
  int n_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ParameterizedDerivedTest : public NonParameterizedBaseTest,
 | 
			
		||||
                                 public ::testing::WithParamInterface<int> {
 | 
			
		||||
 protected:
 | 
			
		||||
  ParameterizedDerivedTest() : count_(0) { }
 | 
			
		||||
  int count_;
 | 
			
		||||
  static int global_count_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int ParameterizedDerivedTest::global_count_ = 0;
 | 
			
		||||
 | 
			
		||||
TEST_F(NonParameterizedBaseTest, FixtureIsInitialized) {
 | 
			
		||||
  EXPECT_EQ(17, n_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_P(ParameterizedDerivedTest, SeesSequence) {
 | 
			
		||||
  EXPECT_EQ(17, n_);
 | 
			
		||||
  EXPECT_EQ(0, count_++);
 | 
			
		||||
  EXPECT_EQ(GetParam(), global_count_++);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ParameterizedDeathTest : public ::testing::TestWithParam<int> { };
 | 
			
		||||
 | 
			
		||||
TEST_F(ParameterizedDeathTest, GetParamDiesFromTestF) {
 | 
			
		||||
  EXPECT_DEATH_IF_SUPPORTED(GetParam(),
 | 
			
		||||
                            ".* value-parameterized test .*");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(RangeZeroToFive, ParameterizedDerivedTest, Range(0, 5));
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
TEST(CompileTest, CombineIsDefinedOnlyWhenGtestHasParamTestIsDefined) {
 | 
			
		||||
#if GTEST_HAS_COMBINE && !GTEST_HAS_PARAM_TEST
 | 
			
		||||
  FAIL() << "GTEST_HAS_COMBINE is defined while GTEST_HAS_PARAM_TEST is not\n"
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
#if GTEST_HAS_PARAM_TEST
 | 
			
		||||
  // Used in TestGenerationTest test case.
 | 
			
		||||
  AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance());
 | 
			
		||||
  // Used in GeneratorEvaluationTest test case. Tests that the updated value
 | 
			
		||||
  // will be picked up for instantiating tests in GeneratorEvaluationTest.
 | 
			
		||||
  GeneratorEvaluationTest::set_param_value(1);
 | 
			
		||||
#endif  // GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
  ::testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_PARAM_TEST
 | 
			
		||||
  // Used in GeneratorEvaluationTest test case. Tests that value updated
 | 
			
		||||
  // here will NOT be used for instantiating tests in
 | 
			
		||||
  // GeneratorEvaluationTest.
 | 
			
		||||
  GeneratorEvaluationTest::set_param_value(2);
 | 
			
		||||
#endif  // GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,57 +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.
 | 
			
		||||
//
 | 
			
		||||
// Authors: vladl@google.com (Vlad Losev)
 | 
			
		||||
//
 | 
			
		||||
// The Google C++ Testing Framework (Google Test)
 | 
			
		||||
//
 | 
			
		||||
// This header file provides classes and functions used internally
 | 
			
		||||
// for testing Google Test itself.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
 | 
			
		||||
#define GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
// Test fixture for testing definition and instantiation of a test
 | 
			
		||||
// in separate translation units.
 | 
			
		||||
class ExternalInstantiationTest : public ::testing::TestWithParam<int> {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Test fixture for testing instantiation of a test in multiple
 | 
			
		||||
// translation units.
 | 
			
		||||
class InstantiationInMultipleTranslaionUnitsTest
 | 
			
		||||
    : public ::testing::TestWithParam<int> {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -1,208 +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: mheule@google.com (Markus Heule)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest-test-part.h"
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
using testing::Message;
 | 
			
		||||
using testing::Test;
 | 
			
		||||
using testing::TestPartResult;
 | 
			
		||||
using testing::TestPartResultArray;
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
// Tests the TestPartResult class.
 | 
			
		||||
 | 
			
		||||
// The test fixture for testing TestPartResult.
 | 
			
		||||
class TestPartResultTest : public Test {
 | 
			
		||||
 protected:
 | 
			
		||||
  TestPartResultTest()
 | 
			
		||||
      : r1_(TestPartResult::kSuccess, "foo/bar.cc", 10, "Success!"),
 | 
			
		||||
        r2_(TestPartResult::kNonFatalFailure, "foo/bar.cc", -1, "Failure!"),
 | 
			
		||||
        r3_(TestPartResult::kFatalFailure, NULL, -1, "Failure!") {}
 | 
			
		||||
 | 
			
		||||
  TestPartResult r1_, r2_, r3_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEST_F(TestPartResultTest, ConstructorWorks) {
 | 
			
		||||
  Message message;
 | 
			
		||||
  message << "something is terribly wrong";
 | 
			
		||||
  message << static_cast<const char*>(testing::internal::kStackTraceMarker);
 | 
			
		||||
  message << "some unimportant stack trace";
 | 
			
		||||
 | 
			
		||||
  const TestPartResult result(TestPartResult::kNonFatalFailure,
 | 
			
		||||
                              "some_file.cc",
 | 
			
		||||
                              42,
 | 
			
		||||
                              message.GetString().c_str());
 | 
			
		||||
 | 
			
		||||
  EXPECT_EQ(TestPartResult::kNonFatalFailure, result.type());
 | 
			
		||||
  EXPECT_STREQ("some_file.cc", result.file_name());
 | 
			
		||||
  EXPECT_EQ(42, result.line_number());
 | 
			
		||||
  EXPECT_STREQ(message.GetString().c_str(), result.message());
 | 
			
		||||
  EXPECT_STREQ("something is terribly wrong", result.summary());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(TestPartResultTest, ResultAccessorsWork) {
 | 
			
		||||
  const TestPartResult success(TestPartResult::kSuccess,
 | 
			
		||||
                               "file.cc",
 | 
			
		||||
                               42,
 | 
			
		||||
                               "message");
 | 
			
		||||
  EXPECT_TRUE(success.passed());
 | 
			
		||||
  EXPECT_FALSE(success.failed());
 | 
			
		||||
  EXPECT_FALSE(success.nonfatally_failed());
 | 
			
		||||
  EXPECT_FALSE(success.fatally_failed());
 | 
			
		||||
 | 
			
		||||
  const TestPartResult nonfatal_failure(TestPartResult::kNonFatalFailure,
 | 
			
		||||
                                        "file.cc",
 | 
			
		||||
                                        42,
 | 
			
		||||
                                        "message");
 | 
			
		||||
  EXPECT_FALSE(nonfatal_failure.passed());
 | 
			
		||||
  EXPECT_TRUE(nonfatal_failure.failed());
 | 
			
		||||
  EXPECT_TRUE(nonfatal_failure.nonfatally_failed());
 | 
			
		||||
  EXPECT_FALSE(nonfatal_failure.fatally_failed());
 | 
			
		||||
 | 
			
		||||
  const TestPartResult fatal_failure(TestPartResult::kFatalFailure,
 | 
			
		||||
                                     "file.cc",
 | 
			
		||||
                                     42,
 | 
			
		||||
                                     "message");
 | 
			
		||||
  EXPECT_FALSE(fatal_failure.passed());
 | 
			
		||||
  EXPECT_TRUE(fatal_failure.failed());
 | 
			
		||||
  EXPECT_FALSE(fatal_failure.nonfatally_failed());
 | 
			
		||||
  EXPECT_TRUE(fatal_failure.fatally_failed());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests TestPartResult::type().
 | 
			
		||||
TEST_F(TestPartResultTest, type) {
 | 
			
		||||
  EXPECT_EQ(TestPartResult::kSuccess, r1_.type());
 | 
			
		||||
  EXPECT_EQ(TestPartResult::kNonFatalFailure, r2_.type());
 | 
			
		||||
  EXPECT_EQ(TestPartResult::kFatalFailure, r3_.type());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests TestPartResult::file_name().
 | 
			
		||||
TEST_F(TestPartResultTest, file_name) {
 | 
			
		||||
  EXPECT_STREQ("foo/bar.cc", r1_.file_name());
 | 
			
		||||
  EXPECT_STREQ(NULL, r3_.file_name());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests TestPartResult::line_number().
 | 
			
		||||
TEST_F(TestPartResultTest, line_number) {
 | 
			
		||||
  EXPECT_EQ(10, r1_.line_number());
 | 
			
		||||
  EXPECT_EQ(-1, r2_.line_number());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests TestPartResult::message().
 | 
			
		||||
TEST_F(TestPartResultTest, message) {
 | 
			
		||||
  EXPECT_STREQ("Success!", r1_.message());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests TestPartResult::passed().
 | 
			
		||||
TEST_F(TestPartResultTest, Passed) {
 | 
			
		||||
  EXPECT_TRUE(r1_.passed());
 | 
			
		||||
  EXPECT_FALSE(r2_.passed());
 | 
			
		||||
  EXPECT_FALSE(r3_.passed());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests TestPartResult::failed().
 | 
			
		||||
TEST_F(TestPartResultTest, Failed) {
 | 
			
		||||
  EXPECT_FALSE(r1_.failed());
 | 
			
		||||
  EXPECT_TRUE(r2_.failed());
 | 
			
		||||
  EXPECT_TRUE(r3_.failed());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests TestPartResult::fatally_failed().
 | 
			
		||||
TEST_F(TestPartResultTest, FatallyFailed) {
 | 
			
		||||
  EXPECT_FALSE(r1_.fatally_failed());
 | 
			
		||||
  EXPECT_FALSE(r2_.fatally_failed());
 | 
			
		||||
  EXPECT_TRUE(r3_.fatally_failed());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests TestPartResult::nonfatally_failed().
 | 
			
		||||
TEST_F(TestPartResultTest, NonfatallyFailed) {
 | 
			
		||||
  EXPECT_FALSE(r1_.nonfatally_failed());
 | 
			
		||||
  EXPECT_TRUE(r2_.nonfatally_failed());
 | 
			
		||||
  EXPECT_FALSE(r3_.nonfatally_failed());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests the TestPartResultArray class.
 | 
			
		||||
 | 
			
		||||
class TestPartResultArrayTest : public Test {
 | 
			
		||||
 protected:
 | 
			
		||||
  TestPartResultArrayTest()
 | 
			
		||||
      : r1_(TestPartResult::kNonFatalFailure, "foo/bar.cc", -1, "Failure 1"),
 | 
			
		||||
        r2_(TestPartResult::kFatalFailure, "foo/bar.cc", -1, "Failure 2") {}
 | 
			
		||||
 | 
			
		||||
  const TestPartResult r1_, r2_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Tests that TestPartResultArray initially has size 0.
 | 
			
		||||
TEST_F(TestPartResultArrayTest, InitialSizeIsZero) {
 | 
			
		||||
  TestPartResultArray results;
 | 
			
		||||
  EXPECT_EQ(0, results.size());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that TestPartResultArray contains the given TestPartResult
 | 
			
		||||
// after one Append() operation.
 | 
			
		||||
TEST_F(TestPartResultArrayTest, ContainsGivenResultAfterAppend) {
 | 
			
		||||
  TestPartResultArray results;
 | 
			
		||||
  results.Append(r1_);
 | 
			
		||||
  EXPECT_EQ(1, results.size());
 | 
			
		||||
  EXPECT_STREQ("Failure 1", results.GetTestPartResult(0).message());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that TestPartResultArray contains the given TestPartResults
 | 
			
		||||
// after two Append() operations.
 | 
			
		||||
TEST_F(TestPartResultArrayTest, ContainsGivenResultsAfterTwoAppends) {
 | 
			
		||||
  TestPartResultArray results;
 | 
			
		||||
  results.Append(r1_);
 | 
			
		||||
  results.Append(r2_);
 | 
			
		||||
  EXPECT_EQ(2, results.size());
 | 
			
		||||
  EXPECT_STREQ("Failure 1", results.GetTestPartResult(0).message());
 | 
			
		||||
  EXPECT_STREQ("Failure 2", results.GetTestPartResult(1).message());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef TestPartResultArrayTest TestPartResultArrayDeathTest;
 | 
			
		||||
 | 
			
		||||
// Tests that the program dies when GetTestPartResult() is called with
 | 
			
		||||
// an invalid index.
 | 
			
		||||
TEST_F(TestPartResultArrayDeathTest, DiesWhenIndexIsOutOfBound) {
 | 
			
		||||
  TestPartResultArray results;
 | 
			
		||||
  results.Append(r1_);
 | 
			
		||||
 | 
			
		||||
  EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(-1), "");
 | 
			
		||||
  EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(1), "");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO(mheule@google.com): Add a test for the class HasNewFatalFailureHelper.
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
| 
						 | 
				
			
			@ -1,320 +0,0 @@
 | 
			
		|||
// Copyright 2007, 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 "gtest/internal/gtest-tuple.h"
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
using ::std::tr1::get;
 | 
			
		||||
using ::std::tr1::make_tuple;
 | 
			
		||||
using ::std::tr1::tuple;
 | 
			
		||||
using ::std::tr1::tuple_element;
 | 
			
		||||
using ::std::tr1::tuple_size;
 | 
			
		||||
using ::testing::StaticAssertTypeEq;
 | 
			
		||||
 | 
			
		||||
// Tests that tuple_element<K, tuple<T0, T1, ..., TN> >::type returns TK.
 | 
			
		||||
TEST(tuple_element_Test, ReturnsElementType) {
 | 
			
		||||
  StaticAssertTypeEq<int, tuple_element<0, tuple<int, char> >::type>();
 | 
			
		||||
  StaticAssertTypeEq<int&, tuple_element<1, tuple<double, int&> >::type>();
 | 
			
		||||
  StaticAssertTypeEq<bool, tuple_element<2, tuple<double, int, bool> >::type>();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that tuple_size<T>::value gives the number of fields in tuple
 | 
			
		||||
// type T.
 | 
			
		||||
TEST(tuple_size_Test, ReturnsNumberOfFields) {
 | 
			
		||||
  EXPECT_EQ(0, +tuple_size<tuple<> >::value);
 | 
			
		||||
  EXPECT_EQ(1, +tuple_size<tuple<void*> >::value);
 | 
			
		||||
  EXPECT_EQ(1, +tuple_size<tuple<char> >::value);
 | 
			
		||||
  EXPECT_EQ(1, +(tuple_size<tuple<tuple<int, double> > >::value));
 | 
			
		||||
  EXPECT_EQ(2, +(tuple_size<tuple<int&, const char> >::value));
 | 
			
		||||
  EXPECT_EQ(3, +(tuple_size<tuple<char*, void, const bool&> >::value));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests comparing a tuple with itself.
 | 
			
		||||
TEST(ComparisonTest, ComparesWithSelf) {
 | 
			
		||||
  const tuple<int, char, bool> a(5, 'a', false);
 | 
			
		||||
 | 
			
		||||
  EXPECT_TRUE(a == a);
 | 
			
		||||
  EXPECT_FALSE(a != a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests comparing two tuples with the same value.
 | 
			
		||||
TEST(ComparisonTest, ComparesEqualTuples) {
 | 
			
		||||
  const tuple<int, bool> a(5, true), b(5, true);
 | 
			
		||||
 | 
			
		||||
  EXPECT_TRUE(a == b);
 | 
			
		||||
  EXPECT_FALSE(a != b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests comparing two different tuples that have no reference fields.
 | 
			
		||||
TEST(ComparisonTest, ComparesUnequalTuplesWithoutReferenceFields) {
 | 
			
		||||
  typedef tuple<const int, char> FooTuple;
 | 
			
		||||
 | 
			
		||||
  const FooTuple a(0, 'x');
 | 
			
		||||
  const FooTuple b(1, 'a');
 | 
			
		||||
 | 
			
		||||
  EXPECT_TRUE(a != b);
 | 
			
		||||
  EXPECT_FALSE(a == b);
 | 
			
		||||
 | 
			
		||||
  const FooTuple c(1, 'b');
 | 
			
		||||
 | 
			
		||||
  EXPECT_TRUE(b != c);
 | 
			
		||||
  EXPECT_FALSE(b == c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests comparing two different tuples that have reference fields.
 | 
			
		||||
TEST(ComparisonTest, ComparesUnequalTuplesWithReferenceFields) {
 | 
			
		||||
  typedef tuple<int&, const char&> FooTuple;
 | 
			
		||||
 | 
			
		||||
  int i = 5;
 | 
			
		||||
  const char ch = 'a';
 | 
			
		||||
  const FooTuple a(i, ch);
 | 
			
		||||
 | 
			
		||||
  int j = 6;
 | 
			
		||||
  const FooTuple b(j, ch);
 | 
			
		||||
 | 
			
		||||
  EXPECT_TRUE(a != b);
 | 
			
		||||
  EXPECT_FALSE(a == b);
 | 
			
		||||
 | 
			
		||||
  j = 5;
 | 
			
		||||
  const char ch2 = 'b';
 | 
			
		||||
  const FooTuple c(j, ch2);
 | 
			
		||||
 | 
			
		||||
  EXPECT_TRUE(b != c);
 | 
			
		||||
  EXPECT_FALSE(b == c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that a tuple field with a reference type is an alias of the
 | 
			
		||||
// variable it's supposed to reference.
 | 
			
		||||
TEST(ReferenceFieldTest, IsAliasOfReferencedVariable) {
 | 
			
		||||
  int n = 0;
 | 
			
		||||
  tuple<bool, int&> t(true, n);
 | 
			
		||||
 | 
			
		||||
  n = 1;
 | 
			
		||||
  EXPECT_EQ(n, get<1>(t))
 | 
			
		||||
      << "Changing a underlying variable should update the reference field.";
 | 
			
		||||
 | 
			
		||||
  // Makes sure that the implementation doesn't do anything funny with
 | 
			
		||||
  // the & operator for the return type of get<>().
 | 
			
		||||
  EXPECT_EQ(&n, &(get<1>(t)))
 | 
			
		||||
      << "The address of a reference field should equal the address of "
 | 
			
		||||
      << "the underlying variable.";
 | 
			
		||||
 | 
			
		||||
  get<1>(t) = 2;
 | 
			
		||||
  EXPECT_EQ(2, n)
 | 
			
		||||
      << "Changing a reference field should update the underlying variable.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that tuple's default constructor default initializes each field.
 | 
			
		||||
// This test needs to compile without generating warnings.
 | 
			
		||||
TEST(TupleConstructorTest, DefaultConstructorDefaultInitializesEachField) {
 | 
			
		||||
  // The TR1 report requires that tuple's default constructor default
 | 
			
		||||
  // initializes each field, even if it's a primitive type.  If the
 | 
			
		||||
  // implementation forgets to do this, this test will catch it by
 | 
			
		||||
  // generating warnings about using uninitialized variables (assuming
 | 
			
		||||
  // a decent compiler).
 | 
			
		||||
 | 
			
		||||
  tuple<> empty;
 | 
			
		||||
 | 
			
		||||
  tuple<int> a1, b1;
 | 
			
		||||
  b1 = a1;
 | 
			
		||||
  EXPECT_EQ(0, get<0>(b1));
 | 
			
		||||
 | 
			
		||||
  tuple<int, double> a2, b2;
 | 
			
		||||
  b2 = a2;
 | 
			
		||||
  EXPECT_EQ(0, get<0>(b2));
 | 
			
		||||
  EXPECT_EQ(0.0, get<1>(b2));
 | 
			
		||||
 | 
			
		||||
  tuple<double, char, bool*> a3, b3;
 | 
			
		||||
  b3 = a3;
 | 
			
		||||
  EXPECT_EQ(0.0, get<0>(b3));
 | 
			
		||||
  EXPECT_EQ('\0', get<1>(b3));
 | 
			
		||||
  EXPECT_TRUE(get<2>(b3) == NULL);
 | 
			
		||||
 | 
			
		||||
  tuple<int, int, int, int, int, int, int, int, int, int> a10, b10;
 | 
			
		||||
  b10 = a10;
 | 
			
		||||
  EXPECT_EQ(0, get<0>(b10));
 | 
			
		||||
  EXPECT_EQ(0, get<1>(b10));
 | 
			
		||||
  EXPECT_EQ(0, get<2>(b10));
 | 
			
		||||
  EXPECT_EQ(0, get<3>(b10));
 | 
			
		||||
  EXPECT_EQ(0, get<4>(b10));
 | 
			
		||||
  EXPECT_EQ(0, get<5>(b10));
 | 
			
		||||
  EXPECT_EQ(0, get<6>(b10));
 | 
			
		||||
  EXPECT_EQ(0, get<7>(b10));
 | 
			
		||||
  EXPECT_EQ(0, get<8>(b10));
 | 
			
		||||
  EXPECT_EQ(0, get<9>(b10));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests constructing a tuple from its fields.
 | 
			
		||||
TEST(TupleConstructorTest, ConstructsFromFields) {
 | 
			
		||||
  int n = 1;
 | 
			
		||||
  // Reference field.
 | 
			
		||||
  tuple<int&> a(n);
 | 
			
		||||
  EXPECT_EQ(&n, &(get<0>(a)));
 | 
			
		||||
 | 
			
		||||
  // Non-reference fields.
 | 
			
		||||
  tuple<int, char> b(5, 'a');
 | 
			
		||||
  EXPECT_EQ(5, get<0>(b));
 | 
			
		||||
  EXPECT_EQ('a', get<1>(b));
 | 
			
		||||
 | 
			
		||||
  // Const reference field.
 | 
			
		||||
  const int m = 2;
 | 
			
		||||
  tuple<bool, const int&> c(true, m);
 | 
			
		||||
  EXPECT_TRUE(get<0>(c));
 | 
			
		||||
  EXPECT_EQ(&m, &(get<1>(c)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests tuple's copy constructor.
 | 
			
		||||
TEST(TupleConstructorTest, CopyConstructor) {
 | 
			
		||||
  tuple<double, bool> a(0.0, true);
 | 
			
		||||
  tuple<double, bool> b(a);
 | 
			
		||||
 | 
			
		||||
  EXPECT_DOUBLE_EQ(0.0, get<0>(b));
 | 
			
		||||
  EXPECT_TRUE(get<1>(b));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests constructing a tuple from another tuple that has a compatible
 | 
			
		||||
// but different type.
 | 
			
		||||
TEST(TupleConstructorTest, ConstructsFromDifferentTupleType) {
 | 
			
		||||
  tuple<int, int, char> a(0, 1, 'a');
 | 
			
		||||
  tuple<double, long, int> b(a);
 | 
			
		||||
 | 
			
		||||
  EXPECT_DOUBLE_EQ(0.0, get<0>(b));
 | 
			
		||||
  EXPECT_EQ(1, get<1>(b));
 | 
			
		||||
  EXPECT_EQ('a', get<2>(b));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests constructing a 2-tuple from an std::pair.
 | 
			
		||||
TEST(TupleConstructorTest, ConstructsFromPair) {
 | 
			
		||||
  ::std::pair<int, char> a(1, 'a');
 | 
			
		||||
  tuple<int, char> b(a);
 | 
			
		||||
  tuple<int, const char&> c(a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests assigning a tuple to another tuple with the same type.
 | 
			
		||||
TEST(TupleAssignmentTest, AssignsToSameTupleType) {
 | 
			
		||||
  const tuple<int, long> a(5, 7L);
 | 
			
		||||
  tuple<int, long> b;
 | 
			
		||||
  b = a;
 | 
			
		||||
  EXPECT_EQ(5, get<0>(b));
 | 
			
		||||
  EXPECT_EQ(7L, get<1>(b));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests assigning a tuple to another tuple with a different but
 | 
			
		||||
// compatible type.
 | 
			
		||||
TEST(TupleAssignmentTest, AssignsToDifferentTupleType) {
 | 
			
		||||
  const tuple<int, long, bool> a(1, 7L, true);
 | 
			
		||||
  tuple<long, int, bool> b;
 | 
			
		||||
  b = a;
 | 
			
		||||
  EXPECT_EQ(1L, get<0>(b));
 | 
			
		||||
  EXPECT_EQ(7, get<1>(b));
 | 
			
		||||
  EXPECT_TRUE(get<2>(b));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests assigning an std::pair to a 2-tuple.
 | 
			
		||||
TEST(TupleAssignmentTest, AssignsFromPair) {
 | 
			
		||||
  const ::std::pair<int, bool> a(5, true);
 | 
			
		||||
  tuple<int, bool> b;
 | 
			
		||||
  b = a;
 | 
			
		||||
  EXPECT_EQ(5, get<0>(b));
 | 
			
		||||
  EXPECT_TRUE(get<1>(b));
 | 
			
		||||
 | 
			
		||||
  tuple<long, bool> c;
 | 
			
		||||
  c = a;
 | 
			
		||||
  EXPECT_EQ(5L, get<0>(c));
 | 
			
		||||
  EXPECT_TRUE(get<1>(c));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A fixture for testing big tuples.
 | 
			
		||||
class BigTupleTest : public testing::Test {
 | 
			
		||||
 protected:
 | 
			
		||||
  typedef tuple<int, int, int, int, int, int, int, int, int, int> BigTuple;
 | 
			
		||||
 | 
			
		||||
  BigTupleTest() :
 | 
			
		||||
      a_(1, 0, 0, 0, 0, 0, 0, 0, 0, 2),
 | 
			
		||||
      b_(1, 0, 0, 0, 0, 0, 0, 0, 0, 3) {}
 | 
			
		||||
 | 
			
		||||
  BigTuple a_, b_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Tests constructing big tuples.
 | 
			
		||||
TEST_F(BigTupleTest, Construction) {
 | 
			
		||||
  BigTuple a;
 | 
			
		||||
  BigTuple b(b_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that get<N>(t) returns the N-th (0-based) field of tuple t.
 | 
			
		||||
TEST_F(BigTupleTest, get) {
 | 
			
		||||
  EXPECT_EQ(1, get<0>(a_));
 | 
			
		||||
  EXPECT_EQ(2, get<9>(a_));
 | 
			
		||||
 | 
			
		||||
  // Tests that get() works on a const tuple too.
 | 
			
		||||
  const BigTuple a(a_);
 | 
			
		||||
  EXPECT_EQ(1, get<0>(a));
 | 
			
		||||
  EXPECT_EQ(2, get<9>(a));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests comparing big tuples.
 | 
			
		||||
TEST_F(BigTupleTest, Comparisons) {
 | 
			
		||||
  EXPECT_TRUE(a_ == a_);
 | 
			
		||||
  EXPECT_FALSE(a_ != a_);
 | 
			
		||||
 | 
			
		||||
  EXPECT_TRUE(a_ != b_);
 | 
			
		||||
  EXPECT_FALSE(a_ == b_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(MakeTupleTest, WorksForScalarTypes) {
 | 
			
		||||
  tuple<bool, int> a;
 | 
			
		||||
  a = make_tuple(true, 5);
 | 
			
		||||
  EXPECT_TRUE(get<0>(a));
 | 
			
		||||
  EXPECT_EQ(5, get<1>(a));
 | 
			
		||||
 | 
			
		||||
  tuple<char, int, long> b;
 | 
			
		||||
  b = make_tuple('a', 'b', 5);
 | 
			
		||||
  EXPECT_EQ('a', get<0>(b));
 | 
			
		||||
  EXPECT_EQ('b', get<1>(b));
 | 
			
		||||
  EXPECT_EQ(5, get<2>(b));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(MakeTupleTest, WorksForPointers) {
 | 
			
		||||
  int a[] = { 1, 2, 3, 4 };
 | 
			
		||||
  const char* const str = "hi";
 | 
			
		||||
  int* const p = a;
 | 
			
		||||
 | 
			
		||||
  tuple<const char*, int*> t;
 | 
			
		||||
  t = make_tuple(str, p);
 | 
			
		||||
  EXPECT_EQ(str, get<0>(t));
 | 
			
		||||
  EXPECT_EQ(p, get<1>(t));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
| 
						 | 
				
			
			@ -1,45 +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 <vector>
 | 
			
		||||
 | 
			
		||||
#include "test/gtest-typed-test_test.h"
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST_P
 | 
			
		||||
 | 
			
		||||
// Tests that the same type-parameterized test case can be
 | 
			
		||||
// instantiated in different translation units linked together.
 | 
			
		||||
// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)
 | 
			
		||||
INSTANTIATE_TYPED_TEST_CASE_P(Vector, ContainerTest,
 | 
			
		||||
                              testing::Types<std::vector<int> >);
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST_P
 | 
			
		||||
| 
						 | 
				
			
			@ -1,360 +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 <set>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include "test/gtest-typed-test_test.h"
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
using testing::Test;
 | 
			
		||||
 | 
			
		||||
// Used for testing that SetUpTestCase()/TearDownTestCase(), fixture
 | 
			
		||||
// ctor/dtor, and SetUp()/TearDown() work correctly in typed tests and
 | 
			
		||||
// type-parameterized test.
 | 
			
		||||
template <typename T>
 | 
			
		||||
class CommonTest : public Test {
 | 
			
		||||
  // For some technical reason, SetUpTestCase() and TearDownTestCase()
 | 
			
		||||
  // must be public.
 | 
			
		||||
 public:
 | 
			
		||||
  static void SetUpTestCase() {
 | 
			
		||||
    shared_ = new T(5);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static void TearDownTestCase() {
 | 
			
		||||
    delete shared_;
 | 
			
		||||
    shared_ = NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // This 'protected:' is optional.  There's no harm in making all
 | 
			
		||||
  // members of this fixture class template public.
 | 
			
		||||
 protected:
 | 
			
		||||
  // We used to use std::list here, but switched to std::vector since
 | 
			
		||||
  // MSVC's <list> doesn't compile cleanly with /W4.
 | 
			
		||||
  typedef std::vector<T> Vector;
 | 
			
		||||
  typedef std::set<int> IntSet;
 | 
			
		||||
 | 
			
		||||
  CommonTest() : value_(1) {}
 | 
			
		||||
 | 
			
		||||
  virtual ~CommonTest() { EXPECT_EQ(3, value_); }
 | 
			
		||||
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    EXPECT_EQ(1, value_);
 | 
			
		||||
    value_++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    EXPECT_EQ(2, value_);
 | 
			
		||||
    value_++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  T value_;
 | 
			
		||||
  static T* shared_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
T* CommonTest<T>::shared_ = NULL;
 | 
			
		||||
 | 
			
		||||
// This #ifdef block tests typed tests.
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST
 | 
			
		||||
 | 
			
		||||
using testing::Types;
 | 
			
		||||
 | 
			
		||||
// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,
 | 
			
		||||
// and SetUp()/TearDown() work correctly in typed tests
 | 
			
		||||
 | 
			
		||||
typedef Types<char, int> TwoTypes;
 | 
			
		||||
TYPED_TEST_CASE(CommonTest, TwoTypes);
 | 
			
		||||
 | 
			
		||||
TYPED_TEST(CommonTest, ValuesAreCorrect) {
 | 
			
		||||
  // Static members of the fixture class template can be visited via
 | 
			
		||||
  // the TestFixture:: prefix.
 | 
			
		||||
  EXPECT_EQ(5, *TestFixture::shared_);
 | 
			
		||||
 | 
			
		||||
  // Typedefs in the fixture class template can be visited via the
 | 
			
		||||
  // "typename TestFixture::" prefix.
 | 
			
		||||
  typename TestFixture::Vector empty;
 | 
			
		||||
  EXPECT_EQ(0U, empty.size());
 | 
			
		||||
 | 
			
		||||
  typename TestFixture::IntSet empty2;
 | 
			
		||||
  EXPECT_EQ(0U, empty2.size());
 | 
			
		||||
 | 
			
		||||
  // Non-static members of the fixture class must be visited via
 | 
			
		||||
  // 'this', as required by C++ for class templates.
 | 
			
		||||
  EXPECT_EQ(2, this->value_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The second test makes sure shared_ is not deleted after the first
 | 
			
		||||
// test.
 | 
			
		||||
TYPED_TEST(CommonTest, ValuesAreStillCorrect) {
 | 
			
		||||
  // Static members of the fixture class template can also be visited
 | 
			
		||||
  // via 'this'.
 | 
			
		||||
  ASSERT_TRUE(this->shared_ != NULL);
 | 
			
		||||
  EXPECT_EQ(5, *this->shared_);
 | 
			
		||||
 | 
			
		||||
  // TypeParam can be used to refer to the type parameter.
 | 
			
		||||
  EXPECT_EQ(static_cast<TypeParam>(2), this->value_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that multiple TYPED_TEST_CASE's can be defined in the same
 | 
			
		||||
// translation unit.
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class TypedTest1 : public Test {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Verifies that the second argument of TYPED_TEST_CASE can be a
 | 
			
		||||
// single type.
 | 
			
		||||
TYPED_TEST_CASE(TypedTest1, int);
 | 
			
		||||
TYPED_TEST(TypedTest1, A) {}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class TypedTest2 : public Test {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Verifies that the second argument of TYPED_TEST_CASE can be a
 | 
			
		||||
// Types<...> type list.
 | 
			
		||||
TYPED_TEST_CASE(TypedTest2, Types<int>);
 | 
			
		||||
 | 
			
		||||
// This also verifies that tests from different typed test cases can
 | 
			
		||||
// share the same name.
 | 
			
		||||
TYPED_TEST(TypedTest2, A) {}
 | 
			
		||||
 | 
			
		||||
// Tests that a typed test case can be defined in a namespace.
 | 
			
		||||
 | 
			
		||||
namespace library1 {
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class NumericTest : public Test {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef Types<int, long> NumericTypes;
 | 
			
		||||
TYPED_TEST_CASE(NumericTest, NumericTypes);
 | 
			
		||||
 | 
			
		||||
TYPED_TEST(NumericTest, DefaultIsZero) {
 | 
			
		||||
  EXPECT_EQ(0, TypeParam());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace library1
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST
 | 
			
		||||
 | 
			
		||||
// This #ifdef block tests type-parameterized tests.
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST_P
 | 
			
		||||
 | 
			
		||||
using testing::Types;
 | 
			
		||||
using testing::internal::TypedTestCasePState;
 | 
			
		||||
 | 
			
		||||
// Tests TypedTestCasePState.
 | 
			
		||||
 | 
			
		||||
class TypedTestCasePStateTest : public Test {
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    state_.AddTestName("foo.cc", 0, "FooTest", "A");
 | 
			
		||||
    state_.AddTestName("foo.cc", 0, "FooTest", "B");
 | 
			
		||||
    state_.AddTestName("foo.cc", 0, "FooTest", "C");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  TypedTestCasePState state_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(TypedTestCasePStateTest, SucceedsForMatchingList) {
 | 
			
		||||
  const char* tests = "A, B, C";
 | 
			
		||||
  EXPECT_EQ(tests,
 | 
			
		||||
            state_.VerifyRegisteredTestNames("foo.cc", 1, tests));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Makes sure that the order of the tests and spaces around the names
 | 
			
		||||
// don't matter.
 | 
			
		||||
TEST_F(TypedTestCasePStateTest, IgnoresOrderAndSpaces) {
 | 
			
		||||
  const char* tests = "A,C,   B";
 | 
			
		||||
  EXPECT_EQ(tests,
 | 
			
		||||
            state_.VerifyRegisteredTestNames("foo.cc", 1, tests));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef TypedTestCasePStateTest TypedTestCasePStateDeathTest;
 | 
			
		||||
 | 
			
		||||
TEST_F(TypedTestCasePStateDeathTest, DetectsDuplicates) {
 | 
			
		||||
  EXPECT_DEATH_IF_SUPPORTED(
 | 
			
		||||
      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, A, C"),
 | 
			
		||||
      "foo\\.cc.1.?: Test A is listed more than once\\.");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(TypedTestCasePStateDeathTest, DetectsExtraTest) {
 | 
			
		||||
  EXPECT_DEATH_IF_SUPPORTED(
 | 
			
		||||
      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C, D"),
 | 
			
		||||
      "foo\\.cc.1.?: No test named D can be found in this test case\\.");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(TypedTestCasePStateDeathTest, DetectsMissedTest) {
 | 
			
		||||
  EXPECT_DEATH_IF_SUPPORTED(
 | 
			
		||||
      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, C"),
 | 
			
		||||
      "foo\\.cc.1.?: You forgot to list test B\\.");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that defining a test for a parameterized test case generates
 | 
			
		||||
// a run-time error if the test case has been registered.
 | 
			
		||||
TEST_F(TypedTestCasePStateDeathTest, DetectsTestAfterRegistration) {
 | 
			
		||||
  state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C");
 | 
			
		||||
  EXPECT_DEATH_IF_SUPPORTED(
 | 
			
		||||
      state_.AddTestName("foo.cc", 2, "FooTest", "D"),
 | 
			
		||||
      "foo\\.cc.2.?: Test D must be defined before REGISTER_TYPED_TEST_CASE_P"
 | 
			
		||||
      "\\(FooTest, \\.\\.\\.\\)\\.");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,
 | 
			
		||||
// and SetUp()/TearDown() work correctly in type-parameterized tests.
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class DerivedTest : public CommonTest<T> {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_CASE_P(DerivedTest);
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_P(DerivedTest, ValuesAreCorrect) {
 | 
			
		||||
  // Static members of the fixture class template can be visited via
 | 
			
		||||
  // the TestFixture:: prefix.
 | 
			
		||||
  EXPECT_EQ(5, *TestFixture::shared_);
 | 
			
		||||
 | 
			
		||||
  // Non-static members of the fixture class must be visited via
 | 
			
		||||
  // 'this', as required by C++ for class templates.
 | 
			
		||||
  EXPECT_EQ(2, this->value_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The second test makes sure shared_ is not deleted after the first
 | 
			
		||||
// test.
 | 
			
		||||
TYPED_TEST_P(DerivedTest, ValuesAreStillCorrect) {
 | 
			
		||||
  // Static members of the fixture class template can also be visited
 | 
			
		||||
  // via 'this'.
 | 
			
		||||
  ASSERT_TRUE(this->shared_ != NULL);
 | 
			
		||||
  EXPECT_EQ(5, *this->shared_);
 | 
			
		||||
  EXPECT_EQ(2, this->value_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
REGISTER_TYPED_TEST_CASE_P(DerivedTest,
 | 
			
		||||
                           ValuesAreCorrect, ValuesAreStillCorrect);
 | 
			
		||||
 | 
			
		||||
typedef Types<short, long> MyTwoTypes;
 | 
			
		||||
INSTANTIATE_TYPED_TEST_CASE_P(My, DerivedTest, MyTwoTypes);
 | 
			
		||||
 | 
			
		||||
// Tests that multiple TYPED_TEST_CASE_P's can be defined in the same
 | 
			
		||||
// translation unit.
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class TypedTestP1 : public Test {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_CASE_P(TypedTestP1);
 | 
			
		||||
 | 
			
		||||
// For testing that the code between TYPED_TEST_CASE_P() and
 | 
			
		||||
// TYPED_TEST_P() is not enclosed in a namespace.
 | 
			
		||||
typedef int IntAfterTypedTestCaseP;
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_P(TypedTestP1, A) {}
 | 
			
		||||
TYPED_TEST_P(TypedTestP1, B) {}
 | 
			
		||||
 | 
			
		||||
// For testing that the code between TYPED_TEST_P() and
 | 
			
		||||
// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.
 | 
			
		||||
typedef int IntBeforeRegisterTypedTestCaseP;
 | 
			
		||||
 | 
			
		||||
REGISTER_TYPED_TEST_CASE_P(TypedTestP1, A, B);
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class TypedTestP2 : public Test {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_CASE_P(TypedTestP2);
 | 
			
		||||
 | 
			
		||||
// This also verifies that tests from different type-parameterized
 | 
			
		||||
// test cases can share the same name.
 | 
			
		||||
TYPED_TEST_P(TypedTestP2, A) {}
 | 
			
		||||
 | 
			
		||||
REGISTER_TYPED_TEST_CASE_P(TypedTestP2, A);
 | 
			
		||||
 | 
			
		||||
// Verifies that the code between TYPED_TEST_CASE_P() and
 | 
			
		||||
// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.
 | 
			
		||||
IntAfterTypedTestCaseP after = 0;
 | 
			
		||||
IntBeforeRegisterTypedTestCaseP before = 0;
 | 
			
		||||
 | 
			
		||||
// Verifies that the last argument of INSTANTIATE_TYPED_TEST_CASE_P()
 | 
			
		||||
// can be either a single type or a Types<...> type list.
 | 
			
		||||
INSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP1, int);
 | 
			
		||||
INSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP2, Types<int>);
 | 
			
		||||
 | 
			
		||||
// Tests that the same type-parameterized test case can be
 | 
			
		||||
// instantiated more than once in the same translation unit.
 | 
			
		||||
INSTANTIATE_TYPED_TEST_CASE_P(Double, TypedTestP2, Types<double>);
 | 
			
		||||
 | 
			
		||||
// Tests that the same type-parameterized test case can be
 | 
			
		||||
// instantiated in different translation units linked together.
 | 
			
		||||
// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)
 | 
			
		||||
typedef Types<std::vector<double>, std::set<char> > MyContainers;
 | 
			
		||||
INSTANTIATE_TYPED_TEST_CASE_P(My, ContainerTest, MyContainers);
 | 
			
		||||
 | 
			
		||||
// Tests that a type-parameterized test case can be defined and
 | 
			
		||||
// instantiated in a namespace.
 | 
			
		||||
 | 
			
		||||
namespace library2 {
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class NumericTest : public Test {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_CASE_P(NumericTest);
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_P(NumericTest, DefaultIsZero) {
 | 
			
		||||
  EXPECT_EQ(0, TypeParam());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_P(NumericTest, ZeroIsLessThanOne) {
 | 
			
		||||
  EXPECT_LT(TypeParam(0), TypeParam(1));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
REGISTER_TYPED_TEST_CASE_P(NumericTest,
 | 
			
		||||
                           DefaultIsZero, ZeroIsLessThanOne);
 | 
			
		||||
typedef Types<int, double> NumericTypes;
 | 
			
		||||
INSTANTIATE_TYPED_TEST_CASE_P(My, NumericTest, NumericTypes);
 | 
			
		||||
 | 
			
		||||
}  // namespace library2
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST_P
 | 
			
		||||
 | 
			
		||||
#if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)
 | 
			
		||||
 | 
			
		||||
// Google Test may not support type-parameterized tests with some
 | 
			
		||||
// compilers. If we use conditional compilation to compile out all
 | 
			
		||||
// code referring to the gtest_main library, MSVC linker will not link
 | 
			
		||||
// that library at all and consequently complain about missing entry
 | 
			
		||||
// point defined in that library (fatal error LNK1561: entry point
 | 
			
		||||
// must be defined). This dummy test keeps gtest_main linked in.
 | 
			
		||||
TEST(DummyTest, TypedTestsAreNotSupportedOnThisPlatform) {}
 | 
			
		||||
 | 
			
		||||
#endif  // #if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)
 | 
			
		||||
| 
						 | 
				
			
			@ -1,66 +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)
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
 | 
			
		||||
#define GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST_P
 | 
			
		||||
 | 
			
		||||
using testing::Test;
 | 
			
		||||
 | 
			
		||||
// For testing that the same type-parameterized test case can be
 | 
			
		||||
// instantiated in different translation units linked together.
 | 
			
		||||
// ContainerTest will be instantiated in both gtest-typed-test_test.cc
 | 
			
		||||
// and gtest-typed-test2_test.cc.
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class ContainerTest : public Test {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_CASE_P(ContainerTest);
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_P(ContainerTest, CanBeDefaultConstructed) {
 | 
			
		||||
  TypeParam container;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_P(ContainerTest, InitialSizeIsZero) {
 | 
			
		||||
  TypeParam container;
 | 
			
		||||
  EXPECT_EQ(0U, container.size());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
REGISTER_TYPED_TEST_CASE_P(ContainerTest,
 | 
			
		||||
                           CanBeDefaultConstructed, InitialSizeIsZero);
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST_P
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
 | 
			
		||||
| 
						 | 
				
			
			@ -1,341 +0,0 @@
 | 
			
		|||
// 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.
 | 
			
		||||
//
 | 
			
		||||
// Author: vladl@google.com (Vlad Losev)
 | 
			
		||||
//
 | 
			
		||||
// The Google C++ Testing Framework (Google Test)
 | 
			
		||||
//
 | 
			
		||||
// This file contains tests verifying correctness of data provided via
 | 
			
		||||
// UnitTest's public methods.
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#include <string.h>  // For strcmp.
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
 | 
			
		||||
using ::testing::InitGoogleTest;
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
struct LessByName {
 | 
			
		||||
  bool operator()(const T* a, const T* b) {
 | 
			
		||||
    return strcmp(a->name(), b->name()) < 0;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class UnitTestHelper {
 | 
			
		||||
 public:
 | 
			
		||||
  // Returns the array of pointers to all test cases sorted by the test case
 | 
			
		||||
  // name.  The caller is responsible for deleting the array.
 | 
			
		||||
  static TestCase const** const GetSortedTestCases() {
 | 
			
		||||
    UnitTest& unit_test = *UnitTest::GetInstance();
 | 
			
		||||
    TestCase const** const test_cases =
 | 
			
		||||
        new const TestCase*[unit_test.total_test_case_count()];
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < unit_test.total_test_case_count(); ++i)
 | 
			
		||||
      test_cases[i] = unit_test.GetTestCase(i);
 | 
			
		||||
 | 
			
		||||
    std::sort(test_cases,
 | 
			
		||||
              test_cases + unit_test.total_test_case_count(),
 | 
			
		||||
              LessByName<TestCase>());
 | 
			
		||||
    return test_cases;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Returns the test case by its name.  The caller doesn't own the returned
 | 
			
		||||
  // pointer.
 | 
			
		||||
  static const TestCase* FindTestCase(const char* name) {
 | 
			
		||||
    UnitTest& unit_test = *UnitTest::GetInstance();
 | 
			
		||||
    for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
 | 
			
		||||
      const TestCase* test_case = unit_test.GetTestCase(i);
 | 
			
		||||
      if (0 == strcmp(test_case->name(), name))
 | 
			
		||||
        return test_case;
 | 
			
		||||
    }
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Returns the array of pointers to all tests in a particular test case
 | 
			
		||||
  // sorted by the test name.  The caller is responsible for deleting the
 | 
			
		||||
  // array.
 | 
			
		||||
  static TestInfo const** const GetSortedTests(const TestCase* test_case) {
 | 
			
		||||
    TestInfo const** const tests =
 | 
			
		||||
        new const TestInfo*[test_case->total_test_count()];
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < test_case->total_test_count(); ++i)
 | 
			
		||||
      tests[i] = test_case->GetTestInfo(i);
 | 
			
		||||
 | 
			
		||||
    std::sort(tests, tests + test_case->total_test_count(),
 | 
			
		||||
              LessByName<TestInfo>());
 | 
			
		||||
    return tests;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST
 | 
			
		||||
template <typename T> class TestCaseWithCommentTest : public Test {};
 | 
			
		||||
TYPED_TEST_CASE(TestCaseWithCommentTest, Types<int>);
 | 
			
		||||
TYPED_TEST(TestCaseWithCommentTest, Dummy) {}
 | 
			
		||||
 | 
			
		||||
const int kTypedTestCases = 1;
 | 
			
		||||
const int kTypedTests = 1;
 | 
			
		||||
#else
 | 
			
		||||
const int kTypedTestCases = 0;
 | 
			
		||||
const int kTypedTests = 0;
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST
 | 
			
		||||
 | 
			
		||||
// We can only test the accessors that do not change value while tests run.
 | 
			
		||||
// Since tests can be run in any order, the values the accessors that track
 | 
			
		||||
// test execution (such as failed_test_count) can not be predicted.
 | 
			
		||||
TEST(ApiTest, UnitTestImmutableAccessorsWork) {
 | 
			
		||||
  UnitTest* unit_test = UnitTest::GetInstance();
 | 
			
		||||
 | 
			
		||||
  ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());
 | 
			
		||||
  EXPECT_EQ(1 + kTypedTestCases, unit_test->test_case_to_run_count());
 | 
			
		||||
  EXPECT_EQ(2, unit_test->disabled_test_count());
 | 
			
		||||
  EXPECT_EQ(5 + kTypedTests, unit_test->total_test_count());
 | 
			
		||||
  EXPECT_EQ(3 + kTypedTests, unit_test->test_to_run_count());
 | 
			
		||||
 | 
			
		||||
  const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();
 | 
			
		||||
 | 
			
		||||
  EXPECT_STREQ("ApiTest", test_cases[0]->name());
 | 
			
		||||
  EXPECT_STREQ("DISABLED_Test", test_cases[1]->name());
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST
 | 
			
		||||
  EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name());
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST
 | 
			
		||||
 | 
			
		||||
  delete[] test_cases;
 | 
			
		||||
 | 
			
		||||
  // The following lines initiate actions to verify certain methods in
 | 
			
		||||
  // FinalSuccessChecker::TearDown.
 | 
			
		||||
 | 
			
		||||
  // Records a test property to verify TestResult::GetTestProperty().
 | 
			
		||||
  RecordProperty("key", "value");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AssertionResult IsNull(const char* str) {
 | 
			
		||||
  if (str != NULL) {
 | 
			
		||||
    return testing::AssertionFailure() << "argument is " << str;
 | 
			
		||||
  }
 | 
			
		||||
  return AssertionSuccess();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(ApiTest, TestCaseImmutableAccessorsWork) {
 | 
			
		||||
  const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest");
 | 
			
		||||
  ASSERT_TRUE(test_case != NULL);
 | 
			
		||||
 | 
			
		||||
  EXPECT_STREQ("ApiTest", test_case->name());
 | 
			
		||||
  EXPECT_TRUE(IsNull(test_case->type_param()));
 | 
			
		||||
  EXPECT_TRUE(test_case->should_run());
 | 
			
		||||
  EXPECT_EQ(1, test_case->disabled_test_count());
 | 
			
		||||
  EXPECT_EQ(3, test_case->test_to_run_count());
 | 
			
		||||
  ASSERT_EQ(4, test_case->total_test_count());
 | 
			
		||||
 | 
			
		||||
  const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);
 | 
			
		||||
 | 
			
		||||
  EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name());
 | 
			
		||||
  EXPECT_STREQ("ApiTest", tests[0]->test_case_name());
 | 
			
		||||
  EXPECT_TRUE(IsNull(tests[0]->value_param()));
 | 
			
		||||
  EXPECT_TRUE(IsNull(tests[0]->type_param()));
 | 
			
		||||
  EXPECT_FALSE(tests[0]->should_run());
 | 
			
		||||
 | 
			
		||||
  EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name());
 | 
			
		||||
  EXPECT_STREQ("ApiTest", tests[1]->test_case_name());
 | 
			
		||||
  EXPECT_TRUE(IsNull(tests[1]->value_param()));
 | 
			
		||||
  EXPECT_TRUE(IsNull(tests[1]->type_param()));
 | 
			
		||||
  EXPECT_TRUE(tests[1]->should_run());
 | 
			
		||||
 | 
			
		||||
  EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name());
 | 
			
		||||
  EXPECT_STREQ("ApiTest", tests[2]->test_case_name());
 | 
			
		||||
  EXPECT_TRUE(IsNull(tests[2]->value_param()));
 | 
			
		||||
  EXPECT_TRUE(IsNull(tests[2]->type_param()));
 | 
			
		||||
  EXPECT_TRUE(tests[2]->should_run());
 | 
			
		||||
 | 
			
		||||
  EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name());
 | 
			
		||||
  EXPECT_STREQ("ApiTest", tests[3]->test_case_name());
 | 
			
		||||
  EXPECT_TRUE(IsNull(tests[3]->value_param()));
 | 
			
		||||
  EXPECT_TRUE(IsNull(tests[3]->type_param()));
 | 
			
		||||
  EXPECT_TRUE(tests[3]->should_run());
 | 
			
		||||
 | 
			
		||||
  delete[] tests;
 | 
			
		||||
  tests = NULL;
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST
 | 
			
		||||
  test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0");
 | 
			
		||||
  ASSERT_TRUE(test_case != NULL);
 | 
			
		||||
 | 
			
		||||
  EXPECT_STREQ("TestCaseWithCommentTest/0", test_case->name());
 | 
			
		||||
  EXPECT_STREQ(GetTypeName<int>().c_str(), test_case->type_param());
 | 
			
		||||
  EXPECT_TRUE(test_case->should_run());
 | 
			
		||||
  EXPECT_EQ(0, test_case->disabled_test_count());
 | 
			
		||||
  EXPECT_EQ(1, test_case->test_to_run_count());
 | 
			
		||||
  ASSERT_EQ(1, test_case->total_test_count());
 | 
			
		||||
 | 
			
		||||
  tests = UnitTestHelper::GetSortedTests(test_case);
 | 
			
		||||
 | 
			
		||||
  EXPECT_STREQ("Dummy", tests[0]->name());
 | 
			
		||||
  EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name());
 | 
			
		||||
  EXPECT_TRUE(IsNull(tests[0]->value_param()));
 | 
			
		||||
  EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());
 | 
			
		||||
  EXPECT_TRUE(tests[0]->should_run());
 | 
			
		||||
 | 
			
		||||
  delete[] tests;
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(ApiTest, TestCaseDisabledAccessorsWork) {
 | 
			
		||||
  const TestCase* test_case = UnitTestHelper::FindTestCase("DISABLED_Test");
 | 
			
		||||
  ASSERT_TRUE(test_case != NULL);
 | 
			
		||||
 | 
			
		||||
  EXPECT_STREQ("DISABLED_Test", test_case->name());
 | 
			
		||||
  EXPECT_TRUE(IsNull(test_case->type_param()));
 | 
			
		||||
  EXPECT_FALSE(test_case->should_run());
 | 
			
		||||
  EXPECT_EQ(1, test_case->disabled_test_count());
 | 
			
		||||
  EXPECT_EQ(0, test_case->test_to_run_count());
 | 
			
		||||
  ASSERT_EQ(1, test_case->total_test_count());
 | 
			
		||||
 | 
			
		||||
  const TestInfo* const test_info = test_case->GetTestInfo(0);
 | 
			
		||||
  EXPECT_STREQ("Dummy2", test_info->name());
 | 
			
		||||
  EXPECT_STREQ("DISABLED_Test", test_info->test_case_name());
 | 
			
		||||
  EXPECT_TRUE(IsNull(test_info->value_param()));
 | 
			
		||||
  EXPECT_TRUE(IsNull(test_info->type_param()));
 | 
			
		||||
  EXPECT_FALSE(test_info->should_run());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// These two tests are here to provide support for testing
 | 
			
		||||
// test_case_to_run_count, disabled_test_count, and test_to_run_count.
 | 
			
		||||
TEST(ApiTest, DISABLED_Dummy1) {}
 | 
			
		||||
TEST(DISABLED_Test, Dummy2) {}
 | 
			
		||||
 | 
			
		||||
class FinalSuccessChecker : public Environment {
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    UnitTest* unit_test = UnitTest::GetInstance();
 | 
			
		||||
 | 
			
		||||
    EXPECT_EQ(1 + kTypedTestCases, unit_test->successful_test_case_count());
 | 
			
		||||
    EXPECT_EQ(3 + kTypedTests, unit_test->successful_test_count());
 | 
			
		||||
    EXPECT_EQ(0, unit_test->failed_test_case_count());
 | 
			
		||||
    EXPECT_EQ(0, unit_test->failed_test_count());
 | 
			
		||||
    EXPECT_TRUE(unit_test->Passed());
 | 
			
		||||
    EXPECT_FALSE(unit_test->Failed());
 | 
			
		||||
    ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());
 | 
			
		||||
 | 
			
		||||
    const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();
 | 
			
		||||
 | 
			
		||||
    EXPECT_STREQ("ApiTest", test_cases[0]->name());
 | 
			
		||||
    EXPECT_TRUE(IsNull(test_cases[0]->type_param()));
 | 
			
		||||
    EXPECT_TRUE(test_cases[0]->should_run());
 | 
			
		||||
    EXPECT_EQ(1, test_cases[0]->disabled_test_count());
 | 
			
		||||
    ASSERT_EQ(4, test_cases[0]->total_test_count());
 | 
			
		||||
    EXPECT_EQ(3, test_cases[0]->successful_test_count());
 | 
			
		||||
    EXPECT_EQ(0, test_cases[0]->failed_test_count());
 | 
			
		||||
    EXPECT_TRUE(test_cases[0]->Passed());
 | 
			
		||||
    EXPECT_FALSE(test_cases[0]->Failed());
 | 
			
		||||
 | 
			
		||||
    EXPECT_STREQ("DISABLED_Test", test_cases[1]->name());
 | 
			
		||||
    EXPECT_TRUE(IsNull(test_cases[1]->type_param()));
 | 
			
		||||
    EXPECT_FALSE(test_cases[1]->should_run());
 | 
			
		||||
    EXPECT_EQ(1, test_cases[1]->disabled_test_count());
 | 
			
		||||
    ASSERT_EQ(1, test_cases[1]->total_test_count());
 | 
			
		||||
    EXPECT_EQ(0, test_cases[1]->successful_test_count());
 | 
			
		||||
    EXPECT_EQ(0, test_cases[1]->failed_test_count());
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST
 | 
			
		||||
    EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name());
 | 
			
		||||
    EXPECT_STREQ(GetTypeName<int>().c_str(), test_cases[2]->type_param());
 | 
			
		||||
    EXPECT_TRUE(test_cases[2]->should_run());
 | 
			
		||||
    EXPECT_EQ(0, test_cases[2]->disabled_test_count());
 | 
			
		||||
    ASSERT_EQ(1, test_cases[2]->total_test_count());
 | 
			
		||||
    EXPECT_EQ(1, test_cases[2]->successful_test_count());
 | 
			
		||||
    EXPECT_EQ(0, test_cases[2]->failed_test_count());
 | 
			
		||||
    EXPECT_TRUE(test_cases[2]->Passed());
 | 
			
		||||
    EXPECT_FALSE(test_cases[2]->Failed());
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST
 | 
			
		||||
 | 
			
		||||
    const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest");
 | 
			
		||||
    const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);
 | 
			
		||||
    EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name());
 | 
			
		||||
    EXPECT_STREQ("ApiTest", tests[0]->test_case_name());
 | 
			
		||||
    EXPECT_FALSE(tests[0]->should_run());
 | 
			
		||||
 | 
			
		||||
    EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name());
 | 
			
		||||
    EXPECT_STREQ("ApiTest", tests[1]->test_case_name());
 | 
			
		||||
    EXPECT_TRUE(IsNull(tests[1]->value_param()));
 | 
			
		||||
    EXPECT_TRUE(IsNull(tests[1]->type_param()));
 | 
			
		||||
    EXPECT_TRUE(tests[1]->should_run());
 | 
			
		||||
    EXPECT_TRUE(tests[1]->result()->Passed());
 | 
			
		||||
    EXPECT_EQ(0, tests[1]->result()->test_property_count());
 | 
			
		||||
 | 
			
		||||
    EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name());
 | 
			
		||||
    EXPECT_STREQ("ApiTest", tests[2]->test_case_name());
 | 
			
		||||
    EXPECT_TRUE(IsNull(tests[2]->value_param()));
 | 
			
		||||
    EXPECT_TRUE(IsNull(tests[2]->type_param()));
 | 
			
		||||
    EXPECT_TRUE(tests[2]->should_run());
 | 
			
		||||
    EXPECT_TRUE(tests[2]->result()->Passed());
 | 
			
		||||
    EXPECT_EQ(0, tests[2]->result()->test_property_count());
 | 
			
		||||
 | 
			
		||||
    EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name());
 | 
			
		||||
    EXPECT_STREQ("ApiTest", tests[3]->test_case_name());
 | 
			
		||||
    EXPECT_TRUE(IsNull(tests[3]->value_param()));
 | 
			
		||||
    EXPECT_TRUE(IsNull(tests[3]->type_param()));
 | 
			
		||||
    EXPECT_TRUE(tests[3]->should_run());
 | 
			
		||||
    EXPECT_TRUE(tests[3]->result()->Passed());
 | 
			
		||||
    EXPECT_EQ(1, tests[3]->result()->test_property_count());
 | 
			
		||||
    const TestProperty& property = tests[3]->result()->GetTestProperty(0);
 | 
			
		||||
    EXPECT_STREQ("key", property.key());
 | 
			
		||||
    EXPECT_STREQ("value", property.value());
 | 
			
		||||
 | 
			
		||||
    delete[] tests;
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST
 | 
			
		||||
    test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0");
 | 
			
		||||
    tests = UnitTestHelper::GetSortedTests(test_case);
 | 
			
		||||
 | 
			
		||||
    EXPECT_STREQ("Dummy", tests[0]->name());
 | 
			
		||||
    EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name());
 | 
			
		||||
    EXPECT_TRUE(IsNull(tests[0]->value_param()));
 | 
			
		||||
    EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());
 | 
			
		||||
    EXPECT_TRUE(tests[0]->should_run());
 | 
			
		||||
    EXPECT_TRUE(tests[0]->result()->Passed());
 | 
			
		||||
    EXPECT_EQ(0, tests[0]->result()->test_property_count());
 | 
			
		||||
 | 
			
		||||
    delete[] tests;
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST
 | 
			
		||||
    delete[] test_cases;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  AddGlobalTestEnvironment(new testing::internal::FinalSuccessChecker());
 | 
			
		||||
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,47 +0,0 @@
 | 
			
		|||
// 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.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
//
 | 
			
		||||
// Tests for Google C++ Testing Framework (Google Test)
 | 
			
		||||
//
 | 
			
		||||
// Sometimes it's desirable to build most of Google Test's own tests
 | 
			
		||||
// by compiling a single file.  This file serves this purpose.
 | 
			
		||||
#include "test/gtest-filepath_test.cc"
 | 
			
		||||
#include "test/gtest-linked_ptr_test.cc"
 | 
			
		||||
#include "test/gtest-message_test.cc"
 | 
			
		||||
#include "test/gtest-options_test.cc"
 | 
			
		||||
#include "test/gtest-port_test.cc"
 | 
			
		||||
#include "test/gtest_pred_impl_unittest.cc"
 | 
			
		||||
#include "test/gtest_prod_test.cc"
 | 
			
		||||
#include "test/gtest-test-part_test.cc"
 | 
			
		||||
#include "test/gtest-typed-test_test.cc"
 | 
			
		||||
#include "test/gtest-typed-test2_test.cc"
 | 
			
		||||
#include "test/gtest_unittest.cc"
 | 
			
		||||
#include "test/production.cc"
 | 
			
		||||
| 
						 | 
				
			
			@ -1,212 +0,0 @@
 | 
			
		|||
#!/usr/bin/env python
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
 | 
			
		||||
"""Unit test for Google Test's break-on-failure mode.
 | 
			
		||||
 | 
			
		||||
A user can ask Google Test to seg-fault when an assertion fails, using
 | 
			
		||||
either the GTEST_BREAK_ON_FAILURE environment variable or the
 | 
			
		||||
--gtest_break_on_failure flag.  This script tests such functionality
 | 
			
		||||
by invoking gtest_break_on_failure_unittest_ (a program written with
 | 
			
		||||
Google Test) with different environments and command line flags.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
__author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Constants.
 | 
			
		||||
 | 
			
		||||
IS_WINDOWS = os.name == 'nt'
 | 
			
		||||
 | 
			
		||||
# The environment variable for enabling/disabling the break-on-failure mode.
 | 
			
		||||
BREAK_ON_FAILURE_ENV_VAR = 'GTEST_BREAK_ON_FAILURE'
 | 
			
		||||
 | 
			
		||||
# The command line flag for enabling/disabling the break-on-failure mode.
 | 
			
		||||
BREAK_ON_FAILURE_FLAG = 'gtest_break_on_failure'
 | 
			
		||||
 | 
			
		||||
# The environment variable for enabling/disabling the throw-on-failure mode.
 | 
			
		||||
THROW_ON_FAILURE_ENV_VAR = 'GTEST_THROW_ON_FAILURE'
 | 
			
		||||
 | 
			
		||||
# The environment variable for enabling/disabling the catch-exceptions mode.
 | 
			
		||||
CATCH_EXCEPTIONS_ENV_VAR = 'GTEST_CATCH_EXCEPTIONS'
 | 
			
		||||
 | 
			
		||||
# Path to the gtest_break_on_failure_unittest_ program.
 | 
			
		||||
EXE_PATH = gtest_test_utils.GetTestExecutablePath(
 | 
			
		||||
    'gtest_break_on_failure_unittest_')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
environ = gtest_test_utils.environ
 | 
			
		||||
SetEnvVar = gtest_test_utils.SetEnvVar
 | 
			
		||||
 | 
			
		||||
# Tests in this file run a Google-Test-based test program and expect it
 | 
			
		||||
# to terminate prematurely.  Therefore they are incompatible with
 | 
			
		||||
# the premature-exit-file protocol by design.  Unset the
 | 
			
		||||
# premature-exit filepath to prevent Google Test from creating
 | 
			
		||||
# the file.
 | 
			
		||||
SetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def Run(command):
 | 
			
		||||
  """Runs a command; returns 1 if it was killed by a signal, or 0 otherwise."""
 | 
			
		||||
 | 
			
		||||
  p = gtest_test_utils.Subprocess(command, env=environ)
 | 
			
		||||
  if p.terminated_by_signal:
 | 
			
		||||
    return 1
 | 
			
		||||
  else:
 | 
			
		||||
    return 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# The tests.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GTestBreakOnFailureUnitTest(gtest_test_utils.TestCase):
 | 
			
		||||
  """Tests using the GTEST_BREAK_ON_FAILURE environment variable or
 | 
			
		||||
  the --gtest_break_on_failure flag to turn assertion failures into
 | 
			
		||||
  segmentation faults.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  def RunAndVerify(self, env_var_value, flag_value, expect_seg_fault):
 | 
			
		||||
    """Runs gtest_break_on_failure_unittest_ and verifies that it does
 | 
			
		||||
    (or does not) have a seg-fault.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
      env_var_value:    value of the GTEST_BREAK_ON_FAILURE environment
 | 
			
		||||
                        variable; None if the variable should be unset.
 | 
			
		||||
      flag_value:       value of the --gtest_break_on_failure flag;
 | 
			
		||||
                        None if the flag should not be present.
 | 
			
		||||
      expect_seg_fault: 1 if the program is expected to generate a seg-fault;
 | 
			
		||||
                        0 otherwise.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, env_var_value)
 | 
			
		||||
 | 
			
		||||
    if env_var_value is None:
 | 
			
		||||
      env_var_value_msg = ' is not set'
 | 
			
		||||
    else:
 | 
			
		||||
      env_var_value_msg = '=' + env_var_value
 | 
			
		||||
 | 
			
		||||
    if flag_value is None:
 | 
			
		||||
      flag = ''
 | 
			
		||||
    elif flag_value == '0':
 | 
			
		||||
      flag = '--%s=0' % BREAK_ON_FAILURE_FLAG
 | 
			
		||||
    else:
 | 
			
		||||
      flag = '--%s' % BREAK_ON_FAILURE_FLAG
 | 
			
		||||
 | 
			
		||||
    command = [EXE_PATH]
 | 
			
		||||
    if flag:
 | 
			
		||||
      command.append(flag)
 | 
			
		||||
 | 
			
		||||
    if expect_seg_fault:
 | 
			
		||||
      should_or_not = 'should'
 | 
			
		||||
    else:
 | 
			
		||||
      should_or_not = 'should not'
 | 
			
		||||
 | 
			
		||||
    has_seg_fault = Run(command)
 | 
			
		||||
 | 
			
		||||
    SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, None)
 | 
			
		||||
 | 
			
		||||
    msg = ('when %s%s, an assertion failure in "%s" %s cause a seg-fault.' %
 | 
			
		||||
           (BREAK_ON_FAILURE_ENV_VAR, env_var_value_msg, ' '.join(command),
 | 
			
		||||
            should_or_not))
 | 
			
		||||
    self.assert_(has_seg_fault == expect_seg_fault, msg)
 | 
			
		||||
 | 
			
		||||
  def testDefaultBehavior(self):
 | 
			
		||||
    """Tests the behavior of the default mode."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify(env_var_value=None,
 | 
			
		||||
                      flag_value=None,
 | 
			
		||||
                      expect_seg_fault=0)
 | 
			
		||||
 | 
			
		||||
  def testEnvVar(self):
 | 
			
		||||
    """Tests using the GTEST_BREAK_ON_FAILURE environment variable."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify(env_var_value='0',
 | 
			
		||||
                      flag_value=None,
 | 
			
		||||
                      expect_seg_fault=0)
 | 
			
		||||
    self.RunAndVerify(env_var_value='1',
 | 
			
		||||
                      flag_value=None,
 | 
			
		||||
                      expect_seg_fault=1)
 | 
			
		||||
 | 
			
		||||
  def testFlag(self):
 | 
			
		||||
    """Tests using the --gtest_break_on_failure flag."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify(env_var_value=None,
 | 
			
		||||
                      flag_value='0',
 | 
			
		||||
                      expect_seg_fault=0)
 | 
			
		||||
    self.RunAndVerify(env_var_value=None,
 | 
			
		||||
                      flag_value='1',
 | 
			
		||||
                      expect_seg_fault=1)
 | 
			
		||||
 | 
			
		||||
  def testFlagOverridesEnvVar(self):
 | 
			
		||||
    """Tests that the flag overrides the environment variable."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify(env_var_value='0',
 | 
			
		||||
                      flag_value='0',
 | 
			
		||||
                      expect_seg_fault=0)
 | 
			
		||||
    self.RunAndVerify(env_var_value='0',
 | 
			
		||||
                      flag_value='1',
 | 
			
		||||
                      expect_seg_fault=1)
 | 
			
		||||
    self.RunAndVerify(env_var_value='1',
 | 
			
		||||
                      flag_value='0',
 | 
			
		||||
                      expect_seg_fault=0)
 | 
			
		||||
    self.RunAndVerify(env_var_value='1',
 | 
			
		||||
                      flag_value='1',
 | 
			
		||||
                      expect_seg_fault=1)
 | 
			
		||||
 | 
			
		||||
  def testBreakOnFailureOverridesThrowOnFailure(self):
 | 
			
		||||
    """Tests that gtest_break_on_failure overrides gtest_throw_on_failure."""
 | 
			
		||||
 | 
			
		||||
    SetEnvVar(THROW_ON_FAILURE_ENV_VAR, '1')
 | 
			
		||||
    try:
 | 
			
		||||
      self.RunAndVerify(env_var_value=None,
 | 
			
		||||
                        flag_value='1',
 | 
			
		||||
                        expect_seg_fault=1)
 | 
			
		||||
    finally:
 | 
			
		||||
      SetEnvVar(THROW_ON_FAILURE_ENV_VAR, None)
 | 
			
		||||
 | 
			
		||||
  if IS_WINDOWS:
 | 
			
		||||
    def testCatchExceptionsDoesNotInterfere(self):
 | 
			
		||||
      """Tests that gtest_catch_exceptions doesn't interfere."""
 | 
			
		||||
 | 
			
		||||
      SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, '1')
 | 
			
		||||
      try:
 | 
			
		||||
        self.RunAndVerify(env_var_value='1',
 | 
			
		||||
                          flag_value='1',
 | 
			
		||||
                          expect_seg_fault=1)
 | 
			
		||||
      finally:
 | 
			
		||||
        SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, None)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  gtest_test_utils.Main()
 | 
			
		||||
| 
						 | 
				
			
			@ -1,88 +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.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
// Unit test for Google Test's break-on-failure mode.
 | 
			
		||||
//
 | 
			
		||||
// A user can ask Google Test to seg-fault when an assertion fails, using
 | 
			
		||||
// either the GTEST_BREAK_ON_FAILURE environment variable or the
 | 
			
		||||
// --gtest_break_on_failure flag.  This file is used for testing such
 | 
			
		||||
// functionality.
 | 
			
		||||
//
 | 
			
		||||
// This program will be invoked from a Python unit test.  It is
 | 
			
		||||
// expected to fail.  Don't run it directly.
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_OS_WINDOWS
 | 
			
		||||
# include <windows.h>
 | 
			
		||||
# include <stdlib.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
// A test that's expected to fail.
 | 
			
		||||
TEST(Foo, Bar) {
 | 
			
		||||
  EXPECT_EQ(2, 3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
// On Windows Mobile global exception handlers are not supported.
 | 
			
		||||
LONG WINAPI ExitWithExceptionCode(
 | 
			
		||||
    struct _EXCEPTION_POINTERS* exception_pointers) {
 | 
			
		||||
  exit(exception_pointers->ExceptionRecord->ExceptionCode);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
#if GTEST_OS_WINDOWS
 | 
			
		||||
  // Suppresses display of the Windows error dialog upon encountering
 | 
			
		||||
  // a general protection fault (segment violation).
 | 
			
		||||
  SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS);
 | 
			
		||||
 | 
			
		||||
# if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
 | 
			
		||||
  // The default unhandled exception filter does not always exit
 | 
			
		||||
  // with the exception code as exit code - for example it exits with
 | 
			
		||||
  // 0 for EXCEPTION_ACCESS_VIOLATION and 1 for EXCEPTION_BREAKPOINT
 | 
			
		||||
  // if the application is compiled in debug mode. Thus we use our own
 | 
			
		||||
  // filter which always exits with the exception code for unhandled
 | 
			
		||||
  // exceptions.
 | 
			
		||||
  SetUnhandledExceptionFilter(ExitWithExceptionCode);
 | 
			
		||||
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,237 +0,0 @@
 | 
			
		|||
#!/usr/bin/env python
 | 
			
		||||
#
 | 
			
		||||
# Copyright 2010 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.
 | 
			
		||||
 | 
			
		||||
"""Tests Google Test's exception catching behavior.
 | 
			
		||||
 | 
			
		||||
This script invokes gtest_catch_exceptions_test_ and
 | 
			
		||||
gtest_catch_exceptions_ex_test_ (programs written with
 | 
			
		||||
Google Test) and verifies their output.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
__author__ = 'vladl@google.com (Vlad Losev)'
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
 | 
			
		||||
# Constants.
 | 
			
		||||
FLAG_PREFIX = '--gtest_'
 | 
			
		||||
LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
 | 
			
		||||
NO_CATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions=0'
 | 
			
		||||
FILTER_FLAG = FLAG_PREFIX + 'filter'
 | 
			
		||||
 | 
			
		||||
# Path to the gtest_catch_exceptions_ex_test_ binary, compiled with
 | 
			
		||||
# exceptions enabled.
 | 
			
		||||
EX_EXE_PATH = gtest_test_utils.GetTestExecutablePath(
 | 
			
		||||
    'gtest_catch_exceptions_ex_test_')
 | 
			
		||||
 | 
			
		||||
# Path to the gtest_catch_exceptions_test_ binary, compiled with
 | 
			
		||||
# exceptions disabled.
 | 
			
		||||
EXE_PATH = gtest_test_utils.GetTestExecutablePath(
 | 
			
		||||
    'gtest_catch_exceptions_no_ex_test_')
 | 
			
		||||
 | 
			
		||||
environ = gtest_test_utils.environ
 | 
			
		||||
SetEnvVar = gtest_test_utils.SetEnvVar
 | 
			
		||||
 | 
			
		||||
# Tests in this file run a Google-Test-based test program and expect it
 | 
			
		||||
# to terminate prematurely.  Therefore they are incompatible with
 | 
			
		||||
# the premature-exit-file protocol by design.  Unset the
 | 
			
		||||
# premature-exit filepath to prevent Google Test from creating
 | 
			
		||||
# the file.
 | 
			
		||||
SetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)
 | 
			
		||||
 | 
			
		||||
TEST_LIST = gtest_test_utils.Subprocess(
 | 
			
		||||
    [EXE_PATH, LIST_TESTS_FLAG], env=environ).output
 | 
			
		||||
 | 
			
		||||
SUPPORTS_SEH_EXCEPTIONS = 'ThrowsSehException' in TEST_LIST
 | 
			
		||||
 | 
			
		||||
if SUPPORTS_SEH_EXCEPTIONS:
 | 
			
		||||
  BINARY_OUTPUT = gtest_test_utils.Subprocess([EXE_PATH], env=environ).output
 | 
			
		||||
 | 
			
		||||
EX_BINARY_OUTPUT = gtest_test_utils.Subprocess(
 | 
			
		||||
    [EX_EXE_PATH], env=environ).output
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# The tests.
 | 
			
		||||
if SUPPORTS_SEH_EXCEPTIONS:
 | 
			
		||||
  # pylint:disable-msg=C6302
 | 
			
		||||
  class CatchSehExceptionsTest(gtest_test_utils.TestCase):
 | 
			
		||||
    """Tests exception-catching behavior."""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def TestSehExceptions(self, test_output):
 | 
			
		||||
      self.assert_('SEH exception with code 0x2a thrown '
 | 
			
		||||
                   'in the test fixture\'s constructor'
 | 
			
		||||
                   in test_output)
 | 
			
		||||
      self.assert_('SEH exception with code 0x2a thrown '
 | 
			
		||||
                   'in the test fixture\'s destructor'
 | 
			
		||||
                   in test_output)
 | 
			
		||||
      self.assert_('SEH exception with code 0x2a thrown in SetUpTestCase()'
 | 
			
		||||
                   in test_output)
 | 
			
		||||
      self.assert_('SEH exception with code 0x2a thrown in TearDownTestCase()'
 | 
			
		||||
                   in test_output)
 | 
			
		||||
      self.assert_('SEH exception with code 0x2a thrown in SetUp()'
 | 
			
		||||
                   in test_output)
 | 
			
		||||
      self.assert_('SEH exception with code 0x2a thrown in TearDown()'
 | 
			
		||||
                   in test_output)
 | 
			
		||||
      self.assert_('SEH exception with code 0x2a thrown in the test body'
 | 
			
		||||
                   in test_output)
 | 
			
		||||
 | 
			
		||||
    def testCatchesSehExceptionsWithCxxExceptionsEnabled(self):
 | 
			
		||||
      self.TestSehExceptions(EX_BINARY_OUTPUT)
 | 
			
		||||
 | 
			
		||||
    def testCatchesSehExceptionsWithCxxExceptionsDisabled(self):
 | 
			
		||||
      self.TestSehExceptions(BINARY_OUTPUT)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CatchCxxExceptionsTest(gtest_test_utils.TestCase):
 | 
			
		||||
  """Tests C++ exception-catching behavior.
 | 
			
		||||
 | 
			
		||||
     Tests in this test case verify that:
 | 
			
		||||
     * C++ exceptions are caught and logged as C++ (not SEH) exceptions
 | 
			
		||||
     * Exception thrown affect the remainder of the test work flow in the
 | 
			
		||||
       expected manner.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  def testCatchesCxxExceptionsInFixtureConstructor(self):
 | 
			
		||||
    self.assert_('C++ exception with description '
 | 
			
		||||
                 '"Standard C++ exception" thrown '
 | 
			
		||||
                 'in the test fixture\'s constructor'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('unexpected' not in EX_BINARY_OUTPUT,
 | 
			
		||||
                 'This failure belongs in this test only if '
 | 
			
		||||
                 '"CxxExceptionInConstructorTest" (no quotes) '
 | 
			
		||||
                 'appears on the same line as words "called unexpectedly"')
 | 
			
		||||
 | 
			
		||||
  if ('CxxExceptionInDestructorTest.ThrowsExceptionInDestructor' in
 | 
			
		||||
      EX_BINARY_OUTPUT):
 | 
			
		||||
 | 
			
		||||
    def testCatchesCxxExceptionsInFixtureDestructor(self):
 | 
			
		||||
      self.assert_('C++ exception with description '
 | 
			
		||||
                   '"Standard C++ exception" thrown '
 | 
			
		||||
                   'in the test fixture\'s destructor'
 | 
			
		||||
                   in EX_BINARY_OUTPUT)
 | 
			
		||||
      self.assert_('CxxExceptionInDestructorTest::TearDownTestCase() '
 | 
			
		||||
                   'called as expected.'
 | 
			
		||||
                   in EX_BINARY_OUTPUT)
 | 
			
		||||
 | 
			
		||||
  def testCatchesCxxExceptionsInSetUpTestCase(self):
 | 
			
		||||
    self.assert_('C++ exception with description "Standard C++ exception"'
 | 
			
		||||
                 ' thrown in SetUpTestCase()'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInConstructorTest::TearDownTestCase() '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInSetUpTestCaseTest constructor '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInSetUpTestCaseTest destructor '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInSetUpTestCaseTest::SetUp() '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInSetUpTestCaseTest::TearDown() '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInSetUpTestCaseTest test body '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
 | 
			
		||||
  def testCatchesCxxExceptionsInTearDownTestCase(self):
 | 
			
		||||
    self.assert_('C++ exception with description "Standard C++ exception"'
 | 
			
		||||
                 ' thrown in TearDownTestCase()'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
 | 
			
		||||
  def testCatchesCxxExceptionsInSetUp(self):
 | 
			
		||||
    self.assert_('C++ exception with description "Standard C++ exception"'
 | 
			
		||||
                 ' thrown in SetUp()'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInSetUpTest::TearDownTestCase() '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInSetUpTest destructor '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInSetUpTest::TearDown() '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('unexpected' not in EX_BINARY_OUTPUT,
 | 
			
		||||
                 'This failure belongs in this test only if '
 | 
			
		||||
                 '"CxxExceptionInSetUpTest" (no quotes) '
 | 
			
		||||
                 'appears on the same line as words "called unexpectedly"')
 | 
			
		||||
 | 
			
		||||
  def testCatchesCxxExceptionsInTearDown(self):
 | 
			
		||||
    self.assert_('C++ exception with description "Standard C++ exception"'
 | 
			
		||||
                 ' thrown in TearDown()'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInTearDownTest::TearDownTestCase() '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInTearDownTest destructor '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
 | 
			
		||||
  def testCatchesCxxExceptionsInTestBody(self):
 | 
			
		||||
    self.assert_('C++ exception with description "Standard C++ exception"'
 | 
			
		||||
                 ' thrown in the test body'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInTestBodyTest::TearDownTestCase() '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInTestBodyTest destructor '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
    self.assert_('CxxExceptionInTestBodyTest::TearDown() '
 | 
			
		||||
                 'called as expected.'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
 | 
			
		||||
  def testCatchesNonStdCxxExceptions(self):
 | 
			
		||||
    self.assert_('Unknown C++ exception thrown in the test body'
 | 
			
		||||
                 in EX_BINARY_OUTPUT)
 | 
			
		||||
 | 
			
		||||
  def testUnhandledCxxExceptionsAbortTheProgram(self):
 | 
			
		||||
    # Filters out SEH exception tests on Windows. Unhandled SEH exceptions
 | 
			
		||||
    # cause tests to show pop-up windows there.
 | 
			
		||||
    FITLER_OUT_SEH_TESTS_FLAG = FILTER_FLAG + '=-*Seh*'
 | 
			
		||||
    # By default, Google Test doesn't catch the exceptions.
 | 
			
		||||
    uncaught_exceptions_ex_binary_output = gtest_test_utils.Subprocess(
 | 
			
		||||
        [EX_EXE_PATH,
 | 
			
		||||
         NO_CATCH_EXCEPTIONS_FLAG,
 | 
			
		||||
         FITLER_OUT_SEH_TESTS_FLAG],
 | 
			
		||||
        env=environ).output
 | 
			
		||||
 | 
			
		||||
    self.assert_('Unhandled C++ exception terminating the program'
 | 
			
		||||
                 in uncaught_exceptions_ex_binary_output)
 | 
			
		||||
    self.assert_('unexpected' not in uncaught_exceptions_ex_binary_output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  gtest_test_utils.Main()
 | 
			
		||||
| 
						 | 
				
			
			@ -1,311 +0,0 @@
 | 
			
		|||
// Copyright 2010, 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: vladl@google.com (Vlad Losev)
 | 
			
		||||
//
 | 
			
		||||
// Tests for Google Test itself. Tests in this file throw C++ or SEH
 | 
			
		||||
// exceptions, and the output is verified by gtest_catch_exceptions_test.py.
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>  // NOLINT
 | 
			
		||||
#include <stdlib.h>  // For exit().
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_SEH
 | 
			
		||||
# include <windows.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_EXCEPTIONS
 | 
			
		||||
# include <exception>  // For set_terminate().
 | 
			
		||||
# include <stdexcept>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
using testing::Test;
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_SEH
 | 
			
		||||
 | 
			
		||||
class SehExceptionInConstructorTest : public Test {
 | 
			
		||||
 public:
 | 
			
		||||
  SehExceptionInConstructorTest() { RaiseException(42, 0, 0, NULL); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(SehExceptionInConstructorTest, ThrowsExceptionInConstructor) {}
 | 
			
		||||
 | 
			
		||||
class SehExceptionInDestructorTest : public Test {
 | 
			
		||||
 public:
 | 
			
		||||
  ~SehExceptionInDestructorTest() { RaiseException(42, 0, 0, NULL); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(SehExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
 | 
			
		||||
 | 
			
		||||
class SehExceptionInSetUpTestCaseTest : public Test {
 | 
			
		||||
 public:
 | 
			
		||||
  static void SetUpTestCase() { RaiseException(42, 0, 0, NULL); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(SehExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {}
 | 
			
		||||
 | 
			
		||||
class SehExceptionInTearDownTestCaseTest : public Test {
 | 
			
		||||
 public:
 | 
			
		||||
  static void TearDownTestCase() { RaiseException(42, 0, 0, NULL); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(SehExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
 | 
			
		||||
 | 
			
		||||
class SehExceptionInSetUpTest : public Test {
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual void SetUp() { RaiseException(42, 0, 0, NULL); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(SehExceptionInSetUpTest, ThrowsExceptionInSetUp) {}
 | 
			
		||||
 | 
			
		||||
class SehExceptionInTearDownTest : public Test {
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual void TearDown() { RaiseException(42, 0, 0, NULL); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(SehExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
 | 
			
		||||
 | 
			
		||||
TEST(SehExceptionTest, ThrowsSehException) {
 | 
			
		||||
  RaiseException(42, 0, 0, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_SEH
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
class CxxExceptionInConstructorTest : public Test {
 | 
			
		||||
 public:
 | 
			
		||||
  CxxExceptionInConstructorTest() {
 | 
			
		||||
    // Without this macro VC++ complains about unreachable code at the end of
 | 
			
		||||
    // the constructor.
 | 
			
		||||
    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
 | 
			
		||||
        throw std::runtime_error("Standard C++ exception"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static void TearDownTestCase() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInConstructorTest::TearDownTestCase() "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  ~CxxExceptionInConstructorTest() {
 | 
			
		||||
    ADD_FAILURE() << "CxxExceptionInConstructorTest destructor "
 | 
			
		||||
                  << "called unexpectedly.";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    ADD_FAILURE() << "CxxExceptionInConstructorTest::SetUp() "
 | 
			
		||||
                  << "called unexpectedly.";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    ADD_FAILURE() << "CxxExceptionInConstructorTest::TearDown() "
 | 
			
		||||
                  << "called unexpectedly.";
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(CxxExceptionInConstructorTest, ThrowsExceptionInConstructor) {
 | 
			
		||||
  ADD_FAILURE() << "CxxExceptionInConstructorTest test body "
 | 
			
		||||
                << "called unexpectedly.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Exceptions in destructors are not supported in C++11.
 | 
			
		||||
#if !defined(__GXX_EXPERIMENTAL_CXX0X__) &&  __cplusplus < 201103L
 | 
			
		||||
class CxxExceptionInDestructorTest : public Test {
 | 
			
		||||
 public:
 | 
			
		||||
  static void TearDownTestCase() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInDestructorTest::TearDownTestCase() "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  ~CxxExceptionInDestructorTest() {
 | 
			
		||||
    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
 | 
			
		||||
        throw std::runtime_error("Standard C++ exception"));
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(CxxExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
 | 
			
		||||
#endif  // C++11 mode
 | 
			
		||||
 | 
			
		||||
class CxxExceptionInSetUpTestCaseTest : public Test {
 | 
			
		||||
 public:
 | 
			
		||||
  CxxExceptionInSetUpTestCaseTest() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInSetUpTestCaseTest constructor "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static void SetUpTestCase() {
 | 
			
		||||
    throw std::runtime_error("Standard C++ exception");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static void TearDownTestCase() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInSetUpTestCaseTest::TearDownTestCase() "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  ~CxxExceptionInSetUpTestCaseTest() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInSetUpTestCaseTest destructor "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInSetUpTestCaseTest::SetUp() "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInSetUpTestCaseTest::TearDown() "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(CxxExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {
 | 
			
		||||
  printf("%s",
 | 
			
		||||
         "CxxExceptionInSetUpTestCaseTest test body "
 | 
			
		||||
         "called as expected.\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class CxxExceptionInTearDownTestCaseTest : public Test {
 | 
			
		||||
 public:
 | 
			
		||||
  static void TearDownTestCase() {
 | 
			
		||||
    throw std::runtime_error("Standard C++ exception");
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(CxxExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
 | 
			
		||||
 | 
			
		||||
class CxxExceptionInSetUpTest : public Test {
 | 
			
		||||
 public:
 | 
			
		||||
  static void TearDownTestCase() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInSetUpTest::TearDownTestCase() "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  ~CxxExceptionInSetUpTest() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInSetUpTest destructor "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void SetUp() { throw std::runtime_error("Standard C++ exception"); }
 | 
			
		||||
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInSetUpTest::TearDown() "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(CxxExceptionInSetUpTest, ThrowsExceptionInSetUp) {
 | 
			
		||||
  ADD_FAILURE() << "CxxExceptionInSetUpTest test body "
 | 
			
		||||
                << "called unexpectedly.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class CxxExceptionInTearDownTest : public Test {
 | 
			
		||||
 public:
 | 
			
		||||
  static void TearDownTestCase() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInTearDownTest::TearDownTestCase() "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  ~CxxExceptionInTearDownTest() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInTearDownTest destructor "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    throw std::runtime_error("Standard C++ exception");
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(CxxExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
 | 
			
		||||
 | 
			
		||||
class CxxExceptionInTestBodyTest : public Test {
 | 
			
		||||
 public:
 | 
			
		||||
  static void TearDownTestCase() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInTestBodyTest::TearDownTestCase() "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  ~CxxExceptionInTestBodyTest() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInTestBodyTest destructor "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    printf("%s",
 | 
			
		||||
           "CxxExceptionInTestBodyTest::TearDown() "
 | 
			
		||||
           "called as expected.\n");
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(CxxExceptionInTestBodyTest, ThrowsStdCxxException) {
 | 
			
		||||
  throw std::runtime_error("Standard C++ exception");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(CxxExceptionTest, ThrowsNonStdCxxException) {
 | 
			
		||||
  throw "C-string";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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(3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
int main(int argc, char** argv) {
 | 
			
		||||
#if GTEST_HAS_EXCEPTIONS
 | 
			
		||||
  std::set_terminate(&TerminateHandler);
 | 
			
		||||
#endif
 | 
			
		||||
  testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,130 +0,0 @@
 | 
			
		|||
#!/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.
 | 
			
		||||
 | 
			
		||||
"""Verifies that Google Test correctly determines whether to use colors."""
 | 
			
		||||
 | 
			
		||||
__author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IS_WINDOWS = os.name = 'nt'
 | 
			
		||||
 | 
			
		||||
COLOR_ENV_VAR = 'GTEST_COLOR'
 | 
			
		||||
COLOR_FLAG = 'gtest_color'
 | 
			
		||||
COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_color_test_')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def SetEnvVar(env_var, value):
 | 
			
		||||
  """Sets the env variable to 'value'; unsets it when 'value' is None."""
 | 
			
		||||
 | 
			
		||||
  if value is not None:
 | 
			
		||||
    os.environ[env_var] = value
 | 
			
		||||
  elif env_var in os.environ:
 | 
			
		||||
    del os.environ[env_var]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def UsesColor(term, color_env_var, color_flag):
 | 
			
		||||
  """Runs gtest_color_test_ and returns its exit code."""
 | 
			
		||||
 | 
			
		||||
  SetEnvVar('TERM', term)
 | 
			
		||||
  SetEnvVar(COLOR_ENV_VAR, color_env_var)
 | 
			
		||||
 | 
			
		||||
  if color_flag is None:
 | 
			
		||||
    args = []
 | 
			
		||||
  else:
 | 
			
		||||
    args = ['--%s=%s' % (COLOR_FLAG, color_flag)]
 | 
			
		||||
  p = gtest_test_utils.Subprocess([COMMAND] + args)
 | 
			
		||||
  return not p.exited or p.exit_code
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GTestColorTest(gtest_test_utils.TestCase):
 | 
			
		||||
  def testNoEnvVarNoFlag(self):
 | 
			
		||||
    """Tests the case when there's neither GTEST_COLOR nor --gtest_color."""
 | 
			
		||||
 | 
			
		||||
    if not IS_WINDOWS:
 | 
			
		||||
      self.assert_(not UsesColor('dumb', None, None))
 | 
			
		||||
      self.assert_(not UsesColor('emacs', None, None))
 | 
			
		||||
      self.assert_(not UsesColor('xterm-mono', None, None))
 | 
			
		||||
      self.assert_(not UsesColor('unknown', None, None))
 | 
			
		||||
      self.assert_(not UsesColor(None, None, None))
 | 
			
		||||
    self.assert_(UsesColor('linux', None, None))
 | 
			
		||||
    self.assert_(UsesColor('cygwin', None, None))
 | 
			
		||||
    self.assert_(UsesColor('xterm', None, None))
 | 
			
		||||
    self.assert_(UsesColor('xterm-color', None, None))
 | 
			
		||||
    self.assert_(UsesColor('xterm-256color', None, None))
 | 
			
		||||
 | 
			
		||||
  def testFlagOnly(self):
 | 
			
		||||
    """Tests the case when there's --gtest_color but not GTEST_COLOR."""
 | 
			
		||||
 | 
			
		||||
    self.assert_(not UsesColor('dumb', None, 'no'))
 | 
			
		||||
    self.assert_(not UsesColor('xterm-color', None, 'no'))
 | 
			
		||||
    if not IS_WINDOWS:
 | 
			
		||||
      self.assert_(not UsesColor('emacs', None, 'auto'))
 | 
			
		||||
    self.assert_(UsesColor('xterm', None, 'auto'))
 | 
			
		||||
    self.assert_(UsesColor('dumb', None, 'yes'))
 | 
			
		||||
    self.assert_(UsesColor('xterm', None, 'yes'))
 | 
			
		||||
 | 
			
		||||
  def testEnvVarOnly(self):
 | 
			
		||||
    """Tests the case when there's GTEST_COLOR but not --gtest_color."""
 | 
			
		||||
 | 
			
		||||
    self.assert_(not UsesColor('dumb', 'no', None))
 | 
			
		||||
    self.assert_(not UsesColor('xterm-color', 'no', None))
 | 
			
		||||
    if not IS_WINDOWS:
 | 
			
		||||
      self.assert_(not UsesColor('dumb', 'auto', None))
 | 
			
		||||
    self.assert_(UsesColor('xterm-color', 'auto', None))
 | 
			
		||||
    self.assert_(UsesColor('dumb', 'yes', None))
 | 
			
		||||
    self.assert_(UsesColor('xterm-color', 'yes', None))
 | 
			
		||||
 | 
			
		||||
  def testEnvVarAndFlag(self):
 | 
			
		||||
    """Tests the case when there are both GTEST_COLOR and --gtest_color."""
 | 
			
		||||
 | 
			
		||||
    self.assert_(not UsesColor('xterm-color', 'no', 'no'))
 | 
			
		||||
    self.assert_(UsesColor('dumb', 'no', 'yes'))
 | 
			
		||||
    self.assert_(UsesColor('xterm-color', 'no', 'auto'))
 | 
			
		||||
 | 
			
		||||
  def testAliasesOfYesAndNo(self):
 | 
			
		||||
    """Tests using aliases in specifying --gtest_color."""
 | 
			
		||||
 | 
			
		||||
    self.assert_(UsesColor('dumb', None, 'true'))
 | 
			
		||||
    self.assert_(UsesColor('dumb', None, 'YES'))
 | 
			
		||||
    self.assert_(UsesColor('dumb', None, 'T'))
 | 
			
		||||
    self.assert_(UsesColor('dumb', None, '1'))
 | 
			
		||||
 | 
			
		||||
    self.assert_(not UsesColor('xterm', None, 'f'))
 | 
			
		||||
    self.assert_(not UsesColor('xterm', None, 'false'))
 | 
			
		||||
    self.assert_(not UsesColor('xterm', None, '0'))
 | 
			
		||||
    self.assert_(not UsesColor('xterm', None, 'unknown'))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  gtest_test_utils.Main()
 | 
			
		||||
| 
						 | 
				
			
			@ -1,71 +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)
 | 
			
		||||
 | 
			
		||||
// A helper program for testing how Google Test determines whether to use
 | 
			
		||||
// colors in the output.  It prints "YES" and returns 1 if Google Test
 | 
			
		||||
// decides to use colors, and prints "NO" and returns 0 otherwise.
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
// Indicates that this translation unit is part of Google Test's
 | 
			
		||||
// implementation.  It must come before gtest-internal-inl.h is
 | 
			
		||||
// included, or there will be a compiler error.  This trick is to
 | 
			
		||||
// prevent a user from accidentally including gtest-internal-inl.h in
 | 
			
		||||
// his code.
 | 
			
		||||
#define GTEST_IMPLEMENTATION_ 1
 | 
			
		||||
#include "src/gtest-internal-inl.h"
 | 
			
		||||
#undef GTEST_IMPLEMENTATION_
 | 
			
		||||
 | 
			
		||||
using testing::internal::ShouldUseColor;
 | 
			
		||||
 | 
			
		||||
// The purpose of this is to ensure that the UnitTest singleton is
 | 
			
		||||
// created before main() is entered, and thus that ShouldUseColor()
 | 
			
		||||
// works the same way as in a real Google-Test-based test.  We don't actual
 | 
			
		||||
// run the TEST itself.
 | 
			
		||||
TEST(GTestColorTest, Dummy) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char** argv) {
 | 
			
		||||
  testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  if (ShouldUseColor(true)) {
 | 
			
		||||
    // Google Test decides to use colors in the output (assuming it
 | 
			
		||||
    // goes to a TTY).
 | 
			
		||||
    printf("YES\n");
 | 
			
		||||
    return 1;
 | 
			
		||||
  } else {
 | 
			
		||||
    // Google Test decides not to use colors in the output.
 | 
			
		||||
    printf("NO\n");
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,103 +0,0 @@
 | 
			
		|||
#!/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.
 | 
			
		||||
 | 
			
		||||
"""Verifies that Google Test correctly parses environment variables."""
 | 
			
		||||
 | 
			
		||||
__author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IS_WINDOWS = os.name == 'nt'
 | 
			
		||||
IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
 | 
			
		||||
 | 
			
		||||
COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_env_var_test_')
 | 
			
		||||
 | 
			
		||||
environ = os.environ.copy()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def AssertEq(expected, actual):
 | 
			
		||||
  if expected != actual:
 | 
			
		||||
    print 'Expected: %s' % (expected,)
 | 
			
		||||
    print '  Actual: %s' % (actual,)
 | 
			
		||||
    raise AssertionError
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def SetEnvVar(env_var, value):
 | 
			
		||||
  """Sets the env variable to 'value'; unsets it when 'value' is None."""
 | 
			
		||||
 | 
			
		||||
  if value is not None:
 | 
			
		||||
    environ[env_var] = value
 | 
			
		||||
  elif env_var in environ:
 | 
			
		||||
    del environ[env_var]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def GetFlag(flag):
 | 
			
		||||
  """Runs gtest_env_var_test_ and returns its output."""
 | 
			
		||||
 | 
			
		||||
  args = [COMMAND]
 | 
			
		||||
  if flag is not None:
 | 
			
		||||
    args += [flag]
 | 
			
		||||
  return gtest_test_utils.Subprocess(args, env=environ).output
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def TestFlag(flag, test_val, default_val):
 | 
			
		||||
  """Verifies that the given flag is affected by the corresponding env var."""
 | 
			
		||||
 | 
			
		||||
  env_var = 'GTEST_' + flag.upper()
 | 
			
		||||
  SetEnvVar(env_var, test_val)
 | 
			
		||||
  AssertEq(test_val, GetFlag(flag))
 | 
			
		||||
  SetEnvVar(env_var, None)
 | 
			
		||||
  AssertEq(default_val, GetFlag(flag))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GTestEnvVarTest(gtest_test_utils.TestCase):
 | 
			
		||||
  def testEnvVarAffectsFlag(self):
 | 
			
		||||
    """Tests that environment variable should affect the corresponding flag."""
 | 
			
		||||
 | 
			
		||||
    TestFlag('break_on_failure', '1', '0')
 | 
			
		||||
    TestFlag('color', 'yes', 'auto')
 | 
			
		||||
    TestFlag('filter', 'FooTest.Bar', '*')
 | 
			
		||||
    TestFlag('output', 'xml:tmp/foo.xml', '')
 | 
			
		||||
    TestFlag('print_time', '0', '1')
 | 
			
		||||
    TestFlag('repeat', '999', '1')
 | 
			
		||||
    TestFlag('throw_on_failure', '1', '0')
 | 
			
		||||
    TestFlag('death_test_style', 'threadsafe', 'fast')
 | 
			
		||||
    TestFlag('catch_exceptions', '0', '1')
 | 
			
		||||
 | 
			
		||||
    if IS_LINUX:
 | 
			
		||||
      TestFlag('death_test_use_fork', '1', '0')
 | 
			
		||||
      TestFlag('stack_trace_depth', '0', '100')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  gtest_test_utils.Main()
 | 
			
		||||
| 
						 | 
				
			
			@ -1,126 +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)
 | 
			
		||||
 | 
			
		||||
// A helper program for testing that Google Test parses the environment
 | 
			
		||||
// variables correctly.
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#define GTEST_IMPLEMENTATION_ 1
 | 
			
		||||
#include "src/gtest-internal-inl.h"
 | 
			
		||||
#undef GTEST_IMPLEMENTATION_
 | 
			
		||||
 | 
			
		||||
using ::std::cout;
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
 | 
			
		||||
// The purpose of this is to make the test more realistic by ensuring
 | 
			
		||||
// that the UnitTest singleton is created before main() is entered.
 | 
			
		||||
// We don't actual run the TEST itself.
 | 
			
		||||
TEST(GTestEnvVarTest, Dummy) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PrintFlag(const char* flag) {
 | 
			
		||||
  if (strcmp(flag, "break_on_failure") == 0) {
 | 
			
		||||
    cout << GTEST_FLAG(break_on_failure);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (strcmp(flag, "catch_exceptions") == 0) {
 | 
			
		||||
    cout << GTEST_FLAG(catch_exceptions);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (strcmp(flag, "color") == 0) {
 | 
			
		||||
    cout << GTEST_FLAG(color);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (strcmp(flag, "death_test_style") == 0) {
 | 
			
		||||
    cout << GTEST_FLAG(death_test_style);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (strcmp(flag, "death_test_use_fork") == 0) {
 | 
			
		||||
    cout << GTEST_FLAG(death_test_use_fork);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (strcmp(flag, "filter") == 0) {
 | 
			
		||||
    cout << GTEST_FLAG(filter);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (strcmp(flag, "output") == 0) {
 | 
			
		||||
    cout << GTEST_FLAG(output);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (strcmp(flag, "print_time") == 0) {
 | 
			
		||||
    cout << GTEST_FLAG(print_time);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (strcmp(flag, "repeat") == 0) {
 | 
			
		||||
    cout << GTEST_FLAG(repeat);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (strcmp(flag, "stack_trace_depth") == 0) {
 | 
			
		||||
    cout << GTEST_FLAG(stack_trace_depth);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (strcmp(flag, "throw_on_failure") == 0) {
 | 
			
		||||
    cout << GTEST_FLAG(throw_on_failure);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  cout << "Invalid flag name " << flag
 | 
			
		||||
       << ".  Valid names are break_on_failure, color, filter, etc.\n";
 | 
			
		||||
  exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
int main(int argc, char** argv) {
 | 
			
		||||
  testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  if (argc != 2) {
 | 
			
		||||
    cout << "Usage: gtest_env_var_test_ NAME_OF_FLAG\n";
 | 
			
		||||
    return 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  testing::PrintFlag(argv[1]);
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,192 +0,0 @@
 | 
			
		|||
// Copyright 2007, 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)
 | 
			
		||||
//
 | 
			
		||||
// Tests using global test environments.
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#define GTEST_IMPLEMENTATION_ 1  // Required for the next #include.
 | 
			
		||||
#include "src/gtest-internal-inl.h"
 | 
			
		||||
#undef GTEST_IMPLEMENTATION_
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
GTEST_DECLARE_string_(filter);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
enum FailureType {
 | 
			
		||||
  NO_FAILURE, NON_FATAL_FAILURE, FATAL_FAILURE
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// For testing using global test environments.
 | 
			
		||||
class MyEnvironment : public testing::Environment {
 | 
			
		||||
 public:
 | 
			
		||||
  MyEnvironment() { Reset(); }
 | 
			
		||||
 | 
			
		||||
  // Depending on the value of failure_in_set_up_, SetUp() will
 | 
			
		||||
  // generate a non-fatal failure, generate a fatal failure, or
 | 
			
		||||
  // succeed.
 | 
			
		||||
  virtual void SetUp() {
 | 
			
		||||
    set_up_was_run_ = true;
 | 
			
		||||
 | 
			
		||||
    switch (failure_in_set_up_) {
 | 
			
		||||
      case NON_FATAL_FAILURE:
 | 
			
		||||
        ADD_FAILURE() << "Expected non-fatal failure in global set-up.";
 | 
			
		||||
        break;
 | 
			
		||||
      case FATAL_FAILURE:
 | 
			
		||||
        FAIL() << "Expected fatal failure in global set-up.";
 | 
			
		||||
        break;
 | 
			
		||||
      default:
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Generates a non-fatal failure.
 | 
			
		||||
  virtual void TearDown() {
 | 
			
		||||
    tear_down_was_run_ = true;
 | 
			
		||||
    ADD_FAILURE() << "Expected non-fatal failure in global tear-down.";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Resets the state of the environment s.t. it can be reused.
 | 
			
		||||
  void Reset() {
 | 
			
		||||
    failure_in_set_up_ = NO_FAILURE;
 | 
			
		||||
    set_up_was_run_ = false;
 | 
			
		||||
    tear_down_was_run_ = false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // We call this function to set the type of failure SetUp() should
 | 
			
		||||
  // generate.
 | 
			
		||||
  void set_failure_in_set_up(FailureType type) {
 | 
			
		||||
    failure_in_set_up_ = type;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Was SetUp() run?
 | 
			
		||||
  bool set_up_was_run() const { return set_up_was_run_; }
 | 
			
		||||
 | 
			
		||||
  // Was TearDown() run?
 | 
			
		||||
  bool tear_down_was_run() const { return tear_down_was_run_; }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  FailureType failure_in_set_up_;
 | 
			
		||||
  bool set_up_was_run_;
 | 
			
		||||
  bool tear_down_was_run_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Was the TEST run?
 | 
			
		||||
bool test_was_run;
 | 
			
		||||
 | 
			
		||||
// The sole purpose of this TEST is to enable us to check whether it
 | 
			
		||||
// was run.
 | 
			
		||||
TEST(FooTest, Bar) {
 | 
			
		||||
  test_was_run = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Prints the message and aborts the program if condition is false.
 | 
			
		||||
void Check(bool condition, const char* msg) {
 | 
			
		||||
  if (!condition) {
 | 
			
		||||
    printf("FAILED: %s\n", msg);
 | 
			
		||||
    testing::internal::posix::Abort();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Runs the tests.  Return true iff successful.
 | 
			
		||||
//
 | 
			
		||||
// The 'failure' parameter specifies the type of failure that should
 | 
			
		||||
// be generated by the global set-up.
 | 
			
		||||
int RunAllTests(MyEnvironment* env, FailureType failure) {
 | 
			
		||||
  env->Reset();
 | 
			
		||||
  env->set_failure_in_set_up(failure);
 | 
			
		||||
  test_was_run = false;
 | 
			
		||||
  testing::internal::GetUnitTestImpl()->ClearAdHocTestResult();
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  // Registers a global test environment, and verifies that the
 | 
			
		||||
  // registration function returns its argument.
 | 
			
		||||
  MyEnvironment* const env = new MyEnvironment;
 | 
			
		||||
  Check(testing::AddGlobalTestEnvironment(env) == env,
 | 
			
		||||
        "AddGlobalTestEnvironment() should return its argument.");
 | 
			
		||||
 | 
			
		||||
  // Verifies that RUN_ALL_TESTS() runs the tests when the global
 | 
			
		||||
  // set-up is successful.
 | 
			
		||||
  Check(RunAllTests(env, NO_FAILURE) != 0,
 | 
			
		||||
        "RUN_ALL_TESTS() should return non-zero, as the global tear-down "
 | 
			
		||||
        "should generate a failure.");
 | 
			
		||||
  Check(test_was_run,
 | 
			
		||||
        "The tests should run, as the global set-up should generate no "
 | 
			
		||||
        "failure");
 | 
			
		||||
  Check(env->tear_down_was_run(),
 | 
			
		||||
        "The global tear-down should run, as the global set-up was run.");
 | 
			
		||||
 | 
			
		||||
  // Verifies that RUN_ALL_TESTS() runs the tests when the global
 | 
			
		||||
  // set-up generates no fatal failure.
 | 
			
		||||
  Check(RunAllTests(env, NON_FATAL_FAILURE) != 0,
 | 
			
		||||
        "RUN_ALL_TESTS() should return non-zero, as both the global set-up "
 | 
			
		||||
        "and the global tear-down should generate a non-fatal failure.");
 | 
			
		||||
  Check(test_was_run,
 | 
			
		||||
        "The tests should run, as the global set-up should generate no "
 | 
			
		||||
        "fatal failure.");
 | 
			
		||||
  Check(env->tear_down_was_run(),
 | 
			
		||||
        "The global tear-down should run, as the global set-up was run.");
 | 
			
		||||
 | 
			
		||||
  // Verifies that RUN_ALL_TESTS() runs no test when the global set-up
 | 
			
		||||
  // generates a fatal failure.
 | 
			
		||||
  Check(RunAllTests(env, FATAL_FAILURE) != 0,
 | 
			
		||||
        "RUN_ALL_TESTS() should return non-zero, as the global set-up "
 | 
			
		||||
        "should generate a fatal failure.");
 | 
			
		||||
  Check(!test_was_run,
 | 
			
		||||
        "The tests should not run, as the global set-up should generate "
 | 
			
		||||
        "a fatal failure.");
 | 
			
		||||
  Check(env->tear_down_was_run(),
 | 
			
		||||
        "The global tear-down should run, as the global set-up was run.");
 | 
			
		||||
 | 
			
		||||
  // Verifies that RUN_ALL_TESTS() doesn't do global set-up or
 | 
			
		||||
  // tear-down when there is no test to run.
 | 
			
		||||
  testing::GTEST_FLAG(filter) = "-*";
 | 
			
		||||
  Check(RunAllTests(env, NO_FAILURE) == 0,
 | 
			
		||||
        "RUN_ALL_TESTS() should return zero, as there is no test to run.");
 | 
			
		||||
  Check(!env->set_up_was_run(),
 | 
			
		||||
        "The global set-up should not run, as there is no test to run.");
 | 
			
		||||
  Check(!env->tear_down_was_run(),
 | 
			
		||||
        "The global tear-down should not run, "
 | 
			
		||||
        "as the global set-up was not run.");
 | 
			
		||||
 | 
			
		||||
  printf("PASS\n");
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,633 +0,0 @@
 | 
			
		|||
#!/usr/bin/env python
 | 
			
		||||
#
 | 
			
		||||
# Copyright 2005 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.
 | 
			
		||||
 | 
			
		||||
"""Unit test for Google Test test filters.
 | 
			
		||||
 | 
			
		||||
A user can specify which test(s) in a Google Test program to run via either
 | 
			
		||||
the GTEST_FILTER environment variable or the --gtest_filter flag.
 | 
			
		||||
This script tests such functionality by invoking
 | 
			
		||||
gtest_filter_unittest_ (a program written with Google Test) with different
 | 
			
		||||
environments and command line flags.
 | 
			
		||||
 | 
			
		||||
Note that test sharding may also influence which tests are filtered. Therefore,
 | 
			
		||||
we test that here also.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
__author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import re
 | 
			
		||||
import sets
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
 | 
			
		||||
# Constants.
 | 
			
		||||
 | 
			
		||||
# Checks if this platform can pass empty environment variables to child
 | 
			
		||||
# processes.  We set an env variable to an empty string and invoke a python
 | 
			
		||||
# script in a subprocess to print whether the variable is STILL in
 | 
			
		||||
# os.environ.  We then use 'eval' to parse the child's output so that an
 | 
			
		||||
# exception is thrown if the input is anything other than 'True' nor 'False'.
 | 
			
		||||
os.environ['EMPTY_VAR'] = ''
 | 
			
		||||
child = gtest_test_utils.Subprocess(
 | 
			
		||||
    [sys.executable, '-c', 'import os; print \'EMPTY_VAR\' in os.environ'])
 | 
			
		||||
CAN_PASS_EMPTY_ENV = eval(child.output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Check if this platform can unset environment variables in child processes.
 | 
			
		||||
# We set an env variable to a non-empty string, unset it, and invoke
 | 
			
		||||
# a python script in a subprocess to print whether the variable
 | 
			
		||||
# is NO LONGER in os.environ.
 | 
			
		||||
# We use 'eval' to parse the child's output so that an exception
 | 
			
		||||
# is thrown if the input is neither 'True' nor 'False'.
 | 
			
		||||
os.environ['UNSET_VAR'] = 'X'
 | 
			
		||||
del os.environ['UNSET_VAR']
 | 
			
		||||
child = gtest_test_utils.Subprocess(
 | 
			
		||||
    [sys.executable, '-c', 'import os; print \'UNSET_VAR\' not in os.environ'])
 | 
			
		||||
CAN_UNSET_ENV = eval(child.output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Checks if we should test with an empty filter. This doesn't
 | 
			
		||||
# make sense on platforms that cannot pass empty env variables (Win32)
 | 
			
		||||
# and on platforms that cannot unset variables (since we cannot tell
 | 
			
		||||
# the difference between "" and NULL -- Borland and Solaris < 5.10)
 | 
			
		||||
CAN_TEST_EMPTY_FILTER = (CAN_PASS_EMPTY_ENV and CAN_UNSET_ENV)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# The environment variable for specifying the test filters.
 | 
			
		||||
FILTER_ENV_VAR = 'GTEST_FILTER'
 | 
			
		||||
 | 
			
		||||
# The environment variables for test sharding.
 | 
			
		||||
TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
 | 
			
		||||
SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
 | 
			
		||||
SHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'
 | 
			
		||||
 | 
			
		||||
# The command line flag for specifying the test filters.
 | 
			
		||||
FILTER_FLAG = 'gtest_filter'
 | 
			
		||||
 | 
			
		||||
# The command line flag for including disabled tests.
 | 
			
		||||
ALSO_RUN_DISABED_TESTS_FLAG = 'gtest_also_run_disabled_tests'
 | 
			
		||||
 | 
			
		||||
# Command to run the gtest_filter_unittest_ program.
 | 
			
		||||
COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_filter_unittest_')
 | 
			
		||||
 | 
			
		||||
# Regex for determining whether parameterized tests are enabled in the binary.
 | 
			
		||||
PARAM_TEST_REGEX = re.compile(r'/ParamTest')
 | 
			
		||||
 | 
			
		||||
# Regex for parsing test case names from Google Test's output.
 | 
			
		||||
TEST_CASE_REGEX = re.compile(r'^\[\-+\] \d+ tests? from (\w+(/\w+)?)')
 | 
			
		||||
 | 
			
		||||
# Regex for parsing test names from Google Test's output.
 | 
			
		||||
TEST_REGEX = re.compile(r'^\[\s*RUN\s*\].*\.(\w+(/\w+)?)')
 | 
			
		||||
 | 
			
		||||
# The command line flag to tell Google Test to output the list of tests it
 | 
			
		||||
# will run.
 | 
			
		||||
LIST_TESTS_FLAG = '--gtest_list_tests'
 | 
			
		||||
 | 
			
		||||
# Indicates whether Google Test supports death tests.
 | 
			
		||||
SUPPORTS_DEATH_TESTS = 'HasDeathTest' in gtest_test_utils.Subprocess(
 | 
			
		||||
    [COMMAND, LIST_TESTS_FLAG]).output
 | 
			
		||||
 | 
			
		||||
# Full names of all tests in gtest_filter_unittests_.
 | 
			
		||||
PARAM_TESTS = [
 | 
			
		||||
    'SeqP/ParamTest.TestX/0',
 | 
			
		||||
    'SeqP/ParamTest.TestX/1',
 | 
			
		||||
    'SeqP/ParamTest.TestY/0',
 | 
			
		||||
    'SeqP/ParamTest.TestY/1',
 | 
			
		||||
    'SeqQ/ParamTest.TestX/0',
 | 
			
		||||
    'SeqQ/ParamTest.TestX/1',
 | 
			
		||||
    'SeqQ/ParamTest.TestY/0',
 | 
			
		||||
    'SeqQ/ParamTest.TestY/1',
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
DISABLED_TESTS = [
 | 
			
		||||
    'BarTest.DISABLED_TestFour',
 | 
			
		||||
    'BarTest.DISABLED_TestFive',
 | 
			
		||||
    'BazTest.DISABLED_TestC',
 | 
			
		||||
    'DISABLED_FoobarTest.Test1',
 | 
			
		||||
    'DISABLED_FoobarTest.DISABLED_Test2',
 | 
			
		||||
    'DISABLED_FoobarbazTest.TestA',
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
if SUPPORTS_DEATH_TESTS:
 | 
			
		||||
  DEATH_TESTS = [
 | 
			
		||||
    'HasDeathTest.Test1',
 | 
			
		||||
    'HasDeathTest.Test2',
 | 
			
		||||
    ]
 | 
			
		||||
else:
 | 
			
		||||
  DEATH_TESTS = []
 | 
			
		||||
 | 
			
		||||
# All the non-disabled tests.
 | 
			
		||||
ACTIVE_TESTS = [
 | 
			
		||||
    'FooTest.Abc',
 | 
			
		||||
    'FooTest.Xyz',
 | 
			
		||||
 | 
			
		||||
    'BarTest.TestOne',
 | 
			
		||||
    'BarTest.TestTwo',
 | 
			
		||||
    'BarTest.TestThree',
 | 
			
		||||
 | 
			
		||||
    'BazTest.TestOne',
 | 
			
		||||
    'BazTest.TestA',
 | 
			
		||||
    'BazTest.TestB',
 | 
			
		||||
    ] + DEATH_TESTS + PARAM_TESTS
 | 
			
		||||
 | 
			
		||||
param_tests_present = None
 | 
			
		||||
 | 
			
		||||
# Utilities.
 | 
			
		||||
 | 
			
		||||
environ = os.environ.copy()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def SetEnvVar(env_var, value):
 | 
			
		||||
  """Sets the env variable to 'value'; unsets it when 'value' is None."""
 | 
			
		||||
 | 
			
		||||
  if value is not None:
 | 
			
		||||
    environ[env_var] = value
 | 
			
		||||
  elif env_var in environ:
 | 
			
		||||
    del environ[env_var]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RunAndReturnOutput(args = None):
 | 
			
		||||
  """Runs the test program and returns its output."""
 | 
			
		||||
 | 
			
		||||
  return gtest_test_utils.Subprocess([COMMAND] + (args or []),
 | 
			
		||||
                                     env=environ).output
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RunAndExtractTestList(args = None):
 | 
			
		||||
  """Runs the test program and returns its exit code and a list of tests run."""
 | 
			
		||||
 | 
			
		||||
  p = gtest_test_utils.Subprocess([COMMAND] + (args or []), env=environ)
 | 
			
		||||
  tests_run = []
 | 
			
		||||
  test_case = ''
 | 
			
		||||
  test = ''
 | 
			
		||||
  for line in p.output.split('\n'):
 | 
			
		||||
    match = TEST_CASE_REGEX.match(line)
 | 
			
		||||
    if match is not None:
 | 
			
		||||
      test_case = match.group(1)
 | 
			
		||||
    else:
 | 
			
		||||
      match = TEST_REGEX.match(line)
 | 
			
		||||
      if match is not None:
 | 
			
		||||
        test = match.group(1)
 | 
			
		||||
        tests_run.append(test_case + '.' + test)
 | 
			
		||||
  return (tests_run, p.exit_code)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def InvokeWithModifiedEnv(extra_env, function, *args, **kwargs):
 | 
			
		||||
  """Runs the given function and arguments in a modified environment."""
 | 
			
		||||
  try:
 | 
			
		||||
    original_env = environ.copy()
 | 
			
		||||
    environ.update(extra_env)
 | 
			
		||||
    return function(*args, **kwargs)
 | 
			
		||||
  finally:
 | 
			
		||||
    environ.clear()
 | 
			
		||||
    environ.update(original_env)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RunWithSharding(total_shards, shard_index, command):
 | 
			
		||||
  """Runs a test program shard and returns exit code and a list of tests run."""
 | 
			
		||||
 | 
			
		||||
  extra_env = {SHARD_INDEX_ENV_VAR: str(shard_index),
 | 
			
		||||
               TOTAL_SHARDS_ENV_VAR: str(total_shards)}
 | 
			
		||||
  return InvokeWithModifiedEnv(extra_env, RunAndExtractTestList, command)
 | 
			
		||||
 | 
			
		||||
# The unit test.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GTestFilterUnitTest(gtest_test_utils.TestCase):
 | 
			
		||||
  """Tests the env variable or the command line flag to filter tests."""
 | 
			
		||||
 | 
			
		||||
  # Utilities.
 | 
			
		||||
 | 
			
		||||
  def AssertSetEqual(self, lhs, rhs):
 | 
			
		||||
    """Asserts that two sets are equal."""
 | 
			
		||||
 | 
			
		||||
    for elem in lhs:
 | 
			
		||||
      self.assert_(elem in rhs, '%s in %s' % (elem, rhs))
 | 
			
		||||
 | 
			
		||||
    for elem in rhs:
 | 
			
		||||
      self.assert_(elem in lhs, '%s in %s' % (elem, lhs))
 | 
			
		||||
 | 
			
		||||
  def AssertPartitionIsValid(self, set_var, list_of_sets):
 | 
			
		||||
    """Asserts that list_of_sets is a valid partition of set_var."""
 | 
			
		||||
 | 
			
		||||
    full_partition = []
 | 
			
		||||
    for slice_var in list_of_sets:
 | 
			
		||||
      full_partition.extend(slice_var)
 | 
			
		||||
    self.assertEqual(len(set_var), len(full_partition))
 | 
			
		||||
    self.assertEqual(sets.Set(set_var), sets.Set(full_partition))
 | 
			
		||||
 | 
			
		||||
  def AdjustForParameterizedTests(self, tests_to_run):
 | 
			
		||||
    """Adjust tests_to_run in case value parameterized tests are disabled."""
 | 
			
		||||
 | 
			
		||||
    global param_tests_present
 | 
			
		||||
    if not param_tests_present:
 | 
			
		||||
      return list(sets.Set(tests_to_run) - sets.Set(PARAM_TESTS))
 | 
			
		||||
    else:
 | 
			
		||||
      return tests_to_run
 | 
			
		||||
 | 
			
		||||
  def RunAndVerify(self, gtest_filter, tests_to_run):
 | 
			
		||||
    """Checks that the binary runs correct set of tests for a given filter."""
 | 
			
		||||
 | 
			
		||||
    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
 | 
			
		||||
 | 
			
		||||
    # First, tests using the environment variable.
 | 
			
		||||
 | 
			
		||||
    # Windows removes empty variables from the environment when passing it
 | 
			
		||||
    # to a new process.  This means it is impossible to pass an empty filter
 | 
			
		||||
    # into a process using the environment variable.  However, we can still
 | 
			
		||||
    # test the case when the variable is not supplied (i.e., gtest_filter is
 | 
			
		||||
    # None).
 | 
			
		||||
    # pylint: disable-msg=C6403
 | 
			
		||||
    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
 | 
			
		||||
      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
 | 
			
		||||
      tests_run = RunAndExtractTestList()[0]
 | 
			
		||||
      SetEnvVar(FILTER_ENV_VAR, None)
 | 
			
		||||
      self.AssertSetEqual(tests_run, tests_to_run)
 | 
			
		||||
    # pylint: enable-msg=C6403
 | 
			
		||||
 | 
			
		||||
    # Next, tests using the command line flag.
 | 
			
		||||
 | 
			
		||||
    if gtest_filter is None:
 | 
			
		||||
      args = []
 | 
			
		||||
    else:
 | 
			
		||||
      args = ['--%s=%s' % (FILTER_FLAG, gtest_filter)]
 | 
			
		||||
 | 
			
		||||
    tests_run = RunAndExtractTestList(args)[0]
 | 
			
		||||
    self.AssertSetEqual(tests_run, tests_to_run)
 | 
			
		||||
 | 
			
		||||
  def RunAndVerifyWithSharding(self, gtest_filter, total_shards, tests_to_run,
 | 
			
		||||
                               args=None, check_exit_0=False):
 | 
			
		||||
    """Checks that binary runs correct tests for the given filter and shard.
 | 
			
		||||
 | 
			
		||||
    Runs all shards of gtest_filter_unittest_ with the given filter, and
 | 
			
		||||
    verifies that the right set of tests were run. The union of tests run
 | 
			
		||||
    on each shard should be identical to tests_to_run, without duplicates.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
      gtest_filter: A filter to apply to the tests.
 | 
			
		||||
      total_shards: A total number of shards to split test run into.
 | 
			
		||||
      tests_to_run: A set of tests expected to run.
 | 
			
		||||
      args   :      Arguments to pass to the to the test binary.
 | 
			
		||||
      check_exit_0: When set to a true value, make sure that all shards
 | 
			
		||||
                    return 0.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
 | 
			
		||||
 | 
			
		||||
    # Windows removes empty variables from the environment when passing it
 | 
			
		||||
    # to a new process.  This means it is impossible to pass an empty filter
 | 
			
		||||
    # into a process using the environment variable.  However, we can still
 | 
			
		||||
    # test the case when the variable is not supplied (i.e., gtest_filter is
 | 
			
		||||
    # None).
 | 
			
		||||
    # pylint: disable-msg=C6403
 | 
			
		||||
    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
 | 
			
		||||
      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
 | 
			
		||||
      partition = []
 | 
			
		||||
      for i in range(0, total_shards):
 | 
			
		||||
        (tests_run, exit_code) = RunWithSharding(total_shards, i, args)
 | 
			
		||||
        if check_exit_0:
 | 
			
		||||
          self.assertEqual(0, exit_code)
 | 
			
		||||
        partition.append(tests_run)
 | 
			
		||||
 | 
			
		||||
      self.AssertPartitionIsValid(tests_to_run, partition)
 | 
			
		||||
      SetEnvVar(FILTER_ENV_VAR, None)
 | 
			
		||||
    # pylint: enable-msg=C6403
 | 
			
		||||
 | 
			
		||||
  def RunAndVerifyAllowingDisabled(self, gtest_filter, tests_to_run):
 | 
			
		||||
    """Checks that the binary runs correct set of tests for the given filter.
 | 
			
		||||
 | 
			
		||||
    Runs gtest_filter_unittest_ with the given filter, and enables
 | 
			
		||||
    disabled tests. Verifies that the right set of tests were run.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
      gtest_filter: A filter to apply to the tests.
 | 
			
		||||
      tests_to_run: A set of tests expected to run.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
 | 
			
		||||
 | 
			
		||||
    # Construct the command line.
 | 
			
		||||
    args = ['--%s' % ALSO_RUN_DISABED_TESTS_FLAG]
 | 
			
		||||
    if gtest_filter is not None:
 | 
			
		||||
      args.append('--%s=%s' % (FILTER_FLAG, gtest_filter))
 | 
			
		||||
 | 
			
		||||
    tests_run = RunAndExtractTestList(args)[0]
 | 
			
		||||
    self.AssertSetEqual(tests_run, tests_to_run)
 | 
			
		||||
 | 
			
		||||
  def setUp(self):
 | 
			
		||||
    """Sets up test case.
 | 
			
		||||
 | 
			
		||||
    Determines whether value-parameterized tests are enabled in the binary and
 | 
			
		||||
    sets the flags accordingly.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    global param_tests_present
 | 
			
		||||
    if param_tests_present is None:
 | 
			
		||||
      param_tests_present = PARAM_TEST_REGEX.search(
 | 
			
		||||
          RunAndReturnOutput()) is not None
 | 
			
		||||
 | 
			
		||||
  def testDefaultBehavior(self):
 | 
			
		||||
    """Tests the behavior of not specifying the filter."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify(None, ACTIVE_TESTS)
 | 
			
		||||
 | 
			
		||||
  def testDefaultBehaviorWithShards(self):
 | 
			
		||||
    """Tests the behavior without the filter, with sharding enabled."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerifyWithSharding(None, 1, ACTIVE_TESTS)
 | 
			
		||||
    self.RunAndVerifyWithSharding(None, 2, ACTIVE_TESTS)
 | 
			
		||||
    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) - 1, ACTIVE_TESTS)
 | 
			
		||||
    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS), ACTIVE_TESTS)
 | 
			
		||||
    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) + 1, ACTIVE_TESTS)
 | 
			
		||||
 | 
			
		||||
  def testEmptyFilter(self):
 | 
			
		||||
    """Tests an empty filter."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('', [])
 | 
			
		||||
    self.RunAndVerifyWithSharding('', 1, [])
 | 
			
		||||
    self.RunAndVerifyWithSharding('', 2, [])
 | 
			
		||||
 | 
			
		||||
  def testBadFilter(self):
 | 
			
		||||
    """Tests a filter that matches nothing."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('BadFilter', [])
 | 
			
		||||
    self.RunAndVerifyAllowingDisabled('BadFilter', [])
 | 
			
		||||
 | 
			
		||||
  def testFullName(self):
 | 
			
		||||
    """Tests filtering by full name."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz'])
 | 
			
		||||
    self.RunAndVerifyAllowingDisabled('FooTest.Xyz', ['FooTest.Xyz'])
 | 
			
		||||
    self.RunAndVerifyWithSharding('FooTest.Xyz', 5, ['FooTest.Xyz'])
 | 
			
		||||
 | 
			
		||||
  def testUniversalFilters(self):
 | 
			
		||||
    """Tests filters that match everything."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('*', ACTIVE_TESTS)
 | 
			
		||||
    self.RunAndVerify('*.*', ACTIVE_TESTS)
 | 
			
		||||
    self.RunAndVerifyWithSharding('*.*', len(ACTIVE_TESTS) - 3, ACTIVE_TESTS)
 | 
			
		||||
    self.RunAndVerifyAllowingDisabled('*', ACTIVE_TESTS + DISABLED_TESTS)
 | 
			
		||||
    self.RunAndVerifyAllowingDisabled('*.*', ACTIVE_TESTS + DISABLED_TESTS)
 | 
			
		||||
 | 
			
		||||
  def testFilterByTestCase(self):
 | 
			
		||||
    """Tests filtering by test case name."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz'])
 | 
			
		||||
 | 
			
		||||
    BAZ_TESTS = ['BazTest.TestOne', 'BazTest.TestA', 'BazTest.TestB']
 | 
			
		||||
    self.RunAndVerify('BazTest.*', BAZ_TESTS)
 | 
			
		||||
    self.RunAndVerifyAllowingDisabled('BazTest.*',
 | 
			
		||||
                                      BAZ_TESTS + ['BazTest.DISABLED_TestC'])
 | 
			
		||||
 | 
			
		||||
  def testFilterByTest(self):
 | 
			
		||||
    """Tests filtering by test name."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('*.TestOne', ['BarTest.TestOne', 'BazTest.TestOne'])
 | 
			
		||||
 | 
			
		||||
  def testFilterDisabledTests(self):
 | 
			
		||||
    """Select only the disabled tests to run."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('DISABLED_FoobarTest.Test1', [])
 | 
			
		||||
    self.RunAndVerifyAllowingDisabled('DISABLED_FoobarTest.Test1',
 | 
			
		||||
                                      ['DISABLED_FoobarTest.Test1'])
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('*DISABLED_*', [])
 | 
			
		||||
    self.RunAndVerifyAllowingDisabled('*DISABLED_*', DISABLED_TESTS)
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('*.DISABLED_*', [])
 | 
			
		||||
    self.RunAndVerifyAllowingDisabled('*.DISABLED_*', [
 | 
			
		||||
        'BarTest.DISABLED_TestFour',
 | 
			
		||||
        'BarTest.DISABLED_TestFive',
 | 
			
		||||
        'BazTest.DISABLED_TestC',
 | 
			
		||||
        'DISABLED_FoobarTest.DISABLED_Test2',
 | 
			
		||||
        ])
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('DISABLED_*', [])
 | 
			
		||||
    self.RunAndVerifyAllowingDisabled('DISABLED_*', [
 | 
			
		||||
        'DISABLED_FoobarTest.Test1',
 | 
			
		||||
        'DISABLED_FoobarTest.DISABLED_Test2',
 | 
			
		||||
        'DISABLED_FoobarbazTest.TestA',
 | 
			
		||||
        ])
 | 
			
		||||
 | 
			
		||||
  def testWildcardInTestCaseName(self):
 | 
			
		||||
    """Tests using wildcard in the test case name."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('*a*.*', [
 | 
			
		||||
        'BarTest.TestOne',
 | 
			
		||||
        'BarTest.TestTwo',
 | 
			
		||||
        'BarTest.TestThree',
 | 
			
		||||
 | 
			
		||||
        'BazTest.TestOne',
 | 
			
		||||
        'BazTest.TestA',
 | 
			
		||||
        'BazTest.TestB', ] + DEATH_TESTS + PARAM_TESTS)
 | 
			
		||||
 | 
			
		||||
  def testWildcardInTestName(self):
 | 
			
		||||
    """Tests using wildcard in the test name."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('*.*A*', ['FooTest.Abc', 'BazTest.TestA'])
 | 
			
		||||
 | 
			
		||||
  def testFilterWithoutDot(self):
 | 
			
		||||
    """Tests a filter that has no '.' in it."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('*z*', [
 | 
			
		||||
        'FooTest.Xyz',
 | 
			
		||||
 | 
			
		||||
        'BazTest.TestOne',
 | 
			
		||||
        'BazTest.TestA',
 | 
			
		||||
        'BazTest.TestB',
 | 
			
		||||
        ])
 | 
			
		||||
 | 
			
		||||
  def testTwoPatterns(self):
 | 
			
		||||
    """Tests filters that consist of two patterns."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('Foo*.*:*A*', [
 | 
			
		||||
        'FooTest.Abc',
 | 
			
		||||
        'FooTest.Xyz',
 | 
			
		||||
 | 
			
		||||
        'BazTest.TestA',
 | 
			
		||||
        ])
 | 
			
		||||
 | 
			
		||||
    # An empty pattern + a non-empty one
 | 
			
		||||
    self.RunAndVerify(':*A*', ['FooTest.Abc', 'BazTest.TestA'])
 | 
			
		||||
 | 
			
		||||
  def testThreePatterns(self):
 | 
			
		||||
    """Tests filters that consist of three patterns."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('*oo*:*A*:*One', [
 | 
			
		||||
        'FooTest.Abc',
 | 
			
		||||
        'FooTest.Xyz',
 | 
			
		||||
 | 
			
		||||
        'BarTest.TestOne',
 | 
			
		||||
 | 
			
		||||
        'BazTest.TestOne',
 | 
			
		||||
        'BazTest.TestA',
 | 
			
		||||
        ])
 | 
			
		||||
 | 
			
		||||
    # The 2nd pattern is empty.
 | 
			
		||||
    self.RunAndVerify('*oo*::*One', [
 | 
			
		||||
        'FooTest.Abc',
 | 
			
		||||
        'FooTest.Xyz',
 | 
			
		||||
 | 
			
		||||
        'BarTest.TestOne',
 | 
			
		||||
 | 
			
		||||
        'BazTest.TestOne',
 | 
			
		||||
        ])
 | 
			
		||||
 | 
			
		||||
    # The last 2 patterns are empty.
 | 
			
		||||
    self.RunAndVerify('*oo*::', [
 | 
			
		||||
        'FooTest.Abc',
 | 
			
		||||
        'FooTest.Xyz',
 | 
			
		||||
        ])
 | 
			
		||||
 | 
			
		||||
  def testNegativeFilters(self):
 | 
			
		||||
    self.RunAndVerify('*-BazTest.TestOne', [
 | 
			
		||||
        'FooTest.Abc',
 | 
			
		||||
        'FooTest.Xyz',
 | 
			
		||||
 | 
			
		||||
        'BarTest.TestOne',
 | 
			
		||||
        'BarTest.TestTwo',
 | 
			
		||||
        'BarTest.TestThree',
 | 
			
		||||
 | 
			
		||||
        'BazTest.TestA',
 | 
			
		||||
        'BazTest.TestB',
 | 
			
		||||
        ] + DEATH_TESTS + PARAM_TESTS)
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('*-FooTest.Abc:BazTest.*', [
 | 
			
		||||
        'FooTest.Xyz',
 | 
			
		||||
 | 
			
		||||
        'BarTest.TestOne',
 | 
			
		||||
        'BarTest.TestTwo',
 | 
			
		||||
        'BarTest.TestThree',
 | 
			
		||||
        ] + DEATH_TESTS + PARAM_TESTS)
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify('BarTest.*-BarTest.TestOne', [
 | 
			
		||||
        'BarTest.TestTwo',
 | 
			
		||||
        'BarTest.TestThree',
 | 
			
		||||
        ])
 | 
			
		||||
 | 
			
		||||
    # Tests without leading '*'.
 | 
			
		||||
    self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:BazTest.*', [
 | 
			
		||||
        'BarTest.TestOne',
 | 
			
		||||
        'BarTest.TestTwo',
 | 
			
		||||
        'BarTest.TestThree',
 | 
			
		||||
        ] + DEATH_TESTS + PARAM_TESTS)
 | 
			
		||||
 | 
			
		||||
    # Value parameterized tests.
 | 
			
		||||
    self.RunAndVerify('*/*', PARAM_TESTS)
 | 
			
		||||
 | 
			
		||||
    # Value parameterized tests filtering by the sequence name.
 | 
			
		||||
    self.RunAndVerify('SeqP/*', [
 | 
			
		||||
        'SeqP/ParamTest.TestX/0',
 | 
			
		||||
        'SeqP/ParamTest.TestX/1',
 | 
			
		||||
        'SeqP/ParamTest.TestY/0',
 | 
			
		||||
        'SeqP/ParamTest.TestY/1',
 | 
			
		||||
        ])
 | 
			
		||||
 | 
			
		||||
    # Value parameterized tests filtering by the test name.
 | 
			
		||||
    self.RunAndVerify('*/0', [
 | 
			
		||||
        'SeqP/ParamTest.TestX/0',
 | 
			
		||||
        'SeqP/ParamTest.TestY/0',
 | 
			
		||||
        'SeqQ/ParamTest.TestX/0',
 | 
			
		||||
        'SeqQ/ParamTest.TestY/0',
 | 
			
		||||
        ])
 | 
			
		||||
 | 
			
		||||
  def testFlagOverridesEnvVar(self):
 | 
			
		||||
    """Tests that the filter flag overrides the filtering env. variable."""
 | 
			
		||||
 | 
			
		||||
    SetEnvVar(FILTER_ENV_VAR, 'Foo*')
 | 
			
		||||
    args = ['--%s=%s' % (FILTER_FLAG, '*One')]
 | 
			
		||||
    tests_run = RunAndExtractTestList(args)[0]
 | 
			
		||||
    SetEnvVar(FILTER_ENV_VAR, None)
 | 
			
		||||
 | 
			
		||||
    self.AssertSetEqual(tests_run, ['BarTest.TestOne', 'BazTest.TestOne'])
 | 
			
		||||
 | 
			
		||||
  def testShardStatusFileIsCreated(self):
 | 
			
		||||
    """Tests that the shard file is created if specified in the environment."""
 | 
			
		||||
 | 
			
		||||
    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
 | 
			
		||||
                                     'shard_status_file')
 | 
			
		||||
    self.assert_(not os.path.exists(shard_status_file))
 | 
			
		||||
 | 
			
		||||
    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
 | 
			
		||||
    try:
 | 
			
		||||
      InvokeWithModifiedEnv(extra_env, RunAndReturnOutput)
 | 
			
		||||
    finally:
 | 
			
		||||
      self.assert_(os.path.exists(shard_status_file))
 | 
			
		||||
      os.remove(shard_status_file)
 | 
			
		||||
 | 
			
		||||
  def testShardStatusFileIsCreatedWithListTests(self):
 | 
			
		||||
    """Tests that the shard file is created with the "list_tests" flag."""
 | 
			
		||||
 | 
			
		||||
    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
 | 
			
		||||
                                     'shard_status_file2')
 | 
			
		||||
    self.assert_(not os.path.exists(shard_status_file))
 | 
			
		||||
 | 
			
		||||
    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
 | 
			
		||||
    try:
 | 
			
		||||
      output = InvokeWithModifiedEnv(extra_env,
 | 
			
		||||
                                     RunAndReturnOutput,
 | 
			
		||||
                                     [LIST_TESTS_FLAG])
 | 
			
		||||
    finally:
 | 
			
		||||
      # This assertion ensures that Google Test enumerated the tests as
 | 
			
		||||
      # opposed to running them.
 | 
			
		||||
      self.assert_('[==========]' not in output,
 | 
			
		||||
                   'Unexpected output during test enumeration.\n'
 | 
			
		||||
                   'Please ensure that LIST_TESTS_FLAG is assigned the\n'
 | 
			
		||||
                   'correct flag value for listing Google Test tests.')
 | 
			
		||||
 | 
			
		||||
      self.assert_(os.path.exists(shard_status_file))
 | 
			
		||||
      os.remove(shard_status_file)
 | 
			
		||||
 | 
			
		||||
  if SUPPORTS_DEATH_TESTS:
 | 
			
		||||
    def testShardingWorksWithDeathTests(self):
 | 
			
		||||
      """Tests integration with death tests and sharding."""
 | 
			
		||||
 | 
			
		||||
      gtest_filter = 'HasDeathTest.*:SeqP/*'
 | 
			
		||||
      expected_tests = [
 | 
			
		||||
          'HasDeathTest.Test1',
 | 
			
		||||
          'HasDeathTest.Test2',
 | 
			
		||||
 | 
			
		||||
          'SeqP/ParamTest.TestX/0',
 | 
			
		||||
          'SeqP/ParamTest.TestX/1',
 | 
			
		||||
          'SeqP/ParamTest.TestY/0',
 | 
			
		||||
          'SeqP/ParamTest.TestY/1',
 | 
			
		||||
          ]
 | 
			
		||||
 | 
			
		||||
      for flag in ['--gtest_death_test_style=threadsafe',
 | 
			
		||||
                   '--gtest_death_test_style=fast']:
 | 
			
		||||
        self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests,
 | 
			
		||||
                                      check_exit_0=True, args=[flag])
 | 
			
		||||
        self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests,
 | 
			
		||||
                                      check_exit_0=True, args=[flag])
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  gtest_test_utils.Main()
 | 
			
		||||
| 
						 | 
				
			
			@ -1,140 +0,0 @@
 | 
			
		|||
// Copyright 2005, 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)
 | 
			
		||||
 | 
			
		||||
// Unit test for Google Test test filters.
 | 
			
		||||
//
 | 
			
		||||
// A user can specify which test(s) in a Google Test program to run via
 | 
			
		||||
// either the GTEST_FILTER environment variable or the --gtest_filter
 | 
			
		||||
// flag.  This is used for testing such functionality.
 | 
			
		||||
//
 | 
			
		||||
// The program will be invoked from a Python unit test.  Don't run it
 | 
			
		||||
// directly.
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
// Test case FooTest.
 | 
			
		||||
 | 
			
		||||
class FooTest : public testing::Test {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(FooTest, Abc) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(FooTest, Xyz) {
 | 
			
		||||
  FAIL() << "Expected failure.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test case BarTest.
 | 
			
		||||
 | 
			
		||||
TEST(BarTest, TestOne) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(BarTest, TestTwo) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(BarTest, TestThree) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(BarTest, DISABLED_TestFour) {
 | 
			
		||||
  FAIL() << "Expected failure.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(BarTest, DISABLED_TestFive) {
 | 
			
		||||
  FAIL() << "Expected failure.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test case BazTest.
 | 
			
		||||
 | 
			
		||||
TEST(BazTest, TestOne) {
 | 
			
		||||
  FAIL() << "Expected failure.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(BazTest, TestA) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(BazTest, TestB) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(BazTest, DISABLED_TestC) {
 | 
			
		||||
  FAIL() << "Expected failure.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test case HasDeathTest
 | 
			
		||||
 | 
			
		||||
TEST(HasDeathTest, Test1) {
 | 
			
		||||
  EXPECT_DEATH_IF_SUPPORTED(exit(1), ".*");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// We need at least two death tests to make sure that the all death tests
 | 
			
		||||
// aren't on the first shard.
 | 
			
		||||
TEST(HasDeathTest, Test2) {
 | 
			
		||||
  EXPECT_DEATH_IF_SUPPORTED(exit(1), ".*");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test case FoobarTest
 | 
			
		||||
 | 
			
		||||
TEST(DISABLED_FoobarTest, Test1) {
 | 
			
		||||
  FAIL() << "Expected failure.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(DISABLED_FoobarTest, DISABLED_Test2) {
 | 
			
		||||
  FAIL() << "Expected failure.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test case FoobarbazTest
 | 
			
		||||
 | 
			
		||||
TEST(DISABLED_FoobarbazTest, TestA) {
 | 
			
		||||
  FAIL() << "Expected failure.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_PARAM_TEST
 | 
			
		||||
class ParamTest : public testing::TestWithParam<int> {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_P(ParamTest, TestX) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_P(ParamTest, TestY) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(SeqP, ParamTest, testing::Values(1, 2));
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(SeqQ, ParamTest, testing::Values(5, 6));
 | 
			
		||||
#endif  // GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  ::testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,172 +0,0 @@
 | 
			
		|||
#!/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.
 | 
			
		||||
 | 
			
		||||
"""Tests the --help flag of Google C++ Testing Framework.
 | 
			
		||||
 | 
			
		||||
SYNOPSIS
 | 
			
		||||
       gtest_help_test.py --build_dir=BUILD/DIR
 | 
			
		||||
         # where BUILD/DIR contains the built gtest_help_test_ file.
 | 
			
		||||
       gtest_help_test.py
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
__author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import re
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
 | 
			
		||||
IS_WINDOWS = os.name == 'nt'
 | 
			
		||||
 | 
			
		||||
PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_help_test_')
 | 
			
		||||
FLAG_PREFIX = '--gtest_'
 | 
			
		||||
DEATH_TEST_STYLE_FLAG = FLAG_PREFIX + 'death_test_style'
 | 
			
		||||
STREAM_RESULT_TO_FLAG = FLAG_PREFIX + 'stream_result_to'
 | 
			
		||||
UNKNOWN_FLAG = FLAG_PREFIX + 'unknown_flag_for_testing'
 | 
			
		||||
LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
 | 
			
		||||
INCORRECT_FLAG_VARIANTS = [re.sub('^--', '-', LIST_TESTS_FLAG),
 | 
			
		||||
                           re.sub('^--', '/', LIST_TESTS_FLAG),
 | 
			
		||||
                           re.sub('_', '-', LIST_TESTS_FLAG)]
 | 
			
		||||
INTERNAL_FLAG_FOR_TESTING = FLAG_PREFIX + 'internal_flag_for_testing'
 | 
			
		||||
 | 
			
		||||
SUPPORTS_DEATH_TESTS = "DeathTest" in gtest_test_utils.Subprocess(
 | 
			
		||||
    [PROGRAM_PATH, LIST_TESTS_FLAG]).output
 | 
			
		||||
 | 
			
		||||
# The help message must match this regex.
 | 
			
		||||
HELP_REGEX = re.compile(
 | 
			
		||||
    FLAG_PREFIX + r'list_tests.*' +
 | 
			
		||||
    FLAG_PREFIX + r'filter=.*' +
 | 
			
		||||
    FLAG_PREFIX + r'also_run_disabled_tests.*' +
 | 
			
		||||
    FLAG_PREFIX + r'repeat=.*' +
 | 
			
		||||
    FLAG_PREFIX + r'shuffle.*' +
 | 
			
		||||
    FLAG_PREFIX + r'random_seed=.*' +
 | 
			
		||||
    FLAG_PREFIX + r'color=.*' +
 | 
			
		||||
    FLAG_PREFIX + r'print_time.*' +
 | 
			
		||||
    FLAG_PREFIX + r'output=.*' +
 | 
			
		||||
    FLAG_PREFIX + r'break_on_failure.*' +
 | 
			
		||||
    FLAG_PREFIX + r'throw_on_failure.*' +
 | 
			
		||||
    FLAG_PREFIX + r'catch_exceptions=0.*',
 | 
			
		||||
    re.DOTALL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RunWithFlag(flag):
 | 
			
		||||
  """Runs gtest_help_test_ with the given flag.
 | 
			
		||||
 | 
			
		||||
  Returns:
 | 
			
		||||
    the exit code and the text output as a tuple.
 | 
			
		||||
  Args:
 | 
			
		||||
    flag: the command-line flag to pass to gtest_help_test_, or None.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  if flag is None:
 | 
			
		||||
    command = [PROGRAM_PATH]
 | 
			
		||||
  else:
 | 
			
		||||
    command = [PROGRAM_PATH, flag]
 | 
			
		||||
  child = gtest_test_utils.Subprocess(command)
 | 
			
		||||
  return child.exit_code, child.output
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GTestHelpTest(gtest_test_utils.TestCase):
 | 
			
		||||
  """Tests the --help flag and its equivalent forms."""
 | 
			
		||||
 | 
			
		||||
  def TestHelpFlag(self, flag):
 | 
			
		||||
    """Verifies correct behavior when help flag is specified.
 | 
			
		||||
 | 
			
		||||
    The right message must be printed and the tests must
 | 
			
		||||
    skipped when the given flag is specified.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
      flag:  A flag to pass to the binary or None.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    exit_code, output = RunWithFlag(flag)
 | 
			
		||||
    self.assertEquals(0, exit_code)
 | 
			
		||||
    self.assert_(HELP_REGEX.search(output), output)
 | 
			
		||||
 | 
			
		||||
    if IS_LINUX:
 | 
			
		||||
      self.assert_(STREAM_RESULT_TO_FLAG in output, output)
 | 
			
		||||
    else:
 | 
			
		||||
      self.assert_(STREAM_RESULT_TO_FLAG not in output, output)
 | 
			
		||||
 | 
			
		||||
    if SUPPORTS_DEATH_TESTS and not IS_WINDOWS:
 | 
			
		||||
      self.assert_(DEATH_TEST_STYLE_FLAG in output, output)
 | 
			
		||||
    else:
 | 
			
		||||
      self.assert_(DEATH_TEST_STYLE_FLAG not in output, output)
 | 
			
		||||
 | 
			
		||||
  def TestNonHelpFlag(self, flag):
 | 
			
		||||
    """Verifies correct behavior when no help flag is specified.
 | 
			
		||||
 | 
			
		||||
    Verifies that when no help flag is specified, the tests are run
 | 
			
		||||
    and the help message is not printed.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
      flag:  A flag to pass to the binary or None.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    exit_code, output = RunWithFlag(flag)
 | 
			
		||||
    self.assert_(exit_code != 0)
 | 
			
		||||
    self.assert_(not HELP_REGEX.search(output), output)
 | 
			
		||||
 | 
			
		||||
  def testPrintsHelpWithFullFlag(self):
 | 
			
		||||
    self.TestHelpFlag('--help')
 | 
			
		||||
 | 
			
		||||
  def testPrintsHelpWithShortFlag(self):
 | 
			
		||||
    self.TestHelpFlag('-h')
 | 
			
		||||
 | 
			
		||||
  def testPrintsHelpWithQuestionFlag(self):
 | 
			
		||||
    self.TestHelpFlag('-?')
 | 
			
		||||
 | 
			
		||||
  def testPrintsHelpWithWindowsStyleQuestionFlag(self):
 | 
			
		||||
    self.TestHelpFlag('/?')
 | 
			
		||||
 | 
			
		||||
  def testPrintsHelpWithUnrecognizedGoogleTestFlag(self):
 | 
			
		||||
    self.TestHelpFlag(UNKNOWN_FLAG)
 | 
			
		||||
 | 
			
		||||
  def testPrintsHelpWithIncorrectFlagStyle(self):
 | 
			
		||||
    for incorrect_flag in INCORRECT_FLAG_VARIANTS:
 | 
			
		||||
      self.TestHelpFlag(incorrect_flag)
 | 
			
		||||
 | 
			
		||||
  def testRunsTestsWithoutHelpFlag(self):
 | 
			
		||||
    """Verifies that when no help flag is specified, the tests are run
 | 
			
		||||
    and the help message is not printed."""
 | 
			
		||||
 | 
			
		||||
    self.TestNonHelpFlag(None)
 | 
			
		||||
 | 
			
		||||
  def testRunsTestsWithGtestInternalFlag(self):
 | 
			
		||||
    """Verifies that the tests are run and no help message is printed when
 | 
			
		||||
    a flag starting with Google Test prefix and 'internal_' is supplied."""
 | 
			
		||||
 | 
			
		||||
    self.TestNonHelpFlag(INTERNAL_FLAG_FOR_TESTING)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  gtest_test_utils.Main()
 | 
			
		||||
| 
						 | 
				
			
			@ -1,46 +0,0 @@
 | 
			
		|||
// 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.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
// This program is meant to be run by gtest_help_test.py.  Do not run
 | 
			
		||||
// it directly.
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
// When a help flag is specified, this program should skip the tests
 | 
			
		||||
// and exit with 0; otherwise the following test will be executed,
 | 
			
		||||
// causing this program to exit with a non-zero code.
 | 
			
		||||
TEST(HelpFlagTest, ShouldNotBeRun) {
 | 
			
		||||
  ASSERT_TRUE(false) << "Tests shouldn't be run when --help is specified.";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_DEATH_TEST
 | 
			
		||||
TEST(DeathTest, UsedByPythonScriptToDetectSupportForDeathTestsInThisBinary) {}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,207 +0,0 @@
 | 
			
		|||
#!/usr/bin/env python
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
 | 
			
		||||
"""Unit test for Google Test's --gtest_list_tests flag.
 | 
			
		||||
 | 
			
		||||
A user can ask Google Test to list all tests by specifying the
 | 
			
		||||
--gtest_list_tests flag.  This script tests such functionality
 | 
			
		||||
by invoking gtest_list_tests_unittest_ (a program written with
 | 
			
		||||
Google Test) the command line flags.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
__author__ = 'phanna@google.com (Patrick Hanna)'
 | 
			
		||||
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
import re
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Constants.
 | 
			
		||||
 | 
			
		||||
# The command line flag for enabling/disabling listing all tests.
 | 
			
		||||
LIST_TESTS_FLAG = 'gtest_list_tests'
 | 
			
		||||
 | 
			
		||||
# Path to the gtest_list_tests_unittest_ program.
 | 
			
		||||
EXE_PATH = gtest_test_utils.GetTestExecutablePath('gtest_list_tests_unittest_')
 | 
			
		||||
 | 
			
		||||
# The expected output when running gtest_list_tests_unittest_ with
 | 
			
		||||
# --gtest_list_tests
 | 
			
		||||
EXPECTED_OUTPUT_NO_FILTER_RE = re.compile(r"""FooDeathTest\.
 | 
			
		||||
  Test1
 | 
			
		||||
Foo\.
 | 
			
		||||
  Bar1
 | 
			
		||||
  Bar2
 | 
			
		||||
  DISABLED_Bar3
 | 
			
		||||
Abc\.
 | 
			
		||||
  Xyz
 | 
			
		||||
  Def
 | 
			
		||||
FooBar\.
 | 
			
		||||
  Baz
 | 
			
		||||
FooTest\.
 | 
			
		||||
  Test1
 | 
			
		||||
  DISABLED_Test2
 | 
			
		||||
  Test3
 | 
			
		||||
TypedTest/0\.  # TypeParam = (VeryLo{245}|class VeryLo{239})\.\.\.
 | 
			
		||||
  TestA
 | 
			
		||||
  TestB
 | 
			
		||||
TypedTest/1\.  # TypeParam = int\s*\*
 | 
			
		||||
  TestA
 | 
			
		||||
  TestB
 | 
			
		||||
TypedTest/2\.  # TypeParam = .*MyArray<bool,\s*42>
 | 
			
		||||
  TestA
 | 
			
		||||
  TestB
 | 
			
		||||
My/TypeParamTest/0\.  # TypeParam = (VeryLo{245}|class VeryLo{239})\.\.\.
 | 
			
		||||
  TestA
 | 
			
		||||
  TestB
 | 
			
		||||
My/TypeParamTest/1\.  # TypeParam = int\s*\*
 | 
			
		||||
  TestA
 | 
			
		||||
  TestB
 | 
			
		||||
My/TypeParamTest/2\.  # TypeParam = .*MyArray<bool,\s*42>
 | 
			
		||||
  TestA
 | 
			
		||||
  TestB
 | 
			
		||||
MyInstantiation/ValueParamTest\.
 | 
			
		||||
  TestA/0  # GetParam\(\) = one line
 | 
			
		||||
  TestA/1  # GetParam\(\) = two\\nlines
 | 
			
		||||
  TestA/2  # GetParam\(\) = a very\\nlo{241}\.\.\.
 | 
			
		||||
  TestB/0  # GetParam\(\) = one line
 | 
			
		||||
  TestB/1  # GetParam\(\) = two\\nlines
 | 
			
		||||
  TestB/2  # GetParam\(\) = a very\\nlo{241}\.\.\.
 | 
			
		||||
""")
 | 
			
		||||
 | 
			
		||||
# The expected output when running gtest_list_tests_unittest_ with
 | 
			
		||||
# --gtest_list_tests and --gtest_filter=Foo*.
 | 
			
		||||
EXPECTED_OUTPUT_FILTER_FOO_RE = re.compile(r"""FooDeathTest\.
 | 
			
		||||
  Test1
 | 
			
		||||
Foo\.
 | 
			
		||||
  Bar1
 | 
			
		||||
  Bar2
 | 
			
		||||
  DISABLED_Bar3
 | 
			
		||||
FooBar\.
 | 
			
		||||
  Baz
 | 
			
		||||
FooTest\.
 | 
			
		||||
  Test1
 | 
			
		||||
  DISABLED_Test2
 | 
			
		||||
  Test3
 | 
			
		||||
""")
 | 
			
		||||
 | 
			
		||||
# Utilities.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def Run(args):
 | 
			
		||||
  """Runs gtest_list_tests_unittest_ and returns the list of tests printed."""
 | 
			
		||||
 | 
			
		||||
  return gtest_test_utils.Subprocess([EXE_PATH] + args,
 | 
			
		||||
                                     capture_stderr=False).output
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# The unit test.
 | 
			
		||||
 | 
			
		||||
class GTestListTestsUnitTest(gtest_test_utils.TestCase):
 | 
			
		||||
  """Tests using the --gtest_list_tests flag to list all tests."""
 | 
			
		||||
 | 
			
		||||
  def RunAndVerify(self, flag_value, expected_output_re, other_flag):
 | 
			
		||||
    """Runs gtest_list_tests_unittest_ and verifies that it prints
 | 
			
		||||
    the correct tests.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
      flag_value:         value of the --gtest_list_tests flag;
 | 
			
		||||
                          None if the flag should not be present.
 | 
			
		||||
      expected_output_re: regular expression that matches the expected
 | 
			
		||||
                          output after running command;
 | 
			
		||||
      other_flag:         a different flag to be passed to command
 | 
			
		||||
                          along with gtest_list_tests;
 | 
			
		||||
                          None if the flag should not be present.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    if flag_value is None:
 | 
			
		||||
      flag = ''
 | 
			
		||||
      flag_expression = 'not set'
 | 
			
		||||
    elif flag_value == '0':
 | 
			
		||||
      flag = '--%s=0' % LIST_TESTS_FLAG
 | 
			
		||||
      flag_expression = '0'
 | 
			
		||||
    else:
 | 
			
		||||
      flag = '--%s' % LIST_TESTS_FLAG
 | 
			
		||||
      flag_expression = '1'
 | 
			
		||||
 | 
			
		||||
    args = [flag]
 | 
			
		||||
 | 
			
		||||
    if other_flag is not None:
 | 
			
		||||
      args += [other_flag]
 | 
			
		||||
 | 
			
		||||
    output = Run(args)
 | 
			
		||||
 | 
			
		||||
    if expected_output_re:
 | 
			
		||||
      self.assert_(
 | 
			
		||||
          expected_output_re.match(output),
 | 
			
		||||
          ('when %s is %s, the output of "%s" is "%s",\n'
 | 
			
		||||
           'which does not match regex "%s"' %
 | 
			
		||||
           (LIST_TESTS_FLAG, flag_expression, ' '.join(args), output,
 | 
			
		||||
            expected_output_re.pattern)))
 | 
			
		||||
    else:
 | 
			
		||||
      self.assert_(
 | 
			
		||||
          not EXPECTED_OUTPUT_NO_FILTER_RE.match(output),
 | 
			
		||||
          ('when %s is %s, the output of "%s" is "%s"'%
 | 
			
		||||
           (LIST_TESTS_FLAG, flag_expression, ' '.join(args), output)))
 | 
			
		||||
 | 
			
		||||
  def testDefaultBehavior(self):
 | 
			
		||||
    """Tests the behavior of the default mode."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify(flag_value=None,
 | 
			
		||||
                      expected_output_re=None,
 | 
			
		||||
                      other_flag=None)
 | 
			
		||||
 | 
			
		||||
  def testFlag(self):
 | 
			
		||||
    """Tests using the --gtest_list_tests flag."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify(flag_value='0',
 | 
			
		||||
                      expected_output_re=None,
 | 
			
		||||
                      other_flag=None)
 | 
			
		||||
    self.RunAndVerify(flag_value='1',
 | 
			
		||||
                      expected_output_re=EXPECTED_OUTPUT_NO_FILTER_RE,
 | 
			
		||||
                      other_flag=None)
 | 
			
		||||
 | 
			
		||||
  def testOverrideNonFilterFlags(self):
 | 
			
		||||
    """Tests that --gtest_list_tests overrides the non-filter flags."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify(flag_value='1',
 | 
			
		||||
                      expected_output_re=EXPECTED_OUTPUT_NO_FILTER_RE,
 | 
			
		||||
                      other_flag='--gtest_break_on_failure')
 | 
			
		||||
 | 
			
		||||
  def testWithFilterFlags(self):
 | 
			
		||||
    """Tests that --gtest_list_tests takes into account the
 | 
			
		||||
    --gtest_filter flag."""
 | 
			
		||||
 | 
			
		||||
    self.RunAndVerify(flag_value='1',
 | 
			
		||||
                      expected_output_re=EXPECTED_OUTPUT_FILTER_FOO_RE,
 | 
			
		||||
                      other_flag='--gtest_filter=Foo*')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  gtest_test_utils.Main()
 | 
			
		||||
| 
						 | 
				
			
			@ -1,157 +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.
 | 
			
		||||
//
 | 
			
		||||
// Author: phanna@google.com (Patrick Hanna)
 | 
			
		||||
 | 
			
		||||
// Unit test for Google Test's --gtest_list_tests flag.
 | 
			
		||||
//
 | 
			
		||||
// A user can ask Google Test to list all tests that will run
 | 
			
		||||
// so that when using a filter, a user will know what
 | 
			
		||||
// tests to look for. The tests will not be run after listing.
 | 
			
		||||
//
 | 
			
		||||
// This program will be invoked from a Python unit test.
 | 
			
		||||
// Don't run it directly.
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
// Several different test cases and tests that will be listed.
 | 
			
		||||
TEST(Foo, Bar1) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(Foo, Bar2) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(Foo, DISABLED_Bar3) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(Abc, Xyz) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(Abc, Def) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(FooBar, Baz) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class FooTest : public testing::Test {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(FooTest, Test1) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(FooTest, DISABLED_Test2) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(FooTest, Test3) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(FooDeathTest, Test1) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A group of value-parameterized tests.
 | 
			
		||||
 | 
			
		||||
class MyType {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit MyType(const std::string& a_value) : value_(a_value) {}
 | 
			
		||||
 | 
			
		||||
  const std::string& value() const { return value_; }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  std::string value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Teaches Google Test how to print a MyType.
 | 
			
		||||
void PrintTo(const MyType& x, std::ostream* os) {
 | 
			
		||||
  *os << x.value();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ValueParamTest : public testing::TestWithParam<MyType> {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_P(ValueParamTest, TestA) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_P(ValueParamTest, TestB) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(
 | 
			
		||||
    MyInstantiation, ValueParamTest,
 | 
			
		||||
    testing::Values(MyType("one line"),
 | 
			
		||||
                    MyType("two\nlines"),
 | 
			
		||||
                    MyType("a very\nloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line")));  // NOLINT
 | 
			
		||||
 | 
			
		||||
// A group of typed tests.
 | 
			
		||||
 | 
			
		||||
// A deliberately long type name for testing the line-truncating
 | 
			
		||||
// behavior when printing a type parameter.
 | 
			
		||||
class VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName {  // NOLINT
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class TypedTest : public testing::Test {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T, int kSize>
 | 
			
		||||
class MyArray {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef testing::Types<VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName,  // NOLINT
 | 
			
		||||
                       int*, MyArray<bool, 42> > MyTypes;
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_CASE(TypedTest, MyTypes);
 | 
			
		||||
 | 
			
		||||
TYPED_TEST(TypedTest, TestA) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TYPED_TEST(TypedTest, TestB) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A group of type-parameterized tests.
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class TypeParamTest : public testing::Test {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_CASE_P(TypeParamTest);
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_P(TypeParamTest, TestA) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_P(TypeParamTest, TestB) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
REGISTER_TYPED_TEST_CASE_P(TypeParamTest, TestA, TestB);
 | 
			
		||||
 | 
			
		||||
INSTANTIATE_TYPED_TEST_CASE_P(My, TypeParamTest, MyTypes);
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  ::testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,45 +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.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
// Tests that we don't have to define main() when we link to
 | 
			
		||||
// gtest_main instead of gtest.
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
TEST(GTestMainTest, ShouldSucceed) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
 | 
			
		||||
// We are using the main() function defined in src/gtest_main.cc, so
 | 
			
		||||
// we don't define it here.
 | 
			
		||||
| 
						 | 
				
			
			@ -1,56 +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.
 | 
			
		||||
 | 
			
		||||
// Tests that a Google Test program that has no test defined can run
 | 
			
		||||
// successfully.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  // An ad-hoc assertion outside of all tests.
 | 
			
		||||
  //
 | 
			
		||||
  // This serves three purposes:
 | 
			
		||||
  //
 | 
			
		||||
  // 1. It verifies that an ad-hoc assertion can be executed even if
 | 
			
		||||
  //    no test is defined.
 | 
			
		||||
  // 2. It verifies that a failed ad-hoc assertion causes the test
 | 
			
		||||
  //    program to fail.
 | 
			
		||||
  // 3. We had a bug where the XML output won't be generated if an
 | 
			
		||||
  //    assertion is executed before RUN_ALL_TESTS() is called, even
 | 
			
		||||
  //    though --gtest_output=xml is specified.  This makes sure the
 | 
			
		||||
  //    bug is fixed and doesn't regress.
 | 
			
		||||
  EXPECT_EQ(1, 2);
 | 
			
		||||
 | 
			
		||||
  // The above EXPECT_EQ() should cause RUN_ALL_TESTS() to return non-zero.
 | 
			
		||||
  return RUN_ALL_TESTS() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,335 +0,0 @@
 | 
			
		|||
#!/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.
 | 
			
		||||
 | 
			
		||||
"""Tests the text output of Google C++ Testing Framework.
 | 
			
		||||
 | 
			
		||||
SYNOPSIS
 | 
			
		||||
       gtest_output_test.py --build_dir=BUILD/DIR --gengolden
 | 
			
		||||
         # where BUILD/DIR contains the built gtest_output_test_ file.
 | 
			
		||||
       gtest_output_test.py --gengolden
 | 
			
		||||
       gtest_output_test.py
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
__author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import re
 | 
			
		||||
import sys
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# The flag for generating the golden file
 | 
			
		||||
GENGOLDEN_FLAG = '--gengolden'
 | 
			
		||||
CATCH_EXCEPTIONS_ENV_VAR_NAME = 'GTEST_CATCH_EXCEPTIONS'
 | 
			
		||||
 | 
			
		||||
IS_WINDOWS = os.name == 'nt'
 | 
			
		||||
 | 
			
		||||
# TODO(vladl@google.com): remove the _lin suffix.
 | 
			
		||||
GOLDEN_NAME = 'gtest_output_test_golden_lin.txt'
 | 
			
		||||
 | 
			
		||||
PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_output_test_')
 | 
			
		||||
 | 
			
		||||
# At least one command we exercise must not have the
 | 
			
		||||
# --gtest_internal_skip_environment_and_ad_hoc_tests flag.
 | 
			
		||||
COMMAND_LIST_TESTS = ({}, [PROGRAM_PATH, '--gtest_list_tests'])
 | 
			
		||||
COMMAND_WITH_COLOR = ({}, [PROGRAM_PATH, '--gtest_color=yes'])
 | 
			
		||||
COMMAND_WITH_TIME = ({}, [PROGRAM_PATH,
 | 
			
		||||
                          '--gtest_print_time',
 | 
			
		||||
                          '--gtest_internal_skip_environment_and_ad_hoc_tests',
 | 
			
		||||
                          '--gtest_filter=FatalFailureTest.*:LoggingTest.*'])
 | 
			
		||||
COMMAND_WITH_DISABLED = (
 | 
			
		||||
    {}, [PROGRAM_PATH,
 | 
			
		||||
         '--gtest_also_run_disabled_tests',
 | 
			
		||||
         '--gtest_internal_skip_environment_and_ad_hoc_tests',
 | 
			
		||||
         '--gtest_filter=*DISABLED_*'])
 | 
			
		||||
COMMAND_WITH_SHARDING = (
 | 
			
		||||
    {'GTEST_SHARD_INDEX': '1', 'GTEST_TOTAL_SHARDS': '2'},
 | 
			
		||||
    [PROGRAM_PATH,
 | 
			
		||||
     '--gtest_internal_skip_environment_and_ad_hoc_tests',
 | 
			
		||||
     '--gtest_filter=PassingTest.*'])
 | 
			
		||||
 | 
			
		||||
GOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(), GOLDEN_NAME)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ToUnixLineEnding(s):
 | 
			
		||||
  """Changes all Windows/Mac line endings in s to UNIX line endings."""
 | 
			
		||||
 | 
			
		||||
  return s.replace('\r\n', '\n').replace('\r', '\n')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RemoveLocations(test_output):
 | 
			
		||||
  """Removes all file location info from a Google Test program's output.
 | 
			
		||||
 | 
			
		||||
  Args:
 | 
			
		||||
       test_output:  the output of a Google Test program.
 | 
			
		||||
 | 
			
		||||
  Returns:
 | 
			
		||||
       output with all file location info (in the form of
 | 
			
		||||
       'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or
 | 
			
		||||
       'DIRECTORY\\FILE_NAME(LINE_NUMBER): ') replaced by
 | 
			
		||||
       'FILE_NAME:#: '.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  return re.sub(r'.*[/\\](.+)(\:\d+|\(\d+\))\: ', r'\1:#: ', test_output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RemoveStackTraceDetails(output):
 | 
			
		||||
  """Removes all stack traces from a Google Test program's output."""
 | 
			
		||||
 | 
			
		||||
  # *? means "find the shortest string that matches".
 | 
			
		||||
  return re.sub(r'Stack trace:(.|\n)*?\n\n',
 | 
			
		||||
                'Stack trace: (omitted)\n\n', output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RemoveStackTraces(output):
 | 
			
		||||
  """Removes all traces of stack traces from a Google Test program's output."""
 | 
			
		||||
 | 
			
		||||
  # *? means "find the shortest string that matches".
 | 
			
		||||
  return re.sub(r'Stack trace:(.|\n)*?\n\n', '', output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RemoveTime(output):
 | 
			
		||||
  """Removes all time information from a Google Test program's output."""
 | 
			
		||||
 | 
			
		||||
  return re.sub(r'\(\d+ ms', '(? ms', output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RemoveTypeInfoDetails(test_output):
 | 
			
		||||
  """Removes compiler-specific type info from Google Test program's output.
 | 
			
		||||
 | 
			
		||||
  Args:
 | 
			
		||||
       test_output:  the output of a Google Test program.
 | 
			
		||||
 | 
			
		||||
  Returns:
 | 
			
		||||
       output with type information normalized to canonical form.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  # some compilers output the name of type 'unsigned int' as 'unsigned'
 | 
			
		||||
  return re.sub(r'unsigned int', 'unsigned', test_output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def NormalizeToCurrentPlatform(test_output):
 | 
			
		||||
  """Normalizes platform specific output details for easier comparison."""
 | 
			
		||||
 | 
			
		||||
  if IS_WINDOWS:
 | 
			
		||||
    # Removes the color information that is not present on Windows.
 | 
			
		||||
    test_output = re.sub('\x1b\\[(0;3\d)?m', '', test_output)
 | 
			
		||||
    # Changes failure message headers into the Windows format.
 | 
			
		||||
    test_output = re.sub(r': Failure\n', r': error: ', test_output)
 | 
			
		||||
    # Changes file(line_number) to file:line_number.
 | 
			
		||||
    test_output = re.sub(r'((\w|\.)+)\((\d+)\):', r'\1:\3:', test_output)
 | 
			
		||||
 | 
			
		||||
  return test_output
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RemoveTestCounts(output):
 | 
			
		||||
  """Removes test counts from a Google Test program's output."""
 | 
			
		||||
 | 
			
		||||
  output = re.sub(r'\d+ tests?, listed below',
 | 
			
		||||
                  '? tests, listed below', output)
 | 
			
		||||
  output = re.sub(r'\d+ FAILED TESTS',
 | 
			
		||||
                  '? FAILED TESTS', output)
 | 
			
		||||
  output = re.sub(r'\d+ tests? from \d+ test cases?',
 | 
			
		||||
                  '? tests from ? test cases', output)
 | 
			
		||||
  output = re.sub(r'\d+ tests? from ([a-zA-Z_])',
 | 
			
		||||
                  r'? tests from \1', output)
 | 
			
		||||
  return re.sub(r'\d+ tests?\.', '? tests.', output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def RemoveMatchingTests(test_output, pattern):
 | 
			
		||||
  """Removes output of specified tests from a Google Test program's output.
 | 
			
		||||
 | 
			
		||||
  This function strips not only the beginning and the end of a test but also
 | 
			
		||||
  all output in between.
 | 
			
		||||
 | 
			
		||||
  Args:
 | 
			
		||||
    test_output:       A string containing the test output.
 | 
			
		||||
    pattern:           A regex string that matches names of test cases or
 | 
			
		||||
                       tests to remove.
 | 
			
		||||
 | 
			
		||||
  Returns:
 | 
			
		||||
    Contents of test_output with tests whose names match pattern removed.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  test_output = re.sub(
 | 
			
		||||
      r'.*\[ RUN      \] .*%s(.|\n)*?\[(  FAILED  |       OK )\] .*%s.*\n' % (
 | 
			
		||||
          pattern, pattern),
 | 
			
		||||
      '',
 | 
			
		||||
      test_output)
 | 
			
		||||
  return re.sub(r'.*%s.*\n' % pattern, '', test_output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def NormalizeOutput(output):
 | 
			
		||||
  """Normalizes output (the output of gtest_output_test_.exe)."""
 | 
			
		||||
 | 
			
		||||
  output = ToUnixLineEnding(output)
 | 
			
		||||
  output = RemoveLocations(output)
 | 
			
		||||
  output = RemoveStackTraceDetails(output)
 | 
			
		||||
  output = RemoveTime(output)
 | 
			
		||||
  return output
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def GetShellCommandOutput(env_cmd):
 | 
			
		||||
  """Runs a command in a sub-process, and returns its output in a string.
 | 
			
		||||
 | 
			
		||||
  Args:
 | 
			
		||||
    env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra
 | 
			
		||||
             environment variables to set, and element 1 is a string with
 | 
			
		||||
             the command and any flags.
 | 
			
		||||
 | 
			
		||||
  Returns:
 | 
			
		||||
    A string with the command's combined standard and diagnostic output.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  # Spawns cmd in a sub-process, and gets its standard I/O file objects.
 | 
			
		||||
  # Set and save the environment properly.
 | 
			
		||||
  environ = os.environ.copy()
 | 
			
		||||
  environ.update(env_cmd[0])
 | 
			
		||||
  p = gtest_test_utils.Subprocess(env_cmd[1], env=environ)
 | 
			
		||||
 | 
			
		||||
  return p.output
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def GetCommandOutput(env_cmd):
 | 
			
		||||
  """Runs a command and returns its output with all file location
 | 
			
		||||
  info stripped off.
 | 
			
		||||
 | 
			
		||||
  Args:
 | 
			
		||||
    env_cmd:  The shell command. A 2-tuple where element 0 is a dict of extra
 | 
			
		||||
              environment variables to set, and element 1 is a string with
 | 
			
		||||
              the command and any flags.
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  # Disables exception pop-ups on Windows.
 | 
			
		||||
  environ, cmdline = env_cmd
 | 
			
		||||
  environ = dict(environ)  # Ensures we are modifying a copy.
 | 
			
		||||
  environ[CATCH_EXCEPTIONS_ENV_VAR_NAME] = '1'
 | 
			
		||||
  return NormalizeOutput(GetShellCommandOutput((environ, cmdline)))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def GetOutputOfAllCommands():
 | 
			
		||||
  """Returns concatenated output from several representative commands."""
 | 
			
		||||
 | 
			
		||||
  return (GetCommandOutput(COMMAND_WITH_COLOR) +
 | 
			
		||||
          GetCommandOutput(COMMAND_WITH_TIME) +
 | 
			
		||||
          GetCommandOutput(COMMAND_WITH_DISABLED) +
 | 
			
		||||
          GetCommandOutput(COMMAND_WITH_SHARDING))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
test_list = GetShellCommandOutput(COMMAND_LIST_TESTS)
 | 
			
		||||
SUPPORTS_DEATH_TESTS = 'DeathTest' in test_list
 | 
			
		||||
SUPPORTS_TYPED_TESTS = 'TypedTest' in test_list
 | 
			
		||||
SUPPORTS_THREADS = 'ExpectFailureWithThreadsTest' in test_list
 | 
			
		||||
SUPPORTS_STACK_TRACES = False
 | 
			
		||||
 | 
			
		||||
CAN_GENERATE_GOLDEN_FILE = (SUPPORTS_DEATH_TESTS and
 | 
			
		||||
                            SUPPORTS_TYPED_TESTS and
 | 
			
		||||
                            SUPPORTS_THREADS)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GTestOutputTest(gtest_test_utils.TestCase):
 | 
			
		||||
  def RemoveUnsupportedTests(self, test_output):
 | 
			
		||||
    if not SUPPORTS_DEATH_TESTS:
 | 
			
		||||
      test_output = RemoveMatchingTests(test_output, 'DeathTest')
 | 
			
		||||
    if not SUPPORTS_TYPED_TESTS:
 | 
			
		||||
      test_output = RemoveMatchingTests(test_output, 'TypedTest')
 | 
			
		||||
      test_output = RemoveMatchingTests(test_output, 'TypedDeathTest')
 | 
			
		||||
      test_output = RemoveMatchingTests(test_output, 'TypeParamDeathTest')
 | 
			
		||||
    if not SUPPORTS_THREADS:
 | 
			
		||||
      test_output = RemoveMatchingTests(test_output,
 | 
			
		||||
                                        'ExpectFailureWithThreadsTest')
 | 
			
		||||
      test_output = RemoveMatchingTests(test_output,
 | 
			
		||||
                                        'ScopedFakeTestPartResultReporterTest')
 | 
			
		||||
      test_output = RemoveMatchingTests(test_output,
 | 
			
		||||
                                        'WorksConcurrently')
 | 
			
		||||
    if not SUPPORTS_STACK_TRACES:
 | 
			
		||||
      test_output = RemoveStackTraces(test_output)
 | 
			
		||||
 | 
			
		||||
    return test_output
 | 
			
		||||
 | 
			
		||||
  def testOutput(self):
 | 
			
		||||
    output = GetOutputOfAllCommands()
 | 
			
		||||
 | 
			
		||||
    golden_file = open(GOLDEN_PATH, 'rb')
 | 
			
		||||
    # A mis-configured source control system can cause \r appear in EOL
 | 
			
		||||
    # sequences when we read the golden file irrespective of an operating
 | 
			
		||||
    # system used. Therefore, we need to strip those \r's from newlines
 | 
			
		||||
    # unconditionally.
 | 
			
		||||
    golden = ToUnixLineEnding(golden_file.read())
 | 
			
		||||
    golden_file.close()
 | 
			
		||||
 | 
			
		||||
    # We want the test to pass regardless of certain features being
 | 
			
		||||
    # supported or not.
 | 
			
		||||
 | 
			
		||||
    # We still have to remove type name specifics in all cases.
 | 
			
		||||
    normalized_actual = RemoveTypeInfoDetails(output)
 | 
			
		||||
    normalized_golden = RemoveTypeInfoDetails(golden)
 | 
			
		||||
 | 
			
		||||
    if CAN_GENERATE_GOLDEN_FILE:
 | 
			
		||||
      self.assertEqual(normalized_golden, normalized_actual)
 | 
			
		||||
    else:
 | 
			
		||||
      normalized_actual = NormalizeToCurrentPlatform(
 | 
			
		||||
          RemoveTestCounts(normalized_actual))
 | 
			
		||||
      normalized_golden = NormalizeToCurrentPlatform(
 | 
			
		||||
          RemoveTestCounts(self.RemoveUnsupportedTests(normalized_golden)))
 | 
			
		||||
 | 
			
		||||
      # This code is very handy when debugging golden file differences:
 | 
			
		||||
      if os.getenv('DEBUG_GTEST_OUTPUT_TEST'):
 | 
			
		||||
        open(os.path.join(
 | 
			
		||||
            gtest_test_utils.GetSourceDir(),
 | 
			
		||||
            '_gtest_output_test_normalized_actual.txt'), 'wb').write(
 | 
			
		||||
                normalized_actual)
 | 
			
		||||
        open(os.path.join(
 | 
			
		||||
            gtest_test_utils.GetSourceDir(),
 | 
			
		||||
            '_gtest_output_test_normalized_golden.txt'), 'wb').write(
 | 
			
		||||
                normalized_golden)
 | 
			
		||||
 | 
			
		||||
      self.assertEqual(normalized_golden, normalized_actual)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  if sys.argv[1:] == [GENGOLDEN_FLAG]:
 | 
			
		||||
    if CAN_GENERATE_GOLDEN_FILE:
 | 
			
		||||
      output = GetOutputOfAllCommands()
 | 
			
		||||
      golden_file = open(GOLDEN_PATH, 'wb')
 | 
			
		||||
      golden_file.write(output)
 | 
			
		||||
      golden_file.close()
 | 
			
		||||
    else:
 | 
			
		||||
      message = (
 | 
			
		||||
          """Unable to write a golden file when compiled in an environment
 | 
			
		||||
that does not support all the required features (death tests, typed tests,
 | 
			
		||||
and multiple threads).  Please generate the golden file using a binary built
 | 
			
		||||
with those features enabled.""")
 | 
			
		||||
 | 
			
		||||
      sys.stderr.write(message)
 | 
			
		||||
      sys.exit(1)
 | 
			
		||||
  else:
 | 
			
		||||
    gtest_test_utils.Main()
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue