1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 #include "charttest.hxx"
11 #include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
12 #include <com/sun/star/chart2/XRegressionCurveCalculator.hpp>
13 #include <SpecialCharacters.hxx>
16 // Define the index of sheets in the test document
17 constexpr sal_Int32 SHEET_POTENTIAL1
= 0;
18 constexpr sal_Int32 SHEET_POTENTIAL2
= 1;
19 constexpr sal_Int32 SHEET_LINEAR1
= 2;
20 constexpr sal_Int32 SHEET_POLYNOMIAL1
= 3;
21 constexpr sal_Int32 SHEET_EXPONENTIAL1
= 4;
22 constexpr sal_Int32 SHEET_EXPONENTIAL2
= 5;
24 class Chart2TrendCalculators
: public ChartTest
27 Chart2TrendCalculators()
28 : ChartTest("/chart2/qa/extras/data/")
31 void setUp() override
;
32 void tearDown() override
;
34 void testPotentialRegression1();
35 void testPotentialRegression2();
36 void testLinearRegression1();
37 void testPolynomialRegression1();
38 void testExponentialRegression1();
39 void testExponentialRegression2();
41 CPPUNIT_TEST_SUITE(Chart2TrendCalculators
);
42 CPPUNIT_TEST(testPotentialRegression1
);
43 CPPUNIT_TEST(testPotentialRegression2
);
44 CPPUNIT_TEST(testLinearRegression1
);
45 CPPUNIT_TEST(testPolynomialRegression1
);
46 CPPUNIT_TEST(testExponentialRegression1
);
47 CPPUNIT_TEST(testExponentialRegression2
);
48 CPPUNIT_TEST_SUITE_END();
51 Reference
<chart2::XRegressionCurve
> m_xCurve
;
52 Reference
< chart2::XRegressionCurveCalculator
> m_xRegressionCurveCalculator
;
54 void loadCalculatorFromSheet(sal_Int32 nSheet
);
56 const Sequence
< double >& xValues
, const Sequence
< double >& yValues
,
57 const OUString
& sExpectedFormula
);
60 void Chart2TrendCalculators::setUp()
63 loadFromURL(u
"ods/trend_calculators.ods");
66 void Chart2TrendCalculators::tearDown()
68 m_xRegressionCurveCalculator
.clear();
70 ChartTest::tearDown();
73 void Chart2TrendCalculators::loadCalculatorFromSheet(sal_Int32 nSheet
)
75 Reference
<chart2::XChartDocument
> xChartDoc
= getChartDocFromSheet(nSheet
, mxComponent
);
76 CPPUNIT_ASSERT_MESSAGE("failed to load chart", xChartDoc
.is());
77 CPPUNIT_ASSERT(xChartDoc
.is());
79 Reference
<chart2::XDataSeries
> xDataSeries
= getDataSeriesFromDoc(xChartDoc
, 0);
80 CPPUNIT_ASSERT(xDataSeries
.is());
82 Reference
<chart2::XRegressionCurveContainer
> xRegressionCurveContainer(xDataSeries
, UNO_QUERY_THROW
);
84 Sequence
< Reference
< chart2::XRegressionCurve
> > xRegressionCurveSequence
= xRegressionCurveContainer
->getRegressionCurves();
85 CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xRegressionCurveSequence
.getLength());
87 m_xCurve
= xRegressionCurveSequence
[0];
88 CPPUNIT_ASSERT(m_xCurve
.is());
90 m_xRegressionCurveCalculator
= m_xCurve
->getCalculator();
91 CPPUNIT_ASSERT(m_xRegressionCurveCalculator
.is());
94 void Chart2TrendCalculators::checkCalculator(
95 const Sequence
< double >& xValues
, const Sequence
< double >& yValues
,
96 const OUString
& sExpectedFormula
)
98 m_xRegressionCurveCalculator
->recalculateRegression( xValues
, yValues
);
99 OUString aRepresentation
= m_xRegressionCurveCalculator
->getRepresentation ();
100 CPPUNIT_ASSERT_EQUAL( sExpectedFormula
, aRepresentation
);
101 double r2
= m_xRegressionCurveCalculator
->getCorrelationCoefficient();
102 CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, r2
, 1e-8 );
106 void Chart2TrendCalculators::testPotentialRegression1()
108 loadCalculatorFromSheet( SHEET_POTENTIAL1
);
109 m_xRegressionCurveCalculator
->setRegressionProperties( 0, false, 0, 0, 0 );
110 Sequence
< double > xValues( 7 );
111 auto pxValues
= xValues
.getArray();
112 Sequence
< double > yValues( 7 );
113 auto pyValues
= yValues
.getArray();
114 for (int i
=0; i
<7; i
++)
116 const double d
= static_cast<double>(i
);
118 pyValues
[i
] = 2.0 * pow ( d
, 3 );
120 checkCalculator( xValues
, yValues
, "f(x) = 2 x^3");
124 void Chart2TrendCalculators::testPotentialRegression2()
126 loadCalculatorFromSheet( SHEET_POTENTIAL2
);
127 m_xRegressionCurveCalculator
->setRegressionProperties( 0, false, 0, 0, 0 );
128 Sequence
< double > xValues( 7 );
129 auto pxValues
= xValues
.getArray();
130 Sequence
< double > yValues( 7 );
131 auto pyValues
= yValues
.getArray();
132 for (int i
=0; i
<7; i
++)
134 const double d
= static_cast<double>(i
);
136 pyValues
[i
] = -2.0 * pow ( d
, 3 );
138 checkCalculator( xValues
, yValues
, "f(x) = "+ OUStringChar(aMinusSign
) +" 2 x^3");
141 // test y = - 2 X - 5
142 void Chart2TrendCalculators::testLinearRegression1()
144 loadCalculatorFromSheet( SHEET_LINEAR1
);
145 m_xRegressionCurveCalculator
->setRegressionProperties( 1, false, 0, 0, 0 );
146 Sequence
< double > xValues( 7 );
147 auto pxValues
= xValues
.getArray();
148 Sequence
< double > yValues( 7 );
149 auto pyValues
= yValues
.getArray();
150 for (int i
=0; i
<7; i
++)
152 const double d
= static_cast<double>(i
);
154 pyValues
[i
] = - 2.0 * d
- 5.0 ;
156 checkCalculator( xValues
, yValues
, "f(x) = "+ OUStringChar(aMinusSign
) +" 2 x "+ OUStringChar(aMinusSign
) +" 5");
160 void Chart2TrendCalculators::testPolynomialRegression1()
162 loadCalculatorFromSheet( SHEET_POLYNOMIAL1
);
163 m_xRegressionCurveCalculator
->setRegressionProperties( 2, false, 0, 0, 0 );
164 Sequence
< double > xValues( 7 );
165 auto pxValues
= xValues
.getArray();
166 Sequence
< double > yValues( 7 );
167 auto pyValues
= yValues
.getArray();
168 for (int i
=0; i
<7; i
++)
170 const double d
= static_cast<double>(i
);
172 pyValues
[i
] = - 2.0 * d
* d
+ 4 * d
- 5;
174 OUString
sExpectedFormula( "f(x) = "+ OUStringChar(aMinusSign
) +" 2 x" + OUStringChar( aSuperscriptFigures
[2] ) + " + 4 x "+ OUStringChar(aMinusSign
) +" 5" );
175 checkCalculator( xValues
, yValues
, sExpectedFormula
);
178 void Chart2TrendCalculators::testExponentialRegression1()
180 loadCalculatorFromSheet( SHEET_EXPONENTIAL1
);
181 m_xRegressionCurveCalculator
->setRegressionProperties( 0, false, 0, 0, 0 );
182 Sequence
< double > xValues( 7 );
183 auto pxValues
= xValues
.getArray();
184 Sequence
< double > yValues( 7 );
185 auto pyValues
= yValues
.getArray();
186 for (int i
=0; i
<7; i
++)
188 const double d
= static_cast<double>(i
);
190 pyValues
[i
] = 2.0 * exp ( 0.3 * d
);
192 checkCalculator( xValues
, yValues
, "f(x) = 2 exp( 0.3 x )");
195 void Chart2TrendCalculators::testExponentialRegression2()
197 loadCalculatorFromSheet( SHEET_EXPONENTIAL2
);
198 m_xRegressionCurveCalculator
->setRegressionProperties( 0, false, 0, 0, 0 );
199 Sequence
< double > xValues( 7 );
200 auto pxValues
= xValues
.getArray();
201 Sequence
< double > yValues( 7 );
202 auto pyValues
= yValues
.getArray();
203 for (int i
=0; i
<7; i
++)
205 const double d
= static_cast<double>(i
);
207 pyValues
[i
] = -2.0 * exp ( 0.3 * d
);
209 checkCalculator( xValues
, yValues
, "f(x) = "+ OUStringChar(aMinusSign
) + " 2 exp( 0.3 x )");
213 CPPUNIT_TEST_SUITE_REGISTRATION(Chart2TrendCalculators
);
215 CPPUNIT_PLUGIN_IMPLEMENT();
217 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */