trompe l'oeil noun (Concise Encyclopedia)
Style of representation in which a painted object is intended to deceive the viewer into believing it is the object itself...
A thread-safe header-only mocking framework for C++14 using the Boost Software License 1.0
- Intro presentation from Stockholm C++ UG (YouTube)
- Introduction
- Trompeloeil on CppCast
- Cheat Sheet (2*A4)
- Cook Book
- FAQ
- Reference
Also, follow up with the post on sequencing for examples on how to restrict or relax allowed sequences of matching calls.
If you want to contribute, read ACCU overload 125 to learn the internals.
#include <trompeloeil.hpp>
class Interface
{
public:
virtual ~Interface() = default;
virtual bool foo(int, std::string& s) = 0;
virtual bool bar(int) = 0;
virtual bool bar(std::string) = 0;
};
void interface_func(Interface*); // function to test
class Mock : public Interface
{
public:
MAKE_MOCK2(foo, bool(int, std::string&),override);
MAKE_MOCK1(bar, bool(int),override);
MAKE_MOCK1(bar, bool(std::string),override);
MAKE_MOCK0(baz, void()); // not from Interface
};
TEST(exercise_interface_func)
{
using trompeloeil::_; // wild card for matching any value
using trompeloeil::gt; // greater-than match
Mock m;
trompeloeil::sequence seq1, seq2; // control order of matching calls
int local_var = 0;
REQUIRE_CALL(m, bar(ANY(int))) // expect call to m.bar(int)
.LR_SIDE_EFFECT(local_var = _1) // set captured variable to value of param
.RETURN(_1 > 0) // return value depending on param value
.IN_SEQUENCE(seq1) // must be first match for seq1
.TIMES(AT_LEAST(1)); // can be called several times
FORBID_CALL(m, bar(0)); // but m.bar(0) is not allowed
REQUIRE_CALL(m, bar("word")) // expect one call to m.bar(std::string)
.RETURN(true)
.IN_SEQUENCE(seq2); // must be first match for seq2
REQUIRE_CALL(m, foo(gt(2), _)) // expect call to foo(int,std::string&)
.WITH(_2 == "") // with int > 2 and empty string
.IN_SEQUENCE(seq1, seq2) // last for both seq1 and seq2
.SIDE_EFFECT(_2 = "cat") // and set param string to "cat"
.RETURN(true);
interface_func(&m);
// all the above expectations must be fulfilled here
}
Trompeloeil is known to work with:
- GCC 4.9, 5, 6
- Clang 3.5, 3.6, 3.7, 3.8, 3.9
- Visual Studio 2015, 2017