Сравнить вектор чисел с использованием Catch

Я использую инфраструктуру модульного тестирования Catch, и я хотел бы сравнить вектор двойных чисел. Этот другой ответ предлагает использовать Approx для сравнения значений с плавающей запятой /double, но это не работает для их вектора. Есть ли удобный способ сделать это?

РЕДАКТИРОВАТЬ: Пример

Со следующим кодом:

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

TEST_CASE("Compare Vectors", "[vector]") {
    std::vector<int> vec1 = {0, 1, 2, 3};
    std::vector<int> vec2 = {0, 1, 2, 4};
    REQUIRE(vec1 == vec2);
}

Тест не проходит со следующим отчетом:

-------------------------------------------------------------------------------
Compare Vectors
-------------------------------------------------------------------------------
test/UnitTests/test_Example/example.cc:4
...............................................................................

test/UnitTests/test_Example/example.cc:7: FAILED:
  REQUIRE( vec1 == vec2 )
with expansion:
  { 0, 1, 2, 3 } == { 0, 1, 2, 4 }

===============================================================================
test cases: 1 | 1 failed
assertions: 1 | 1 failed

Но если я изменю код следующим образом, я бы хотел, чтобы тест прошел, но, очевидно, это не так.

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

TEST_CASE("Compare Vectors", "[vector]") {
    std::vector<double> vec1 = {0, 1, 2, 3};
    std::vector<double> vec2 = {0, 1, 2, 3.000001};
    REQUIRE(vec1 == vec2);
}

Я мог бы пройтись по элементам и сравнить их один за другим, но в случае расхождения будет сложнее определить источник ошибки.

2 ответа

Хотя с момента выхода Catch 2.7.2 прошло ~ 4 года , пользователи теперь могут сравнивать векторы, используя Approx:

      REQUIRE_THAT(vec1, Catch::Approx(vec2).margin(0.0001);

Это позволит сравнить два вектора с погрешностью + - 0,0001. Подробнее здесь .

В настоящее время я прибег к некоторому обходному пути. Я создал следующие две функции, которые будут использоваться везде, где вы хотите проверить два вектора. (т.е. REQUIRE(compareVectors(vec1, vec2));)

bool compareVectors(std::vector<double> a, std::vector<double> b) {
    if (a.size() != b.size()) return false;
    for (size_t i = 0; i < a.size(); i++) {
        if (a[i] != Approx(b[i])) {
            std::cout << a[i] << " Should == " << b[i] << std::endl;
            return false;
        }
    }
    return true;
}

bool compare2dVectors(std::vector<std::vector<double>> a,
                      std::vector<std::vector<double>> b) {
    if (a.size() != b.size()) return false;
    for (size_t i = 0; i < a.size(); i++) {
        if (! compareVectors(a[i], b[i])) return false;
    }
    return true;
}

Таким образом, вы по крайней мере сможете увидеть имя вектора, который не прошел, и первые значения, которые отличались.

Это не идеальное решение, так что я все еще надеюсь, что кто-то сможет придумать что-то лучшее, но я подумал, что, по крайней мере, поделюсь тем, что я придумал, на случай, если это кому-нибудь поможет.

Другие вопросы по тегам