From 9acfa827e4e2f21b003ef822a53bd0b32f4cbf54 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Sat, 31 Jul 2021 17:36:16 +0200
Subject: [PATCH] Add output for Table and the associated tests.

Use NaNHelper to handle bad data.
---
 src/utils/Table.hpp  | 14 ++++++++++
 tests/test_Table.cpp | 61 ++++++++++++++++++++++++++++++++++----------
 2 files changed, 62 insertions(+), 13 deletions(-)

diff --git a/src/utils/Table.hpp b/src/utils/Table.hpp
index 5f621ab27..cd380661b 100644
--- a/src/utils/Table.hpp
+++ b/src/utils/Table.hpp
@@ -9,6 +9,8 @@
 
 #include <Kokkos_CopyViews.hpp>
 
+#include <iostream>
+
 template <typename DataType>
 class [[nodiscard]] Table
 {
@@ -126,6 +128,18 @@ class [[nodiscard]] Table
 #endif   // NDEBUG
   }
 
+  friend std::ostream& operator<<(std::ostream& os, const Table& t)
+  {
+    for (size_t i = 0; i < t.numberOfRows(); ++i) {
+      os << i << '|';
+      for (size_t j = 0; j < t.numberOfColumns(); ++j) {
+        os << ' ' << j << ':' << NaNHelper(t(i, j));
+      }
+      os << '\n';
+    }
+    return os;
+  }
+
   PUGS_INLINE
   Table() = default;
 
diff --git a/tests/test_Table.cpp b/tests/test_Table.cpp
index 5372c697d..a89344b75 100644
--- a/tests/test_Table.cpp
+++ b/tests/test_Table.cpp
@@ -158,27 +158,62 @@ TEST_CASE("Table", "[utils]")
 
   SECTION("checking for Kokkos::View encaspulation")
   {
-    {
-      Kokkos::View<double**> kokkos_view("anonymous", 10, 3);
-      for (size_t i = 0; i < 10; ++i) {
-        for (size_t j = 0; j < 3; ++j) {
-          kokkos_view(i, j) = 3 * i + j;
-        }
+    Kokkos::View<double**> kokkos_view("anonymous", 10, 3);
+    for (size_t i = 0; i < 10; ++i) {
+      for (size_t j = 0; j < 3; ++j) {
+        kokkos_view(i, j) = 3 * i + j;
       }
+    }
 
-      Table table = encapsulate(kokkos_view);
+    Table table = encapsulate(kokkos_view);
 
-      REQUIRE(table.numberOfRows() == kokkos_view.extent(0));
-      REQUIRE(table.numberOfColumns() == kokkos_view.extent(1));
-      for (size_t i = 0; i < table.numberOfRows(); ++i) {
-        for (size_t j = 0; j < table.numberOfColumns(); ++j) {
-          REQUIRE(&table(i, j) == &kokkos_view(i, j));
-        }
+    REQUIRE(table.numberOfRows() == kokkos_view.extent(0));
+    REQUIRE(table.numberOfColumns() == kokkos_view.extent(1));
+    for (size_t i = 0; i < table.numberOfRows(); ++i) {
+      for (size_t j = 0; j < table.numberOfColumns(); ++j) {
+        REQUIRE(&table(i, j) == &kokkos_view(i, j));
       }
     }
   }
 
+  SECTION("output")
+  {
+    Table<double> table(3, 2);
+    table(0, 0) = 1;
+    table(0, 1) = 3;
+    table(1, 0) = 7;
+    table(1, 1) = -2;
+    table(2, 0) = 4;
+    table(2, 1) = -5;
+    std::ostringstream table_ost;
+    table_ost << table;
+
+    std::ostringstream ref_ost;
+    ref_ost << "0| " << 0 << ':' << 1. << ' ' << 1 << ':' << 3. << '\n';
+    ref_ost << "1| " << 0 << ':' << 7. << ' ' << 1 << ':' << -2. << '\n';
+    ref_ost << "2| " << 0 << ':' << 4. << ' ' << 1 << ':' << -5. << '\n';
+
+    REQUIRE(table_ost.str() == ref_ost.str());
+  }
+
 #ifndef NDEBUG
+  SECTION("output with signaling NaN")
+  {
+    Table<double> table(3, 2);
+    table(0, 0) = 1;
+    table(1, 1) = -2;
+    table(2, 1) = -5;
+    std::ostringstream table_ost;
+    table_ost << table;
+
+    std::ostringstream ref_ost;
+    ref_ost << "0| " << 0 << ':' << 1. << ' ' << 1 << ":nan\n";
+    ref_ost << "1| " << 0 << ":nan " << 1 << ':' << -2. << '\n';
+    ref_ost << "2| " << 0 << ":nan " << 1 << ':' << -5. << '\n';
+
+    REQUIRE(table_ost.str() == ref_ost.str());
+  }
+
   SECTION("checking for bounds violation")
   {
     REQUIRE_THROWS_AS(a(4, 0), AssertError);
-- 
GitLab