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