From 4430944829cd4613d89d87593de84fedebbd63b4 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Thu, 30 Dec 2021 19:32:28 +0100
Subject: [PATCH] Add tests for DiamondDualConnectivityBuilder

---
 src/mesh/MedianDualConnectivityBuilder.cpp    |   2 -
 tests/CMakeLists.txt                          |   1 +
 tests/test_DiamondDualConnectivityBuilder.cpp | 411 ++++++++++++++++++
 3 files changed, 412 insertions(+), 2 deletions(-)
 create mode 100644 tests/test_DiamondDualConnectivityBuilder.cpp

diff --git a/src/mesh/MedianDualConnectivityBuilder.cpp b/src/mesh/MedianDualConnectivityBuilder.cpp
index cbda3336d..cd8f1c624 100644
--- a/src/mesh/MedianDualConnectivityBuilder.cpp
+++ b/src/mesh/MedianDualConnectivityBuilder.cpp
@@ -335,8 +335,6 @@ MedianDualConnectivityBuilder::_buildConnectivityFrom<2>(const IConnectivity& i_
       return dual_face_list;
     }();
 
-    Assert(boundary_dual_face_id_list.size() == 2 * primal_face_list.size());
-
     if (parallel::allReduceOr(boundary_dual_face_id_list.size() > 0)) {
       dual_descriptor.addRefItemList(
         RefFaceList{primal_ref_face_list.refId(), convert_to_array(boundary_dual_face_id_list)});
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 312205116..3b8ee67b3 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -67,6 +67,7 @@ add_executable (unit_tests
   test_CubeTransformation.cpp
   test_DataVariant.cpp
   test_Demangle.cpp
+  test_DiamondDualConnectivityBuilder.cpp
   test_DiscreteFunctionDescriptorP0.cpp
   test_DiscreteFunctionDescriptorP0Vector.cpp
   test_DiscreteFunctionType.cpp
diff --git a/tests/test_DiamondDualConnectivityBuilder.cpp b/tests/test_DiamondDualConnectivityBuilder.cpp
new file mode 100644
index 000000000..2ff0e295b
--- /dev/null
+++ b/tests/test_DiamondDualConnectivityBuilder.cpp
@@ -0,0 +1,411 @@
+#include <catch2/catch_test_macros.hpp>
+#include <catch2/matchers/catch_matchers_all.hpp>
+
+#include <MeshDataBaseForTests.hpp>
+#include <mesh/DualConnectivityManager.hpp>
+
+#include <mesh/Connectivity.hpp>
+#include <mesh/ItemValueUtils.hpp>
+#include <mesh/Mesh.hpp>
+
+template <ItemType item_type, typename ConnectivityType>
+inline auto
+get_item_ref_ids(const ConnectivityType& connectivity)
+{
+  std::map<std::string, size_t> ref_id_set;
+  for (size_t i = 0; i < connectivity.template numberOfRefItemList<item_type>(); ++i) {
+    const auto& ref_id_list = connectivity.template refItemList<item_type>(i);
+    std::ostringstream os;
+    os << ref_id_list.refId();
+    ItemValue<size_t, item_type> item_tag{connectivity};
+    item_tag.fill(0);
+    for (size_t i_item = 0; i_item < ref_id_list.list().size(); ++i_item) {
+      item_tag[ref_id_list.list()[i_item]] = 1;
+    }
+
+    ref_id_set[os.str()] = sum(item_tag);
+  }
+  return ref_id_set;
+}
+
+// clazy:excludeall=non-pod-global-static
+
+TEST_CASE("DiamondDualConnectivityBuilder", "[mesh]")
+{
+  SECTION("1D")
+  {
+    constexpr static size_t Dimension = 1;
+
+    using ConnectivityType = Connectivity<Dimension>;
+    using MeshType         = Mesh<ConnectivityType>;
+
+    std::shared_ptr<const MeshType> mesh        = MeshDataBaseForTests::get().unordered1DMesh();
+    const ConnectivityType& primal_connectivity = mesh->connectivity();
+
+    REQUIRE(primal_connectivity.numberOfNodes() == 35);
+    REQUIRE(primal_connectivity.numberOfCells() == 34);
+
+    std::shared_ptr p_diamond_dual_connectivity =
+      DualConnectivityManager::instance().getDiamondDualConnectivity(primal_connectivity);
+    const ConnectivityType& dual_connectivity = *p_diamond_dual_connectivity;
+
+    REQUIRE(dual_connectivity.numberOfNodes() == 36);
+    REQUIRE(dual_connectivity.numberOfCells() == 35);
+
+    SECTION("ref node list")
+    {
+      REQUIRE(primal_connectivity.numberOfRefItemList<ItemType::node>() == 3);
+      REQUIRE(dual_connectivity.numberOfRefItemList<ItemType::node>() == 2);
+
+      const auto primal_ref_node_list = get_item_ref_ids<ItemType::node>(primal_connectivity);
+      REQUIRE(primal_ref_node_list.size() == 3);
+
+      REQUIRE(primal_ref_node_list.count("INTERFACE(3)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMAX(2)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMIN(1)") == 1);
+
+      REQUIRE(primal_ref_node_list.at("INTERFACE(3)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMAX(2)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMIN(1)") == 1);
+
+      const auto dual_ref_node_list = get_item_ref_ids<ItemType::node>(dual_connectivity);
+      REQUIRE(dual_ref_node_list.size() == 2);
+
+      REQUIRE(dual_ref_node_list.count("XMAX(2)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMIN(1)") == 1);
+
+      REQUIRE(dual_ref_node_list.at("XMAX(2)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMIN(1)") == 1);
+    }
+
+    SECTION("ref cell list")
+    {
+      REQUIRE(primal_connectivity.numberOfRefItemList<ItemType::cell>() == 2);
+      // Diamond dual cell references are not computed
+      REQUIRE(dual_connectivity.numberOfRefItemList<ItemType::cell>() == 0);
+
+      const auto primal_ref_cell_list = get_item_ref_ids<ItemType::cell>(primal_connectivity);
+      REQUIRE(primal_ref_cell_list.size() == 2);
+
+      REQUIRE(primal_ref_cell_list.count("LEFT(4)") == 1);
+      REQUIRE(primal_ref_cell_list.count("RIGHT(5)") == 1);
+
+      REQUIRE(primal_ref_cell_list.at("LEFT(4)") == 26);
+      REQUIRE(primal_ref_cell_list.at("RIGHT(5)") == 8);
+
+      const auto dual_ref_cell_list = get_item_ref_ids<ItemType::cell>(dual_connectivity);
+      REQUIRE(dual_ref_cell_list.size() == 0);
+    }
+  }
+
+  SECTION("2D")
+  {
+    constexpr static size_t Dimension = 2;
+
+    using ConnectivityType = Connectivity<Dimension>;
+    using MeshType         = Mesh<ConnectivityType>;
+
+    std::shared_ptr<const MeshType> mesh        = MeshDataBaseForTests::get().hybrid2DMesh();
+    const ConnectivityType& primal_connectivity = mesh->connectivity();
+
+    REQUIRE(primal_connectivity.numberOfNodes() == 53);
+    REQUIRE(primal_connectivity.numberOfFaces() == 110);
+    REQUIRE(primal_connectivity.numberOfCells() == 58);
+
+    std::shared_ptr p_diamond_dual_connectivity =
+      DualConnectivityManager::instance().getDiamondDualConnectivity(primal_connectivity);
+    const ConnectivityType& dual_connectivity = *p_diamond_dual_connectivity;
+
+    REQUIRE(dual_connectivity.numberOfNodes() == 111);
+    REQUIRE(dual_connectivity.numberOfFaces() == 220);
+    REQUIRE(dual_connectivity.numberOfCells() == 110);
+
+    SECTION("ref node list")
+    {
+      REQUIRE(primal_connectivity.numberOfRefItemList<ItemType::node>() == 4);
+      REQUIRE(dual_connectivity.numberOfRefItemList<ItemType::node>() == 4);
+
+      const auto primal_ref_node_list = get_item_ref_ids<ItemType::node>(primal_connectivity);
+      REQUIRE(primal_ref_node_list.size() == 4);
+
+      REQUIRE(primal_ref_node_list.count("XMAXYMAX(11)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMAXYMIN(10)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMINYMAX(9)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMINYMIN(8)") == 1);
+
+      REQUIRE(primal_ref_node_list.at("XMAXYMAX(11)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMAXYMIN(10)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMINYMAX(9)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMINYMIN(8)") == 1);
+
+      const auto dual_ref_node_list = get_item_ref_ids<ItemType::node>(dual_connectivity);
+      REQUIRE(dual_ref_node_list.size() == 4);
+
+      REQUIRE(dual_ref_node_list.count("XMAXYMAX(11)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMAXYMIN(10)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMINYMAX(9)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMINYMIN(8)") == 1);
+
+      REQUIRE(dual_ref_node_list.at("XMAXYMAX(11)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMAXYMIN(10)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMINYMAX(9)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMINYMIN(8)") == 1);
+    }
+
+    SECTION("ref face list")
+    {
+      REQUIRE(primal_connectivity.numberOfRefItemList<ItemType::face>() == 5);
+      REQUIRE(dual_connectivity.numberOfRefItemList<ItemType::face>() == 4);
+
+      const auto primal_ref_face_list = get_item_ref_ids<ItemType::face>(primal_connectivity);
+      REQUIRE(primal_ref_face_list.size() == 5);
+
+      REQUIRE(primal_ref_face_list.count("INTERFACE(5)") == 1);
+      REQUIRE(primal_ref_face_list.count("XMAX(2)") == 1);
+      REQUIRE(primal_ref_face_list.count("XMIN(1)") == 1);
+      REQUIRE(primal_ref_face_list.count("YMAX(3)") == 1);
+      REQUIRE(primal_ref_face_list.count("YMIN(4)") == 1);
+
+      REQUIRE(primal_ref_face_list.at("INTERFACE(5)") == 4);
+      REQUIRE(primal_ref_face_list.at("XMAX(2)") == 4);
+      REQUIRE(primal_ref_face_list.at("XMIN(1)") == 4);
+      REQUIRE(primal_ref_face_list.at("YMAX(3)") == 8);
+      REQUIRE(primal_ref_face_list.at("YMIN(4)") == 8);
+
+      const auto dual_ref_face_list = get_item_ref_ids<ItemType::face>(dual_connectivity);
+      REQUIRE(dual_ref_face_list.size() == 4);
+
+      REQUIRE(dual_ref_face_list.count("XMAX(2)") == 1);
+      REQUIRE(dual_ref_face_list.count("XMIN(1)") == 1);
+      REQUIRE(dual_ref_face_list.count("YMAX(3)") == 1);
+      REQUIRE(dual_ref_face_list.count("YMIN(4)") == 1);
+
+      REQUIRE(dual_ref_face_list.at("XMAX(2)") == 4);
+      REQUIRE(dual_ref_face_list.at("XMIN(1)") == 4);
+      REQUIRE(dual_ref_face_list.at("YMAX(3)") == 8);
+      REQUIRE(dual_ref_face_list.at("YMIN(4)") == 8);
+    }
+
+    SECTION("ref cell list")
+    {
+      REQUIRE(primal_connectivity.numberOfRefItemList<ItemType::cell>() == 2);
+      // Diamond dual cell references are not computed
+      REQUIRE(dual_connectivity.numberOfRefItemList<ItemType::cell>() == 0);
+
+      const auto primal_ref_cell_list = get_item_ref_ids<ItemType::cell>(primal_connectivity);
+      REQUIRE(primal_ref_cell_list.size() == 2);
+
+      REQUIRE(primal_ref_cell_list.count("LEFT(6)") == 1);
+      REQUIRE(primal_ref_cell_list.count("RIGHT(7)") == 1);
+
+      REQUIRE(primal_ref_cell_list.at("LEFT(6)") == 22);
+      REQUIRE(primal_ref_cell_list.at("RIGHT(7)") == 36);
+
+      const auto dual_ref_cell_list = get_item_ref_ids<ItemType::cell>(dual_connectivity);
+      REQUIRE(dual_ref_cell_list.size() == 0);
+    }
+  }
+
+  SECTION("3D")
+  {
+    constexpr static size_t Dimension = 3;
+
+    using ConnectivityType = Connectivity<Dimension>;
+    using MeshType         = Mesh<ConnectivityType>;
+
+    std::shared_ptr<const MeshType> mesh        = MeshDataBaseForTests::get().hybrid3DMesh();
+    const ConnectivityType& primal_connectivity = mesh->connectivity();
+
+    REQUIRE(primal_connectivity.numberOfNodes() == 132);
+    REQUIRE(primal_connectivity.numberOfEdges() == 452);
+    REQUIRE(primal_connectivity.numberOfFaces() == 520);
+    REQUIRE(primal_connectivity.numberOfCells() == 199);
+
+    std::shared_ptr p_diamond_dual_connectivity =
+      DualConnectivityManager::instance().getDiamondDualConnectivity(primal_connectivity);
+    const ConnectivityType& dual_connectivity = *p_diamond_dual_connectivity;
+
+    REQUIRE(dual_connectivity.numberOfNodes() == 331);
+    REQUIRE(dual_connectivity.numberOfEdges() == 1461);
+    REQUIRE(dual_connectivity.numberOfFaces() == 1651);
+    REQUIRE(dual_connectivity.numberOfCells() == 520);
+
+    SECTION("ref node list")
+    {
+      REQUIRE(primal_connectivity.numberOfRefItemList<ItemType::node>() == 8);
+      REQUIRE(dual_connectivity.numberOfRefItemList<ItemType::node>() == 8);
+
+      const auto primal_ref_node_list = get_item_ref_ids<ItemType::node>(primal_connectivity);
+      REQUIRE(primal_ref_node_list.size() == 8);
+
+      REQUIRE(primal_ref_node_list.count("XMAXYMAXZMAX(47)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMAXYMAXZMIN(51)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMAXYMINZMAX(45)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMAXYMINZMIN(41)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMINYMAXZMAX(43)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMINYMAXZMIN(42)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMINYMINZMAX(44)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMINYMINZMIN(40)") == 1);
+
+      REQUIRE(primal_ref_node_list.at("XMAXYMAXZMAX(47)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMAXYMAXZMIN(51)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMAXYMINZMAX(45)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMAXYMINZMIN(41)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMINYMAXZMAX(43)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMINYMAXZMIN(42)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMINYMINZMAX(44)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMINYMINZMIN(40)") == 1);
+
+      const auto dual_ref_node_list = get_item_ref_ids<ItemType::node>(dual_connectivity);
+      REQUIRE(dual_ref_node_list.size() == 8);
+
+      REQUIRE(dual_ref_node_list.count("XMAXYMAXZMAX(47)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMAXYMAXZMIN(51)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMAXYMINZMAX(45)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMAXYMINZMIN(41)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMINYMAXZMAX(43)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMINYMAXZMIN(42)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMINYMINZMAX(44)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMINYMINZMIN(40)") == 1);
+
+      REQUIRE(dual_ref_node_list.at("XMAXYMAXZMAX(47)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMAXYMAXZMIN(51)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMAXYMINZMAX(45)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMAXYMINZMIN(41)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMINYMAXZMAX(43)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMINYMAXZMIN(42)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMINYMINZMAX(44)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMINYMINZMIN(40)") == 1);
+    }
+
+    SECTION("ref edge list")
+    {
+      REQUIRE(primal_connectivity.numberOfRefItemList<ItemType::edge>() == 12);
+      REQUIRE(dual_connectivity.numberOfRefItemList<ItemType::edge>() == 12);
+
+      const auto primal_ref_edge_list = get_item_ref_ids<ItemType::edge>(primal_connectivity);
+      REQUIRE(primal_ref_edge_list.size() == 12);
+
+      REQUIRE(primal_ref_edge_list.count("XMAXYMAX(34)") == 1);
+      REQUIRE(primal_ref_edge_list.count("XMAXYMIN(35)") == 1);
+      REQUIRE(primal_ref_edge_list.count("XMAXZMAX(33)") == 1);
+      REQUIRE(primal_ref_edge_list.count("XMAXZMIN(32)") == 1);
+      REQUIRE(primal_ref_edge_list.count("XMINYMAX(30)") == 1);
+      REQUIRE(primal_ref_edge_list.count("XMINYMIN(31)") == 1);
+      REQUIRE(primal_ref_edge_list.count("XMINZMAX(29)") == 1);
+      REQUIRE(primal_ref_edge_list.count("XMINZMIN(28)") == 1);
+      REQUIRE(primal_ref_edge_list.count("YMAXZMAX(39)") == 1);
+      REQUIRE(primal_ref_edge_list.count("YMAXZMIN(38)") == 1);
+      REQUIRE(primal_ref_edge_list.count("YMINZMAX(37)") == 1);
+      REQUIRE(primal_ref_edge_list.count("YMINZMIN(36)") == 1);
+
+      REQUIRE(primal_ref_edge_list.at("XMAXYMAX(34)") == 2);
+      REQUIRE(primal_ref_edge_list.at("XMAXYMIN(35)") == 2);
+      REQUIRE(primal_ref_edge_list.at("XMAXZMAX(33)") == 2);
+      REQUIRE(primal_ref_edge_list.at("XMAXZMIN(32)") == 2);
+      REQUIRE(primal_ref_edge_list.at("XMINYMAX(30)") == 3);
+      REQUIRE(primal_ref_edge_list.at("XMINYMIN(31)") == 3);
+      REQUIRE(primal_ref_edge_list.at("XMINZMAX(29)") == 4);
+      REQUIRE(primal_ref_edge_list.at("XMINZMIN(28)") == 4);
+      REQUIRE(primal_ref_edge_list.at("YMAXZMAX(39)") == 5);
+      REQUIRE(primal_ref_edge_list.at("YMAXZMIN(38)") == 5);
+      REQUIRE(primal_ref_edge_list.at("YMINZMAX(37)") == 6);
+      REQUIRE(primal_ref_edge_list.at("YMINZMIN(36)") == 6);
+
+      const auto dual_ref_edge_list = get_item_ref_ids<ItemType::edge>(dual_connectivity);
+      REQUIRE(dual_ref_edge_list.size() == 12);
+
+      REQUIRE(dual_ref_edge_list.count("XMAXYMAX(34)") == 1);
+      REQUIRE(dual_ref_edge_list.count("XMAXYMIN(35)") == 1);
+      REQUIRE(dual_ref_edge_list.count("XMAXZMAX(33)") == 1);
+      REQUIRE(dual_ref_edge_list.count("XMAXZMIN(32)") == 1);
+      REQUIRE(dual_ref_edge_list.count("XMINYMAX(30)") == 1);
+      REQUIRE(dual_ref_edge_list.count("XMINYMIN(31)") == 1);
+      REQUIRE(dual_ref_edge_list.count("XMINZMAX(29)") == 1);
+      REQUIRE(dual_ref_edge_list.count("XMINZMIN(28)") == 1);
+      REQUIRE(dual_ref_edge_list.count("YMAXZMAX(39)") == 1);
+      REQUIRE(dual_ref_edge_list.count("YMAXZMIN(38)") == 1);
+      REQUIRE(dual_ref_edge_list.count("YMINZMAX(37)") == 1);
+      REQUIRE(dual_ref_edge_list.count("YMINZMIN(36)") == 1);
+
+      REQUIRE(dual_ref_edge_list.at("XMAXYMAX(34)") == 2);
+      REQUIRE(dual_ref_edge_list.at("XMAXYMIN(35)") == 2);
+      REQUIRE(dual_ref_edge_list.at("XMAXZMAX(33)") == 2);
+      REQUIRE(dual_ref_edge_list.at("XMAXZMIN(32)") == 2);
+      REQUIRE(dual_ref_edge_list.at("XMINYMAX(30)") == 3);
+      REQUIRE(dual_ref_edge_list.at("XMINYMIN(31)") == 3);
+      REQUIRE(dual_ref_edge_list.at("XMINZMAX(29)") == 4);
+      REQUIRE(dual_ref_edge_list.at("XMINZMIN(28)") == 4);
+      REQUIRE(dual_ref_edge_list.at("YMAXZMAX(39)") == 5);
+      REQUIRE(dual_ref_edge_list.at("YMAXZMIN(38)") == 5);
+      REQUIRE(dual_ref_edge_list.at("YMINZMAX(37)") == 6);
+      REQUIRE(dual_ref_edge_list.at("YMINZMIN(36)") == 6);
+    }
+
+    SECTION("ref face list")
+    {
+      REQUIRE(primal_connectivity.numberOfRefItemList<ItemType::face>() == 8);
+      REQUIRE(dual_connectivity.numberOfRefItemList<ItemType::face>() == 6);
+
+      const auto primal_ref_face_list = get_item_ref_ids<ItemType::face>(primal_connectivity);
+      REQUIRE(primal_ref_face_list.size() == 8);
+
+      REQUIRE(primal_ref_face_list.count("INTERFACE1(55)") == 1);
+      REQUIRE(primal_ref_face_list.count("INTERFACE2(56)") == 1);
+      REQUIRE(primal_ref_face_list.count("XMAX(23)") == 1);
+      REQUIRE(primal_ref_face_list.count("XMIN(22)") == 1);
+      REQUIRE(primal_ref_face_list.count("YMAX(26)") == 1);
+      REQUIRE(primal_ref_face_list.count("YMIN(27)") == 1);
+      REQUIRE(primal_ref_face_list.count("ZMAX(24)") == 1);
+      REQUIRE(primal_ref_face_list.count("ZMIN(25)") == 1);
+
+      REQUIRE(primal_ref_face_list.at("INTERFACE1(55)") == 12);
+      REQUIRE(primal_ref_face_list.at("INTERFACE2(56)") == 9);
+      REQUIRE(primal_ref_face_list.at("XMAX(23)") == 12);
+      REQUIRE(primal_ref_face_list.at("XMIN(22)") == 12);
+      REQUIRE(primal_ref_face_list.at("YMAX(26)") == 18);
+      REQUIRE(primal_ref_face_list.at("YMIN(27)") == 21);
+      REQUIRE(primal_ref_face_list.at("ZMAX(24)") == 35);
+      REQUIRE(primal_ref_face_list.at("ZMIN(25)") == 35);
+
+      const auto dual_ref_face_list = get_item_ref_ids<ItemType::face>(dual_connectivity);
+      REQUIRE(dual_ref_face_list.size() == 6);
+
+      REQUIRE(dual_ref_face_list.count("XMAX(23)") == 1);
+      REQUIRE(dual_ref_face_list.count("XMIN(22)") == 1);
+      REQUIRE(dual_ref_face_list.count("YMAX(26)") == 1);
+      REQUIRE(dual_ref_face_list.count("YMIN(27)") == 1);
+      REQUIRE(dual_ref_face_list.count("ZMAX(24)") == 1);
+      REQUIRE(dual_ref_face_list.count("ZMIN(25)") == 1);
+
+      REQUIRE(dual_ref_face_list.at("XMAX(23)") == 12);
+      REQUIRE(dual_ref_face_list.at("XMIN(22)") == 12);
+      REQUIRE(dual_ref_face_list.at("YMAX(26)") == 18);
+      REQUIRE(dual_ref_face_list.at("YMIN(27)") == 21);
+      REQUIRE(dual_ref_face_list.at("ZMAX(24)") == 35);
+      REQUIRE(dual_ref_face_list.at("ZMIN(25)") == 35);
+    }
+
+    SECTION("ref cell list")
+    {
+      REQUIRE(primal_connectivity.numberOfRefItemList<ItemType::cell>() == 3);
+
+      const auto primal_ref_cell_list = get_item_ref_ids<ItemType::cell>(primal_connectivity);
+      REQUIRE(primal_ref_cell_list.size() == 3);
+
+      REQUIRE(primal_ref_cell_list.count("LEFT(52)") == 1);
+      REQUIRE(primal_ref_cell_list.count("MIDDLE(53)") == 1);
+      REQUIRE(primal_ref_cell_list.count("RIGHT(54)") == 1);
+
+      REQUIRE(primal_ref_cell_list.at("LEFT(52)") == 30);
+      REQUIRE(primal_ref_cell_list.at("MIDDLE(53)") == 42);
+      REQUIRE(primal_ref_cell_list.at("RIGHT(54)") == 127);
+
+      // Diamond dual cell references are not computed
+      REQUIRE(dual_connectivity.numberOfRefItemList<ItemType::cell>() == 0);
+
+      const auto dual_ref_cell_list = get_item_ref_ids<ItemType::cell>(dual_connectivity);
+      REQUIRE(dual_ref_cell_list.size() == 0);
+    }
+  }
+}
-- 
GitLab