首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unittest++:测试多个可能的值

Unittest++:测试多个可能的值
EN

Stack Overflow用户
提问于 2010-01-26 02:57:21
回答 3查看 618关注 0票数 1

我目前正在用c++实现一个简单的光线跟踪器。我有一个名为OrthonormalBasis的类,它从一个或两个指定的向量生成三个正交单位向量,例如:

代码语言:javascript
复制
void
OrthonormalBasis::init_from_u ( const Vector& u )
{
    Vector n(1,0,0);
    Vector m(0,1,0);
    u_ = unify(u);
    v_ = cross(u_,n);
    if ( v_.length() < ONB_EPSILON )
        v_ = cross(u_,m);
    w_ = cross(u_,v_);
}

我正在使用Unittest++框架测试我的所有方法。问题是,对于有效的正交基,存在不止一个可能的解决方案。例如,下面的测试:

代码语言:javascript
复制
TEST ( orthonormalbasis__should_init_from_u )
{
    Vector u(1,0,0);
    OrthonormalBasis onb;

    onb.init_from_u(u);

    CHECK_EQUAL( Vector( 1, 0, 0 ), onb.u() );
    CHECK_EQUAL( Vector( 0, 0, 1 ), onb.v() );
    CHECK_EQUAL( Vector( 0, 1, 0 ), onb.w() );
}

它有时成功,有时失败,因为向量v和w也可以有负1,并且仍然代表有效的正交基础。有没有办法指定多个期望值?或者你知道另一种方法吗?

重要的是,我要将实际值和期望值打印到stdout,以便调试这些方法,这样这个解决方案就不会完成这项工作:

代码语言:javascript
复制
TEST ( orthonormalbasis__should_init_from_u )
{
    Vector u(1,0,0);
    OrthonormalBasis onb;

    onb.init_from_u(u);

    CHECK_EQUAL( Vector( 1, 0, 0 ), onb.u() );
    CHECK(
        Vector( 0, 0, 1 ) == onb.v() ||
        Vector( 0, 0,-1 ) == onb.v() );
    CHECK(
        Vector( 0, 1, 0 ) == onb.w() ||
        Vector( 0,-1, 0 ) == onb.w() );
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-26 04:39:02

当然,如果你正在测试的是你的基础是否是正交的,那么这就是你需要测试的?

代码语言:javascript
复制
// check orthogonality

CHECK_EQUAL( 0, dot(onb.u(), onb.v));
CHECK_EQUAL( 0, dot(onb.u(), onb.w));
CHECK_EQUAL( 0, dot(onb.v(), onb.w));

// check normality

CHECK_EQUAL( 1, dot(onb.u(), onb.u));
CHECK_EQUAL( 1, dot(onb.v(), onb.v));
CHECK_EQUAL( 1, dot(onb.w(), onb.w));
票数 1
EN

Stack Overflow用户

发布于 2010-01-26 03:05:08

一种可能是创建您自己的CHECK_MULTI函数:

代码语言:javascript
复制
void CHECK_MULTI(TYPE actual, vector<TYPE> expected, const char* message)
{
  for (element in expected) {
    if (element == actual) {
      // there's a test here so the test count is correct
      CHECK(actual, element);
      return;   
    }
  }
  CHECK(actual, expected);
}
票数 0
EN

Stack Overflow用户

发布于 2010-01-26 03:29:52

我会使用一个实用函数或类,这样你就可以这样做了:

代码语言:javascript
复制
CHECK_EQUAL(VectorList(0,0,1)(0,0,-1), onb.v());

给定的情况下,对相等的解释有些奇怪,但它应该会打印出您想要看到的所有值,而不需要引入自定义宏。

如果您在该上下文中担心EQUAL,那么像CHECK_CONTAINS()这样的自定义宏应该不会太难做到。

VectorList将被构造为临时的,operator()将用于将值插入到包含的Vector列表中,类似于Boost.Assign。

基本方法:

代码语言:javascript
复制
class VectorList {
    std::vector<Vector> data_;
public:
    VectorList(double a, double b, double c) {
        data_.push_back(Vector(a,b,c));
    }
    VectorList& operator()(double a, double b, double c) {
        data_.push_back(Vector(a,b,c));
        return *this;
    }
    bool operator==(const Vector& rhs) const {
        return std::find(data_.begin(), data_.end(), rhs) != data_.end();
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2134758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档