Навеяло недавним достижением
spamsink: восстановлением исходников игры "Посадка на Луну" с БЭСМ-6.
https://github.com/besm6/bega-re/blob/master/landing.pas
Пусть у нас есть диалоговое приложение на Си++ с текстовым интерфейсом. Приложение запрашивает построчный ввод из std::cin и выдаёт результаты на std::cout. Условно говоря, вызов выглядит следующим образом:
Нет, это не задача для собеседования. Тут и опытный человек голову сломает.
Традиционно такие штуки принято делать через Expect, но выглядит такой подход слишком громоздко. Лучше найти решение средствами самого языка Си++.
https://github.com/besm6/bega-re/blob/master/landing.pas
Пусть у нас есть диалоговое приложение на Си++ с текстовым интерфейсом. Приложение запрашивает построчный ввод из std::cin и выдаёт результаты на std::cout. Условно говоря, вызов выглядит следующим образом:
Схематично, работает оно так:application(std::cin, std::cout);
Теперь стоит задача покрыть имеющуюся реализацию тестами. Я ж теперь адепт TDD. Хочется иметь возможность делать тесты (с применением Catch) вида:void application(std::istream &input, std::ostream &output)
{
output << "something\n";
while (!input.eof()) {
std::string line;
getline(input, line);
std::string result = something(line);
output << result;
}
}
send("foo\n");
std::string reply = receive();
REQUIRE(reply == "bar\n");
Как бы вы стали решать эту задачу? Я имею в виду, как средствами Си++ привинтить одно к другому? Чтобы, не модифицируя исходники application(), вызывать и тестировать её из Catch?Нет, это не задача для собеседования. Тут и опытный человек голову сломает.
Традиционно такие штуки принято делать через Expect, но выглядит такой подход слишком громоздко. Лучше найти решение средствами самого языка Си++.

no subject
Date: 2020-08-13 22:00 (UTC)Конечно вам нужен свой stream-interface wrapper так как ifstream.get() не виртуальный метод.
no subject
Date: 2020-08-13 22:11 (UTC)no subject
Date: 2020-08-13 22:23 (UTC)Mock может запомнить список ожидаемых значений.
Не совсем REPL, но для теста достаточно.
Потом можно проверить весь output сразу или тоже сделать мок и задать список ожидаемых строк -- если вам построчно нужно.
Или вам нужно менять ввод в зависимости от вывода?
no subject
Date: 2020-08-13 22:27 (UTC)no subject
Date: 2020-08-13 22:52 (UTC)Если это тестовое приложение, тогда моки не помогут,
нужeн pipe или streambuf, как предложили выше.
Что-то типа такого:
https://stackoverflow.com/questions/28356629/connecting-two-streaming-functions-c
no subject
Date: 2020-08-14 00:38 (UTC)