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
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