c++ - 在 g++ 下获取 stringstream >> my_double 以给出无限值或 NaN 的方法?

标签 c++ unit-testing stream g++

我有一个接受字符串输入的 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 因为我知道在某些实现中,like IBM's ,流运算符可以产生这样的值。

我不想忽略这个问题,因为我想在我的测试用例中至少获得 100% 的语句覆盖率,而制造异常(exception)意味着我总是需要手动检查所有这些文件以确保唯一未覆盖的行是我的异常(exception)。人工检查意味着更多的错误。目前只有五个文件使用 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”,但在输入时将其视为错误。 我建议您执行以下操作:

  1. 通过 ostringstream 测试您的实现放入字符串中的内容。
  2. 查看您的 istringstream 是否返回值或将它们视为错误。
  3. 如果它们被视为错误,请在您的 from_text 方法中测试您是否得到“inf”或“NaN”并从那里返回适当的值。

不幸的是,如果您的软件在多个平台上运行,您可能需要特定于平台的代码来处理每种情况。

希望这对您有所帮助!

关于c++ - 在 g++ 下获取 stringstream >> my_double 以给出无限值或 NaN 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5942150/

相关文章:

ruby-on-rails - 如何删除 shoulda 测试中的重复项?

qt - QML UnitTest 缺少 C++ 上下文属性

java - Red5通信延迟

c++ - C++ 编译器必须选择两个转换运算符中的哪一个?

C++:用于循环打印地址而不是值的数组

c++ - 采用 OpenCV Mat<double> 并转换为 12 位值的数组。

ruby - 使用 Rack 将网络上传流式传输到套接字

c++ - 将计算结果保存到常量引用中

c# - 如何模拟添加到 DbContext 的记录

java - 任何用于查找 "Too Many Files Open"原因的 Java 调试技巧