chart2: Add unit tests for CalculateBSplines
Change-Id: I46af0b5c72ef96c42ea0eb60a5c8b6383a556cdf Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208265 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
This commit is contained in:
committed by
Xisco Fauli
parent
6971d69b6a
commit
a73823a4c1
@@ -0,0 +1,43 @@
|
||||
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t; fill-column: 100 -*-
|
||||
#
|
||||
# This file is part of the LibreOffice project.
|
||||
#
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
#
|
||||
|
||||
$(eval $(call gb_CppunitTest_CppunitTest,chart2_splines))
|
||||
|
||||
$(eval $(call gb_CppunitTest_add_exception_objects,chart2_splines, \
|
||||
chart2/qa/unit/splines_test \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_externals,chart2_splines, \
|
||||
libxml2 \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_libraries,chart2_splines, \
|
||||
chart2 \
|
||||
sal \
|
||||
subsequenttest \
|
||||
tl \
|
||||
test \
|
||||
unotest \
|
||||
utl \
|
||||
cppu \
|
||||
cppuhelper \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_set_include,chart2_splines,\
|
||||
-I$(SRCDIR)/chart2/source/view/charttypes \
|
||||
$$(INCLUDE) \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_sdk_api,chart2_splines))
|
||||
$(eval $(call gb_CppunitTest_use_ure,chart2_splines))
|
||||
$(eval $(call gb_CppunitTest_use_vcl,chart2_splines))
|
||||
$(eval $(call gb_CppunitTest_use_rdb,chart2_splines,services))
|
||||
$(eval $(call gb_CppunitTest_use_configuration,chart2_splines))
|
||||
|
||||
# vim: set noet sw=4 ts=4:
|
||||
@@ -26,6 +26,7 @@ ifneq ($(OS),iOS)
|
||||
$(eval $(call gb_Module_add_check_targets,chart2,\
|
||||
CppunitTest_chart2_common_functors \
|
||||
CppunitTest_chart2_correlation_coefficient \
|
||||
CppunitTest_chart2_splines \
|
||||
))
|
||||
|
||||
$(eval $(call gb_Module_add_slowcheck_targets,chart2,\
|
||||
|
||||
@@ -0,0 +1,260 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
#include <sal/config.h>
|
||||
|
||||
#include <Splines.hxx>
|
||||
|
||||
#include <test/unoapi_test.hxx>
|
||||
#include <rtl/ustring.hxx>
|
||||
|
||||
#include <com/sun/star/drawing/Position3D.hpp>
|
||||
#include <cppunit/TestAssert.h>
|
||||
|
||||
namespace
|
||||
{
|
||||
class SplinesTest : public UnoApiTest
|
||||
{
|
||||
public:
|
||||
SplinesTest()
|
||||
: UnoApiTest(u""_ustr)
|
||||
{
|
||||
}
|
||||
|
||||
static constexpr double fAssertDelta = 1e-4;
|
||||
};
|
||||
|
||||
CPPUNIT_TEST_FIXTURE(SplinesTest, bSplinesLinear1)
|
||||
{
|
||||
std::vector<std::vector<css::drawing::Position3D>> aPoints;
|
||||
|
||||
//Input points: (0,0), (2,2)
|
||||
aPoints.push_back(std::vector<css::drawing::Position3D>());
|
||||
aPoints[0].push_back(css::drawing::Position3D(0, 0, 0));
|
||||
aPoints[0].push_back(css::drawing::Position3D(2, 2, 0));
|
||||
sal_uInt32 nResolution = 2;
|
||||
sal_uInt32 nDegree = 1;
|
||||
|
||||
std::vector<std::vector<css::drawing::Position3D>> aResult;
|
||||
|
||||
chart::SplineCalculator::CalculateBSplines(aPoints, aResult, nResolution, nDegree);
|
||||
|
||||
//Expected: result points form a line
|
||||
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aResult.size()));
|
||||
CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(aResult[0].size()));
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, aResult[0][1].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, aResult[0][1].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][1].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, aResult[0][2].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, aResult[0][2].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][2].PositionZ, SplinesTest::fAssertDelta);
|
||||
}
|
||||
|
||||
CPPUNIT_TEST_FIXTURE(SplinesTest, bSplinesLinear2)
|
||||
{
|
||||
std::vector<std::vector<css::drawing::Position3D>> aPoints;
|
||||
|
||||
//Input points: (0,0), (3,3)
|
||||
aPoints.push_back(std::vector<css::drawing::Position3D>());
|
||||
aPoints[0].push_back(css::drawing::Position3D(0, 0, 0));
|
||||
aPoints[0].push_back(css::drawing::Position3D(3, 3, 0));
|
||||
sal_uInt32 nResolution = 3;
|
||||
sal_uInt32 nDegree = 1;
|
||||
|
||||
std::vector<std::vector<css::drawing::Position3D>> aResult;
|
||||
|
||||
chart::SplineCalculator::CalculateBSplines(aPoints, aResult, nResolution, nDegree);
|
||||
|
||||
//Expected: result points form a line
|
||||
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aResult.size()));
|
||||
CPPUNIT_ASSERT_EQUAL(4, static_cast<int>(aResult[0].size()));
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, aResult[0][1].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, aResult[0][1].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][1].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, aResult[0][2].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, aResult[0][2].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][2].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(3.0, aResult[0][3].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(3.0, aResult[0][3].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][3].PositionZ, SplinesTest::fAssertDelta);
|
||||
}
|
||||
|
||||
CPPUNIT_TEST_FIXTURE(SplinesTest, bSplinesArch)
|
||||
{
|
||||
std::vector<std::vector<css::drawing::Position3D>> aPoints;
|
||||
|
||||
//Input points: (0,0), (1,1), (2,0)
|
||||
aPoints.push_back(std::vector<css::drawing::Position3D>());
|
||||
aPoints[0].push_back(css::drawing::Position3D(0, 0, 0));
|
||||
aPoints[0].push_back(css::drawing::Position3D(1, 1, 0));
|
||||
aPoints[0].push_back(css::drawing::Position3D(2, 0, 0));
|
||||
sal_uInt32 nResolution = 3;
|
||||
sal_uInt32 nDegree = 2;
|
||||
|
||||
std::vector<std::vector<css::drawing::Position3D>> aResult;
|
||||
|
||||
chart::SplineCalculator::CalculateBSplines(aPoints, aResult, nResolution, nDegree);
|
||||
|
||||
//Expected: result points form an arch shape
|
||||
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aResult.size()));
|
||||
CPPUNIT_ASSERT_EQUAL(7, static_cast<int>(aResult[0].size()));
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1 / 3.0, aResult[0][1].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.555555555555556, aResult[0][1].PositionY,
|
||||
SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][1].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(2 / 3.0, aResult[0][2].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.888888888888889, aResult[0][2].PositionY,
|
||||
SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][2].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, aResult[0][3].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, aResult[0][3].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][3].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(4 / 3.0, aResult[0][4].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.888888888888889, aResult[0][4].PositionY,
|
||||
SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][4].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(5 / 3.0, aResult[0][5].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.555555555555556, aResult[0][5].PositionY,
|
||||
SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][5].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, aResult[0][6].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][6].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][6].PositionZ, SplinesTest::fAssertDelta);
|
||||
}
|
||||
|
||||
CPPUNIT_TEST_FIXTURE(SplinesTest, bSplinesLoop)
|
||||
{
|
||||
std::vector<std::vector<css::drawing::Position3D>> aPoints;
|
||||
|
||||
//Input points: (0,0), (1,1), (2,0), (0,0)
|
||||
aPoints.push_back(std::vector<css::drawing::Position3D>());
|
||||
aPoints[0].push_back(css::drawing::Position3D(0, 0, 0));
|
||||
aPoints[0].push_back(css::drawing::Position3D(1, 1, 0));
|
||||
aPoints[0].push_back(css::drawing::Position3D(2, 0, 0));
|
||||
aPoints[0].push_back(css::drawing::Position3D(0, 0, 0));
|
||||
sal_uInt32 nResolution = 2;
|
||||
sal_uInt32 nDegree = 2;
|
||||
|
||||
std::vector<std::vector<css::drawing::Position3D>> aResult;
|
||||
|
||||
chart::SplineCalculator::CalculateBSplines(aPoints, aResult, nResolution, nDegree);
|
||||
|
||||
//Expected: result points form a loop shape
|
||||
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aResult.size()));
|
||||
CPPUNIT_ASSERT_EQUAL(7, static_cast<int>(aResult[0].size()));
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.449682859897576, aResult[0][1].PositionX,
|
||||
SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.809837501016391, aResult[0][1].PositionY,
|
||||
SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][1].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, aResult[0][2].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, aResult[0][2].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][2].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.65095142030727, aResult[0][3].PositionX,
|
||||
SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.570487496950826, aResult[0][3].PositionY,
|
||||
SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][3].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, aResult[0][4].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][4].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][4].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.49811427366873, aResult[0][5].PositionX,
|
||||
SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.238807647737986, aResult[0][5].PositionY,
|
||||
SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][5].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][6].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][6].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][6].PositionZ, SplinesTest::fAssertDelta);
|
||||
}
|
||||
|
||||
CPPUNIT_TEST_FIXTURE(SplinesTest, bSplines2SeriesLinear)
|
||||
{
|
||||
//Two (rather than just one) series of input points
|
||||
std::vector<std::vector<css::drawing::Position3D>> aPoints;
|
||||
|
||||
aPoints.push_back(std::vector<css::drawing::Position3D>());
|
||||
aPoints[0].push_back(css::drawing::Position3D(0, 0, 0));
|
||||
aPoints[0].push_back(css::drawing::Position3D(2, 2, 0));
|
||||
|
||||
aPoints.push_back(std::vector<css::drawing::Position3D>());
|
||||
aPoints[1].push_back(css::drawing::Position3D(0, 0, 0));
|
||||
aPoints[1].push_back(css::drawing::Position3D(-2, 2, 0));
|
||||
sal_uInt32 nResolution = 2;
|
||||
sal_uInt32 nDegree = 1;
|
||||
|
||||
std::vector<std::vector<css::drawing::Position3D>> aResult;
|
||||
|
||||
chart::SplineCalculator::CalculateBSplines(aPoints, aResult, nResolution, nDegree);
|
||||
|
||||
//Expected: Two results series, each with three points along a line
|
||||
CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(aResult.size()));
|
||||
CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(aResult[0].size()));
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][0].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, aResult[0][1].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, aResult[0][1].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][1].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, aResult[0][2].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, aResult[0][2].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[0][2].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(aResult[1].size()));
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[1][0].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[1][0].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[1][0].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, aResult[1][1].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, aResult[1][1].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[1][1].PositionZ, SplinesTest::fAssertDelta);
|
||||
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(-2.0, aResult[1][2].PositionX, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, aResult[1][2].PositionY, SplinesTest::fAssertDelta);
|
||||
CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, aResult[1][2].PositionZ, SplinesTest::fAssertDelta);
|
||||
}
|
||||
|
||||
} //namespace
|
||||
|
||||
CPPUNIT_PLUGIN_IMPLEMENT();
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|
||||
@@ -35,7 +35,7 @@ public:
|
||||
, std::vector<std::vector<css::drawing::Position3D>>& rResult
|
||||
, sal_uInt32 nGranularity );
|
||||
|
||||
static void CalculateBSplines(
|
||||
SAL_DLLPUBLIC_EXPORT static void CalculateBSplines(
|
||||
const std::vector<std::vector<css::drawing::Position3D>>& rPoints
|
||||
, std::vector<std::vector<css::drawing::Position3D>>& rResult
|
||||
, sal_uInt32 nGranularity
|
||||
|
||||
Reference in New Issue
Block a user