Модульный тест C ++, который проверяет функцию, которая принимает лямбду в качестве аргументаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Модульный тест C ++, который проверяет функцию, которая принимает лямбду в качестве аргумента

Сообщение Anonymous »

Я написал модульный тест C ++, который имеет проблему проектирования. < /p>
Тест относительно прост. Я тестирую какой -то объект "iobuffer". Существует функция recv , которая используется для копирования данных из сокета в буфере. Эта функция recv принимает необязательный указатель функции, который можно использовать для переключения между вызовом хорошо известной функции OS recv или макета.

Код: Выделить всё

#include 
#include 
#include 
#include

#include 
#include 

struct Buffer {

explicit Buffer(const std::size_t capacity)
: p_write{nullptr}
, capacity_{capacity}
, p_data{std::make_unique(capacity)}
{
p_write = p_data.get();
}

auto write_span() const noexcept {
return std::span(p_write, p_data.get() + capacity_);
}

void update_write(const size_t n) noexcept {
p_write += n;
}

uint8_t* p_write;
const std::size_t capacity_;
const std::unique_ptr p_data;
};

// same signiture as `::recv`
using RecvFunction = ssize_t(*)(int, void*, size_t, int);

ssize_t recv(
int sock_fd,
Buffer &buffer,
int flags,
RecvFunction f = ::recv
) {
auto span = buffer.write_span();
const ssize_t recv_size = f(sock_fd, span.data(), span.size(), flags);
buffer.update_write(recv_size);
return recv_size;
}

int main() {

// test case
{
Buffer buffer(1024);
const int fake_fd = 2;

const auto lambda = [](int fg, void* buf, size_t n, int flags) -> ssize_t {

constexpr char LINE[] = "EXAMPLE_DATA";

const std::size_t length = strlen(LINE);
const auto n_min = std::min(length, n);
std::memcpy(buf, LINE, n_min);
return n_min;
};

const auto byte_count = recv(fake_fd, buffer, 0, lambda);

constexpr char LINE[] = "EXAMPLE_DATA";
if (byte_count != strlen(LINE)) {
std::println("TEST FAIL");
std::println("byte_count={}, strlen={}", byte_count, strlen(LINE));
}
else {
std::println("TEST OK");
}
}

return 0;
}
Код может быть скомпилирован с использованием g ++ -std = c ++ 23 main.cpp .
Проблема в том, что Constexpr char line [] повторяется дважды. Это происходит первым в теле функции Lambda. Затем это происходит вне тела лямбды, где он используется для расчета ожидаемого количества скопированных байтов. < /P>
Я попробовал несколько вещей, чтобы попытаться обойти это. Это не работает, потому что лямбда может быть преобразована в регулярный указатель функции только в том случае, если он не захватывает. Это тоже не сработало. Я думаю, что это слишком сложно, обеспечивая небольшую пользу, чтобы объяснить здесь, поэтому я не включил код для него. По сути, эта идея не удалась. То, что шаблонный подход имел некоторые проблемы: < /p>

Трудно понять код (он становится очень запутанным относительно того, что происходит, почти нечитаемо) и трудно понять ошибки компилятора, когда что -то не работает. Более сложный и нечитаемый с каждым модульным тестом, потому что тестовый код нуждается в новой функции «введена» в него для использования в качестве параметра шаблона. Вот почему я пытался избежать использования шаблона.
Есть ли какое -то другое решение, которое можно использовать для решения этого?>

Подробнее здесь: https://stackoverflow.com/questions/797 ... n-argument
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»