From b77081bcdc8fef49e5c0b68ed11f17e17380f8d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Thu, 10 Mar 2022 16:21:55 +0100 Subject: [PATCH] Add a few attributes to ItemValue and precise error messages --- src/mesh/ItemArray.hpp | 30 +++++++++++------------- tests/test_ItemArray.cpp | 50 ++++++++++++++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 25 deletions(-) diff --git a/src/mesh/ItemArray.hpp b/src/mesh/ItemArray.hpp index b1d4fcb1a..175537ef2 100644 --- a/src/mesh/ItemArray.hpp +++ b/src/mesh/ItemArray.hpp @@ -43,7 +43,7 @@ class ItemArray friend ItemArray<std::remove_const_t<DataType>, item_type, ConnectivityWeakPtr>; public: - friend PUGS_INLINE ItemArray<std::remove_const_t<DataType>, item_type, ConnectivityPtr> + [[nodiscard]] friend PUGS_INLINE ItemArray<std::remove_const_t<DataType>, item_type, ConnectivityPtr> copy(const ItemArray<DataType, item_type, ConnectivityPtr>& source) { ItemArray<std::remove_const_t<DataType>, item_type, ConnectivityPtr> image; @@ -62,19 +62,18 @@ class ItemArray copy_to(const ItemArray<DataType, item_type, ConnectivityPtr>& source, const ItemArray<std::remove_const_t<DataType>, item_type, ConnectivityPtr2>& destination) { - Assert(destination.connectivity_ptr() == source.connectivity_ptr()); - copy_to(source.m_values, destination.m_values); + Assert(destination.connectivity_ptr() == source.connectivity_ptr(), "different connectivities"); + Assert(source.sizeOfArrays() == destination.sizeOfArrays(), "incompatible size of arrays") + copy_to(source.m_values, destination.m_values); } - PUGS_INLINE - bool + [[nodiscard]] PUGS_INLINE bool isBuilt() const noexcept { return m_connectivity_ptr.use_count() != 0; } - PUGS_INLINE - std::shared_ptr<const IConnectivity> + [[nodiscard]] PUGS_INLINE std::shared_ptr<const IConnectivity> connectivity_ptr() const noexcept { if constexpr (std::is_same_v<ConnectivityPtr, ConnectivitySharedPtr>) { @@ -93,27 +92,26 @@ class ItemArray } template <ItemType item_t> - PUGS_INLINE typename Table<DataType>::UnsafeRowView + [[nodiscard]] PUGS_INLINE typename Table<DataType>::UnsafeRowView operator[](const ItemIdT<item_t>& item_id) const noexcept(NO_ASSERT) { static_assert(item_t == item_type, "invalid ItemId type"); - Assert(this->isBuilt()); + Assert(this->isBuilt(), "ItemArray is not built"); + Assert(item_id < this->numberOfItems(), "invalid item_id"); return m_values[item_id]; } - PUGS_INLINE - size_t + [[nodiscard]] PUGS_INLINE size_t numberOfItems() const noexcept(NO_ASSERT) { - Assert(this->isBuilt()); + Assert(this->isBuilt(), "ItemArray is not built"); return m_values.numberOfRows(); } - PUGS_INLINE - size_t + [[nodiscard]] PUGS_INLINE size_t sizeOfArrays() const { - Assert(this->isBuilt()); + Assert(this->isBuilt(), "ItemArray is not built"); return m_values.numberOfColumns(); } @@ -169,7 +167,7 @@ class ItemArray ItemArray(const IConnectivity& connectivity, const Table<DataType>& table) noexcept(NO_ASSERT) : m_connectivity_ptr{connectivity.shared_ptr()}, m_values{table} { - Assert(connectivity.numberOf<item_type>() == table.numberOfRows(), "Invalid table, wrong number of rows"); + Assert(connectivity.numberOf<item_type>() == table.numberOfRows(), "invalid table, wrong number of rows"); } PUGS_INLINE diff --git a/tests/test_ItemArray.cpp b/tests/test_ItemArray.cpp index 8e60b44c1..997e327a1 100644 --- a/tests/test_ItemArray.cpp +++ b/tests/test_ItemArray.cpp @@ -297,16 +297,16 @@ TEST_CASE("ItemArray", "[mesh]") SECTION("checking for build ItemArray") { CellArray<int> cell_array; - REQUIRE_THROWS_AS(cell_array[CellId{0}], AssertError); + REQUIRE_THROWS_WITH(cell_array[CellId{0}], "ItemArray is not built"); FaceArray<int> face_array; - REQUIRE_THROWS_AS(face_array[FaceId{0}], AssertError); + REQUIRE_THROWS_WITH(face_array[FaceId{0}], "ItemArray is not built"); EdgeArray<int> edge_array; - REQUIRE_THROWS_AS(edge_array[EdgeId{0}], AssertError); + REQUIRE_THROWS_WITH(edge_array[EdgeId{0}], "ItemArray is not built"); NodeArray<int> node_array; - REQUIRE_THROWS_AS(node_array[NodeId{0}], AssertError); + REQUIRE_THROWS_WITH(node_array[NodeId{0}], "ItemArray is not built"); } SECTION("checking for bounds violation") @@ -322,19 +322,19 @@ TEST_CASE("ItemArray", "[mesh]") CellArray<int> cell_array{connectivity, 1}; CellId invalid_cell_id = connectivity.numberOfCells(); - REQUIRE_THROWS_AS(cell_array[invalid_cell_id], AssertError); + REQUIRE_THROWS_WITH(cell_array[invalid_cell_id], "invalid item_id"); FaceArray<int> face_array{connectivity, 2}; FaceId invalid_face_id = connectivity.numberOfFaces(); - REQUIRE_THROWS_AS(face_array[invalid_face_id], AssertError); + REQUIRE_THROWS_WITH(face_array[invalid_face_id], "invalid item_id"); EdgeArray<int> edge_array{connectivity, 1}; EdgeId invalid_edge_id = connectivity.numberOfEdges(); - REQUIRE_THROWS_AS(edge_array[invalid_edge_id], AssertError); + REQUIRE_THROWS_WITH(edge_array[invalid_edge_id], "invalid item_id"); NodeArray<int> node_array{connectivity, 0}; NodeId invalid_node_id = connectivity.numberOfNodes(); - REQUIRE_THROWS_AS(node_array[invalid_node_id], AssertError); + REQUIRE_THROWS_WITH(node_array[invalid_node_id], "invalid item_id"); } } } @@ -351,7 +351,39 @@ TEST_CASE("ItemArray", "[mesh]") const Connectivity<3>& connectivity = mesh_3d->connectivity(); Table<size_t> values{connectivity.numberOfCells() + 3, 3}; - REQUIRE_THROWS_WITH(CellArray<size_t>(connectivity, values), "Invalid table, wrong number of rows"); + REQUIRE_THROWS_WITH(CellArray<size_t>(connectivity, values), "invalid table, wrong number of rows"); + } + } + } + + SECTION("invalid copy_to") + { + std::array mesh_list = MeshDataBaseForTests::get().all2DMeshes(); + + for (auto named_mesh : mesh_list) { + SECTION(named_mesh.name()) + { + auto mesh_2d = named_mesh.mesh(); + + const Connectivity<2>& connectivity_2d = mesh_2d->connectivity(); + + std::array mesh_list = MeshDataBaseForTests::get().all3DMeshes(); + + for (auto named_mesh : mesh_list) { + SECTION(named_mesh.name()) + { + auto mesh_3d = named_mesh.mesh(); + + const Connectivity<3>& connectivity_3d = mesh_3d->connectivity(); + + CellArray<int> cell_2d_array{connectivity_2d, 3}; + CellArray<int> cell_3d_array{connectivity_3d, 3}; + REQUIRE_THROWS_WITH(copy_to(cell_2d_array, cell_3d_array), "different connectivities"); + + CellArray<int> cell_2d_array2{connectivity_2d, 2}; + REQUIRE_THROWS_WITH(copy_to(cell_2d_array, cell_2d_array2), "incompatible size of arrays"); + } + } } } } -- GitLab