Сравнить вектор чисел с использованием 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

Решение

В настоящее время я прибег к некоторому обходному пути. Я создал следующие две функции, которые будут использоваться везде, где вы хотите проверить два вектора. (Т.е. 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;
}

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector