gpt4 book ai didi

unit-testing - 模板别名导致单元测试失败

转载 作者:行者123 更新时间:2023-12-02 08:22:15 25 4
gpt4 key购买 nike

我是 D 的新手,我对利用它所提供的一切非常感兴趣。我目前正在将我在 C++ 中拥有的大型代码库转换为用于教育的 D。虽然我才刚刚开始,但我遇到了一些奇怪的矛盾。我有一个带有构造函数的模板结构和该构造函数的单元测试(希望我使用正确)。似乎验证正确。但是,如果我在文件底部为特定的模板化结构创建类型别名,我会在单元测试中遇到异常。

主.d

import math;

int main() {

return 0;
}

数学.d

import std.math;
import std.stdio;

struct Vector2(T) {
T[2] vec = [0, 0];

@property const T x() {return vec[0];}
@property inout(T) x(inout(T) val) {return vec[0] = val;}
@property const T y() {return vec[1];}
@property inout(T) y(inout(T) val) {return vec[1] = val;}

this(T x, T y) {
this.x = x;
this.y = y;
}
unittest {
Vector2!int a = Vector2!int(2, 2);
assert(a.x == 2 && a.y == 2);

Vector2!float b = Vector2!float(2.2, 2.2);
assert(b.x == 2.2 && b.y == 2.2); // <-- this line excepts given alias
}
}

// if this is not here, no problem.
// if it is here "core.exception.AssertError@math.d(21): unittest failure"
alias Vector2f = Vector2!float;

为什么别名的存在会导致单元测试失败?我正在使用这个命令来构建:

dmd -unittest main.d math.d

我使用 Windows 10、DMD 版本 2.070.2 和 msys2 shell

最佳答案

  1. 模板本身没有(通常不能)进行单元测试。只有它的实例化实例是。

  2. 由于2.2不能用浮点变量精确表示,所以最接近2.2double与最接近 2.2float。如果您将这些行更改为以下内容(2.2f 是一个 float 常量,2.2 是一个 double 常量),测试就会成功:

        Vector2!float b = Vector2!float(2.2f, 2.2f);
    assert(b.x == 2.2f && b.y == 2.2f); // <-- no exception

通常,应该避免直接比较浮点变量,除非它们 really know what they are doing .在 D 中,可能需要使用 std.math.approxEqual比较它们。

关于unit-testing - 模板别名导致单元测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35912067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com