/*********************************************************************
* Software License Agreement (AGPL-3 License)
*
* OpenViBE SDK Test Software
* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015
* Copyright (C) Inria, 2015-2017,V1.0
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program.
* If not, see .
*/
#include
#include
#include
#include "ovtAssert.h"
static std::default_random_engine gen(777);
static std::uniform_real_distribution dist(0.0, 100.0);
void fillMatrix(OpenViBE::CMatrix& matrix)
{
for (size_t i = 0; i < matrix.getDimensionCount(); ++i)
{
for (size_t j = 0; j < matrix.getDimensionSize(i); ++j)
{
std::stringstream label;
label << "Label " << j + 1 << " of Dimension " << i + 1;
matrix.setDimensionLabel(i, j, label.str());
}
}
for (size_t i = 0; i < matrix.getBufferElementCount(); ++i) { matrix.getBuffer()[i] = dist(gen); }
}
bool testMatrix(OpenViBE::CMatrix& expectedMatrix, const std::string& textFile, const size_t precision = 6)
{
const double threshold = 1.0 / std::pow(10.0, double(precision - 2));
fillMatrix(expectedMatrix);
if (!OpenViBE::Toolkit::Matrix::saveToTextFile(expectedMatrix, textFile.c_str(), precision))
{
std::cerr << "Error: saving matrix to file " << textFile << "\n";
return false;
}
OpenViBE::CMatrix resultMatrix;
if (!OpenViBE::Toolkit::Matrix::loadFromTextFile(resultMatrix, textFile.c_str()))
{
std::cerr << "Error: loading matrix from file " << textFile << "\n";
return false;
}
if (!OpenViBE::Toolkit::Matrix::isDescriptionSimilar(expectedMatrix, resultMatrix))
{
std::cerr << "Error: Descriptions differ between expected matrix and result matrix after save/load\n";
return false;
}
for (size_t i = 0; i < expectedMatrix.getBufferElementCount(); ++i)
{
const double error = std::fabs(expectedMatrix.getBuffer()[i] - resultMatrix.getBuffer()[i]);
if (error > threshold)
{
std::cerr << "Error: Data differs at index " << i << ", error " << error << " (thresold = " << threshold << ")\n";
return false;
}
}
return true;
}
int uoMatrixToolkitTest(int argc, char* argv[])
{
OVT_ASSERT(argc == 2, "Failure to retrieve tests arguments. Expecting: output_dir");
const std::string oMatrixFile = std::string(argv[1]) + "uoMatrixToolkitTest.txt";
OpenViBE::CMatrix source;
source.resize(1);
OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [1; {0,1}]");
source.resize(5);
OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [1; {0,5}]");
source.resize(1, 1);
OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [2; {0,1},{1,1}]");
source.resize(1, 7);
OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [2; {0,1},{1,7}]");
source.resize(9, 1);
OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [2; {0,9},{1,1}]");
source.resize(2, 4);
OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [2; {0,2},{1,4}]");
source.resize(3, 15);
OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [2; {0,3},{1,15}]");
source.resize({ 1, 1, 1 });
OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [3; {0,1},{1,1},{2,1}]");
source.resize({ 1, 1, 5 });
OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [3; {0,1},{1,1},{2,5}]");
source.resize({ 2, 3, 6 });
OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [3; {0,2},{1,3},{2,6}]");
source.resize({ 9, 5, 2, 3 });
OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [4; {0,9},{1,5},{2,2},{3,3}]");
// special cases at boundaries
source.resize(0, 0);
OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [2; {0,0},{1,0}]");
OpenViBE::CMatrix emptySource;
OVT_ASSERT(!testMatrix(emptySource, oMatrixFile), "Failed to test matrix with no parameter");
return EXIT_SUCCESS;
}
//==========================End OF File==============================