Skip to content
Snippets Groups Projects
Commit 1e801835 authored by Daniel Hornung's avatar Daniel Hornung
Browse files

FIX: Fixed a bug in the mex utilities and implemented unit tests.

parent d807531b
No related branches found
No related tags found
1 merge request!1Initial functionality
Pipeline #11320 canceled
......@@ -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);
......
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment