gpt4 book ai didi

c++ - 不要在Catch2测试用例中合并生成器

转载 作者:行者123 更新时间:2023-12-01 14:53:34 25 4
gpt4 key购买 nike

我想在Catch2测试用例中使用多个生成器。我的问题是,当有两个以上的生成器时,它们是“组合的”。所以,如果我写这样的话:

TEST_CASE("Test legal moves on empty 2x1 board") {
Board board(2, 1);

auto startPos = GENERATE(Position(0, 0), Position(1, 0));
auto expectedMoves = GENERATE(Position(1, 0), Position(0, 0));
auto legalMoves = board.getLegalMoves(startPos);
REQUIRE(legalMoves[0] == expectedMoves);
}

这将导致四个测试用例:
( startPos[0] vs expectedMoves[0]startPos[0] vs expectedMoves[1]startPos[1] vs expectedMoves[0]startPos[1] vs startPos[1])。

但是,我只需要两个:( startPos[0] vs expectedMoves[0]startPos[1] vs startPos[1])。

是否可以通过一种优雅且易读的方式来做到这一点? 我想避免这样的事情:
TEST_CASE("Test legal moves on empty 2x1 board") {
Board board(2, 1);

auto dump = GENERATE(vector<Position>{ Position(0, 0), Position(1, 0) },
vector<Position>{ Position(1, 0), Position(0, 0) });
auto expectedMoves = dump[1];
auto legalMoves = board.getLegalMoves(dump[0]);
REQUIRE(legalMoves[0] == expectedMoves);
}

由于这种怪兽的维护很麻烦。

编辑:我不太喜欢这种解决方案:
https://github.com/catchorg/Catch2/blob/ce42deb72fab2be85a862f559984580c24cb76c4/projects/SelfTest/UsageTests/Generators.tests.cpp#L199

最佳答案

不应使用多个生成器,而应将输入/输出测试数据包装在将定义startPosexpectedMove的某种结构中。然后,您可以使用单个生成器来生成数据集。您的数据将被命名,因此您不必通过索引对其进行引用。您的TEST_CASE可能如下所示:

struct TestData
{
Position startPos;
Position expectedMove;
};

TEST_CASE("Test legal moves on empty 2x1 board")
{
Board board {2, 1};
auto testData = GENERATE(TestData {{0, 0}, {1, 0}}, TestData {{1, 0}, {0, 0}});
auto lagalMoves = board.getLegalMoves(testData.startPos);
REQUIRE(lagalMoves[0] == testData.expectedMove);
}

关于c++ - 不要在Catch2测试用例中合并生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60203802/

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