Не объединяйте генераторы в тестовом примере Catch2 - PullRequest
2 голосов
/ 13 февраля 2020

Я хотел бы использовать более одного генератора в 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]).

I однако хочется только два: (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

1 Ответ

1 голос
/ 17 февраля 2020

Вместо использования нескольких генераторов вы должны обернуть свои тестовые данные ввода / вывода в некоторую структуру, которая будет определять как startPos, так и expectedMove. Затем вы можете использовать один генератор для создания наборов данных. Ваши данные будут названы, поэтому вам не нужно ссылаться на них по индексу. Ваш 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...