У меня есть функция c ++, которая принимает строковые данные.В этой функции я использую stringstream
для извлечения double
.
. Позже я проверяю, чтобы убедиться, что double не равен NaN или бесконечности.Однако я не могу придумать тестовый ввод, который заставит оператор извлечения выдать любое из этих значений.
Вот важная часть моей функции.Реальное использование - в некоторых методах фабрики классов.
double from_text(const std::string& word, bool& failed){
double ret; failed = true;
std::istringstream param_in(word);
if(!(param_in >> ret)) {
return ret; }
if(is_nan_or_infinity(ret)) {
//I want to get here
return ret; }
failed = false; return ret;
}
Вы можете сказать, если вы не можете создать это, зачем беспокоиться?
Я не хочу удалять if, потому что я знаю, что в некоторых реализациях , таких как IBM , операторы потока могут создавать такие значения.
Я неЯ хочу игнорировать эту проблему, потому что я хочу по крайней мере получить 100% покрытие операторов в моих тестовых примерах, а создание исключений означает, что мне всегда нужно проверять все эти файлы вручную, чтобы убедиться, что единственными непокрытыми строками являются мои исключения.Ручная проверка означает больше ошибок.На данный момент есть только пять файлов, использующих код, подобный from_text, так что это не невозможно, но я надеюсь на лучший путь.
Редактировать
Чтобы быть понятным,то, что я хочу, это способ заставить std::istringstream(some_magic_string) >> my_double
выводить inf и nan на тестовой платформе, состоящей из g ++, под Ubuntu.
Таким образом, я хочу иметь возможность написать:
#include "test_stuff.hpp"
#include "from_text.hpp"
///Maybe more magic goes here
bool failed;
from_text("my_special_nan_producing_input",failed)
test_assert(failed,true,"NAN producing input causes failure");
from_text("my_special_inf_producing_input",failed)
test_assert(failed,true,"Infinity producing input causes failure");
///Clean up from all the special magic
И пусть from_text выполняет ветвь, в результате которой ret является NaN или inf.