Skip to content

Commit

Permalink
Merge pull request #295 from eranpeer/fix-returnandset-non-assignable
Browse files Browse the repository at this point in the history
Fix ReturnAndSet for convertible variables that are not assignable
  • Loading branch information
FranckRJ committed Nov 9, 2022
2 parents a23c0be + d84f950 commit 96f193e
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
4 changes: 2 additions & 2 deletions include/fakeit/StubbingProgress.hpp
Expand Up @@ -449,15 +449,15 @@ namespace fakeit {
private:
template<typename T, typename U>
static
typename std::enable_if<std::is_convertible<U, decltype(GetArg(std::declval<T>()))>::value, void>::type
typename std::enable_if<std::is_assignable<decltype(GetArg(std::declval<T>())), U>::value, void>::type
Set(T &&p, U &&v)
{
GetArg(std::forward<T>(p)) = v;
}

template<typename T, typename U>
static
typename std::enable_if<!std::is_convertible<U, decltype(GetArg(std::declval<T>()))>::value, void>::type
typename std::enable_if<!std::is_assignable<decltype(GetArg(std::declval<T>())), U>::value, void>::type
Set(T &&, U &&)
{
throw std::logic_error("ReturnAndSet(): Invalid value type");
Expand Down
25 changes: 25 additions & 0 deletions tests/stubbing_tests.cpp
Expand Up @@ -26,6 +26,7 @@ struct BasicStubbing : tpunit::TestFixture {
TEST(BasicStubbing::stub_a_function_to_return_a_specified_value_always),
TEST(BasicStubbing::stub_a_function_to_set_specified_values_once),
TEST(BasicStubbing::stub_a_function_to_set_specified_values_once_form2),
TEST(BasicStubbing::stub_a_function_to_set_specified_values_once_form2_convertible_not_assignable),
TEST(BasicStubbing::stub_a_function_to_set_specified_value_with_incompatible_params),
TEST(BasicStubbing::stub_a_function_to_set_specified_values_always),
TEST(BasicStubbing::stub_a_function_to_set_specified_values_always_form2),
Expand Down Expand Up @@ -61,10 +62,12 @@ struct BasicStubbing : tpunit::TestFixture {
virtual int func(int) = 0;
virtual int funcNoArgs() = 0;
virtual int funcRefArgs(int*, int&) = 0;
virtual int funcConvertibleNotAssignableArgs1(int&, int) = 0;

virtual void proc(int) = 0;
virtual void procRefArgs(int*, int&) = 0;
virtual void procIncompatArgs(std::string&, std::vector<std::string>&) = 0;
virtual void procConvertibleNotAssignableArgs2(int, int&) = 0;
};

void calling_an_unstubbed_method_should_raise_UnmockedMethodCallException() {
Expand Down Expand Up @@ -197,6 +200,28 @@ struct BasicStubbing : tpunit::TestFixture {
}
}

void stub_a_function_to_set_specified_values_once_form2_convertible_not_assignable() {
Mock<SomeInterface> mock;
When(Method(mock, funcConvertibleNotAssignableArgs1)).ReturnAndSet(1, _1 <= 3);
When(Method(mock, procConvertibleNotAssignableArgs2)).ReturnAndSet(_2 <= 5);

SomeInterface &i = mock.get();

{
int a1 = 0, b1 = 0;
ASSERT_EQUAL(1, i.funcConvertibleNotAssignableArgs1(a1, b1));
ASSERT_EQUAL(3, a1);
ASSERT_EQUAL(0, b1);
}

{
int a2 = 0, b2 = 0;
i.procConvertibleNotAssignableArgs2(a2, b2);
ASSERT_EQUAL(0, a2);
ASSERT_EQUAL(5, b2);
}
}

void stub_a_function_to_set_specified_value_with_incompatible_params() {
Mock<SomeInterface> mock;
std::vector<std::string> v{"str"};
Expand Down

0 comments on commit 96f193e

Please sign in to comment.