add more tests

This commit is contained in:
2026-02-17 21:53:18 +03:00
parent 8ecec6b914
commit 7195734765

View File

@@ -224,6 +224,97 @@ TEST_F(Vector2DTest, row_and_col_methods_return_same_as_operator) {
EXPECT_EQ(col1[5], col2[5]);
}
// ==================== PROXY SEARCH TESTS ====================
TEST_F(Vector2DTest, row_proxy_search_works) {
auto row = vec[10];
// indexOf
ssize_t idx = row.indexOf(vec.element(10, 5));
EXPECT_EQ(idx, 5);
EXPECT_EQ(row.indexOf(-999), -1);
// lastIndexOf (add a duplicate)
vec.element(10, 7) = vec.element(10, 5); // duplicate
idx = row.lastIndexOf(vec.element(10, 5));
EXPECT_EQ(idx, 7);
// indexWhere
auto isEven = [](const int & e) { return e % 2 == 0; };
ssize_t firstEven = row.indexWhere(isEven);
EXPECT_GE(firstEven, 0);
// lastIndexWhere
ssize_t lastEven = row.lastIndexWhere(isEven);
EXPECT_GE(lastEven, firstEven);
}
TEST_F(Vector2DTest, col_proxy_search_works) {
auto col = vec.col(9); // используем столбец 9, где все элементы нечётные
ssize_t idx = col.indexOf(vec.element(12, 9));
EXPECT_EQ(idx, 12);
EXPECT_EQ(col.indexOf(-999), -1);
vec.element(20, 9) = vec.element(12, 9); // duplicate
idx = col.lastIndexOf(vec.element(12, 9));
EXPECT_EQ(idx, 20);
auto isOdd = [](const int & e) { return e % 2 != 0; };
ssize_t firstOdd = col.indexWhere(isOdd);
EXPECT_GE(firstOdd, 0);
ssize_t lastOdd = col.lastIndexWhere(isOdd);
EXPECT_GE(lastOdd, firstOdd);
}
TEST_F(Vector2DTest, rowconst_proxy_search_works) {
const auto & constVec = vec;
const auto row = constVec[10];
ssize_t idx = row.indexOf(vec.element(10, 5));
EXPECT_EQ(idx, 5);
idx = row.lastIndexOf(vec.element(10, 5));
EXPECT_EQ(idx, 5);
}
TEST_F(Vector2DTest, colconst_proxy_search_works) {
const auto & constVec = vec;
auto col = constVec.col(8);
ssize_t idx = col.indexOf(vec.element(12, 8));
EXPECT_EQ(idx, 12);
idx = col.lastIndexOf(vec.element(12, 8));
EXPECT_EQ(idx, 12);
}
// ==================== ROW/COLUMN ITERATION TESTS ====================
TEST_F(Vector2DTest, forEachRow_modifies_rows) {
vec.forEachRow([](PIVector2D<int>::Row row) {
for (size_t c = 0; c < row.size(); ++c)
row[c] = 999;
});
for (size_t r = 0; r < vec.rows(); ++r)
for (size_t c = 0; c < vec.cols(); ++c)
EXPECT_EQ(vec.element(r, c), 999);
}
TEST_F(Vector2DTest, forEachRow_readonly_counts_rows) {
size_t count = 0;
vec.forEachRow([&count](PIVector2D<int>::RowConst) { ++count; });
EXPECT_EQ(count, vec.rows());
}
TEST_F(Vector2DTest, forEachColumn_modifies_columns) {
vec.forEachColumn([](PIVector2D<int>::Col col) {
for (size_t r = 0; r < col.size(); ++r)
col[r] = 777;
});
for (size_t r = 0; r < vec.rows(); ++r)
for (size_t c = 0; c < vec.cols(); ++c)
EXPECT_EQ(vec.element(r, c), 777);
}
TEST_F(Vector2DTest, forEachColumn_readonly_counts_columns) {
size_t count = 0;
vec.forEachColumn([&count](PIVector2D<int>::ColConst) { ++count; });
EXPECT_EQ(count, vec.cols());
}
// ==================== MODIFIER TESTS ====================
TEST_F(Vector2DTest, setRow_replaces_row_correctly) {
PIVector<int> newRow(COLS_COUNT_INIT);
@@ -460,13 +551,13 @@ TEST_F(Vector2DTest, assign_is_alias_for_fill) {
}
}
TEST_F(Vector2DTest, assign_with_size_resets_to_single_row) {
vec.assign(3, 4, 77);
EXPECT_EQ(vec.rows(), 3);
EXPECT_EQ(vec.cols(), 4);
for (size_t r = 0; r < vec.rows(); ++r) {
for (size_t c = 0; c < vec.cols(); ++c) {
EXPECT_EQ(vec.element(r, c), 77);
TEST_F(Vector2DTest, assign_with_dimensions_resets_and_fills) {
vec.assign(5, 7, 123);
EXPECT_EQ(vec.rows(), 5);
EXPECT_EQ(vec.cols(), 7);
for (size_t r = 0; r < 5; ++r) {
for (size_t c = 0; c < 7; ++c) {
EXPECT_EQ(vec.element(r, c), 123);
}
}
}
@@ -674,25 +765,41 @@ TEST_F(Vector2DTest, forEach_modifying_changes_elements) {
}
}
/*
TEST_F(Vector2DTest, forEachIndexed_readonly_uses_indices) {
bool allCorrect = true;
vec.forEachIndexed([&allCorrect](size_t r, size_t c, const int & e) {
if (e != static_cast<int>(r * COLS_COUNT_INIT + c)) allCorrect = false;
});
EXPECT_TRUE(allCorrect);
TEST_F(Vector2DTest, indexOf_returns_correct_pair) {
auto p = vec.indexOf(vec.element(10, 15));
EXPECT_EQ(p.first, 10);
EXPECT_EQ(p.second, 15);
p = vec.indexOf(-999);
EXPECT_EQ(p.first, -1);
EXPECT_EQ(p.second, -1);
}
TEST_F(Vector2DTest, forEachIndexed_modifying_uses_indices) {
vec.forEachIndexed([](size_t r, size_t c, int & e) { e = static_cast<int>(r * 1000 + c); });
for (size_t r = 0; r < ROWS_COUNT_INIT; ++r) {
for (size_t c = 0; c < COLS_COUNT_INIT; ++c) {
EXPECT_EQ(vec.element(r, c), static_cast<int>(r * 1000 + c));
}
}
TEST_F(Vector2DTest, indexWhere_returns_correct_pair) {
vec.element(5, 5) = -42;
auto isTarget = [](const int & e) { return e == -42; };
auto p = vec.indexWhere(isTarget);
EXPECT_EQ(p.first, 5);
EXPECT_EQ(p.second, 5);
}
TEST_F(Vector2DTest, lastIndexOf_works) {
int val = vec.element(10, 10);
vec.element(20, 20) = val; // duplicate
auto p = vec.lastIndexOf(val);
EXPECT_EQ(p.first, 20);
EXPECT_EQ(p.second, 20);
}
TEST_F(Vector2DTest, lastIndexWhere_works) {
auto isLarge = [](const int & e) { return e > 500; };
auto p = vec.lastIndexWhere(isLarge);
EXPECT_GE(p.first, 0);
EXPECT_GE(p.second, 0);
// The last element with value >500 should be the largest index
size_t lastFlat = p.first * vec.cols() + p.second;
size_t expectedLastFlat = vec.size() - 1;
EXPECT_EQ(lastFlat, expectedLastFlat);
}
*/
TEST_F(Vector2DTest, reduce_accumulates_correctly) {
int sum = vec.reduce<int>([](const int & e, const int & acc) { return e + acc; });