Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
yangql
googletest
Commits
0ffa5f97
Unverified
Commit
0ffa5f97
authored
Jan 03, 2019
by
Chris Johnson
Committed by
GitHub
Jan 03, 2019
Browse files
Merge branch 'master' into chore/fix_library_json
parents
0c0ca903
3880b13e
Changes
74
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
852 additions
and
880 deletions
+852
-880
googletest/include/gtest/internal/gtest-param-util.h
googletest/include/gtest/internal/gtest-param-util.h
+110
-100
googletest/include/gtest/internal/gtest-port-arch.h
googletest/include/gtest/internal/gtest-port-arch.h
+0
-2
googletest/include/gtest/internal/gtest-port.h
googletest/include/gtest/internal/gtest-port.h
+15
-167
googletest/include/gtest/internal/gtest-type-util.h
googletest/include/gtest/internal/gtest-type-util.h
+3
-4
googletest/include/gtest/internal/gtest-type-util.h.pump
googletest/include/gtest/internal/gtest-type-util.h.pump
+3
-3
googletest/make/Makefile
googletest/make/Makefile
+12
-6
googletest/src/gtest-death-test.cc
googletest/src/gtest-death-test.cc
+9
-13
googletest/src/gtest-filepath.cc
googletest/src/gtest-filepath.cc
+0
-7
googletest/src/gtest-internal-inl.h
googletest/src/gtest-internal-inl.h
+84
-70
googletest/src/gtest-port.cc
googletest/src/gtest-port.cc
+0
-7
googletest/src/gtest-printers.cc
googletest/src/gtest-printers.cc
+0
-1
googletest/src/gtest-typed-test.cc
googletest/src/gtest-typed-test.cc
+2
-2
googletest/src/gtest.cc
googletest/src/gtest.cc
+419
-401
googletest/test/BUILD.bazel
googletest/test/BUILD.bazel
+7
-0
googletest/test/googletest-catch-exceptions-test.py
googletest/test/googletest-catch-exceptions-test.py
+2
-4
googletest/test/googletest-death-test-test.cc
googletest/test/googletest-death-test-test.cc
+0
-3
googletest/test/googletest-filepath-test.cc
googletest/test/googletest-filepath-test.cc
+0
-2
googletest/test/googletest-json-outfiles-test.py
googletest/test/googletest-json-outfiles-test.py
+0
-5
googletest/test/googletest-listener-test.cc
googletest/test/googletest-listener-test.cc
+186
-82
googletest/test/googletest-options-test.cc
googletest/test/googletest-options-test.cc
+0
-1
No files found.
googletest/include/gtest/internal/gtest-param-util.h
View file @
0ffa5f97
...
...
@@ -75,11 +75,11 @@ namespace internal {
// Utility Functions
// Outputs a message explaining invalid registration of different
// fixture class for the same test
cas
e. This may happen when
// fixture class for the same test
suit
e. This may happen when
// TEST_P macro is used to define two tests with the same name
// but in different namespaces.
GTEST_API_
void
ReportInvalidTest
Cas
eType
(
const
char
*
test_
cas
e_name
,
CodeLocation
code_location
);
GTEST_API_
void
ReportInvalidTest
Suit
eType
(
const
char
*
test_
suit
e_name
,
CodeLocation
code_location
);
template
<
typename
>
class
ParamGeneratorInterface
;
template
<
typename
>
class
ParamGenerator
;
...
...
@@ -379,7 +379,7 @@ std::string DefaultParamName(const TestParamInfo<ParamType>& info) {
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// Parameterized test name overload helpers, which help the
// INSTANTIATE_TEST_
CAS
E_P macro choose between the default parameterized
// INSTANTIATE_TEST_
SUIT
E_P macro choose between the default parameterized
// test name generator and user param name generator.
template
<
class
ParamType
,
class
ParamNameGenFunctor
>
ParamNameGenFunctor
GetParamNameGen
(
ParamNameGenFunctor
func
)
{
...
...
@@ -434,19 +434,19 @@ class TestMetaFactoryBase {
// TestMetaFactory creates test factories for passing into
// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
// ownership of test factory pointer, same factory object cannot be passed
// into that method twice. But ParameterizedTest
Cas
eInfo is going to call
// into that method twice. But ParameterizedTest
Suit
eInfo is going to call
// it for each Test/Parameter value combination. Thus it needs meta factory
// creator class.
template
<
class
Test
Cas
e
>
template
<
class
Test
Suit
e
>
class
TestMetaFactory
:
public
TestMetaFactoryBase
<
typename
Test
Cas
e
::
ParamType
>
{
:
public
TestMetaFactoryBase
<
typename
Test
Suit
e
::
ParamType
>
{
public:
typedef
typename
TestCase
::
ParamType
ParamType
;
using
ParamType
=
typename
TestSuite
::
ParamType
;
TestMetaFactory
()
{}
TestFactoryBase
*
CreateTestFactory
(
ParamType
parameter
)
override
{
return
new
ParameterizedTestFactory
<
Test
Cas
e
>
(
parameter
);
return
new
ParameterizedTestFactory
<
Test
Suit
e
>
(
parameter
);
}
private:
...
...
@@ -455,89 +455,88 @@ class TestMetaFactory
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// ParameterizedTest
Cas
eInfoBase is a generic interface
// to ParameterizedTest
Cas
eInfo classes. ParameterizedTest
Cas
eInfoBase
// ParameterizedTest
Suit
eInfoBase is a generic interface
// to ParameterizedTest
Suit
eInfo classes. ParameterizedTest
Suit
eInfoBase
// accumulates test information provided by TEST_P macro invocations
// and generators provided by INSTANTIATE_TEST_
CAS
E_P macro invocations
// and generators provided by INSTANTIATE_TEST_
SUIT
E_P macro invocations
// and uses that information to register all resulting test instances
// in RegisterTests method. The ParameterizeTest
Cas
eRegistry class holds
// a collection of pointers to the ParameterizedTest
Cas
eInfo objects
// in RegisterTests method. The ParameterizeTest
Suit
eRegistry class holds
// a collection of pointers to the ParameterizedTest
Suit
eInfo objects
// and calls RegisterTests() on each of them when asked.
class
ParameterizedTest
Cas
eInfoBase
{
class
ParameterizedTest
Suit
eInfoBase
{
public:
virtual
~
ParameterizedTest
Cas
eInfoBase
()
{}
virtual
~
ParameterizedTest
Suit
eInfoBase
()
{}
// Base part of test
cas
e name for display purposes.
virtual
const
std
::
string
&
GetTest
Cas
eName
()
const
=
0
;
// Base part of test
suit
e name for display purposes.
virtual
const
std
::
string
&
GetTest
Suit
eName
()
const
=
0
;
// Test case id to verify identity.
virtual
TypeId
GetTest
Cas
eTypeId
()
const
=
0
;
virtual
TypeId
GetTest
Suit
eTypeId
()
const
=
0
;
// UnitTest class invokes this method to register tests in this
// test
cas
e right before running them in RUN_ALL_TESTS macro.
// test
suit
e right before running them in RUN_ALL_TESTS macro.
// This method should not be called more then once on any single
// instance of a ParameterizedTest
Cas
eInfoBase derived class.
// instance of a ParameterizedTest
Suit
eInfoBase derived class.
virtual
void
RegisterTests
()
=
0
;
protected:
ParameterizedTest
Cas
eInfoBase
()
{}
ParameterizedTest
Suit
eInfoBase
()
{}
private:
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
ParameterizedTest
Cas
eInfoBase
);
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
ParameterizedTest
Suit
eInfoBase
);
};
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// ParameterizedTest
Cas
eInfo accumulates tests obtained from TEST_P
// macro invocations for a particular test
cas
e and generators
// obtained from INSTANTIATE_TEST_
CAS
E_P macro invocations for that
// test
cas
e. It registers tests with all values generated by all
// ParameterizedTest
Suit
eInfo accumulates tests obtained from TEST_P
// macro invocations for a particular test
suit
e and generators
// obtained from INSTANTIATE_TEST_
SUIT
E_P macro invocations for that
// test
suit
e. It registers tests with all values generated by all
// generators when asked.
template
<
class
Test
Cas
e
>
class
ParameterizedTest
Cas
eInfo
:
public
ParameterizedTest
Cas
eInfoBase
{
template
<
class
Test
Suit
e
>
class
ParameterizedTest
Suit
eInfo
:
public
ParameterizedTest
Suit
eInfoBase
{
public:
// ParamType and GeneratorCreationFunc are private types but are required
// for declarations of public methods AddTestPattern() and
// AddTest
Cas
eInstantiation().
typedef
typename
TestCase
::
ParamType
ParamType
;
// AddTest
Suit
eInstantiation().
using
ParamType
=
typename
TestSuite
::
ParamType
;
// A function that returns an instance of appropriate generator type.
typedef
ParamGenerator
<
ParamType
>
(
GeneratorCreationFunc
)();
typedef
typename
ParamNameGenFunc
<
ParamType
>::
Type
ParamNameGeneratorFunc
;
explicit
ParameterizedTest
Cas
eInfo
(
const
char
*
name
,
CodeLocation
code_location
)
:
test_
cas
e_name_
(
name
),
code_location_
(
code_location
)
{}
explicit
ParameterizedTest
Suit
eInfo
(
const
char
*
name
,
CodeLocation
code_location
)
:
test_
suit
e_name_
(
name
),
code_location_
(
code_location
)
{}
// Test case base name for display purposes.
const
std
::
string
&
GetTest
Cas
eName
()
const
override
{
return
test_
cas
e_name_
;
const
std
::
string
&
GetTest
Suit
eName
()
const
override
{
return
test_
suit
e_name_
;
}
// Test case id to verify identity.
TypeId
GetTest
Cas
eTypeId
()
const
override
{
return
GetTypeId
<
Test
Cas
e
>
();
}
TypeId
GetTest
Suit
eTypeId
()
const
override
{
return
GetTypeId
<
Test
Suit
e
>
();
}
// TEST_P macro uses AddTestPattern() to record information
// about a single test in a LocalTestInfo structure.
// test_
cas
e_name is the base name of the test
cas
e (without invocation
// test_
suit
e_name is the base name of the test
suit
e (without invocation
// prefix). test_base_name is the name of an individual test without
// parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
// test case base name and DoBar is test base name.
void
AddTestPattern
(
const
char
*
test_case_name
,
const
char
*
test_base_name
,
// test suite base name and DoBar is test base name.
void
AddTestPattern
(
const
char
*
test_suite_name
,
const
char
*
test_base_name
,
TestMetaFactoryBase
<
ParamType
>*
meta_factory
)
{
tests_
.
push_back
(
std
::
shared_ptr
<
TestInfo
>
(
new
TestInfo
(
test_
cas
e_name
,
test_base_name
,
meta_factory
)));
new
TestInfo
(
test_
suit
e_name
,
test_base_name
,
meta_factory
)));
}
// INSTANTIATE_TEST_
CAS
E_P macro uses AddGenerator() to record information
// INSTANTIATE_TEST_
SUIT
E_P macro uses AddGenerator() to record information
// about a generator.
int
AddTest
Cas
eInstantiation
(
const
std
::
string
&
instantiation_name
,
GeneratorCreationFunc
*
func
,
ParamNameGeneratorFunc
*
name_func
,
const
char
*
file
,
int
line
)
{
int
AddTest
Suit
eInstantiation
(
const
std
::
string
&
instantiation_name
,
GeneratorCreationFunc
*
func
,
ParamNameGeneratorFunc
*
name_func
,
const
char
*
file
,
int
line
)
{
instantiations_
.
push_back
(
InstantiationInfo
(
instantiation_name
,
func
,
name_func
,
file
,
line
));
return
0
;
// Return value used only to run this method in namespace scope.
}
// UnitTest class invokes this method to register tests in this test
cas
e
// test
cas
es right before running tests in RUN_ALL_TESTS macro.
// UnitTest class invokes this method to register tests in this test
suit
e
// test
suit
es right before running tests in RUN_ALL_TESTS macro.
// This method should not be called more then once on any single
// instance of a ParameterizedTest
Cas
eInfoBase derived class.
// instance of a ParameterizedTest
Suit
eInfoBase derived class.
// UnitTest has a guard to prevent from calling this method more then once.
void
RegisterTests
()
override
{
for
(
typename
TestInfoContainer
::
iterator
test_it
=
tests_
.
begin
();
...
...
@@ -552,10 +551,10 @@ class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
const
char
*
file
=
gen_it
->
file
;
int
line
=
gen_it
->
line
;
std
::
string
test_
cas
e_name
;
std
::
string
test_
suit
e_name
;
if
(
!
instantiation_name
.
empty
()
)
test_
cas
e_name
=
instantiation_name
+
"/"
;
test_
cas
e_name
+=
test_info
->
test_
cas
e_base_name
;
test_
suit
e_name
=
instantiation_name
+
"/"
;
test_
suit
e_name
+=
test_info
->
test_
suit
e_base_name
;
size_t
i
=
0
;
std
::
set
<
std
::
string
>
test_param_names
;
...
...
@@ -580,11 +579,12 @@ class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
test_name_stream
<<
test_info
->
test_base_name
<<
"/"
<<
param_name
;
MakeAndRegisterTestInfo
(
test_
cas
e_name
.
c_str
(),
test_name_stream
.
GetString
().
c_str
(),
test_
suit
e_name
.
c_str
(),
test_name_stream
.
GetString
().
c_str
(),
nullptr
,
// No type parameter.
PrintToString
(
*
param_it
).
c_str
(),
code_location_
,
GetTestCaseTypeId
(),
TestCase
::
SetUpTestCase
,
TestCase
::
TearDownTestCase
,
GetTestSuiteTypeId
(),
SuiteApiResolver
<
TestSuite
>::
GetSetUpCaseOrSuite
(),
SuiteApiResolver
<
TestSuite
>::
GetTearDownCaseOrSuite
(),
test_info
->
test_meta_factory
->
CreateTestFactory
(
*
param_it
));
}
// for param_it
}
// for gen_it
...
...
@@ -595,19 +595,18 @@ class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
// LocalTestInfo structure keeps information about a single test registered
// with TEST_P macro.
struct
TestInfo
{
TestInfo
(
const
char
*
a_test_case_base_name
,
const
char
*
a_test_base_name
,
TestMetaFactoryBase
<
ParamType
>*
a_test_meta_factory
)
:
test_case_base_name
(
a_test_case_base_name
),
test_base_name
(
a_test_base_name
),
test_meta_factory
(
a_test_meta_factory
)
{}
const
std
::
string
test_case_base_name
;
TestInfo
(
const
char
*
a_test_suite_base_name
,
const
char
*
a_test_base_name
,
TestMetaFactoryBase
<
ParamType
>*
a_test_meta_factory
)
:
test_suite_base_name
(
a_test_suite_base_name
),
test_base_name
(
a_test_base_name
),
test_meta_factory
(
a_test_meta_factory
)
{}
const
std
::
string
test_suite_base_name
;
const
std
::
string
test_base_name
;
const
std
::
unique_ptr
<
TestMetaFactoryBase
<
ParamType
>
>
test_meta_factory
;
};
using
TestInfoContainer
=
::
std
::
vector
<
std
::
shared_ptr
<
TestInfo
>
>
;
// Records data received from INSTANTIATE_TEST_
CAS
E_P macros:
// Records data received from INSTANTIATE_TEST_
SUIT
E_P macros:
// <Instantiation name, Sequence generator creation function,
// Name generator function, Source file, Source line>
struct
InstantiationInfo
{
...
...
@@ -644,76 +643,87 @@ class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
return
true
;
}
const
std
::
string
test_
cas
e_name_
;
const
std
::
string
test_
suit
e_name_
;
CodeLocation
code_location_
;
TestInfoContainer
tests_
;
InstantiationContainer
instantiations_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
ParameterizedTestCaseInfo
);
};
// class ParameterizedTestCaseInfo
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
ParameterizedTestSuiteInfo
);
};
// class ParameterizedTestSuiteInfo
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
template
<
class
TestCase
>
using
ParameterizedTestCaseInfo
=
ParameterizedTestSuiteInfo
<
TestCase
>
;
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// ParameterizedTest
Cas
eRegistry contains a map of
ParameterizedTestCaseInfoBase
// classes accessed by test
cas
e names. TEST_P
and INSTANTIATE_TEST_CASE_P
// macros use it to locate their corresponding
ParameterizedTestCaseInfo
// descriptors.
class
ParameterizedTest
Cas
eRegistry
{
// ParameterizedTest
Suit
eRegistry contains a map of
//
ParameterizedTestSuiteInfoBase
classes accessed by test
suit
e names. TEST_P
//
and INSTANTIATE_TEST_SUITE_P
macros use it to locate their corresponding
//
ParameterizedTestSuiteInfo
descriptors.
class
ParameterizedTest
Suit
eRegistry
{
public:
ParameterizedTestCaseRegistry
()
{}
~
ParameterizedTestCaseRegistry
()
{
for
(
TestCaseInfoContainer
::
iterator
it
=
test_case_infos_
.
begin
();
it
!=
test_case_infos_
.
end
();
++
it
)
{
delete
*
it
;
ParameterizedTestSuiteRegistry
()
{}
~
ParameterizedTestSuiteRegistry
()
{
for
(
auto
&
test_suite_info
:
test_suite_infos_
)
{
delete
test_suite_info
;
}
}
// Looks up or creates and returns a structure containing information about
// tests and instantiations of a particular test case.
template
<
class
TestCase
>
ParameterizedTestCaseInfo
<
TestCase
>*
GetTestCasePatternHolder
(
const
char
*
test_case_name
,
CodeLocation
code_location
)
{
ParameterizedTestCaseInfo
<
TestCase
>*
typed_test_info
=
nullptr
;
for
(
TestCaseInfoContainer
::
iterator
it
=
test_case_infos_
.
begin
();
it
!=
test_case_infos_
.
end
();
++
it
)
{
if
((
*
it
)
->
GetTestCaseName
()
==
test_case_name
)
{
if
((
*
it
)
->
GetTestCaseTypeId
()
!=
GetTypeId
<
TestCase
>
())
{
// tests and instantiations of a particular test suite.
template
<
class
TestSuite
>
ParameterizedTestSuiteInfo
<
TestSuite
>*
GetTestSuitePatternHolder
(
const
char
*
test_suite_name
,
CodeLocation
code_location
)
{
ParameterizedTestSuiteInfo
<
TestSuite
>*
typed_test_info
=
nullptr
;
for
(
auto
&
test_suite_info
:
test_suite_infos_
)
{
if
(
test_suite_info
->
GetTestSuiteName
()
==
test_suite_name
)
{
if
(
test_suite_info
->
GetTestSuiteTypeId
()
!=
GetTypeId
<
TestSuite
>
())
{
// Complain about incorrect usage of Google Test facilities
// and terminate the program since we cannot guaranty correct
// test
cas
e setup and tear-down in this case.
ReportInvalidTest
Cas
eType
(
test_
cas
e_name
,
code_location
);
// test
suit
e setup and tear-down in this case.
ReportInvalidTest
Suit
eType
(
test_
suit
e_name
,
code_location
);
posix
::
Abort
();
}
else
{
// At this point we are sure that the object we found is of the same
// type we are looking for, so we downcast it to that type
// without further checks.
typed_test_info
=
CheckedDowncastToActualType
<
ParameterizedTest
Cas
eInfo
<
Test
Cas
e
>
>
(
*
it
);
ParameterizedTest
Suit
eInfo
<
Test
Suit
e
>
>
(
test_suite_info
);
}
break
;
}
}
if
(
typed_test_info
==
nullptr
)
{
typed_test_info
=
new
ParameterizedTest
Cas
eInfo
<
Test
Cas
e
>
(
test_
cas
e_name
,
code_location
);
test_
cas
e_infos_
.
push_back
(
typed_test_info
);
typed_test_info
=
new
ParameterizedTest
Suit
eInfo
<
Test
Suit
e
>
(
test_
suit
e_name
,
code_location
);
test_
suit
e_infos_
.
push_back
(
typed_test_info
);
}
return
typed_test_info
;
}
void
RegisterTests
()
{
for
(
TestCaseInfoContainer
::
iterator
it
=
test_case_infos_
.
begin
();
it
!=
test_case_infos_
.
end
();
++
it
)
{
(
*
it
)
->
RegisterTests
();
for
(
auto
&
test_suite_info
:
test_suite_infos_
)
{
test_suite_info
->
RegisterTests
();
}
}
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
template
<
class
TestCase
>
ParameterizedTestCaseInfo
<
TestCase
>*
GetTestCasePatternHolder
(
const
char
*
test_case_name
,
CodeLocation
code_location
)
{
return
GetTestSuitePatternHolder
<
TestCase
>
(
test_case_name
,
code_location
);
}
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
private:
typedef
::
std
::
vector
<
ParameterizedTest
Cas
eInfoBase
*>
TestCaseInfoContainer
;
using
TestSuiteInfoContainer
=
::
std
::
vector
<
ParameterizedTest
Suit
eInfoBase
*>
;
Test
Cas
eInfoContainer
test_
cas
e_infos_
;
Test
Suit
eInfoContainer
test_
suit
e_infos_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
ParameterizedTest
Cas
eRegistry
);
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
ParameterizedTest
Suit
eRegistry
);
};
}
// namespace internal
...
...
googletest/include/gtest/internal/gtest-port-arch.h
View file @
0ffa5f97
...
...
@@ -41,8 +41,6 @@
# elif defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__)
# define GTEST_OS_WINDOWS_MINGW 1
# define GTEST_OS_WINDOWS 1
#elif defined __SYMBIAN32__
# define GTEST_OS_SYMBIAN 1
#elif defined _WIN32
# define GTEST_OS_WINDOWS 1
# ifdef _WIN32_WCE
...
...
googletest/include/gtest/internal/gtest-port.h
View file @
0ffa5f97
...
...
@@ -92,8 +92,6 @@
// - Define it to 1/0 to indicate whether the
// platform supports I/O stream redirection using
// dup() and dup2().
// GTEST_LANG_CXX11 - Define it to 1/0 to indicate that Google Test
// is building in C++11/C++98 mode.
// GTEST_LINKED_AS_SHARED_LIBRARY
// - Define to 1 when compiling tests that use
// Google Test as a shared library (known as
...
...
@@ -132,7 +130,6 @@
// GTEST_OS_OS2 - OS/2
// GTEST_OS_QNX - QNX
// GTEST_OS_SOLARIS - Sun Solaris
// GTEST_OS_SYMBIAN - Symbian
// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile)
// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop
// GTEST_OS_WINDOWS_MINGW - MinGW
...
...
@@ -177,7 +174,6 @@
// define themselves.
// GTEST_USES_SIMPLE_RE - our own simple regex is used;
// the above RE\b(s) are mutually exclusive.
// GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
// Misc public macros
// ------------------
...
...
@@ -208,7 +204,6 @@
// - synchronization primitives.
//
// Template meta programming:
// is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only.
// IteratorTraits - partial implementation of std::iterator_traits, which
// is not available in libCstd when compiled with Sun C++.
//
...
...
@@ -255,6 +250,7 @@
#include <stdlib.h>
#include <string.h>
#include <memory>
#include <type_traits>
#ifndef _WIN32_WCE
# include <sys/types.h>
...
...
@@ -332,44 +328,6 @@
GTEST_DISABLE_MSC_WARNINGS_POP_()
#endif
#define GTEST_LANG_CXX11 1
// Distinct from C++11 language support, some environments don't provide
// proper C++11 library support. Notably, it's possible to build in
// C++11 mode when targeting Mac OS X 10.6, which has an old libstdc++
// with no C++11 support.
//
// libstdc++ has sufficient C++11 support as of GCC 4.6.0, __GLIBCXX__
// 20110325, but maintenance releases in the 4.4 and 4.5 series followed
// this date, so check for those versions by their date stamps.
// https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.versioning
#if GTEST_LANG_CXX11 && \
(!defined(__GLIBCXX__) || ( \
__GLIBCXX__ >= 20110325ul &&
/* GCC >= 4.6.0 */
\
/* Blacklist of patch releases of older branches: */
\
__GLIBCXX__ != 20110416ul &&
/* GCC 4.4.6 */
\
__GLIBCXX__ != 20120313ul &&
/* GCC 4.4.7 */
\
__GLIBCXX__ != 20110428ul &&
/* GCC 4.5.3 */
\
__GLIBCXX__ != 20120702ul))
/* GCC 4.5.4 */
# define GTEST_STDLIB_CXX11 1
#endif
// Only use C++11 library features if the library provides them.
#if GTEST_STDLIB_CXX11
# define GTEST_HAS_STD_BEGIN_AND_END_ 1
# define GTEST_HAS_STD_FORWARD_LIST_ 1
# if !defined(_MSC_VER) || (_MSC_FULL_VER >= 190023824)
// works only with VS2015U2 and better
# define GTEST_HAS_STD_FUNCTION_ 1
# endif
# define GTEST_HAS_STD_INITIALIZER_LIST_ 1
# define GTEST_HAS_STD_MOVE_ 1
# define GTEST_HAS_STD_UNIQUE_PTR_ 1
# define GTEST_HAS_STD_SHARED_PTR_ 1
# define GTEST_HAS_UNORDERED_MAP_ 1
# define GTEST_HAS_UNORDERED_SET_ 1
#endif
// Brings in definitions for functions used in the testing::internal::posix
// namespace (read, write, close, chdir, isatty, stat). We do not currently
// use them on Windows Mobile.
...
...
@@ -500,9 +458,6 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
#ifndef GTEST_HAS_STD_WSTRING
// The user didn't tell us whether ::std::wstring is available, so we need
// to figure it out.
// FIXME: uses autoconf to detect whether ::std::wstring
// is available.
// Cygwin 1.7 and below doesn't support ::std::wstring.
// Solaris' libc++ doesn't support it either. Android has
// no support for it at least as recent as Froyo (2.2).
...
...
@@ -532,7 +487,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
# endif
// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
# elif defined(__GNUC__)
&& (GTEST_GCC_VER_ >= 40302)
# elif defined(__GNUC__)
# ifdef __GXX_RTTI
// When building against STLport with the Android NDK and with
...
...
@@ -635,12 +590,11 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
#ifndef GTEST_HAS_STREAM_REDIRECTION
// By default, we assume that stream redirection is supported on all
// platforms except known mobile ones.
# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || \
GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
# define GTEST_HAS_STREAM_REDIRECTION 0
# else
# define GTEST_HAS_STREAM_REDIRECTION 1
# endif // !GTEST_OS_WINDOWS_MOBILE
&& !GTEST_OS_SYMBIAN
# endif // !GTEST_OS_WINDOWS_MOBILE
#endif // GTEST_HAS_STREAM_REDIRECTION
// Determines whether to support death tests.
...
...
@@ -666,8 +620,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// Determines whether the system compiler uses UTF-16 for encoding wide strings.
#define GTEST_WIDE_STRING_USES_UTF16_ \
(GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || \
GTEST_OS_AIX || GTEST_OS_OS2)
(GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2)
// Determines whether test results can be streamed to a socket.
#if GTEST_OS_LINUX
...
...
@@ -712,12 +665,6 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
# define GTEST_ATTRIBUTE_UNUSED_
#endif
#if GTEST_LANG_CXX11
# define GTEST_CXX11_EQUALS_DELETE_ = delete
#else // GTEST_LANG_CXX11
# define GTEST_CXX11_EQUALS_DELETE_
#endif // GTEST_LANG_CXX11
// Use this annotation before a function that takes a printf format string.
#if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC)
# if defined(__MINGW_PRINTF_FORMAT)
...
...
@@ -739,12 +686,12 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// A macro to disallow operator=
// This should be used in the private: declarations for a class.
#define GTEST_DISALLOW_ASSIGN_(type) \
void operator=(type const &)
GTEST_CXX11_EQUALS_DELETE_
void operator=(type const &)
= delete
// A macro to disallow copy constructor and operator=
// This should be used in the private: declarations for a class.
#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \
type(type const &)
GTEST_CXX11_EQUALS_DELETE_
; \
type(type const &)
= delete
; \
GTEST_DISALLOW_ASSIGN_(type)
// Tell the compiler to warn about unused return values for functions declared
...
...
@@ -752,11 +699,11 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// following the argument list:
//
// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
#if defined(__GNUC__) &&
(GTEST_GCC_VER_ >= 30400) &&
!defined(COMPILER_ICC)
#if defined(__GNUC__) && !defined(COMPILER_ICC)
# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
#else
# define GTEST_MUST_USE_RESULT_
#endif // __GNUC__ &&
(GTEST_GCC_VER_ >= 30400) &&
!COMPILER_ICC
#endif // __GNUC__ && !COMPILER_ICC
// MS C++ compiler emits warning when a conditional expression is compile time
// constant. In some contexts this warning is false positive and needs to be
...
...
@@ -893,75 +840,16 @@ namespace internal {
// Secret object, which is what we want.
class
Secret
;
// The GTEST_COMPILE_ASSERT_
macro can be
used to verify that a compile
time
// expression is true
. For example, you could use it to verify the
// size of a static array:
// The GTEST_COMPILE_ASSERT_
is a legacy macro
used to verify that a compile
//
time
expression is true
(in new code, use static_assert instead). For
//
example, you could use it to verify the
size of a static array:
//
// GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES,
// names_incorrect_size);
//
// or to make sure a struct is smaller than a certain size:
//
// GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
//
// The second argument to the macro is the name of the variable. If
// the expression is false, most compilers will issue a warning/error
// containing the name of the variable.
#if GTEST_LANG_CXX11
# define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)
#else // !GTEST_LANG_CXX11
template
<
bool
>
struct
CompileAssert
{
};
# define GTEST_COMPILE_ASSERT_(expr, msg) \
typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
#endif // !GTEST_LANG_CXX11
// Implementation details of GTEST_COMPILE_ASSERT_:
//
// (In C++11, we simply use static_assert instead of the following)
//
// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
// elements (and thus is invalid) when the expression is false.
//
// - The simpler definition
//
// #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
//
// does not work, as gcc supports variable-length arrays whose sizes
// are determined at run-time (this is gcc's extension and not part
// of the C++ standard). As a result, gcc fails to reject the
// following code with the simple definition:
//
// int foo;
// GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
// // not a compile-time constant.
//
// - By using the type CompileAssert<(bool(expr))>, we ensures that
// expr is a compile-time constant. (Template arguments must be
// determined at compile-time.)
//
// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written
//
// CompileAssert<bool(expr)>
//
// instead, these compilers will refuse to compile
//
// GTEST_COMPILE_ASSERT_(5 > 0, some_message);
//
// (They seem to think the ">" in "5 > 0" marks the end of the
// template argument list.)
//
// - The array size is (bool(expr) ? 1 : -1), instead of simply
//
// ((expr) ? 1 : -1).
//
// This is to avoid running into a bug in MS VC 7.1, which
// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
// The second argument to the macro must be a valid C++ identifier. If the
// expression is false, compiler will issue an error containing this identifier.
#define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)
// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
//
...
...
@@ -1036,9 +924,6 @@ class GTEST_API_ RE {
// the entire str.
// PartialMatch(str, re) returns true iff regular expression re
// matches a substring of str (including str itself).
//
// FIXME: make FullMatch() and PartialMatch() work
// when str contains NUL characters.
static
bool
FullMatch
(
const
::
std
::
string
&
str
,
const
RE
&
re
)
{
return
FullMatch
(
str
.
c_str
(),
re
);
}
...
...
@@ -1062,10 +947,6 @@ class GTEST_API_ RE {
private:
void
Init
(
const
char
*
regex
);
// We use a const char* instead of an std::string, as Google Test used to be
// used where std::string is not available. FIXME: change to
// std::string.
const
char
*
pattern_
;
bool
is_valid_
;
...
...
@@ -2065,29 +1946,6 @@ class GTEST_API_ ThreadLocal {
// we cannot detect it.
GTEST_API_
size_t
GetThreadCount
();
// Passing non-POD classes through ellipsis (...) crashes the ARM
// compiler and generates a warning in Sun Studio before 12u4. The Nokia Symbian
// and the IBM XL C/C++ compiler try to instantiate a copy constructor
// for objects passed through ellipsis (...), failing for uncopyable
// objects. We define this to ensure that only POD is passed through
// ellipsis on these systems.
#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || \
(defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5130)
// We lose support for NULL detection where the compiler doesn't like
// passing non-POD classes through ellipsis (...).
# define GTEST_ELLIPSIS_NEEDS_POD_ 1
#else
# define GTEST_CAN_COMPARE_NULL 1
#endif
// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
// const T& and const T* in a function template. These compilers
// _can_ decide between class template specializations for T and T*,
// so a tr1::type_traits-like is_pointer works.
#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
# define GTEST_NEEDS_IS_POINTER_ 1
#endif
template
<
bool
bool_value
>
struct
bool_constant
{
typedef
bool_constant
<
bool_value
>
type
;
...
...
@@ -2104,13 +1962,6 @@ struct is_same : public false_type {};
template
<
typename
T
>
struct
is_same
<
T
,
T
>
:
public
true_type
{};
template
<
typename
T
>
struct
is_pointer
:
public
false_type
{};
template
<
typename
T
>
struct
is_pointer
<
T
*>
:
public
true_type
{};
template
<
typename
Iterator
>
struct
IteratorTraits
{
typedef
typename
Iterator
::
value_type
value_type
;
...
...
@@ -2433,9 +2284,6 @@ typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds.
// Parses 'str' for a 32-bit signed integer. If successful, writes the result
// to *value and returns true; otherwise leaves *value unchanged and returns
// false.
// FIXME: Find a better way to refactor flag and environment parsing
// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
// function.
bool
ParseInt32
(
const
Message
&
src_text
,
const
char
*
str
,
Int32
*
value
);
// Parses a bool/Int32/string from the environment variable
...
...
googletest/include/gtest/internal/gtest-type-util.h
View file @
0ffa5f97
...
...
@@ -31,12 +31,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Type utilities needed for implementing typed and type-parameterized
// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
//
// Currently we support at most 50 types in a list, and at most 50
// type-parameterized tests in one type-parameterized test
cas
e.
// type-parameterized tests in one type-parameterized test
suit
e.
// Please contact googletestframework@googlegroups.com if you need
// more.
...
...
@@ -3312,8 +3311,8 @@ struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
};
// The TypeList template makes it possible to use either a single type
// or a Types<...> list in TYPED_TEST_
CAS
E() and
// INSTANTIATE_TYPED_TEST_
CAS
E_P().
// or a Types<...> list in TYPED_TEST_
SUIT
E() and
// INSTANTIATE_TYPED_TEST_
SUIT
E_P().
template
<
typename
T
>
struct
TypeList
{
...
...
googletest/include/gtest/internal/gtest-type-util.h.pump
View file @
0ffa5f97
...
...
@@ -34,7 +34,7 @@ $var n = 50 $$ Maximum length of type lists we want to support.
// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
//
// Currently we support at most $n types in a list, and at most $n
// type-parameterized tests in one type-parameterized test
cas
e.
// type-parameterized tests in one type-parameterized test
suit
e.
// Please contact googletestframework@googlegroups.com if you need
// more.
...
...
@@ -291,8 +291,8 @@ struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
]]
// The TypeList template makes it possible to use either a single type
// or a Types<...> list in TYPED_TEST_
CAS
E() and
// INSTANTIATE_TYPED_TEST_
CAS
E_P().
// or a Types<...> list in TYPED_TEST_
SUIT
E() and
// INSTANTIATE_TYPED_TEST_
SUIT
E_P().
template
<
typename
T
>
struct
TypeList
{
...
...
googletest/make/Makefile
View file @
0ffa5f97
...
...
@@ -16,6 +16,9 @@
# Remember to tweak this if you move this file.
GTEST_DIR
=
..
# Points to the location of the Google Test libraries
GTEST_LIB_DIR
=
.
# Where to find user code.
USER_DIR
=
../samples
...
...
@@ -27,6 +30,9 @@ CPPFLAGS += -isystem $(GTEST_DIR)/include
# Flags passed to the C++ compiler.
CXXFLAGS
+=
-g
-Wall
-Wextra
-pthread
-std
=
c++11
# Google Test libraries
GTEST_LIBS
=
libgtest.a libgtest_main.a
# All tests produced by this Makefile. Remember to add new tests you
# created to the list.
TESTS
=
sample1_unittest
...
...
@@ -38,10 +44,10 @@ GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
# House-keeping build targets.
all
:
$(TESTS)
all
:
$(GTEST_LIBS)
$(TESTS)
clean
:
rm
-f
$(TEST
S)
gtest.a gtest_main.a
*
.o
rm
-f
$(
G
TEST
_LIBS)
$(TESTS)
*
.o
# Builds gtest.a and gtest_main.a.
...
...
@@ -61,10 +67,10 @@ gtest_main.o : $(GTEST_SRCS_)
$(CXX)
$(CPPFLAGS)
-I
$(GTEST_DIR)
$(CXXFLAGS)
-c
\
$(GTEST_DIR)
/src/gtest_main.cc
gtest.a
:
gtest-all.o
lib
gtest.a
:
gtest-all.o
$(AR)
$(ARFLAGS)
$@
$^
gtest_main.a
:
gtest-all.o gtest_main.o
lib
gtest_main.a
:
gtest-all.o gtest_main.o
$(AR)
$(ARFLAGS)
$@
$^
# Builds a sample test. A test should link with either gtest.a or
...
...
@@ -78,5 +84,5 @@ sample1_unittest.o : $(USER_DIR)/sample1_unittest.cc \
$(USER_DIR)/sample1.h $(GTEST_HEADERS)
$(CXX)
$(CPPFLAGS)
$(CXXFLAGS)
-c
$(USER_DIR)
/sample1_unittest.cc
sample1_unittest
:
sample1.o sample1_unittest.o
gtest_main.a
$(CXX)
$(CPPFLAGS)
$(CXXFLAGS)
-lpthread
$^
-o
$@
sample1_unittest
:
sample1.o sample1_unittest.o
$(GTEST_LIBS)
$(CXX)
$(CPPFLAGS)
$(CXXFLAGS)
-L
$(GTEST_LIB_DIR)
-lgtest_main
-lpthread
$^
-o
$@
googletest/src/gtest-death-test.cc
View file @
0ffa5f97
...
...
@@ -274,8 +274,6 @@ static const int kFuchsiaReadPipeFd = 3;
// statement, which is not allowed; THREW means that the test statement
// returned control by throwing an exception. IN_PROGRESS means the test
// has not yet concluded.
// FIXME: Unify names and possibly values for
// AbortReason, DeathTestOutcome, and flag characters above.
enum
DeathTestOutcome
{
IN_PROGRESS
,
DIED
,
LIVED
,
RETURNED
,
THREW
};
// Routine for aborting the program which is safe to call from an
...
...
@@ -755,9 +753,9 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
FALSE
,
// The initial state is non-signalled.
nullptr
));
// The even is unnamed.
GTEST_DEATH_TEST_CHECK_
(
event_handle_
.
Get
()
!=
nullptr
);
const
std
::
string
filter_flag
=
std
::
string
(
"--"
)
+
GTEST_FLAG_PREFIX_
+
kFilterFlag
+
"="
+
info
->
test_case_name
()
+
"."
+
info
->
name
();
const
std
::
string
filter_flag
=
std
::
string
(
"--"
)
+
GTEST_FLAG_PREFIX_
+
kFilterFlag
+
"="
+
info
->
test_suite_name
()
+
"."
+
info
->
name
();
const
std
::
string
internal_flag
=
std
::
string
(
"--"
)
+
GTEST_FLAG_PREFIX_
+
kInternalRunDeathTestFlag
+
"="
+
file_
+
"|"
+
StreamableToString
(
line_
)
+
"|"
+
...
...
@@ -974,9 +972,9 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
FlushInfoLog
();
// Build the child process command line.
const
std
::
string
filter_flag
=
std
::
string
(
"--"
)
+
GTEST_FLAG_PREFIX_
+
kFilterFlag
+
"="
+
info
->
test_case_name
()
+
"."
+
info
->
name
();
const
std
::
string
filter_flag
=
std
::
string
(
"--"
)
+
GTEST_FLAG_PREFIX_
+
kFilterFlag
+
"="
+
info
->
test_suite_name
()
+
"."
+
info
->
name
();
const
std
::
string
internal_flag
=
std
::
string
(
"--"
)
+
GTEST_FLAG_PREFIX_
+
kInternalRunDeathTestFlag
+
"="
+
file_
+
"|"
...
...
@@ -1413,9 +1411,9 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {
// it be closed when the child process does an exec:
GTEST_DEATH_TEST_CHECK_
(
fcntl
(
pipe_fd
[
1
],
F_SETFD
,
0
)
!=
-
1
);
const
std
::
string
filter_flag
=
std
::
string
(
"--"
)
+
GTEST_FLAG_PREFIX_
+
kFilterFlag
+
"="
+
info
->
test_case_name
()
+
"."
+
info
->
name
();
const
std
::
string
filter_flag
=
std
::
string
(
"--"
)
+
GTEST_FLAG_PREFIX_
+
kFilterFlag
+
"="
+
info
->
test_suite_name
()
+
"."
+
info
->
name
();
const
std
::
string
internal_flag
=
std
::
string
(
"--"
)
+
GTEST_FLAG_PREFIX_
+
kInternalRunDeathTestFlag
+
"="
+
file_
+
"|"
+
StreamableToString
(
line_
)
+
"|"
...
...
@@ -1523,8 +1521,6 @@ static int GetStatusFileDescriptor(unsigned int parent_process_id,
StreamableToString
(
parent_process_id
));
}
// FIXME: Replace the following check with a
// compile-time assertion when available.
GTEST_CHECK_
(
sizeof
(
HANDLE
)
<=
sizeof
(
size_t
));
const
HANDLE
write_handle
=
...
...
googletest/src/gtest-filepath.cc
View file @
0ffa5f97
...
...
@@ -38,9 +38,6 @@
#elif GTEST_OS_WINDOWS
# include <direct.h>
# include <io.h>
#elif GTEST_OS_SYMBIAN
// Symbian OpenC has PATH_MAX in sys/syslimits.h
# include <sys/syslimits.h>
#else
# include <limits.h>
# include <climits> // Some Linux distributions define PATH_MAX here.
...
...
@@ -250,9 +247,6 @@ bool FilePath::DirectoryExists() const {
// root directory per disk drive.)
bool
FilePath
::
IsRootDirectory
()
const
{
#if GTEST_OS_WINDOWS
// FIXME: on Windows a network share like
// \\server\share can be a root directory, although it cannot be the
// current directory. Handle this properly.
return
pathname_
.
length
()
==
3
&&
IsAbsolutePath
();
#else
return
pathname_
.
length
()
==
1
&&
IsPathSeparator
(
pathname_
.
c_str
()[
0
]);
...
...
@@ -350,7 +344,6 @@ FilePath FilePath::RemoveTrailingPathSeparator() const {
// Removes any redundant separators that might be in the pathname.
// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
// redundancies that might be in a pathname involving "." or "..".
// FIXME: handle Windows network shares (e.g. \\server\share).
void
FilePath
::
Normalize
()
{
if
(
pathname_
.
c_str
()
==
nullptr
)
{
pathname_
=
""
;
...
...
googletest/src/gtest-internal-inl.h
View file @
0ffa5f97
...
...
@@ -231,7 +231,7 @@ GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
// Converts a wide string to a narrow string in UTF-8 encoding.
// The wide string is assumed to have the following encoding:
// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin
, Symbian OS
)
// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin)
// UTF-32 if sizeof(wchar_t) == 4 (on Linux)
// Parameter str points to a null-terminated wide string.
// Parameter num_chars may additionally limit the number
...
...
@@ -388,10 +388,10 @@ class GTEST_API_ UnitTestOptions {
// works well enough for matching test names, which are short.
static
bool
PatternMatchesString
(
const
char
*
pattern
,
const
char
*
str
);
// Returns true iff the user-specified filter matches the test
cas
e
// Returns true iff the user-specified filter matches the test
suit
e
// name and the test name.
static
bool
FilterMatchesTest
(
const
std
::
string
&
test_
cas
e_name
,
const
std
::
string
&
test_name
);
static
bool
FilterMatchesTest
(
const
std
::
string
&
test_
suit
e_name
,
const
std
::
string
&
test_name
);
#if GTEST_OS_WINDOWS
// Function for supporting the gtest_catch_exception flag.
...
...
@@ -529,18 +529,18 @@ class GTEST_API_ UnitTestImpl {
void
SetTestPartResultReporterForCurrentThread
(
TestPartResultReporterInterface
*
reporter
);
// Gets the number of successful test
cas
es.
int
successful_test_
cas
e_count
()
const
;
// Gets the number of successful test
suit
es.
int
successful_test_
suit
e_count
()
const
;
// Gets the number of failed test
cas
es.
int
failed_test_
cas
e_count
()
const
;
// Gets the number of failed test
suit
es.
int
failed_test_
suit
e_count
()
const
;
// Gets the number of all test
cas
es.
int
total_test_
cas
e_count
()
const
;
// Gets the number of all test
suit
es.
int
total_test_
suit
e_count
()
const
;
// Gets the number of all test
cas
es that contain at least one test
// Gets the number of all test
suit
es that contain at least one test
// that should run.
int
test_
cas
e_to_run_count
()
const
;
int
test_
suit
e_to_run_count
()
const
;
// Gets the number of successful tests.
int
successful_test_count
()
const
;
...
...
@@ -573,27 +573,32 @@ class GTEST_API_ UnitTestImpl {
// Gets the elapsed time, in milliseconds.
TimeInMillis
elapsed_time
()
const
{
return
elapsed_time_
;
}
// Returns true iff the unit test passed (i.e. all test
cas
es passed).
// Returns true iff the unit test passed (i.e. all test
suit
es passed).
bool
Passed
()
const
{
return
!
Failed
();
}
// Returns true iff the unit test failed (i.e. some test
cas
e failed
// Returns true iff the unit test failed (i.e. some test
suit
e failed
// or something outside of all tests failed).
bool
Failed
()
const
{
return
failed_test_
cas
e_count
()
>
0
||
ad_hoc_test_result
()
->
Failed
();
return
failed_test_
suit
e_count
()
>
0
||
ad_hoc_test_result
()
->
Failed
();
}
// Gets the i-th test
cas
e among all the test
cas
es. i can range from 0 to
// total_test_
cas
e_count() - 1. If i is not in that range, returns NULL.
const
Test
Cas
e
*
GetTest
Cas
e
(
int
i
)
const
{
const
int
index
=
GetElementOr
(
test_
cas
e_indices_
,
i
,
-
1
);
return
index
<
0
?
nullptr
:
test_
cas
es_
[
i
];
// Gets the i-th test
suit
e among all the test
suit
es. i can range from 0 to
// total_test_
suit
e_count() - 1. If i is not in that range, returns NULL.
const
Test
Suit
e
*
GetTest
Suit
e
(
int
i
)
const
{
const
int
index
=
GetElementOr
(
test_
suit
e_indices_
,
i
,
-
1
);
return
index
<
0
?
nullptr
:
test_
suit
es_
[
i
];
}
// Gets the i-th test case among all the test cases. i can range from 0 to
// total_test_case_count() - 1. If i is not in that range, returns NULL.
TestCase
*
GetMutableTestCase
(
int
i
)
{
const
int
index
=
GetElementOr
(
test_case_indices_
,
i
,
-
1
);
return
index
<
0
?
nullptr
:
test_cases_
[
index
];
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
const
TestCase
*
GetTestCase
(
int
i
)
const
{
return
GetTestSuite
(
i
);
}
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
// Gets the i-th test suite among all the test suites. i can range from 0 to
// total_test_suite_count() - 1. If i is not in that range, returns NULL.
TestSuite
*
GetMutableSuiteCase
(
int
i
)
{
const
int
index
=
GetElementOr
(
test_suite_indices_
,
i
,
-
1
);
return
index
<
0
?
nullptr
:
test_suites_
[
index
];
}
// Provides access to the event listener list.
...
...
@@ -630,30 +635,38 @@ class GTEST_API_ UnitTestImpl {
// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
std
::
string
CurrentOsStackTraceExceptTop
(
int
skip_count
)
GTEST_NO_INLINE_
;
// Finds and returns a Test
Cas
e with the given name. If one doesn't
// Finds and returns a Test
Suit
e with the given name. If one doesn't
// exist, creates one and returns it.
//
// Arguments:
//
// test_
cas
e_name: name of the test
cas
e
// test_
suit
e_name: name of the test
suit
e
// type_param: the name of the test's type parameter, or NULL if
// this is not a typed or a type-parameterized test.
// set_up_tc: pointer to the function that sets up the test case
// tear_down_tc: pointer to the function that tears down the test case
TestCase
*
GetTestCase
(
const
char
*
test_case_name
,
const
char
*
type_param
,
Test
::
SetUpTestCaseFunc
set_up_tc
,
Test
::
TearDownTestCaseFunc
tear_down_tc
);
// set_up_tc: pointer to the function that sets up the test suite
// tear_down_tc: pointer to the function that tears down the test suite
TestSuite
*
GetTestSuite
(
const
char
*
test_suite_name
,
const
char
*
type_param
,
internal
::
SetUpTestSuiteFunc
set_up_tc
,
internal
::
TearDownTestSuiteFunc
tear_down_tc
);
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
TestCase
*
GetTestCase
(
const
char
*
test_case_name
,
const
char
*
type_param
,
internal
::
SetUpTestSuiteFunc
set_up_tc
,
internal
::
TearDownTestSuiteFunc
tear_down_tc
)
{
return
GetTestSuite
(
test_case_name
,
type_param
,
set_up_tc
,
tear_down_tc
);
}
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
// Adds a TestInfo to the unit test.
//
// Arguments:
//
// set_up_tc: pointer to the function that sets up the test
cas
e
// tear_down_tc: pointer to the function that tears down the test
cas
e
// set_up_tc: pointer to the function that sets up the test
suit
e
// tear_down_tc: pointer to the function that tears down the test
suit
e
// test_info: the TestInfo object
void
AddTestInfo
(
Test
::
SetUpTest
Cas
eFunc
set_up_tc
,
Test
::
TearDownTest
Cas
eFunc
tear_down_tc
,
void
AddTestInfo
(
internal
::
SetUpTest
Suit
eFunc
set_up_tc
,
internal
::
TearDownTest
Suit
eFunc
tear_down_tc
,
TestInfo
*
test_info
)
{
// In order to support thread-safe death tests, we need to
// remember the original working directory when the test program
...
...
@@ -668,21 +681,20 @@ class GTEST_API_ UnitTestImpl {
<<
"Failed to get the current working directory."
;
}
GetTestCase
(
test_info
->
test_case_name
(),
test_info
->
type_param
(),
set_up_tc
,
tear_down_tc
)
->
AddTestInfo
(
test_info
);
GetTestSuite
(
test_info
->
test_suite_name
(),
test_info
->
type_param
(),
set_up_tc
,
tear_down_tc
)
->
AddTestInfo
(
test_info
);
}
// Returns ParameterizedTest
Cas
eRegistry object used to keep track of
// Returns ParameterizedTest
Suit
eRegistry object used to keep track of
// value-parameterized tests and instantiate and register them.
internal
::
ParameterizedTest
Cas
eRegistry
&
parameterized_test_registry
()
{
internal
::
ParameterizedTest
Suit
eRegistry
&
parameterized_test_registry
()
{
return
parameterized_test_registry_
;
}
// Sets the Test
Cas
e object for the test that's currently running.
void
set_current_test_
cas
e
(
Test
Cas
e
*
a_current_test_
cas
e
)
{
current_test_
cas
e_
=
a_current_test_
cas
e
;
// Sets the Test
Suit
e object for the test that's currently running.
void
set_current_test_
suit
e
(
Test
Suit
e
*
a_current_test_
suit
e
)
{
current_test_
suit
e_
=
a_current_test_
suit
e
;
}
// Sets the TestInfo object for the test that's currently running. If
...
...
@@ -693,7 +705,7 @@ class GTEST_API_ UnitTestImpl {
}
// Registers all parameterized tests defined using TEST_P and
// INSTANTIATE_TEST_
CAS
E_P, creating regular tests for each test/parameter
// INSTANTIATE_TEST_
SUIT
E_P, creating regular tests for each test/parameter
// combination. This method can be called more then once; it has guards
// protecting from registering the tests more then once. If
// value-parameterized tests are disabled, RegisterParameterizedTests is
...
...
@@ -708,7 +720,7 @@ class GTEST_API_ UnitTestImpl {
// Clears the results of all tests, except the ad hoc tests.
void
ClearNonAdHocTestResult
()
{
ForEach
(
test_
cas
es_
,
Test
Cas
e
::
ClearTest
Cas
eResult
);
ForEach
(
test_
suit
es_
,
Test
Suit
e
::
ClearTest
Suit
eResult
);
}
// Clears the results of ad-hoc test assertions.
...
...
@@ -717,7 +729,7 @@ class GTEST_API_ UnitTestImpl {
}
// Adds a TestProperty to the current TestResult object when invoked in a
// context of a test or a test
cas
e, or to the global property set. If the
// context of a test or a test
suit
e, or to the global property set. If the
// result already contains a property with the same key, the value will be
// updated.
void
RecordProperty
(
const
TestProperty
&
test_property
);
...
...
@@ -729,7 +741,7 @@ class GTEST_API_ UnitTestImpl {
// Matches the full name of each test against the user-specified
// filter to decide whether the test should run, then records the
// result in each Test
Cas
e and TestInfo object.
// result in each Test
Suit
e and TestInfo object.
// If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
// based on sharding variables in the environment.
// Returns the number of tests that should run.
...
...
@@ -738,7 +750,7 @@ class GTEST_API_ UnitTestImpl {
// Prints the names of the tests matching the user-specified filter flag.
void
ListTestsMatchingFilter
();
const
Test
Cas
e
*
current_test_
cas
e
()
const
{
return
current_test_
cas
e_
;
}
const
Test
Suit
e
*
current_test_
suit
e
()
const
{
return
current_test_
suit
e_
;
}
TestInfo
*
current_test_info
()
{
return
current_test_info_
;
}
const
TestInfo
*
current_test_info
()
const
{
return
current_test_info_
;
}
...
...
@@ -799,11 +811,11 @@ class GTEST_API_ UnitTestImpl {
// Gets the random number generator.
internal
::
Random
*
random
()
{
return
&
random_
;
}
// Shuffles all test
cas
es, and the tests within each test
cas
e,
// Shuffles all test
suit
es, and the tests within each test
suit
e,
// making sure that death tests are still run first.
void
ShuffleTests
();
// Restores the test
cas
es and tests to their order before the first shuffle.
// Restores the test
suit
es and tests to their order before the first shuffle.
void
UnshuffleTests
();
// Returns the value of GTEST_FLAG(catch_exceptions) at the moment
...
...
@@ -843,31 +855,31 @@ class GTEST_API_ UnitTestImpl {
// before/after the tests are run.
std
::
vector
<
Environment
*>
environments_
;
// The vector of Test
Cas
es in their original order. It owns the
// The vector of Test
Suit
es in their original order. It owns the
// elements in the vector.
std
::
vector
<
Test
Cas
e
*>
test_
cas
es_
;
std
::
vector
<
Test
Suit
e
*>
test_
suit
es_
;
// Provides a level of indirection for the test
cas
e list to allow
// easy shuffling and restoring the test
cas
e order. The i-th
// element of this vector is the index of the i-th test
cas
e in the
// Provides a level of indirection for the test
suit
e list to allow
// easy shuffling and restoring the test
suit
e order. The i-th
// element of this vector is the index of the i-th test
suit
e in the
// shuffled order.
std
::
vector
<
int
>
test_
cas
e_indices_
;
std
::
vector
<
int
>
test_
suit
e_indices_
;
// ParameterizedTestRegistry object used to register value-parameterized
// tests.
internal
::
ParameterizedTest
Cas
eRegistry
parameterized_test_registry_
;
internal
::
ParameterizedTest
Suit
eRegistry
parameterized_test_registry_
;
// Indicates whether RegisterParameterizedTests() has been called already.
bool
parameterized_tests_registered_
;
// Index of the last death test
cas
e registered. Initially -1.
int
last_death_test_
cas
e_
;
// Index of the last death test
suit
e registered. Initially -1.
int
last_death_test_
suit
e_
;
// This points to the Test
Cas
e for the currently running test. It
// changes as Google Test goes through one test
cas
e after another.
// This points to the Test
Suit
e for the currently running test. It
// changes as Google Test goes through one test
suit
e after another.
// When no test is running, this is set to NULL and Google Test
// stores assertion results in ad_hoc_test_result_. Initially NULL.
Test
Cas
e
*
current_test_
cas
e_
;
Test
Suit
e
*
current_test_
suit
e_
;
// This points to the TestInfo for the currently running test. It
// changes as Google Test goes through one test after another. When
...
...
@@ -998,8 +1010,6 @@ bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
const
bool
parse_success
=
*
end
==
'\0'
&&
errno
==
0
;
// FIXME: Convert this to compile time assertion when it is
// available.
GTEST_CHECK_
(
sizeof
(
Integer
)
<=
sizeof
(
parsed
));
const
Integer
result
=
static_cast
<
Integer
>
(
parsed
);
...
...
@@ -1138,14 +1148,18 @@ class StreamingListener : public EmptyTestEventListener {
StreamableToString
(
unit_test
.
elapsed_time
())
+
"ms"
);
}
// Note that "event=TestCaseStart" is a wire format and has to remain
// "case" for compatibilty
void
OnTestCaseStart
(
const
TestCase
&
test_case
)
override
{
SendLn
(
std
::
string
(
"event=TestCaseStart&name="
)
+
test_case
.
name
());
}
// Note that "event=TestCaseEnd" is a wire format and has to remain
// "case" for compatibilty
void
OnTestCaseEnd
(
const
TestCase
&
test_case
)
override
{
SendLn
(
"event=TestCaseEnd&passed="
+
FormatBool
(
test_case
.
Passed
())
+
"&elapsed_time="
+
StreamableToString
(
test_case
.
elapsed_time
())
+
"ms"
);
SendLn
(
"event=TestCaseEnd&passed="
+
FormatBool
(
test_case
.
Passed
())
+
"&elapsed_time="
+
StreamableToString
(
test_case
.
elapsed_time
())
+
"ms"
);
}
void
OnTestStart
(
const
TestInfo
&
test_info
)
override
{
...
...
googletest/src/gtest-port.cc
View file @
0ffa5f97
...
...
@@ -265,9 +265,6 @@ Mutex::Mutex()
Mutex
::~
Mutex
()
{
// Static mutexes are leaked intentionally. It is not thread-safe to try
// to clean them up.
// FIXME: Switch to Slim Reader/Writer (SRW) Locks, which requires
// nothing to clean it up but is available only on Vista and later.
// https://docs.microsoft.com/en-us/windows/desktop/Sync/slim-reader-writer--srw--locks
if
(
type_
==
kDynamic
)
{
::
DeleteCriticalSection
(
critical_section_
);
delete
critical_section_
;
...
...
@@ -388,7 +385,6 @@ class ThreadWithParamSupport : public ThreadWithParamBase {
Notification
*
thread_can_start
)
{
ThreadMainParam
*
param
=
new
ThreadMainParam
(
runnable
,
thread_can_start
);
DWORD
thread_id
;
// FIXME: Consider to use _beginthreadex instead.
HANDLE
thread_handle
=
::
CreateThread
(
nullptr
,
// Default security.
0
,
// Default stack size.
...
...
@@ -741,9 +737,6 @@ static std::string FormatRegexSyntaxError(const char* regex, int index) {
// otherwise returns true.
bool
ValidateRegex
(
const
char
*
regex
)
{
if
(
regex
==
nullptr
)
{
// FIXME: fix the source file location in the
// assertion failures to match where the regex is used in user
// code.
ADD_FAILURE
()
<<
"NULL is not a valid simple regular expression."
;
return
false
;
}
...
...
googletest/src/gtest-printers.cc
View file @
0ffa5f97
...
...
@@ -89,7 +89,6 @@ void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
// If the object size is bigger than kThreshold, we'll have to omit
// some details by printing only the first and the last kChunkSize
// bytes.
// FIXME: let the user control the threshold using a flag.
if
(
count
<
kThreshold
)
{
PrintByteSegmentInObjectTo
(
obj_bytes
,
0
,
count
,
os
);
}
else
{
...
...
googletest/src/gtest-typed-test.cc
View file @
0ffa5f97
...
...
@@ -57,7 +57,7 @@ static std::vector<std::string> SplitIntoTestNames(const char* src) {
// Verifies that registered_tests match the test names in
// registered_tests_; returns registered_tests if successful, or
// aborts the program otherwise.
const
char
*
TypedTest
Cas
ePState
::
VerifyRegisteredTestNames
(
const
char
*
TypedTest
Suit
ePState
::
VerifyRegisteredTestNames
(
const
char
*
file
,
int
line
,
const
char
*
registered_tests
)
{
typedef
RegisteredTestsMap
::
const_iterator
RegisteredTestIter
;
registered_
=
true
;
...
...
@@ -89,7 +89,7 @@ const char* TypedTestCasePState::VerifyRegisteredTestNames(
tests
.
insert
(
name
);
}
else
{
errors
<<
"No test named "
<<
name
<<
" can be found in this test
cas
e.
\n
"
;
<<
" can be found in this test
suit
e.
\n
"
;
}
}
...
...
googletest/src/gtest.cc
View file @
0ffa5f97
...
...
@@ -54,8 +54,6 @@
#if GTEST_OS_LINUX
// FIXME: Use autoconf to detect availability of
// gettimeofday().
# define GTEST_HAS_GETTIMEOFDAY_ 1
# include <fcntl.h> // NOLINT
...
...
@@ -68,10 +66,6 @@
# include <unistd.h> // NOLINT
# include <string>
#elif GTEST_OS_SYMBIAN
# define GTEST_HAS_GETTIMEOFDAY_ 1
# include <sys/time.h> // NOLINT
#elif GTEST_OS_ZOS
# define GTEST_HAS_GETTIMEOFDAY_ 1
# include <sys/time.h> // NOLINT
...
...
@@ -93,11 +87,6 @@
# if GTEST_OS_WINDOWS_MINGW
// MinGW has gettimeofday() but not _ftime64().
// FIXME: Use autoconf to detect availability of
// gettimeofday().
// FIXME: There are other ways to get the time on
// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW
// supports these. consider using them instead.
# define GTEST_HAS_GETTIMEOFDAY_ 1
# include <sys/time.h> // NOLINT
# endif // GTEST_OS_WINDOWS_MINGW
...
...
@@ -110,8 +99,6 @@
#else
// Assume other platforms have gettimeofday().
// FIXME: Use autoconf to detect availability of
// gettimeofday().
# define GTEST_HAS_GETTIMEOFDAY_ 1
// cpplint thinks that the header is already included, so we want to
...
...
@@ -160,14 +147,14 @@ using internal::Shuffle;
// Constants.
// A test whose test
cas
e name or test name matches this filter is
// A test whose test
suit
e name or test name matches this filter is
// disabled and not run.
static
const
char
kDisableTestFilter
[]
=
"DISABLED_*:*/DISABLED_*"
;
// A test
cas
e whose name matches this filter is considered a death
// test
cas
e and will be run before test
cas
es whose name doesn't
// A test
suit
e whose name matches this filter is considered a death
// test
suit
e and will be run before test
suit
es whose name doesn't
// match this filter.
static
const
char
kDeathTest
Cas
eFilter
[]
=
"*DeathTest:*DeathTest/*"
;
static
const
char
kDeathTest
Suit
eFilter
[]
=
"*DeathTest:*DeathTest/*"
;
// A test filter that matches everything.
static
const
char
kUniversalFilter
[]
=
"*"
;
...
...
@@ -372,11 +359,11 @@ UInt32 Random::Generate(UInt32 range) {
// Google Test before calling RUN_ALL_TESTS().
static
bool
GTestIsInitialized
()
{
return
GetArgvs
().
size
()
>
0
;
}
// Iterates over a vector of Test
Cas
es, keeping a running sum of the
// Iterates over a vector of Test
Suit
es, keeping a running sum of the
// results of calling a given int-returning method on each.
// Returns the sum.
static
int
SumOverTest
Cas
eList
(
const
std
::
vector
<
Test
Cas
e
*>&
case_list
,
int
(
Test
Cas
e
::*
method
)()
const
)
{
static
int
SumOverTest
Suit
eList
(
const
std
::
vector
<
Test
Suit
e
*>&
case_list
,
int
(
Test
Suit
e
::*
method
)()
const
)
{
int
sum
=
0
;
for
(
size_t
i
=
0
;
i
<
case_list
.
size
();
i
++
)
{
sum
+=
(
case_list
[
i
]
->*
method
)();
...
...
@@ -384,20 +371,20 @@ static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
return
sum
;
}
// Returns true iff the test
cas
e passed.
static
bool
Test
Cas
ePassed
(
const
Test
Cas
e
*
test_
cas
e
)
{
return
test_
cas
e
->
should_run
()
&&
test_
cas
e
->
Passed
();
// Returns true iff the test
suit
e passed.
static
bool
Test
Suit
ePassed
(
const
Test
Suit
e
*
test_
suit
e
)
{
return
test_
suit
e
->
should_run
()
&&
test_
suit
e
->
Passed
();
}
// Returns true iff the test
cas
e failed.
static
bool
Test
Cas
eFailed
(
const
Test
Cas
e
*
test_
cas
e
)
{
return
test_
cas
e
->
should_run
()
&&
test_
cas
e
->
Failed
();
// Returns true iff the test
suit
e failed.
static
bool
Test
Suit
eFailed
(
const
Test
Suit
e
*
test_
suit
e
)
{
return
test_
suit
e
->
should_run
()
&&
test_
suit
e
->
Failed
();
}
// Returns true iff test_
cas
e contains at least one test that should
// Returns true iff test_
suit
e contains at least one test that should
// run.
static
bool
ShouldRunTest
Cas
e
(
const
Test
Cas
e
*
test_
cas
e
)
{
return
test_
cas
e
->
should_run
();
static
bool
ShouldRunTest
Suit
e
(
const
Test
Suit
e
*
test_
suit
e
)
{
return
test_
suit
e
->
should_run
();
}
// AssertHelper constructor.
...
...
@@ -481,10 +468,6 @@ std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
internal
::
FilePath
output_name
(
colon
+
1
);
if
(
!
output_name
.
IsAbsolutePath
())
// FIXME: on Windows \some\path is not an absolute
// path (as its meaning depends on the current drive), yet the
// following logic for turning it into an absolute path is wrong.
// Fix it.
output_name
=
internal
::
FilePath
::
ConcatPaths
(
internal
::
FilePath
(
UnitTest
::
GetInstance
()
->
original_working_dir
()),
internal
::
FilePath
(
colon
+
1
));
...
...
@@ -541,11 +524,11 @@ bool UnitTestOptions::MatchesFilter(
}
}
// Returns true iff the user-specified filter matches the test
cas
e
// Returns true iff the user-specified filter matches the test
suit
e
// name and the test name.
bool
UnitTestOptions
::
FilterMatchesTest
(
const
std
::
string
&
test_
cas
e_name
,
const
std
::
string
&
test_name
)
{
const
std
::
string
&
full_name
=
test_
cas
e_name
+
"."
+
test_name
.
c_str
();
bool
UnitTestOptions
::
FilterMatchesTest
(
const
std
::
string
&
test_
suit
e_name
,
const
std
::
string
&
test_name
)
{
const
std
::
string
&
full_name
=
test_
suit
e_name
+
"."
+
test_name
.
c_str
();
// Split --gtest_filter at '-', if there is one, to separate into
// positive filter and negative filter portions
...
...
@@ -767,66 +750,66 @@ void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
per_thread_test_part_result_reporter_
.
set
(
reporter
);
}
// Gets the number of successful test
cas
es.
int
UnitTestImpl
::
successful_test_
cas
e_count
()
const
{
return
CountIf
(
test_
cas
es_
,
Test
Cas
ePassed
);
// Gets the number of successful test
suit
es.
int
UnitTestImpl
::
successful_test_
suit
e_count
()
const
{
return
CountIf
(
test_
suit
es_
,
Test
Suit
ePassed
);
}
// Gets the number of failed test
cas
es.
int
UnitTestImpl
::
failed_test_
cas
e_count
()
const
{
return
CountIf
(
test_
cas
es_
,
Test
Cas
eFailed
);
// Gets the number of failed test
suit
es.
int
UnitTestImpl
::
failed_test_
suit
e_count
()
const
{
return
CountIf
(
test_
suit
es_
,
Test
Suit
eFailed
);
}
// Gets the number of all test
cas
es.
int
UnitTestImpl
::
total_test_
cas
e_count
()
const
{
return
static_cast
<
int
>
(
test_
cas
es_
.
size
());
// Gets the number of all test
suit
es.
int
UnitTestImpl
::
total_test_
suit
e_count
()
const
{
return
static_cast
<
int
>
(
test_
suit
es_
.
size
());
}
// Gets the number of all test
cas
es that contain at least one test
// Gets the number of all test
suit
es that contain at least one test
// that should run.
int
UnitTestImpl
::
test_
cas
e_to_run_count
()
const
{
return
CountIf
(
test_
cas
es_
,
ShouldRunTest
Cas
e
);
int
UnitTestImpl
::
test_
suit
e_to_run_count
()
const
{
return
CountIf
(
test_
suit
es_
,
ShouldRunTest
Suit
e
);
}
// Gets the number of successful tests.
int
UnitTestImpl
::
successful_test_count
()
const
{
return
SumOverTest
Cas
eList
(
test_
cas
es_
,
&
Test
Cas
e
::
successful_test_count
);
return
SumOverTest
Suit
eList
(
test_
suit
es_
,
&
Test
Suit
e
::
successful_test_count
);
}
// Gets the number of skipped tests.
int
UnitTestImpl
::
skipped_test_count
()
const
{
return
SumOverTest
Cas
eList
(
test_
cas
es_
,
&
Test
Cas
e
::
skipped_test_count
);
return
SumOverTest
Suit
eList
(
test_
suit
es_
,
&
Test
Suit
e
::
skipped_test_count
);
}
// Gets the number of failed tests.
int
UnitTestImpl
::
failed_test_count
()
const
{
return
SumOverTest
Cas
eList
(
test_
cas
es_
,
&
Test
Cas
e
::
failed_test_count
);
return
SumOverTest
Suit
eList
(
test_
suit
es_
,
&
Test
Suit
e
::
failed_test_count
);
}
// Gets the number of disabled tests that will be reported in the XML report.
int
UnitTestImpl
::
reportable_disabled_test_count
()
const
{
return
SumOverTest
Cas
eList
(
test_
cas
es_
,
&
Test
Cas
e
::
reportable_disabled_test_count
);
return
SumOverTest
Suit
eList
(
test_
suit
es_
,
&
Test
Suit
e
::
reportable_disabled_test_count
);
}
// Gets the number of disabled tests.
int
UnitTestImpl
::
disabled_test_count
()
const
{
return
SumOverTest
Cas
eList
(
test_
cas
es_
,
&
Test
Cas
e
::
disabled_test_count
);
return
SumOverTest
Suit
eList
(
test_
suit
es_
,
&
Test
Suit
e
::
disabled_test_count
);
}
// Gets the number of tests to be printed in the XML report.
int
UnitTestImpl
::
reportable_test_count
()
const
{
return
SumOverTest
Cas
eList
(
test_
cas
es_
,
&
Test
Cas
e
::
reportable_test_count
);
return
SumOverTest
Suit
eList
(
test_
suit
es_
,
&
Test
Suit
e
::
reportable_test_count
);
}
// Gets the number of all tests.
int
UnitTestImpl
::
total_test_count
()
const
{
return
SumOverTest
Cas
eList
(
test_
cas
es_
,
&
Test
Cas
e
::
total_test_count
);
return
SumOverTest
Suit
eList
(
test_
suit
es_
,
&
Test
Suit
e
::
total_test_count
);
}
// Gets the number of tests that should run.
int
UnitTestImpl
::
test_to_run_count
()
const
{
return
SumOverTest
Cas
eList
(
test_
cas
es_
,
&
Test
Cas
e
::
test_to_run_count
);
return
SumOverTest
Suit
eList
(
test_
suit
es_
,
&
Test
Suit
e
::
test_to_run_count
);
}
// Returns the current OS stack trace as an std::string.
...
...
@@ -860,8 +843,6 @@ TimeInMillis GetTimeInMillis() {
SYSTEMTIME
now_systime
;
FILETIME
now_filetime
;
ULARGE_INTEGER
now_int64
;
// FIXME: Shouldn't this just use
// GetSystemTimeAsFileTime()?
GetSystemTime
(
&
now_systime
);
if
(
SystemTimeToFileTime
(
&
now_systime
,
&
now_filetime
))
{
now_int64
.
LowPart
=
now_filetime
.
dwLowDateTime
;
...
...
@@ -876,8 +857,6 @@ TimeInMillis GetTimeInMillis() {
// MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
// (deprecated function) there.
// FIXME: Use GetTickCount()? Or use
// SystemTimeToFileTime()
GTEST_DISABLE_MSC_DEPRECATED_PUSH_
()
_ftime64
(
&
now
);
GTEST_DISABLE_MSC_DEPRECATED_POP_
()
...
...
@@ -1411,8 +1390,6 @@ AssertionResult DoubleNearPredFormat(const char* expr1,
const
double
diff
=
fabs
(
val1
-
val2
);
if
(
diff
<=
abs_error
)
return
AssertionSuccess
();
// FIXME: do not print the value of an expression if it's
// already a literal.
return
AssertionFailure
()
<<
"The difference between "
<<
expr1
<<
" and "
<<
expr2
<<
" is "
<<
diff
<<
", which exceeds "
<<
abs_error_expr
<<
", where
\n
"
...
...
@@ -1827,7 +1804,7 @@ std::string CodePointToUtf8(UInt32 code_point) {
// The following two functions only make sense if the system
// uses UTF-16 for wide string encoding. All supported systems
// with 16 bit wchar_t (Windows, Cygwin
, Symbian OS
) do use UTF-16.
// with 16 bit wchar_t (Windows, Cygwin) do use UTF-16.
// Determines if the arguments constitute UTF-16 surrogate pair
// and thus should be combined into a single Unicode code point
...
...
@@ -1850,7 +1827,7 @@ inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
// Converts a wide string to a narrow string in UTF-8 encoding.
// The wide string is assumed to have the following encoding:
// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin
, Symbian OS
)
// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin)
// UTF-32 if sizeof(wchar_t) == 4 (on Linux)
// Parameter str points to a null-terminated wide string.
// Parameter num_chars may additionally limit the number
...
...
@@ -2306,17 +2283,17 @@ void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
}
// namespace internal
// Google Test requires all tests in the same test
cas
e to use the same test
// Google Test requires all tests in the same test
suit
e to use the same test
// fixture class. This function checks if the current test has the
// same fixture class as the first test in the current test
cas
e. If
// same fixture class as the first test in the current test
suit
e. If
// yes, it returns true; otherwise it generates a Google Test failure and
// returns false.
bool
Test
::
HasSameFixtureClass
()
{
internal
::
UnitTestImpl
*
const
impl
=
internal
::
GetUnitTestImpl
();
const
Test
Cas
e
*
const
test_
cas
e
=
impl
->
current_test_
cas
e
();
const
Test
Suit
e
*
const
test_
suit
e
=
impl
->
current_test_
suit
e
();
// Info about the first test in the current test
cas
e.
const
TestInfo
*
const
first_test_info
=
test_
cas
e
->
test_info_list
()[
0
];
// Info about the first test in the current test
suit
e.
const
TestInfo
*
const
first_test_info
=
test_
suit
e
->
test_info_list
()[
0
];
const
internal
::
TypeId
first_fixture_id
=
first_test_info
->
fixture_class_id_
;
const
char
*
const
first_test_name
=
first_test_info
->
name
();
...
...
@@ -2332,7 +2309,7 @@ bool Test::HasSameFixtureClass() {
const
bool
this_is_TEST
=
this_fixture_id
==
internal
::
GetTestTypeId
();
if
(
first_is_TEST
||
this_is_TEST
)
{
// Both TEST and TEST_F appear in same test
cas
e, which is incorrect.
// Both TEST and TEST_F appear in same test
suit
e, which is incorrect.
// Tell the user how to fix this.
// Gets the name of the TEST and the name of the TEST_F. Note
...
...
@@ -2344,9 +2321,9 @@ bool Test::HasSameFixtureClass() {
first_is_TEST
?
this_test_name
:
first_test_name
;
ADD_FAILURE
()
<<
"All tests in the same test
cas
e must use the same test fixture
\n
"
<<
"class, so mixing TEST_F and TEST in the same test
cas
e is
\n
"
<<
"illegal. In test
cas
e "
<<
this_test_info
->
test_
cas
e_name
()
<<
"All tests in the same test
suit
e must use the same test fixture
\n
"
<<
"class, so mixing TEST_F and TEST in the same test
suit
e is
\n
"
<<
"illegal. In test
suit
e "
<<
this_test_info
->
test_
suit
e_name
()
<<
",
\n
"
<<
"test "
<<
TEST_F_name
<<
" is defined using TEST_F but
\n
"
<<
"test "
<<
TEST_name
<<
" is defined using TEST. You probably
\n
"
...
...
@@ -2356,15 +2333,15 @@ bool Test::HasSameFixtureClass() {
// Two fixture classes with the same name appear in two different
// namespaces, which is not allowed. Tell the user how to fix this.
ADD_FAILURE
()
<<
"All tests in the same test
cas
e must use the same test fixture
\n
"
<<
"class. However, in test
cas
e "
<<
this_test_info
->
test_
cas
e_name
()
<<
",
\n
"
<<
"you defined test "
<<
first_test_name
<<
" and test "
<<
this_test_name
<<
"
\n
"
<<
"All tests in the same test
suit
e must use the same test fixture
\n
"
<<
"class. However, in test
suit
e "
<<
this_test_info
->
test_
suit
e_name
()
<<
",
\n
"
<<
"you defined test "
<<
first_test_name
<<
" and test "
<<
this_test_name
<<
"
\n
"
<<
"using two different test fixture classes. This can happen if
\n
"
<<
"the two classes are from different namespaces or translation
\n
"
<<
"units and have the same name. You should probably rename one
\n
"
<<
"of the classes to put the tests into different test
cas
es."
;
<<
"of the classes to put the tests into different test
suit
es."
;
}
return
false
;
}
...
...
@@ -2551,13 +2528,13 @@ bool Test::IsSkipped() {
// Constructs a TestInfo object. It assumes ownership of the test factory
// object.
TestInfo
::
TestInfo
(
const
std
::
string
&
a_test_
cas
e_name
,
TestInfo
::
TestInfo
(
const
std
::
string
&
a_test_
suit
e_name
,
const
std
::
string
&
a_name
,
const
char
*
a_type_param
,
const
char
*
a_value_param
,
internal
::
CodeLocation
a_code_location
,
internal
::
TypeId
fixture_class_id
,
internal
::
TestFactoryBase
*
factory
)
:
test_
cas
e_name_
(
a_test_
cas
e_name
),
:
test_
suit
e_name_
(
a_test_
suit
e_name
),
name_
(
a_name
),
type_param_
(
a_type_param
?
new
std
::
string
(
a_type_param
)
:
nullptr
),
value_param_
(
a_value_param
?
new
std
::
string
(
a_value_param
)
:
nullptr
),
...
...
@@ -2579,7 +2556,7 @@ namespace internal {
//
// Arguments:
//
// test_
cas
e_name: name of the test
cas
e
// test_
suit
e_name: name of the test
suit
e
// name: name of the test
// type_param: the name of the test's type parameter, or NULL if
// this is not a typed or a type-parameterized test.
...
...
@@ -2587,40 +2564,35 @@ namespace internal {
// or NULL if this is not a value-parameterized test.
// code_location: code location where the test is defined
// fixture_class_id: ID of the test fixture class
// set_up_tc: pointer to the function that sets up the test
cas
e
// tear_down_tc: pointer to the function that tears down the test
cas
e
// set_up_tc: pointer to the function that sets up the test
suit
e
// tear_down_tc: pointer to the function that tears down the test
suit
e
// factory: pointer to the factory that creates a test object.
// The newly created TestInfo instance will assume
// ownership of the factory object.
TestInfo
*
MakeAndRegisterTestInfo
(
const
char
*
test_case_name
,
const
char
*
name
,
const
char
*
type_param
,
const
char
*
value_param
,
CodeLocation
code_location
,
TypeId
fixture_class_id
,
SetUpTestCaseFunc
set_up_tc
,
TearDownTestCaseFunc
tear_down_tc
,
TestFactoryBase
*
factory
)
{
const
char
*
test_suite_name
,
const
char
*
name
,
const
char
*
type_param
,
const
char
*
value_param
,
CodeLocation
code_location
,
TypeId
fixture_class_id
,
SetUpTestSuiteFunc
set_up_tc
,
TearDownTestSuiteFunc
tear_down_tc
,
TestFactoryBase
*
factory
)
{
TestInfo
*
const
test_info
=
new
TestInfo
(
test_
cas
e_name
,
name
,
type_param
,
value_param
,
new
TestInfo
(
test_
suit
e_name
,
name
,
type_param
,
value_param
,
code_location
,
fixture_class_id
,
factory
);
GetUnitTestImpl
()
->
AddTestInfo
(
set_up_tc
,
tear_down_tc
,
test_info
);
return
test_info
;
}
void
ReportInvalidTest
Cas
eType
(
const
char
*
test_
cas
e_name
,
CodeLocation
code_location
)
{
void
ReportInvalidTest
Suit
eType
(
const
char
*
test_
suit
e_name
,
CodeLocation
code_location
)
{
Message
errors
;
errors
<<
"Attempted redefinition of test
cas
e "
<<
test_
cas
e_name
<<
".
\n
"
<<
"All tests in the same test
cas
e must use the same test fixture
\n
"
<<
"class. However, in test
cas
e "
<<
test_
cas
e_name
<<
", you tried
\n
"
<<
"Attempted redefinition of test
suit
e "
<<
test_
suit
e_name
<<
".
\n
"
<<
"All tests in the same test
suit
e must use the same test fixture
\n
"
<<
"class. However, in test
suit
e "
<<
test_
suit
e_name
<<
", you tried
\n
"
<<
"to define a test using a fixture class different from the one
\n
"
<<
"used earlier. This can happen if the two fixture classes are
\n
"
<<
"from different namespaces and have the same name. You should
\n
"
<<
"probably rename one of the classes to put the tests into different
\n
"
<<
"test
cas
es."
;
<<
"test
suit
es."
;
GTEST_LOG_
(
ERROR
)
<<
FormatFileLocation
(
code_location
.
file
.
c_str
(),
code_location
.
line
)
...
...
@@ -2633,7 +2605,7 @@ namespace {
// A predicate that checks the test name of a TestInfo against a known
// value.
//
// This is used for implementation of the Test
Cas
e class only. We put
// This is used for implementation of the Test
Suit
e class only. We put
// it in the anonymous namespace to prevent polluting the outer
// namespace.
//
...
...
@@ -2660,7 +2632,7 @@ class TestNameIs {
namespace
internal
{
// This method expands all parameterized tests registered with macros TEST_P
// and INSTANTIATE_TEST_
CAS
E_P into regular tests and registers those.
// and INSTANTIATE_TEST_
SUIT
E_P into regular tests and registers those.
// This will be done just once during the program runtime.
void
UnitTestImpl
::
RegisterParameterizedTests
()
{
if
(
!
parameterized_tests_registered_
)
{
...
...
@@ -2718,60 +2690,60 @@ void TestInfo::Run() {
impl
->
set_current_test_info
(
nullptr
);
}
// class Test
Cas
e
// class Test
Suit
e
// Gets the number of successful tests in this test
cas
e.
int
Test
Cas
e
::
successful_test_count
()
const
{
// Gets the number of successful tests in this test
suit
e.
int
Test
Suit
e
::
successful_test_count
()
const
{
return
CountIf
(
test_info_list_
,
TestPassed
);
}
// Gets the number of successful tests in this test
cas
e.
int
Test
Cas
e
::
skipped_test_count
()
const
{
// Gets the number of successful tests in this test
suit
e.
int
Test
Suit
e
::
skipped_test_count
()
const
{
return
CountIf
(
test_info_list_
,
TestSkipped
);
}
// Gets the number of failed tests in this test
cas
e.
int
Test
Cas
e
::
failed_test_count
()
const
{
// Gets the number of failed tests in this test
suit
e.
int
Test
Suit
e
::
failed_test_count
()
const
{
return
CountIf
(
test_info_list_
,
TestFailed
);
}
// Gets the number of disabled tests that will be reported in the XML report.
int
Test
Cas
e
::
reportable_disabled_test_count
()
const
{
int
Test
Suit
e
::
reportable_disabled_test_count
()
const
{
return
CountIf
(
test_info_list_
,
TestReportableDisabled
);
}
// Gets the number of disabled tests in this test
cas
e.
int
Test
Cas
e
::
disabled_test_count
()
const
{
// Gets the number of disabled tests in this test
suit
e.
int
Test
Suit
e
::
disabled_test_count
()
const
{
return
CountIf
(
test_info_list_
,
TestDisabled
);
}
// Gets the number of tests to be printed in the XML report.
int
Test
Cas
e
::
reportable_test_count
()
const
{
int
Test
Suit
e
::
reportable_test_count
()
const
{
return
CountIf
(
test_info_list_
,
TestReportable
);
}
// Get the number of tests in this test
cas
e that should run.
int
Test
Cas
e
::
test_to_run_count
()
const
{
// Get the number of tests in this test
suit
e that should run.
int
Test
Suit
e
::
test_to_run_count
()
const
{
return
CountIf
(
test_info_list_
,
ShouldRunTest
);
}
// Gets the number of all tests.
int
Test
Cas
e
::
total_test_count
()
const
{
int
Test
Suit
e
::
total_test_count
()
const
{
return
static_cast
<
int
>
(
test_info_list_
.
size
());
}
// Creates a Test
Cas
e with the given name.
// Creates a Test
Suit
e with the given name.
//
// Arguments:
//
// name: name of the test
cas
e
// a_type_param: the name of the test
cas
e's type parameter, or NULL if
// this is not a typed or a type-parameterized test
cas
e.
// set_up_tc: pointer to the function that sets up the test
cas
e
// tear_down_tc: pointer to the function that tears down the test
cas
e
Test
Cas
e
::
Test
Cas
e
(
const
char
*
a_name
,
const
char
*
a_type_param
,
Test
::
SetUpTest
Cas
eFunc
set_up_tc
,
Test
::
TearDownTest
Cas
eFunc
tear_down_tc
)
// name: name of the test
suit
e
// a_type_param: the name of the test
suit
e's type parameter, or NULL if
// this is not a typed or a type-parameterized test
suit
e.
// set_up_tc: pointer to the function that sets up the test
suit
e
// tear_down_tc: pointer to the function that tears down the test
suit
e
Test
Suit
e
::
Test
Suit
e
(
const
char
*
a_name
,
const
char
*
a_type_param
,
internal
::
SetUpTest
Suit
eFunc
set_up_tc
,
internal
::
TearDownTest
Suit
eFunc
tear_down_tc
)
:
name_
(
a_name
),
type_param_
(
a_type_param
?
new
std
::
string
(
a_type_param
)
:
nullptr
),
set_up_tc_
(
set_up_tc
),
...
...
@@ -2779,46 +2751,52 @@ TestCase::TestCase(const char* a_name, const char* a_type_param,
should_run_
(
false
),
elapsed_time_
(
0
)
{}
// Destructor of Test
Cas
e.
Test
Cas
e
::~
Test
Cas
e
()
{
// Destructor of Test
Suit
e.
Test
Suit
e
::~
Test
Suit
e
()
{
// Deletes every Test in the collection.
ForEach
(
test_info_list_
,
internal
::
Delete
<
TestInfo
>
);
}
// Returns the i-th test among all the tests. i can range from 0 to
// total_test_count() - 1. If i is not in that range, returns NULL.
const
TestInfo
*
Test
Cas
e
::
GetTestInfo
(
int
i
)
const
{
const
TestInfo
*
Test
Suit
e
::
GetTestInfo
(
int
i
)
const
{
const
int
index
=
GetElementOr
(
test_indices_
,
i
,
-
1
);
return
index
<
0
?
nullptr
:
test_info_list_
[
index
];
}
// Returns the i-th test among all the tests. i can range from 0 to
// total_test_count() - 1. If i is not in that range, returns NULL.
TestInfo
*
Test
Cas
e
::
GetMutableTestInfo
(
int
i
)
{
TestInfo
*
Test
Suit
e
::
GetMutableTestInfo
(
int
i
)
{
const
int
index
=
GetElementOr
(
test_indices_
,
i
,
-
1
);
return
index
<
0
?
nullptr
:
test_info_list_
[
index
];
}
// Adds a test to this test
cas
e. Will delete the test upon
// destruction of the Test
Cas
e object.
void
Test
Cas
e
::
AddTestInfo
(
TestInfo
*
test_info
)
{
// Adds a test to this test
suit
e. Will delete the test upon
// destruction of the Test
Suit
e object.
void
Test
Suit
e
::
AddTestInfo
(
TestInfo
*
test_info
)
{
test_info_list_
.
push_back
(
test_info
);
test_indices_
.
push_back
(
static_cast
<
int
>
(
test_indices_
.
size
()));
}
// Runs every test in this Test
Cas
e.
void
Test
Cas
e
::
Run
()
{
// Runs every test in this Test
Suit
e.
void
Test
Suit
e
::
Run
()
{
if
(
!
should_run_
)
return
;
internal
::
UnitTestImpl
*
const
impl
=
internal
::
GetUnitTestImpl
();
impl
->
set_current_test_
cas
e
(
this
);
impl
->
set_current_test_
suit
e
(
this
);
TestEventListener
*
repeater
=
UnitTest
::
GetInstance
()
->
listeners
().
repeater
();
// Call both legacy and the new API
repeater
->
OnTestSuiteStart
(
*
this
);
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI
repeater
->
OnTestCaseStart
(
*
this
);
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI
impl
->
os_stack_trace_getter
()
->
UponLeavingGTest
();
internal
::
HandleExceptionsInMethodIfSupported
(
this
,
&
Test
Cas
e
::
RunSetUpTest
Cas
e
,
"SetUpTest
Cas
e()"
);
this
,
&
Test
Suit
e
::
RunSetUpTest
Suit
e
,
"SetUpTest
Suit
e()"
);
const
internal
::
TimeInMillis
start
=
internal
::
GetTimeInMillis
();
for
(
int
i
=
0
;
i
<
total_test_count
();
i
++
)
{
...
...
@@ -2828,25 +2806,31 @@ void TestCase::Run() {
impl
->
os_stack_trace_getter
()
->
UponLeavingGTest
();
internal
::
HandleExceptionsInMethodIfSupported
(
this
,
&
Test
Cas
e
::
RunTearDownTest
Cas
e
,
"TearDownTest
Cas
e()"
);
this
,
&
Test
Suit
e
::
RunTearDownTest
Suit
e
,
"TearDownTest
Suit
e()"
);
// Call both legacy and the new API
repeater
->
OnTestSuiteEnd
(
*
this
);
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI
repeater
->
OnTestCaseEnd
(
*
this
);
impl
->
set_current_test_case
(
nullptr
);
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI
impl
->
set_current_test_suite
(
nullptr
);
}
// Clears the results of all tests in this test
cas
e.
void
Test
Cas
e
::
ClearResult
()
{
// Clears the results of all tests in this test
suit
e.
void
Test
Suit
e
::
ClearResult
()
{
ad_hoc_test_result_
.
Clear
();
ForEach
(
test_info_list_
,
TestInfo
::
ClearTestResult
);
}
// Shuffles the tests in this test
cas
e.
void
Test
Cas
e
::
ShuffleTests
(
internal
::
Random
*
random
)
{
// Shuffles the tests in this test
suit
e.
void
Test
Suit
e
::
ShuffleTests
(
internal
::
Random
*
random
)
{
Shuffle
(
random
,
&
test_indices_
);
}
// Restores the test order to before the first shuffle.
void
Test
Cas
e
::
UnshuffleTests
()
{
void
Test
Suit
e
::
UnshuffleTests
()
{
for
(
size_t
i
=
0
;
i
<
test_indices_
.
size
();
i
++
)
{
test_indices_
[
i
]
=
static_cast
<
int
>
(
i
);
}
...
...
@@ -2869,9 +2853,9 @@ static std::string FormatTestCount(int test_count) {
return
FormatCountableNoun
(
test_count
,
"test"
,
"tests"
);
}
// Formats the count of test
cas
es.
static
std
::
string
FormatTest
Cas
eCount
(
int
test_
cas
e_count
)
{
return
FormatCountableNoun
(
test_
cas
e_count
,
"test
cas
e"
,
"test
cas
es"
);
// Formats the count of test
suit
es.
static
std
::
string
FormatTest
Suit
eCount
(
int
test_
suit
e_count
)
{
return
FormatCountableNoun
(
test_
suit
e_count
,
"test
suit
e"
,
"test
suit
es"
);
}
// Converts a TestPartResult::Type enum to human-friendly string
...
...
@@ -3034,15 +3018,14 @@ void ColoredPrintf(GTestColor color, const char* fmt, ...) {
va_list
args
;
va_start
(
args
,
fmt
);
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_
SYMBIAN
|| GTEST_OS_
Z
OS || \
GTEST_OS_IOS ||
GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_
ZOS
|| GTEST_OS_
I
OS || \
GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
const
bool
use_color
=
AlwaysFalse
();
#else
static
const
bool
in_color_mode
=
ShouldUseColor
(
posix
::
IsATTY
(
posix
::
FileNo
(
stdout
))
!=
0
);
const
bool
use_color
=
in_color_mode
&&
(
color
!=
COLOR_DEFAULT
);
#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
// The '!= 0' comparison is necessary to satisfy MSVC 7.1.
#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS
if
(
!
use_color
)
{
vprintf
(
fmt
,
args
);
...
...
@@ -3106,8 +3089,8 @@ static void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
class
PrettyUnitTestResultPrinter
:
public
TestEventListener
{
public:
PrettyUnitTestResultPrinter
()
{}
static
void
PrintTestName
(
const
char
*
test_
cas
e
,
const
char
*
test
)
{
printf
(
"%s.%s"
,
test_
cas
e
,
test
);
static
void
PrintTestName
(
const
char
*
test_
suit
e
,
const
char
*
test
)
{
printf
(
"%s.%s"
,
test_
suit
e
,
test
);
}
// The following methods override what's in the TestEventListener class.
...
...
@@ -3115,11 +3098,11 @@ class PrettyUnitTestResultPrinter : public TestEventListener {
void
OnTestIterationStart
(
const
UnitTest
&
unit_test
,
int
iteration
)
override
;
void
OnEnvironmentsSetUpStart
(
const
UnitTest
&
unit_test
)
override
;
void
OnEnvironmentsSetUpEnd
(
const
UnitTest
&
/*unit_test*/
)
override
{}
void
OnTestCaseStart
(
const
Test
Cas
e
&
test_
cas
e
)
override
;
void
OnTestCaseStart
(
const
Test
Suit
e
&
test_
suit
e
)
override
;
void
OnTestStart
(
const
TestInfo
&
test_info
)
override
;
void
OnTestPartResult
(
const
TestPartResult
&
result
)
override
;
void
OnTestEnd
(
const
TestInfo
&
test_info
)
override
;
void
OnTestCaseEnd
(
const
Test
Cas
e
&
test_
cas
e
)
override
;
void
OnTestCaseEnd
(
const
Test
Suit
e
&
test_
suit
e
)
override
;
void
OnEnvironmentsTearDownStart
(
const
UnitTest
&
unit_test
)
override
;
void
OnEnvironmentsTearDownEnd
(
const
UnitTest
&
/*unit_test*/
)
override
{}
void
OnTestIterationEnd
(
const
UnitTest
&
unit_test
,
int
iteration
)
override
;
...
...
@@ -3162,7 +3145,7 @@ void PrettyUnitTestResultPrinter::OnTestIterationStart(
ColoredPrintf
(
COLOR_GREEN
,
"[==========] "
);
printf
(
"Running %s from %s.
\n
"
,
FormatTestCount
(
unit_test
.
test_to_run_count
()).
c_str
(),
FormatTest
Cas
eCount
(
unit_test
.
test_
cas
e_to_run_count
()).
c_str
());
FormatTest
Suit
eCount
(
unit_test
.
test_
suit
e_to_run_count
()).
c_str
());
fflush
(
stdout
);
}
...
...
@@ -3173,22 +3156,22 @@ void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
fflush
(
stdout
);
}
void
PrettyUnitTestResultPrinter
::
OnTestCaseStart
(
const
Test
Cas
e
&
test_
cas
e
)
{
void
PrettyUnitTestResultPrinter
::
OnTestCaseStart
(
const
Test
Suit
e
&
test_
suit
e
)
{
const
std
::
string
counts
=
FormatCountableNoun
(
test_
cas
e
.
test_to_run_count
(),
"test"
,
"tests"
);
FormatCountableNoun
(
test_
suit
e
.
test_to_run_count
(),
"test"
,
"tests"
);
ColoredPrintf
(
COLOR_GREEN
,
"[----------] "
);
printf
(
"%s from %s"
,
counts
.
c_str
(),
test_
cas
e
.
name
());
if
(
test_
cas
e
.
type_param
()
==
nullptr
)
{
printf
(
"%s from %s"
,
counts
.
c_str
(),
test_
suit
e
.
name
());
if
(
test_
suit
e
.
type_param
()
==
nullptr
)
{
printf
(
"
\n
"
);
}
else
{
printf
(
", where %s = %s
\n
"
,
kTypeParamLabel
,
test_
cas
e
.
type_param
());
printf
(
", where %s = %s
\n
"
,
kTypeParamLabel
,
test_
suit
e
.
type_param
());
}
fflush
(
stdout
);
}
void
PrettyUnitTestResultPrinter
::
OnTestStart
(
const
TestInfo
&
test_info
)
{
ColoredPrintf
(
COLOR_GREEN
,
"[ RUN ] "
);
PrintTestName
(
test_info
.
test_
cas
e_name
(),
test_info
.
name
());
PrintTestName
(
test_info
.
test_
suit
e_name
(),
test_info
.
name
());
printf
(
"
\n
"
);
fflush
(
stdout
);
}
...
...
@@ -3218,7 +3201,7 @@ void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
}
else
{
ColoredPrintf
(
COLOR_RED
,
"[ FAILED ] "
);
}
PrintTestName
(
test_info
.
test_
cas
e_name
(),
test_info
.
name
());
PrintTestName
(
test_info
.
test_
suit
e_name
(),
test_info
.
name
());
if
(
test_info
.
result
()
->
Failed
())
PrintFullTestCommentIfPresent
(
test_info
);
...
...
@@ -3231,15 +3214,14 @@ void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
fflush
(
stdout
);
}
void
PrettyUnitTestResultPrinter
::
OnTestCaseEnd
(
const
Test
Cas
e
&
test_
cas
e
)
{
void
PrettyUnitTestResultPrinter
::
OnTestCaseEnd
(
const
Test
Suit
e
&
test_
suit
e
)
{
if
(
!
GTEST_FLAG
(
print_time
))
return
;
const
std
::
string
counts
=
FormatCountableNoun
(
test_
cas
e
.
test_to_run_count
(),
"test"
,
"tests"
);
FormatCountableNoun
(
test_
suit
e
.
test_to_run_count
(),
"test"
,
"tests"
);
ColoredPrintf
(
COLOR_GREEN
,
"[----------] "
);
printf
(
"%s from %s (%s ms total)
\n\n
"
,
counts
.
c_str
(),
test_case
.
name
(),
internal
::
StreamableToString
(
test_case
.
elapsed_time
()).
c_str
());
printf
(
"%s from %s (%s ms total)
\n\n
"
,
counts
.
c_str
(),
test_suite
.
name
(),
internal
::
StreamableToString
(
test_suite
.
elapsed_time
()).
c_str
());
fflush
(
stdout
);
}
...
...
@@ -3257,18 +3239,18 @@ void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
return
;
}
for
(
int
i
=
0
;
i
<
unit_test
.
total_test_
cas
e_count
();
++
i
)
{
const
Test
Cas
e
&
test_
cas
e
=
*
unit_test
.
GetTest
Cas
e
(
i
);
if
(
!
test_
cas
e
.
should_run
()
||
(
test_
cas
e
.
failed_test_count
()
==
0
))
{
for
(
int
i
=
0
;
i
<
unit_test
.
total_test_
suit
e_count
();
++
i
)
{
const
Test
Suit
e
&
test_
suit
e
=
*
unit_test
.
GetTest
Suit
e
(
i
);
if
(
!
test_
suit
e
.
should_run
()
||
(
test_
suit
e
.
failed_test_count
()
==
0
))
{
continue
;
}
for
(
int
j
=
0
;
j
<
test_
cas
e
.
total_test_count
();
++
j
)
{
const
TestInfo
&
test_info
=
*
test_
cas
e
.
GetTestInfo
(
j
);
for
(
int
j
=
0
;
j
<
test_
suit
e
.
total_test_count
();
++
j
)
{
const
TestInfo
&
test_info
=
*
test_
suit
e
.
GetTestInfo
(
j
);
if
(
!
test_info
.
should_run
()
||
!
test_info
.
result
()
->
Failed
())
{
continue
;
}
ColoredPrintf
(
COLOR_RED
,
"[ FAILED ] "
);
printf
(
"%s.%s"
,
test_
cas
e
.
name
(),
test_info
.
name
());
printf
(
"%s.%s"
,
test_
suit
e
.
name
(),
test_info
.
name
());
PrintFullTestCommentIfPresent
(
test_info
);
printf
(
"
\n
"
);
}
...
...
@@ -3282,18 +3264,18 @@ void PrettyUnitTestResultPrinter::PrintSkippedTests(const UnitTest& unit_test) {
return
;
}
for
(
int
i
=
0
;
i
<
unit_test
.
total_test_
cas
e_count
();
++
i
)
{
const
Test
Cas
e
&
test_
cas
e
=
*
unit_test
.
GetTest
Cas
e
(
i
);
if
(
!
test_
cas
e
.
should_run
()
||
(
test_
cas
e
.
skipped_test_count
()
==
0
))
{
for
(
int
i
=
0
;
i
<
unit_test
.
total_test_
suit
e_count
();
++
i
)
{
const
Test
Suit
e
&
test_
suit
e
=
*
unit_test
.
GetTest
Suit
e
(
i
);
if
(
!
test_
suit
e
.
should_run
()
||
(
test_
suit
e
.
skipped_test_count
()
==
0
))
{
continue
;
}
for
(
int
j
=
0
;
j
<
test_
cas
e
.
total_test_count
();
++
j
)
{
const
TestInfo
&
test_info
=
*
test_
cas
e
.
GetTestInfo
(
j
);
for
(
int
j
=
0
;
j
<
test_
suit
e
.
total_test_count
();
++
j
)
{
const
TestInfo
&
test_info
=
*
test_
suit
e
.
GetTestInfo
(
j
);
if
(
!
test_info
.
should_run
()
||
!
test_info
.
result
()
->
Skipped
())
{
continue
;
}
ColoredPrintf
(
COLOR_GREEN
,
"[ SKIPPED ] "
);
printf
(
"%s.%s"
,
test_
cas
e
.
name
(),
test_info
.
name
());
printf
(
"%s.%s"
,
test_
suit
e
.
name
(),
test_info
.
name
());
printf
(
"
\n
"
);
}
}
...
...
@@ -3304,7 +3286,7 @@ void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
ColoredPrintf
(
COLOR_GREEN
,
"[==========] "
);
printf
(
"%s from %s ran."
,
FormatTestCount
(
unit_test
.
test_to_run_count
()).
c_str
(),
FormatTest
Cas
eCount
(
unit_test
.
test_
cas
e_to_run_count
()).
c_str
());
FormatTest
Suit
eCount
(
unit_test
.
test_
suit
e_to_run_count
()).
c_str
());
if
(
GTEST_FLAG
(
print_time
))
{
printf
(
" (%s ms total)"
,
internal
::
StreamableToString
(
unit_test
.
elapsed_time
()).
c_str
());
...
...
@@ -3365,11 +3347,19 @@ class TestEventRepeater : public TestEventListener {
void
OnTestIterationStart
(
const
UnitTest
&
unit_test
,
int
iteration
)
override
;
void
OnEnvironmentsSetUpStart
(
const
UnitTest
&
unit_test
)
override
;
void
OnEnvironmentsSetUpEnd
(
const
UnitTest
&
unit_test
)
override
;
void
OnTestCaseStart
(
const
TestCase
&
test_case
)
override
;
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI
void
OnTestCaseStart
(
const
TestSuite
&
parameter
)
override
;
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI
void
OnTestSuiteStart
(
const
TestSuite
&
parameter
)
override
;
void
OnTestStart
(
const
TestInfo
&
test_info
)
override
;
void
OnTestPartResult
(
const
TestPartResult
&
result
)
override
;
void
OnTestEnd
(
const
TestInfo
&
test_info
)
override
;
void
OnTestCaseEnd
(
const
TestCase
&
test_case
)
override
;
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI
void
OnTestCaseEnd
(
const
TestSuite
&
parameter
)
override
;
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI
void
OnTestSuiteEnd
(
const
TestSuite
&
parameter
)
override
;
void
OnEnvironmentsTearDownStart
(
const
UnitTest
&
unit_test
)
override
;
void
OnEnvironmentsTearDownEnd
(
const
UnitTest
&
unit_test
)
override
;
void
OnTestIterationEnd
(
const
UnitTest
&
unit_test
,
int
iteration
)
override
;
...
...
@@ -3393,7 +3383,6 @@ void TestEventRepeater::Append(TestEventListener *listener) {
listeners_
.
push_back
(
listener
);
}
// FIXME: Factor the search functionality into Vector::Find.
TestEventListener
*
TestEventRepeater
::
Release
(
TestEventListener
*
listener
)
{
for
(
size_t
i
=
0
;
i
<
listeners_
.
size
();
++
i
)
{
if
(
listeners_
[
i
]
==
listener
)
{
...
...
@@ -3428,14 +3417,22 @@ void TestEventRepeater::Name(const Type& parameter) { \
GTEST_REPEATER_METHOD_
(
OnTestProgramStart
,
UnitTest
)
GTEST_REPEATER_METHOD_
(
OnEnvironmentsSetUpStart
,
UnitTest
)
GTEST_REPEATER_METHOD_
(
OnTestCaseStart
,
TestCase
)
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
GTEST_REPEATER_METHOD_
(
OnTestCaseStart
,
TestSuite
)
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
GTEST_REPEATER_METHOD_
(
OnTestSuiteStart
,
TestSuite
)
GTEST_REPEATER_METHOD_
(
OnTestStart
,
TestInfo
)
GTEST_REPEATER_METHOD_
(
OnTestPartResult
,
TestPartResult
)
GTEST_REPEATER_METHOD_
(
OnEnvironmentsTearDownStart
,
UnitTest
)
GTEST_REVERSE_REPEATER_METHOD_
(
OnEnvironmentsSetUpEnd
,
UnitTest
)
GTEST_REVERSE_REPEATER_METHOD_
(
OnEnvironmentsTearDownEnd
,
UnitTest
)
GTEST_REVERSE_REPEATER_METHOD_
(
OnTestEnd
,
TestInfo
)
GTEST_REVERSE_REPEATER_METHOD_
(
OnTestCaseEnd
,
TestCase
)
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
GTEST_REVERSE_REPEATER_METHOD_
(
OnTestCaseEnd
,
TestSuite
)
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
GTEST_REVERSE_REPEATER_METHOD_
(
OnTestSuiteEnd
,
TestSuite
)
GTEST_REVERSE_REPEATER_METHOD_
(
OnTestProgramEnd
,
UnitTest
)
#undef GTEST_REPEATER_METHOD_
...
...
@@ -3467,11 +3464,11 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {
explicit
XmlUnitTestResultPrinter
(
const
char
*
output_file
);
void
OnTestIterationEnd
(
const
UnitTest
&
unit_test
,
int
iteration
)
override
;
void
ListTestsMatchingFilter
(
const
std
::
vector
<
Test
Cas
e
*>&
test_
cas
es
);
void
ListTestsMatchingFilter
(
const
std
::
vector
<
Test
Suit
e
*>&
test_
suit
es
);
// Prints an XML summary of all unit tests.
static
void
PrintXmlTestsList
(
std
::
ostream
*
stream
,
const
std
::
vector
<
Test
Cas
e
*>&
test_
cas
es
);
const
std
::
vector
<
Test
Suit
e
*>&
test_
suit
es
);
private:
// Is c a whitespace character that is normalized to a space character
...
...
@@ -3516,12 +3513,12 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {
// Streams an XML representation of a TestInfo object.
static
void
OutputXmlTestInfo
(
::
std
::
ostream
*
stream
,
const
char
*
test_
cas
e_name
,
const
char
*
test_
suit
e_name
,
const
TestInfo
&
test_info
);
// Prints an XML representation of a Test
Cas
e object
static
void
PrintXmlTest
Cas
e
(
::
std
::
ostream
*
stream
,
const
Test
Cas
e
&
test_
cas
e
);
// Prints an XML representation of a Test
Suit
e object
static
void
PrintXmlTest
Suit
e
(
::
std
::
ostream
*
stream
,
const
Test
Suit
e
&
test_
suit
e
);
// Prints an XML summary of unit_test to output stream out.
static
void
PrintXmlUnitTest
(
::
std
::
ostream
*
stream
,
...
...
@@ -3563,10 +3560,10 @@ void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
}
void
XmlUnitTestResultPrinter
::
ListTestsMatchingFilter
(
const
std
::
vector
<
Test
Cas
e
*>&
test_
cas
es
)
{
const
std
::
vector
<
Test
Suit
e
*>&
test_
suit
es
)
{
FILE
*
xmlout
=
OpenFileForWriting
(
output_file_
);
std
::
stringstream
stream
;
PrintXmlTestsList
(
&
stream
,
test_
cas
es
);
PrintXmlTestsList
(
&
stream
,
test_
suit
es
);
fprintf
(
xmlout
,
"%s"
,
StringStreamToString
(
&
stream
).
c_str
());
fclose
(
xmlout
);
}
...
...
@@ -3581,8 +3578,6 @@ void XmlUnitTestResultPrinter::ListTestsMatchingFilter(
// module will consist of ordinary English text.
// If this module is ever modified to produce version 1.1 XML output,
// most invalid characters can be retained using character references.
// FIXME: It might be nice to have a minimally invasive, human-readable
// escaping scheme for invalid characters, rather than dropping them.
std
::
string
XmlUnitTestResultPrinter
::
EscapeXml
(
const
std
::
string
&
str
,
bool
is_attribute
)
{
Message
m
;
...
...
@@ -3647,7 +3642,7 @@ std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
// This is how Google Test concepts map to the DTD:
//
// <testsuites name="AllTests"> <-- corresponds to a UnitTest object
// <testsuite name="testcase-name"> <-- corresponds to a Test
Cas
e object
// <testsuite name="testcase-name"> <-- corresponds to a Test
Suit
e object
// <testcase name="test-name"> <-- corresponds to a TestInfo object
// <failure message="...">...</failure>
// <failure message="...">...</failure>
...
...
@@ -3731,41 +3726,41 @@ void XmlUnitTestResultPrinter::OutputXmlAttribute(
}
// Prints an XML representation of a TestInfo object.
// FIXME: There is also value in printing properties with the plain printer.
void
XmlUnitTestResultPrinter
::
OutputXmlTestInfo
(
::
std
::
ostream
*
stream
,
const
char
*
test_
cas
e_name
,
const
char
*
test_
suit
e_name
,
const
TestInfo
&
test_info
)
{
const
TestResult
&
result
=
*
test_info
.
result
();
const
std
::
string
kTest
cas
e
=
"testcase"
;
const
std
::
string
kTest
suit
e
=
"testcase"
;
if
(
test_info
.
is_in_another_shard
())
{
return
;
}
*
stream
<<
" <testcase"
;
OutputXmlAttribute
(
stream
,
kTest
cas
e
,
"name"
,
test_info
.
name
());
OutputXmlAttribute
(
stream
,
kTest
suit
e
,
"name"
,
test_info
.
name
());
if
(
test_info
.
value_param
()
!=
nullptr
)
{
OutputXmlAttribute
(
stream
,
kTest
cas
e
,
"value_param"
,
OutputXmlAttribute
(
stream
,
kTest
suit
e
,
"value_param"
,
test_info
.
value_param
());
}
if
(
test_info
.
type_param
()
!=
nullptr
)
{
OutputXmlAttribute
(
stream
,
kTestcase
,
"type_param"
,
test_info
.
type_param
());
OutputXmlAttribute
(
stream
,
kTestsuite
,
"type_param"
,
test_info
.
type_param
());
}
if
(
GTEST_FLAG
(
list_tests
))
{
OutputXmlAttribute
(
stream
,
kTest
cas
e
,
"file"
,
test_info
.
file
());
OutputXmlAttribute
(
stream
,
kTest
cas
e
,
"line"
,
OutputXmlAttribute
(
stream
,
kTest
suit
e
,
"file"
,
test_info
.
file
());
OutputXmlAttribute
(
stream
,
kTest
suit
e
,
"line"
,
StreamableToString
(
test_info
.
line
()));
*
stream
<<
" />
\n
"
;
return
;
}
OutputXmlAttribute
(
stream
,
kTestcase
,
"status"
,
result
.
Skipped
()
?
"skipped"
:
test_info
.
should_run
()
?
"run"
:
"notrun"
);
OutputXmlAttribute
(
stream
,
kTest
cas
e
,
"time"
,
OutputXmlAttribute
(
stream
,
kTestsuite
,
"status"
,
result
.
Skipped
()
?
"skipped"
:
test_info
.
should_run
()
?
"run"
:
"notrun"
);
OutputXmlAttribute
(
stream
,
kTest
suit
e
,
"time"
,
FormatTimeInMillisAsSeconds
(
result
.
elapsed_time
()));
OutputXmlAttribute
(
stream
,
kTest
cas
e
,
"classname"
,
test_
cas
e_name
);
OutputXmlAttribute
(
stream
,
kTest
suit
e
,
"classname"
,
test_
suit
e_name
);
int
failures
=
0
;
for
(
int
i
=
0
;
i
<
result
.
total_part_count
();
++
i
)
{
...
...
@@ -3798,29 +3793,29 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
}
}
// Prints an XML representation of a Test
Cas
e object
void
XmlUnitTestResultPrinter
::
PrintXmlTest
Cas
e
(
std
::
ostream
*
stream
,
const
Test
Cas
e
&
test_
cas
e
)
{
// Prints an XML representation of a Test
Suit
e object
void
XmlUnitTestResultPrinter
::
PrintXmlTest
Suit
e
(
std
::
ostream
*
stream
,
const
Test
Suit
e
&
test_
suit
e
)
{
const
std
::
string
kTestsuite
=
"testsuite"
;
*
stream
<<
" <"
<<
kTestsuite
;
OutputXmlAttribute
(
stream
,
kTestsuite
,
"name"
,
test_
cas
e
.
name
());
OutputXmlAttribute
(
stream
,
kTestsuite
,
"name"
,
test_
suit
e
.
name
());
OutputXmlAttribute
(
stream
,
kTestsuite
,
"tests"
,
StreamableToString
(
test_
cas
e
.
reportable_test_count
()));
StreamableToString
(
test_
suit
e
.
reportable_test_count
()));
if
(
!
GTEST_FLAG
(
list_tests
))
{
OutputXmlAttribute
(
stream
,
kTestsuite
,
"failures"
,
StreamableToString
(
test_
cas
e
.
failed_test_count
()));
StreamableToString
(
test_
suit
e
.
failed_test_count
()));
OutputXmlAttribute
(
stream
,
kTestsuite
,
"disabled"
,
StreamableToString
(
test_
cas
e
.
reportable_disabled_test_count
()));
StreamableToString
(
test_
suit
e
.
reportable_disabled_test_count
()));
OutputXmlAttribute
(
stream
,
kTestsuite
,
"errors"
,
"0"
);
OutputXmlAttribute
(
stream
,
kTestsuite
,
"time"
,
FormatTimeInMillisAsSeconds
(
test_
cas
e
.
elapsed_time
()));
*
stream
<<
TestPropertiesAsXmlAttributes
(
test_
cas
e
.
ad_hoc_test_result
());
FormatTimeInMillisAsSeconds
(
test_
suit
e
.
elapsed_time
()));
*
stream
<<
TestPropertiesAsXmlAttributes
(
test_
suit
e
.
ad_hoc_test_result
());
}
*
stream
<<
">
\n
"
;
for
(
int
i
=
0
;
i
<
test_
cas
e
.
total_test_count
();
++
i
)
{
if
(
test_
cas
e
.
GetTestInfo
(
i
)
->
is_reportable
())
OutputXmlTestInfo
(
stream
,
test_
cas
e
.
name
(),
*
test_
cas
e
.
GetTestInfo
(
i
));
for
(
int
i
=
0
;
i
<
test_
suit
e
.
total_test_count
();
++
i
)
{
if
(
test_
suit
e
.
GetTestInfo
(
i
)
->
is_reportable
())
OutputXmlTestInfo
(
stream
,
test_
suit
e
.
name
(),
*
test_
suit
e
.
GetTestInfo
(
i
));
}
*
stream
<<
" </"
<<
kTestsuite
<<
">
\n
"
;
}
...
...
@@ -3856,31 +3851,31 @@ void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
OutputXmlAttribute
(
stream
,
kTestsuites
,
"name"
,
"AllTests"
);
*
stream
<<
">
\n
"
;
for
(
int
i
=
0
;
i
<
unit_test
.
total_test_
cas
e_count
();
++
i
)
{
if
(
unit_test
.
GetTest
Cas
e
(
i
)
->
reportable_test_count
()
>
0
)
PrintXmlTest
Cas
e
(
stream
,
*
unit_test
.
GetTest
Cas
e
(
i
));
for
(
int
i
=
0
;
i
<
unit_test
.
total_test_
suit
e_count
();
++
i
)
{
if
(
unit_test
.
GetTest
Suit
e
(
i
)
->
reportable_test_count
()
>
0
)
PrintXmlTest
Suit
e
(
stream
,
*
unit_test
.
GetTest
Suit
e
(
i
));
}
*
stream
<<
"</"
<<
kTestsuites
<<
">
\n
"
;
}
void
XmlUnitTestResultPrinter
::
PrintXmlTestsList
(
std
::
ostream
*
stream
,
const
std
::
vector
<
Test
Cas
e
*>&
test_
cas
es
)
{
std
::
ostream
*
stream
,
const
std
::
vector
<
Test
Suit
e
*>&
test_
suit
es
)
{
const
std
::
string
kTestsuites
=
"testsuites"
;
*
stream
<<
"<?xml version=
\"
1.0
\"
encoding=
\"
UTF-8
\"
?>
\n
"
;
*
stream
<<
"<"
<<
kTestsuites
;
int
total_tests
=
0
;
for
(
size_t
i
=
0
;
i
<
test_cases
.
size
();
++
i
)
{
total_tests
+=
test_
cases
[
i
]
->
total_test_count
();
for
(
auto
test_suite
:
test_suites
)
{
total_tests
+=
test_
suite
->
total_test_count
();
}
OutputXmlAttribute
(
stream
,
kTestsuites
,
"tests"
,
StreamableToString
(
total_tests
));
OutputXmlAttribute
(
stream
,
kTestsuites
,
"name"
,
"AllTests"
);
*
stream
<<
">
\n
"
;
for
(
size_t
i
=
0
;
i
<
test_cases
.
size
();
++
i
)
{
PrintXmlTest
Cas
e
(
stream
,
*
test_
cases
[
i
]
);
for
(
auto
test_suite
:
test_suites
)
{
PrintXmlTest
Suit
e
(
stream
,
*
test_
suite
);
}
*
stream
<<
"</"
<<
kTestsuites
<<
">
\n
"
;
}
...
...
@@ -3929,7 +3924,7 @@ class JsonUnitTestResultPrinter : public EmptyTestEventListener {
// Prints an JSON summary of all unit tests.
static
void
PrintJsonTestList
(
::
std
::
ostream
*
stream
,
const
std
::
vector
<
Test
Cas
e
*>&
test_
cas
es
);
const
std
::
vector
<
Test
Suit
e
*>&
test_
suit
es
);
private:
// Returns an JSON-escaped copy of the input string str.
...
...
@@ -3952,12 +3947,12 @@ class JsonUnitTestResultPrinter : public EmptyTestEventListener {
// Streams a JSON representation of a TestInfo object.
static
void
OutputJsonTestInfo
(
::
std
::
ostream
*
stream
,
const
char
*
test_
cas
e_name
,
const
char
*
test_
suit
e_name
,
const
TestInfo
&
test_info
);
// Prints a JSON representation of a Test
Cas
e object
static
void
PrintJsonTest
Cas
e
(
::
std
::
ostream
*
stream
,
const
Test
Cas
e
&
test_
cas
e
);
// Prints a JSON representation of a Test
Suit
e object
static
void
PrintJsonTest
Suit
e
(
::
std
::
ostream
*
stream
,
const
Test
Suit
e
&
test_
suit
e
);
// Prints a JSON summary of unit_test to output stream out.
static
void
PrintJsonUnitTest
(
::
std
::
ostream
*
stream
,
...
...
@@ -4102,36 +4097,38 @@ void JsonUnitTestResultPrinter::OutputJsonKey(
// Prints a JSON representation of a TestInfo object.
void
JsonUnitTestResultPrinter
::
OutputJsonTestInfo
(
::
std
::
ostream
*
stream
,
const
char
*
test_
cas
e_name
,
const
char
*
test_
suit
e_name
,
const
TestInfo
&
test_info
)
{
const
TestResult
&
result
=
*
test_info
.
result
();
const
std
::
string
kTest
cas
e
=
"testcase"
;
const
std
::
string
kTest
suit
e
=
"testcase"
;
const
std
::
string
kIndent
=
Indent
(
10
);
*
stream
<<
Indent
(
8
)
<<
"{
\n
"
;
OutputJsonKey
(
stream
,
kTest
cas
e
,
"name"
,
test_info
.
name
(),
kIndent
);
OutputJsonKey
(
stream
,
kTest
suit
e
,
"name"
,
test_info
.
name
(),
kIndent
);
if
(
test_info
.
value_param
()
!=
nullptr
)
{
OutputJsonKey
(
stream
,
kTest
cas
e
,
"value_param"
,
test_info
.
value_param
(),
kIndent
);
OutputJsonKey
(
stream
,
kTest
suit
e
,
"value_param"
,
test_info
.
value_param
(),
kIndent
);
}
if
(
test_info
.
type_param
()
!=
nullptr
)
{
OutputJsonKey
(
stream
,
kTest
cas
e
,
"type_param"
,
test_info
.
type_param
(),
OutputJsonKey
(
stream
,
kTest
suit
e
,
"type_param"
,
test_info
.
type_param
(),
kIndent
);
}
if
(
GTEST_FLAG
(
list_tests
))
{
OutputJsonKey
(
stream
,
kTest
cas
e
,
"file"
,
test_info
.
file
(),
kIndent
);
OutputJsonKey
(
stream
,
kTest
cas
e
,
"line"
,
test_info
.
line
(),
kIndent
,
false
);
OutputJsonKey
(
stream
,
kTest
suit
e
,
"file"
,
test_info
.
file
(),
kIndent
);
OutputJsonKey
(
stream
,
kTest
suit
e
,
"line"
,
test_info
.
line
(),
kIndent
,
false
);
*
stream
<<
"
\n
"
<<
Indent
(
8
)
<<
"}"
;
return
;
}
OutputJsonKey
(
stream
,
kTestcase
,
"status"
,
result
.
Skipped
()
?
"SKIPPED"
:
test_info
.
should_run
()
?
"RUN"
:
"NOTRUN"
,
kIndent
);
OutputJsonKey
(
stream
,
kTestcase
,
"time"
,
OutputJsonKey
(
stream
,
kTestsuite
,
"status"
,
result
.
Skipped
()
?
"SKIPPED"
:
test_info
.
should_run
()
?
"RUN"
:
"NOTRUN"
,
kIndent
);
OutputJsonKey
(
stream
,
kTestsuite
,
"time"
,
FormatTimeInMillisAsDuration
(
result
.
elapsed_time
()),
kIndent
);
OutputJsonKey
(
stream
,
kTestcase
,
"classname"
,
test_case_name
,
kIndent
,
false
);
OutputJsonKey
(
stream
,
kTestsuite
,
"classname"
,
test_suite_name
,
kIndent
,
false
);
*
stream
<<
TestPropertiesAsJson
(
result
,
kIndent
);
int
failures
=
0
;
...
...
@@ -4158,40 +4155,40 @@ void JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream,
*
stream
<<
"
\n
"
<<
Indent
(
8
)
<<
"}"
;
}
// Prints an JSON representation of a Test
Cas
e object
void
JsonUnitTestResultPrinter
::
PrintJsonTest
Case
(
std
::
ostream
*
stream
,
const
Test
Cas
e
&
test_
cas
e
)
{
// Prints an JSON representation of a Test
Suit
e object
void
JsonUnitTestResultPrinter
::
PrintJsonTest
Suite
(
std
::
ostream
*
stream
,
const
Test
Suit
e
&
test_
suit
e
)
{
const
std
::
string
kTestsuite
=
"testsuite"
;
const
std
::
string
kIndent
=
Indent
(
6
);
*
stream
<<
Indent
(
4
)
<<
"{
\n
"
;
OutputJsonKey
(
stream
,
kTestsuite
,
"name"
,
test_
cas
e
.
name
(),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuite
,
"tests"
,
test_
cas
e
.
reportable_test_count
(),
OutputJsonKey
(
stream
,
kTestsuite
,
"name"
,
test_
suit
e
.
name
(),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuite
,
"tests"
,
test_
suit
e
.
reportable_test_count
(),
kIndent
);
if
(
!
GTEST_FLAG
(
list_tests
))
{
OutputJsonKey
(
stream
,
kTestsuite
,
"failures"
,
test_case
.
failed_test_count
(),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuite
,
"failures"
,
test_suite
.
failed_test_count
(),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuite
,
"disabled"
,
test_
cas
e
.
reportable_disabled_test_count
(),
kIndent
);
test_
suit
e
.
reportable_disabled_test_count
(),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuite
,
"errors"
,
0
,
kIndent
);
OutputJsonKey
(
stream
,
kTestsuite
,
"time"
,
FormatTimeInMillisAsDuration
(
test_
cas
e
.
elapsed_time
()),
FormatTimeInMillisAsDuration
(
test_
suit
e
.
elapsed_time
()),
kIndent
,
false
);
*
stream
<<
TestPropertiesAsJson
(
test_
cas
e
.
ad_hoc_test_result
(),
kIndent
)
*
stream
<<
TestPropertiesAsJson
(
test_
suit
e
.
ad_hoc_test_result
(),
kIndent
)
<<
",
\n
"
;
}
*
stream
<<
kIndent
<<
"
\"
"
<<
kTestsuite
<<
"
\"
: [
\n
"
;
bool
comma
=
false
;
for
(
int
i
=
0
;
i
<
test_
cas
e
.
total_test_count
();
++
i
)
{
if
(
test_
cas
e
.
GetTestInfo
(
i
)
->
is_reportable
())
{
for
(
int
i
=
0
;
i
<
test_
suit
e
.
total_test_count
();
++
i
)
{
if
(
test_
suit
e
.
GetTestInfo
(
i
)
->
is_reportable
())
{
if
(
comma
)
{
*
stream
<<
",
\n
"
;
}
else
{
comma
=
true
;
}
OutputJsonTestInfo
(
stream
,
test_
cas
e
.
name
(),
*
test_
cas
e
.
GetTestInfo
(
i
));
OutputJsonTestInfo
(
stream
,
test_
suit
e
.
name
(),
*
test_
suit
e
.
GetTestInfo
(
i
));
}
}
*
stream
<<
"
\n
"
<<
kIndent
<<
"]
\n
"
<<
Indent
(
4
)
<<
"}"
;
...
...
@@ -4229,14 +4226,14 @@ void JsonUnitTestResultPrinter::PrintJsonUnitTest(std::ostream* stream,
*
stream
<<
kIndent
<<
"
\"
"
<<
kTestsuites
<<
"
\"
: [
\n
"
;
bool
comma
=
false
;
for
(
int
i
=
0
;
i
<
unit_test
.
total_test_
cas
e_count
();
++
i
)
{
if
(
unit_test
.
GetTest
Cas
e
(
i
)
->
reportable_test_count
()
>
0
)
{
for
(
int
i
=
0
;
i
<
unit_test
.
total_test_
suit
e_count
();
++
i
)
{
if
(
unit_test
.
GetTest
Suit
e
(
i
)
->
reportable_test_count
()
>
0
)
{
if
(
comma
)
{
*
stream
<<
",
\n
"
;
}
else
{
comma
=
true
;
}
PrintJsonTest
Cas
e
(
stream
,
*
unit_test
.
GetTest
Cas
e
(
i
));
PrintJsonTest
Suit
e
(
stream
,
*
unit_test
.
GetTest
Suit
e
(
i
));
}
}
...
...
@@ -4244,24 +4241,24 @@ void JsonUnitTestResultPrinter::PrintJsonUnitTest(std::ostream* stream,
}
void
JsonUnitTestResultPrinter
::
PrintJsonTestList
(
std
::
ostream
*
stream
,
const
std
::
vector
<
Test
Cas
e
*>&
test_
cas
es
)
{
std
::
ostream
*
stream
,
const
std
::
vector
<
Test
Suit
e
*>&
test_
suit
es
)
{
const
std
::
string
kTestsuites
=
"testsuites"
;
const
std
::
string
kIndent
=
Indent
(
2
);
*
stream
<<
"{
\n
"
;
int
total_tests
=
0
;
for
(
size_t
i
=
0
;
i
<
test_cases
.
size
();
++
i
)
{
total_tests
+=
test_
cases
[
i
]
->
total_test_count
();
for
(
auto
test_suite
:
test_suites
)
{
total_tests
+=
test_
suite
->
total_test_count
();
}
OutputJsonKey
(
stream
,
kTestsuites
,
"tests"
,
total_tests
,
kIndent
);
OutputJsonKey
(
stream
,
kTestsuites
,
"name"
,
"AllTests"
,
kIndent
);
*
stream
<<
kIndent
<<
"
\"
"
<<
kTestsuites
<<
"
\"
: [
\n
"
;
for
(
size_t
i
=
0
;
i
<
test_
cas
es
.
size
();
++
i
)
{
for
(
size_t
i
=
0
;
i
<
test_
suit
es
.
size
();
++
i
)
{
if
(
i
!=
0
)
{
*
stream
<<
",
\n
"
;
}
PrintJsonTest
Cas
e
(
stream
,
*
test_
cas
es
[
i
]);
PrintJsonTest
Suit
e
(
stream
,
*
test_
suit
es
[
i
]);
}
*
stream
<<
"
\n
"
...
...
@@ -4552,26 +4549,42 @@ UnitTest* UnitTest::GetInstance() {
#endif // defined(__BORLANDC__)
}
// Gets the number of successful test
cas
es.
int
UnitTest
::
successful_test_
cas
e_count
()
const
{
return
impl
()
->
successful_test_
cas
e_count
();
// Gets the number of successful test
suit
es.
int
UnitTest
::
successful_test_
suit
e_count
()
const
{
return
impl
()
->
successful_test_
suit
e_count
();
}
// Gets the number of failed test
cas
es.
int
UnitTest
::
failed_test_
cas
e_count
()
const
{
return
impl
()
->
failed_test_
cas
e_count
();
// Gets the number of failed test
suit
es.
int
UnitTest
::
failed_test_
suit
e_count
()
const
{
return
impl
()
->
failed_test_
suit
e_count
();
}
// Gets the number of all test
cas
es.
int
UnitTest
::
total_test_
cas
e_count
()
const
{
return
impl
()
->
total_test_
cas
e_count
();
// Gets the number of all test
suit
es.
int
UnitTest
::
total_test_
suit
e_count
()
const
{
return
impl
()
->
total_test_
suit
e_count
();
}
// Gets the number of all test
cas
es that contain at least one test
// Gets the number of all test
suit
es that contain at least one test
// that should run.
int
UnitTest
::
test_suite_to_run_count
()
const
{
return
impl
()
->
test_suite_to_run_count
();
}
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
int
UnitTest
::
successful_test_case_count
()
const
{
return
impl
()
->
successful_test_suite_count
();
}
int
UnitTest
::
failed_test_case_count
()
const
{
return
impl
()
->
failed_test_suite_count
();
}
int
UnitTest
::
total_test_case_count
()
const
{
return
impl
()
->
total_test_suite_count
();
}
int
UnitTest
::
test_case_to_run_count
()
const
{
return
impl
()
->
test_
cas
e_to_run_count
();
return
impl
()
->
test_
suit
e_to_run_count
();
}
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
// Gets the number of successful tests.
int
UnitTest
::
successful_test_count
()
const
{
...
...
@@ -4618,29 +4631,36 @@ internal::TimeInMillis UnitTest::elapsed_time() const {
return
impl
()
->
elapsed_time
();
}
// Returns true iff the unit test passed (i.e. all test
cas
es passed).
// Returns true iff the unit test passed (i.e. all test
suit
es passed).
bool
UnitTest
::
Passed
()
const
{
return
impl
()
->
Passed
();
}
// Returns true iff the unit test failed (i.e. some test
cas
e failed
// Returns true iff the unit test failed (i.e. some test
suit
e failed
// or something outside of all tests failed).
bool
UnitTest
::
Failed
()
const
{
return
impl
()
->
Failed
();
}
// Gets the i-th test case among all the test cases. i can range from 0 to
// total_test_case_count() - 1. If i is not in that range, returns NULL.
// Gets the i-th test suite among all the test suites. i can range from 0 to
// total_test_suite_count() - 1. If i is not in that range, returns NULL.
const
TestSuite
*
UnitTest
::
GetTestSuite
(
int
i
)
const
{
return
impl
()
->
GetTestSuite
(
i
);
}
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
const
TestCase
*
UnitTest
::
GetTestCase
(
int
i
)
const
{
return
impl
()
->
GetTestCase
(
i
);
}
#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
// Returns the TestResult containing information on test failures and
// properties logged outside of individual test
cas
es.
// properties logged outside of individual test
suit
es.
const
TestResult
&
UnitTest
::
ad_hoc_test_result
()
const
{
return
*
impl
()
->
ad_hoc_test_result
();
}
// Gets the i-th test
cas
e among all the test
cas
es. i can range from 0 to
// total_test_
cas
e_count() - 1. If i is not in that range, returns NULL.
Test
Cas
e
*
UnitTest
::
GetMutableTest
Cas
e
(
int
i
)
{
return
impl
()
->
GetMutable
Test
Case
(
i
);
// Gets the i-th test
suit
e among all the test
suit
es. i can range from 0 to
// total_test_
suit
e_count() - 1. If i is not in that range, returns NULL.
Test
Suit
e
*
UnitTest
::
GetMutableTest
Suit
e
(
int
i
)
{
return
impl
()
->
GetMutable
Suite
Case
(
i
);
}
// Returns the list of event listeners that can be used to track events
...
...
@@ -4723,8 +4743,7 @@ void UnitTest::AddTestPartResult(
#else
// Dereference nullptr through a volatile pointer to prevent the compiler
// from removing. We use this rather than abort() or __builtin_trap() for
// portability: Symbian doesn't implement abort() well, and some debuggers
// don't correctly trap abort().
// portability: some debuggers don't correctly trap abort().
*
static_cast
<
volatile
int
*>
(
nullptr
)
=
1
;
#endif // GTEST_OS_WINDOWS
}
else
if
(
GTEST_FLAG
(
throw_on_failure
))
{
...
...
@@ -4740,8 +4759,8 @@ void UnitTest::AddTestPartResult(
}
// Adds a TestProperty to the current TestResult object when invoked from
// inside a test, to current Test
Cas
e's ad_hoc_test_result_ when invoked
// from SetUpTest
Cas
e or TearDownTest
Cas
e, or to the global property set
// inside a test, to current Test
Suit
e's ad_hoc_test_result_ when invoked
// from SetUpTest
Suit
e or TearDownTest
Suit
e, or to the global property set
// when invoked elsewhere. If the result already contains a property with
// the same key, the value will be updated.
void
UnitTest
::
RecordProperty
(
const
std
::
string
&
key
,
...
...
@@ -4833,13 +4852,22 @@ const char* UnitTest::original_working_dir() const {
return
impl_
->
original_working_dir_
.
c_str
();
}
// Returns the Test
Cas
e object for the test that's currently running,
// Returns the Test
Suit
e object for the test that's currently running,
// or NULL if no test is running.
const
TestSuite
*
UnitTest
::
current_test_suite
()
const
GTEST_LOCK_EXCLUDED_
(
mutex_
)
{
internal
::
MutexLock
lock
(
&
mutex_
);
return
impl_
->
current_test_suite
();
}
// Legacy API is still available but deprecated
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
const
TestCase
*
UnitTest
::
current_test_case
()
const
GTEST_LOCK_EXCLUDED_
(
mutex_
)
{
internal
::
MutexLock
lock
(
&
mutex_
);
return
impl_
->
current_test_
cas
e
();
return
impl_
->
current_test_
suit
e
();
}
#endif
// Returns the TestInfo object for the test that's currently running,
// or NULL if no test is running.
...
...
@@ -4852,11 +4880,10 @@ const TestInfo* UnitTest::current_test_info() const
// Returns the random seed used at the start of the current test run.
int
UnitTest
::
random_seed
()
const
{
return
impl_
->
random_seed
();
}
// Returns ParameterizedTest
Cas
eRegistry object used to keep track of
// Returns ParameterizedTest
Suit
eRegistry object used to keep track of
// value-parameterized tests and instantiate and register them.
internal
::
ParameterizedTestCaseRegistry
&
UnitTest
::
parameterized_test_registry
()
GTEST_LOCK_EXCLUDED_
(
mutex_
)
{
internal
::
ParameterizedTestSuiteRegistry
&
UnitTest
::
parameterized_test_registry
()
GTEST_LOCK_EXCLUDED_
(
mutex_
)
{
return
impl_
->
parameterized_test_registry
();
}
...
...
@@ -4898,8 +4925,8 @@ UnitTestImpl::UnitTestImpl(UnitTest* parent)
&
default_per_thread_test_part_result_reporter_
),
parameterized_test_registry_
(),
parameterized_tests_registered_
(
false
),
last_death_test_
cas
e_
(
-
1
),
current_test_
cas
e_
(
nullptr
),
last_death_test_
suit
e_
(
-
1
),
current_test_
suit
e_
(
nullptr
),
current_test_info_
(
nullptr
),
ad_hoc_test_result_
(),
os_stack_trace_getter_
(
nullptr
),
...
...
@@ -4917,8 +4944,8 @@ UnitTestImpl::UnitTestImpl(UnitTest* parent)
}
UnitTestImpl
::~
UnitTestImpl
()
{
// Deletes every Test
Cas
e.
ForEach
(
test_
cas
es_
,
internal
::
Delete
<
Test
Cas
e
>
);
// Deletes every Test
Suit
e.
ForEach
(
test_
suit
es_
,
internal
::
Delete
<
Test
Suit
e
>
);
// Deletes every Environment.
ForEach
(
environments_
,
internal
::
Delete
<
Environment
>
);
...
...
@@ -4927,8 +4954,8 @@ UnitTestImpl::~UnitTestImpl() {
}
// Adds a TestProperty to the current TestResult object when invoked in a
// context of a test, to current test
cas
e's ad_hoc_test_result when invoke
// from SetUpTest
Cas
e/TearDownTest
Cas
e, or to the global property set
// context of a test, to current test
suit
e's ad_hoc_test_result when invoke
// from SetUpTest
Suit
e/TearDownTest
Suit
e, or to the global property set
// otherwise. If the result already contains a property with the same key,
// the value will be updated.
void
UnitTestImpl
::
RecordProperty
(
const
TestProperty
&
test_property
)
{
...
...
@@ -4938,9 +4965,9 @@ void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
if
(
current_test_info_
!=
nullptr
)
{
xml_element
=
"testcase"
;
test_result
=
&
(
current_test_info_
->
result_
);
}
else
if
(
current_test_
cas
e_
!=
nullptr
)
{
}
else
if
(
current_test_
suit
e_
!=
nullptr
)
{
xml_element
=
"testsuite"
;
test_result
=
&
(
current_test_
cas
e_
->
ad_hoc_test_result_
);
test_result
=
&
(
current_test_
suit
e_
->
ad_hoc_test_result_
);
}
else
{
xml_element
=
"testsuites"
;
test_result
=
&
ad_hoc_test_result_
;
...
...
@@ -5034,75 +5061,73 @@ void UnitTestImpl::PostFlagParsingInit() {
}
}
// A predicate that checks the name of a Test
Cas
e against a known
// A predicate that checks the name of a Test
Suit
e against a known
// value.
//
// This is used for implementation of the UnitTest class only. We put
// it in the anonymous namespace to prevent polluting the outer
// namespace.
//
// Test
Cas
eNameIs is copyable.
class
Test
Cas
eNameIs
{
// Test
Suit
eNameIs is copyable.
class
Test
Suit
eNameIs
{
public:
// Constructor.
explicit
TestCaseNameIs
(
const
std
::
string
&
name
)
:
name_
(
name
)
{}
explicit
TestSuiteNameIs
(
const
std
::
string
&
name
)
:
name_
(
name
)
{}
// Returns true iff the name of test_
cas
e matches name_.
bool
operator
()(
const
Test
Cas
e
*
test_
cas
e
)
const
{
return
test_
cas
e
!=
nullptr
&&
strcmp
(
test_
cas
e
->
name
(),
name_
.
c_str
())
==
0
;
// Returns true iff the name of test_
suit
e matches name_.
bool
operator
()(
const
Test
Suit
e
*
test_
suit
e
)
const
{
return
test_
suit
e
!=
nullptr
&&
strcmp
(
test_
suit
e
->
name
(),
name_
.
c_str
())
==
0
;
}
private:
std
::
string
name_
;
};
// Finds and returns a Test
Cas
e with the given name. If one doesn't
// Finds and returns a Test
Suit
e with the given name. If one doesn't
// exist, creates one and returns it. It's the CALLER'S
// RESPONSIBILITY to ensure that this function is only called WHEN THE
// TESTS ARE NOT SHUFFLED.
//
// Arguments:
//
// test_case_name: name of the test case
// type_param: the name of the test case's type parameter, or NULL if
// this is not a typed or a type-parameterized test case.
// set_up_tc: pointer to the function that sets up the test case
// tear_down_tc: pointer to the function that tears down the test case
TestCase
*
UnitTestImpl
::
GetTestCase
(
const
char
*
test_case_name
,
const
char
*
type_param
,
Test
::
SetUpTestCaseFunc
set_up_tc
,
Test
::
TearDownTestCaseFunc
tear_down_tc
)
{
// Can we find a TestCase with the given name?
const
std
::
vector
<
TestCase
*>::
const_reverse_iterator
test_case
=
std
::
find_if
(
test_cases_
.
rbegin
(),
test_cases_
.
rend
(),
TestCaseNameIs
(
test_case_name
));
if
(
test_case
!=
test_cases_
.
rend
())
return
*
test_case
;
// test_suite_name: name of the test suite
// type_param: the name of the test suite's type parameter, or NULL if
// this is not a typed or a type-parameterized test suite.
// set_up_tc: pointer to the function that sets up the test suite
// tear_down_tc: pointer to the function that tears down the test suite
TestSuite
*
UnitTestImpl
::
GetTestSuite
(
const
char
*
test_suite_name
,
const
char
*
type_param
,
internal
::
SetUpTestSuiteFunc
set_up_tc
,
internal
::
TearDownTestSuiteFunc
tear_down_tc
)
{
// Can we find a TestSuite with the given name?
const
auto
test_suite
=
std
::
find_if
(
test_suites_
.
rbegin
(),
test_suites_
.
rend
(),
TestSuiteNameIs
(
test_suite_name
));
if
(
test_suite
!=
test_suites_
.
rend
())
return
*
test_suite
;
// No. Let's create one.
TestCase
*
const
new_test_
cas
e
=
new
Test
Cas
e
(
test_
cas
e_name
,
type_param
,
set_up_tc
,
tear_down_tc
);
// Is this a death test
cas
e?
if
(
internal
::
UnitTestOptions
::
MatchesFilter
(
test_
cas
e_name
,
kDeathTest
Cas
eFilter
))
{
// Yes. Inserts the test
cas
e after the last death test
cas
e
// defined so far. This only works when the test
cas
es haven't
auto
*
const
new_test_
suit
e
=
new
Test
Suit
e
(
test_
suit
e_name
,
type_param
,
set_up_tc
,
tear_down_tc
);
// Is this a death test
suit
e?
if
(
internal
::
UnitTestOptions
::
MatchesFilter
(
test_
suit
e_name
,
kDeathTest
Suit
eFilter
))
{
// Yes. Inserts the test
suit
e after the last death test
suit
e
// defined so far. This only works when the test
suit
es haven't
// been shuffled. Otherwise we may end up running a death test
// after a non-death test.
++
last_death_test_
cas
e_
;
test_
cas
es_
.
insert
(
test_
cas
es_
.
begin
()
+
last_death_test_
cas
e_
,
new_test_
cas
e
);
++
last_death_test_
suit
e_
;
test_
suit
es_
.
insert
(
test_
suit
es_
.
begin
()
+
last_death_test_
suit
e_
,
new_test_
suit
e
);
}
else
{
// No. Appends to the end of the list.
test_
cas
es_
.
push_back
(
new_test_
cas
e
);
test_
suit
es_
.
push_back
(
new_test_
suit
e
);
}
test_
cas
e_indices_
.
push_back
(
static_cast
<
int
>
(
test_
cas
e_indices_
.
size
()));
return
new_test_
cas
e
;
test_
suit
e_indices_
.
push_back
(
static_cast
<
int
>
(
test_
suit
e_indices_
.
size
()));
return
new_test_
suit
e
;
}
// Helpers for setting up / tearing down the given environment. They
...
...
@@ -5189,7 +5214,7 @@ bool UnitTestImpl::RunAllTests() {
const
TimeInMillis
start
=
GetTimeInMillis
();
// Shuffles test
cas
es and tests if requested.
// Shuffles test
suit
es and tests if requested.
if
(
has_tests_to_run
&&
GTEST_FLAG
(
shuffle
))
{
random
()
->
Reseed
(
random_seed_
);
// This should be done before calling OnTestIterationStart(),
...
...
@@ -5201,7 +5226,7 @@ bool UnitTestImpl::RunAllTests() {
// Tells the unit test event listeners that the tests are about to start.
repeater
->
OnTestIterationStart
(
*
parent_
,
i
);
// Runs each test
cas
e if there is at least one test to run.
// Runs each test
suit
e if there is at least one test to run.
if
(
has_tests_to_run
)
{
// Sets up all environments beforehand.
repeater
->
OnEnvironmentsSetUpStart
(
*
parent_
);
...
...
@@ -5211,9 +5236,9 @@ bool UnitTestImpl::RunAllTests() {
// Runs the tests only if there was no fatal failure during global
// set-up.
if
(
!
Test
::
HasFatalFailure
())
{
for
(
int
test_index
=
0
;
test_index
<
total_test_
cas
e_count
();
for
(
int
test_index
=
0
;
test_index
<
total_test_
suit
e_count
();
test_index
++
)
{
GetMutable
Test
Case
(
test_index
)
->
Run
();
GetMutable
Suite
Case
(
test_index
)
->
Run
();
}
}
...
...
@@ -5362,7 +5387,7 @@ bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
// Compares the name of each test with the user-specified filter to
// decide whether the test should be run, then records the result in
// each Test
Cas
e and TestInfo object.
// each Test
Suit
e and TestInfo object.
// If shard_tests == true, further filters tests based on sharding
// variables in the environment - see
// https://github.com/google/googletest/blob/master/googletest/docs/advanced.md
...
...
@@ -5379,26 +5404,23 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
// this shard.
int
num_runnable_tests
=
0
;
int
num_selected_tests
=
0
;
for
(
size_t
i
=
0
;
i
<
test_cases_
.
size
();
i
++
)
{
TestCase
*
const
test_case
=
test_cases_
[
i
];
const
std
::
string
&
test_case_name
=
test_case
->
name
();
test_case
->
set_should_run
(
false
);
for
(
auto
*
test_suite
:
test_suites_
)
{
const
std
::
string
&
test_suite_name
=
test_suite
->
name
();
test_suite
->
set_should_run
(
false
);
for
(
size_t
j
=
0
;
j
<
test_
cas
e
->
test_info_list
().
size
();
j
++
)
{
TestInfo
*
const
test_info
=
test_
cas
e
->
test_info_list
()[
j
];
for
(
size_t
j
=
0
;
j
<
test_
suit
e
->
test_info_list
().
size
();
j
++
)
{
TestInfo
*
const
test_info
=
test_
suit
e
->
test_info_list
()[
j
];
const
std
::
string
test_name
(
test_info
->
name
());
// A test is disabled if test
cas
e name or test name matches
// A test is disabled if test
suit
e name or test name matches
// kDisableTestFilter.
const
bool
is_disabled
=
internal
::
UnitTestOptions
::
MatchesFilter
(
test_case_name
,
kDisableTestFilter
)
||
internal
::
UnitTestOptions
::
MatchesFilter
(
test_name
,
kDisableTestFilter
);
const
bool
is_disabled
=
internal
::
UnitTestOptions
::
MatchesFilter
(
test_suite_name
,
kDisableTestFilter
)
||
internal
::
UnitTestOptions
::
MatchesFilter
(
test_name
,
kDisableTestFilter
);
test_info
->
is_disabled_
=
is_disabled
;
const
bool
matches_filter
=
internal
::
UnitTestOptions
::
FilterMatchesTest
(
test_case_name
,
test_name
);
const
bool
matches_filter
=
internal
::
UnitTestOptions
::
FilterMatchesTest
(
test_suite_name
,
test_name
);
test_info
->
matches_filter_
=
matches_filter
;
const
bool
is_runnable
=
...
...
@@ -5415,7 +5437,7 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
num_selected_tests
+=
is_selected
;
test_info
->
should_run_
=
is_selected
;
test_
cas
e
->
set_should_run
(
test_
cas
e
->
should_run
()
||
is_selected
);
test_
suit
e
->
set_should_run
(
test_
suit
e
->
should_run
()
||
is_selected
);
}
}
return
num_selected_tests
;
...
...
@@ -5448,22 +5470,20 @@ void UnitTestImpl::ListTestsMatchingFilter() {
// Print at most this many characters for each type/value parameter.
const
int
kMaxParamLength
=
250
;
for
(
size_t
i
=
0
;
i
<
test_cases_
.
size
();
i
++
)
{
const
TestCase
*
const
test_case
=
test_cases_
[
i
];
bool
printed_test_case_name
=
false
;
for
(
auto
*
test_suite
:
test_suites_
)
{
bool
printed_test_suite_name
=
false
;
for
(
size_t
j
=
0
;
j
<
test_case
->
test_info_list
().
size
();
j
++
)
{
const
TestInfo
*
const
test_info
=
test_case
->
test_info_list
()[
j
];
for
(
size_t
j
=
0
;
j
<
test_suite
->
test_info_list
().
size
();
j
++
)
{
const
TestInfo
*
const
test_info
=
test_suite
->
test_info_list
()[
j
];
if
(
test_info
->
matches_filter_
)
{
if
(
!
printed_test_
cas
e_name
)
{
printed_test_
cas
e_name
=
true
;
printf
(
"%s."
,
test_
cas
e
->
name
());
if
(
test_
cas
e
->
type_param
()
!=
nullptr
)
{
if
(
!
printed_test_
suit
e_name
)
{
printed_test_
suit
e_name
=
true
;
printf
(
"%s."
,
test_
suit
e
->
name
());
if
(
test_
suit
e
->
type_param
()
!=
nullptr
)
{
printf
(
" # %s = "
,
kTypeParamLabel
);
// We print the type parameter on a single line to make
// the output easy to parse by a program.
PrintOnOneLine
(
test_
cas
e
->
type_param
(),
kMaxParamLength
);
PrintOnOneLine
(
test_
suit
e
->
type_param
(),
kMaxParamLength
);
}
printf
(
"
\n
"
);
}
...
...
@@ -5487,11 +5507,11 @@ void UnitTestImpl::ListTestsMatchingFilter() {
if
(
output_format
==
"xml"
)
{
XmlUnitTestResultPrinter
(
UnitTestOptions
::
GetAbsolutePathToOutputFile
().
c_str
())
.
PrintXmlTestsList
(
&
stream
,
test_
cas
es_
);
.
PrintXmlTestsList
(
&
stream
,
test_
suit
es_
);
}
else
if
(
output_format
==
"json"
)
{
JsonUnitTestResultPrinter
(
UnitTestOptions
::
GetAbsolutePathToOutputFile
().
c_str
())
.
PrintJsonTestList
(
&
stream
,
test_
cas
es_
);
.
PrintJsonTestList
(
&
stream
,
test_
suit
es_
);
}
fprintf
(
fileout
,
"%s"
,
StringStreamToString
(
&
stream
).
c_str
());
fclose
(
fileout
);
...
...
@@ -5531,35 +5551,35 @@ TestResult* UnitTestImpl::current_test_result() {
if
(
current_test_info_
!=
nullptr
)
{
return
&
current_test_info_
->
result_
;
}
if
(
current_test_
cas
e_
!=
nullptr
)
{
return
&
current_test_
cas
e_
->
ad_hoc_test_result_
;
if
(
current_test_
suit
e_
!=
nullptr
)
{
return
&
current_test_
suit
e_
->
ad_hoc_test_result_
;
}
return
&
ad_hoc_test_result_
;
}
// Shuffles all test
cas
es, and the tests within each test
cas
e,
// Shuffles all test
suit
es, and the tests within each test
suit
e,
// making sure that death tests are still run first.
void
UnitTestImpl
::
ShuffleTests
()
{
// Shuffles the death test
cas
es.
ShuffleRange
(
random
(),
0
,
last_death_test_
cas
e_
+
1
,
&
test_
cas
e_indices_
);
// Shuffles the death test
suit
es.
ShuffleRange
(
random
(),
0
,
last_death_test_
suit
e_
+
1
,
&
test_
suit
e_indices_
);
// Shuffles the non-death test
cas
es.
ShuffleRange
(
random
(),
last_death_test_
cas
e_
+
1
,
static_cast
<
int
>
(
test_
cas
es_
.
size
()),
&
test_
cas
e_indices_
);
// Shuffles the non-death test
suit
es.
ShuffleRange
(
random
(),
last_death_test_
suit
e_
+
1
,
static_cast
<
int
>
(
test_
suit
es_
.
size
()),
&
test_
suit
e_indices_
);
// Shuffles the tests inside each test
cas
e.
for
(
size_t
i
=
0
;
i
<
test_cases_
.
size
();
i
++
)
{
test_
cases_
[
i
]
->
ShuffleTests
(
random
());
// Shuffles the tests inside each test
suit
e.
for
(
auto
&
test_suite
:
test_suites_
)
{
test_
suite
->
ShuffleTests
(
random
());
}
}
// Restores the test
cas
es and tests to their order before the first shuffle.
// Restores the test
suit
es and tests to their order before the first shuffle.
void
UnitTestImpl
::
UnshuffleTests
()
{
for
(
size_t
i
=
0
;
i
<
test_
cas
es_
.
size
();
i
++
)
{
// Unshuffles the tests in each test
cas
e.
test_
cas
es_
[
i
]
->
UnshuffleTests
();
// Resets the index of each test
cas
e.
test_
cas
e_indices_
[
i
]
=
static_cast
<
int
>
(
i
);
for
(
size_t
i
=
0
;
i
<
test_
suit
es_
.
size
();
i
++
)
{
// Unshuffles the tests in each test
suit
e.
test_
suit
es_
[
i
]
->
UnshuffleTests
();
// Resets the index of each test
suit
e.
test_
suit
e_indices_
[
i
]
=
static_cast
<
int
>
(
i
);
}
}
...
...
@@ -5723,8 +5743,6 @@ static bool HasGoogleTestFlagPrefix(const char* str) {
// @Y changes the color to yellow.
// @D changes to the default terminal text color.
//
// FIXME: Write tests for this once we add stdout
// capturing to Google Test.
static
void
PrintColorEncoded
(
const
char
*
str
)
{
GTestColor
color
=
COLOR_DEFAULT
;
// The current color.
...
...
googletest/test/BUILD.bazel
View file @
0ffa5f97
...
...
@@ -278,6 +278,13 @@ cc_binary(
deps
=
[
"//:gtest"
],
)
cc_test
(
name
=
"gtest_skip_test"
,
size
=
"small"
,
srcs
=
[
"gtest_skip_test.cc"
],
deps
=
[
"//:gtest_main"
],
)
py_test
(
name
=
"googletest-list-tests-unittest"
,
size
=
"small"
,
...
...
googletest/test/googletest-catch-exceptions-test.py
View file @
0ffa5f97
...
...
@@ -140,8 +140,7 @@ class CatchCxxExceptionsTest(gtest_test_utils.TestCase):
def
testCatchesCxxExceptionsInSetUpTestCase
(
self
):
self
.
assert_
(
'C++ exception with description "Standard C++ exception"'
' thrown in SetUpTestCase()'
in
EX_BINARY_OUTPUT
)
' thrown in SetUpTestSuite()'
in
EX_BINARY_OUTPUT
)
self
.
assert_
(
'CxxExceptionInConstructorTest::TearDownTestCase() '
'called as expected.'
in
EX_BINARY_OUTPUT
)
...
...
@@ -163,8 +162,7 @@ class CatchCxxExceptionsTest(gtest_test_utils.TestCase):
def
testCatchesCxxExceptionsInTearDownTestCase
(
self
):
self
.
assert_
(
'C++ exception with description "Standard C++ exception"'
' thrown in TearDownTestCase()'
in
EX_BINARY_OUTPUT
)
' thrown in TearDownTestSuite()'
in
EX_BINARY_OUTPUT
)
def
testCatchesCxxExceptionsInSetUp
(
self
):
self
.
assert_
(
'C++ exception with description "Standard C++ exception"'
...
...
googletest/test/googletest-death-test-test.cc
View file @
0ffa5f97
...
...
@@ -1281,9 +1281,6 @@ TEST(ParseNaturalNumberTest, WorksForShorterIntegers) {
# if GTEST_OS_WINDOWS
TEST
(
EnvironmentTest
,
HandleFitsIntoSizeT
)
{
// FIXME: Remove this test after this condition is verified
// in a static assertion in gtest-death-test.cc in the function
// GetStatusFileDescriptor.
ASSERT_TRUE
(
sizeof
(
HANDLE
)
<=
sizeof
(
size_t
));
}
# endif // GTEST_OS_WINDOWS
...
...
googletest/test/googletest-filepath-test.cc
View file @
0ffa5f97
...
...
@@ -50,8 +50,6 @@ namespace internal {
namespace
{
#if GTEST_OS_WINDOWS_MOBILE
// FIXME: 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
)
{
...
...
googletest/test/googletest-json-outfiles-test.py
View file @
0ffa5f97
...
...
@@ -136,11 +136,6 @@ class GTestJsonOutFilesTest(gtest_test_utils.TestCase):
self
.
assert_
(
p
.
exited
)
self
.
assertEquals
(
0
,
p
.
exit_code
)
# FIXME: libtool causes the built test binary to be
# named lt-gtest_xml_outfiles_test_ instead of
# gtest_xml_outfiles_test_. To account for this possibility, we
# allow both names in the following code. We should remove this
# when libtool replacement tool is ready.
output_file_name1
=
test_name
+
'.json'
output_file1
=
os
.
path
.
join
(
self
.
output_dir_
,
output_file_name1
)
output_file_name2
=
'lt-'
+
output_file_name1
...
...
googletest/test/googletest-listener-test.cc
View file @
0ffa5f97
...
...
@@ -125,6 +125,78 @@ class EventRecordingListener : public TestEventListener {
std
::
string
name_
;
};
// This listener is using OnTestSuiteStart, OnTestSuiteEnd API
class
EventRecordingListener2
:
public
TestEventListener
{
public:
explicit
EventRecordingListener2
(
const
char
*
name
)
:
name_
(
name
)
{}
protected:
void
OnTestProgramStart
(
const
UnitTest
&
/*unit_test*/
)
override
{
g_events
->
push_back
(
GetFullMethodName
(
"OnTestProgramStart"
));
}
void
OnTestIterationStart
(
const
UnitTest
&
/*unit_test*/
,
int
iteration
)
override
{
Message
message
;
message
<<
GetFullMethodName
(
"OnTestIterationStart"
)
<<
"("
<<
iteration
<<
")"
;
g_events
->
push_back
(
message
.
GetString
());
}
void
OnEnvironmentsSetUpStart
(
const
UnitTest
&
/*unit_test*/
)
override
{
g_events
->
push_back
(
GetFullMethodName
(
"OnEnvironmentsSetUpStart"
));
}
void
OnEnvironmentsSetUpEnd
(
const
UnitTest
&
/*unit_test*/
)
override
{
g_events
->
push_back
(
GetFullMethodName
(
"OnEnvironmentsSetUpEnd"
));
}
void
OnTestSuiteStart
(
const
TestSuite
&
/*test_suite*/
)
override
{
g_events
->
push_back
(
GetFullMethodName
(
"OnTestSuiteStart"
));
}
void
OnTestStart
(
const
TestInfo
&
/*test_info*/
)
override
{
g_events
->
push_back
(
GetFullMethodName
(
"OnTestStart"
));
}
void
OnTestPartResult
(
const
TestPartResult
&
/*test_part_result*/
)
override
{
g_events
->
push_back
(
GetFullMethodName
(
"OnTestPartResult"
));
}
void
OnTestEnd
(
const
TestInfo
&
/*test_info*/
)
override
{
g_events
->
push_back
(
GetFullMethodName
(
"OnTestEnd"
));
}
void
OnTestSuiteEnd
(
const
TestSuite
&
/*test_suite*/
)
override
{
g_events
->
push_back
(
GetFullMethodName
(
"OnTestSuiteEnd"
));
}
void
OnEnvironmentsTearDownStart
(
const
UnitTest
&
/*unit_test*/
)
override
{
g_events
->
push_back
(
GetFullMethodName
(
"OnEnvironmentsTearDownStart"
));
}
void
OnEnvironmentsTearDownEnd
(
const
UnitTest
&
/*unit_test*/
)
override
{
g_events
->
push_back
(
GetFullMethodName
(
"OnEnvironmentsTearDownEnd"
));
}
void
OnTestIterationEnd
(
const
UnitTest
&
/*unit_test*/
,
int
iteration
)
override
{
Message
message
;
message
<<
GetFullMethodName
(
"OnTestIterationEnd"
)
<<
"("
<<
iteration
<<
")"
;
g_events
->
push_back
(
message
.
GetString
());
}
void
OnTestProgramEnd
(
const
UnitTest
&
/*unit_test*/
)
override
{
g_events
->
push_back
(
GetFullMethodName
(
"OnTestProgramEnd"
));
}
private:
std
::
string
GetFullMethodName
(
const
char
*
name
)
{
return
name_
+
"."
+
name
;
}
std
::
string
name_
;
};
class
EnvironmentInvocationCatcher
:
public
Environment
{
protected:
void
SetUp
()
override
{
g_events
->
push_back
(
"Environment::SetUp"
);
}
...
...
@@ -165,6 +237,7 @@ TEST_F(ListenerTest, DoesBar) {
using
::
testing
::
internal
::
EnvironmentInvocationCatcher
;
using
::
testing
::
internal
::
EventRecordingListener
;
using
::
testing
::
internal
::
EventRecordingListener2
;
void
VerifyResults
(
const
std
::
vector
<
std
::
string
>&
data
,
const
char
*
const
*
expected_data
,
...
...
@@ -199,6 +272,8 @@ int main(int argc, char **argv) {
new
EventRecordingListener
(
"1st"
));
UnitTest
::
GetInstance
()
->
listeners
().
Append
(
new
EventRecordingListener
(
"2nd"
));
UnitTest
::
GetInstance
()
->
listeners
().
Append
(
new
EventRecordingListener2
(
"3rd"
));
AddGlobalTestEnvironment
(
new
EnvironmentInvocationCatcher
);
...
...
@@ -208,88 +283,117 @@ int main(int argc, char **argv) {
::
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"
};
const
char
*
const
expected_events
[]
=
{
"1st.OnTestProgramStart"
,
"2nd.OnTestProgramStart"
,
"3rd.OnTestProgramStart"
,
"1st.OnTestIterationStart(0)"
,
"2nd.OnTestIterationStart(0)"
,
"3rd.OnTestIterationStart(0)"
,
"1st.OnEnvironmentsSetUpStart"
,
"2nd.OnEnvironmentsSetUpStart"
,
"3rd.OnEnvironmentsSetUpStart"
,
"Environment::SetUp"
,
"3rd.OnEnvironmentsSetUpEnd"
,
"2nd.OnEnvironmentsSetUpEnd"
,
"1st.OnEnvironmentsSetUpEnd"
,
"3rd.OnTestSuiteStart"
,
"1st.OnTestCaseStart"
,
"2nd.OnTestCaseStart"
,
"ListenerTest::SetUpTestCase"
,
"1st.OnTestStart"
,
"2nd.OnTestStart"
,
"3rd.OnTestStart"
,
"ListenerTest::SetUp"
,
"ListenerTest::* Test Body"
,
"1st.OnTestPartResult"
,
"2nd.OnTestPartResult"
,
"3rd.OnTestPartResult"
,
"ListenerTest::TearDown"
,
"3rd.OnTestEnd"
,
"2nd.OnTestEnd"
,
"1st.OnTestEnd"
,
"1st.OnTestStart"
,
"2nd.OnTestStart"
,
"3rd.OnTestStart"
,
"ListenerTest::SetUp"
,
"ListenerTest::* Test Body"
,
"1st.OnTestPartResult"
,
"2nd.OnTestPartResult"
,
"3rd.OnTestPartResult"
,
"ListenerTest::TearDown"
,
"3rd.OnTestEnd"
,
"2nd.OnTestEnd"
,
"1st.OnTestEnd"
,
"ListenerTest::TearDownTestCase"
,
"3rd.OnTestSuiteEnd"
,
"2nd.OnTestCaseEnd"
,
"1st.OnTestCaseEnd"
,
"1st.OnEnvironmentsTearDownStart"
,
"2nd.OnEnvironmentsTearDownStart"
,
"3rd.OnEnvironmentsTearDownStart"
,
"Environment::TearDown"
,
"3rd.OnEnvironmentsTearDownEnd"
,
"2nd.OnEnvironmentsTearDownEnd"
,
"1st.OnEnvironmentsTearDownEnd"
,
"3rd.OnTestIterationEnd(0)"
,
"2nd.OnTestIterationEnd(0)"
,
"1st.OnTestIterationEnd(0)"
,
"1st.OnTestIterationStart(1)"
,
"2nd.OnTestIterationStart(1)"
,
"3rd.OnTestIterationStart(1)"
,
"1st.OnEnvironmentsSetUpStart"
,
"2nd.OnEnvironmentsSetUpStart"
,
"3rd.OnEnvironmentsSetUpStart"
,
"Environment::SetUp"
,
"3rd.OnEnvironmentsSetUpEnd"
,
"2nd.OnEnvironmentsSetUpEnd"
,
"1st.OnEnvironmentsSetUpEnd"
,
"3rd.OnTestSuiteStart"
,
"1st.OnTestCaseStart"
,
"2nd.OnTestCaseStart"
,
"ListenerTest::SetUpTestCase"
,
"1st.OnTestStart"
,
"2nd.OnTestStart"
,
"3rd.OnTestStart"
,
"ListenerTest::SetUp"
,
"ListenerTest::* Test Body"
,
"1st.OnTestPartResult"
,
"2nd.OnTestPartResult"
,
"3rd.OnTestPartResult"
,
"ListenerTest::TearDown"
,
"3rd.OnTestEnd"
,
"2nd.OnTestEnd"
,
"1st.OnTestEnd"
,
"1st.OnTestStart"
,
"2nd.OnTestStart"
,
"3rd.OnTestStart"
,
"ListenerTest::SetUp"
,
"ListenerTest::* Test Body"
,
"1st.OnTestPartResult"
,
"2nd.OnTestPartResult"
,
"3rd.OnTestPartResult"
,
"ListenerTest::TearDown"
,
"3rd.OnTestEnd"
,
"2nd.OnTestEnd"
,
"1st.OnTestEnd"
,
"ListenerTest::TearDownTestCase"
,
"3rd.OnTestSuiteEnd"
,
"2nd.OnTestCaseEnd"
,
"1st.OnTestCaseEnd"
,
"1st.OnEnvironmentsTearDownStart"
,
"2nd.OnEnvironmentsTearDownStart"
,
"3rd.OnEnvironmentsTearDownStart"
,
"Environment::TearDown"
,
"3rd.OnEnvironmentsTearDownEnd"
,
"2nd.OnEnvironmentsTearDownEnd"
,
"1st.OnEnvironmentsTearDownEnd"
,
"3rd.OnTestIterationEnd(1)"
,
"2nd.OnTestIterationEnd(1)"
,
"1st.OnTestIterationEnd(1)"
,
"3rd.OnTestProgramEnd"
,
"2nd.OnTestProgramEnd"
,
"1st.OnTestProgramEnd"
};
VerifyResults
(
events
,
expected_events
,
sizeof
(
expected_events
)
/
sizeof
(
expected_events
[
0
]));
...
...
googletest/test/googletest-options-test.cc
View file @
0ffa5f97
...
...
@@ -111,7 +111,6 @@ TEST(OutputFileHelpersTest, GetCurrentExecutableName) {
#elif GTEST_OS_FUCHSIA
const
bool
success
=
exe_str
==
"app"
;
#else
// FIXME: remove the hard-coded "lt-" prefix when libtool replacement is ready
const
bool
success
=
exe_str
==
"googletest-options-test"
||
exe_str
==
"gtest_all_test"
||
...
...
Prev
1
2
3
4
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment