Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
yangql
googletest
Commits
d0726821
Commit
d0726821
authored
Oct 24, 2019
by
Piotr Nycz
Browse files
Tests simplified and names corrected (POD->scalar)
Issue 2527
parent
37590da6
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
18 additions
and
49 deletions
+18
-49
googlemock/test/gmock-actions_test.cc
googlemock/test/gmock-actions_test.cc
+18
-49
No files found.
googlemock/test/gmock-actions_test.cc
View file @
d0726821
...
...
@@ -651,65 +651,34 @@ template <typename T, typename = decltype(ReturnRef(std::declval<T&&>()))>
bool
CanCallReturnRef
(
T
&&
)
{
return
true
;
}
bool
CanCallReturnRef
(
Unused
)
{
return
false
;
}
// Defined here, because gmock has to work with C++11 (std::void_t is from C++17)
template
<
typename
...
Ts
>
struct
precpp17_make_void
{
typedef
void
type
;};
template
<
typename
...
Ts
>
using
precpp17_void_t
=
typename
precpp17_make_void
<
Ts
...
>::
type
;
template
<
typename
T
,
typename
=
void
>
struct
HasReturnRefAction
:
std
::
false_type
{};
template
<
typename
T
>
struct
HasReturnRefAction
<
T
,
precpp17_void_t
<
decltype
(
ReturnRef
(
std
::
declval
<
T
>
()))
>>
:
std
::
true_type
{};
// Just an example of non-POD type
class
MyNonPodType
{
public:
MyNonPodType
(
int
a_value
)
:
value_
(
a_value
)
{}
private:
int
value_
;
};
// Just an example of POD type
using
MyPodType
=
int
;
// Tests that ReturnRef(v) is working with non-temporaries (T&)
TEST
(
ReturnRefTest
,
IsAcceptingNonTemporary
)
{
EXPECT_TRUE
(
HasReturnRefAction
<
MyPodType
&>::
value
);
EXPECT_TRUE
(
HasReturnRefAction
<
const
MyPodType
&>::
value
);
EXPECT_TRUE
(
HasReturnRefAction
<
MyNonPodType
&>::
value
);
EXPECT_TRUE
(
HasReturnRefAction
<
const
MyNonPodType
&>::
value
);
TEST
(
ReturnRefTest
,
WorksForNonTemporary
)
{
int
scalarValue
=
123
;
EXPECT_TRUE
(
CanCallReturnRef
(
scalarValue
));
MyNonPodType
nonPodValue
{
123
}
;
EXPECT_TRUE
(
CanCallReturnRef
(
non
Pod
Value
));
std
::
string
nonScalarValue
(
"ABC"
)
;
EXPECT_TRUE
(
CanCallReturnRef
(
non
Scalar
Value
));
MyPodType
pod
Value
{
321
};
EXPECT_TRUE
(
CanCallReturnRef
(
pod
Value
));
const
int
constScalar
Value
{
321
};
EXPECT_TRUE
(
CanCallReturnRef
(
constScalar
Value
));
const
MyNonPodType
constNonPodValue
{
123
};
EXPECT_TRUE
(
CanCallReturnRef
(
constNonPodValue
));
const
MyPodType
constPodValue
{
321
};
EXPECT_TRUE
(
CanCallReturnRef
(
constPodValue
));
const
std
::
string
constNonScalarValue
(
"CBA"
);
EXPECT_TRUE
(
CanCallReturnRef
(
constNonScalarValue
));
}
// Tests that ReturnRef(v) is not working with temporaries (T&&)
TEST
(
ReturnRefTest
,
IsNotAcceptingTemporary
)
{
EXPECT_FALSE
(
HasReturnRefAction
<
MyPodType
&&>::
value
);
EXPECT_FALSE
(
HasReturnRefAction
<
const
MyPodType
&&>::
value
);
EXPECT_FALSE
(
HasReturnRefAction
<
MyNonPodType
&&>::
value
);
EXPECT_FALSE
(
HasReturnRefAction
<
const
MyNonPodType
&&>::
value
);
auto
nonPodValue
=
[]()
->
MyNonPodType
{
return
MyNonPodType
{
123
};
};
EXPECT_FALSE
(
CanCallReturnRef
(
nonPodValue
()));
TEST
(
ReturnRefTest
,
DoesNotWorkForTemporary
)
{
auto
scalarValue
=
[]()
->
int
{
return
123
;
};
EXPECT_FALSE
(
CanCallReturnRef
(
scalarValue
()));
auto
pod
Value
=
[]()
->
MyPodType
{
return
MyPodType
{
321
}
;
};
EXPECT_FALSE
(
CanCallReturnRef
(
pod
Value
()));
auto
nonScalar
Value
=
[]()
->
std
::
string
{
return
"ABC"
;
};
EXPECT_FALSE
(
CanCallReturnRef
(
nonScalar
Value
()));
auto
constNonPodValue
=
[]()
->
const
MyNonPodType
{
return
MyNonPodType
{
123
};
};
EXPECT_FALSE
(
CanCallReturnRef
(
constNonPodValue
(
)));
// cannot use here callable returning "const scalar type" because C++ ignores such const for scalar return type, so the static_cast
EXPECT_FALSE
(
CanCallReturnRef
(
static_cast
<
const
int
>
(
321
)));
// cannot use here callable returning "const POD" because C++ ignores such const for POD return type, so the static_cast
EXPECT_FALSE
(
CanCallReturnRef
(
static_cast
<
const
MyPodType
>
(
42
)));
auto
constNonScalarValue
=
[]()
->
const
std
::
string
{
return
"CBA"
;
};
EXPECT_FALSE
(
CanCallReturnRef
(
constNonScalarValue
(
)));
}
// Tests that ReturnRefOfCopy(v) works for reference types.
...
...
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