pivector2d fix add\remove rows\cols and resize
This commit is contained in:
@@ -379,6 +379,280 @@ TEST_F(Vector2DTest, addRow_with_shorter_vector_uses_min) {
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== APPEND ROWS TESTS ====================
|
||||
|
||||
TEST_F(Vector2DTest, appendRows_adds_rows_at_bottom) {
|
||||
size_t oldRows = vec.rows();
|
||||
size_t oldCols = vec.cols();
|
||||
|
||||
vec.appendRows(5, 42);
|
||||
|
||||
EXPECT_EQ(vec.rows(), oldRows + 5);
|
||||
EXPECT_EQ(vec.cols(), oldCols);
|
||||
|
||||
// Original data preserved
|
||||
for (size_t r = 0; r < oldRows; ++r) {
|
||||
for (size_t c = 0; c < oldCols; ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), static_cast<int>(r * COLS_COUNT_INIT + c));
|
||||
}
|
||||
}
|
||||
|
||||
// New rows filled with 42
|
||||
for (size_t r = oldRows; r < vec.rows(); ++r) {
|
||||
for (size_t c = 0; c < oldCols; ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), 42);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, appendRows_with_zero_count_does_nothing) {
|
||||
auto oldVec = vec;
|
||||
vec.appendRows(0);
|
||||
EXPECT_EQ(vec, oldVec);
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, appendRows_on_empty_matrix) {
|
||||
PIVector2D<int> empty;
|
||||
empty.appendRows(5, 99);
|
||||
EXPECT_TRUE(empty.isNotEmpty());
|
||||
EXPECT_EQ(empty.rows(), 5);
|
||||
EXPECT_EQ(empty.cols(), 1);
|
||||
EXPECT_EQ(empty.size(), empty.entries(99));
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, appendRows_with_default_value) {
|
||||
size_t oldRows = vec.rows();
|
||||
|
||||
vec.appendRows(3);
|
||||
|
||||
for (size_t r = oldRows; r < vec.rows(); ++r) {
|
||||
for (size_t c = 0; c < vec.cols(); ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== APPEND COLUMNS TESTS ====================
|
||||
|
||||
TEST_F(Vector2DTest, appendColumns_adds_columns_at_right) {
|
||||
size_t oldRows = vec.rows();
|
||||
size_t oldCols = vec.cols();
|
||||
|
||||
vec.appendColumns(3, 99);
|
||||
|
||||
EXPECT_EQ(vec.rows(), oldRows);
|
||||
EXPECT_EQ(vec.cols(), oldCols + 3);
|
||||
|
||||
// Original data preserved in original columns
|
||||
for (size_t r = 0; r < oldRows; ++r) {
|
||||
for (size_t c = 0; c < oldCols; ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), static_cast<int>(r * COLS_COUNT_INIT + c));
|
||||
}
|
||||
}
|
||||
|
||||
// New columns filled with 99
|
||||
for (size_t r = 0; r < oldRows; ++r) {
|
||||
for (size_t c = oldCols; c < vec.cols(); ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), 99);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, appendColumns_with_zero_count_does_nothing) {
|
||||
auto oldVec = vec;
|
||||
vec.appendColumns(0);
|
||||
EXPECT_EQ(vec, oldVec);
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, appendColumns_on_empty_matrix) {
|
||||
PIVector2D<int> empty;
|
||||
empty.appendColumns(5, 99);
|
||||
EXPECT_TRUE(empty.isNotEmpty());
|
||||
EXPECT_EQ(empty.cols(), 5);
|
||||
EXPECT_EQ(empty.rows(), 1);
|
||||
EXPECT_EQ(empty.size(), empty.entries(99));
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, appendColumns_single_column) {
|
||||
auto oldVec = vec;
|
||||
|
||||
vec.appendColumns(1, 77);
|
||||
|
||||
EXPECT_EQ(vec.rows(), oldVec.rows());
|
||||
EXPECT_EQ(vec.cols(), oldVec.cols() + 1);
|
||||
|
||||
// Check original data
|
||||
for (size_t r = 0; r < vec.rows(); ++r) {
|
||||
for (size_t c = 0; c < oldVec.cols(); ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), oldVec.element(r, c));
|
||||
}
|
||||
}
|
||||
|
||||
// Check new column
|
||||
for (size_t r = 0; r < vec.rows(); ++r) {
|
||||
EXPECT_EQ(vec.element(r, oldVec.cols()), 77);
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== DELETE ROWS TESTS ====================
|
||||
|
||||
TEST_F(Vector2DTest, deleteRows_removes_rows_from_middle) {
|
||||
size_t oldRows = vec.rows();
|
||||
size_t oldCols = vec.cols();
|
||||
|
||||
vec.deleteRows(5, 3);
|
||||
|
||||
EXPECT_EQ(vec.rows(), oldRows - 3);
|
||||
EXPECT_EQ(vec.cols(), oldCols);
|
||||
|
||||
// Rows before deleted remain
|
||||
for (size_t r = 0; r < 5; ++r) {
|
||||
for (size_t c = 0; c < oldCols; ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), static_cast<int>(r * COLS_COUNT_INIT + c));
|
||||
}
|
||||
}
|
||||
|
||||
// Rows after deleted shifted up
|
||||
for (size_t r = 5; r < vec.rows(); ++r) {
|
||||
for (size_t c = 0; c < oldCols; ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), static_cast<int>((r + 3) * COLS_COUNT_INIT + c));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, deleteRows_at_end_works) {
|
||||
size_t oldRows = vec.rows();
|
||||
size_t oldCols = vec.cols();
|
||||
|
||||
vec.deleteRows(oldRows - 2, 2);
|
||||
|
||||
EXPECT_EQ(vec.rows(), oldRows - 2);
|
||||
EXPECT_EQ(vec.cols(), oldCols);
|
||||
|
||||
// All remaining rows should have original content
|
||||
for (size_t r = 0; r < vec.rows(); ++r) {
|
||||
for (size_t c = 0; c < oldCols; ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), static_cast<int>(r * COLS_COUNT_INIT + c));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, deleteRows_beyond_bounds_is_limited) {
|
||||
size_t oldRows = vec.rows();
|
||||
size_t oldCols = vec.cols();
|
||||
size_t count = 10;
|
||||
|
||||
vec.deleteRows(oldRows - 2, count);
|
||||
|
||||
EXPECT_EQ(vec.rows(), oldRows - count);
|
||||
EXPECT_EQ(vec.cols(), oldCols);
|
||||
|
||||
// All remaining rows should have original content
|
||||
for (size_t r = 0; r < oldRows; ++r) {
|
||||
for (size_t c = 0; c < vec.cols(); ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), static_cast<int>(r * COLS_COUNT_INIT + c));
|
||||
}
|
||||
}
|
||||
|
||||
// All new rows should have original content
|
||||
for (size_t r = oldRows; r < vec.rows(); ++r) {
|
||||
for (size_t c = 0; c < vec.cols(); ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), static_cast<int>((r+count) * COLS_COUNT_INIT + c));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, deleteRows_invalid_start_does_nothing) {
|
||||
auto oldVec = vec;
|
||||
vec.deleteRows(oldVec.rows() + 10, 2);
|
||||
EXPECT_EQ(vec, oldVec);
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, deleteRows_zero_count_does_nothing) {
|
||||
auto oldVec = vec;
|
||||
vec.deleteRows(5, 0);
|
||||
EXPECT_EQ(vec, oldVec);
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, deleteRows_all_rows_creates_empty) {
|
||||
vec.deleteRows(0, vec.rows());
|
||||
EXPECT_TRUE(vec.isEmpty());
|
||||
EXPECT_EQ(vec.rows(), 0);
|
||||
EXPECT_EQ(vec.cols(), 0);
|
||||
}
|
||||
|
||||
// ==================== DELETE COLUMNS TESTS ====================
|
||||
|
||||
TEST_F(Vector2DTest, deleteColumns_removes_columns_from_middle) {
|
||||
size_t oldRows = vec.rows();
|
||||
size_t oldCols = vec.cols();
|
||||
|
||||
vec.deleteColumns(4, 3);
|
||||
|
||||
EXPECT_EQ(vec.rows(), oldRows);
|
||||
EXPECT_EQ(vec.cols(), oldCols - 3);
|
||||
|
||||
// Columns before deleted remain
|
||||
for (size_t r = 0; r < oldRows; ++r) {
|
||||
for (size_t c = 0; c < 4; ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), static_cast<int>(r * COLS_COUNT_INIT + c));
|
||||
}
|
||||
}
|
||||
|
||||
// Columns after deleted shifted left
|
||||
for (size_t r = 0; r < oldRows; ++r) {
|
||||
for (size_t c = 4; c < vec.cols(); ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), static_cast<int>(r * COLS_COUNT_INIT + c + 3));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, deleteColumns_at_end_works) {
|
||||
size_t oldRows = vec.rows();
|
||||
size_t oldCols = vec.cols();
|
||||
|
||||
vec.deleteColumns(oldCols - 2, 2);
|
||||
|
||||
EXPECT_EQ(vec.rows(), oldRows);
|
||||
EXPECT_EQ(vec.cols(), oldCols - 2);
|
||||
|
||||
// All remaining columns should have original content
|
||||
for (size_t r = 0; r < oldRows; ++r) {
|
||||
for (size_t c = 0; c < vec.cols(); ++c) {
|
||||
EXPECT_EQ(vec.element(r, c), static_cast<int>(r * COLS_COUNT_INIT + c));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, deleteColumns_beyond_bounds_is_limited) {
|
||||
size_t oldRows = vec.rows();
|
||||
size_t oldCols = vec.cols();
|
||||
|
||||
vec.deleteColumns(oldCols - 2, 10);
|
||||
|
||||
EXPECT_EQ(vec.rows(), oldRows);
|
||||
EXPECT_EQ(vec.cols(), oldCols - 2);
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, deleteColumns_invalid_start_does_nothing) {
|
||||
auto oldVec = vec;
|
||||
vec.deleteColumns(oldVec.cols() + 10, 2);
|
||||
EXPECT_EQ(vec, oldVec);
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, deleteColumns_zero_count_does_nothing) {
|
||||
auto oldVec = vec;
|
||||
vec.deleteColumns(5, 0);
|
||||
EXPECT_EQ(vec, oldVec);
|
||||
}
|
||||
|
||||
TEST_F(Vector2DTest, deleteColumns_all_columns_preserves_rows) {
|
||||
vec.deleteColumns(0, vec.cols());
|
||||
EXPECT_EQ(vec.rows(), ROWS_COUNT_INIT);
|
||||
EXPECT_EQ(vec.cols(), 0);
|
||||
EXPECT_EQ(vec.size(), 0);
|
||||
}
|
||||
|
||||
// ==================== ADD COLUMN TESTS ====================
|
||||
|
||||
TEST_F(Vector2DTest, addColumn_appends_column_to_empty) {
|
||||
@@ -400,7 +674,7 @@ TEST_F(Vector2DTest, addColumn_appends_column_to_existing) {
|
||||
size_t oldRows = vec.rows();
|
||||
size_t oldCols = vec.cols();
|
||||
|
||||
PIVector<int> newCol(oldRows, 999);
|
||||
PIVector<int> newCol(oldRows, [](size_t i){return -900 - (int)i;});
|
||||
vec.addColumn(newCol);
|
||||
|
||||
EXPECT_EQ(vec.rows(), oldRows);
|
||||
@@ -415,7 +689,7 @@ TEST_F(Vector2DTest, addColumn_appends_column_to_existing) {
|
||||
|
||||
// Check new column
|
||||
for (size_t r = 0; r < oldRows; ++r) {
|
||||
EXPECT_EQ(vec.element(r, oldCols), 999);
|
||||
EXPECT_EQ(vec.element(r, oldCols), -900 - (int)r);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -497,7 +771,6 @@ TEST_F(Vector2DTest, addColumn_with_Col_proxy_works) {
|
||||
}
|
||||
for (size_t r = 0; r < vec.rows(); ++r) {
|
||||
// EXPECT_EQ(vec.element(r, oldVec.cols()), int());
|
||||
piCout << r << vec.cols() << oldVec.cols() << colIndex;
|
||||
EXPECT_EQ(vec.element(r, oldVec.cols()), oldVec.element(r, colIndex));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user