我有一个接受字符串输入的 c++ 函数。 在函数中,我使用 stringstream
提取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
在 Ubuntu 下的 g++ 组成的测试平台上输出 inf 和 nan 的方法。
因此,我希望能够编写:
#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 而产生的分支。
处理此问题的方式似乎取决于实现。有些人会在 ostringstream 上输出"inf"或"NaN",但在进入过程中将其视为错误。我建议您执行以下操作:
- 通过 ostringstream 测试您的实现放入字符串的内容。
- 查看您的 istringstream 是否返回值或将其视为错误。
- 如果它们被视为错误,请在from_text方法中测试是否获得"inf"或"NaN",并从那里返回适当的值。
不幸的是,如果您的软件在多个平台上运行,则可能需要特定于平台的代码来处理每种情况。
希望这有帮助!