From 7195734765a16e59b39a6dff53f349a1ea44f4fe Mon Sep 17 00:00:00 2001 From: "andrey.bychkov" Date: Tue, 17 Feb 2026 21:53:18 +0300 Subject: [PATCH] add more tests --- tests/math/testpivector2d.cpp | 153 +++++++++++++++++++++++++++++----- 1 file changed, 130 insertions(+), 23 deletions(-) diff --git a/tests/math/testpivector2d.cpp b/tests/math/testpivector2d.cpp index f2a47361..538348d7 100644 --- a/tests/math/testpivector2d.cpp +++ b/tests/math/testpivector2d.cpp @@ -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::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::RowConst) { ++count; }); + EXPECT_EQ(count, vec.rows()); +} + +TEST_F(Vector2DTest, forEachColumn_modifies_columns) { + vec.forEachColumn([](PIVector2D::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::ColConst) { ++count; }); + EXPECT_EQ(count, vec.cols()); +} + // ==================== MODIFIER TESTS ==================== TEST_F(Vector2DTest, setRow_replaces_row_correctly) { PIVector 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(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(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(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([](const int & e, const int & acc) { return e + acc; });