Навеяло недавним достижением
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-14 00:41 (UTC)