From 1e8018358ae9a9796f046a3b7989a5431ae4bb18 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Wed, 4 Aug 2021 17:19:21 +0200
Subject: [PATCH] FIX: Fixed a bug in the mex utilities and implemented unit
 tests.

---
 src/lib/maoxdb.hpp      |  2 +-
 test/test_utilities.cpp | 98 ++++++++++++++++++++++++++++++++++++++---
 2 files changed, 94 insertions(+), 6 deletions(-)

diff --git a/src/lib/maoxdb.hpp b/src/lib/maoxdb.hpp
index 29f98b8..e2f0154 100644
--- a/src/lib/maoxdb.hpp
+++ b/src/lib/maoxdb.hpp
@@ -27,7 +27,7 @@ inline auto mxScalarUINT64(UINT64_T value) -> mxArray * {
   return mxScalar<UINT64_T>(value, mxUINT64_CLASS);
 }
 inline auto mxScalarINT64(INT64_T value) -> mxArray * {
-  return mxScalar<UINT64_T>(value, mxUINT64_CLASS);
+  return mxScalar<INT64_T>(value, mxINT64_CLASS);
 }
 inline auto mxScalarDOUBLE(double value) -> mxArray * {
   return mxScalar<double>(value, mxDOUBLE_CLASS);
diff --git a/test/test_utilities.cpp b/test/test_utilities.cpp
index 3c7bc1a..1c42a2c 100644
--- a/test/test_utilities.cpp
+++ b/test/test_utilities.cpp
@@ -18,20 +18,108 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  */
 
+#include "caosdb/exceptions.h"
 #include "maoxdb.hpp"
 #include "mex.h"
 // #include "mexproto.h"
 #include <gtest/gtest.h>
+#include <limits>
+#include <string>
+#include <vector>
 
 namespace maoxdb {
 
+///////////////////////////////////////////////////////////////////////////////
+//                              Helper functions                             //
+///////////////////////////////////////////////////////////////////////////////
+
+/*
+ * These functions test if the value can be converted to a mex scalar.
+ */
+void test_scalar_uint64(UINT64_T value) {
+  mxArray *scalar = mxScalarUINT64(value);
+  EXPECT_TRUE(mxIsUint64(scalar));
+  EXPECT_EQ(mxGetNumberOfElements(scalar), 1);
+  EXPECT_EQ(*((UINT64_T *) mxGetData(scalar)), value);
+}
+
+void test_scalar_int64(INT64_T value) {
+  mxArray *scalar = mxScalarINT64(value);
+  EXPECT_TRUE(mxIsInt64(scalar));
+  EXPECT_EQ(mxGetNumberOfElements(scalar), 1);
+  EXPECT_EQ(*((INT64_T *) mxGetData(scalar)), value);
+}
+
+void test_scalar_double(double value) {
+  mxArray *scalar = mxScalarDOUBLE(value);
+  EXPECT_TRUE(mxIsDouble(scalar));
+  EXPECT_EQ(mxGetNumberOfElements(scalar), 1);
+  EXPECT_EQ(*((double *) mxGetData(scalar)), value);
+}
+
+void test_scalar_logical(bool value) {
+  mxArray *scalar = mxScalarLOGICAL(value);
+  EXPECT_TRUE(mxIsLogical(scalar));
+  EXPECT_EQ(mxGetNumberOfElements(scalar), 1);
+  EXPECT_EQ(*((bool *) mxGetData(scalar)), value);
+}
+
+/**
+ * Generate a vector with useful values for testing.
+ */
+template<typename T>
+auto values() -> std::vector<T> {
+  std::vector<T> values =
+    {0, 1,
+     std::numeric_limits<T>::max(),
+     std::numeric_limits<T>::min(),
+     std::numeric_limits<T>::lowest(),
+     std::numeric_limits<T>::epsilon() // 0 for integers, but who cares?
+    };
+  return values;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//                                Actual tests                               //
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Test if construction of scalar mex arrays works
+ */
 TEST(test_utilities, scalar_arrays) {
-  mxArray *uint64_scalar;
-  uint64_scalar = mxScalarUINT64(1);
-  EXPECT_TRUE(mxIsUint64(uint64_scalar));
-  EXPECT_EQ(mxGetNumberOfElements(uint64_scalar), 1);
-  EXPECT_EQ(*((UINT64_T *) mxGetData(uint64_scalar)), 1);
+  auto values_uint64 = values<UINT64_T>();
+  for (auto value : values_uint64) {
+    test_scalar_uint64(value);
+  }
+
+  auto values_int64 = values<INT64_T>();
+  for (auto value : values_int64) {
+    test_scalar_int64(value);
+  }
+
+  auto values_double = values<double>();
+  for (auto value : values_double) {
+    test_scalar_double(value);
+  }
+
+  std::vector<bool> values_logical = {true, false};
+  for (auto value : values_logical) {
+    test_scalar_logical(value);
+  }
+}
+
+/**
+ * Test exception handling
+ */
 
+TEST(test_utilities, exception_handling) {
+  caosdb::exceptions::AuthenticationError exc("Authentication failed.");
+  auto strings = exceptionToMessage(exc);
+  EXPECT_EQ(strings.first, std::string("16"));
+  EXPECT_EQ(strings.second,
+            std::string("The attempt to execute this transaction has not been "
+                        "executed at all because the authentication did not "
+                        "succeed.\nAuthentication failed."));
 }
 
 }  // maoxdb
-- 
GitLab