Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

unit testing C++11 closures

Is there any precedence for doing unit testing on C++ closures?

Functions that I write usually start out as closures defined near their point of use, and then (maybe) graduate to full functions later. This is nice for keeping interfaces clean and makes it easier to read the code in a linear fashion, but it undermines writing unit tests.

Are there any tricks or C++ unit testing frameworks that can handle, say, some little function for computing some geometry that is defined as a closure within my main()?

like image 234
Andrew Wagner Avatar asked Oct 27 '15 09:10

Andrew Wagner


People also ask

How do I test a swift closure?

Basically to test asynchronous operation/closure you must: create an expectation that is an instance of XCTestExpectation. execute your closure, make your assert on the closure return value/parameter and call the method fulfill of XCTestExpectation.

What is the correct syntax for lambda expression in C++11?

Lambdas can both capture variables and accept input parameters. A parameter list (lambda declarator in the Standard syntax) is optional and in most aspects resembles the parameter list for a function. auto y = [] (int first, int second) { return first + second; };

What is C unit testing?

A Unit Testing Framework for C CUnit is a lightweight system for writing, administering, and running unit tests in C. It provides C programmers a basic testing functionality with a flexible variety of user interfaces. CUnit is built as a static library which is linked with the user's testing code.

Are C++ lambdas closures?

In C++, lambda expression constructs a closure, an unnamed function object capable of capturing variables in scope.

What is the best unit testing framework for C code?

CppUnit. The premier unit testing framework for C++; you can also use it to test C code. It is stable, actively developed, and has a GUI interface. The primary reasons not to use CppUnit for C are first that it is quite big, and second you have to write your tests in C++, which means you need a C++ compiler.

What is unity c unit testing?

Unity is curiously powerful Unit Testing in C for C. It aims to support most embedded compilers, from 8-bit tiny processors to 64-bit behemoths. Unity is designed to be small, yet still provide you rich expressive assertion set.

What is unit testing in embedded systems?

Testing one code module at a time, such as file.c Unit Testing (UT) is not necessarily testing it on your board Typically, UT means you test it on the machine that is compiling the code Hence, no need to load the code to the target, or the embedded processor

How to avoid third party code in unit testing?

Exclude third party code Unit-test should run extremely quickly (in second) Keep tests focused; one test per functional Code quality for tests should be equal to the production code Avoid hacks and blocks of #ifdef UNIT_TESTING in your production code


3 Answers

I would think you should be testing functions, not lambda functions. If a function contains lambda functions then they are implementation details. If you are reusing lambda functions by creating them as variables, then those are easily unit tested as functions.

Eg.

auto lambda = [](/* params */){/* stuff */}; // this can be unit tested

void func() // this can be unit tested
{
    // the lambda is an implementation detail of the function
    sort(/* stuff */, [](/* params */){/* stuff */}); 
}
like image 82
Galik Avatar answered Oct 11 '22 10:10

Galik


TL;DR: No.

In order to unit test the closure, you would have to give it a name that you can refer to, by assigning it to a variable.

If it is complicated enough to unit test on its own, you should extract a method and test that instead.

Short of that, you can always unit test the closure indirectly, through the method or function which contains it.

like image 25
Jørgen Fogh Avatar answered Oct 11 '22 09:10

Jørgen Fogh


In short, no. but..

You can test the code that use the closures. The fact that closures are embedded into source code and you don't have any reflection mechanism prevents you from unit-testing them (however you have many ways to test stuff, not only unit tests), however usually the code using closures is more compact so as long we test the whole block using the closures it is fine using them. I tend to write closure that are only few lines of code, infact you could actually create a function (called by the closure) and unit test the function itself ;).

int function(MyClass *){ // unit test here

}

//...
void MyClass::method(){  // ... and unit test method
    auto f = [this] () { return function(this);};
    applyFunctorOnCollection(f);
}
like image 34
CoffeDeveloper Avatar answered Oct 11 '22 10:10

CoffeDeveloper