Сравнить вектор чисел с использованием 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;
}
Таким образом, вы по крайней мере сможете увидеть имя вектора, который не прошел, и первые значения, которые отличались.
Это не идеальное решение, так что я все еще надеюсь, что кто-то сможет придумать что-то лучшее, но я подумал, что, по крайней мере, поделюсь тем, что я придумал, на случай, если это кому-нибудь поможет.